Skip to content

Commit 3581879

Browse files
feat: add pagination configuration to runtime settings and update config builder service
1 parent cd4aab3 commit 3581879

3 files changed

Lines changed: 125 additions & 0 deletions

File tree

src/app/models/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,15 @@ export interface IHostConfig {
165165
mode?: HostMode;
166166
}
167167

168+
/**
169+
* Pagination configuration
170+
*/
171+
export interface IPaginationConfig {
172+
'max-page-size'?: number | null;
173+
'default-page-size'?: number | null;
174+
'next-link-relative'?: boolean;
175+
}
176+
168177
/**
169178
* Telemetry configuration
170179
*/
@@ -183,6 +192,7 @@ export interface IRuntimeConfig {
183192
graphql?: IGraphQLConfig;
184193
mcp?: IMcpConfig;
185194
host?: IHostConfig;
195+
pagination?: IPaginationConfig;
186196
telemetry?: ITelemetryConfig;
187197
}
188198

src/app/pages/config-wizard/tabs/runtime-tab/runtime-tab.component.ts

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,90 @@ import { ConfigBuilderService } from '../../../../services/config-builder.servic
251251
</div>
252252
</div>
253253
254+
<!-- Pagination Configuration -->
255+
<div class="col-12 mb-4">
256+
<div class="card">
257+
<div class="card-header d-flex justify-content-between align-items-center">
258+
<h5 class="mb-0">
259+
<i class="bi bi-layers me-2"></i>
260+
Pagination
261+
</h5>
262+
<a
263+
href="https://learn.microsoft.com/en-us/azure/data-api-builder/configuration/runtime#pagination-runtime"
264+
target="_blank"
265+
rel="noopener noreferrer"
266+
class="btn btn-sm btn-outline-primary"
267+
>
268+
<i class="bi bi-book me-1"></i>
269+
Documentation
270+
</a>
271+
</div>
272+
<div class="card-body">
273+
<div class="row">
274+
<div class="col-md-4 mb-3">
275+
<label for="maxPageSize" class="form-label">Max Page Size</label>
276+
<input
277+
type="number"
278+
id="maxPageSize"
279+
class="form-control"
280+
[ngModel]="configBuilder.paginationConfig()['max-page-size']"
281+
(ngModelChange)="configBuilder.setPaginationConfig({ 'max-page-size': $event })"
282+
placeholder="100000 (default)"
283+
min="1"
284+
/>
285+
<small class="form-text text-muted">
286+
Maximum number of records per page (default: 100,000)
287+
</small>
288+
</div>
289+
<div class="col-md-4 mb-3">
290+
<label for="defaultPageSize" class="form-label">Default Page Size</label>
291+
<input
292+
type="number"
293+
id="defaultPageSize"
294+
class="form-control"
295+
[ngModel]="configBuilder.paginationConfig()['default-page-size']"
296+
(ngModelChange)="
297+
configBuilder.setPaginationConfig({ 'default-page-size': $event })
298+
"
299+
placeholder="100 (default)"
300+
min="1"
301+
/>
302+
<small class="form-text text-muted">
303+
Default number of records returned (default: 100)
304+
</small>
305+
</div>
306+
<div class="col-md-4 mb-3">
307+
<label class="form-label d-block">Next Link Options</label>
308+
<div class="form-check mt-2">
309+
<input
310+
type="checkbox"
311+
id="nextLinkRelative"
312+
class="form-check-input"
313+
[ngModel]="configBuilder.paginationConfig()['next-link-relative']"
314+
(ngModelChange)="
315+
configBuilder.setPaginationConfig({ 'next-link-relative': $event })
316+
"
317+
/>
318+
<label for="nextLinkRelative" class="form-check-label">
319+
Use Relative URLs
320+
</label>
321+
</div>
322+
<small class="form-text text-muted d-block mt-1">
323+
Use relative URLs for pagination links
324+
</small>
325+
</div>
326+
</div>
327+
<div class="alert alert-info mb-0 mt-2">
328+
<small>
329+
<strong>Pagination Settings:</strong> Configure default pagination behavior for
330+
REST and GraphQL endpoints. Leave values empty to use defaults (max: 100,000,
331+
default: 100).
332+
</small>
333+
</div>
334+
</div>
335+
</div>
336+
</div>
337+
254338
<!-- Authentication Configuration -->
255339
<div class="col-12 mb-4">
256340
<div class="card">

src/app/services/config-builder.service.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
IGraphQLConfig,
99
IHostConfig,
1010
IMcpConfig,
11+
IPaginationConfig,
1112
IRestConfig,
1213
IRuntimeConfig,
1314
} from '../models';
@@ -57,6 +58,12 @@ export class ConfigBuilderService {
5758
mode: 'development',
5859
});
5960

61+
readonly paginationConfig = signal<IPaginationConfig>({
62+
'max-page-size': null,
63+
'default-page-size': null,
64+
'next-link-relative': false,
65+
});
66+
6067
// Entities state
6168
readonly entities = signal<IGeneratedEntity[]>([]);
6269

@@ -156,6 +163,13 @@ export class ConfigBuilderService {
156163
this.hostConfig.update((current) => ({ ...current, ...config }));
157164
}
158165

166+
/**
167+
* Update Pagination configuration
168+
*/
169+
setPaginationConfig(config: Partial<IPaginationConfig>): void {
170+
this.paginationConfig.update((current) => ({ ...current, ...config }));
171+
}
172+
159173
/**
160174
* Toggle preview panel
161175
*/
@@ -186,13 +200,25 @@ export class ConfigBuilderService {
186200
cleanedHostConfig.authentication = hostConfig.authentication;
187201
}
188202

203+
// Build pagination config, only include if values are set
204+
const paginationConfig = this.paginationConfig();
205+
const hasPaginationConfig =
206+
paginationConfig['max-page-size'] !== null ||
207+
paginationConfig['default-page-size'] !== null ||
208+
paginationConfig['next-link-relative'] === true;
209+
189210
const runtime: IRuntimeConfig = {
190211
rest: this.restConfig(),
191212
graphql: this.graphqlConfig(),
192213
mcp: this.mcpConfig(),
193214
host: cleanedHostConfig,
194215
};
195216

217+
// Only include pagination if configured
218+
if (hasPaginationConfig) {
219+
runtime.pagination = paginationConfig;
220+
}
221+
196222
return {
197223
$schema:
198224
'https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json',
@@ -327,5 +353,10 @@ export class ConfigBuilderService {
327353
},
328354
mode: 'development',
329355
});
356+
this.paginationConfig.set({
357+
'max-page-size': null,
358+
'default-page-size': null,
359+
'next-link-relative': false,
360+
});
330361
}
331362
}

0 commit comments

Comments
 (0)