{"id":22669045,"url":"https://github.com/mariojgt/builder","last_synced_at":"2025-10-17T23:51:27.816Z","repository":{"id":41815773,"uuid":"484884456","full_name":"mariojgt/builder","owner":"mariojgt","description":"This package allows you to build any CRUD for Laravel in seconds, it comes with a hight end UI and easy-to-use classes.","archived":false,"fork":false,"pushed_at":"2025-06-12T11:57:17.000Z","size":279,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-12T12:46:22.500Z","etag":null,"topics":["crud","datatable","datatables-plugin","js","laravel","serverside","tailwind","vue"],"latest_commit_sha":null,"homepage":"","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mariojgt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-04-24T00:11:17.000Z","updated_at":"2025-06-12T11:57:00.000Z","dependencies_parsed_at":"2023-12-31T22:48:32.065Z","dependency_job_id":"58adeb71-2545-4c56-b6d5-0bab0a585292","html_url":"https://github.com/mariojgt/builder","commit_stats":{"total_commits":46,"total_committers":2,"mean_commits":23.0,"dds":0.06521739130434778,"last_synced_commit":"43f36374f35b671635d85107bbd8250db63ec9f8"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/mariojgt/builder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariojgt%2Fbuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariojgt%2Fbuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariojgt%2Fbuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariojgt%2Fbuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mariojgt","download_url":"https://codeload.github.com/mariojgt/builder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariojgt%2Fbuilder/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259708257,"owners_count":22899563,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crud","datatable","datatables-plugin","js","laravel","serverside","tailwind","vue"],"created_at":"2024-12-09T15:18:12.485Z","updated_at":"2025-10-17T23:51:27.808Z","avatar_url":"https://github.com/mariojgt.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Laravel Builder\n\nA powerful Laravel package that streamlines CRUD operations with a dynamic form builder and robust API integration. Build complex admin interfaces in minutes.\n\n## Features\n\n- **Dynamic Form Builder** with multiple field types\n- **Built-in Laravel API** integration with automatic relationship detection\n- **Advanced Conditional Styling** for dynamic visual feedback\n- **Row-Level Conditional Styling** for entire table rows\n- **Interactive Links** with customizable styling\n- **Advanced Filtering** with complex query operations (whereNotIn, whereBetween, etc.)\n- **Default Filters** applied automatically on table load\n- **Chained Relationships** with unlimited depth support\n- **Beautiful UI** with Tailwind \u0026 DaisyUI\n- **Responsive Design** with SPA experience\n\n## Installation\n\n```bash\ncomposer require mariojgt/builder\nphp artisan install::builder\n```\n\n## Quick Start\n\n### 1. Setup Routes\n\n```php\nuse Mariojgt\\Builder\\Controllers\\TableBuilderApiController;\n\nRoute::controller(TableBuilderApiController::class)-\u003egroup(function () {\n    Route::post('/admin/api/generic/table', 'index')-\u003ename('admin.api.generic.table');\n    Route::post('/admin/api/generic/table/create', 'store')-\u003ename('admin.api.generic.table.create');\n    Route::post('/admin/api/generic/table/update', 'update')-\u003ename('admin.api.generic.table.update');\n    Route::post('/admin/api/generic/table/delete', 'delete')-\u003ename('admin.api.generic.table.delete');\n});\n```\n\n### 2. Basic Controller with Advanced Filters\n\n```php\n\u003c?php\n\nnamespace App\\Controllers;\n\nuse Inertia\\Inertia;\nuse App\\Models\\Vulnerability;\nuse App\\Http\\Controllers\\Controller;\nuse Mariojgt\\Builder\\Enums\\FieldTypes;\nuse Mariojgt\\Builder\\Helpers\\FormHelper;\n\nclass VulnerabilityController extends Controller\n{\n    public function index()\n    {\n        $formConfig = (new FormHelper())\n            -\u003eaddIdField()\n            -\u003eaddField('Title', 'title', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n            -\u003eaddField('Status', 'status', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n            -\u003eaddField('CVSS Score', 'cvss_score', type: FieldTypes::NUMBER-\u003evalue, filterable: true)\n            -\u003eaddField('Platform', 'product.platform.name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n\n            // ✨ NEW: Advanced Filters (always applied)\n            -\u003ewithExcludeStatuses('status', ['unknown', 'unvalidated', 'incomplete', 'published', 'rejected', 'finished'])\n            -\u003ewithHighSeverityOnly('cvss_score', 4.0)      // Only show CVSS \u003e= 4.0\n            -\u003ewithRecentItems('created_at', 90)            // Only last 90 days\n\n            // ✨ NEW: Default Filters (user can change via UI)\n            -\u003ewithDefaultFilter('product.platform.name', 'WordPress')\n            -\u003ewithDefaultFilter('cvss_score', 4.8)\n\n            // Only items in active disclosure window\n            -\u003ewithBetweenFilter('disclosure_date',\n                now()-\u003esubDays(90)-\u003eformat('Y-m-d'),  // 90 days ago\n                now()-\u003eaddDays(30)-\u003eformat('Y-m-d')   // 30 days from now\n            )\n\n            // Critical items: disclosed in last 30 days or upcoming\n            -\u003ewithRelationshipFilter('critical_timeline', function ($query) {\n                $query-\u003ewhere(function ($criticalQuery) {\n                    $criticalQuery-\u003ewhere('cvssbase', '\u003e=', 9.0)\n                                -\u003ewhere('disclosure_date', '\u003e=', now()-\u003esubDays(30)-\u003eformat('Y-m-d'));\n                });\n            })\n\n            -\u003ewithDateRangeFilter('created_at', '2024-01-01', '2024-12-31')\n            -\u003ewithCreatedAtFilter('2024-06-01', '2024-12-31')\n\n            // ✨ Specific year filtering\n            -\u003ewithYear('created_at', 2024)             // Only 2024 items\n            -\u003ewithYear('disclosure_date', 2023)        // Only 2023 disclosures;\n\n            -\u003ewithConditionalStyling([\n                'active' =\u003e 'bg-green-500 text-white',\n                'inactive' =\u003e 'bg-red-500 text-white'\n            ])\n            -\u003esetEndpoints(\n                listEndpoint: route('admin.api.generic.table'),\n                deleteEndpoint: route('admin.api.generic.table.delete'),\n                createEndpoint: route('admin.api.generic.table.create'),\n                editEndpoint: route('admin.api.generic.table.update')\n            )\n            -\u003esetModel(Vulnerability::class)\n            -\u003ewithScope('notPublished') // if you have a scope in your model\n            -\u003ebuild();\n\n        return Inertia::render('Admin/Vulnerabilities/Index', [\n            'title' =\u003e 'Vulnerabilities',\n            'subheader' =\u003e 'Manage all vulnerabilities in the system',\n            ...$formConfig,\n        ]);\n    }\n}\n```\n\n### 3. Updated Vue Component\n\n```vue\n\u003ctemplate\u003e\n    \u003cAppLayout\u003e\n        \u003cTable\n            :columns=\"page.props.columns\"\n            :model=\"page.props.model\"\n            :endpoint=\"page.props.endpoint\"\n            :endpoint-delete=\"page.props.endpointDelete\"\n            :endpoint-create=\"page.props.endpointCreate\"\n            :endpoint-edit=\"page.props.endpointEdit\"\n            :table-title=\"page.props.title\"\n            :subheader=\"page.props.subheader\"\n            :permission=\"page.props.permission\"\n            :defaultIdKey=\"page.props.defaultIdKey\"\n            :custom_edit_route=\"page.props.custom_edit_route\"\n            :custom_edit_route_field=\"page.props.custom_edit_route_field\"\n            :custom_create_route=\"page.props.custom_create_route\"\n            :custom_point_route=\"page.props.custom_point_route\"\n            :custom_action_name=\"page.props.custom_action_name\"\n            :row-styling=\"page.props.rowStyling\"\n            :default-filters=\"page.props.defaultFilters\"\n            :advanced-filters=\"page.props.advancedFilters\"\n            :disableDelete=\"page.props.disableDelete\"\n            :modelScopes=\"page.props.modelScopes\"\n            :customLinks=\"page.props.customLinks\"\n            @tableDataLoaded=\"handleTableData\"\n        /\u003e\n    \u003c/AppLayout\u003e\n\u003c/template\u003e\n\n\u003cscript setup lang=\"ts\"\u003e\nimport AppLayout from '@components/Layout/AppLayout.vue';\nimport Table from '@builder/Table.vue';\n\nconst props = defineProps({\n    endpoint: { type: String, default: '' },\n    columns: { type: Object, default: () =\u003e ({}) },\n    model: { type: String, default: '' },\n    modelScopes: { type: Object, default: () =\u003e ({}) },\n    endpointDelete: { type: String, default: '' },\n    endpointCreate: { type: String, default: '' },\n    endpointEdit: { type: String, default: '' },\n    permission: { type: String, default: '' },\n    title: { type: String, default: '' },\n    subheader: { type: String, default: '' },\n    defaultIdKey: { type: String, default: '' },\n    custom_edit_route: { type: String, default: '' },\n    custom_point_route: { type: String, default: '' },\n    custom_action_name: { type: String, default: '' },\n    custom_create_route: { type: String, default: '' },\n    rowStyling: { type: Object, default: () =\u003e ({}) },\n    disableDelete: { type: Boolean, default: false }, // Disable delete action\n    defaultFilters: { type: Object, default: () =\u003e ({}) },  // Simple key-value filters\n    advancedFilters: { type: Array, default: () =\u003e [] },   // Complex query filters\n});\n\u003c/script\u003e\n```\n\n## 🚀 Advanced Filtering System\n\nThe new advanced filtering system provides powerful query capabilities that are automatically applied to your tables.\n\n### Simple Default Filters\n\nDefault filters are applied automatically but can be modified by users through the UI:\n\n```php\nreturn (new FormHelper())\n    -\u003eaddIdField()\n    -\u003eaddField('Title', 'title', filterable: true)\n    -\u003eaddField('Status', 'status', filterable: true)\n    -\u003eaddField('Platform', 'product.platform.name', filterable: true)\n\n    // ✨ Simple default filters (users can change these)\n    -\u003ewithDefaultFilter('status', 'active')\n    -\u003ewithPlatformFilter('WordPress')              // Helper method\n    -\u003ewithPublishedFilter(true)                   // Helper method\n    -\u003ewithPatchedFilter(false)                    // Helper method\n    -\u003ebuild();\n```\n\n### Advanced Query Filters\n\nAdvanced filters are part of the table configuration and are always applied:\n\n```php\nreturn (new FormHelper())\n    -\u003eaddIdField()\n    -\u003eaddField('Title', 'title', filterable: true)\n    -\u003eaddField('Status', 'status', filterable: true)\n    -\u003eaddField('CVSS Score', 'cvss_score', filterable: true)\n    -\u003eaddField('Created At', 'created_at', filterable: true)\n\n    // ✨ Advanced filters (always applied, users cannot change)\n\n    // whereNotIn - exclude specific statuses\n    -\u003ewithExcludeStatuses('status', ['unknown', 'unvalidated', 'incomplete', 'published', 'rejected', 'finished'])\n\n    // whereIn - include only specific values\n    -\u003ewithInFilter('status', ['active', 'pending', 'in_progress'])\n\n    // whereBetween - range filtering\n    -\u003ewithBetweenFilter('cvss_score', 4.0, 8.9)\n\n    // where with operators\n    -\u003ewithWhereFilter('cvss_score', '\u003e=', 7.0)\n    -\u003ewithWhereFilter('created_at', '\u003e', '2024-01-01')\n\n    // whereNull / whereNotNull\n    -\u003ewithNotNullFilter('cvss_score')             // Must have CVSS score\n    -\u003ewithNullFilter('patched_at')                // Only unpatched items\n\n    // Date-based filtering\n    -\u003ewithRecentItems('created_at', 30)           // Last 30 days\n    -\u003ewithYear('created_at', 2024)                // From 2024 only\n\n    -\u003ebuild();\n```\n\n### Advanced Filter Methods\n\n| Method | SQL Equivalent | Description |\n|--------|----------------|-------------|\n| `withNotInFilter($field, $values)` | `WHERE field NOT IN (...)` | Exclude specific values |\n| `withInFilter($field, $values)` | `WHERE field IN (...)` | Include only specific values |\n| `withBetweenFilter($field, $min, $max)` | `WHERE field BETWEEN min AND max` | Range filtering |\n| `withWhereFilter($field, $operator, $value)` | `WHERE field operator value` | Custom operators |\n| `withNullFilter($field)` | `WHERE field IS NULL` | Null values only |\n| `withNotNullFilter($field)` | `WHERE field IS NOT NULL` | Non-null values only |\n| `withLikeFilter($field, $value)` | `WHERE field LIKE '%value%'` | Pattern matching |\n| `withRecentItems($field, $days)` | `WHERE field \u003e= DATE_SUB(NOW(), INTERVAL days DAY)` | Recent items |\n| `withYear($field, $year)` | `WHERE YEAR(field) = year` | Year-based filtering |\n\n### Helper Methods for Common Patterns\n\n```php\n// Status filtering helpers\n-\u003ewithExcludeStatuses('status', ['finished', 'rejected'])\n-\u003ewithIncludeStatuses('status', ['active', 'pending'])\n\n// CVSS/Security helpers\n-\u003ewithHighSeverityOnly('cvss_score', 7.0)        // cvss_score \u003e= 7.0\n-\u003ewithCvssRange('cvss_score', 4.0, 6.9)         // Medium severity\n\n// Date helpers\n-\u003ewithRecentItems('created_at', 30)              // Last 30 days\n-\u003ewithCreatedAtFilter('2024-01-01', '2024-12-31') // Date range\n\n// Platform helpers\n-\u003ewithPlatformFilter('WordPress')                // product.platform.name = 'WordPress'\n-\u003ewithPublishedFilter(true)                      // published = true\n-\u003ewithPatchedFilter(false)                       // is_patched = false\n\n// Liker filters\n// ✨ WHERE title LIKE '%mario%'\n-\u003ewithLikeFilter('title', 'mario')\n// ✨ WHERE description LIKE '%sql injection%'\n-\u003ewithLikeFilter('description', 'sql injection')\n// ✨ WHERE author.name LIKE '%john%' (works with relationships!)\n-\u003ewithLikeFilter('author.name', 'john')\n```\n\n## 🔗 Chained Relationships\n\nBuilder automatically supports unlimited depth chained relationships:\n\n### Basic Chained Relationships\n\n```php\nreturn (new FormHelper())\n    -\u003eaddIdField()\n\n    // 2-level chain: vulnerability -\u003e product -\u003e name\n    -\u003eaddField('Product', 'product.name', filterable: true)\n\n    // 3-level chain: vulnerability -\u003e product -\u003e platform -\u003e name\n    -\u003eaddField('Platform', 'product.platform.name', filterable: true)\n\n    // 4-level chain: vulnerability -\u003e product -\u003e platform -\u003e company -\u003e name\n    -\u003eaddField('Company', 'product.platform.company.name', filterable: true)\n\n    // 5-level chain: vulnerability -\u003e researcher -\u003e user -\u003e profile -\u003e company -\u003e name\n    -\u003eaddField('Researcher Company', 'researcher.user.profile.company.name', filterable: true)\n\n    // Filter on chained relationships\n    -\u003ewithDefaultFilter('product.platform.name', 'WordPress')\n    -\u003ewithNotInFilter('product.platform.company.status', ['inactive', 'suspended'])\n    -\u003ewithWhereFilter('researcher.user.profile.reputation_score', '\u003e=', 80)\n\n    -\u003ebuild();\n```\n\n### Fallback Chained Relationships\n\n```php\nreturn (new FormHelper())\n    -\u003eaddIdField()\n\n    // Try multiple relationship paths (fallback with |)\n    -\u003eaddField('Contact Email',\n        'product.platform.company.security_email|product.platform.company.admin_email|product.platform.company.main_email',\n        filterable: true\n    )\n\n    // Complex fallback\n    -\u003eaddField('Version Info',\n        'product.versions.latest.detailed_info|product.versions.latest.simple_info|Unknown Version'\n    )\n\n    -\u003ebuild();\n```\n\n### Complex Relationship Filtering\n\n```php\nreturn (new FormHelper())\n    -\u003eaddIdField()\n    -\u003eaddField('Title', 'title')\n    -\u003eaddField('Company', 'product.platform.company.name')\n\n    // ✨ Complex relationship filtering with callbacks\n    -\u003ewithRelationshipFilter('product.platform.company.employees', function ($query) {\n        $query-\u003ewhere('role', 'security_engineer')\n              -\u003ewhere('years_experience', '\u003e=', 3)\n              -\u003ewhereHas('certifications', function ($certQuery) {\n                  $certQuery-\u003ewhereIn('name', ['CISSP', 'CEH', 'OSCP']);\n              });\n    })\n\n    // ✨ Multi-level relationship conditions\n    -\u003ewithRelationshipFilter('product.platform.category', function ($query) {\n        $query-\u003ewhere('is_security_critical', true)\n              -\u003ewhereHas('parent', function ($parentQuery) {\n                  $parentQuery-\u003ewhere('name', 'Web Applications')\n                            -\u003ewhere('risk_level', 'high');\n              });\n    })\n\n    -\u003ebuild();\n```\n\n## 🎯 Real-World Advanced Examples\n\n### Security Vulnerability Dashboard\n\n```php\npublic function vulnerabilityDashboard()\n{\n    $formConfig = (new FormHelper())\n        -\u003eaddIdField()\n        -\u003etab('Vulnerability Details')\n\n        // Basic fields with chained relationships\n        -\u003eaddField('Title', 'title', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('CVSS Score', 'cvss_score', type: FieldTypes::NUMBER-\u003evalue, filterable: true)\n        -\u003eaddField('Status', 'status', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Platform', 'product.platform.name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Company', 'product.platform.company.name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Researcher', 'reportedBy.researcher.user.name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Country', 'product.platform.company.headquarters.country', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Created At', 'created_at', type: FieldTypes::TIMESTAMP-\u003evalue, filterable: true)\n\n        // ✨ COMPREHENSIVE ADVANCED FILTERING\n\n        // Exclude non-actionable statuses (always applied)\n        -\u003ewithExcludeStatuses('status', [\n            'unknown', 'unvalidated', 'incomplete',\n            'published', 'rejected', 'finished', 'duplicate'\n        ])\n\n        // Only medium+ severity vulnerabilities\n        -\u003ewithHighSeverityOnly('cvss_score', 4.0)\n\n        // Only recent vulnerabilities (last 90 days)\n        -\u003ewithRecentItems('created_at', 90)\n\n        // Only from verified companies\n        -\u003ewithRelationshipFilter('product.platform.company', function ($query) {\n            $query-\u003ewhere('is_verified', true)\n                  -\u003ewhere('status', 'active')\n                  -\u003ewhereNotNull('security_contact_email');\n        })\n\n        // Only from specific countries\n        -\u003ewithInFilter('product.platform.company.headquarters.country', [\n            'US', 'CA', 'GB', 'DE', 'FR', 'AU'\n        ])\n\n        // Exclude certain platforms\n        -\u003ewithNotInFilter('product.platform.name', ['Unknown', 'Legacy', 'Deprecated'])\n\n        // Only high-reputation researchers\n        -\u003ewithWhereFilter('reportedBy.researcher.reputation_score', '\u003e=', 75)\n\n        // ✨ DEFAULT FILTERS (users can change these)\n        -\u003ewithDefaultFilter('product.platform.name', 'WordPress')  // Default to WordPress\n        -\u003ewithDefaultFilter('status', 'pending')                   // Default to pending status\n\n        // ✨ CONDITIONAL STYLING\n        -\u003ewithConditionalStyling([\n            'critical' =\u003e 'bg-red-600 text-white border-red-700 animate-pulse',\n            'pending' =\u003e 'bg-yellow-500 text-black border-yellow-600',\n            'active' =\u003e 'bg-blue-500 text-white border-blue-600'\n        ])\n\n        // ✨ ROW-LEVEL STYLING\n        -\u003ewithAdvancedRowStyling([\n            [\n                'field' =\u003e 'cvss_score',\n                'operator' =\u003e 'greater_than_equal',\n                'value' =\u003e 9.0,\n                'classes' =\u003e 'bg-red-50 border-red-300 border-l-4 shadow-lg'\n            ],\n            [\n                'field' =\u003e 'status',\n                'operator' =\u003e 'equals',\n                'value' =\u003e 'critical',\n                'classes' =\u003e 'bg-red-100 border-red-400 animate-pulse'\n            ]\n        ], 'bg-white hover:bg-gray-50')\n\n        -\u003esetEndpointsFromRoutes('admin.vulnerabilities')\n        -\u003esetModel(Vulnerability::class)\n        -\u003esetPermissions('admin')\n        -\u003ebuild();\n\n    return Inertia::render('Admin/Vulnerabilities/Dashboard', [\n        'tableConfig' =\u003e $formConfig\n    ]);\n}\n```\n\n### User Management with Complex Filters\n\n```php\npublic function userManagement()\n{\n    $formConfig = (new FormHelper())\n        -\u003eaddIdField()\n        -\u003eaddField('Name', 'name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Email', 'email', type: FieldTypes::EMAIL-\u003evalue, filterable: true)\n        -\u003eaddField('Department', 'profile.department.name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Manager', 'profile.manager.user.name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Company', 'profile.company.name', type: FieldTypes::TEXT-\u003evalue, filterable: true)\n        -\u003eaddField('Last Login', 'last_login_at', type: FieldTypes::TIMESTAMP-\u003evalue, filterable: true)\n\n        // ✨ Advanced user filtering\n        -\u003ewithNotNullFilter('email_verified_at')           // Only verified users\n        -\u003ewithWhereFilter('profile.status', '!=', 'suspended')  // No suspended users\n        -\u003ewithRecentItems('last_login_at', 30)             // Active in last 30 days\n\n        // Department-based filtering\n        -\u003ewithNotInFilter('profile.department.name', ['Temp', 'Contractor', 'Intern'])\n\n        // Company requirements\n        -\u003ewithRelationshipFilter('profile.company', function ($query) {\n            $query-\u003ewhere('is_active', true)\n                  -\u003ewhere('employee_count', '\u003e=', 10)\n                  -\u003ewhereHas('subscriptions', function ($subQuery) {\n                      $subQuery-\u003ewhere('status', 'active')\n                             -\u003ewhere('plan', '!=', 'trial');\n                  });\n        })\n\n        // Single\n        -\u003ewithAdvancedFilter('id', 'orderBy', null, ['direction' =\u003e 'desc'])\n\n        // ✅ Multiple sorts:\n        -\u003ewithAdvancedFilter('multi_sort', 'orderByMultiple', [\n            ['column' =\u003e 'patch_priority', 'direction' =\u003e 'desc'],\n            ['column' =\u003e 'cvssbase', 'direction' =\u003e 'desc'],\n            ['column' =\u003e 'id', 'direction' =\u003e 'desc']\n        ])\n\n        // Default filters\n        -\u003ewithDefaultFilter('profile.department.name', 'Engineering')\n\n        -\u003esetEndpointsFromRoutes('admin.users')\n        -\u003esetModel(User::class)\n        -\u003ebuild();\n\n    return Inertia::render('Admin/Users/Index', [\n        'tableConfig' =\u003e $formConfig\n    ]);\n}\n```\n\n## 🔧 Filter Processing Order\n\nThe system processes filters in this order:\n\n1. **Advanced Filters** (from FormHelper configuration - always applied)\n2. **Default Filters** (from FormHelper configuration - user can modify)\n3. **User Filters** (applied by users through the UI)\n4. **Search** (global search across columns)\n5. **Sorting** (column sorting)\n\nThis ensures that your advanced filters are always active while still allowing users to add their own filters.\n\n## 🎨 Conditional Styling\n\nApply dynamic styling based on field values for instant visual feedback.\n\n### Simple Conditional Styling\n\n```php\n-\u003eaddField('Status', 'status', type: FieldTypes::TEXT-\u003evalue)\n-\u003ewithConditionalStyling([\n    'active' =\u003e 'bg-green-500 text-white border-green-600',\n    'inactive' =\u003e 'bg-red-500 text-white border-red-600',\n    'pending' =\u003e 'bg-yellow-500 text-black border-yellow-600'\n], 'bg-gray-200 text-gray-800') // Default style\n```\n\n### Advanced Conditional Styling\n\n```php\n-\u003eaddField('CVSS Score', 'cvss_score', type: FieldTypes::NUMBER-\u003evalue)\n-\u003ewithAdvancedStyling([\n    ['operator' =\u003e 'between', 'min' =\u003e 9.0, 'max' =\u003e 10.0, 'classes' =\u003e 'bg-red-600 text-white font-bold animate-pulse'],\n    ['operator' =\u003e 'between', 'min' =\u003e 7.0, 'max' =\u003e 8.9, 'classes' =\u003e 'bg-red-500 text-white'],\n    ['operator' =\u003e 'between', 'min' =\u003e 4.0, 'max' =\u003e 6.9, 'classes' =\u003e 'bg-orange-500 text-white'],\n    ['operator' =\u003e 'less_than', 'value' =\u003e 4.0, 'classes' =\u003e 'bg-green-500 text-white']\n])\n\nor\n\n-\u003eaddField('CVSS Score', 'cvss_score', type: FieldTypes::NUMBER-\u003evalue)\n-\u003ewithAdvancedStyling([\n    [\n        'operator' =\u003e 'greater_than_equal',\n        'value' =\u003e 9.0,\n        'classes' =\u003e 'bg-red-600 text-white font-bold',\n        'icon' =\u003e 'skull',\n        'tooltip' =\u003e 'Critical Risk (9.0-10.0) - Exploit likely causes significant impact'\n    ],\n    [\n        'operator' =\u003e 'between',\n        'min' =\u003e 7.0,\n        'max' =\u003e 8.9,\n        'classes' =\u003e 'bg-red-500 text-white',\n        'icon' =\u003e 'flame',\n        'tooltip' =\u003e 'High Risk (7.0-8.9) - Exploitation more difficult but serious impact'\n    ],\n    [\n        'operator' =\u003e 'between',\n        'min' =\u003e 4.0,\n        'max' =\u003e 6.9,\n        'classes' =\u003e 'bg-yellow-500 text-white',\n        'icon' =\u003e 'alerttriangle',\n        'tooltip' =\u003e 'Medium Risk (4.0-6.9) - Moderate impact, monitor for patches'\n    ],\n    [\n        'operator' =\u003e 'between',\n        'min' =\u003e 0.1,\n        'max' =\u003e 3.9,\n        'classes' =\u003e 'bg-blue-500 text-white',\n        'icon' =\u003e 'info',\n        'tooltip' =\u003e 'Low Risk (0.1-3.9) - Minor impact, low priority'\n    ],\n    [\n        'operator' =\u003e 'less_than_equal',\n        'value' =\u003e 0.0,\n        'classes' =\u003e 'bg-gray-500 text-white',\n        'icon' =\u003e 'ampersand',\n        'tooltip' =\u003e 'No Score (0.0) - Not yet assessed or informational only'\n    ],\n])\n```\n\n### Preset Styling Methods\n\n```php\n// Built-in presets for common patterns\n-\u003ewithStatusStyling()      // Common status values\n-\u003ewithCVSSStyling()        // CVSS scoring (0-10 scale)\n-\u003ewithSeverityStyling()    // Severity levels\n-\u003ewithPercentageStyling()  // Percentage-based colors\n```\n\n## 🔗 Interactive Links\n\nAdd clickable links to any field with customizable styling.\n\n### Basic Links\n\n```php\n// Simple link\n-\u003eaddField('Component Name', 'reportedData.comp_name', type: FieldTypes::TEXT-\u003evalue)\n-\u003ewithLink('https://nvd.nist.gov/search?q={value}', true) // true = new tab\n\n// Link from another field\n-\u003eaddField('Component Name', 'reportedData.comp_name', type: FieldTypes::TEXT-\u003evalue)\n-\u003ewithLinkFromField('reportedData.comp_link', true)\n\n// Edit link\n-\u003eaddField('Actions', 'id', type: FieldTypes::TEXT-\u003evalue)\n-\u003ewithEditLink('/admin/edit')\n```\n\n## 📋 Field Types\n\nSupported field types:\n\n- `TEXT` - Text input\n- `EMAIL` - Email input\n- `PASSWORD` - Password input\n- `DATE` - Date picker\n- `TIMESTAMP` - Datetime picker\n- `SELECT` - Dropdown select\n- `BOOLEAN` - Toggle switch\n- `MEDIA` - Media upload\n- `EDITOR` - Rich text editor\n- `NUMBER` - Number input\n- `MODEL_SEARCH` - Model relationship search\n- `PIVOT_MODEL` - Many-to-many relationship\n- `CHIPS` - Tags/chips input\n- `ICON` - Icon selector\n\n## 🛠️ Node Dependencies\n\n```json\n{\n  \"@headlessui/vue\": \"^1.7.23\",\n  \"@inertiajs/vue3\": \"^2.0.3\",\n  \"@mariojgt/masterui\": \"^0.5.6\",\n  \"@mariojgt/wind-notify\": \"^1.0.3\",\n  \"lucide-vue-next\": \"^0.474.0\"\n}\n```\n\n## ⚙️ Vite Configuration\n\n```js\nimport { defineConfig } from 'vite';\nimport laravel from 'laravel-vite-plugin';\nimport vue from '@vitejs/plugin-vue';\nimport tailwindcss from '@tailwindcss/vite'\nimport path from 'path';\n\nexport default defineConfig({\n    resolve: {\n        alias: {\n            '@': path.resolve(__dirname, './resources'),\n            '@components': path.resolve(__dirname, './resources/js/components'),\n            '@builder': '/resources/vendor/Builder/Table',\n        },\n    },\n    plugins: [\n        tailwindcss(),\n        laravel({\n            input: ['resources/js/app.js', 'resources/css/app.css'],\n            refresh: true,\n        }),\n        vue(),\n    ],\n});\n```\n\n## 🔧 Troubleshooting\n\n### Advanced Filters Not Working\n- Ensure your model relationships are properly defined\n- Check that field names match exactly (case-sensitive)\n- Verify advanced filters are passed in the `tableConfig`\n\n### Chained Relationships Not Loading\n- Verify each level of the relationship chain exists\n- Check relationship names match your model methods exactly\n- Use Laravel Telescope to debug relationship queries\n\n### Performance with Complex Filters\n- Add proper database indexes for filtered fields\n- Use `select()` to limit loaded columns when possible\n- Consider eager loading for frequently accessed relationships\n\n## 🎯 Best Practices\n\n### Filter Strategy\n✅ **Use Advanced Filters for:**\n- Business logic that should always apply\n- Security restrictions\n- Data quality filters (exclude invalid records)\n- Performance optimizations (limit result sets)\n\n✅ **Use Default Filters for:**\n- Common user preferences\n- Sensible defaults that users might want to change\n- Quick-start configurations\n\n### Performance Tips\n1. Add database indexes for frequently filtered fields\n2. Use advanced filters to limit result sets early\n3. Avoid too many chained relationships in one query\n4. Use relationship callbacks for complex filtering\n5. Test with realistic data volumes\n\n## 📄 License\n\nMIT License - feel free to use in your projects!\n\n## 🌟 Support\n\nIf this package helped you, please give it a star on GitHub!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariojgt%2Fbuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmariojgt%2Fbuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariojgt%2Fbuilder/lists"}