The filter is applied during every full update, including init(). Calling rows.filter() also requests a full update, unless it is called before init().
You should check the order in which the updates are executed. Asynchronous calls can be executed in any order.
If there are no events visible, it means the filter is applied before events are loaded. Loading events using update({events}) will result in an optimized partial update which doesn't re-apply the filter (the onRowFilter handler is not called).
See also:
https://api.daypilot.org/daypilot-scheduler-update/
I would recommend the following:
1. Call rows.filter() before init() to apply the initial filter.
2. When loading events, make sure that you request a full update, like this:
dp.events.list = [ /* ... */ ];
dp.update();
Instead of this which will perform a partial update only:
const events = [ /* ... */ ];
dp.update({events});
To prevent multiple updates when loading resources and events, you can wait for both HTTP requests to complete and perform a single update:
https://code.daypilot.org/49902/javascript-scheduler-wait-for-parallel-http-requests
If you update both resources and events at the same it will request a full update:
dp.update({events, resources});