<feed xmlns='http://www.w3.org/2005/Atom'>
<title>hutch.git/Hutch/Views/Tickets/TicketListViewModel.swift, branch v3.0.4</title>
<subtitle>ios client for sourcehut. swiftui.
</subtitle>
<id>http://git.krz.sh/krz/hutch.git/atom?h=v3.0.4</id>
<link rel='self' href='http://git.krz.sh/krz/hutch.git/atom?h=v3.0.4'/>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/'/>
<updated>2026-04-13T18:35:03+00:00</updated>
<entry>
<title>perf: cache filtered collections and add equatable row views</title>
<updated>2026-04-13T18:35:03+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-13T18:35:03+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=0b84ecaf7ba0fb2cd3f3867da8dc732450b55b50'/>
<id>urn:sha1:0b84ecaf7ba0fb2cd3f3867da8dc732450b55b50</id>
<content type='text'>
Convert filteredJobs, filteredPastes, and filteredTickets from computed
properties to stored properties updated via didSet on their inputs. Each
update function guards with an equality check before assigning, so
@Observable skips the notification when the filtered result hasn't
changed — preventing list re-renders on auto-refresh when no visible
data has actually changed.

Add Equatable conformance to BuildRowView, PasteRowView, TicketRowView,
and SelectableTicketRow, and apply .equatable() at each ForEach call
site. When a list does re-render, SwiftUI now skips body evaluation for
rows whose model value is identical to the previous pass.

Implements: https://todo.sr.ht/~ccleberg/hutch/57
</content>
</entry>
<entry>
<title>feat: add search and recent queries</title>
<updated>2026-04-13T03:52:33+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-13T03:52:33+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=72f860e0e171f6aac4e7d896e7a571147dbcb5c5'/>
<id>urn:sha1:72f860e0e171f6aac4e7d896e7a571147dbcb5c5</id>
<content type='text'>
Implements: https://todo.sr.ht/~ccleberg/hutch/47
Implements: https://todo.sr.ht/~ccleberg/hutch/48
</content>
</entry>
<entry>
<title>feat: add ticket label management and bulk actions</title>
<updated>2026-04-13T03:42:33+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-13T03:42:33+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=576bb6c2432a15f5138771c06019b55fd2244e15'/>
<id>urn:sha1:576bb6c2432a15f5138771c06019b55fd2244e15</id>
<content type='text'>
Implements: https://todo.sr.ht/~ccleberg/hutch/45
Implements: https://todo.sr.ht/~ccleberg/hutch/46
</content>
</entry>
<entry>
<title>feat: add ticket saved filters and label filtering</title>
<updated>2026-04-13T02:33:14+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-13T02:33:14+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=31cbca674957eea7ae2529012e20a9d95158e561'/>
<id>urn:sha1:31cbca674957eea7ae2529012e20a9d95158e561</id>
<content type='text'>
Implements: https://todo.sr.ht/~ccleberg/hutch/32
Implements: https://todo.sr.ht/~ccleberg/hutch/33
</content>
</entry>
<entry>
<title>Add tracker management (delete/update, ACLs, labels)</title>
<updated>2026-04-02T03:03:14+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-02T03:03:14+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=902055d5eaa7f5512b76e22f57df3939f956181f'/>
<id>urn:sha1:902055d5eaa7f5512b76e22f57df3939f956181f</id>
<content type='text'>
- Add swipe actions (delete/edit) to tracker list
- Add tracker settings menu on detail screen
- Implement updateTracker and deleteTracker mutations
- Implement ACL management (updateUserACL, updateTrackerACL, deleteACL)
- Implement label management (createLabel, updateLabel, deleteLabel)
- Add dedicated UI flows for ACLs and labels
- Ensure state refresh after mutations
- Handle loading, errors, and destructive confirmations

Implements: https://todo.sr.ht/~ccleberg/Hutch/12
</content>
</entry>
<entry>
<title>feat: swipe actions on tickets, pastes, builds, and home dashboard</title>
<updated>2026-03-23T01:42:53+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-03-23T01:42:53+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=82e54ad018ae5fa5cdf90c0d763e09e99bc0e933'/>
<id>urn:sha1:82e54ad018ae5fa5cdf90c0d763e09e99bc0e933</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: add search to builds, trackers, tickets, pastes, mailing lists, and inbox</title>
<updated>2026-03-23T01:42:45+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-03-23T01:42:45+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=1f8b7a23529462c3c332753d33810b5c9f692bbc'/>
<id>urn:sha1:1f8b7a23529462c3c332753d33810b5c9f692bbc</id>
<content type='text'>
</content>
</entry>
<entry>
<title>v2.1: bundled polish and fixes</title>
<updated>2026-03-19T21:59:16+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-03-19T21:59:16+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=b82bbeeea48ad27832a355c2a41408559c411104'/>
<id>urn:sha1:b82bbeeea48ad27832a355c2a41408559c411104</id>
<content type='text'>
</content>
</entry>
<entry>
<title>v1.0</title>
<updated>2026-03-18T04:19:43+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-03-18T04:19:43+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/hutch.git/commit/?id=32ad6cab8d58d99ebd8a28e8fa6e6f4e587cb1e5'/>
<id>urn:sha1:32ad6cab8d58d99ebd8a28e8fa6e6f4e587cb1e5</id>
<content type='text'>
</content>
</entry>
</feed>
