[{"data":1,"prerenderedAt":1817},["ShallowReactive",2],{"navigation_docs":3,"-essentials-extending":95,"-essentials-extending-surround":1812},[4,25,70],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-rocket",{"title":21,"path":22,"stem":23,"icon":24},"Upgrade Guide","\u002Fgetting-started\u002Fupgrade-guide","1.getting-started\u002F3.upgrade-guide","i-lucide-arrow-up-right",{"title":26,"path":27,"stem":28,"children":29,"page":6},"Essentials","\u002Fessentials","2.essentials",[30,35,40,45,50,55,60,65],{"title":31,"path":32,"stem":33,"icon":34},"Configuration","\u002Fessentials\u002Fconfiguration","2.essentials\u002F1.configuration","i-lucide-settings",{"title":36,"path":37,"stem":38,"icon":39},"Authorization","\u002Fessentials\u002Fauthorization","2.essentials\u002F2.authorization","i-lucide-lock",{"title":41,"path":42,"stem":43,"icon":44},"Field Types","\u002Fessentials\u002Ffield-types","2.essentials\u002F3.field-types","i-lucide-shapes",{"title":46,"path":47,"stem":48,"icon":49},"Preset Custom Fields","\u002Fessentials\u002Fpreset-custom-fields","2.essentials\u002F4.preset-custom-fields","i-lucide-eye",{"title":51,"path":52,"stem":53,"icon":54},"Import\u002FExport","\u002Fessentials\u002Fimport-export","2.essentials\u002F5.import-export","i-lucide-file-output",{"title":56,"path":57,"stem":58,"icon":59},"Data Model","\u002Fessentials\u002Fdata-model","2.essentials\u002F6.data-model","i-lucide-database",{"title":61,"path":62,"stem":63,"icon":64},"Builder Scoping","\u002Fessentials\u002Fbuilder-scoping","2.essentials\u002F7.builder-scoping","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Extending","\u002Fessentials\u002Fextending","2.essentials\u002F8.extending","i-lucide-plug",{"title":71,"path":72,"stem":73,"children":74,"page":6},"Community","\u002Fcommunity","3.community",[75,80,85,90],{"title":76,"path":77,"stem":78,"icon":79},"Support","\u002Fcommunity\u002Fsupport","3.community\u002F1.support","i-lucide-life-buoy",{"title":81,"path":82,"stem":83,"icon":84},"Contributing","\u002Fcommunity\u002Fcontributing","3.community\u002F2.contributing","i-lucide-handshake",{"title":86,"path":87,"stem":88,"icon":89},"License","\u002Fcommunity\u002Flicense","3.community\u002F3.license","i-lucide-scale",{"title":91,"path":92,"stem":93,"icon":94},"Code Distribution","\u002Fcommunity\u002Fcode-distribution","3.community\u002F4.code-distribution","i-lucide-git-branch",{"id":96,"title":66,"body":97,"description":1805,"extension":1806,"links":1807,"meta":1808,"navigation":1809,"path":67,"seo":1810,"stem":68,"__hash__":1811},"docs\u002F2.essentials\u002F8.extending.md",{"type":98,"value":99,"toc":1798},"minimark",[100,105,118,121,465,468,707,714,924,941,944,955,1116,1122,1128,1139,1142,1145,1148,1176,1179,1341,1344,1349,1375,1378,1381,1384,1388,1397,1639,1653,1660,1664,1673,1747,1777,1780,1783,1794],[101,102,104],"h2",{"id":103},"resolution-filters","Resolution filters",[106,107,108,109,113,114,117],"p",{},"The Table, Infolist, and Exporter builders expose ",[110,111,112],"code",{},"filterFieldsUsing()"," and\n",[110,115,116],{},"filterSectionsUsing()",". Each callback receives a collection and the concrete builder.\nIt must return a collection containing selected existing models.",[106,119,120],{},"Configure one builder directly when the rule belongs to one use:",[122,123,128],"pre",{"className":124,"code":125,"language":126,"meta":127,"style":127},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Illuminate\\Support\\Collection;\nuse Relaticle\\CustomFields\\Facades\\CustomFields;\nuse Relaticle\\CustomFields\\Filament\\Integration\\Builders\\TableBuilder;\nuse Relaticle\\CustomFields\\Models\\CustomField;\n\n$columns = CustomFields::table()\n    ->forModel($record)\n    ->filterFieldsUsing(\n        static fn (Collection $fields, TableBuilder $builder): Collection => $fields\n            ->reject(\n                static fn (CustomField $field): bool => in_array(\n                    'portal',\n                    $field->setting('hidden_in_panels', []),\n                    true,\n                )\n            )\n    )\n    ->columns();\n","php","",[110,129,130,157,181,214,237,244,270,288,299,345,356,385,401,430,436,442,448,454],{"__ignoreMap":127},[131,132,135,139,143,147,149,151,154],"span",{"class":133,"line":134},"line",1,[131,136,138],{"class":137},"sbssI","use",[131,140,142],{"class":141},"sTEyZ"," Illuminate",[131,144,146],{"class":145},"sMK4o","\\",[131,148,76],{"class":141},[131,150,146],{"class":145},[131,152,153],{"class":141},"Collection",[131,155,156],{"class":145},";\n",[131,158,160,162,165,167,170,172,175,177,179],{"class":133,"line":159},2,[131,161,138],{"class":137},[131,163,164],{"class":141}," Relaticle",[131,166,146],{"class":145},[131,168,169],{"class":141},"CustomFields",[131,171,146],{"class":145},[131,173,174],{"class":141},"Facades",[131,176,146],{"class":145},[131,178,169],{"class":141},[131,180,156],{"class":145},[131,182,184,186,188,190,192,194,197,199,202,204,207,209,212],{"class":133,"line":183},3,[131,185,138],{"class":137},[131,187,164],{"class":141},[131,189,146],{"class":145},[131,191,169],{"class":141},[131,193,146],{"class":145},[131,195,196],{"class":141},"Filament",[131,198,146],{"class":145},[131,200,201],{"class":141},"Integration",[131,203,146],{"class":145},[131,205,206],{"class":141},"Builders",[131,208,146],{"class":145},[131,210,211],{"class":141},"TableBuilder",[131,213,156],{"class":145},[131,215,217,219,221,223,225,227,230,232,235],{"class":133,"line":216},4,[131,218,138],{"class":137},[131,220,164],{"class":141},[131,222,146],{"class":145},[131,224,169],{"class":141},[131,226,146],{"class":145},[131,228,229],{"class":141},"Models",[131,231,146],{"class":145},[131,233,234],{"class":141},"CustomField",[131,236,156],{"class":145},[131,238,240],{"class":133,"line":239},5,[131,241,243],{"emptyLinePlaceholder":242},true,"\n",[131,245,247,250,253,256,260,263,267],{"class":133,"line":246},6,[131,248,249],{"class":145},"$",[131,251,252],{"class":141},"columns ",[131,254,255],{"class":145},"=",[131,257,259],{"class":258},"sBMFI"," CustomFields",[131,261,262],{"class":145},"::",[131,264,266],{"class":265},"s2Zo4","table",[131,268,269],{"class":145},"()\n",[131,271,273,276,279,282,285],{"class":133,"line":272},7,[131,274,275],{"class":145},"    ->",[131,277,278],{"class":265},"forModel",[131,280,281],{"class":145},"($",[131,283,284],{"class":141},"record",[131,286,287],{"class":145},")\n",[131,289,291,293,296],{"class":133,"line":290},8,[131,292,275],{"class":145},[131,294,295],{"class":265},"filterFieldsUsing",[131,297,298],{"class":145},"(\n",[131,300,302,306,309,312,314,317,320,323,326,328,331,334,337,340,342],{"class":133,"line":301},9,[131,303,305],{"class":304},"spNyl","        static",[131,307,308],{"class":304}," fn",[131,310,311],{"class":145}," (",[131,313,153],{"class":258},[131,315,316],{"class":145}," $",[131,318,319],{"class":141},"fields",[131,321,322],{"class":145},",",[131,324,325],{"class":258}," TableBuilder",[131,327,316],{"class":145},[131,329,330],{"class":141},"builder",[131,332,333],{"class":145},"):",[131,335,336],{"class":258}," Collection",[131,338,339],{"class":145}," =>",[131,341,316],{"class":145},[131,343,344],{"class":141},"fields\n",[131,346,348,351,354],{"class":133,"line":347},10,[131,349,350],{"class":145},"            ->",[131,352,353],{"class":265},"reject",[131,355,298],{"class":145},[131,357,359,362,364,366,368,370,373,375,378,380,383],{"class":133,"line":358},11,[131,360,361],{"class":304},"                static",[131,363,308],{"class":304},[131,365,311],{"class":145},[131,367,234],{"class":258},[131,369,316],{"class":145},[131,371,372],{"class":141},"field",[131,374,333],{"class":145},[131,376,377],{"class":137}," bool",[131,379,339],{"class":145},[131,381,382],{"class":265}," in_array",[131,384,298],{"class":145},[131,386,388,391,395,398],{"class":133,"line":387},12,[131,389,390],{"class":145},"                    '",[131,392,394],{"class":393},"sfazB","portal",[131,396,397],{"class":145},"'",[131,399,400],{"class":145},",\n",[131,402,404,407,409,412,415,418,420,423,425,427],{"class":133,"line":403},13,[131,405,406],{"class":145},"                    $",[131,408,372],{"class":141},[131,410,411],{"class":145},"->",[131,413,414],{"class":265},"setting",[131,416,417],{"class":145},"(",[131,419,397],{"class":145},[131,421,422],{"class":393},"hidden_in_panels",[131,424,397],{"class":145},[131,426,322],{"class":145},[131,428,429],{"class":145}," []),\n",[131,431,433],{"class":133,"line":432},14,[131,434,435],{"class":145},"                    true,\n",[131,437,439],{"class":133,"line":438},15,[131,440,441],{"class":145},"                )\n",[131,443,445],{"class":133,"line":444},16,[131,446,447],{"class":145},"            )\n",[131,449,451],{"class":133,"line":450},17,[131,452,453],{"class":145},"    )\n",[131,455,457,459,462],{"class":133,"line":456},18,[131,458,275],{"class":145},[131,460,461],{"class":265},"columns",[131,463,464],{"class":145},"();\n",[106,466,467],{},"Register application-wide defaults through Laravel's container in a service provider.\nTarget each concrete builder class that needs the rule:",[122,469,471],{"className":124,"code":470,"language":126,"meta":127,"style":127},"use Illuminate\\Support\\Collection;\nuse Relaticle\\CustomFields\\Filament\\Integration\\Builders\\ExporterBuilder;\nuse Relaticle\\CustomFields\\Models\\CustomField;\n\n$this->app->resolving(\n    ExporterBuilder::class,\n    static function (ExporterBuilder $builder): void {\n        $builder->filterFieldsUsing(\n            static fn (Collection $fields): Collection => $fields->reject(\n                static fn (CustomField $field): bool =>\n                    $field->setting('exclude_from_exports', false) === true\n            )\n        );\n    }\n);\n",[110,472,473,489,518,538,542,557,569,593,606,637,658,688,692,697,702],{"__ignoreMap":127},[131,474,475,477,479,481,483,485,487],{"class":133,"line":134},[131,476,138],{"class":137},[131,478,142],{"class":141},[131,480,146],{"class":145},[131,482,76],{"class":141},[131,484,146],{"class":145},[131,486,153],{"class":141},[131,488,156],{"class":145},[131,490,491,493,495,497,499,501,503,505,507,509,511,513,516],{"class":133,"line":159},[131,492,138],{"class":137},[131,494,164],{"class":141},[131,496,146],{"class":145},[131,498,169],{"class":141},[131,500,146],{"class":145},[131,502,196],{"class":141},[131,504,146],{"class":145},[131,506,201],{"class":141},[131,508,146],{"class":145},[131,510,206],{"class":141},[131,512,146],{"class":145},[131,514,515],{"class":141},"ExporterBuilder",[131,517,156],{"class":145},[131,519,520,522,524,526,528,530,532,534,536],{"class":133,"line":183},[131,521,138],{"class":137},[131,523,164],{"class":141},[131,525,146],{"class":145},[131,527,169],{"class":141},[131,529,146],{"class":145},[131,531,229],{"class":141},[131,533,146],{"class":145},[131,535,234],{"class":141},[131,537,156],{"class":145},[131,539,540],{"class":133,"line":216},[131,541,243],{"emptyLinePlaceholder":242},[131,543,544,547,550,552,555],{"class":133,"line":239},[131,545,546],{"class":145},"$this->",[131,548,549],{"class":141},"app",[131,551,411],{"class":145},[131,553,554],{"class":265},"resolving",[131,556,298],{"class":145},[131,558,559,562,564,567],{"class":133,"line":246},[131,560,561],{"class":258},"    ExporterBuilder",[131,563,262],{"class":145},[131,565,566],{"class":137},"class",[131,568,400],{"class":145},[131,570,571,574,577,579,581,583,585,587,590],{"class":133,"line":272},[131,572,573],{"class":304},"    static",[131,575,576],{"class":304}," function",[131,578,311],{"class":145},[131,580,515],{"class":258},[131,582,316],{"class":145},[131,584,330],{"class":141},[131,586,333],{"class":145},[131,588,589],{"class":137}," void",[131,591,592],{"class":145}," {\n",[131,594,595,598,600,602,604],{"class":133,"line":290},[131,596,597],{"class":145},"        $",[131,599,330],{"class":141},[131,601,411],{"class":145},[131,603,295],{"class":265},[131,605,298],{"class":145},[131,607,608,611,613,615,617,619,621,623,625,627,629,631,633,635],{"class":133,"line":301},[131,609,610],{"class":304},"            static",[131,612,308],{"class":304},[131,614,311],{"class":145},[131,616,153],{"class":258},[131,618,316],{"class":145},[131,620,319],{"class":141},[131,622,333],{"class":145},[131,624,336],{"class":258},[131,626,339],{"class":145},[131,628,316],{"class":145},[131,630,319],{"class":141},[131,632,411],{"class":145},[131,634,353],{"class":265},[131,636,298],{"class":145},[131,638,639,641,643,645,647,649,651,653,655],{"class":133,"line":347},[131,640,361],{"class":304},[131,642,308],{"class":304},[131,644,311],{"class":145},[131,646,234],{"class":258},[131,648,316],{"class":145},[131,650,372],{"class":141},[131,652,333],{"class":145},[131,654,377],{"class":137},[131,656,657],{"class":145}," =>\n",[131,659,660,662,664,666,668,670,672,675,677,679,682,685],{"class":133,"line":358},[131,661,406],{"class":145},[131,663,372],{"class":141},[131,665,411],{"class":145},[131,667,414],{"class":265},[131,669,417],{"class":145},[131,671,397],{"class":145},[131,673,674],{"class":393},"exclude_from_exports",[131,676,397],{"class":145},[131,678,322],{"class":145},[131,680,681],{"class":145}," false)",[131,683,684],{"class":145}," ===",[131,686,687],{"class":145}," true\n",[131,689,690],{"class":133,"line":387},[131,691,447],{"class":145},[131,693,694],{"class":133,"line":403},[131,695,696],{"class":145},"        );\n",[131,698,699],{"class":133,"line":432},[131,700,701],{"class":145},"    }\n",[131,703,704],{"class":133,"line":438},[131,705,706],{"class":145},");\n",[106,708,709,710,713],{},"Facade factories resolve fresh builders through the container. Container callbacks\nregister before ",[110,711,712],{},"forModel()"," binds a model. Evaluate model-specific decisions inside the\nfilter callback:",[122,715,717],{"className":124,"code":716,"language":126,"meta":127,"style":127},"use Relaticle\\CustomFields\\Filament\\Integration\\Builders\\InfolistBuilder;\n\n$infolist = CustomFields::infolist()\n    ->forModel($record)\n    ->filterFieldsUsing(\n        static fn (Collection $fields, InfolistBuilder $builder): Collection =>\n            $builder->getRecord()?->is_archived === true\n                ? $fields->reject(\n                    static fn (CustomField $field): bool => $field->code === 'current_status'\n                )\n                : $fields\n    )\n    ->build();\n",[110,718,719,748,752,770,782,790,819,842,857,898,902,911,915],{"__ignoreMap":127},[131,720,721,723,725,727,729,731,733,735,737,739,741,743,746],{"class":133,"line":134},[131,722,138],{"class":137},[131,724,164],{"class":141},[131,726,146],{"class":145},[131,728,169],{"class":141},[131,730,146],{"class":145},[131,732,196],{"class":141},[131,734,146],{"class":145},[131,736,201],{"class":141},[131,738,146],{"class":145},[131,740,206],{"class":141},[131,742,146],{"class":145},[131,744,745],{"class":141},"InfolistBuilder",[131,747,156],{"class":145},[131,749,750],{"class":133,"line":159},[131,751,243],{"emptyLinePlaceholder":242},[131,753,754,756,759,761,763,765,768],{"class":133,"line":183},[131,755,249],{"class":145},[131,757,758],{"class":141},"infolist ",[131,760,255],{"class":145},[131,762,259],{"class":258},[131,764,262],{"class":145},[131,766,767],{"class":265},"infolist",[131,769,269],{"class":145},[131,771,772,774,776,778,780],{"class":133,"line":216},[131,773,275],{"class":145},[131,775,278],{"class":265},[131,777,281],{"class":145},[131,779,284],{"class":141},[131,781,287],{"class":145},[131,783,784,786,788],{"class":133,"line":239},[131,785,275],{"class":145},[131,787,295],{"class":265},[131,789,298],{"class":145},[131,791,792,794,796,798,800,802,804,806,809,811,813,815,817],{"class":133,"line":246},[131,793,305],{"class":304},[131,795,308],{"class":304},[131,797,311],{"class":145},[131,799,153],{"class":258},[131,801,316],{"class":145},[131,803,319],{"class":141},[131,805,322],{"class":145},[131,807,808],{"class":258}," InfolistBuilder",[131,810,316],{"class":145},[131,812,330],{"class":141},[131,814,333],{"class":145},[131,816,336],{"class":258},[131,818,657],{"class":145},[131,820,821,824,826,828,831,834,837,840],{"class":133,"line":272},[131,822,823],{"class":145},"            $",[131,825,330],{"class":141},[131,827,411],{"class":145},[131,829,830],{"class":265},"getRecord",[131,832,833],{"class":145},"()?->",[131,835,836],{"class":141},"is_archived ",[131,838,839],{"class":145},"===",[131,841,687],{"class":145},[131,843,844,847,849,851,853,855],{"class":133,"line":290},[131,845,846],{"class":145},"                ?",[131,848,316],{"class":145},[131,850,319],{"class":141},[131,852,411],{"class":145},[131,854,353],{"class":265},[131,856,298],{"class":145},[131,858,859,862,864,866,868,870,872,874,876,878,880,882,884,887,889,892,895],{"class":133,"line":301},[131,860,861],{"class":304},"                    static",[131,863,308],{"class":304},[131,865,311],{"class":145},[131,867,234],{"class":258},[131,869,316],{"class":145},[131,871,372],{"class":141},[131,873,333],{"class":145},[131,875,377],{"class":137},[131,877,339],{"class":145},[131,879,316],{"class":145},[131,881,372],{"class":141},[131,883,411],{"class":145},[131,885,886],{"class":141},"code ",[131,888,839],{"class":145},[131,890,891],{"class":145}," '",[131,893,894],{"class":393},"current_status",[131,896,897],{"class":145},"'\n",[131,899,900],{"class":133,"line":347},[131,901,441],{"class":145},[131,903,904,907,909],{"class":133,"line":358},[131,905,906],{"class":145},"                :",[131,908,316],{"class":145},[131,910,344],{"class":141},[131,912,913],{"class":133,"line":387},[131,914,453],{"class":145},[131,916,917,919,922],{"class":133,"line":403},[131,918,275],{"class":145},[131,920,921],{"class":265},"build",[131,923,464],{"class":145},[106,925,926,929,930,933,934,937,938,940],{},[110,927,928],{},"getModel()"," returns the bound model class. It returns ",[110,931,932],{},"null"," before binding.\n",[110,935,936],{},"getRecord()"," returns the persisted model. It returns ",[110,939,932],{}," for a model class, an\nunsaved model, or an unbound builder.",[106,942,943],{},"Table and export schemas normally bind a model class. Keep row-specific display rules in\ntheir component renderers, where the current record exists.",[106,945,946,947,950,951,954],{},"Builders also use Laravel's ",[110,948,949],{},"Conditionable"," and ",[110,952,953],{},"Tappable"," traits. Their selected\nmetadata is a standard collection:",[122,956,958],{"className":124,"code":957,"language":126,"meta":127,"style":127},"use App\\Models\\Opportunity;\n\n$codes = CustomFields::table()\n    ->forModel(Opportunity::class)\n    ->when(\n        $hideInternal,\n        static fn (TableBuilder $builder): TableBuilder =>\n            $builder->except(['internal_margin'])\n    )\n    ->getFields()\n    ->pluck('code')\n    ->all();\n",[110,959,960,978,982,999,1015,1024,1033,1053,1077,1081,1090,1107],{"__ignoreMap":127},[131,961,962,964,967,969,971,973,976],{"class":133,"line":134},[131,963,138],{"class":137},[131,965,966],{"class":141}," App",[131,968,146],{"class":145},[131,970,229],{"class":141},[131,972,146],{"class":145},[131,974,975],{"class":141},"Opportunity",[131,977,156],{"class":145},[131,979,980],{"class":133,"line":159},[131,981,243],{"emptyLinePlaceholder":242},[131,983,984,986,989,991,993,995,997],{"class":133,"line":183},[131,985,249],{"class":145},[131,987,988],{"class":141},"codes ",[131,990,255],{"class":145},[131,992,259],{"class":258},[131,994,262],{"class":145},[131,996,266],{"class":265},[131,998,269],{"class":145},[131,1000,1001,1003,1005,1007,1009,1011,1013],{"class":133,"line":216},[131,1002,275],{"class":145},[131,1004,278],{"class":265},[131,1006,417],{"class":145},[131,1008,975],{"class":258},[131,1010,262],{"class":145},[131,1012,566],{"class":137},[131,1014,287],{"class":145},[131,1016,1017,1019,1022],{"class":133,"line":239},[131,1018,275],{"class":145},[131,1020,1021],{"class":265},"when",[131,1023,298],{"class":145},[131,1025,1026,1028,1031],{"class":133,"line":246},[131,1027,597],{"class":145},[131,1029,1030],{"class":141},"hideInternal",[131,1032,400],{"class":145},[131,1034,1035,1037,1039,1041,1043,1045,1047,1049,1051],{"class":133,"line":272},[131,1036,305],{"class":304},[131,1038,308],{"class":304},[131,1040,311],{"class":145},[131,1042,211],{"class":258},[131,1044,316],{"class":145},[131,1046,330],{"class":141},[131,1048,333],{"class":145},[131,1050,325],{"class":258},[131,1052,657],{"class":145},[131,1054,1055,1057,1059,1061,1064,1067,1069,1072,1074],{"class":133,"line":290},[131,1056,823],{"class":145},[131,1058,330],{"class":141},[131,1060,411],{"class":145},[131,1062,1063],{"class":265},"except",[131,1065,1066],{"class":145},"([",[131,1068,397],{"class":145},[131,1070,1071],{"class":393},"internal_margin",[131,1073,397],{"class":145},[131,1075,1076],{"class":145},"])\n",[131,1078,1079],{"class":133,"line":301},[131,1080,453],{"class":145},[131,1082,1083,1085,1088],{"class":133,"line":347},[131,1084,275],{"class":145},[131,1086,1087],{"class":265},"getFields",[131,1089,269],{"class":145},[131,1091,1092,1094,1097,1099,1101,1103,1105],{"class":133,"line":358},[131,1093,275],{"class":145},[131,1095,1096],{"class":265},"pluck",[131,1098,417],{"class":145},[131,1100,397],{"class":145},[131,1102,110],{"class":393},[131,1104,397],{"class":145},[131,1106,287],{"class":145},[131,1108,1109,1111,1114],{"class":133,"line":387},[131,1110,275],{"class":145},[131,1112,1113],{"class":265},"all",[131,1115,464],{"class":145},[106,1117,1118,1121],{},[110,1119,1120],{},"getFields()"," returns selected field metadata before component factories and\nrecord-specific conditional visibility. A returned field might not render for the\ncurrent record.",[106,1123,1124,1127],{},[110,1125,1126],{},"getSections()"," returns selected, nonempty sections with their selected fields. It\nreturns an empty collection when sections are disabled.",[106,1129,1130,1131,1134,1135,1138],{},"Field callbacks receive ",[110,1132,1133],{},"Collection\u003Cint, CustomField>",". Section callbacks receive\n",[110,1136,1137],{},"Collection\u003Cint, CustomFieldSection>",". Both receive the current concrete builder as\ntheir second argument.",[106,1140,1141],{},"Section callbacks run before field callbacks. Field callbacks receive fields from the\nsurviving sections. Empty sections are pruned. Field order within each section remains\nstable, while a section callback may reorder sections.",[106,1143,1144],{},"Callbacks run when metadata or components resolve. Deferred and cloned infolists carry\ntheir configured callbacks once, including container defaults and local callbacks.",[106,1146,1147],{},"Choose the API that matches the result you need:",[1149,1150,1151,1155,1162],"ul",{},[1152,1153,1154],"li",{},"Eloquent queries constrain rows in the database.",[1152,1156,1157,950,1159,1161],{},[110,1158,1120],{},[110,1160,1126],{}," return selected metadata.",[1152,1163,1164,1167,1168,1171,1172,1175],{},[110,1165,1166],{},"columns()",", ",[110,1169,1170],{},"values()",", and ",[110,1173,1174],{},"build()"," produce Filament components and apply visibility.",[106,1177,1178],{},"Filters select existing models. They must not rewrite metadata or enforce authorization.\nUse Eloquent queries when you need database constraints:",[122,1180,1182],{"className":124,"code":1181,"language":126,"meta":127,"style":127},"use App\\Models\\CustomField;\nuse App\\Models\\Opportunity;\n\n$fields = CustomField::query()\n    ->where('tenant_id', $team->getKey())\n    ->forMorphEntity(Opportunity::class)\n    ->visibleInList()\n    ->with('options')\n    ->orderBy('sort_order')\n    ->get();\n",[110,1183,1184,1200,1216,1220,1239,1270,1287,1296,1314,1332],{"__ignoreMap":127},[131,1185,1186,1188,1190,1192,1194,1196,1198],{"class":133,"line":134},[131,1187,138],{"class":137},[131,1189,966],{"class":141},[131,1191,146],{"class":145},[131,1193,229],{"class":141},[131,1195,146],{"class":145},[131,1197,234],{"class":141},[131,1199,156],{"class":145},[131,1201,1202,1204,1206,1208,1210,1212,1214],{"class":133,"line":159},[131,1203,138],{"class":137},[131,1205,966],{"class":141},[131,1207,146],{"class":145},[131,1209,229],{"class":141},[131,1211,146],{"class":145},[131,1213,975],{"class":141},[131,1215,156],{"class":145},[131,1217,1218],{"class":133,"line":183},[131,1219,243],{"emptyLinePlaceholder":242},[131,1221,1222,1224,1227,1229,1232,1234,1237],{"class":133,"line":216},[131,1223,249],{"class":145},[131,1225,1226],{"class":141},"fields ",[131,1228,255],{"class":145},[131,1230,1231],{"class":258}," CustomField",[131,1233,262],{"class":145},[131,1235,1236],{"class":265},"query",[131,1238,269],{"class":145},[131,1240,1241,1243,1246,1248,1250,1253,1255,1257,1259,1262,1264,1267],{"class":133,"line":239},[131,1242,275],{"class":145},[131,1244,1245],{"class":265},"where",[131,1247,417],{"class":145},[131,1249,397],{"class":145},[131,1251,1252],{"class":393},"tenant_id",[131,1254,397],{"class":145},[131,1256,322],{"class":145},[131,1258,316],{"class":145},[131,1260,1261],{"class":141},"team",[131,1263,411],{"class":145},[131,1265,1266],{"class":265},"getKey",[131,1268,1269],{"class":145},"())\n",[131,1271,1272,1274,1277,1279,1281,1283,1285],{"class":133,"line":246},[131,1273,275],{"class":145},[131,1275,1276],{"class":265},"forMorphEntity",[131,1278,417],{"class":145},[131,1280,975],{"class":258},[131,1282,262],{"class":145},[131,1284,566],{"class":137},[131,1286,287],{"class":145},[131,1288,1289,1291,1294],{"class":133,"line":272},[131,1290,275],{"class":145},[131,1292,1293],{"class":265},"visibleInList",[131,1295,269],{"class":145},[131,1297,1298,1300,1303,1305,1307,1310,1312],{"class":133,"line":290},[131,1299,275],{"class":145},[131,1301,1302],{"class":265},"with",[131,1304,417],{"class":145},[131,1306,397],{"class":145},[131,1308,1309],{"class":393},"options",[131,1311,397],{"class":145},[131,1313,287],{"class":145},[131,1315,1316,1318,1321,1323,1325,1328,1330],{"class":133,"line":301},[131,1317,275],{"class":145},[131,1319,1320],{"class":265},"orderBy",[131,1322,417],{"class":145},[131,1324,397],{"class":145},[131,1326,1327],{"class":393},"sort_order",[131,1329,397],{"class":145},[131,1331,287],{"class":145},[131,1333,1334,1336,1339],{"class":133,"line":347},[131,1335,275],{"class":145},[131,1337,1338],{"class":265},"get",[131,1340,464],{"class":145},[106,1342,1343],{},"Query your application's configured custom field model. Package builders also respect\nthat configured subclass when loading metadata.",[1345,1346,1348],"h3",{"id":1347},"which-builders-apply-filters","Which builders apply filters",[106,1350,1351,1352,1167,1356,950,1359,1362,1363,1366,1367,1370,1371,1374],{},"Filters apply to the ",[1353,1354,1355],"strong",{},"Table",[1353,1357,1358],{},"Infolist",[1353,1360,1361],{},"Exporter"," builders. They do not\napply to the ",[1353,1364,1365],{},"Form"," or the ",[1353,1368,1369],{},"Importer"," builder. ",[110,1372,1373],{},"UsesCustomFields::saveCustomFields()","\nclears any field absent from its payload, so a filtered form would erase hidden values\non save. Fixing that contract is a breaking change, tracked separately for a future\nmajor version.",[106,1376,1377],{},"Conditional visibility is unaffected by filtering: it's still evaluated against every\nfield for the entity type, so a field that a filter removes can still be the input of\nanother field's visibility condition.",[106,1379,1380],{},"When sections share a field code, infolist conditions use the field from their own section.\nFields with other codes remain available for conditions across sections.",[106,1382,1383],{},"Every facade call returns a fresh builder. Local callbacks belong only to that builder.\nContainer resolving callbacks apply to every resolved builder of the targeted class.\nDirect construction follows Laravel's normal behavior and bypasses container callbacks.",[101,1385,1387],{"id":1386},"fieldformextendschemausing","FieldForm::extendSchemaUsing()",[106,1389,1390,1392,1393,1396],{},[110,1391,1387],{}," lets a consumer append or modify components on the\nfield create\u002Fedit form, mirroring ",[110,1394,1395],{},"SectionForm::extendSchemaUsing()"," for sections:",[122,1398,1400],{"className":124,"code":1399,"language":126,"meta":127,"style":127},"use Filament\\Forms\\Components\\CheckboxList;\nuse Filament\\Schemas\\Components\\Component;\nuse Relaticle\\CustomFields\\Filament\\Management\\Schemas\\FieldForm;\nuse Relaticle\\CustomFields\\Models\\CustomFieldSection;\n\nFieldForm::extendSchemaUsing(function (array $schema, ?CustomFieldSection $section): array {\n    return [\n        ...$schema,\n        CheckboxList::make('settings.additional.hidden_in_panels')\n            ->label('Hide from')\n            ->options(['portal' => 'Portal']),\n    ];\n});\n",[110,1401,1402,1426,1448,1478,1499,1503,1546,1555,1564,1585,1603,1629,1634],{"__ignoreMap":127},[131,1403,1404,1406,1409,1411,1414,1416,1419,1421,1424],{"class":133,"line":134},[131,1405,138],{"class":137},[131,1407,1408],{"class":141}," Filament",[131,1410,146],{"class":145},[131,1412,1413],{"class":141},"Forms",[131,1415,146],{"class":145},[131,1417,1418],{"class":141},"Components",[131,1420,146],{"class":145},[131,1422,1423],{"class":141},"CheckboxList",[131,1425,156],{"class":145},[131,1427,1428,1430,1432,1434,1437,1439,1441,1443,1446],{"class":133,"line":159},[131,1429,138],{"class":137},[131,1431,1408],{"class":141},[131,1433,146],{"class":145},[131,1435,1436],{"class":141},"Schemas",[131,1438,146],{"class":145},[131,1440,1418],{"class":141},[131,1442,146],{"class":145},[131,1444,1445],{"class":141},"Component",[131,1447,156],{"class":145},[131,1449,1450,1452,1454,1456,1458,1460,1462,1464,1467,1469,1471,1473,1476],{"class":133,"line":183},[131,1451,138],{"class":137},[131,1453,164],{"class":141},[131,1455,146],{"class":145},[131,1457,169],{"class":141},[131,1459,146],{"class":145},[131,1461,196],{"class":141},[131,1463,146],{"class":145},[131,1465,1466],{"class":141},"Management",[131,1468,146],{"class":145},[131,1470,1436],{"class":141},[131,1472,146],{"class":145},[131,1474,1475],{"class":141},"FieldForm",[131,1477,156],{"class":145},[131,1479,1480,1482,1484,1486,1488,1490,1492,1494,1497],{"class":133,"line":216},[131,1481,138],{"class":137},[131,1483,164],{"class":141},[131,1485,146],{"class":145},[131,1487,169],{"class":141},[131,1489,146],{"class":145},[131,1491,229],{"class":141},[131,1493,146],{"class":145},[131,1495,1496],{"class":141},"CustomFieldSection",[131,1498,156],{"class":145},[131,1500,1501],{"class":133,"line":239},[131,1502,243],{"emptyLinePlaceholder":242},[131,1504,1505,1507,1509,1512,1514,1517,1519,1522,1524,1527,1529,1532,1534,1536,1539,1541,1544],{"class":133,"line":246},[131,1506,1475],{"class":258},[131,1508,262],{"class":145},[131,1510,1511],{"class":265},"extendSchemaUsing",[131,1513,417],{"class":145},[131,1515,1516],{"class":304},"function",[131,1518,311],{"class":145},[131,1520,1521],{"class":137},"array",[131,1523,316],{"class":145},[131,1525,1526],{"class":141},"schema",[131,1528,322],{"class":145},[131,1530,1531],{"class":145}," ?",[131,1533,1496],{"class":258},[131,1535,316],{"class":145},[131,1537,1538],{"class":141},"section",[131,1540,333],{"class":145},[131,1542,1543],{"class":137}," array",[131,1545,592],{"class":145},[131,1547,1548,1552],{"class":133,"line":272},[131,1549,1551],{"class":1550},"s7zQu","    return",[131,1553,1554],{"class":145}," [\n",[131,1556,1557,1560,1562],{"class":133,"line":290},[131,1558,1559],{"class":145},"        ...$",[131,1561,1526],{"class":141},[131,1563,400],{"class":145},[131,1565,1566,1569,1571,1574,1576,1578,1581,1583],{"class":133,"line":301},[131,1567,1568],{"class":258},"        CheckboxList",[131,1570,262],{"class":145},[131,1572,1573],{"class":265},"make",[131,1575,417],{"class":145},[131,1577,397],{"class":145},[131,1579,1580],{"class":393},"settings.additional.hidden_in_panels",[131,1582,397],{"class":145},[131,1584,287],{"class":145},[131,1586,1587,1589,1592,1594,1596,1599,1601],{"class":133,"line":347},[131,1588,350],{"class":145},[131,1590,1591],{"class":265},"label",[131,1593,417],{"class":145},[131,1595,397],{"class":145},[131,1597,1598],{"class":393},"Hide from",[131,1600,397],{"class":145},[131,1602,287],{"class":145},[131,1604,1605,1607,1609,1611,1613,1615,1617,1619,1621,1624,1626],{"class":133,"line":358},[131,1606,350],{"class":145},[131,1608,1309],{"class":265},[131,1610,1066],{"class":145},[131,1612,397],{"class":145},[131,1614,394],{"class":393},[131,1616,397],{"class":145},[131,1618,339],{"class":145},[131,1620,891],{"class":145},[131,1622,1623],{"class":393},"Portal",[131,1625,397],{"class":145},[131,1627,1628],{"class":145},"]),\n",[131,1630,1631],{"class":133,"line":387},[131,1632,1633],{"class":145},"    ];\n",[131,1635,1636],{"class":133,"line":403},[131,1637,1638],{"class":145},"});\n",[106,1640,1641,1642,1645,1646,1648,1649,1652],{},"The callback receives the current schema and the field's section: the create target, or\nthe edited field's section. It's null when the form is built without a section, such as\nin flat management mode with ",[110,1643,1644],{},"SYSTEM_SECTIONS"," disabled. This differs from\n",[110,1647,1395],{},", whose second argument is a ",[110,1650,1651],{},"string $entityType","\nrather than a section, because a field-level extension usually needs to look at its\nsection, while a section-level one is being defined for an entity type before any\nsection-specific state exists.",[106,1654,1655,1656,1659],{},"Register once, from a service provider. Extensions persist until\n",[110,1657,1658],{},"FieldForm::flushSchemaExtensions()"," is called, which is primarily useful in tests.",[101,1661,1663],{"id":1662},"setting-accessors","setting() accessors",[106,1665,1666,950,1669,1672],{},[110,1667,1668],{},"CustomField::setting()",[110,1670,1671],{},"CustomFieldSection::setting()"," read a consumer-defined key\nout of the model's settings bag, with a default when the key is absent:",[122,1674,1676],{"className":124,"code":1675,"language":126,"meta":127,"style":127},"$field->setting('hidden_in_panels', []);\n$section->setting('hidden_in_panels', []);\n$field->setting('display.compact', false);\n",[110,1677,1678,1701,1723],{"__ignoreMap":127},[131,1679,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":133,"line":134},[131,1681,249],{"class":145},[131,1683,372],{"class":141},[131,1685,411],{"class":145},[131,1687,414],{"class":265},[131,1689,417],{"class":145},[131,1691,397],{"class":145},[131,1693,422],{"class":393},[131,1695,397],{"class":145},[131,1697,322],{"class":145},[131,1699,1700],{"class":145}," []);\n",[131,1702,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721],{"class":133,"line":159},[131,1704,249],{"class":145},[131,1706,1538],{"class":141},[131,1708,411],{"class":145},[131,1710,414],{"class":265},[131,1712,417],{"class":145},[131,1714,397],{"class":145},[131,1716,422],{"class":393},[131,1718,397],{"class":145},[131,1720,322],{"class":145},[131,1722,1700],{"class":145},[131,1724,1725,1727,1729,1731,1733,1735,1737,1740,1742,1744],{"class":133,"line":183},[131,1726,249],{"class":145},[131,1728,372],{"class":141},[131,1730,411],{"class":145},[131,1732,414],{"class":265},[131,1734,417],{"class":145},[131,1736,397],{"class":145},[131,1738,1739],{"class":393},"display.compact",[131,1741,397],{"class":145},[131,1743,322],{"class":145},[131,1745,1746],{"class":145}," false);\n",[106,1748,1749,1751,1752,1755,1756,1758,1759,1762,1763,1765,1766,1768,1769,1772,1773,1776],{},[110,1750,1668],{}," reads from ",[110,1753,1754],{},"settings->additional","; ",[110,1757,1671],{},"\nreads from ",[110,1760,1761],{},"settings->extra",". These are the same bags that ",[110,1764,1387],{},"\nand ",[110,1767,1395],{}," write into via a ",[110,1770,1771],{},"settings.additional.*"," or\n",[110,1774,1775],{},"settings.extra.*"," statePath, so a filter callback and a schema extension are typically\nused together: the extension collects the setting, and the filter reads it back.",[106,1778,1779],{},"Both accessors support Laravel's dot notation and preserve explicitly stored nulls.",[106,1781,1782],{},"Saving an edit merges the submitted settings into the stored ones rather than replacing\nthem, so a key whose component the form did not render survives. The merge recurses into\nassociative arrays and replaces everything else, which means a submitted empty list or a\nsubmitted null still clears the value it targets, but a key nested inside an associative\nsetting can only be removed by code, not by leaving it out of a submission.",[106,1784,1785,1786,1789,1790,1793],{},"See ",[1787,1788,61],"a",{"href":62}," for ",[110,1791,1792],{},"onlySections()",", which narrows\nresolution a different way, by section identity rather than by an arbitrary predicate.",[1795,1796,1797],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":127,"searchDepth":159,"depth":159,"links":1799},[1800,1803,1804],{"id":103,"depth":159,"text":104,"children":1801},[1802],{"id":1347,"depth":183,"text":1348},{"id":1386,"depth":159,"text":1387},{"id":1662,"depth":159,"text":1663},"Filter which fields and sections a builder resolves, and extend the field form's schema","md",null,{},{"icon":69},{"title":66,"description":1805},"7IDGe5WqQ0HqohaUG-GKa3qhrb4vkdHuXKxjinXKq9s",[1813,1815],{"title":61,"path":62,"stem":63,"description":1814,"icon":64,"children":-1},"Scope custom-field resolution to specific sections, and hook into code-uniqueness resolution",{"title":76,"path":77,"stem":78,"description":1816,"icon":79,"children":-1},"Get help with Custom Fields",1792580724027]