diff --git a/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue b/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue index 66dc0a1..382374a 100644 --- a/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue +++ b/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue @@ -15,6 +15,7 @@ import AdminReviewPage from './admin/AdminReviewPage.vue' import AdminServersPage from './admin/AdminServersPage.vue' import AdminSummaryPage from './admin/AdminSummaryPage.vue' import AdminUsersPage from './admin/AdminUsersPage.vue' +import AdminWikiPage from './admin/AdminWikiPage.vue' const emit = defineEmits<{ (e: 'back'): void }>() @@ -181,6 +182,7 @@ const current = ref('summary') +

{{ current }}

diff --git a/apps/app-frontend/src/components/ui/skin-site/admin/AdminWikiPage.vue b/apps/app-frontend/src/components/ui/skin-site/admin/AdminWikiPage.vue new file mode 100644 index 0000000..6e1abe7 --- /dev/null +++ b/apps/app-frontend/src/components/ui/skin-site/admin/AdminWikiPage.vue @@ -0,0 +1,512 @@ + + diff --git a/apps/app-frontend/src/helpers/skin-site-api.ts b/apps/app-frontend/src/helpers/skin-site-api.ts index 21fd358..4bc126b 100644 --- a/apps/app-frontend/src/helpers/skin-site-api.ts +++ b/apps/app-frontend/src/helpers/skin-site-api.ts @@ -1699,3 +1699,93 @@ export function skinSiteActivateModRuntime( export function skinSiteDeleteModRuntime(id: number): Promise> { return skinSiteRequest('runtime/admin/' + id, { method: 'DELETE', type: 'mod' }) } + +export type SkinSiteWikiReadPolicy = 'PUBLIC' | 'MEMBER' +export type SkinSiteWikiEditPolicy = 'MEMBER' | 'WEB_ADMIN' + +export interface SkinSiteWikiPageDetail { + title: string + revisionId: number + source: string + nodes: unknown[] + categories: string[] + updatedAt: number + authorName: string + summary: string + readPolicy: SkinSiteWikiReadPolicy + editPolicy: SkinSiteWikiEditPolicy + redirectTarget?: string | null + canEdit: boolean + watched: boolean +} + +export interface SkinSiteWikiSettings { + domains: string[] + homePage: string + defaultSkin: string + maxPageUtf8Bytes: number + maxAttachmentBytes: number +} + +export interface SkinSiteWikiAuditInfo { + id: number + actorName: string + action: string + target?: string | null + detail?: string | null + createdAt: number +} + +export interface SkinSiteWikiAuditPage { + items: SkinSiteWikiAuditInfo[] + nextCursor?: number | null +} + +export function skinSiteWikiPage(path: string): Promise> { + return skinSiteRequest('wiki/page?path=' + encodeURIComponent(path)) +} + +export function skinSiteWikiProtectPage( + path: string, + readPolicy: SkinSiteWikiReadPolicy, + editPolicy: SkinSiteWikiEditPolicy, +): Promise> { + return skinSiteRequest('wiki/admin/protect', { + method: 'POST', + body: { path, readPolicy, editPolicy }, + }) +} + +export function skinSiteWikiSetHomePage(path: string): Promise> { + return skinSiteRequest('wiki/admin/homepage', { method: 'POST', body: { path } }) +} + +export function skinSiteWikiSetPageDeleted( + path: string, + deleted: boolean, +): Promise> { + return skinSiteRequest('wiki/admin/delete', { + method: 'POST', + body: { path, deleted }, + }) +} + +export function skinSiteWikiAudit( + before?: number, +): Promise> { + const suffix = before ? '?before=' + before : '' + return skinSiteRequest('wiki/admin/audit' + suffix) +} + +export function skinSiteWikiSettings(): Promise> { + return skinSiteRequest('wiki/settings') +} + +export function skinSiteWikiUpdateSettings( + settings: Partial, +): Promise> { + return skinSiteRequest('wiki/admin/settings', { + method: 'POST', + body: settings, + }) +} diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index 382d7f2..9e29657 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -12109,5 +12109,37 @@ "app.skin-site.home.nav.map": {"message": "Server map"}, "app.skin-site.home.nav.map-desc": {"message": "Explore the live world map."}, "app.skin-site.home.nav.profile": {"message": "Profile"}, - "app.skin-site.home.nav.profile-desc": {"message": "Manage your account and textures."} + "app.skin-site.home.nav.profile-desc": {"message": "Manage your account and textures."}, + "app.skin-site.admin.wiki.title": {"message": "Wiki"}, + "app.skin-site.admin.wiki.tab-page": {"message": "Page"}, + "app.skin-site.admin.wiki.tab-audit": {"message": "Audit log"}, + "app.skin-site.admin.wiki.tab-settings": {"message": "Settings"}, + "app.skin-site.admin.wiki.loading": {"message": "Loading…"}, + "app.skin-site.admin.wiki.page-path": {"message": "Page path"}, + "app.skin-site.admin.wiki.load-page": {"message": "Load page"}, + "app.skin-site.admin.wiki.page-not-found": {"message": "Page not found."}, + "app.skin-site.admin.wiki.revision": {"message": "Revision"}, + "app.skin-site.admin.wiki.author": {"message": "Author"}, + "app.skin-site.admin.wiki.updated-at": {"message": "Updated"}, + "app.skin-site.admin.wiki.categories": {"message": "Categories"}, + "app.skin-site.admin.wiki.read-policy": {"message": "Read policy"}, + "app.skin-site.admin.wiki.edit-policy": {"message": "Edit policy"}, + "app.skin-site.admin.wiki.save-protect": {"message": "Save policies"}, + "app.skin-site.admin.wiki.protect-saved": {"message": "Page policies updated."}, + "app.skin-site.admin.wiki.set-home": {"message": "Set as home page"}, + "app.skin-site.admin.wiki.home-set": {"message": "Home page updated."}, + "app.skin-site.admin.wiki.set-deleted": {"message": "Mark as deleted"}, + "app.skin-site.admin.wiki.set-restored": {"message": "Restore page"}, + "app.skin-site.admin.wiki.deleted-updated": {"message": "Page deletion state updated."}, + "app.skin-site.admin.wiki.audit-empty": {"message": "No audit entries."}, + "app.skin-site.admin.wiki.audit-target": {"message": "Target"}, + "app.skin-site.admin.wiki.load-more": {"message": "Load more"}, + "app.skin-site.admin.wiki.settings-hint": {"message": "Comma separated domains."}, + "app.skin-site.admin.wiki.domains": {"message": "Domains"}, + "app.skin-site.admin.wiki.home-page": {"message": "Home page"}, + "app.skin-site.admin.wiki.default-skin": {"message": "Default skin"}, + "app.skin-site.admin.wiki.max-page-bytes": {"message": "Max page bytes"}, + "app.skin-site.admin.wiki.max-attachment-bytes": {"message": "Max attachment bytes"}, + "app.skin-site.admin.wiki.save-settings": {"message": "Save settings"}, + "app.skin-site.admin.wiki.settings-saved": {"message": "Settings saved."} } diff --git a/apps/app-frontend/src/locales/zh-CN/index.json b/apps/app-frontend/src/locales/zh-CN/index.json index 5c5adbf..2dac68e 100644 --- a/apps/app-frontend/src/locales/zh-CN/index.json +++ b/apps/app-frontend/src/locales/zh-CN/index.json @@ -11940,5 +11940,37 @@ "app.skin-site.home.nav.map": {"message": "服务器地图"}, "app.skin-site.home.nav.map-desc": {"message": "探索实时世界地图。"}, "app.skin-site.home.nav.profile": {"message": "个人资料"}, - "app.skin-site.home.nav.profile-desc": {"message": "管理你的账号与皮肤。"} + "app.skin-site.home.nav.profile-desc": {"message": "管理你的账号与皮肤。"}, + "app.skin-site.admin.wiki.title": {"message": "维基管理"}, + "app.skin-site.admin.wiki.tab-page": {"message": "页面"}, + "app.skin-site.admin.wiki.tab-audit": {"message": "审计日志"}, + "app.skin-site.admin.wiki.tab-settings": {"message": "设置"}, + "app.skin-site.admin.wiki.loading": {"message": "加载中…"}, + "app.skin-site.admin.wiki.page-path": {"message": "页面路径"}, + "app.skin-site.admin.wiki.load-page": {"message": "加载页面"}, + "app.skin-site.admin.wiki.page-not-found": {"message": "未找到该页面。"}, + "app.skin-site.admin.wiki.revision": {"message": "版本"}, + "app.skin-site.admin.wiki.author": {"message": "作者"}, + "app.skin-site.admin.wiki.updated-at": {"message": "更新时间"}, + "app.skin-site.admin.wiki.categories": {"message": "分类"}, + "app.skin-site.admin.wiki.read-policy": {"message": "阅读权限"}, + "app.skin-site.admin.wiki.edit-policy": {"message": "编辑权限"}, + "app.skin-site.admin.wiki.save-protect": {"message": "保存权限"}, + "app.skin-site.admin.wiki.protect-saved": {"message": "页面权限已更新。"}, + "app.skin-site.admin.wiki.set-home": {"message": "设为首页"}, + "app.skin-site.admin.wiki.home-set": {"message": "首页已更新。"}, + "app.skin-site.admin.wiki.set-deleted": {"message": "标记为已删除"}, + "app.skin-site.admin.wiki.set-restored": {"message": "恢复页面"}, + "app.skin-site.admin.wiki.deleted-updated": {"message": "页面删除状态已更新。"}, + "app.skin-site.admin.wiki.audit-empty": {"message": "没有审计记录。"}, + "app.skin-site.admin.wiki.audit-target": {"message": "目标"}, + "app.skin-site.admin.wiki.load-more": {"message": "加载更多"}, + "app.skin-site.admin.wiki.settings-hint": {"message": "以逗号分隔域名。"}, + "app.skin-site.admin.wiki.domains": {"message": "域名"}, + "app.skin-site.admin.wiki.home-page": {"message": "首页"}, + "app.skin-site.admin.wiki.default-skin": {"message": "默认皮肤"}, + "app.skin-site.admin.wiki.max-page-bytes": {"message": "页面最大字节数"}, + "app.skin-site.admin.wiki.max-attachment-bytes": {"message": "附件最大字节数"}, + "app.skin-site.admin.wiki.save-settings": {"message": "保存设置"}, + "app.skin-site.admin.wiki.settings-saved": {"message": "设置已保存。"} }