[{"data":1,"prerenderedAt":1275},["ShallowReactive",2],{"navigation_docs":3,"-essentials-filament-ui":111,"-essentials-filament-ui-surround":1270},[4,20,30,66,82,89,96],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15],{"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},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F2.quick-start","i-lucide-rocket",{"title":21,"icon":22,"path":23,"stem":24,"children":25,"page":6},"Concepts","i-lucide-compass","\u002Fconcepts","2.concepts",[26],{"title":27,"path":28,"stem":29,"icon":22},"How it works","\u002Fconcepts\u002Fhow-it-works","2.concepts\u002F1.how-it-works",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":6},"Essentials","i-lucide-book-open","\u002Fessentials","3.essentials",[36,41,46,51,56,61],{"title":37,"path":38,"stem":39,"icon":40},"Sources","\u002Fessentials\u002Fsources","3.essentials\u002F1.sources","i-lucide-layers",{"title":42,"path":43,"stem":44,"icon":45},"Filament UI","\u002Fessentials\u002Ffilament-ui","3.essentials\u002F2.filament-ui","i-lucide-layout-dashboard",{"title":47,"path":48,"stem":49,"icon":50},"Refining the timeline","\u002Fessentials\u002Frefining-the-timeline","3.essentials\u002F3.refining-the-timeline","i-lucide-filter",{"title":52,"path":53,"stem":54,"icon":55},"Customization","\u002Fessentials\u002Fcustomization","3.essentials\u002F4.customization","i-lucide-paintbrush",{"title":57,"path":58,"stem":59,"icon":60},"Caching","\u002Fessentials\u002Fcaching","3.essentials\u002F5.caching","i-lucide-database",{"title":62,"path":63,"stem":64,"icon":65},"Configuration","\u002Fessentials\u002Fconfiguration","3.essentials\u002F6.configuration","i-lucide-settings",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":6},"Recipes","i-lucide-chef-hat","\u002Frecipes","4.recipes",[72,77],{"title":73,"path":74,"stem":75,"icon":76},"CRM person feed","\u002Frecipes\u002Fcrm-person-feed","4.recipes\u002F1.crm-person-feed","i-lucide-users",{"title":78,"path":79,"stem":80,"icon":81},"Audit log for admins","\u002Frecipes\u002Faudit-log-for-admins","4.recipes\u002F2.audit-log-for-admins","i-lucide-shield",{"title":83,"path":84,"stem":85,"children":86,"icon":88},"Testing","\u002Ftesting","5.testing\u002F1.index",[87],{"title":83,"path":84,"stem":85,"icon":88},"i-lucide-flask-conical",{"title":90,"path":91,"stem":92,"children":93,"icon":95},"Troubleshooting","\u002Ftroubleshooting","6.troubleshooting\u002F1.index",[94],{"title":90,"path":91,"stem":92,"icon":95},"i-lucide-life-buoy",{"title":97,"path":98,"stem":99,"children":100,"page":6},"Community","\u002Fcommunity","7.community",[101,106],{"title":102,"path":103,"stem":104,"icon":105},"Contributing","\u002Fcommunity\u002Fcontributing","7.community\u002F1.contributing","i-lucide-heart-handshake",{"title":107,"path":108,"stem":109,"icon":110},"License","\u002Fcommunity\u002Flicense","7.community\u002F2.license","i-lucide-scale",{"id":112,"title":42,"body":113,"description":1261,"extension":1262,"links":1263,"meta":1264,"navigation":1265,"path":43,"seo":1266,"stem":44,"__hash__":1269},"docs\u002F3.essentials\u002F2.filament-ui.md",{"type":114,"value":115,"toc":1248},"minimark",[116,125,130,236,253,257,263,412,417,525,543,557,561,571,663,672,676,683,784,807,811,820,897,901,917,923,976,992,1022,1026,1035,1157,1160,1168,1175,1200,1213,1239,1244],[117,118,119,120,124],"p",{},"The package ships three Filament surfaces — an infolist component, a relation manager, and a header action. All three mount the same ",[121,122,123],"code",{},"Relaticle\\ActivityLog\\Filament\\Livewire\\ActivityLogLivewire"," component under the hood, but each exposes a different override mechanism and ships with different defaults. This page covers every knob, plus the URL-bound filter UI that the Livewire component renders for free.",[126,127,129],"h2",{"id":128},"defaults-at-a-glance","Defaults at a glance",[131,132,133,158],"table",{},[134,135,136],"thead",{},[137,138,139,143,148,153],"tr",{},[140,141,142],"th",{},"Surface",[140,144,145],{},[121,146,147],{},"groupByDate",[140,149,150],{},[121,151,152],{},"perPage",[140,154,155],{},[121,156,157],{},"infiniteScroll",[159,160,161,184,215],"tbody",{},[137,162,163,170,175,180],{},[164,165,166,169],"td",{},[121,167,168],{},"ActivityLog"," infolist",[164,171,172],{},[121,173,174],{},"true",[164,176,177],{},[121,178,179],{},"3",[164,181,182],{},[121,183,174],{},[137,185,186,191,200,208],{},[164,187,188],{},[121,189,190],{},"ActivityLogRelationManager",[164,192,193,195,196,199],{},[121,194,174],{}," (static ",[121,197,198],{},"$groupByDate",")",[164,201,202,195,205,199],{},[121,203,204],{},"20",[121,206,207],{},"$perPage",[164,209,210,195,212,199],{},[121,211,174],{},[121,213,214],{},"$infiniteScroll",[137,216,217,222,227,233],{},[164,218,219],{},[121,220,221],{},"ActivityLogAction",[164,223,224,226],{},[121,225,174],{}," (hardcoded)",[164,228,229,230,199],{},"builder default (20 from ",[121,231,232],{},"default_per_page",[164,234,235],{},"n\u002Fa",[117,237,238,239,241,242,245,246,249,250,252],{},"The ",[121,240,232],{}," config key only governs ",[121,243,244],{},"$builder->paginate(null)"," calls made directly without UI — see ",[247,248,63],"a",{"href":63},". The infolist and relation manager pass an explicit ",[121,251,152],{}," to the Livewire component and bypass the config value.",[126,254,256],{"id":255},"infolist-component","Infolist component",[117,258,259,262],{},[121,260,261],{},"Relaticle\\ActivityLog\\Filament\\Infolists\\Components\\ActivityLog"," is the standard way to embed the timeline inside an existing Filament infolist (resource view page, custom page, or modal).",[264,265,270],"pre",{"className":266,"code":267,"language":268,"meta":269,"style":269},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Relaticle\\ActivityLog\\Filament\\Infolists\\Components\\ActivityLog;\n\nActivityLog::make('timeline')\n    ->groupByDate()\n    ->perPage(10)\n    ->emptyState('Nothing here yet — give it time.')\n    ->infiniteScroll()\n    ->columnSpanFull(),\n","php","",[121,271,272,313,320,348,359,373,392,401],{"__ignoreMap":269},[273,274,277,281,285,289,291,293,296,298,301,303,306,308,310],"span",{"class":275,"line":276},"line",1,[273,278,280],{"class":279},"sbssI","use",[273,282,284],{"class":283},"sTEyZ"," Relaticle",[273,286,288],{"class":287},"sMK4o","\\",[273,290,168],{"class":283},[273,292,288],{"class":287},[273,294,295],{"class":283},"Filament",[273,297,288],{"class":287},[273,299,300],{"class":283},"Infolists",[273,302,288],{"class":287},[273,304,305],{"class":283},"Components",[273,307,288],{"class":287},[273,309,168],{"class":283},[273,311,312],{"class":287},";\n",[273,314,316],{"class":275,"line":315},2,[273,317,319],{"emptyLinePlaceholder":318},true,"\n",[273,321,323,326,329,333,336,339,343,345],{"class":275,"line":322},3,[273,324,168],{"class":325},"sBMFI",[273,327,328],{"class":287},"::",[273,330,332],{"class":331},"s2Zo4","make",[273,334,335],{"class":287},"(",[273,337,338],{"class":287},"'",[273,340,342],{"class":341},"sfazB","timeline",[273,344,338],{"class":287},[273,346,347],{"class":287},")\n",[273,349,351,354,356],{"class":275,"line":350},4,[273,352,353],{"class":287},"    ->",[273,355,147],{"class":331},[273,357,358],{"class":287},"()\n",[273,360,362,364,366,368,371],{"class":275,"line":361},5,[273,363,353],{"class":287},[273,365,152],{"class":331},[273,367,335],{"class":287},[273,369,370],{"class":279},"10",[273,372,347],{"class":287},[273,374,376,378,381,383,385,388,390],{"class":275,"line":375},6,[273,377,353],{"class":287},[273,379,380],{"class":331},"emptyState",[273,382,335],{"class":287},[273,384,338],{"class":287},[273,386,387],{"class":341},"Nothing here yet — give it time.",[273,389,338],{"class":287},[273,391,347],{"class":287},[273,393,395,397,399],{"class":275,"line":394},7,[273,396,353],{"class":287},[273,398,157],{"class":331},[273,400,358],{"class":287},[273,402,404,406,409],{"class":275,"line":403},8,[273,405,353],{"class":287},[273,407,408],{"class":331},"columnSpanFull",[273,410,411],{"class":287},"(),\n",[413,414,416],"h3",{"id":415},"fluent-surface","Fluent surface",[131,418,419,429],{},[134,420,421],{},[137,422,423,426],{},[140,424,425],{},"Method",[140,427,428],{},"Purpose",[159,430,431,441,465,477,491,511],{},[137,432,433,438],{},[164,434,435],{},[121,436,437],{},"make(string $name)",[164,439,440],{},"Standard Filament constructor. Name is the schema key.",[137,442,443,448],{},[164,444,445],{},[121,446,447],{},"groupByDate(bool $enabled = true)",[164,449,450,451,454,455,454,458,461,462,464],{},"Buckets entries by ",[121,452,453],{},"this_week"," \u002F ",[121,456,457],{},"last_week",[121,459,460],{},"week_of \u003Cdate>",". Defaults to ",[121,463,174],{},".",[137,466,467,472],{},[164,468,469],{},[121,470,471],{},"perPage(int $perPage)",[164,473,474,475,464],{},"Page size for the timeline. Defaults to ",[121,476,179],{},[137,478,479,484],{},[164,480,481],{},[121,482,483],{},"emptyState(string $message)",[164,485,486,487,490],{},"Replaces the default ",[121,488,489],{},"\"No activity yet.\""," message.",[137,492,493,498],{},[164,494,495],{},[121,496,497],{},"infiniteScroll(bool $enabled = true)",[164,499,500,502,503,506,507,510],{},[121,501,174],{}," (default) renders a ",[121,504,505],{},"wire:intersect"," sentinel that auto-loads on scroll; ",[121,508,509],{},"false"," renders an explicit \"Load more\" button.",[137,512,513,518],{},[164,514,515],{},[121,516,517],{},"record(Model $record)",[164,519,520,521,524],{},"Bind a non-current record. Alias for ",[121,522,523],{},"model()",". Useful when the record can't be inferred from the form context.",[117,526,527,528,531,532,535,536,535,539,542],{},"The component extends ",[121,529,530],{},"Filament\\Infolists\\Components\\Entry",", so all standard methods (",[121,533,534],{},"columnSpanFull()",", ",[121,537,538],{},"visible()",[121,540,541],{},"hidden()",", etc.) work as expected.",[544,545,548,549,552,553,556],"callout",{"color":546,"icon":547},"info","i-lucide-info","The bound record must implement ",[121,550,551],{},"Relaticle\\ActivityLog\\Contracts\\HasTimeline",". The component throws a ",[121,554,555],{},"LogicException"," at render time if the record is missing or doesn't implement the contract.",[126,558,560],{"id":559},"relation-manager","Relation manager",[117,562,563,566,567,570],{},[121,564,565],{},"Relaticle\\ActivityLog\\Filament\\RelationManagers\\ActivityLogRelationManager"," adds a dedicated \"Activity\" tab to a resource. Register it in your resource's ",[121,568,569],{},"getRelations()",":",[264,572,574],{"className":266,"code":573,"language":268,"meta":269,"style":269},"use Relaticle\\ActivityLog\\Filament\\RelationManagers\\ActivityLogRelationManager;\n\npublic static function getRelations(): array\n{\n    return [\n        ActivityLogRelationManager::class,\n    ];\n}\n",[121,575,576,601,605,626,631,640,653,658],{"__ignoreMap":269},[273,577,578,580,582,584,586,588,590,592,595,597,599],{"class":275,"line":276},[273,579,280],{"class":279},[273,581,284],{"class":283},[273,583,288],{"class":287},[273,585,168],{"class":283},[273,587,288],{"class":287},[273,589,295],{"class":283},[273,591,288],{"class":287},[273,593,594],{"class":283},"RelationManagers",[273,596,288],{"class":287},[273,598,190],{"class":283},[273,600,312],{"class":287},[273,602,603],{"class":275,"line":315},[273,604,319],{"emptyLinePlaceholder":318},[273,606,607,611,614,617,620,623],{"class":275,"line":322},[273,608,610],{"class":609},"spNyl","public",[273,612,613],{"class":609}," static",[273,615,616],{"class":609}," function",[273,618,619],{"class":331}," getRelations",[273,621,622],{"class":287},"():",[273,624,625],{"class":279}," array\n",[273,627,628],{"class":275,"line":350},[273,629,630],{"class":287},"{\n",[273,632,633,637],{"class":275,"line":361},[273,634,636],{"class":635},"s7zQu","    return",[273,638,639],{"class":287}," [\n",[273,641,642,645,647,650],{"class":275,"line":375},[273,643,644],{"class":325},"        ActivityLogRelationManager",[273,646,328],{"class":287},[273,648,649],{"class":279},"class",[273,651,652],{"class":287},",\n",[273,654,655],{"class":275,"line":394},[273,656,657],{"class":287},"    ];\n",[273,659,660],{"class":275,"line":403},[273,661,662],{"class":287},"}\n",[117,664,665,668,669,671],{},[121,666,667],{},"canViewForRecord()"," always returns ",[121,670,174],{},", so the tab shows for every record. Override the method in a subclass if you need permission gating.",[413,673,675],{"id":674},"overriding-defaults","Overriding defaults",[117,677,678,679,682],{},"The relation manager exposes three public static properties. Set them once from a service provider's ",[121,680,681],{},"boot()"," to apply project-wide:",[264,684,686],{"className":266,"code":685,"language":268,"meta":269,"style":269},"use Relaticle\\ActivityLog\\Filament\\RelationManagers\\ActivityLogRelationManager;\n\npublic function boot(): void\n{\n    ActivityLogRelationManager::$infiniteScroll = false;\n    ActivityLogRelationManager::$groupByDate = false;\n    ActivityLogRelationManager::$perPage = 50;\n}\n",[121,687,688,712,716,730,734,751,764,780],{"__ignoreMap":269},[273,689,690,692,694,696,698,700,702,704,706,708,710],{"class":275,"line":276},[273,691,280],{"class":279},[273,693,284],{"class":283},[273,695,288],{"class":287},[273,697,168],{"class":283},[273,699,288],{"class":287},[273,701,295],{"class":283},[273,703,288],{"class":287},[273,705,594],{"class":283},[273,707,288],{"class":287},[273,709,190],{"class":283},[273,711,312],{"class":287},[273,713,714],{"class":275,"line":315},[273,715,319],{"emptyLinePlaceholder":318},[273,717,718,720,722,725,727],{"class":275,"line":322},[273,719,610],{"class":609},[273,721,616],{"class":609},[273,723,724],{"class":331}," boot",[273,726,622],{"class":287},[273,728,729],{"class":279}," void\n",[273,731,732],{"class":275,"line":350},[273,733,630],{"class":287},[273,735,736,739,742,745,748],{"class":275,"line":361},[273,737,738],{"class":325},"    ActivityLogRelationManager",[273,740,741],{"class":287},"::$",[273,743,744],{"class":283},"infiniteScroll ",[273,746,747],{"class":287},"=",[273,749,750],{"class":287}," false;\n",[273,752,753,755,757,760,762],{"class":275,"line":375},[273,754,738],{"class":325},[273,756,741],{"class":287},[273,758,759],{"class":283},"groupByDate ",[273,761,747],{"class":287},[273,763,750],{"class":287},[273,765,766,768,770,773,775,778],{"class":275,"line":394},[273,767,738],{"class":325},[273,769,741],{"class":287},[273,771,772],{"class":283},"perPage ",[273,774,747],{"class":287},[273,776,777],{"class":279}," 50",[273,779,312],{"class":287},[273,781,782],{"class":275,"line":403},[273,783,662],{"class":287},[544,785,786,787,790,791,794,795,798,799,802,803,806],{"color":546,"icon":547},"The relation manager doesn't need a real database relation. ",[121,788,789],{},"getRelationship()"," returns a self-referential ",[121,792,793],{},"HasOne"," against the owner record itself, which satisfies Filament's machinery while letting the embedded ",[121,796,797],{},"ActivityLogLivewire"," component own the data fetching. ",[121,800,801],{},"getTableQuery()"," returns ",[121,804,805],{},"null"," for the same reason.",[126,808,810],{"id":809},"header-action","Header action",[117,812,813,816,817,570],{},[121,814,815],{},"Relaticle\\ActivityLog\\Filament\\Actions\\ActivityLogAction"," opens the timeline in a slide-over from any page header. Register it in ",[121,818,819],{},"getHeaderActions()",[264,821,823],{"className":266,"code":822,"language":268,"meta":269,"style":269},"use Relaticle\\ActivityLog\\Filament\\Actions\\ActivityLogAction;\n\nprotected function getHeaderActions(): array\n{\n    return [\n        ActivityLogAction::make(),\n    ];\n}\n",[121,824,825,850,854,868,872,878,889,893],{"__ignoreMap":269},[273,826,827,829,831,833,835,837,839,841,844,846,848],{"class":275,"line":276},[273,828,280],{"class":279},[273,830,284],{"class":283},[273,832,288],{"class":287},[273,834,168],{"class":283},[273,836,288],{"class":287},[273,838,295],{"class":283},[273,840,288],{"class":287},[273,842,843],{"class":283},"Actions",[273,845,288],{"class":287},[273,847,221],{"class":283},[273,849,312],{"class":287},[273,851,852],{"class":275,"line":315},[273,853,319],{"emptyLinePlaceholder":318},[273,855,856,859,861,864,866],{"class":275,"line":322},[273,857,858],{"class":609},"protected",[273,860,616],{"class":609},[273,862,863],{"class":331}," getHeaderActions",[273,865,622],{"class":287},[273,867,625],{"class":279},[273,869,870],{"class":275,"line":350},[273,871,630],{"class":287},[273,873,874,876],{"class":275,"line":361},[273,875,636],{"class":635},[273,877,639],{"class":287},[273,879,880,883,885,887],{"class":275,"line":375},[273,881,882],{"class":325},"        ActivityLogAction",[273,884,328],{"class":287},[273,886,332],{"class":331},[273,888,411],{"class":287},[273,890,891],{"class":275,"line":394},[273,892,657],{"class":287},[273,894,895],{"class":275,"line":403},[273,896,662],{"class":287},[413,898,900],{"id":899},"defaults","Defaults",[117,902,903,802,906,909,910,913,914,464],{},[121,904,905],{},"ActivityLogAction::getDefaultName()",[121,907,908],{},"'activityLog'",". Use that name when calling the action in tests (",[121,911,912],{},"->callAction('activityLog')",") or when overriding it in a panel via ",[121,915,916],{},"Action::configureUsing()",[117,918,919,922],{},[121,920,921],{},"setUp()"," applies the following defaults:",[924,925,926,936,944,952,960,966],"ul",{},[927,928,929,932,933],"li",{},[121,930,931],{},"label"," — ",[121,934,935],{},"__('activity-log::messages.title')",[927,937,938,932,941],{},[121,939,940],{},"icon",[121,942,943],{},"heroicon-o-bars-3-bottom-left",[927,945,946,932,949],{},[121,947,948],{},"color",[121,950,951],{},"gray",[927,953,954,932,957],{},[121,955,956],{},"modalWidth",[121,958,959],{},"Filament\\Support\\Enums\\Width::TwoExtraLarge",[927,961,962,965],{},[121,963,964],{},"slideOver()"," — yes",[927,967,968,971,972,975],{},[121,969,970],{},"modalSubmitAction(false)"," and ",[121,973,974],{},"modalCancelActionLabel(__('activity-log::messages.close'))"," — no submit, just a close button",[117,977,978,979,535,982,535,985,535,988,991],{},"Standard Filament action methods (",[121,980,981],{},"->visible()",[121,983,984],{},"->color()",[121,986,987],{},"->modalHeading()",[121,989,990],{},"->icon()",", etc.) work normally and override the defaults above.",[544,993,996,1004,1005,1008,1009,1014,1015,1017,1018,1021],{"color":994,"icon":995},"warning","i-lucide-alert-triangle",[997,998,999,1001,1002],"strong",{},[121,1000,147],{}," is hardcoded to ",[121,1003,174],{}," inside the action's ",[121,1006,1007],{},"Livewire::make()"," mount, and ",[997,1010,1011,1013],{},[121,1012,152],{}," is not exposed at all"," — the Livewire component falls back to its own default of ",[121,1016,204],{},". If you need different defaults inside the slide-over, either use the relation manager (configurable via the three statics above) or build a custom action that mounts ",[121,1019,1020],{},"Livewire::make(ActivityLogLivewire::class, [...])"," with your own arguments.",[126,1023,1025],{"id":1024},"built-in-url-filter-ui","Built-in URL filter UI",[117,1027,238,1028,1030,1031,1034],{},[121,1029,797],{}," component ships three filters bound to URL query parameters via Livewire's ",[121,1032,1033],{},"#[Url]"," attribute:",[264,1036,1038],{"className":266,"code":1037,"language":268,"meta":269,"style":269},"#[Url(as: 'type')]  public ?string $typeFilter = null;\n#[Url(as: 'from')]  public ?string $fromDate = null;\n#[Url(as: 'to')]    public ?string $toDate = null;\n",[121,1039,1040,1084,1120],{"__ignoreMap":269},[273,1041,1042,1045,1047,1050,1052,1055,1058,1060,1062,1065,1067,1070,1073,1076,1079,1081],{"class":275,"line":276},[273,1043,1044],{"class":283},"#[Url",[273,1046,335],{"class":287},[273,1048,1049],{"class":325},"as",[273,1051,570],{"class":287},[273,1053,1054],{"class":287}," '",[273,1056,1057],{"class":341},"type",[273,1059,338],{"class":287},[273,1061,199],{"class":287},[273,1063,1064],{"class":283},"]  ",[273,1066,610],{"class":609},[273,1068,1069],{"class":287}," ?",[273,1071,1072],{"class":279},"string",[273,1074,1075],{"class":287}," $",[273,1077,1078],{"class":283},"typeFilter ",[273,1080,747],{"class":287},[273,1082,1083],{"class":287}," null;\n",[273,1085,1086,1088,1090,1092,1094,1096,1099,1101,1103,1105,1107,1109,1111,1113,1116,1118],{"class":275,"line":315},[273,1087,1044],{"class":283},[273,1089,335],{"class":287},[273,1091,1049],{"class":325},[273,1093,570],{"class":287},[273,1095,1054],{"class":287},[273,1097,1098],{"class":341},"from",[273,1100,338],{"class":287},[273,1102,199],{"class":287},[273,1104,1064],{"class":283},[273,1106,610],{"class":609},[273,1108,1069],{"class":287},[273,1110,1072],{"class":279},[273,1112,1075],{"class":287},[273,1114,1115],{"class":283},"fromDate ",[273,1117,747],{"class":287},[273,1119,1083],{"class":287},[273,1121,1122,1124,1126,1128,1130,1132,1135,1137,1139,1142,1144,1146,1148,1150,1153,1155],{"class":275,"line":322},[273,1123,1044],{"class":283},[273,1125,335],{"class":287},[273,1127,1049],{"class":325},[273,1129,570],{"class":287},[273,1131,1054],{"class":287},[273,1133,1134],{"class":341},"to",[273,1136,338],{"class":287},[273,1138,199],{"class":287},[273,1140,1141],{"class":283},"]    ",[273,1143,610],{"class":609},[273,1145,1069],{"class":287},[273,1147,1072],{"class":279},[273,1149,1075],{"class":287},[273,1151,1152],{"class":283},"toDate ",[273,1154,747],{"class":287},[273,1156,1083],{"class":287},[117,1158,1159],{},"The timeline view renders the filter chrome (entry-type select, date range, clear button) automatically. State syncs to the URL on every change, which means filtered views are shareable and bookmarkable:",[264,1161,1166],{"className":1162,"code":1164,"language":1165,"meta":269},[1163],"language-text","\u002Fadmin\u002Fpeople\u002F42?type=activity_log&from=2026-01-01&to=2026-04-30\n","text",[121,1167,1164],{"__ignoreMap":269},[117,1169,1170,1171,1174],{},"Each filter mutates the underlying ",[121,1172,1173],{},"Relaticle\\ActivityLog\\Timeline\\TimelineBuilder"," before the entries are resolved:",[924,1176,1177,1186],{},[927,1178,1179,1182,1183],{},[121,1180,1181],{},"typeFilter"," → ",[121,1184,1185],{},"$builder->ofType([$typeFilter])",[927,1187,1188,971,1191,1182,1194,1197,1198,199],{},[121,1189,1190],{},"fromDate",[121,1192,1193],{},"toDate",[121,1195,1196],{},"$builder->between(CarbonImmutable::parse($fromDate), CarbonImmutable::parse($toDate))"," (either or both may be ",[121,1199,805],{},[117,1201,1202,1203,1206,1207,1210,1211,464],{},"A ",[121,1204,1205],{},"resetFilters()"," Livewire action is wired to the clear button — it nulls all three properties and rewinds ",[121,1208,1209],{},"visibleCount"," to ",[121,1212,152],{},[544,1214,238,1215,1217,1218,1221,1222,535,1225,535,1228,1231,1232,1235,1236,464],{"color":546,"icon":547},[121,1216,1181],{}," value is matched against ",[121,1219,1220],{},"$entry->type",", so only the three real entry-type values resolve (",[121,1223,1224],{},"activity_log",[121,1226,1227],{},"related_model",[121,1229,1230],{},"custom","). Filtering by ",[121,1233,1234],{},"'related_activity_log'"," matches nothing — see the type taxonomy in ",[247,1237,28],{"href":1238},"\u002Fconcepts\u002Fhow-it-works#type-taxonomy",[117,1240,1241,1242,464],{},"For programmatic equivalents — pre-applying filters from PHP rather than the URL — see ",[247,1243,48],{"href":48},[1245,1246,1247],"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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":269,"searchDepth":315,"depth":315,"links":1249},[1250,1251,1254,1257,1260],{"id":128,"depth":315,"text":129},{"id":255,"depth":315,"text":256,"children":1252},[1253],{"id":415,"depth":322,"text":416},{"id":559,"depth":315,"text":560,"children":1255},[1256],{"id":674,"depth":322,"text":675},{"id":809,"depth":315,"text":810,"children":1258},[1259],{"id":899,"depth":322,"text":900},{"id":1024,"depth":315,"text":1025},"The infolist component, relation manager, header action, and URL filter UI.","md",null,{},{"icon":45},{"description":1267,"ogImage":1268,"title":42},"Reference for the ActivityLog infolist component, relation manager, header action, and URL filter UI in relaticle\u002Factivity-log.","\u002Fpreview.png","ZMn0CVSE6INIGhgNWGr22ZMTbySZ6j1_2S30N31nuMg",[1271,1273],{"title":37,"path":38,"stem":39,"description":1272,"icon":40,"children":-1},"The four built-in source types and how to register custom ones.",{"title":47,"path":48,"stem":49,"description":1274,"icon":50,"children":-1},"Filter, sort, deduplicate, and paginate the merged stream.",1780504149910]