Skip to content

Commit 8706386

Browse files
authored
ui(post-list): enrich post metadata (#137)
1 parent 9cafe1d commit 8706386

File tree

4 files changed

+78
-7
lines changed

4 files changed

+78
-7
lines changed

src/models/post.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class Post {
2727
isPinned = false;
2828
isPublished = false;
2929
isUpdateDateAdded = false;
30-
password = '';
30+
password?: string | null = '';
3131
postBody = '';
3232
postType: PostType = PostType.blogPost;
3333
accessPermission: AccessPermission = 0;
@@ -88,4 +88,16 @@ export enum AccessPermission {
8888
undeclared = 0,
8989
authenticated = 1 << 3,
9090
owner = 1 << 28,
91+
private = 1 << 27,
92+
}
93+
94+
export function formatAccessPermission(value: AccessPermission) {
95+
switch (value) {
96+
case AccessPermission.undeclared:
97+
return '所有人';
98+
case AccessPermission.authenticated:
99+
return '登录用户';
100+
default:
101+
return '只有我';
102+
}
91103
}

src/tree-view-providers/models/post-metadata.ts

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import format from 'date-fns/format';
44
import formatDistanceStrict from 'date-fns/formatDistanceStrict';
55
import zhCN from 'date-fns/locale/zh-CN';
66
import { TreeItem, TreeItemCollapsibleState, ThemeIcon } from 'vscode';
7-
import { Post } from '../../models/post';
7+
import { AccessPermission, Post, formatAccessPermission } from '../../models/post';
88
import { PostEditDto } from '../../models/post-edit-dto';
99
import { postCategoryService } from '../../services/post-category.service';
1010
import { postService } from '../../services/post.service';
@@ -17,6 +17,8 @@ export enum RootPostMetadataType {
1717
tagEntry = 'tagEntry',
1818
updateDate = 'updateDate',
1919
createDate = 'createDate',
20+
publishStatus = 'publishStatus',
21+
accessPermission = 'accessPermission',
2022
}
2123

2224
const rootMetadataMap = (parsedPost: Post, postEditDto: PostEditDto | undefined) =>
@@ -26,6 +28,8 @@ const rootMetadataMap = (parsedPost: Post, postEditDto: PostEditDto | undefined)
2628
() => (parsedPost.hasUpdates ? new PostUpdatedDateMetadata(parsedPost) : null),
2729
],
2830
[RootPostMetadataType.createDate, () => new PostCreatedDateMetadata(parsedPost)],
31+
[RootPostMetadataType.publishStatus, () => new PostPublishStatusMetadata(parsedPost)],
32+
[RootPostMetadataType.accessPermission, () => new PostAccessPermissionMetadata(parsedPost)],
2933
[
3034
RootPostMetadataType.categoryEntry,
3135
() =>
@@ -206,3 +210,58 @@ export class PostUpdatedDateMetadata extends PostDateMetadata {
206210
return differenceInSeconds(dateUpdated ?? now, datePublished ?? now) > 0;
207211
}
208212
}
213+
214+
export class PostAccessPermissionMetadata extends PostMetadata {
215+
constructor(public readonly parent: Post) {
216+
super(parent);
217+
}
218+
219+
static parseIcon(accessPermission: AccessPermission, requirePassword: boolean) {
220+
if (requirePassword) return new ThemeIcon('key');
221+
222+
switch (accessPermission) {
223+
case AccessPermission.undeclared:
224+
return new ThemeIcon('globe');
225+
case AccessPermission.authenticated:
226+
return new ThemeIcon('public-ports-view-icon');
227+
default:
228+
return new ThemeIcon('private-ports-view-icon');
229+
}
230+
}
231+
232+
toTreeItem(): Promise<TreeItem> {
233+
const { password } = this.parent;
234+
const isPasswordRequired = password != null && password.length > 0;
235+
return Promise.resolve(
236+
Object.assign<TreeItem, Partial<TreeItem>>(
237+
new TreeItem(
238+
`访问权限: ${formatAccessPermission(this.parent.accessPermission)}` +
239+
(isPasswordRequired ? '(需密码)' : '')
240+
),
241+
{
242+
iconPath: PostAccessPermissionMetadata.parseIcon(this.parent.accessPermission, isPasswordRequired),
243+
}
244+
)
245+
);
246+
}
247+
}
248+
249+
export class PostPublishStatusMetadata extends PostMetadata {
250+
constructor(public readonly parent: Post) {
251+
super(parent);
252+
}
253+
254+
toTreeItem(): Promise<TreeItem> {
255+
const {
256+
parent: { isPublished, isDraft },
257+
} = this;
258+
return Promise.resolve(
259+
Object.assign<TreeItem, Partial<TreeItem>>(
260+
new TreeItem(isPublished ? '已发布' : '未发布' + (isDraft ? '(草稿)' : '')),
261+
{
262+
iconPath: new ThemeIcon(isDraft ? 'issue-draft' : isPublished ? 'issue-closed' : 'circle-slash'),
263+
}
264+
)
265+
);
266+
}
267+
}

ui/post-configuration/components/AccessPermissionSelector.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ChoiceGroup, IChoiceGroupOption, Label, Stack } from '@fluentui/react';
2-
import { AccessPermission } from '../../../src/models/post';
2+
import { AccessPermission, formatAccessPermission } from '../../../src/models/post';
33
import React from 'react';
44

55
export interface IAccessPermissionSelectorProps {
@@ -15,18 +15,18 @@ export class AccessPermissionSelector extends React.Component<
1515
> {
1616
private options: IChoiceGroupOption[] = [
1717
{
18-
text: '所有人',
18+
text: formatAccessPermission(AccessPermission.undeclared),
1919
value: AccessPermission.undeclared,
2020
key: AccessPermission.undeclared.toString(),
2121
},
2222
{
23-
text: '登录用户',
23+
text: formatAccessPermission(AccessPermission.authenticated),
2424
value: AccessPermission.authenticated,
2525
key: AccessPermission.authenticated.toString(),
2626
},
2727
{
2828
text: '只有我',
29-
value: AccessPermission.owner,
29+
value: formatAccessPermission(AccessPermission.owner),
3030
key: AccessPermission.owner.toString(),
3131
},
3232
];

ui/post-configuration/components/PostForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export class PostForm extends React.Component<IPostFormProps, IPostFormState> {
9191
/>
9292
<PasswordInput
9393
onChange={value => this.setState({ password: value })}
94-
password={this.state.password}
94+
password={this.state.password ?? ''}
9595
/>
9696
<InputSummary
9797
summary={this.state.description}

0 commit comments

Comments
 (0)