1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-07-10 00:05:42 +02:00

Server: Refactor table structure

This commit is contained in:
Laurent Cozic
2022-10-16 16:27:09 +01:00
parent 59a7dd6673
commit 8ea6d89d49
7 changed files with 155 additions and 135 deletions

View File

@ -3,7 +3,7 @@ import Router from '../../utils/Router';
import { RouteType } from '../../utils/types'; import { RouteType } from '../../utils/types';
import { AppContext } from '../../utils/types'; import { AppContext } from '../../utils/types';
import defaultView from '../../utils/defaultView'; import defaultView from '../../utils/defaultView';
import { makeTablePagination, makeTableView, Row, Table } from '../../utils/views/table'; import { makeTablePagination, makeTableView, Row, Table, renderUserIcon } from '../../utils/views/table';
import { PaginationOrderDir } from '../../models/utils/pagination'; import { PaginationOrderDir } from '../../models/utils/pagination';
import { formatDateTime } from '../../utils/time'; import { formatDateTime } from '../../utils/time';
import { adminEmailsUrl, adminEmailUrl, adminUserUrl } from '../../utils/urlUtils'; import { adminEmailsUrl, adminEmailUrl, adminUserUrl } from '../../utils/urlUtils';
@ -69,7 +69,8 @@ router.get('admin/emails', async (_path: SubPath, ctx: AppContext) => {
error = d.error ? d.error : '(Unspecified error)'; error = d.error ? d.error : '(Unspecified error)';
} }
const row: Row = [ const row: Row = {
items: [
{ {
value: d.id.toString(), value: d.id.toString(),
}, },
@ -84,9 +85,7 @@ router.get('admin/emails', async (_path: SubPath, ctx: AppContext) => {
{ {
value: d.recipient_id, value: d.recipient_id,
url: d.recipient_id ? adminUserUrl(d.recipient_id) : '', url: d.recipient_id ? adminUserUrl(d.recipient_id) : '',
render: (): string => { render: renderUserIcon,
return '<i class="fas fa-user-alt"></i>';
},
}, },
{ {
value: substrWithEllipsis(d.subject, 0, 32), value: substrWithEllipsis(d.subject, 0, 32),
@ -101,8 +100,8 @@ router.get('admin/emails', async (_path: SubPath, ctx: AppContext) => {
{ {
value: error, value: error,
}, },
],
]; };
return row; return row;
}), }),

View File

@ -64,7 +64,8 @@ router.get('admin/tasks', async (_path: SubPath, ctx: AppContext) => {
const state = taskService.taskState(taskId); const state = taskService.taskState(taskId);
const events = await taskService.taskLastEvents(taskId); const events = await taskService.taskLastEvents(taskId);
taskRows.push([ taskRows.push({
items: [
{ {
value: `checkbox_${taskId}`, value: `checkbox_${taskId}`,
checkbox: true, checkbox: true,
@ -88,7 +89,8 @@ router.get('admin/tasks', async (_path: SubPath, ctx: AppContext) => {
{ {
value: events.taskCompleted ? formatDateTime(events.taskCompleted.created_time) : '-', value: events.taskCompleted ? formatDateTime(events.taskCompleted.created_time) : '-',
}, },
]); ],
});
} }
const table: Table = { const table: Table = {

View File

@ -71,7 +71,8 @@ router.get('admin/user_deletions', async (_path: SubPath, ctx: AppContext) => {
rows: page.items.map(d => { rows: page.items.map(d => {
const isDone = d.end_time && d.success; const isDone = d.end_time && d.success;
const row: Row = [ const row: Row = {
items: [
{ {
value: `checkbox_${d.id}`, value: `checkbox_${d.id}`,
checkbox: true, checkbox: true,
@ -102,7 +103,8 @@ router.get('admin/user_deletions', async (_path: SubPath, ctx: AppContext) => {
{ {
value: d.error, value: d.error,
}, },
]; ],
};
return row; return row;
}), }),

View File

@ -41,7 +41,8 @@ router.get('changes', async (_path: SubPath, ctx: AppContext) => {
}, },
], ],
rows: paginatedChanges.items.map(change => { rows: paginatedChanges.items.map(change => {
const row: Row = [ const row: Row = {
items: [
{ {
value: change.item_name, value: change.item_name,
stretch: true, stretch: true,
@ -53,7 +54,8 @@ router.get('changes', async (_path: SubPath, ctx: AppContext) => {
{ {
value: formatDateTime(change.updated_time), value: formatDateTime(change.updated_time),
}, },
]; ],
};
return row; return row;
}), }),

View File

@ -44,7 +44,8 @@ router.get('items', async (_path: SubPath, ctx: AppContext) => {
}, },
], ],
rows: paginatedItems.items.map(item => { rows: paginatedItems.items.map(item => {
const row: Row = [ const row: Row = {
items: [
{ {
value: item.name, value: item.name,
stretch: true, stretch: true,
@ -59,7 +60,8 @@ router.get('items', async (_path: SubPath, ctx: AppContext) => {
{ {
value: formatDateTime(item.updated_time), value: formatDateTime(item.updated_time),
}, },
]; ],
};
return row; return row;
}), }),

View File

@ -47,7 +47,10 @@ interface RowItem {
render?: RowItemRenderCallback; render?: RowItemRenderCallback;
} }
export type Row = RowItem[]; export interface Row {
classNames?: string[];
items: RowItem[];
}
interface RowItemView { interface RowItemView {
value: string; value: string;
@ -58,7 +61,10 @@ interface RowItemView {
hint: string; hint: string;
} }
type RowView = RowItemView[]; interface RowView {
classNames: string[];
items: RowItemView[];
}
export interface Table { export interface Table {
headers: Header[]; headers: Header[];
@ -97,7 +103,9 @@ function makeHeaderView(header: Header, parentBaseUrl: string, baseUrlQuery: Pag
} }
function makeRowView(row: Row): RowView { function makeRowView(row: Row): RowView {
return row.map(rowItem => { return {
classNames: row.classNames,
items: row.items.map(rowItem => {
return { return {
value: rowItem.value, value: rowItem.value,
valueHtml: rowItem.render ? rowItem.render() : '', valueHtml: rowItem.render ? rowItem.render() : '',
@ -106,7 +114,8 @@ function makeRowView(row: Row): RowView {
checkbox: rowItem.checkbox, checkbox: rowItem.checkbox,
hint: rowItem.hint, hint: rowItem.hint,
}; };
}); }),
};
} }
export function makeTableView(table: Table): TableView { export function makeTableView(table: Table): TableView {
@ -132,3 +141,7 @@ export function makeTableView(table: Table): TableView {
export function tablePartials(): string[] { export function tablePartials(): string[] {
return ['pagination', 'table', 'tableHeader', 'tableRowItem']; return ['pagination', 'table', 'tableHeader', 'tableRowItem'];
} }
export const renderUserIcon = () => {
return '<i class="fas fa-user-alt"></i>';
};

View File

@ -9,10 +9,10 @@
</thead> </thead>
<tbody> <tbody>
{{#rows}} {{#rows}}
<tr> <tr class="{{#classNames}}{{.}} {{/classNames}}">
{{#.}} {{#items}}
{{>tableRowItem}} {{>tableRowItem}}
{{/.}} {{/items}}
</tr> </tr>
{{/rows}} {{/rows}}
</tbody> </tbody>