Skip to content

Commit 1a79450

Browse files
committed
Implement sort order for info pages
Fixes #1264
1 parent 1e73299 commit 1a79450

File tree

7 files changed

+90
-23
lines changed

7 files changed

+90
-23
lines changed

Tekst-API/openapi.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9991,6 +9991,14 @@
99919991
"title": "Title",
99929992
"description": "Title of this segment"
99939993
},
9994+
"sortOrder": {
9995+
"type": "integer",
9996+
"maximum": 1000.0,
9997+
"minimum": 0.0,
9998+
"title": "Sortorder",
9999+
"description": "Sort order for displaying this segment among others (only relevant for non-system segments aka. info pages!)",
10000+
"default": 10
10001+
},
999410002
"html": {
999510003
"type": "string",
999610004
"maxLength": 1048576,
@@ -10095,6 +10103,14 @@
1009510103
"title": "Title",
1009610104
"description": "Title of this segment"
1009710105
},
10106+
"sortOrder": {
10107+
"type": "integer",
10108+
"maximum": 1000.0,
10109+
"minimum": 0.0,
10110+
"title": "Sortorder",
10111+
"description": "Sort order for displaying this segment among others (only relevant for non-system segments aka. info pages!)",
10112+
"default": 10
10113+
},
1009810114
"html": {
1009910115
"type": "string",
1010010116
"maxLength": 1048576,
@@ -10194,6 +10210,21 @@
1019410210
"description": "Title of this segment",
1019510211
"optionalNullable": false
1019610212
},
10213+
"sortOrder": {
10214+
"anyOf": [
10215+
{
10216+
"type": "integer",
10217+
"maximum": 1000.0,
10218+
"minimum": 0.0
10219+
},
10220+
{
10221+
"type": "null"
10222+
}
10223+
],
10224+
"title": "Sortorder",
10225+
"description": "Sort order for displaying this segment among others (only relevant for non-system segments aka. info pages!)",
10226+
"optionalNullable": false
10227+
},
1019710228
"html": {
1019810229
"anyOf": [
1019910230
{

Tekst-API/tekst/models/segment.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,21 @@ class ClientSegment(ModelBase, ModelFactoryMixin):
2727
),
2828
),
2929
]
30+
3031
editor_mode: Annotated[
3132
Literal["wysiwyg", "html"],
3233
Field(
3334
description="Last used editor mode",
3435
),
3536
] = "wysiwyg"
37+
3638
locale: Annotated[
3739
TranslationLocaleKey,
3840
Field(
3941
description="Locale indicating the translation language of this segment",
4042
),
4143
]
44+
4245
restriction: Annotated[
4346
Literal["none", "user", "superuser"],
4447
Field(
@@ -47,6 +50,7 @@ class ClientSegment(ModelBase, ModelFactoryMixin):
4750
),
4851
),
4952
] = "none"
53+
5054
title: Annotated[
5155
ConStr(
5256
max_length=32,
@@ -56,6 +60,19 @@ class ClientSegment(ModelBase, ModelFactoryMixin):
5660
description="Title of this segment",
5761
),
5862
]
63+
64+
sort_order: Annotated[
65+
int,
66+
Field(
67+
description=(
68+
"Sort order for displaying this segment among others "
69+
"(only relevant for non-system segments aka. info pages!)"
70+
),
71+
ge=0,
72+
le=1000,
73+
),
74+
] = 10
75+
5976
html: Annotated[
6077
ConStr(
6178
max_length=1048576,

Tekst-API/tekst/platform.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,16 +168,21 @@ async def get_segments(
168168
)
169169
)
170170
if not head_projection:
171-
return await ClientSegmentDocument.find(
172-
*system_segments_queries,
173-
*(await _get_segment_restriction_queries(user)),
174-
).to_list()
171+
return (
172+
await ClientSegmentDocument.find(
173+
*system_segments_queries,
174+
*(await _get_segment_restriction_queries(user)),
175+
)
176+
.sort(+ClientSegmentDocument.sort_order)
177+
.to_list()
178+
)
175179
else:
176180
return (
177181
await ClientSegmentDocument.find(
178182
*system_segments_queries,
179183
*(await _get_segment_restriction_queries(user)),
180184
)
185+
.sort(+ClientSegmentDocument.sort_order)
181186
.project(ClientSegmentHead)
182187
.to_list()
183188
)

Tekst-Web/src/api/schema.d.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2432,6 +2432,12 @@ export interface components {
24322432
* @description Title of this segment
24332433
*/
24342434
title: string;
2435+
/**
2436+
* Sortorder
2437+
* @description Sort order for displaying this segment among others (only relevant for non-system segments aka. info pages!)
2438+
* @default 10
2439+
*/
2440+
sortOrder: number;
24352441
/**
24362442
* Html
24372443
* @description HTML content of this segment
@@ -2484,6 +2490,12 @@ export interface components {
24842490
* @description Title of this segment
24852491
*/
24862492
title: string;
2493+
/**
2494+
* Sortorder
2495+
* @description Sort order for displaying this segment among others (only relevant for non-system segments aka. info pages!)
2496+
* @default 10
2497+
*/
2498+
sortOrder: number;
24872499
/**
24882500
* Html
24892501
* @description HTML content of this segment
@@ -2516,6 +2528,11 @@ export interface components {
25162528
* @description Title of this segment
25172529
*/
25182530
title?: string;
2531+
/**
2532+
* Sortorder
2533+
* @description Sort order for displaying this segment among others (only relevant for non-system segments aka. info pages!)
2534+
*/
2535+
sortOrder?: number;
25192536
/**
25202537
* Html
25212538
* @description HTML content of this segment

Tekst-Web/src/forms/formRules.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -273,23 +273,6 @@ export const resourceSettingsFormRules: Record<string, FormItemRule[]> = {
273273
};
274274

275275
export const commonResourceConfigFormRules: Record<string, FormItemRule[]> = {
276-
sortOrder: [
277-
{
278-
required: true,
279-
type: 'number',
280-
message: () =>
281-
$t('forms.rulesFeedback.isRequired', {
282-
x: $t('common.sortOrder'),
283-
}),
284-
trigger: 'blur',
285-
},
286-
{
287-
validator: (_: FormItemRule, value: number) =>
288-
Number.isInteger(value) && value >= 0 && value <= 1000,
289-
message: '0-1000',
290-
trigger: 'blur',
291-
},
292-
],
293276
itemName: [requiredStringRule(() => $t('common.name')), minMaxCharsRule(1, 32, 'blur')],
294277
itemGroupNameRequired: [
295278
requiredStringRule(() => $t('common.group')),

Tekst-Web/src/forms/resources/config/GeneralResourceConfigFormItems.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { type AnyResourceRead, type GeneralResourceConfig, resourceTypes } from
33
import FormSection from '@/components/FormSection.vue';
44
import HelpButtonWidget from '@/components/HelpButtonWidget.vue';
55
import LabeledSwitch from '@/components/LabeledSwitch.vue';
6-
import { commonResourceConfigFormRules } from '@/forms/formRules';
76
import { $t } from '@/i18n';
87
import { useStateStore } from '@/stores';
98
import { pickTranslation } from '@/utils';
@@ -113,7 +112,7 @@ function renderCCMark(value: number) {
113112
</n-form-item>
114113

115114
<!-- SORT ORDER -->
116-
<n-form-item path="config.general.sortOrder" :rule="commonResourceConfigFormRules.sortOrder">
115+
<n-form-item path="config.general.sortOrder">
117116
<template #label>
118117
<n-flex align="center" :wrap="false">
119118
{{ $t('common.sortOrder') }}

Tekst-Web/src/views/admin/AdminSystemSegmentsView.vue

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
NFormItem,
2222
NIcon,
2323
NInput,
24+
NInputNumber,
2425
NSelect,
2526
useDialog,
2627
type FormInst,
@@ -328,6 +329,7 @@ watch(
328329
@keydown.enter.prevent
329330
/>
330331
</n-form-item>
332+
331333
<!-- KEY -->
332334
<n-form-item v-if="segmentType === 'info'" path="key" :label="$t('common.key')">
333335
<n-input
@@ -345,6 +347,7 @@ watch(
345347
@keydown.enter.prevent
346348
/>
347349
</n-form-item>
350+
348351
<!-- LOCALE -->
349352
<n-form-item path="locale" :label="$t('common.language')">
350353
<n-select
@@ -356,6 +359,7 @@ watch(
356359
@keydown.enter.prevent
357360
/>
358361
</n-form-item>
362+
359363
<!-- RESTRICTION -->
360364
<n-form-item path="restriction" :label="$t('admin.segments.restriction.showTo')" required>
361365
<n-select
@@ -379,6 +383,17 @@ watch(
379383
@keydown.enter.prevent
380384
/>
381385
</n-form-item>
386+
387+
<!-- SORT ORDER -->
388+
<n-form-item v-if="segmentType === 'info'" path="sortOrder" :label="$t('common.sortOrder')">
389+
<n-input-number
390+
v-model:value="segmentModel.sortOrder"
391+
:min="0"
392+
:max="1000"
393+
style="width: 100%"
394+
/>
395+
</n-form-item>
396+
382397
<!-- HTML -->
383398
<n-form-item path="html" :label="$t('common.content')">
384399
<html-editor

0 commit comments

Comments
 (0)