fix: Logs page pagination (#883)

This commit is contained in:
jamesread 2026-02-19 20:33:24 +00:00
parent 7dcbca31fc
commit ea4cdf9df2
8 changed files with 36 additions and 8 deletions

View File

@ -495,6 +495,13 @@ export declare type GetLogsRequest = Message<"olivetin.api.v1.GetLogsRequest"> &
* @generated from field: string date_filter = 2; * @generated from field: string date_filter = 2;
*/ */
dateFilter: string; dateFilter: string;
/**
* Number of logs per page (optional; server default used if 0 or unset)
*
* @generated from field: int64 page_size = 3;
*/
pageSize: bigint;
}; };
/** /**
@ -1846,3 +1853,4 @@ export declare const OliveTinApiService: GenService<{
output: typeof EntitySchema; output: typeof EntitySchema;
}, },
}>; }>;

File diff suppressed because one or more lines are too long

View File

@ -78,7 +78,7 @@
</tbody> </tbody>
</table> </table>
<Pagination :pageSize="pageSize" :total="totalCount" :currentPage="currentPage" @page-change="handlePageChange" class="padding" <Pagination :pageSize="pageSize" :total="totalCount" :currentPage="currentPage" :page="currentPage" @page-change="handlePageChange" class="padding"
@page-size-change="handlePageSizeChange" itemTitle="execution logs" /> @page-size-change="handlePageSizeChange" itemTitle="execution logs" />
</div> </div>

View File

@ -68,7 +68,7 @@
</tbody> </tbody>
</table> </table>
<Pagination :pageSize="pageSize" :total="totalCount" :currentPage="currentPage" @page-change="handlePageChange" class = "padding" <Pagination :pageSize="pageSize" :total="totalCount" :currentPage="currentPage" :page="currentPage" @page-change="handlePageChange" class = "padding"
@page-size-change="handlePageSizeChange" itemTitle="execution logs" /> @page-size-change="handlePageSizeChange" itemTitle="execution logs" />
</div> </div>
@ -150,6 +150,7 @@ async function fetchLogs() {
const args = { const args = {
"startOffset": BigInt(startOffset), "startOffset": BigInt(startOffset),
"pageSize": BigInt(pageSize.value),
} }
// Add date filter if selected // Add date filter if selected
@ -160,7 +161,6 @@ async function fetchLogs() {
const response = await window.client.getLogs(args) const response = await window.client.getLogs(args)
logs.value = response.logs logs.value = response.logs
pageSize.value = Number(response.pageSize) || 0
totalCount.value = Number(response.totalCount) || 0 totalCount.value = Number(response.totalCount) || 0
} catch (err) { } catch (err) {
console.error('Failed to fetch logs:', err) console.error('Failed to fetch logs:', err)

View File

@ -121,6 +121,7 @@ message StartActionByGetAndWaitResponse {
message GetLogsRequest{ message GetLogsRequest{
int64 start_offset = 1; int64 start_offset = 1;
string date_filter = 2; // Optional date filter in YYYY-MM-DD format string date_filter = 2; // Optional date filter in YYYY-MM-DD format
int64 page_size = 3; // Number of logs per page (optional; server default used if 0 or unset)
}; };
message LogEntry { message LogEntry {

View File

@ -1105,6 +1105,7 @@ type GetLogsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
StartOffset int64 `protobuf:"varint,1,opt,name=start_offset,json=startOffset,proto3" json:"start_offset,omitempty"` StartOffset int64 `protobuf:"varint,1,opt,name=start_offset,json=startOffset,proto3" json:"start_offset,omitempty"`
DateFilter string `protobuf:"bytes,2,opt,name=date_filter,json=dateFilter,proto3" json:"date_filter,omitempty"` // Optional date filter in YYYY-MM-DD format DateFilter string `protobuf:"bytes,2,opt,name=date_filter,json=dateFilter,proto3" json:"date_filter,omitempty"` // Optional date filter in YYYY-MM-DD format
PageSize int64 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Number of logs per page (optional; server default used if 0 or unset)
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@ -1153,6 +1154,13 @@ func (x *GetLogsRequest) GetDateFilter() string {
return "" return ""
} }
func (x *GetLogsRequest) GetPageSize() int64 {
if x != nil {
return x.PageSize
}
return 0
}
type LogEntry struct { type LogEntry struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
DatetimeStarted string `protobuf:"bytes,1,opt,name=datetime_started,json=datetimeStarted,proto3" json:"datetime_started,omitempty"` DatetimeStarted string `protobuf:"bytes,1,opt,name=datetime_started,json=datetimeStarted,proto3" json:"datetime_started,omitempty"`
@ -3972,11 +3980,12 @@ const file_olivetin_api_v1_olivetin_proto_rawDesc = "" +
"\x1eStartActionByGetAndWaitRequest\x12\x1b\n" + "\x1eStartActionByGetAndWaitRequest\x12\x1b\n" +
"\taction_id\x18\x01 \x01(\tR\bactionId\"Y\n" + "\taction_id\x18\x01 \x01(\tR\bactionId\"Y\n" +
"\x1fStartActionByGetAndWaitResponse\x126\n" + "\x1fStartActionByGetAndWaitResponse\x126\n" +
"\tlog_entry\x18\x01 \x01(\v2\x19.olivetin.api.v1.LogEntryR\blogEntry\"T\n" + "\tlog_entry\x18\x01 \x01(\v2\x19.olivetin.api.v1.LogEntryR\blogEntry\"q\n" +
"\x0eGetLogsRequest\x12!\n" + "\x0eGetLogsRequest\x12!\n" +
"\fstart_offset\x18\x01 \x01(\x03R\vstartOffset\x12\x1f\n" + "\fstart_offset\x18\x01 \x01(\x03R\vstartOffset\x12\x1f\n" +
"\vdate_filter\x18\x02 \x01(\tR\n" + "\vdate_filter\x18\x02 \x01(\tR\n" +
"dateFilter\"\x89\x05\n" + "dateFilter\x12\x1b\n" +
"\tpage_size\x18\x03 \x01(\x03R\bpageSize\"\x89\x05\n" +
"\bLogEntry\x12)\n" + "\bLogEntry\x12)\n" +
"\x10datetime_started\x18\x01 \x01(\tR\x0fdatetimeStarted\x12!\n" + "\x10datetime_started\x18\x01 \x01(\tR\x0fdatetimeStarted\x12!\n" +
"\faction_title\x18\x02 \x01(\tR\vactionTitle\x12\x16\n" + "\faction_title\x18\x02 \x01(\tR\vactionTitle\x12\x16\n" +

View File

@ -506,7 +506,16 @@ func (api *oliveTinAPI) GetLogs(ctx ctx.Context, req *connect.Request[apiv1.GetL
if req.Msg.DateFilter != "" { if req.Msg.DateFilter != "" {
dateFilter = req.Msg.DateFilter dateFilter = req.Msg.DateFilter
} }
logEntries, paging := api.executor.GetLogTrackingIdsACL(api.cfg, user, req.Msg.StartOffset, api.cfg.LogHistoryPageSize, dateFilter) pageSize := api.cfg.LogHistoryPageSize
if req.Msg.GetPageSize() > 0 {
pageSize = req.Msg.GetPageSize()
if pageSize < 10 {
pageSize = 10
} else if pageSize > 100 {
pageSize = 100
}
}
logEntries, paging := api.executor.GetLogTrackingIdsACL(api.cfg, user, req.Msg.StartOffset, pageSize, dateFilter)
for _, le := range logEntries { for _, le := range logEntries {
ret.Logs = append(ret.Logs, api.internalLogEntryToPb(le, user)) ret.Logs = append(ret.Logs, api.internalLogEntryToPb(le, user))
} }

View File

@ -57,7 +57,7 @@ func buildEntityFieldsetContents(contents []*config.DashboardComponent, ent *ent
for _, subitem := range contents { for _, subitem := range contents {
c := cloneItem(subitem, ent, entityType, rr) c := cloneItem(subitem, ent, entityType, rr)
log.Infof("cloneItem: %+v", c) log.Tracef("cloneItem: %+v", c)
if c != nil { if c != nil {
ret = append(ret, c) ret = append(ret, c)