Skip to content

Commit e17ae50

Browse files
Applying changes from pull request gotify#804 to the updated master branch
1 parent 4bc42d2 commit e17ae50

File tree

9 files changed

+52
-10
lines changed

9 files changed

+52
-10
lines changed

api/application.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ type ApplicationParams struct {
4848
//
4949
// example: 5
5050
DefaultPriority int `form:"defaultPriority" query:"defaultPriority" json:"defaultPriority"`
51+
// The order in which this application should appear in the UI. Defaults to 0.
52+
//
53+
// example: 7
54+
SortOrder int `form:"sortOrder" query:"sortOrder" json:"sortOrder"`
5155
}
5256

5357
// CreateApplication creates an application and returns the access token.
@@ -90,6 +94,7 @@ func (a *ApplicationAPI) CreateApplication(ctx *gin.Context) {
9094
Name: applicationParams.Name,
9195
Description: applicationParams.Description,
9296
DefaultPriority: applicationParams.DefaultPriority,
97+
SortOrder: applicationParams.SortOrder,
9398
Token: auth.GenerateNotExistingToken(generateApplicationToken, a.applicationExists),
9499
UserID: auth.GetUserID(ctx),
95100
Internal: false,
@@ -251,6 +256,7 @@ func (a *ApplicationAPI) UpdateApplication(ctx *gin.Context) {
251256
app.Description = applicationParams.Description
252257
app.Name = applicationParams.Name
253258
app.DefaultPriority = applicationParams.DefaultPriority
259+
app.SortOrder = applicationParams.SortOrder
254260

255261
if success := successOrAbort(ctx, 500, a.DB.UpdateApplication(app)); !success {
256262
return

api/application_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ func (s *ApplicationSuite) Test_ensureApplicationHasCorrectJsonRepresentation()
9191
Image: "asd",
9292
Internal: true,
9393
LastUsed: nil,
94+
SortOrder: 7,
9495
}
95-
test.JSONEquals(s.T(), actual, `{"id":1,"token":"Aasdasfgeeg","name":"myapp","description":"mydesc", "image": "asd", "internal":true, "defaultPriority":0, "lastUsed":null}`)
96+
test.JSONEquals(s.T(), actual, `{"id":1,"token":"Aasdasfgeeg","name":"myapp","description":"mydesc", "image": "asd", "internal":true, "defaultPriority":0, "lastUsed":null, "sortOrder":7}`)
9697
}
9798

9899
func (s *ApplicationSuite) Test_CreateApplication_expectBadRequestOnEmptyName() {

database/application.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func (d *GormDatabase) DeleteApplicationByID(id uint) error {
4747
// GetApplicationsByUser returns all applications from a user.
4848
func (d *GormDatabase) GetApplicationsByUser(userID uint) ([]*model.Application, error) {
4949
var apps []*model.Application
50-
err := d.DB.Where("user_id = ?", userID).Order("id ASC").Find(&apps).Error
50+
err := d.DB.Where("user_id = ?", userID).Order("sort_order ASC").Find(&apps).Error
5151
if err == gorm.ErrRecordNotFound {
5252
err = nil
5353
}

model/application.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,8 @@ type Application struct {
5454
// read only: true
5555
// example: 2019-01-01T00:00:00Z
5656
LastUsed *time.Time `json:"lastUsed"`
57+
// The order in which the application should appear in the UI.
58+
//
59+
// example: 7
60+
SortOrder int `json:"sortOrder" query:"sortOrder" form: "sortOrder"`
5761
}

ui/src/application/AddApplicationDialog.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,18 @@ import React, {useState} from 'react';
1111

1212
interface IProps {
1313
fClose: VoidFunction;
14-
fOnSubmit: (name: string, description: string, defaultPriority: number) => Promise<void>;
14+
fOnSubmit: (name: string, description: string, defaultPriority: number, sortOrder: number) => Promise<void>;
1515
}
1616

1717
export const AddApplicationDialog = ({fClose, fOnSubmit}: IProps) => {
1818
const [name, setName] = useState('');
1919
const [description, setDescription] = useState('');
2020
const [defaultPriority, setDefaultPriority] = useState(0);
21+
const [sortOrder, setSortOrder] = useState(0);
2122

2223
const submitEnabled = name.length !== 0;
2324
const submitAndClose = async () => {
24-
await fOnSubmit(name, description, defaultPriority);
25+
await fOnSubmit(name, description, defaultPriority, sortOrder);
2526
fClose();
2627
};
2728

@@ -57,6 +58,14 @@ export const AddApplicationDialog = ({fClose, fOnSubmit}: IProps) => {
5758
onChange={(value) => setDefaultPriority(value)}
5859
fullWidth
5960
/>
61+
<NumberField
62+
margin="dense"
63+
className="sortOrder"
64+
label="Sort Order"
65+
value={sortOrder}
66+
onChange={(value) => setSortOrder(value)}
67+
fullWidth
68+
/>
6069
</DialogContent>
6170
<DialogActions>
6271
<Button onClick={fClose}>Cancel</Button>

ui/src/application/AppStore.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@ export class AppStore extends BaseStore<IApplication> {
4343
id: number,
4444
name: string,
4545
description: string,
46-
defaultPriority: number
46+
defaultPriority: number,
47+
sortOrder: number
4748
): Promise<void> => {
4849
await axios.put(`${config.get('url')}application/${id}`, {
4950
name,
5051
description,
5152
defaultPriority,
53+
sortOrder,
5254
});
5355
await this.refresh();
5456
this.snack('Application updated');
@@ -57,12 +59,14 @@ export class AppStore extends BaseStore<IApplication> {
5759
public create = async (
5860
name: string,
5961
description: string,
60-
defaultPriority: number
62+
defaultPriority: number,
63+
sortOrder: number
6164
): Promise<void> => {
6265
await axios.post(`${config.get('url')}application`, {
6366
name,
6467
description,
6568
defaultPriority,
69+
sortOrder,
6670
});
6771
await this.refresh();
6872
this.snack('Application created');

ui/src/application/Applications.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ const Applications = observer(() => {
7777
<TableCell>Token</TableCell>
7878
<TableCell>Description</TableCell>
7979
<TableCell>Priority</TableCell>
80+
<TableCell>Sort Order</TableCell>
8081
<TableCell>Last Used</TableCell>
8182
<TableCell />
8283
<TableCell />
@@ -88,6 +89,7 @@ const Applications = observer(() => {
8889
key={app.id}
8990
description={app.description}
9091
defaultPriority={app.defaultPriority}
92+
sortOrder={app.sortOrder}
9193
image={app.image}
9294
name={app.name}
9395
value={app.token}
@@ -117,12 +119,13 @@ const Applications = observer(() => {
117119
{toUpdateApp != null && (
118120
<UpdateApplicationDialog
119121
fClose={() => setToUpdateApp(undefined)}
120-
fOnSubmit={(name, description, defaultPriority) =>
121-
appStore.update(toUpdateApp.id, name, description, defaultPriority)
122+
fOnSubmit={(name, description, defaultPriority, sortOrder) =>
123+
appStore.update(toUpdateApp.id, name, description, defaultPriority, sortOrder)
122124
}
123125
initialDescription={toUpdateApp?.description}
124126
initialName={toUpdateApp?.name}
125127
initialDefaultPriority={toUpdateApp?.defaultPriority}
128+
initialSortOrder={appStore.getByID(toUpdateApp.id).sortOrder}
126129
/>
127130
)}
128131
{toDeleteApp != null && (
@@ -143,6 +146,7 @@ interface IRowProps {
143146
noDelete: boolean;
144147
description: string;
145148
defaultPriority: number;
149+
sortOrder: number;
146150
lastUsed: string | null;
147151
fUpload: VoidFunction;
148152
image: string;
@@ -156,6 +160,7 @@ const Row = ({
156160
noDelete,
157161
description,
158162
defaultPriority,
163+
sortOrder,
159164
lastUsed,
160165
fDelete,
161166
fUpload,
@@ -178,6 +183,7 @@ const Row = ({
178183
</TableCell>
179184
<TableCell>{description}</TableCell>
180185
<TableCell>{defaultPriority}</TableCell>
186+
<TableCell>{sortOrder}</TableCell>
181187
<TableCell>
182188
<LastUsedCell lastUsed={lastUsed} />
183189
</TableCell>

ui/src/application/UpdateApplicationDialog.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,29 @@ import React, {useState} from 'react';
1111

1212
interface IProps {
1313
fClose: VoidFunction;
14-
fOnSubmit: (name: string, description: string, defaultPriority: number) => Promise<void>;
14+
fOnSubmit: (name: string, description: string, defaultPriority: number, sortOrder: number) => Promise<void>;
1515
initialName: string;
1616
initialDescription: string;
1717
initialDefaultPriority: number;
18+
initialSortOrder: number;
1819
}
1920

2021
export const UpdateApplicationDialog = ({
2122
initialName,
2223
initialDescription,
2324
initialDefaultPriority,
25+
initialSortOrder,
2426
fClose,
2527
fOnSubmit,
2628
}: IProps) => {
2729
const [name, setName] = useState(initialName);
2830
const [description, setDescription] = useState(initialDescription);
2931
const [defaultPriority, setDefaultPriority] = useState(initialDefaultPriority);
32+
const [sortOrder, setSortOrder] = useState(initialSortOrder);
3033

3134
const submitEnabled = name.length !== 0;
3235
const submitAndClose = async () => {
33-
await fOnSubmit(name, description, defaultPriority);
36+
await fOnSubmit(name, description, defaultPriority, sortOrder);
3437
fClose();
3538
};
3639

@@ -66,6 +69,14 @@ export const UpdateApplicationDialog = ({
6669
onChange={(e) => setDefaultPriority(e)}
6770
fullWidth
6871
/>
72+
<NumberField
73+
margin="dense"
74+
className="sortOrder"
75+
label="Sort Order"
76+
value={sortOrder}
77+
onChange={(e) => setSortOrder(e)}
78+
fullWidth
79+
/>
6980
</DialogContent>
7081
<DialogActions>
7182
<Button onClick={fClose}>Cancel</Button>

ui/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface IApplication {
66
image: string;
77
internal: boolean;
88
defaultPriority: number;
9+
sortOrder: number;
910
lastUsed: string | null;
1011
}
1112

0 commit comments

Comments
 (0)