{"id":2305,"date":"2026-06-08T13:12:27","date_gmt":"2026-06-08T13:12:27","guid":{"rendered":"https:\/\/www.rajeshkumar.xyz\/blog\/?p=2305"},"modified":"2026-06-08T13:12:27","modified_gmt":"2026-06-08T13:12:27","slug":"plan-your-web-applications-design-mandatory-listing-page-features-for-web-applications","status":"publish","type":"post","link":"https:\/\/www.rajeshkumar.xyz\/blog\/plan-your-web-applications-design-mandatory-listing-page-features-for-web-applications\/","title":{"rendered":"Plan your Web Applications Design &#8211; Mandatory Listing Page Features for Web Applications"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2026\/06\/Plan-your-Web-Applications-Design--1024x683.png\" alt=\"\" class=\"wp-image-2306\" srcset=\"https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2026\/06\/Plan-your-Web-Applications-Design--1024x683.png 1024w, https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2026\/06\/Plan-your-Web-Applications-Design--300x200.png 300w, https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2026\/06\/Plan-your-Web-Applications-Design--768x512.png 768w, https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2026\/06\/Plan-your-Web-Applications-Design--400x266.png 400w, https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2026\/06\/Plan-your-Web-Applications-Design-.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">for <strong>any listing page<\/strong>, these should be treated as <strong>mandatory standard options<\/strong>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Mandatory Options for Every Listing Page<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>#<\/th><th>Mandatory Option<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td><strong>Page Title<\/strong><\/td><td>Clearly show what data is listed<\/td><\/tr><tr><td>2<\/td><td><strong>Search<\/strong><\/td><td>Search records quickly by keyword<\/td><\/tr><tr><td>3<\/td><td><strong>Filter<\/strong><\/td><td>Narrow records by status, category, date, type, etc.<\/td><\/tr><tr><td>4<\/td><td><strong>Sort<\/strong><\/td><td>Arrange records by newest, oldest, name, status, etc.<\/td><\/tr><tr><td>5<\/td><td><strong>Pagination<\/strong><\/td><td>Load data page by page instead of all at once<\/td><\/tr><tr><td>6<\/td><td><strong>Rows Per Page<\/strong><\/td><td>Allow user to choose 10, 25, 50, 100 records<\/td><\/tr><tr><td>7<\/td><td><strong>Total Records Count<\/strong><\/td><td>Show total records and current range<\/td><\/tr><tr><td>8<\/td><td><strong>Status Badge<\/strong><\/td><td>Show clear status like Active, Pending, Approved<\/td><\/tr><tr><td>9<\/td><td><strong>Row Actions<\/strong><\/td><td>View, Edit, Delete, Approve, etc.<\/td><\/tr><tr><td>10<\/td><td><strong>Bulk Selection<\/strong><\/td><td>Select multiple records using checkboxes<\/td><\/tr><tr><td>11<\/td><td><strong>Bulk Actions<\/strong><\/td><td>Delete, export, approve, assign multiple records<\/td><\/tr><tr><td>12<\/td><td><strong>Add\/Create Button<\/strong><\/td><td>Add new record from the listing page<\/td><\/tr><tr><td>13<\/td><td><strong>Refresh Button<\/strong><\/td><td>Reload latest data<\/td><\/tr><tr><td>14<\/td><td><strong>Export Option<\/strong><\/td><td>Export data as CSV\/Excel\/PDF<\/td><\/tr><tr><td>15<\/td><td><strong>Loading State<\/strong><\/td><td>Show loader\/skeleton while data is loading<\/td><\/tr><tr><td>16<\/td><td><strong>Empty State<\/strong><\/td><td>Show proper message when no data is found<\/td><\/tr><tr><td>17<\/td><td><strong>Error State<\/strong><\/td><td>Show retry option when API\/data loading fails<\/td><\/tr><tr><td>18<\/td><td><strong>Mobile Responsive View<\/strong><\/td><td>Listing should work properly on mobile<\/td><\/tr><tr><td>19<\/td><td><strong>Column\/Header Labels<\/strong><\/td><td>Clear column names for table\/list data<\/td><\/tr><tr><td>20<\/td><td><strong>Date\/Time Formatting<\/strong><\/td><td>Display dates in readable format<\/td><\/tr><tr><td>21<\/td><td><strong>Search\/Filter Reset<\/strong><\/td><td>Clear all applied search and filters<\/td><\/tr><tr><td>22<\/td><td><strong>Confirmation Modal<\/strong><\/td><td>Confirm before delete or destructive action<\/td><\/tr><tr><td>23<\/td><td><strong>Permission-Based Actions<\/strong><\/td><td>Show\/hide actions based on user role<\/td><\/tr><tr><td>24<\/td><td><strong>URL Query Persistence<\/strong><\/td><td>Keep search\/filter\/page\/sort in URL<\/td><\/tr><tr><td>25<\/td><td><strong>Server-Side Search\/Filter\/Sort\/Pagination<\/strong><\/td><td>Required for large data performance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Prompt for Claude<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">You are working <span class=\"hljs-keyword\">as<\/span> a senior full-stack web application developer.\n\nFor every listing page, table page, admin list page, data grid page, management page, or CRUD index page <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-keyword\">this<\/span> application, you MUST follow the mandatory listing page standard below.\n\nDo not create any listing page without these required features. If any feature is missing <span class=\"hljs-keyword\">in<\/span> the existing code, identify it and implement it. Keep the UI consistent across all modules.\n\nMandatory Listing Page Features:\n\n<span class=\"hljs-number\">1.<\/span> Page Title\n- Clearly show what data is listed.\n- Example: Users, Hospitals, Doctors, Orders, Products, Tasks, Bookings.\n\n<span class=\"hljs-number\">2.<\/span> Search\n- Add keyword search to quickly find records.\n- Search should support common fields like name, email, phone, title, ID, or relevant searchable fields.\n\n<span class=\"hljs-number\">3.<\/span> Filter\n- Add filters to narrow records by status, category, date, type, role, location, or <span class=\"hljs-built_in\">module<\/span>-specific fields.\n- Filters should be easy to reset.\n\n<span class=\"hljs-number\">4.<\/span> Sort\n- Allow records to be sorted by common fields.\n- Examples: newest, oldest, name A-Z, status, priority, created date, updated date.\n\n<span class=\"hljs-number\">5.<\/span> Pagination\n- Do not load all records at once.\n- Load records page by page.\n\n<span class=\"hljs-number\">6.<\/span> Rows Per Page\n- Allow users to choose page size.\n- Standard options: <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">25<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">100.<\/span>\n\n<span class=\"hljs-number\">7.<\/span> Total Records Count\n- Show current range and total count.\n- Example: Showing <span class=\"hljs-number\">1<\/span>\u2013<span class=\"hljs-number\">25<\/span> <span class=\"hljs-keyword\">of<\/span> <span class=\"hljs-number\">1<\/span>,<span class=\"hljs-number\">240<\/span> records.\n\n<span class=\"hljs-number\">8.<\/span> Status Badge\n- Display status using clear badges.\n- Examples: Active, Inactive, Pending, Approved, Rejected, Draft, Published, Suspended.\n\n<span class=\"hljs-number\">9.<\/span> Row Actions\n- Each row must have relevant actions.\n- Examples: View, Edit, Delete, Approve, Reject, Activate, Deactivate.\n\n<span class=\"hljs-number\">10.<\/span> Bulk Selection\n- Add checkbox selection <span class=\"hljs-keyword\">for<\/span> multiple records.\n- Include select one, select all on current page, and clear selection.\n\n<span class=\"hljs-number\">11.<\/span> Bulk Actions\n- Allow actions on selected records where applicable.\n- Examples: Delete, Export, Approve, Reject, Assign, Activate, Deactivate.\n\n<span class=\"hljs-number\">12.<\/span> Add\/Create Button\n- Provide a clear button to add a <span class=\"hljs-keyword\">new<\/span> record.\n- Example: Add User, Add Hospital, Create Product.\n\n<span class=\"hljs-number\">13.<\/span> Refresh Button\n- Add a refresh\/reload button to fetch the latest data.\n\n<span class=\"hljs-number\">14.<\/span> Export Option\n- Add <span class=\"hljs-keyword\">export<\/span> functionality where applicable.\n- Standard formats: CSV, Excel, PDF.\n\n<span class=\"hljs-number\">15.<\/span> Loading State\n- Show a proper loading state <span class=\"hljs-keyword\">while<\/span> records are being fetched.\n- Prefer skeleton loader over only spinner.\n\n<span class=\"hljs-number\">16.<\/span> Empty State\n- Show a meaningful empty state when no records exist.\n- Example: No records found. Try changing your search or filters.\n\n<span class=\"hljs-number\">17.<\/span> <span class=\"hljs-built_in\">Error<\/span> State\n- Show a proper error message when API\/data loading fails.\n- Include a Retry button.\n\n<span class=\"hljs-number\">18.<\/span> Mobile Responsive View\n- Listing page must work properly on mobile, tablet, and desktop.\n- On mobile, use responsive table, card layout, or horizontal scroll where needed.\n\n<span class=\"hljs-number\">19.<\/span> Column\/Header Labels\n- Every column must have clear and human-readable labels.\n- Avoid unclear database-style names <span class=\"hljs-keyword\">in<\/span> UI.\n\n<span class=\"hljs-number\">20.<\/span> <span class=\"hljs-built_in\">Date<\/span>\/Time Formatting\n- Display dates and times <span class=\"hljs-keyword\">in<\/span> readable format.\n- Example: <span class=\"hljs-number\">08<\/span> Jun <span class=\"hljs-number\">2026<\/span>, <span class=\"hljs-number\">07<\/span>:<span class=\"hljs-number\">30<\/span> PM.\n- Do not show raw timestamps unless required.\n\n<span class=\"hljs-number\">21.<\/span> Search\/Filter Reset\n- Provide a Clear All or Reset Filters button.\n- It should reset search, filters, sort, and page when required.\n\n<span class=\"hljs-number\">22.<\/span> Confirmation Modal\n- Any destructive action must show confirmation.\n- Examples: Delete, bulk <span class=\"hljs-keyword\">delete<\/span>, deactivate, archive.\n- Do not perform destructive actions directly without confirmation.\n\n<span class=\"hljs-number\">23.<\/span> Permission-Based Actions\n- Show or hide actions based on user role\/permission.\n- Example: Admin can <span class=\"hljs-keyword\">delete<\/span>; viewer can only view.\n\n<span class=\"hljs-number\">24.<\/span> URL Query Persistence\n- Search, filter, sort, page, and rows-per-page state must be stored <span class=\"hljs-keyword\">in<\/span> URL query parameters.\n- This allows refresh, browser back, bookmark, and sharing <span class=\"hljs-keyword\">of<\/span> filtered listing pages.\n\n<span class=\"hljs-number\">25.<\/span> Server-Side Search\/Filter\/Sort\/Pagination\n- For performance, listing pages must use server-side search, filtering, sorting, and pagination.\n- Do not fetch thousands <span class=\"hljs-keyword\">of<\/span> records and process everything only on the frontend.\n\nStandard UI Layout:\n\nPage Title + Description                       &#91;Add\/Create Button]\n\nSearch Bar     &#91;Filter] &#91;Sort] &#91;Export] &#91;Refresh]\n\nQuick Filter Chips \/ Status Tabs\n\nShowing <span class=\"hljs-number\">1<\/span>\u2013<span class=\"hljs-number\">25<\/span> <span class=\"hljs-keyword\">of<\/span> <span class=\"hljs-number\">1<\/span>,<span class=\"hljs-number\">240<\/span> records        Rows per page: <span class=\"hljs-number\">25<\/span>\n\nTable\/List\/Card Data\n\nBulk Action Bar, visible only when records are selected\n\n<span class=\"hljs-attr\">Pagination<\/span>: Previous  <span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">2<\/span> <span class=\"hljs-number\">3<\/span>  Next\n\nStandard API Query Pattern:\n\nGET \/api\/{<span class=\"hljs-built_in\">module<\/span>}\n?page=<span class=\"hljs-number\">1<\/span>\n&amp;per_page=<span class=\"hljs-number\">25<\/span>\n&amp;search=keyword\n&amp;status=active\n&amp;sort_by=created_at\n&amp;sort_order=desc\n\nImplementation Rules:\n\n- Keep <span class=\"hljs-keyword\">this<\/span> standard reusable across all listing pages.\n- Create reusable components where possible:\n  - ListingHeader\n  - SearchBar\n  - FilterPanel\n  - SortDropdown\n  - DataTable\n  - StatusBadge\n  - Pagination\n  - BulkActionBar\n  - EmptyState\n  - ErrorState\n  - LoadingSkeleton\n  - ConfirmationModal\n\n- Do not duplicate listing logic unnecessarily.\n- Keep UI consistent across all modules.\n- Make the design clean, modern, responsive, and user-friendly.\n- Ensure backend\/API supports the required query parameters.\n- Ensure frontend state syncs <span class=\"hljs-keyword\">with<\/span> URL query parameters.\n- Ensure role-based permissions are respected before showing actions.\n- Ensure destructive actions <span class=\"hljs-built_in\">require<\/span> confirmation.\n- Ensure large datasets are handled efficiently using server-side logic.\n\nBefore finalizing any listing page, verify <span class=\"hljs-keyword\">this<\/span> checklist:\n\n&#91; ] Page Title\n&#91; ] Search\n&#91; ] Filter\n&#91; ] Sort\n&#91; ] Pagination\n&#91; ] Rows Per Page\n&#91; ] Total Records Count\n&#91; ] Status Badge\n&#91; ] Row Actions\n&#91; ] Bulk Selection\n&#91; ] Bulk Actions\n&#91; ] Add\/Create Button\n&#91; ] Refresh Button\n&#91; ] Export Option\n&#91; ] Loading State\n&#91; ] Empty State\n&#91; ] <span class=\"hljs-built_in\">Error<\/span> State\n&#91; ] Mobile Responsive View\n&#91; ] Column\/Header Labels\n&#91; ] <span class=\"hljs-built_in\">Date<\/span>\/Time Formatting\n&#91; ] Search\/Filter Reset\n&#91; ] Confirmation Modal\n&#91; ] Permission-Based Actions\n&#91; ] URL Query Persistence\n&#91; ] Server-Side Search\/Filter\/Sort\/Pagination\n\nYour task:\nReview the current listing page implementation and update it to fully comply <span class=\"hljs-keyword\">with<\/span> <span class=\"hljs-keyword\">this<\/span> mandatory listing page standard. If <span class=\"hljs-keyword\">this<\/span> is a <span class=\"hljs-keyword\">new<\/span> page, build it using <span class=\"hljs-keyword\">this<\/span> standard <span class=\"hljs-keyword\">from<\/span> the beginning.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h1 class=\"wp-block-heading\">Minimum Mandatory UI Structure<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Page Title                         &#91;Add <span class=\"hljs-keyword\">New<\/span>]\n\nSearch Bar                         &#91;Filter] &#91;Sort] &#91;Export] &#91;Refresh]\n\nStatus \/ Quick Filters\n\nShowing <span class=\"hljs-number\">1<\/span>\u2013<span class=\"hljs-number\">25<\/span> of <span class=\"hljs-number\">1<\/span>,<span class=\"hljs-number\">240<\/span> records\n\nTable \/ <span class=\"hljs-keyword\">List<\/span> \/ Card Data\n\nBulk Action Bar\n\nRows per page: <span class=\"hljs-number\">25<\/span>     Previous  <span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">2<\/span> <span class=\"hljs-number\">3<\/span>  Next\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h1 class=\"wp-block-heading\">Minimum Mandatory API Parameters<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">?page=1\n&amp;per_page=25\n&amp;search=keyword\n&amp;filter_status=active\n&amp;sort_by=created_at\n&amp;sort_order=desc\n<\/code><\/span><\/pre>\n\n\n<h1 class=\"wp-block-heading\">Final Mandatory Checklist<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Search\nFilter\nSort\nPagination\nRows per page\nTotal count\nAdd button\nRefresh\nExport\nStatus badge\nRow actions\nBulk selection\nBulk actions\nLoading state\nEmpty state\n<span class=\"hljs-built_in\">Error<\/span> state\nReset filters\nConfirmation modal\nPermission-based actions\nMobile responsive layout\nServer-side data handling\nURL query persistence\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This should be your <strong>fixed mandatory listing-page standard<\/strong> for all websites and applications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Absolutely, Rajesh. For any <strong>listing page<\/strong> in a web application \u2014 users list, products list, hospitals list, doctors list, bookings list, tasks list, orders list, blogs list, etc. \u2014 you should standardize one common template.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A good name for this is:<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Standard Listing Page \/ Data Grid Template<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This template should define all common features required to display, search, filter, sort, manage, and navigate large amounts of data consistently.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Page Header Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every listing page should have a consistent top section.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common items:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Page Title<\/td><td>Example: Users, Hospitals, Doctors, Bookings<\/td><\/tr><tr><td>Page Description<\/td><td>Small explanation of what this page is for<\/td><\/tr><tr><td>Breadcrumb<\/td><td>Dashboard &gt; Users &gt; All Users<\/td><\/tr><tr><td>Primary Action Button<\/td><td>Add User, Add Hospital, Create Booking<\/td><\/tr><tr><td>Secondary Actions<\/td><td>Import, Export, Refresh, Download<\/td><\/tr><tr><td>Help \/ Info Icon<\/td><td>Opens guide or tooltip<\/td><\/tr><tr><td>Last Updated Time<\/td><td>Shows when list was refreshed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Users<\/span>\n<span class=\"hljs-selector-tag\">Manage<\/span> <span class=\"hljs-selector-tag\">all<\/span> <span class=\"hljs-selector-tag\">registered<\/span> <span class=\"hljs-selector-tag\">users<\/span> <span class=\"hljs-selector-tag\">and<\/span> <span class=\"hljs-selector-tag\">their<\/span> <span class=\"hljs-selector-tag\">account<\/span> <span class=\"hljs-selector-tag\">status<\/span>.\n\n<span class=\"hljs-selector-attr\">&#91;Import]<\/span> <span class=\"hljs-selector-attr\">&#91;Export]<\/span> <span class=\"hljs-selector-attr\">&#91;Add User]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Search Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Search is one of the most important parts of listing pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common search types:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Search Type<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Global Search<\/td><td>Search across name, email, phone, ID<\/td><\/tr><tr><td>Field-Specific Search<\/td><td>Search only by email or mobile<\/td><\/tr><tr><td>Keyword Search<\/td><td>Search by text<\/td><\/tr><tr><td>Exact Match Search<\/td><td>Search exact user ID or order ID<\/td><\/tr><tr><td>Partial Search<\/td><td>Search \u201craj\u201d and match \u201cRajesh\u201d<\/td><\/tr><tr><td>Advanced Search<\/td><td>Multiple fields combined<\/td><\/tr><tr><td>Search Suggestions<\/td><td>Auto-suggest while typing<\/td><\/tr><tr><td>Recent Searches<\/td><td>Show previously searched terms<\/td><\/tr><tr><td>Search Highlighting<\/td><td>Highlight matching words in result<\/td><\/tr><tr><td>Clear Search<\/td><td>Reset search box<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended standard:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Search by name, email, phone, ID...\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Also keep a clear button:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;X]<\/span> <span class=\"hljs-selector-tag\">Clear<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Filter Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Filters help users narrow down records.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common filter types:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Filter Type<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Status Filter<\/td><td>Active, Inactive, Pending, Suspended<\/td><\/tr><tr><td>Category Filter<\/td><td>Premium, Free, Verified<\/td><\/tr><tr><td>Date Range Filter<\/td><td>Today, Last 7 Days, This Month<\/td><\/tr><tr><td>Custom Date Filter<\/td><td>From Date \/ To Date<\/td><\/tr><tr><td>Location Filter<\/td><td>Country, State, City<\/td><\/tr><tr><td>Role Filter<\/td><td>Admin, User, Manager<\/td><\/tr><tr><td>Type Filter<\/td><td>Hospital, Doctor, Patient<\/td><\/tr><tr><td>Price \/ Amount Filter<\/td><td>Min amount \/ Max amount<\/td><\/tr><tr><td>Rating Filter<\/td><td>1 star to 5 stars<\/td><\/tr><tr><td>Tag Filter<\/td><td>Featured, Popular, New<\/td><\/tr><tr><td>Owner \/ Assigned To Filter<\/td><td>Assigned user or manager<\/td><\/tr><tr><td>Boolean Filter<\/td><td>Yes \/ No, Verified \/ Not Verified<\/td><\/tr><tr><td>Multi-select Filter<\/td><td>Select multiple statuses<\/td><\/tr><tr><td>Dependent Filter<\/td><td>Country \u2192 State \u2192 City<\/td><\/tr><tr><td>Saved Filter<\/td><td>Save commonly used filter combinations<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example filters:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Status: Active\n<span class=\"hljs-attr\">Role<\/span>: Admin\n<span class=\"hljs-attr\">Country<\/span>: India\nCreated <span class=\"hljs-built_in\">Date<\/span>: Last <span class=\"hljs-number\">30<\/span> Days\n<span class=\"hljs-attr\">Verification<\/span>: Verified\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Sorting Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sorting helps users organize records.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common sorting options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Sort Option<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Sort by Name<\/td><td>A-Z \/ Z-A<\/td><\/tr><tr><td>Sort by Created Date<\/td><td>Newest First \/ Oldest First<\/td><\/tr><tr><td>Sort by Updated Date<\/td><td>Recently Updated<\/td><\/tr><tr><td>Sort by Status<\/td><td>Active first<\/td><\/tr><tr><td>Sort by Price<\/td><td>Low to High \/ High to Low<\/td><\/tr><tr><td>Sort by Rating<\/td><td>Highest Rated<\/td><\/tr><tr><td>Sort by Popularity<\/td><td>Most viewed \/ most used<\/td><\/tr><tr><td>Sort by Priority<\/td><td>High priority first<\/td><\/tr><tr><td>Sort by Custom Order<\/td><td>Manual ordering<\/td><\/tr><tr><td>Multi-column Sort<\/td><td>Sort by status, then date<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended UI:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Sort By: Newest First\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For table columns, allow clicking column headers:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Name \u2191\nCreated <span class=\"hljs-built_in\">Date<\/span> \u2193\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Pagination Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pagination is required when data is large.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common pagination features:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Page Numbers<\/td><td>1, 2, 3, 4<\/td><\/tr><tr><td>Previous \/ Next<\/td><td>Move one page<\/td><\/tr><tr><td>First \/ Last Page<\/td><td>Jump to start or end<\/td><\/tr><tr><td>Rows Per Page<\/td><td>10, 25, 50, 100<\/td><\/tr><tr><td>Total Records Count<\/td><td>Showing 1\u201325 of 2,340<\/td><\/tr><tr><td>Infinite Scroll<\/td><td>Load more while scrolling<\/td><\/tr><tr><td>Load More Button<\/td><td>Manual next batch<\/td><\/tr><tr><td>Cursor Pagination<\/td><td>Better for very large data<\/td><\/tr><tr><td>Server-side Pagination<\/td><td>Backend returns limited data<\/td><\/tr><tr><td>Client-side Pagination<\/td><td>Frontend paginates loaded data<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended standard:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Showing<\/span> 1\u201325 <span class=\"hljs-selector-tag\">of<\/span> 2,340 <span class=\"hljs-selector-tag\">records<\/span>\n<span class=\"hljs-selector-tag\">Rows<\/span> <span class=\"hljs-selector-tag\">per<\/span> <span class=\"hljs-selector-tag\">page<\/span>: 25\n<span class=\"hljs-selector-attr\">&#91;Previous]<\/span> 1 2 3 4 <span class=\"hljs-selector-attr\">&#91;Next]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For large systems, use <strong>server-side pagination<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Column Management<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Very useful for admin panels and dashboards.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Column Visibility<\/td><td>Show\/hide columns<\/td><\/tr><tr><td>Column Reordering<\/td><td>Drag columns left\/right<\/td><\/tr><tr><td>Column Resizing<\/td><td>Adjust width<\/td><\/tr><tr><td>Fixed Columns<\/td><td>Keep important columns sticky<\/td><\/tr><tr><td>Sticky Header<\/td><td>Header stays visible while scrolling<\/td><\/tr><tr><td>Column Alignment<\/td><td>Text left, numbers right<\/td><\/tr><tr><td>Column Formatting<\/td><td>Date, currency, status badges<\/td><\/tr><tr><td>Responsive Columns<\/td><td>Hide less important columns on mobile<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Columns: Name, Email, Phone, Status, Created <span class=\"hljs-built_in\">Date<\/span>, Actions\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add a button:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;Customize Columns]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. View Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Different users prefer different viewing styles.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>View Type<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Table View<\/td><td>Best for admin data<\/td><\/tr><tr><td>Card View<\/td><td>Best for mobile or visual data<\/td><\/tr><tr><td>Grid View<\/td><td>Best for products, doctors, hospitals<\/td><\/tr><tr><td>List View<\/td><td>Compact vertical list<\/td><\/tr><tr><td>Kanban View<\/td><td>Status-based workflow<\/td><\/tr><tr><td>Calendar View<\/td><td>Bookings, appointments, events<\/td><\/tr><tr><td>Map View<\/td><td>Location-based listings<\/td><\/tr><tr><td>Timeline View<\/td><td>Activity\/history-based data<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;Table] &#91;Grid] &#91;Card] &#91;Map]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Bulk Actions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bulk actions save time when managing many records.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Bulk Action<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Select One<\/td><td>Checkbox per row<\/td><\/tr><tr><td>Select All on Page<\/td><td>Select visible records<\/td><\/tr><tr><td>Select All Matching Filter<\/td><td>Select all 2,340 records<\/td><\/tr><tr><td>Bulk Delete<\/td><td>Delete selected records<\/td><\/tr><tr><td>Bulk Activate \/ Deactivate<\/td><td>Change status<\/td><\/tr><tr><td>Bulk Approve \/ Reject<\/td><td>Approve listings<\/td><\/tr><tr><td>Bulk Assign<\/td><td>Assign to manager<\/td><\/tr><tr><td>Bulk Export<\/td><td>Export selected records<\/td><\/tr><tr><td>Bulk Tag<\/td><td>Add tags<\/td><\/tr><tr><td>Bulk Move<\/td><td>Move to category<\/td><\/tr><tr><td>Bulk Email \/ Notify<\/td><td>Send notification<\/td><\/tr><tr><td>Bulk Archive<\/td><td>Archive records<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Standard message:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">25 <span class=\"hljs-selector-tag\">records<\/span> <span class=\"hljs-selector-tag\">selected<\/span>\n<span class=\"hljs-selector-attr\">&#91;Delete]<\/span> <span class=\"hljs-selector-attr\">&#91;Export]<\/span> <span class=\"hljs-selector-attr\">&#91;Change Status]<\/span> <span class=\"hljs-selector-attr\">&#91;Assign]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Row-Level Actions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each row\/card usually needs actions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common row actions:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Action<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>View<\/td><td>Open detail page<\/td><\/tr><tr><td>Edit<\/td><td>Modify record<\/td><\/tr><tr><td>Delete<\/td><td>Remove record<\/td><\/tr><tr><td>Duplicate<\/td><td>Copy record<\/td><\/tr><tr><td>Archive<\/td><td>Soft remove<\/td><\/tr><tr><td>Restore<\/td><td>Restore deleted\/archived record<\/td><\/tr><tr><td>Approve<\/td><td>Approve pending record<\/td><\/tr><tr><td>Reject<\/td><td>Reject request<\/td><\/tr><tr><td>Activate<\/td><td>Enable record<\/td><\/tr><tr><td>Deactivate<\/td><td>Disable record<\/td><\/tr><tr><td>Verify<\/td><td>Mark as verified<\/td><\/tr><tr><td>Feature<\/td><td>Mark as featured<\/td><\/tr><tr><td>Assign<\/td><td>Assign to team member<\/td><\/tr><tr><td>More Actions<\/td><td>Dropdown menu<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;View] &#91;Edit] &#91;More]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Inside More:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Duplicate\nArchive\nDelete\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Status Indicators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Status should be visually clear.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common status indicators:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Status Type<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Active \/ Inactive<\/td><td>User status<\/td><\/tr><tr><td>Pending<\/td><td>Waiting approval<\/td><\/tr><tr><td>Approved<\/td><td>Accepted<\/td><\/tr><tr><td>Rejected<\/td><td>Declined<\/td><\/tr><tr><td>Draft<\/td><td>Not published<\/td><\/tr><tr><td>Published<\/td><td>Live<\/td><\/tr><tr><td>Suspended<\/td><td>Blocked<\/td><\/tr><tr><td>Verified<\/td><td>Confirmed<\/td><\/tr><tr><td>Unverified<\/td><td>Not confirmed<\/td><\/tr><tr><td>Featured<\/td><td>Highlighted<\/td><\/tr><tr><td>Expired<\/td><td>Time over<\/td><\/tr><tr><td>Failed \/ Success<\/td><td>Job or payment status<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Use badges:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Active\nPending\nVerified\nPremium\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11. Data Display Formatting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Data should look consistent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common formatting standards:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Data Type<\/th><th>Format<\/th><\/tr><\/thead><tbody><tr><td>Date<\/td><td>08 Jun 2026<\/td><\/tr><tr><td>Date + Time<\/td><td>08 Jun 2026, 07:30 PM<\/td><\/tr><tr><td>Currency<\/td><td>\u20b94,999 \/ $100<\/td><\/tr><tr><td>Percentage<\/td><td>85%<\/td><\/tr><tr><td>Phone<\/td><td>+91 98765 43210<\/td><\/tr><tr><td>Boolean<\/td><td>Yes \/ No<\/td><\/tr><tr><td>Empty Value<\/td><td>\u2014<\/td><\/tr><tr><td>Long Text<\/td><td>Truncate with tooltip<\/td><\/tr><tr><td>URL<\/td><td>Clickable link<\/td><\/tr><tr><td>Email<\/td><td>Clickable mail link<\/td><\/tr><tr><td>Image<\/td><td>Thumbnail\/avatar<\/td><\/tr><tr><td>File<\/td><td>File icon + download<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid showing raw values like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-literal\">null<\/span>\n<span class=\"hljs-literal\">undefined<\/span>\n<span class=\"hljs-number\">0000<\/span><span class=\"hljs-number\">-00<\/span><span class=\"hljs-number\">-00<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2014\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12. Empty State<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When no data exists, show a helpful message.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Types of empty states:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Empty State<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>No Records Yet<\/td><td>No users have been added<\/td><\/tr><tr><td>No Search Results<\/td><td>No result found for \u201cRajesh\u201d<\/td><\/tr><tr><td>No Filter Results<\/td><td>No active users found<\/td><\/tr><tr><td>Error State<\/td><td>Could not load data<\/td><\/tr><tr><td>Permission State<\/td><td>You do not have access<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Good empty state:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">No hospitals found.\n\n<span class=\"hljs-keyword\">Try<\/span> changing your filters <span class=\"hljs-keyword\">or<\/span> add a <span class=\"hljs-keyword\">new<\/span> hospital.\n\n&#91;Add Hospital]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13. Loading State<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Important for good UX.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common loading options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Loading Type<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Spinner<\/td><td>Basic loading<\/td><\/tr><tr><td>Skeleton Loader<\/td><td>Better modern loading<\/td><\/tr><tr><td>Shimmer Effect<\/td><td>Premium loading UI<\/td><\/tr><tr><td>Button Loading<\/td><td>While submitting<\/td><\/tr><tr><td>Lazy Loading<\/td><td>Load only visible rows<\/td><\/tr><tr><td>Progressive Loading<\/td><td>Load important data first<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended for listing page:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Skeleton table rows <span class=\"hljs-keyword\">while<\/span> data loads\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">14. Error Handling<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every listing page should handle errors cleanly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common error states:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Error<\/th><th>Message<\/th><\/tr><\/thead><tbody><tr><td>API Failed<\/td><td>Unable to load records<\/td><\/tr><tr><td>Network Error<\/td><td>Please check your internet connection<\/td><\/tr><tr><td>Permission Error<\/td><td>You do not have permission<\/td><\/tr><tr><td>Timeout<\/td><td>Request took too long<\/td><\/tr><tr><td>Server Error<\/td><td>Something went wrong<\/td><\/tr><tr><td>Invalid Filter<\/td><td>Please check selected filters<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Useful buttons:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;Retry]\n&#91;Refresh]\n&#91;Contact Support]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">15. Refresh and Sync Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Important for real-time or admin systems.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Manual Refresh<\/td><td>Refresh button<\/td><\/tr><tr><td>Auto Refresh<\/td><td>Refresh every X seconds<\/td><\/tr><tr><td>Last Synced Time<\/td><td>Last updated 2 mins ago<\/td><\/tr><tr><td>Real-time Updates<\/td><td>WebSocket\/live updates<\/td><\/tr><tr><td>Pull to Refresh<\/td><td>Mobile-friendly<\/td><\/tr><tr><td>Sync Status<\/td><td>Synced \/ Sync Failed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Last<\/span> <span class=\"hljs-selector-tag\">updated<\/span>: 2 <span class=\"hljs-selector-tag\">minutes<\/span> <span class=\"hljs-selector-tag\">ago<\/span>\n<span class=\"hljs-selector-attr\">&#91;Refresh]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">16. Export Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most admin listing pages need export.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common export formats:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Export Type<\/th><th>Use<\/th><\/tr><\/thead><tbody><tr><td>CSV<\/td><td>Common data export<\/td><\/tr><tr><td>Excel<\/td><td>Business users<\/td><\/tr><tr><td>PDF<\/td><td>Reports<\/td><\/tr><tr><td>JSON<\/td><td>Developers\/API<\/td><\/tr><tr><td>Print<\/td><td>Printable list<\/td><\/tr><tr><td>Selected Rows Export<\/td><td>Export only selected<\/td><\/tr><tr><td>Filtered Export<\/td><td>Export current filtered result<\/td><\/tr><tr><td>Full Export<\/td><td>Export all records<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;Export CSV] &#91;Export Excel] &#91;Export PDF]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">17. Import Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Useful for bulk data entry.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Import Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Upload CSV<\/td><td>Bulk upload<\/td><\/tr><tr><td>Upload Excel<\/td><td>Bulk upload<\/td><\/tr><tr><td>Download Sample Template<\/td><td>Provide correct format<\/td><\/tr><tr><td>Import Validation<\/td><td>Check errors before saving<\/td><\/tr><tr><td>Import Preview<\/td><td>Show records before final import<\/td><\/tr><tr><td>Duplicate Handling<\/td><td>Skip\/update\/overwrite<\/td><\/tr><tr><td>Import History<\/td><td>Show past imports<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;Import Users]\n&#91;Download Sample CSV]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">18. Saved Views<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Very useful for admin dashboards.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Saved views allow users to save search, filter, sort, and column settings.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">All Users\nActive Users\nPending Approval\nPremium Hospitals\nRecently Added\nMy Assigned Tasks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Features:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Default View<\/td><td>System default<\/td><\/tr><tr><td>Personal View<\/td><td>User-specific<\/td><\/tr><tr><td>Shared View<\/td><td>Shared with team<\/td><\/tr><tr><td>Rename View<\/td><td>Change saved view name<\/td><\/tr><tr><td>Delete View<\/td><td>Remove saved view<\/td><\/tr><tr><td>Pin View<\/td><td>Keep favorite view first<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">19. Advanced Filter Panel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For complex pages, use a filter drawer\/sidebar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common fields:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Keyword\nStatus\nCategory\nCountry\nState\nCity\nCreated <span class=\"hljs-built_in\">Date<\/span>\nUpdated <span class=\"hljs-built_in\">Date<\/span>\nOwner\nPrice Range\nVerification Status\nTags\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Buttons:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;Apply Filters]\n&#91;Reset]\n&#91;Save View]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">20. Quick Filter Chips<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Useful for common filters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">&#91;All] &#91;Active] &#91;Pending] &#91;Verified] &#91;Premium] &#91;Expired]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Today\nLast 7 Days\nThis Month\nThis Year\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">21. Record Count Summary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Always show useful counts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Total Users: 2,340\nActive: 1,920\nPending: 120\nSuspended: 35\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For dashboards:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">All 2,340 | Active 1,920 | Pending 120 | Blocked 35\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22. Permissions and Role-Based Visibility<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not every user should see every action.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Role<\/th><th>Access<\/th><\/tr><\/thead><tbody><tr><td>Admin<\/td><td>View, Add, Edit, Delete, Export<\/td><\/tr><tr><td>Manager<\/td><td>View, Edit, Assign<\/td><\/tr><tr><td>Staff<\/td><td>View only<\/td><\/tr><tr><td>Viewer<\/td><td>Read-only<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Hide actions if the user lacks permission.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Admin sees Delete\nNormal user does not see Delete\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">23. Audit and Activity Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For serious applications, track actions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Useful options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Created By<\/td><td>Who created record<\/td><\/tr><tr><td>Created At<\/td><td>When created<\/td><\/tr><tr><td>Updated By<\/td><td>Who last edited<\/td><\/tr><tr><td>Updated At<\/td><td>Last update time<\/td><\/tr><tr><td>Activity Log<\/td><td>Full change history<\/td><\/tr><tr><td>Version History<\/td><td>Previous versions<\/td><\/tr><tr><td>Deleted By<\/td><td>Who deleted<\/td><\/tr><tr><td>Restored By<\/td><td>Who restored<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24. Mobile Responsiveness<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Listing pages must work well on mobile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mobile options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Card Layout<\/td><td>Better than wide table<\/td><\/tr><tr><td>Horizontal Scroll Table<\/td><td>For admin tables<\/td><\/tr><tr><td>Sticky Action Button<\/td><td>Add button fixed<\/td><\/tr><tr><td>Collapsible Filters<\/td><td>Filter drawer<\/td><\/tr><tr><td>Bottom Sheet Actions<\/td><td>Mobile-friendly row actions<\/td><\/tr><tr><td>Swipe Actions<\/td><td>Swipe to edit\/delete<\/td><\/tr><tr><td>Compact Pagination<\/td><td>Previous \/ Next only<\/td><\/tr><tr><td>Search on Top<\/td><td>Always visible<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For mobile, prefer:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Card View + Filter Drawer + Sort Dropdown\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">25. Performance Options for Large Data<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Very important when records are large.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Server-side Pagination<\/td><td>Load limited records<\/td><\/tr><tr><td>Server-side Search<\/td><td>Search from backend<\/td><\/tr><tr><td>Server-side Sorting<\/td><td>Sort in database<\/td><\/tr><tr><td>Server-side Filtering<\/td><td>Filter in database<\/td><\/tr><tr><td>Database Indexing<\/td><td>Fast query performance<\/td><\/tr><tr><td>Debounced Search<\/td><td>Wait before API call<\/td><\/tr><tr><td>Lazy Loading<\/td><td>Load only needed data<\/td><\/tr><tr><td>Virtual Scrolling<\/td><td>Render only visible rows<\/td><\/tr><tr><td>Caching<\/td><td>Store repeated results<\/td><\/tr><tr><td>API Query Params<\/td><td>Consistent backend queries<\/td><\/tr><tr><td>Cursor Pagination<\/td><td>Better for millions of records<\/td><\/tr><tr><td>Background Export<\/td><td>Export large data asynchronously<\/td><\/tr><tr><td>Optimized Count Query<\/td><td>Avoid slow total count<\/td><\/tr><tr><td>CDN for Images<\/td><td>Faster thumbnails<\/td><\/tr><tr><td>Thumbnail Images<\/td><td>Avoid loading full images<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example API:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">GET \/api\/users?page=1&amp;per_page=25&amp;search=rajesh&amp;status=active&amp;sort=created_at&amp;order=desc\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">26. Accessibility Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Good listing pages should be usable by everyone.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Keyboard Navigation<\/td><td>Tab through controls<\/td><\/tr><tr><td>Screen Reader Labels<\/td><td>Proper aria labels<\/td><\/tr><tr><td>Proper Contrast<\/td><td>Readable text<\/td><\/tr><tr><td>Focus State<\/td><td>Visible selected field<\/td><\/tr><tr><td>Sort Announcements<\/td><td>Tell user sort changed<\/td><\/tr><tr><td>Button Labels<\/td><td>Avoid icon-only buttons<\/td><\/tr><tr><td>Table Headers<\/td><td>Proper semantic table<\/td><\/tr><tr><td>Error Messages<\/td><td>Clear and readable<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">27. Confirmation and Safety<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For destructive actions, add confirmation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Are you sure you want to <span class=\"hljs-keyword\">delete<\/span> <span class=\"hljs-keyword\">this<\/span> user?\nThis action cannot be undone.\n&#91;Cancel] &#91;Delete]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For bulk delete:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">You are about to <span class=\"hljs-keyword\">delete<\/span> <span class=\"hljs-number\">25<\/span> records.\nType DELETE to confirm.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Useful safety options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Soft Delete<\/td><td>Move to trash instead of permanent delete<\/td><\/tr><tr><td>Restore<\/td><td>Bring deleted data back<\/td><\/tr><tr><td>Confirmation Modal<\/td><td>Prevent accidental delete<\/td><\/tr><tr><td>Undo Action<\/td><td>Undo recent action<\/td><\/tr><tr><td>Permission Check<\/td><td>Only authorized users can delete<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">28. Notifications and Feedback<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After every action, show feedback.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">User updated successfully.\n<span class=\"hljs-number\">25<\/span> records exported successfully.\nUnable to <span class=\"hljs-keyword\">delete<\/span> record. Please <span class=\"hljs-keyword\">try<\/span> again.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Types:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Success Toast<\/td><td>Saved successfully<\/td><\/tr><tr><td>Error Toast<\/td><td>Failed to save<\/td><\/tr><tr><td>Warning Toast<\/td><td>Some records skipped<\/td><\/tr><tr><td>Info Toast<\/td><td>Export is being prepared<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">29. Detail Preview Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of opening a new page every time, you can show quick preview.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Side Drawer Preview<\/td><td>Opens details on right<\/td><\/tr><tr><td>Expand Row<\/td><td>Show extra row details<\/td><\/tr><tr><td>Modal Preview<\/td><td>Quick popup<\/td><\/tr><tr><td>Hover Preview<\/td><td>Small tooltip preview<\/td><\/tr><tr><td>Quick View<\/td><td>View without leaving list<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Click row \u2192 open side panel <span class=\"hljs-keyword\">with<\/span> details\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">30. Selection and Checkbox Behavior<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Important for bulk operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Standard options:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Checkbox per row\nSelect all visible records\nSelect all matching filter\nClear selection\nShow selected count\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">25<\/span> selected on <span class=\"hljs-keyword\">this<\/span> page.\nSelect all <span class=\"hljs-number\">2<\/span>,<span class=\"hljs-number\">340<\/span> matching records?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">31. Tabs and Segmentation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tabs are useful when data has clear groups.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">All\nActive\nPending\nRejected\nArchived\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Hospitals\nDoctors\nPatients\nAppointments\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">32. Search + Filter + Sort URL Persistence<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Very important for professional apps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When user applies filters, URL should update:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/users?search=rajesh&amp;status=active&amp;page=2&amp;sort=created_at&amp;order=desc\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Benefits:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Benefit<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Shareable URL<\/td><td>User can share filtered view<\/td><\/tr><tr><td>Browser Back Works<\/td><td>Back button behaves properly<\/td><\/tr><tr><td>Refresh Safe<\/td><td>Filter does not disappear<\/td><\/tr><tr><td>Bookmarkable<\/td><td>User can save view<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">33. Default Values<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every listing page should define defaults.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Default<\/span> Sort: Created Date DESC\n<span class=\"hljs-keyword\">Default<\/span> Page Size: <span class=\"hljs-number\">25<\/span>\n<span class=\"hljs-keyword\">Default<\/span> View: Table\n<span class=\"hljs-keyword\">Default<\/span> Filter: Active Records\n<span class=\"hljs-keyword\">Default<\/span> Columns: Name, Email, Status, Created Date, Actions\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">34. Admin-Specific Listing Features<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For admin panels, include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Search\nAdvanced Filter\nSort\nPagination\nBulk Action\nExport\nImport\nStatus Change\nRole-Based Actions\nAudit Log\nTrash\/Restore\nColumn Customization\nSaved Views\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35. User-Friendly Microcopy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use clear text everywhere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">No data\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">No records found. <span class=\"hljs-keyword\">Try<\/span> adjusting your search <span class=\"hljs-keyword\">or<\/span> filters.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Submit\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Apply Filters\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Reset\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Clear All Filters\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Master Checklist for Listing Pages<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this checklist for every website\/application listing page:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Page title\n<span class=\"hljs-number\">2.<\/span> Page description\n<span class=\"hljs-number\">3.<\/span> Breadcrumb\n<span class=\"hljs-number\">4.<\/span> Add\/Create button\n<span class=\"hljs-number\">5.<\/span> Global search\n<span class=\"hljs-number\">6.<\/span> Advanced search\n<span class=\"hljs-number\">7.<\/span> Filters\n<span class=\"hljs-number\">8.<\/span> Quick filter chips\n<span class=\"hljs-number\">9.<\/span> Sort dropdown\n<span class=\"hljs-number\">10.<\/span> Column sorting\n<span class=\"hljs-number\">11.<\/span> Pagination\n<span class=\"hljs-number\">12.<\/span> Rows per page\n<span class=\"hljs-number\">13.<\/span> Total record count\n<span class=\"hljs-number\">14.<\/span> Table view\n<span class=\"hljs-number\">15.<\/span> Card\/grid view\n<span class=\"hljs-number\">16.<\/span> Column show\/hide\n<span class=\"hljs-number\">17.<\/span> Column resize\/reorder\n<span class=\"hljs-number\">18.<\/span> Sticky header\n<span class=\"hljs-number\">19.<\/span> Row actions\n<span class=\"hljs-number\">20.<\/span> Bulk selection\n<span class=\"hljs-number\">21.<\/span> Bulk actions\n<span class=\"hljs-number\">22.<\/span> Status badges\n<span class=\"hljs-number\">23.<\/span> <span class=\"hljs-built_in\">Date<\/span>\/currency formatting\n<span class=\"hljs-number\">24.<\/span> Empty state\n<span class=\"hljs-number\">25.<\/span> Loading skeleton\n<span class=\"hljs-number\">26.<\/span> <span class=\"hljs-built_in\">Error<\/span> state\n<span class=\"hljs-number\">27.<\/span> Retry button\n<span class=\"hljs-number\">28.<\/span> Refresh button\n<span class=\"hljs-number\">29.<\/span> Last updated time\n<span class=\"hljs-number\">30.<\/span> Export CSV\/Excel\/PDF\n<span class=\"hljs-number\">31.<\/span> Import CSV\/Excel\n<span class=\"hljs-number\">32.<\/span> Saved views\n<span class=\"hljs-number\">33.<\/span> Filter persistence <span class=\"hljs-keyword\">in<\/span> URL\n<span class=\"hljs-number\">34.<\/span> Role-based permissions\n<span class=\"hljs-number\">35.<\/span> Audit fields\n<span class=\"hljs-number\">36.<\/span> Activity log\n<span class=\"hljs-number\">37.<\/span> Detail preview drawer\n<span class=\"hljs-number\">38.<\/span> Confirmation modal\n<span class=\"hljs-number\">39.<\/span> Toast notifications\n<span class=\"hljs-number\">40.<\/span> Soft <span class=\"hljs-keyword\">delete<\/span>\/trash\n<span class=\"hljs-number\">41.<\/span> Restore option\n<span class=\"hljs-number\">42.<\/span> Mobile responsive layout\n<span class=\"hljs-number\">43.<\/span> Accessibility support\n<span class=\"hljs-number\">44.<\/span> Server-side pagination\n<span class=\"hljs-number\">45.<\/span> Server-side search\n<span class=\"hljs-number\">46.<\/span> Server-side filtering\n<span class=\"hljs-number\">47.<\/span> Server-side sorting\n<span class=\"hljs-number\">48.<\/span> Debounced search\n<span class=\"hljs-number\">49.<\/span> Database indexing\n<span class=\"hljs-number\">50.<\/span> API query standard\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Best Standard Template Name<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can call this internally:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Universal Listing Page Template\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Standard Data Listing \/ Data Grid Framework\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CRUD Listing Page UI Standard\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">My recommended name:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Universal Data Listing Page Standard\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Recommended Standard Layout<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">------------------------------------------------\nBreadcrumb\nPage Title + Description              &#91;Add <span class=\"hljs-keyword\">New<\/span>]\n------------------------------------------------\nSearch Bar                            &#91;Export]\nQuick Filters                         &#91;Import]\nAdvanced Filter Button                &#91;Columns]\n------------------------------------------------\nSummary Counts\nAll | Active | Pending | Archived\n------------------------------------------------\nTable \/ Card \/ Grid Data\n------------------------------------------------\nBulk Actions Bar\n------------------------------------------------\nPagination + Rows Per Page + Total Count\n------------------------------------------------\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Best Common API Pattern<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use the same backend query style everywhere:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">GET \/api\/{<span class=\"hljs-built_in\">module<\/span>}\n    ?page=<span class=\"hljs-number\">1<\/span>\n    &amp;per_page=<span class=\"hljs-number\">25<\/span>\n    &amp;search=keyword\n    &amp;status=active\n    &amp;sort_by=created_at\n    &amp;sort_order=desc\n    &amp;from_date=<span class=\"hljs-number\">2026<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-01<\/span>\n    &amp;to_date=<span class=\"hljs-number\">2026<\/span><span class=\"hljs-number\">-06<\/span><span class=\"hljs-number\">-08<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">GET \/api\/hospitals?page=1&amp;per_page=25&amp;search=apollo&amp;status=active&amp;sort_by=created_at&amp;sort_order=desc\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Minimum Features Every Listing Page Must Have<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">At minimum, every listing page should include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Search\nFilter\nSort\nPagination\nRows per page\nTotal count\nStatus badge\nView\/Edit\/Delete actions\nBulk selection\nExport\nRefresh\nEmpty state\nLoading state\n<span class=\"hljs-built_in\">Error<\/span> state\nMobile responsive layout\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For professional admin systems, also include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Saved views\nColumn customization\nAdvanced filters\nAudit log\nRole-based actions\nURL persistence\nServer-side performance optimization\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This standard will make all your website listing pages consistent, scalable, and much easier for users to understand.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Standard Listing Page Requirements for Web Applications<\/li>\n\n\n\n<li>Essential Features Every Listing Page Must Have<\/li>\n\n\n\n<li>Universal Listing Page Standard for Web Developers<\/li>\n\n\n\n<li>Mandatory Data Listing Page Checklist<\/li>\n\n\n\n<li>Common Listing Page Features for Admin Panels and Web Apps<\/li>\n\n\n\n<li>Standard Data Grid and Listing Page Guidelines<\/li>\n\n\n\n<li>Listing Page UI\/UX Standards for Web Applications<\/li>\n\n\n\n<li>Essential Search, Filter, Sort, and Pagination Standards<\/li>\n\n\n\n<li>Reusable Listing Page Template for Web Applications<\/li>\n\n\n\n<li>Web Application Listing Page Best Practices<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Rajesh, for your stack \u2014 <strong>Laravel + Node + Alpine.js + Tailwind CSS<\/strong> \u2014 the best implementation is:<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Build One Universal Server-Side Listing Framework<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Do <strong>not<\/strong> create search, filter, sort, pagination, export, bulk action, etc. separately for every page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, create one reusable listing system and use it everywhere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Users Listing\nHospitals Listing\nDoctors Listing\nProducts Listing\nBlogs Listing\nTasks Listing\nOrders Listing\nPayments Listing\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">All should use the same common framework.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Best Architecture for Your Stack<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Tailwind CSS\n    \u2193\nCommon UI Components\n\nAlpine.js\n    \u2193\nSearch, filters, sort, pagination, URL query sync\n\nLaravel\n    \u2193\nMain listing API, database query, pagination, permissions\n\nNode.js\n    \u2193\nOptional: heavy exports, background jobs, realtime updates, external APIs\n\nDatabase\n    \u2193\nIndexed search\/filter\/sort columns\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best division:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Layer<\/th><th>Responsibility<\/th><\/tr><\/thead><tbody><tr><td><strong>Laravel<\/strong><\/td><td>Main backend listing logic<\/td><\/tr><tr><td><strong>Alpine.js<\/strong><\/td><td>Frontend interactivity<\/td><\/tr><tr><td><strong>Tailwind CSS<\/strong><\/td><td>Common listing UI design<\/td><\/tr><tr><td><strong>Node.js<\/strong><\/td><td>Optional heavy processing \/ realtime \/ workers<\/td><\/tr><tr><td><strong>Database<\/strong><\/td><td>Indexed server-side search\/filter\/sort<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Most Important Rule<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Never do this:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Load 50,000 records in browser\nThen search\/filter\/sort using JavaScript\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Always do this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Load only <span class=\"hljs-number\">10<\/span>\/<span class=\"hljs-number\">25<\/span>\/<span class=\"hljs-number\">50<\/span>\/<span class=\"hljs-number\">100<\/span> records\nSearch\/filter\/sort\/paginate on server side\n<span class=\"hljs-keyword\">Return<\/span> only required records\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is the main secret for performance.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Standard Query Pattern for Every Listing Page<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use the same URL\/query parameters everywhere:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/users?page=1&amp;per_page=25&amp;search=rajesh&amp;status=active&amp;sort_by=created_at&amp;sort_order=desc\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Same pattern for hospitals:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/hospitals?page=1&amp;per_page=25&amp;search=apollo&amp;status=verified&amp;sort_by=name&amp;sort_order=asc\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Same pattern for blogs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/blogs?page=1&amp;per_page=25&amp;search=laravel&amp;status=published&amp;sort_by=created_at&amp;sort_order=desc\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Recommended Folder Structure in Laravel<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">app\/\n \u251c\u2500\u2500 Support\/\n \u2502    \u2514\u2500\u2500 Listing\/\n \u2502         \u251c\u2500\u2500 ListingQuery.php\n \u2502         \u2514\u2500\u2500 ListingConfig.php\n \u2502\n \u251c\u2500\u2500 Http\/\n \u2502    \u251c\u2500\u2500 Requests\/\n \u2502    \u2502    \u2514\u2500\u2500 ListingRequest.php\n \u2502    \u2514\u2500\u2500 Controllers\/\n \u2502         \u251c\u2500\u2500 UserController.php\n \u2502         \u251c\u2500\u2500 HospitalController.php\n \u2502         \u2514\u2500\u2500 BlogController.php\n\nresources\/\n \u251c\u2500\u2500 views\/\n \u2502    \u251c\u2500\u2500 components\/\n \u2502    \u2502    \u2514\u2500\u2500 listing\/\n \u2502    \u2502         \u251c\u2500\u2500 layout.blade.php\n \u2502    \u2502         \u251c\u2500\u2500 search.blade.php\n \u2502    \u2502         \u251c\u2500\u2500 filters.blade.php\n \u2502    \u2502         \u251c\u2500\u2500 table.blade.php\n \u2502    \u2502         \u251c\u2500\u2500 pagination.blade.php\n \u2502    \u2502         \u251c\u2500\u2500 bulk-actions.blade.php\n \u2502    \u2502         \u251c\u2500\u2500 <span class=\"hljs-keyword\">empty<\/span>-state.blade.php\n \u2502    \u2502         \u251c\u2500\u2500 error-state.blade.php\n \u2502    \u2502         \u2514\u2500\u2500 loading-skeleton.blade.php\n \u2502    \u2502\n \u2502    \u2514\u2500\u2500 admin\/\n \u2502         \u251c\u2500\u2500 users\/index.blade.php\n \u2502         \u251c\u2500\u2500 hospitals\/index.blade.php\n \u2502         \u2514\u2500\u2500 blogs\/index.blade.php\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 1: Create Common Listing Request<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Requests<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Foundation<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">FormRequest<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ListingRequest<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">FormRequest<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">authorize<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">bool<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">true<\/span>;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">rules<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">array<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> &#91;\n            <span class=\"hljs-string\">'search'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'string'<\/span>, <span class=\"hljs-string\">'max:100'<\/span>],\n            <span class=\"hljs-string\">'page'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'integer'<\/span>, <span class=\"hljs-string\">'min:1'<\/span>],\n            <span class=\"hljs-string\">'per_page'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'integer'<\/span>, <span class=\"hljs-string\">'in:10,25,50,100'<\/span>],\n            <span class=\"hljs-string\">'sort_by'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'string'<\/span>, <span class=\"hljs-string\">'max:50'<\/span>],\n            <span class=\"hljs-string\">'sort_order'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'in:asc,desc'<\/span>],\n\n            <span class=\"hljs-comment\">\/\/ common optional filters<\/span>\n            <span class=\"hljs-string\">'status'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'string'<\/span>, <span class=\"hljs-string\">'max:50'<\/span>],\n            <span class=\"hljs-string\">'type'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'string'<\/span>, <span class=\"hljs-string\">'max:50'<\/span>],\n            <span class=\"hljs-string\">'role'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'string'<\/span>, <span class=\"hljs-string\">'max:50'<\/span>],\n            <span class=\"hljs-string\">'from_date'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'date'<\/span>],\n            <span class=\"hljs-string\">'to_date'<\/span> =&gt; &#91;<span class=\"hljs-string\">'nullable'<\/span>, <span class=\"hljs-string\">'date'<\/span>],\n        ];\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">perPage<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">int<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> (int) <span class=\"hljs-keyword\">$this<\/span>-&gt;input(<span class=\"hljs-string\">'per_page'<\/span>, <span class=\"hljs-number\">25<\/span>);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">sortOrder<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">string<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;input(<span class=\"hljs-string\">'sort_order'<\/span>, <span class=\"hljs-string\">'desc'<\/span>) === <span class=\"hljs-string\">'asc'<\/span> ? <span class=\"hljs-string\">'asc'<\/span> : <span class=\"hljs-string\">'desc'<\/span>;\n    }\n}\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 2: Create Reusable Laravel Listing Query Service<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Listing<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Database<\/span>\\<span class=\"hljs-title\">Eloquent<\/span>\\<span class=\"hljs-title\">Builder<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Request<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ListingQuery<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">apply<\/span><span class=\"hljs-params\">(\n        Builder $query,\n        Request $request,\n        array $config\n    )<\/span> <\/span>{\n        $searchable = $config&#91;<span class=\"hljs-string\">'searchable'<\/span>] ?? &#91;];\n        $filterable = $config&#91;<span class=\"hljs-string\">'filterable'<\/span>] ?? &#91;];\n        $sortable = $config&#91;<span class=\"hljs-string\">'sortable'<\/span>] ?? &#91;];\n        $defaultSort = $config&#91;<span class=\"hljs-string\">'default_sort'<\/span>] ?? <span class=\"hljs-string\">'created_at'<\/span>;\n        $defaultOrder = $config&#91;<span class=\"hljs-string\">'default_order'<\/span>] ?? <span class=\"hljs-string\">'desc'<\/span>;\n\n        <span class=\"hljs-comment\">\/**\n         * Search\n         *\/<\/span>\n        <span class=\"hljs-keyword\">if<\/span> ($request-&gt;filled(<span class=\"hljs-string\">'search'<\/span>) &amp;&amp; count($searchable) &gt; <span class=\"hljs-number\">0<\/span>) {\n            $search = trim($request-&gt;input(<span class=\"hljs-string\">'search'<\/span>));\n\n            $query-&gt;where(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">($q)<\/span> <span class=\"hljs-title\">use<\/span> <span class=\"hljs-params\">($searchable, $search)<\/span> <\/span>{\n                <span class=\"hljs-keyword\">foreach<\/span> ($searchable <span class=\"hljs-keyword\">as<\/span> $column) {\n                    $q-&gt;orWhere($column, <span class=\"hljs-string\">'LIKE'<\/span>, $search . <span class=\"hljs-string\">'%'<\/span>);\n                }\n            });\n        }\n\n        <span class=\"hljs-comment\">\/**\n         * Filters\n         *\/<\/span>\n        <span class=\"hljs-keyword\">foreach<\/span> ($filterable <span class=\"hljs-keyword\">as<\/span> $filter =&gt; $column) {\n            <span class=\"hljs-keyword\">if<\/span> ($request-&gt;filled($filter)) {\n                $query-&gt;where($column, $request-&gt;input($filter));\n            }\n        }\n\n        <span class=\"hljs-comment\">\/**\n         * Date filters\n         *\/<\/span>\n        <span class=\"hljs-keyword\">if<\/span> ($request-&gt;filled(<span class=\"hljs-string\">'from_date'<\/span>)) {\n            $query-&gt;whereDate(<span class=\"hljs-string\">'created_at'<\/span>, <span class=\"hljs-string\">'&gt;='<\/span>, $request-&gt;input(<span class=\"hljs-string\">'from_date'<\/span>));\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> ($request-&gt;filled(<span class=\"hljs-string\">'to_date'<\/span>)) {\n            $query-&gt;whereDate(<span class=\"hljs-string\">'created_at'<\/span>, <span class=\"hljs-string\">'&lt;='<\/span>, $request-&gt;input(<span class=\"hljs-string\">'to_date'<\/span>));\n        }\n\n        <span class=\"hljs-comment\">\/**\n         * Sorting with whitelist\n         *\/<\/span>\n        $sortBy = $request-&gt;input(<span class=\"hljs-string\">'sort_by'<\/span>, $defaultSort);\n        $sortOrder = $request-&gt;input(<span class=\"hljs-string\">'sort_order'<\/span>, $defaultOrder);\n\n        <span class=\"hljs-keyword\">if<\/span> (! in_array($sortBy, $sortable)) {\n            $sortBy = $defaultSort;\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> (! in_array($sortOrder, &#91;<span class=\"hljs-string\">'asc'<\/span>, <span class=\"hljs-string\">'desc'<\/span>])) {\n            $sortOrder = $defaultOrder;\n        }\n\n        $query-&gt;orderBy($sortBy, $sortOrder);\n\n        <span class=\"hljs-comment\">\/**\n         * Pagination\n         *\/<\/span>\n        $perPage = (int) $request-&gt;input(<span class=\"hljs-string\">'per_page'<\/span>, <span class=\"hljs-number\">25<\/span>);\n\n        <span class=\"hljs-keyword\">if<\/span> (! in_array($perPage, &#91;<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">25<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">100<\/span>])) {\n            $perPage = <span class=\"hljs-number\">25<\/span>;\n        }\n\n        <span class=\"hljs-keyword\">return<\/span> $query-&gt;paginate($perPage)-&gt;withQueryString();\n    }\n}\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 3: Use It in Every Controller<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Example: <code>UserController.php<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">User<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Requests<\/span>\\<span class=\"hljs-title\">ListingRequest<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Listing<\/span>\\<span class=\"hljs-title\">ListingQuery<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UserController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">index<\/span><span class=\"hljs-params\">(ListingRequest $request)<\/span>\n    <\/span>{\n        $query = User::query()\n            -&gt;select(&#91;\n                <span class=\"hljs-string\">'id'<\/span>,\n                <span class=\"hljs-string\">'name'<\/span>,\n                <span class=\"hljs-string\">'email'<\/span>,\n                <span class=\"hljs-string\">'phone'<\/span>,\n                <span class=\"hljs-string\">'role'<\/span>,\n                <span class=\"hljs-string\">'status'<\/span>,\n                <span class=\"hljs-string\">'created_at'<\/span>,\n            ]);\n\n        $users = ListingQuery::apply($query, $request, &#91;\n            <span class=\"hljs-string\">'searchable'<\/span> =&gt; &#91;<span class=\"hljs-string\">'name'<\/span>, <span class=\"hljs-string\">'email'<\/span>, <span class=\"hljs-string\">'phone'<\/span>],\n            <span class=\"hljs-string\">'filterable'<\/span> =&gt; &#91;\n                <span class=\"hljs-string\">'status'<\/span> =&gt; <span class=\"hljs-string\">'status'<\/span>,\n                <span class=\"hljs-string\">'role'<\/span> =&gt; <span class=\"hljs-string\">'role'<\/span>,\n            ],\n            <span class=\"hljs-string\">'sortable'<\/span> =&gt; &#91;\n                <span class=\"hljs-string\">'name'<\/span>,\n                <span class=\"hljs-string\">'email'<\/span>,\n                <span class=\"hljs-string\">'status'<\/span>,\n                <span class=\"hljs-string\">'role'<\/span>,\n                <span class=\"hljs-string\">'created_at'<\/span>,\n                <span class=\"hljs-string\">'updated_at'<\/span>,\n            ],\n            <span class=\"hljs-string\">'default_sort'<\/span> =&gt; <span class=\"hljs-string\">'created_at'<\/span>,\n            <span class=\"hljs-string\">'default_order'<\/span> =&gt; <span class=\"hljs-string\">'desc'<\/span>,\n        ]);\n\n        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.users.index'<\/span>, &#91;\n            <span class=\"hljs-string\">'records'<\/span> =&gt; $users,\n            <span class=\"hljs-string\">'filters'<\/span> =&gt; $request-&gt;validated(),\n        ]);\n    }\n}\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now for hospitals:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$hospitals = ListingQuery::apply($query, $request, &#91;\n    <span class=\"hljs-string\">'searchable'<\/span> =&gt; &#91;<span class=\"hljs-string\">'name'<\/span>, <span class=\"hljs-string\">'email'<\/span>, <span class=\"hljs-string\">'phone'<\/span>, <span class=\"hljs-string\">'city'<\/span>],\n    <span class=\"hljs-string\">'filterable'<\/span> =&gt; &#91;\n        <span class=\"hljs-string\">'status'<\/span> =&gt; <span class=\"hljs-string\">'status'<\/span>,\n        <span class=\"hljs-string\">'city'<\/span> =&gt; <span class=\"hljs-string\">'city'<\/span>,\n        <span class=\"hljs-string\">'type'<\/span> =&gt; <span class=\"hljs-string\">'type'<\/span>,\n    ],\n    <span class=\"hljs-string\">'sortable'<\/span> =&gt; &#91;<span class=\"hljs-string\">'name'<\/span>, <span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'city'<\/span>, <span class=\"hljs-string\">'created_at'<\/span>],\n    <span class=\"hljs-string\">'default_sort'<\/span> =&gt; <span class=\"hljs-string\">'created_at'<\/span>,\n    <span class=\"hljs-string\">'default_order'<\/span> =&gt; <span class=\"hljs-string\">'desc'<\/span>,\n]);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Same framework. Only config changes. Beautiful.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 4: Create Common Blade Listing Layout<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">{{-- resources\/views\/components\/listing\/layout.blade.php --}}\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> \n    <span class=\"hljs-attr\">x-data<\/span>=<span class=\"hljs-string\">\"listingPage()\"<\/span> \n    <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"space-y-4\"<\/span>\n&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-2xl font-bold text-gray-900\"<\/span>&gt;<\/span>\n                {{ $title }}\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n\n            @isset($description)\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-sm text-gray-500\"<\/span>&gt;<\/span>\n                    {{ $description }}\n                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n            @endisset\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"flex gap-2\"<\/span>&gt;<\/span>\n            {{ $actions ?? '' }}\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-xl border bg-white p-4 shadow-sm\"<\/span>&gt;<\/span>\n        {{ $toolbar ?? '' }}\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-4\"<\/span>&gt;<\/span>\n            {{ $slot }}\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-4\"<\/span>&gt;<\/span>\n            {{ $pagination ?? '' }}\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 5: Example Users Listing Page<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">x-listing.layout<\/span> \n    <span class=\"hljs-attr\">title<\/span>=<span class=\"hljs-string\">\"Users\"<\/span> \n    <span class=\"hljs-attr\">description<\/span>=<span class=\"hljs-string\">\"Manage all registered users\"<\/span>\n&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">x-slot:actions<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{{ route('users.create') }}\"<\/span>\n           <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700\"<\/span>&gt;<\/span>\n            Add User\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">x-slot:actions<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">x-slot:toolbar<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">method<\/span>=<span class=\"hljs-string\">\"GET\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"grid grid-cols-1 gap-3 md:grid-cols-5\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> \n                <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span>\n                <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"search\"<\/span>\n                <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"{{ request('search') }}\"<\/span>\n                <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Search by name, email, phone...\"<\/span>\n                <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-lg border-gray-300 md:col-span-2\"<\/span>\n            &gt;<\/span>\n\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">select<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"status\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-lg border-gray-300\"<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"\"<\/span>&gt;<\/span>All Status<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"active\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">status<\/span>') === <span class=\"hljs-string\">'active'<\/span>)&gt;<\/span>Active<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"inactive\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">status<\/span>') === <span class=\"hljs-string\">'inactive'<\/span>)&gt;<\/span>Inactive<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"pending\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">status<\/span>') === <span class=\"hljs-string\">'pending'<\/span>)&gt;<\/span>Pending<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">select<\/span>&gt;<\/span>\n\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">select<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"sort_by\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-lg border-gray-300\"<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"created_at\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">sort_by<\/span>') === <span class=\"hljs-string\">'created_at'<\/span>)&gt;<\/span>Created Date<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"name\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">sort_by<\/span>') === <span class=\"hljs-string\">'name'<\/span>)&gt;<\/span>Name<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"status\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">sort_by<\/span>') === <span class=\"hljs-string\">'status'<\/span>)&gt;<\/span>Status<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">select<\/span>&gt;<\/span>\n\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"flex gap-2\"<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-lg bg-gray-900 px-4 py-2 text-white\"<\/span>&gt;<\/span>\n                    Apply\n                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{{ route('users.index') }}\"<\/span>\n                   <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-lg border px-4 py-2\"<\/span>&gt;<\/span>\n                    Reset\n                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">x-slot:toolbar<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mb-3 flex items-center justify-between text-sm text-gray-600\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n            Showing {{ $records-&gt;firstItem() }} to {{ $records-&gt;lastItem() }}\n            of {{ $records-&gt;total() }} records\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">method<\/span>=<span class=\"hljs-string\">\"GET\"<\/span>&gt;<\/span>\n            @foreach(request()-&gt;except('per_page', 'page') as $key =&gt; $value)\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"hidden\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"{{ $key }}\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"{{ $value }}\"<\/span>&gt;<\/span>\n            @endforeach\n\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">select<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"per_page\"<\/span> <span class=\"hljs-attr\">onchange<\/span>=<span class=\"hljs-string\">\"this.form.submit()\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-lg border-gray-300\"<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"10\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">per_page<\/span>', <span class=\"hljs-attr\">25<\/span>) == <span class=\"hljs-string\">10)<\/span>&gt;<\/span>10<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"25\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">per_page<\/span>', <span class=\"hljs-attr\">25<\/span>) == <span class=\"hljs-string\">25)<\/span>&gt;<\/span>25<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"50\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">per_page<\/span>', <span class=\"hljs-attr\">25<\/span>) == <span class=\"hljs-string\">50)<\/span>&gt;<\/span>50<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"100\"<\/span> @<span class=\"hljs-attr\">selected<\/span>(<span class=\"hljs-attr\">request<\/span>('<span class=\"hljs-attr\">per_page<\/span>', <span class=\"hljs-attr\">25<\/span>) == <span class=\"hljs-string\">100)<\/span>&gt;<\/span>100<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">select<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"overflow-x-auto\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">table<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"min-w-full divide-y divide-gray-200 text-sm\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">thead<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"bg-gray-50\"<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">th<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-left\"<\/span>&gt;<\/span>\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"checkbox\"<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">th<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">th<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-left\"<\/span>&gt;<\/span>Name<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">th<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">th<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-left\"<\/span>&gt;<\/span>Email<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">th<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">th<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-left\"<\/span>&gt;<\/span>Role<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">th<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">th<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-left\"<\/span>&gt;<\/span>Status<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">th<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">th<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-left\"<\/span>&gt;<\/span>Created At<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">th<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">th<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-right\"<\/span>&gt;<\/span>Actions<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">th<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">thead<\/span>&gt;<\/span>\n\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">tbody<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"divide-y divide-gray-100 bg-white\"<\/span>&gt;<\/span>\n                @forelse($records as $user)\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3\"<\/span>&gt;<\/span>\n                            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"checkbox\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"{{ $user-&gt;id }}\"<\/span>&gt;<\/span>\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 font-medium\"<\/span>&gt;<\/span>\n                            {{ $user-&gt;name }}\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3\"<\/span>&gt;<\/span>\n                            {{ $user-&gt;email }}\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3\"<\/span>&gt;<\/span>\n                            {{ ucfirst($user-&gt;role) }}\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3\"<\/span>&gt;<\/span>\n                            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded-full px-2 py-1 text-xs font-medium\n                                {{ $user-&gt;status === 'active' ? 'bg-green-100 text-green-700' : 'bg-gray-100 text-gray-700' }}\"<\/span>&gt;<\/span>\n                                {{ ucfirst($user-&gt;status) }}\n                            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3\"<\/span>&gt;<\/span>\n                            {{ $user-&gt;created_at-&gt;format('d M Y, h:i A') }}\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-3 text-right\"<\/span>&gt;<\/span>\n                            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{{ route('users.show', $user) }}\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-blue-600\"<\/span>&gt;<\/span>\n                                View\n                            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n\n                            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{{ route('users.edit', $user) }}\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"ml-3 text-indigo-600\"<\/span>&gt;<\/span>\n                                Edit\n                            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n\n                            @can('delete', $user)\n                                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> \n                                    <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"button\"<\/span>\n                                    <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"ml-3 text-red-600\"<\/span>\n                                    <span class=\"hljs-attr\">onclick<\/span>=<span class=\"hljs-string\">\"confirm('Are you sure?')\"<\/span>&gt;<\/span>\n                                    Delete\n                                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n                            @endcan\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\n                @empty\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">td<\/span> <span class=\"hljs-attr\">colspan<\/span>=<span class=\"hljs-string\">\"7\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"px-4 py-10 text-center text-gray-500\"<\/span>&gt;<\/span>\n                            No records found. Try changing your search or filters.\n                        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">td<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">tr<\/span>&gt;<\/span>\n                @endforelse\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">tbody<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">table<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">x-slot:pagination<\/span>&gt;<\/span>\n        {{ $records-&gt;links() }}\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">x-slot:pagination<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">x-listing.layout<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 6: Add Alpine.js for Better Search UX<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use Alpine.js for debounce search and URL sync.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">listingPage<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> {\n        <span class=\"hljs-attr\">search<\/span>: <span class=\"hljs-keyword\">new<\/span> URLSearchParams(<span class=\"hljs-built_in\">window<\/span>.location.search).get(<span class=\"hljs-string\">'search'<\/span>) || <span class=\"hljs-string\">''<\/span>,\n        <span class=\"hljs-attr\">timeout<\/span>: <span class=\"hljs-literal\">null<\/span>,\n\n        updateSearch() {\n            clearTimeout(<span class=\"hljs-keyword\">this<\/span>.timeout);\n\n            <span class=\"hljs-keyword\">this<\/span>.timeout = setTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n                <span class=\"hljs-keyword\">const<\/span> params = <span class=\"hljs-keyword\">new<\/span> URLSearchParams(<span class=\"hljs-built_in\">window<\/span>.location.search);\n\n                <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">this<\/span>.search.length &gt;= <span class=\"hljs-number\">2<\/span>) {\n                    params.set(<span class=\"hljs-string\">'search'<\/span>, <span class=\"hljs-keyword\">this<\/span>.search);\n                } <span class=\"hljs-keyword\">else<\/span> {\n                    params.delete(<span class=\"hljs-string\">'search'<\/span>);\n                }\n\n                params.set(<span class=\"hljs-string\">'page'<\/span>, <span class=\"hljs-number\">1<\/span>);\n\n                <span class=\"hljs-built_in\">window<\/span>.location.search = params.toString();\n            }, <span class=\"hljs-number\">400<\/span>);\n        }\n    }\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use it:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;input\n    type=<span class=\"hljs-string\">\"text\"<\/span>\n    x-model=<span class=\"hljs-string\">\"search\"<\/span>\n    x-on:input=<span class=\"hljs-string\">\"updateSearch\"<\/span>\n    placeholder=<span class=\"hljs-string\">\"Search...\"<\/span>\n    <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span>=<span class=\"hljs-string\">\"rounded-lg border-gray-300\"<\/span>\n\/&gt;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This prevents API\/database hits on every keypress.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 7: Database Indexes Are Mandatory<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For performance, add indexes on columns used in search, filter, and sort.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example for users:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Schema::table(<span class=\"hljs-string\">'users'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">(Blueprint $table)<\/span> <\/span>{\n    $table-&gt;index(<span class=\"hljs-string\">'status'<\/span>);\n    $table-&gt;index(<span class=\"hljs-string\">'role'<\/span>);\n    $table-&gt;index(<span class=\"hljs-string\">'created_at'<\/span>);\n    $table-&gt;index(&#91;<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'created_at'<\/span>]);\n    $table-&gt;index(<span class=\"hljs-string\">'email'<\/span>);\n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For hospitals:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Schema::table(<span class=\"hljs-string\">'hospitals'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">(Blueprint $table)<\/span> <\/span>{\n    $table-&gt;index(<span class=\"hljs-string\">'status'<\/span>);\n    $table-&gt;index(<span class=\"hljs-string\">'city'<\/span>);\n    $table-&gt;index(<span class=\"hljs-string\">'country'<\/span>);\n    $table-&gt;index(<span class=\"hljs-string\">'created_at'<\/span>);\n    $table-&gt;index(&#91;<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'city'<\/span>]);\n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Without indexes, server-side filtering can still become slow.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 8: Do Not Use <code>SELECT *<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">User::query()-&gt;paginate(<span class=\"hljs-number\">25<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">User::query()\n    -&gt;select(&#91;<span class=\"hljs-string\">'id'<\/span>, <span class=\"hljs-string\">'name'<\/span>, <span class=\"hljs-string\">'email'<\/span>, <span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'created_at'<\/span>])\n    -&gt;paginate(<span class=\"hljs-number\">25<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Only return the fields required for the listing page.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 9: Export Should Not Load Huge Data in Browser<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For small export:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Export current filtered result directly <span class=\"hljs-keyword\">from<\/span> Laravel\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For large export:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Create background <span class=\"hljs-keyword\">export<\/span> job\nGenerate CSV\/Excel\nStore file\nShow download link\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good pattern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">User clicks Export\n    \u2193\nLaravel creates <span class=\"hljs-keyword\">export<\/span> job\n    \u2193\nQueue worker generates file\n    \u2193\nUser downloads file\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Node.js can also handle heavy export jobs, but Laravel queues are enough for most applications.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 10: Bulk Action Best Practice<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Do not send full records.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"records\"<\/span>: &#91;\n    {<span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Rajesh\"<\/span>},\n    {<span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Amit\"<\/span>}\n  ]\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"ids\"<\/span>: &#91;<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>],\n  <span class=\"hljs-attr\">\"action\"<\/span>: <span class=\"hljs-string\">\"activate\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For \u201cselect all matching filters\u201d:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"select_all_matching\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n  <span class=\"hljs-attr\">\"filters\"<\/span>: {\n    <span class=\"hljs-attr\">\"status\"<\/span>: <span class=\"hljs-string\">\"pending\"<\/span>,\n    <span class=\"hljs-attr\">\"search\"<\/span>: <span class=\"hljs-string\">\"doctor\"<\/span>\n  },\n  <span class=\"hljs-attr\">\"action\"<\/span>: <span class=\"hljs-string\">\"approve\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Where Node.js Fits<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Since you are also using Node.js, use it only where it adds value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use Node.js for:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Realtime notifications\nWebSocket updates\nHeavy <span class=\"hljs-keyword\">export<\/span> workers\nExternal API sync\nBackground processing\nActivity stream\nSearch microservice\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not use Node.js just to duplicate Laravel listing APIs. That creates unnecessary complexity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Best approach:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Laravel = primary listing backend\nNode.js = optional <span class=\"hljs-keyword\">async<\/span>\/realtime services\nAlpine.js = frontend interaction\nTailwind CSS = UI design\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Best Implementation Strategy for Entire Application<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Phase 1: Create Common Foundation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Build these once:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">ListingRequest\nListingQuery service\nListing Blade components\nStatusBadge component\nPagination component\nSearch\/filter toolbar\nBulk action component\n<span class=\"hljs-keyword\">Empty<\/span>\/loading\/error states\nConfirmation modal\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Phase 2: Define Standard Per Module<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For every module, define only this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&#91;\n    <span class=\"hljs-string\">'title'<\/span> =&gt; <span class=\"hljs-string\">'Users'<\/span>,\n    <span class=\"hljs-string\">'searchable'<\/span> =&gt; &#91;<span class=\"hljs-string\">'name'<\/span>, <span class=\"hljs-string\">'email'<\/span>, <span class=\"hljs-string\">'phone'<\/span>],\n    <span class=\"hljs-string\">'filterable'<\/span> =&gt; &#91;\n        <span class=\"hljs-string\">'status'<\/span> =&gt; <span class=\"hljs-string\">'status'<\/span>,\n        <span class=\"hljs-string\">'role'<\/span> =&gt; <span class=\"hljs-string\">'role'<\/span>,\n    ],\n    <span class=\"hljs-string\">'sortable'<\/span> =&gt; &#91;<span class=\"hljs-string\">'name'<\/span>, <span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'created_at'<\/span>],\n    <span class=\"hljs-string\">'columns'<\/span> =&gt; &#91;<span class=\"hljs-string\">'name'<\/span>, <span class=\"hljs-string\">'email'<\/span>, <span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'created_at'<\/span>],\n    <span class=\"hljs-string\">'actions'<\/span> =&gt; &#91;<span class=\"hljs-string\">'view'<\/span>, <span class=\"hljs-string\">'edit'<\/span>, <span class=\"hljs-string\">'delete'<\/span>],\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Phase 3: Apply to Every Listing Page<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Convert pages one by one:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Users\nHospitals\nDoctors\nProducts\nOrders\nBookings\nBlogs\nTasks\nPayments\nReports\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Phase 4: Optimize Database<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For every listing table, add indexes for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Search fields\nFilter fields\nSort fields\nForeign keys\nCreated date\nStatus\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Mandatory Performance Rules<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as your internal rule:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-number\">1.<\/span> All listing pages must <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">server<\/span>-<span class=\"hljs-title\">side<\/span> <span class=\"hljs-title\">pagination<\/span>.\n2. <span class=\"hljs-title\">All<\/span> <span class=\"hljs-title\">search<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">handled<\/span> <span class=\"hljs-title\">by<\/span> <span class=\"hljs-title\">backend<\/span>\/<span class=\"hljs-title\">database<\/span>.\n3. <span class=\"hljs-title\">All<\/span> <span class=\"hljs-title\">filters<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">handled<\/span> <span class=\"hljs-title\">by<\/span> <span class=\"hljs-title\">backend<\/span>\/<span class=\"hljs-title\">database<\/span>.\n4. <span class=\"hljs-title\">All<\/span> <span class=\"hljs-title\">sorting<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">handled<\/span> <span class=\"hljs-title\">by<\/span> <span class=\"hljs-title\">backend<\/span>\/<span class=\"hljs-title\">database<\/span>.\n5. <span class=\"hljs-title\">Frontend<\/span> <span class=\"hljs-title\">should<\/span> <span class=\"hljs-title\">never<\/span> <span class=\"hljs-title\">load<\/span> <span class=\"hljs-title\">all<\/span> <span class=\"hljs-title\">records<\/span>.\n6. <span class=\"hljs-title\">Search<\/span> <span class=\"hljs-title\">input<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">debounced<\/span> <span class=\"hljs-title\">by<\/span> 300\u2013500<span class=\"hljs-title\">ms<\/span>.\n7. <span class=\"hljs-title\">Only<\/span> <span class=\"hljs-title\">whitelisted<\/span> <span class=\"hljs-title\">fields<\/span> <span class=\"hljs-title\">can<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">sorted<\/span> <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">filtered<\/span>.\n8. <span class=\"hljs-title\">Only<\/span> <span class=\"hljs-title\">required<\/span> <span class=\"hljs-title\">columns<\/span> <span class=\"hljs-title\">should<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">selected<\/span>.\n9. <span class=\"hljs-title\">Database<\/span> <span class=\"hljs-title\">indexes<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">exist<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">common<\/span> <span class=\"hljs-title\">filters<\/span>\/<span class=\"hljs-title\">sorts<\/span>.\n10. <span class=\"hljs-title\">Large<\/span> <span class=\"hljs-title\">exports<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">run<\/span> <span class=\"hljs-title\">in<\/span> <span class=\"hljs-title\">background<\/span> <span class=\"hljs-title\">jobs<\/span>.\n11. <span class=\"hljs-title\">Permission<\/span> <span class=\"hljs-title\">checks<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">exist<\/span> <span class=\"hljs-title\">on<\/span> <span class=\"hljs-title\">frontend<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">backend<\/span>.\n12. <span class=\"hljs-title\">URL<\/span> <span class=\"hljs-title\">query<\/span> <span class=\"hljs-title\">parameters<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">store<\/span> <span class=\"hljs-title\">search<\/span>\/<span class=\"hljs-title\">filter<\/span>\/<span class=\"hljs-title\">sort<\/span>\/<span class=\"hljs-title\">page<\/span> <span class=\"hljs-title\">state<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Best Final Recommendation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For your application, implement this:<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Universal Laravel Listing Framework with Alpine.js and Tailwind CSS<\/strong><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Laravel ListingQuery service\nLaravel FormRequest validation\nReusable Blade listing components\nAlpine.js URL\/search\/filter interactivity\nTailwind CSS responsive UI\nLaravel queues or Node workers for heavy exports\nDatabase indexes for all listing fields\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This gives you:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Consistent UI\nFast performance\nReusable code\nEasy maintenance\nMobile-friendly pages\nSecure permissions\nScalable listing pages\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is the best and safest way to apply the same mandatory listing standard across your entire web application.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>for any listing page, these should be treated as mandatory standard options. Mandatory Options for Every Listing Page # Mandatory&#8230; <\/p>\n","protected":false},"author":1,"featured_media":2306,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"series":[],"class_list":["post-2305","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts\/2305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/comments?post=2305"}],"version-history":[{"count":1,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts\/2305\/revisions"}],"predecessor-version":[{"id":2307,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts\/2305\/revisions\/2307"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/media\/2306"}],"wp:attachment":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/media?parent=2305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/categories?post=2305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/tags?post=2305"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/series?post=2305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}