From 11349561d697b11df7bcaa3d57ed3498eb4dd3c5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 20 Apr 2021 23:22:59 +0900 Subject: Use FontAwesome as web font instead of vue component (#7469) * wip * wip * wip * wip * wip * wip * wip * wip * wip * Update yarn.lock * wip * wip --- src/client/scripts/get-user-menu.ts | 28 +++++------ src/client/scripts/hpml/index.ts | 22 +++------ src/client/scripts/hpml/lib.ts | 95 +++++++++++++++---------------------- src/client/scripts/search.ts | 3 +- src/client/scripts/select-file.ts | 7 ++- 5 files changed, 61 insertions(+), 94 deletions(-) (limited to 'src/client/scripts') diff --git a/src/client/scripts/get-user-menu.ts b/src/client/scripts/get-user-menu.ts index 0496e87502..ceb2bfe173 100644 --- a/src/client/scripts/get-user-menu.ts +++ b/src/client/scripts/get-user-menu.ts @@ -1,5 +1,3 @@ -import { faAt, faListUl, faEye, faEyeSlash, faBan, faPencilAlt, faComments, faUsers, faMicrophoneSlash, faPlug, faExclamationCircle, faInfoCircle } from '@fortawesome/free-solid-svg-icons'; -import { faSnowflake, faEnvelope } from '@fortawesome/free-regular-svg-icons'; import { i18n } from '@client/i18n'; import copyToClipboard from '@client/scripts/copy-to-clipboard'; import { host } from '@client/config'; @@ -121,62 +119,62 @@ export function getUserMenu(user) { } let menu = [{ - icon: faAt, + icon: 'fas fa-at', text: i18n.locale.copyUsername, action: () => { copyToClipboard(`@${user.username}@${user.host || host}`); } }, { - icon: faInfoCircle, + icon: 'fas fa-info-circle', text: i18n.locale.info, action: () => { os.pageWindow(`/user-info/${user.id}`); } }, { - icon: faEnvelope, + icon: 'fas fa-envelope', text: i18n.locale.sendMessage, action: () => { os.post({ specified: user }); } }, meId != user.id ? { type: 'link', - icon: faComments, + icon: 'fas fa-comments', text: i18n.locale.startMessaging, to: '/my/messaging/' + getAcct(user), } : undefined, null, { - icon: faListUl, + icon: 'fas fa-list-ul', text: i18n.locale.addToList, action: pushList }, meId != user.id ? { - icon: faUsers, + icon: 'fas fa-users', text: i18n.locale.inviteToGroup, action: inviteGroup } : undefined] as any; if ($i && meId != user.id) { menu = menu.concat([null, { - icon: user.isMuted ? faEye : faEyeSlash, + icon: user.isMuted ? 'fas fa-eye' : 'fas fa-eye-slash', text: user.isMuted ? i18n.locale.unmute : i18n.locale.mute, action: toggleMute }, { - icon: faBan, + icon: 'fas fa-ban', text: user.isBlocking ? i18n.locale.unblock : i18n.locale.block, action: toggleBlock }]); menu = menu.concat([null, { - icon: faExclamationCircle, + icon: 'fas fa-exclamation-circle', text: i18n.locale.reportAbuse, action: reportAbuse }]); if ($i && ($i.isAdmin || $i.isModerator)) { menu = menu.concat([null, { - icon: faMicrophoneSlash, + icon: 'fas fa-microphone-slash', text: user.isSilenced ? i18n.locale.unsilence : i18n.locale.silence, action: toggleSilence }, { - icon: faSnowflake, + icon: 'fas fa-snowflake', text: user.isSuspended ? i18n.locale.unsuspend : i18n.locale.suspend, action: toggleSuspend }]); @@ -185,7 +183,7 @@ export function getUserMenu(user) { if ($i && meId === user.id) { menu = menu.concat([null, { - icon: faPencilAlt, + icon: 'fas fa-pencil-alt', text: i18n.locale.editProfile, action: () => { router.push('/settings/profile'); @@ -195,7 +193,7 @@ export function getUserMenu(user) { if (userActions.length > 0) { menu = menu.concat([null, ...userActions.map(action => ({ - icon: faPlug, + icon: 'fas fa-plug', text: action.title, action: () => { action.handler(user); diff --git a/src/client/scripts/hpml/index.ts b/src/client/scripts/hpml/index.ts index 924cd32eb5..ac81eac2d9 100644 --- a/src/client/scripts/hpml/index.ts +++ b/src/client/scripts/hpml/index.ts @@ -3,14 +3,6 @@ */ import autobind from 'autobind-decorator'; -import { - faMagic, - faSquareRootAlt, - faAlignLeft, - faList, - faQuoteRight, - faSortNumericUp, -} from '@fortawesome/free-solid-svg-icons'; import { Hpml } from './evaluator'; import { funcDefs } from './lib'; @@ -22,13 +14,13 @@ export type Fn = { export type Type = 'string' | 'number' | 'boolean' | 'stringArray' | null; export const literalDefs: Record = { - text: { out: 'string', category: 'value', icon: faQuoteRight, }, - multiLineText: { out: 'string', category: 'value', icon: faAlignLeft, }, - textList: { out: 'stringArray', category: 'value', icon: faList, }, - number: { out: 'number', category: 'value', icon: faSortNumericUp, }, - ref: { out: null, category: 'value', icon: faMagic, }, - aiScriptVar: { out: null, category: 'value', icon: faMagic, }, - fn: { out: 'function', category: 'value', icon: faSquareRootAlt, }, + text: { out: 'string', category: 'value', icon: 'fas fa-quote-right', }, + multiLineText: { out: 'string', category: 'value', icon: 'fas fa-align-left', }, + textList: { out: 'stringArray', category: 'value', icon: 'fas fa-list', }, + number: { out: 'number', category: 'value', icon: 'fas fa-sort-numeric-up', }, + ref: { out: null, category: 'value', icon: 'fas fa-magic', }, + aiScriptVar: { out: null, category: 'value', icon: 'fas fa-magic', }, + fn: { out: 'function', category: 'value', icon: 'fas fa-square-root-alt', }, }; export const blockDefs = [ diff --git a/src/client/scripts/hpml/lib.ts b/src/client/scripts/hpml/lib.ts index 7454562184..150a04732f 100644 --- a/src/client/scripts/hpml/lib.ts +++ b/src/client/scripts/hpml/lib.ts @@ -6,27 +6,6 @@ import { Fn, HpmlScope } from '.'; import { Expr } from './expr'; import * as seedrandom from 'seedrandom'; -import { - faShareAlt, - faPlus, - faMinus, - faTimes, - faDivide, - faQuoteRight, - faEquals, - faGreaterThan, - faLessThan, - faGreaterThanEqual, - faLessThanEqual, - faNotEqual, - faDice, - faExchangeAlt, - faRecycle, - faIndent, - faCalculator, -} from '@fortawesome/free-solid-svg-icons'; -import { faFlag } from '@fortawesome/free-regular-svg-icons'; - // https://stackoverflow.com/questions/38493564/chart-area-background-color-chartjs Chart.pluginService.register({ beforeDraw: (chart, easing) => { @@ -148,43 +127,43 @@ export function initAiLib(hpml: Hpml) { } export const funcDefs: Record = { - if: { in: ['boolean', 0, 0], out: 0, category: 'flow', icon: faShareAlt, }, - for: { in: ['number', 'function'], out: null, category: 'flow', icon: faRecycle, }, - not: { in: ['boolean'], out: 'boolean', category: 'logical', icon: faFlag, }, - or: { in: ['boolean', 'boolean'], out: 'boolean', category: 'logical', icon: faFlag, }, - and: { in: ['boolean', 'boolean'], out: 'boolean', category: 'logical', icon: faFlag, }, - add: { in: ['number', 'number'], out: 'number', category: 'operation', icon: faPlus, }, - subtract: { in: ['number', 'number'], out: 'number', category: 'operation', icon: faMinus, }, - multiply: { in: ['number', 'number'], out: 'number', category: 'operation', icon: faTimes, }, - divide: { in: ['number', 'number'], out: 'number', category: 'operation', icon: faDivide, }, - mod: { in: ['number', 'number'], out: 'number', category: 'operation', icon: faDivide, }, - round: { in: ['number'], out: 'number', category: 'operation', icon: faCalculator, }, - eq: { in: [0, 0], out: 'boolean', category: 'comparison', icon: faEquals, }, - notEq: { in: [0, 0], out: 'boolean', category: 'comparison', icon: faNotEqual, }, - gt: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: faGreaterThan, }, - lt: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: faLessThan, }, - gtEq: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: faGreaterThanEqual, }, - ltEq: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: faLessThanEqual, }, - strLen: { in: ['string'], out: 'number', category: 'text', icon: faQuoteRight, }, - strPick: { in: ['string', 'number'], out: 'string', category: 'text', icon: faQuoteRight, }, - strReplace: { in: ['string', 'string', 'string'], out: 'string', category: 'text', icon: faQuoteRight, }, - strReverse: { in: ['string'], out: 'string', category: 'text', icon: faQuoteRight, }, - join: { in: ['stringArray', 'string'], out: 'string', category: 'text', icon: faQuoteRight, }, - stringToNumber: { in: ['string'], out: 'number', category: 'convert', icon: faExchangeAlt, }, - numberToString: { in: ['number'], out: 'string', category: 'convert', icon: faExchangeAlt, }, - splitStrByLine: { in: ['string'], out: 'stringArray', category: 'convert', icon: faExchangeAlt, }, - pick: { in: [null, 'number'], out: null, category: 'list', icon: faIndent, }, - listLen: { in: [null], out: 'number', category: 'list', icon: faIndent, }, - rannum: { in: ['number', 'number'], out: 'number', category: 'random', icon: faDice, }, - dailyRannum: { in: ['number', 'number'], out: 'number', category: 'random', icon: faDice, }, - seedRannum: { in: [null, 'number', 'number'], out: 'number', category: 'random', icon: faDice, }, - random: { in: ['number'], out: 'boolean', category: 'random', icon: faDice, }, - dailyRandom: { in: ['number'], out: 'boolean', category: 'random', icon: faDice, }, - seedRandom: { in: [null, 'number'], out: 'boolean', category: 'random', icon: faDice, }, - randomPick: { in: [0], out: 0, category: 'random', icon: faDice, }, - dailyRandomPick: { in: [0], out: 0, category: 'random', icon: faDice, }, - seedRandomPick: { in: [null, 0], out: 0, category: 'random', icon: faDice, }, - DRPWPM: { in: ['stringArray'], out: 'string', category: 'random', icon: faDice, }, // dailyRandomPickWithProbabilityMapping + if: { in: ['boolean', 0, 0], out: 0, category: 'flow', icon: 'fas fa-share-alt', }, + for: { in: ['number', 'function'], out: null, category: 'flow', icon: 'fas fa-recycle', }, + not: { in: ['boolean'], out: 'boolean', category: 'logical', icon: 'fas fa-flag', }, + or: { in: ['boolean', 'boolean'], out: 'boolean', category: 'logical', icon: 'fas fa-flag', }, + and: { in: ['boolean', 'boolean'], out: 'boolean', category: 'logical', icon: 'fas fa-flag', }, + add: { in: ['number', 'number'], out: 'number', category: 'operation', icon: 'fas fa-plus', }, + subtract: { in: ['number', 'number'], out: 'number', category: 'operation', icon: 'fas fa-minus', }, + multiply: { in: ['number', 'number'], out: 'number', category: 'operation', icon: 'fas fa-times', }, + divide: { in: ['number', 'number'], out: 'number', category: 'operation', icon: 'fas fa-divide', }, + mod: { in: ['number', 'number'], out: 'number', category: 'operation', icon: 'fas fa-divide', }, + round: { in: ['number'], out: 'number', category: 'operation', icon: 'fas fa-calculator', }, + eq: { in: [0, 0], out: 'boolean', category: 'comparison', icon: 'fas fa-equals', }, + notEq: { in: [0, 0], out: 'boolean', category: 'comparison', icon: 'fas fa-not-equal', }, + gt: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: 'fas fa-greater-than', }, + lt: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: 'fas fa-less-than', }, + gtEq: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: 'fas fa-greater-than-equal', }, + ltEq: { in: ['number', 'number'], out: 'boolean', category: 'comparison', icon: 'fas fa-less-than-equal', }, + strLen: { in: ['string'], out: 'number', category: 'text', icon: 'fas fa-quote-right', }, + strPick: { in: ['string', 'number'], out: 'string', category: 'text', icon: 'fas fa-quote-right', }, + strReplace: { in: ['string', 'string', 'string'], out: 'string', category: 'text', icon: 'fas fa-quote-right', }, + strReverse: { in: ['string'], out: 'string', category: 'text', icon: 'fas fa-quote-right', }, + join: { in: ['stringArray', 'string'], out: 'string', category: 'text', icon: 'fas fa-quote-right', }, + stringToNumber: { in: ['string'], out: 'number', category: 'convert', icon: 'fas fa-exchange-alt', }, + numberToString: { in: ['number'], out: 'string', category: 'convert', icon: 'fas fa-exchange-alt', }, + splitStrByLine: { in: ['string'], out: 'stringArray', category: 'convert', icon: 'fas fa-exchange-alt', }, + pick: { in: [null, 'number'], out: null, category: 'list', icon: 'fas fa-indent', }, + listLen: { in: [null], out: 'number', category: 'list', icon: 'fas fa-indent', }, + rannum: { in: ['number', 'number'], out: 'number', category: 'random', icon: 'fas fa-dice', }, + dailyRannum: { in: ['number', 'number'], out: 'number', category: 'random', icon: 'fas fa-dice', }, + seedRannum: { in: [null, 'number', 'number'], out: 'number', category: 'random', icon: 'fas fa-dice', }, + random: { in: ['number'], out: 'boolean', category: 'random', icon: 'fas fa-dice', }, + dailyRandom: { in: ['number'], out: 'boolean', category: 'random', icon: 'fas fa-dice', }, + seedRandom: { in: [null, 'number'], out: 'boolean', category: 'random', icon: 'fas fa-dice', }, + randomPick: { in: [0], out: 0, category: 'random', icon: 'fas fa-dice', }, + dailyRandomPick: { in: [0], out: 0, category: 'random', icon: 'fas fa-dice', }, + seedRandomPick: { in: [null, 0], out: 0, category: 'random', icon: 'fas fa-dice', }, + DRPWPM: { in: ['stringArray'], out: 'string', category: 'random', icon: 'fas fa-dice', }, // dailyRandomPickWithProbabilityMapping }; export function initHpmlLib(expr: Expr, scope: HpmlScope, randomSeed: string, visitor?: any) { diff --git a/src/client/scripts/search.ts b/src/client/scripts/search.ts index 829065534c..2221f5f279 100644 --- a/src/client/scripts/search.ts +++ b/src/client/scripts/search.ts @@ -1,4 +1,3 @@ -import { faHistory } from '@fortawesome/free-solid-svg-icons'; import * as os from '@client/os'; import { i18n } from '@client/i18n'; import { router } from '@client/router'; @@ -37,7 +36,7 @@ export async function search() { // TODO //v.$root.$emit('warp', date); os.dialog({ - icon: faHistory, + icon: 'fas fa-history', iconOnly: true, autoClose: true }); return; diff --git a/src/client/scripts/select-file.ts b/src/client/scripts/select-file.ts index 03ac863aa0..c193e7dc71 100644 --- a/src/client/scripts/select-file.ts +++ b/src/client/scripts/select-file.ts @@ -1,4 +1,3 @@ -import { faUpload, faCloud, faLink } from '@fortawesome/free-solid-svg-icons'; import * as os from '@client/os'; import { i18n } from '@client/i18n'; @@ -73,15 +72,15 @@ export function selectFile(src: any, label: string | null, multiple = false) { type: 'label' } : undefined, { text: i18n.locale.upload, - icon: faUpload, + icon: 'fas fa-upload', action: chooseFileFromPc }, { text: i18n.locale.fromDrive, - icon: faCloud, + icon: 'fas fa-cloud', action: chooseFileFromDrive }, { text: i18n.locale.fromUrl, - icon: faLink, + icon: 'fas fa-link', action: chooseFileFromUrl }], src); }); -- cgit v1.2.3-freya From 246693b8484b72048cb515b76aa5f094f5fdeb56 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 22 Apr 2021 22:29:33 +0900 Subject: インスタンス管理画面作り直し (#7473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip * wip * wip * wip --- locales/ja-JP.yml | 13 +- package.json | 2 +- src/client/components/captcha.vue | 4 +- src/client/components/form/base.vue | 2 + src/client/components/form/form.scss | 4 +- src/client/components/form/key-value-view.vue | 2 +- src/client/components/form/object-view.vue | 2 +- src/client/components/form/radios.vue | 3 + src/client/components/form/suspense.vue | 9 +- src/client/components/instance-stats.vue | 252 ++------- src/client/components/signup.vue | 2 +- src/client/components/tab.vue | 1 + src/client/components/ui/pagination.vue | 34 +- src/client/pages/instance/abuses.vue | 12 +- src/client/pages/instance/announcements.vue | 52 +- src/client/pages/instance/bot-protection.vue | 138 +++++ src/client/pages/instance/database.vue | 60 ++ src/client/pages/instance/email-settings.vue | 127 +++++ src/client/pages/instance/emojis.vue | 215 +++---- src/client/pages/instance/federation.vue | 113 ++-- src/client/pages/instance/file-dialog.vue | 4 +- src/client/pages/instance/files-settings.vue | 92 +++ src/client/pages/instance/files.vue | 8 + src/client/pages/instance/index.metrics.vue | 574 ------------------- src/client/pages/instance/index.vue | 356 +++++++----- src/client/pages/instance/instance-block.vue | 71 +++ src/client/pages/instance/integrations-discord.vue | 85 +++ src/client/pages/instance/integrations-github.vue | 85 +++ src/client/pages/instance/integrations-twitter.vue | 85 +++ src/client/pages/instance/integrations.vue | 73 +++ src/client/pages/instance/metrics.vue | 455 +++++++++++++++ src/client/pages/instance/object-storage.vue | 154 +++++ src/client/pages/instance/other-settings.vue | 68 +++ src/client/pages/instance/overview.vue | 131 +++++ src/client/pages/instance/proxy-account.vue | 86 +++ src/client/pages/instance/queue.chart.vue | 64 ++- src/client/pages/instance/queue.vue | 24 +- src/client/pages/instance/relays.vue | 50 +- src/client/pages/instance/security.vue | 77 +++ src/client/pages/instance/service-worker.vue | 84 +++ src/client/pages/instance/settings.vue | 625 +++------------------ src/client/pages/instance/user-dialog.vue | 230 -------- src/client/pages/instance/user.vue | 229 ++++++++ src/client/pages/instance/users.vue | 257 ++++----- src/client/pages/user-info.vue | 70 +-- src/client/pages/user/index.vue | 2 +- src/client/router.ts | 12 +- src/client/scripts/get-user-menu.ts | 8 +- src/client/scripts/lookup-user.ts | 37 ++ src/client/ui/_common_/sidebar.vue | 63 +-- src/client/ui/default.sidebar.vue | 63 +-- 51 files changed, 2985 insertions(+), 2284 deletions(-) create mode 100644 src/client/pages/instance/bot-protection.vue create mode 100644 src/client/pages/instance/database.vue create mode 100644 src/client/pages/instance/email-settings.vue create mode 100644 src/client/pages/instance/files-settings.vue delete mode 100644 src/client/pages/instance/index.metrics.vue create mode 100644 src/client/pages/instance/instance-block.vue create mode 100644 src/client/pages/instance/integrations-discord.vue create mode 100644 src/client/pages/instance/integrations-github.vue create mode 100644 src/client/pages/instance/integrations-twitter.vue create mode 100644 src/client/pages/instance/integrations.vue create mode 100644 src/client/pages/instance/metrics.vue create mode 100644 src/client/pages/instance/object-storage.vue create mode 100644 src/client/pages/instance/other-settings.vue create mode 100644 src/client/pages/instance/overview.vue create mode 100644 src/client/pages/instance/proxy-account.vue create mode 100644 src/client/pages/instance/security.vue create mode 100644 src/client/pages/instance/service-worker.vue delete mode 100644 src/client/pages/instance/user-dialog.vue create mode 100644 src/client/pages/instance/user.vue create mode 100644 src/client/scripts/lookup-user.ts (limited to 'src/client/scripts') diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 989edcda2d..b557f86436 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -183,7 +183,7 @@ clearQueueConfirmTitle: "キューをクリアしますか?" clearQueueConfirmText: "未配達の投稿は配送されなくなります。通常この操作を行う必要はありません。" clearCachedFiles: "キャッシュをクリア" clearCachedFilesConfirm: "キャッシュされたリモートファイルをすべて削除しますか?" -blockedInstances: "インスタンスブロック" +blockedInstances: "ブロックしたインスタンス" blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定します。ブロックされたインスタンスは、このインスタンスとやり取りできなくなります。" muteAndBlock: "ミュートとブロック" mutedUsers: "ミュートしたユーザー" @@ -349,7 +349,6 @@ antennaExcludeKeywords: "除外キーワード" antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります" notifyAntenna: "新しいノートを通知する" withFileAntenna: "ファイルが添付されたノートのみ" -serviceworker: "ServiceWorker" enableServiceworker: "ServiceWorkerを有効にする" antennaUsersDescription: "ユーザー名を改行で区切って指定します" caseSensitive: "大文字小文字を区別する" @@ -568,7 +567,7 @@ pluginTokenRequestedDescription: "このプラグインはここで設定した notificationType: "通知の種類" edit: "編集" useStarForReactionFallback: "リアクション絵文字が不明な場合、代わりに★を使う" -emailConfig: "メールサーバー設定" +emailServer: "メールサーバー" enableEmail: "メール配信機能を有効化する" emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います" email: "メール" @@ -728,6 +727,14 @@ hideOnlineStatusDescription: "オンライン状態を隠すと、検索など online: "オンライン" active: "アクティブ" offline: "オフライン" +notRecommended: "非推奨" +botProtection: "Bot防御" +instanceBlocking: "インスタンスブロック" +selectAccount: "アカウントを選択" +enabled: "有効" +disabled: "無効" +quickAction: "クイックアクション" +user: "ユーザー" _email: _follow: diff --git a/package.json b/package.json index 26aacae492..c6fd1a0227 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "12.78.0-beta.2", + "version": "12.78.0-beta.3", "codename": "indigo", "repository": { "type": "git", diff --git a/src/client/components/captcha.vue b/src/client/components/captcha.vue index 710fcd6169..26215df09d 100644 --- a/src/client/components/captcha.vue +++ b/src/client/components/captcha.vue @@ -18,7 +18,7 @@ type Captcha = { getResponse(id: string): string; }; -type CaptchaProvider = 'hcaptcha' | 'grecaptcha'; +type CaptchaProvider = 'hcaptcha' | 'recaptcha'; type CaptchaContainer = { readonly [_ in CaptchaProvider]?: Captcha; @@ -57,7 +57,7 @@ export default defineComponent({ src() { const endpoint = ({ hcaptcha: 'https://hcaptcha.com/1', - grecaptcha: 'https://www.recaptcha.net/recaptcha', + recaptcha: 'https://www.recaptcha.net/recaptcha', } as Record)[this.provider]; return `${typeof endpoint == 'string' ? endpoint : 'about:invalid'}/api.js?render=explicit`; diff --git a/src/client/components/form/base.vue b/src/client/components/form/base.vue index 34deb39465..132942d527 100644 --- a/src/client/components/form/base.vue +++ b/src/client/components/form/base.vue @@ -24,6 +24,8 @@ export default defineComponent({ --formXPadding: 32px; --formYPadding: 32px; + --formContentHMargin: 16px; + font-size: 95%; line-height: 1.3em; background: var(--bg); diff --git a/src/client/components/form/form.scss b/src/client/components/form/form.scss index 8c01fad727..05994ae650 100644 --- a/src/client/components/form/form.scss +++ b/src/client/components/form/form.scss @@ -30,7 +30,7 @@ top: var(--stickyTop, 0px); z-index: 2; margin: -8px calc(var(--formXPadding) * -1) 0 calc(var(--formXPadding) * -1); - padding: 8px calc(16px + var(--formXPadding)) 8px calc(16px + var(--formXPadding)); + padding: 8px calc(var(--formContentHMargin) + var(--formXPadding)) 8px calc(var(--formContentHMargin) + var(--formXPadding)); background: var(--X17); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); @@ -42,7 +42,7 @@ } ._formCaption { - padding: 8px 16px 0 16px; + padding: 8px var(--formContentHMargin) 0 var(--formContentHMargin); } ._formItem { diff --git a/src/client/components/form/key-value-view.vue b/src/client/components/form/key-value-view.vue index 85f4febef9..ca4c09867f 100644 --- a/src/client/components/form/key-value-view.vue +++ b/src/client/components/form/key-value-view.vue @@ -20,7 +20,7 @@ export default defineComponent({ .anocepby { display: flex; align-items: center; - padding: 14px 16px; + padding: 14px var(--formContentHMargin); > .key { margin-right: 12px; diff --git a/src/client/components/form/object-view.vue b/src/client/components/form/object-view.vue index cbd4186e56..59fb62b5e6 100644 --- a/src/client/components/form/object-view.vue +++ b/src/client/components/form/object-view.vue @@ -75,7 +75,7 @@ export default defineComponent({ max-width: 100%; min-height: 130px; margin: 0; - padding: 16px; + padding: 16px var(--formContentHMargin); box-sizing: border-box; font: inherit; font-weight: normal; diff --git a/src/client/components/form/radios.vue b/src/client/components/form/radios.vue index 3daa7e5bbd..4cfb7c247e 100644 --- a/src/client/components/form/radios.vue +++ b/src/client/components/form/radios.vue @@ -18,6 +18,9 @@ export default defineComponent({ } }, watch: { + modelValue() { + this.value = this.modelValue; + }, value() { this.$emit('update:modelValue', this.value); } diff --git a/src/client/components/form/suspense.vue b/src/client/components/form/suspense.vue index 6a8282733f..2a48faccb3 100644 --- a/src/client/components/form/suspense.vue +++ b/src/client/components/form/suspense.vue @@ -5,9 +5,9 @@ - +
- +
error! @@ -20,13 +20,8 @@ diff --git a/src/client/pages/instance/bot-protection.vue b/src/client/pages/instance/bot-protection.vue new file mode 100644 index 0000000000..449b8a233d --- /dev/null +++ b/src/client/pages/instance/bot-protection.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/client/pages/instance/database.vue b/src/client/pages/instance/database.vue new file mode 100644 index 0000000000..a41d61ce2b --- /dev/null +++ b/src/client/pages/instance/database.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/client/pages/instance/email-settings.vue b/src/client/pages/instance/email-settings.vue new file mode 100644 index 0000000000..9965a1420f --- /dev/null +++ b/src/client/pages/instance/email-settings.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/client/pages/instance/emojis.vue b/src/client/pages/instance/emojis.vue index 88bebb40e0..fd641703cb 100644 --- a/src/client/pages/instance/emojis.vue +++ b/src/client/pages/instance/emojis.vue @@ -1,50 +1,46 @@ @@ -67,6 +63,8 @@ export default defineComponent({ MkPagination, }, + emits: ['info'], + data() { return { [symbols.PAGE_INFO]: { @@ -99,6 +97,10 @@ export default defineComponent({ } }, + async mounted() { + this.$emit('info', this[symbols.PAGE_INFO]); + }, + methods: { async add(e) { const files = await selectFile(e.currentTarget || e.target, null, true); @@ -150,85 +152,86 @@ export default defineComponent({ diff --git a/src/client/pages/instance/index.vue b/src/client/pages/instance/index.vue index f0240718aa..10406f339b 100644 --- a/src/client/pages/instance/index.vue +++ b/src/client/pages/instance/index.vue @@ -1,171 +1,239 @@ - bytes, + diff --git a/src/client/pages/instance/instance-block.vue b/src/client/pages/instance/instance-block.vue new file mode 100644 index 0000000000..ed5740f339 --- /dev/null +++ b/src/client/pages/instance/instance-block.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/client/pages/instance/integrations-discord.vue b/src/client/pages/instance/integrations-discord.vue new file mode 100644 index 0000000000..c7508918f8 --- /dev/null +++ b/src/client/pages/instance/integrations-discord.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/client/pages/instance/integrations-github.vue b/src/client/pages/instance/integrations-github.vue new file mode 100644 index 0000000000..16586b15b4 --- /dev/null +++ b/src/client/pages/instance/integrations-github.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/client/pages/instance/integrations-twitter.vue b/src/client/pages/instance/integrations-twitter.vue new file mode 100644 index 0000000000..b08b7f40a5 --- /dev/null +++ b/src/client/pages/instance/integrations-twitter.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/client/pages/instance/integrations.vue b/src/client/pages/instance/integrations.vue new file mode 100644 index 0000000000..7debedc367 --- /dev/null +++ b/src/client/pages/instance/integrations.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/client/pages/instance/metrics.vue b/src/client/pages/instance/metrics.vue new file mode 100644 index 0000000000..18cfe5eee2 --- /dev/null +++ b/src/client/pages/instance/metrics.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/src/client/pages/instance/object-storage.vue b/src/client/pages/instance/object-storage.vue new file mode 100644 index 0000000000..814aeb6e48 --- /dev/null +++ b/src/client/pages/instance/object-storage.vue @@ -0,0 +1,154 @@ + + + diff --git a/src/client/pages/instance/other-settings.vue b/src/client/pages/instance/other-settings.vue new file mode 100644 index 0000000000..b3954149a8 --- /dev/null +++ b/src/client/pages/instance/other-settings.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/client/pages/instance/overview.vue b/src/client/pages/instance/overview.vue new file mode 100644 index 0000000000..651ace08f9 --- /dev/null +++ b/src/client/pages/instance/overview.vue @@ -0,0 +1,131 @@ + + + diff --git a/src/client/pages/instance/proxy-account.vue b/src/client/pages/instance/proxy-account.vue new file mode 100644 index 0000000000..3e2df8dcb4 --- /dev/null +++ b/src/client/pages/instance/proxy-account.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/client/pages/instance/queue.chart.vue b/src/client/pages/instance/queue.chart.vue index 0eb70debfb..446c979209 100644 --- a/src/client/pages/instance/queue.chart.vue +++ b/src/client/pages/instance/queue.chart.vue @@ -1,27 +1,29 @@ + + diff --git a/src/client/pages/instance/queue.vue b/src/client/pages/instance/queue.vue index 0c1e0e51b5..2dccf48d31 100644 --- a/src/client/pages/instance/queue.vue +++ b/src/client/pages/instance/queue.vue @@ -1,43 +1,47 @@ diff --git a/src/client/pages/instance/security.vue b/src/client/pages/instance/security.vue new file mode 100644 index 0000000000..e3397a113b --- /dev/null +++ b/src/client/pages/instance/security.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/client/pages/instance/service-worker.vue b/src/client/pages/instance/service-worker.vue new file mode 100644 index 0000000000..a52932bb75 --- /dev/null +++ b/src/client/pages/instance/service-worker.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/client/pages/instance/settings.vue b/src/client/pages/instance/settings.vue index b827a77649..66f01c42c7 100644 --- a/src/client/pages/instance/settings.vue +++ b/src/client/pages/instance/settings.vue @@ -1,581 +1,132 @@ - - diff --git a/src/client/pages/instance/user.vue b/src/client/pages/instance/user.vue new file mode 100644 index 0000000000..fbc10a3672 --- /dev/null +++ b/src/client/pages/instance/user.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/src/client/pages/instance/users.vue b/src/client/pages/instance/users.vue index 4db965588c..452886abde 100644 --- a/src/client/pages/instance/users.vue +++ b/src/client/pages/instance/users.vue @@ -1,86 +1,71 @@ diff --git a/src/client/pages/instance/file-dialog.vue b/src/client/pages/instance/file-dialog.vue index ae6755465c..74a755fa15 100644 --- a/src/client/pages/instance/file-dialog.vue +++ b/src/client/pages/instance/file-dialog.vue @@ -82,7 +82,7 @@ export default defineComponent({ }, showUser() { - os.pageWindow(`/instance/user/${this.file.userId}`); + os.pageWindow(`/user-info/${this.file.userId}`); }, async del() { diff --git a/src/client/pages/instance/user.vue b/src/client/pages/instance/user.vue deleted file mode 100644 index fbc10a3672..0000000000 --- a/src/client/pages/instance/user.vue +++ /dev/null @@ -1,229 +0,0 @@ - - - - - diff --git a/src/client/pages/instance/users.vue b/src/client/pages/instance/users.vue index 452886abde..2808b70fba 100644 --- a/src/client/pages/instance/users.vue +++ b/src/client/pages/instance/users.vue @@ -162,7 +162,7 @@ export default defineComponent({ }, show(user) { - os.pageWindow(`/instance/user/${user.id}`); + os.pageWindow(`/user-info/${user.id}`); }, acct diff --git a/src/client/pages/user-info.vue b/src/client/pages/user-info.vue index 378fbb7b50..090e8cdda8 100644 --- a/src/client/pages/user-info.vue +++ b/src/client/pages/user-info.vue @@ -1,35 +1,55 @@ @@ -38,6 +58,7 @@ import { computed, defineAsyncComponent, defineComponent } from 'vue'; import FormObjectView from '@client/components/form/object-view.vue'; import FormTextarea from '@client/components/form/textarea.vue'; +import FormSwitch from '@client/components/form/switch.vue'; import FormLink from '@client/components/form/link.vue'; import FormBase from '@client/components/form/base.vue'; import FormGroup from '@client/components/form/group.vue'; @@ -49,11 +70,13 @@ import number from '@client/filters/number'; import bytes from '@client/filters/bytes'; import * as symbols from '@client/symbols'; import { url } from '@client/config'; +import { userPage, acct } from '@client/filters/user'; export default defineComponent({ components: { FormBase, FormTextarea, + FormSwitch, FormObjectView, FormButton, FormLink, @@ -72,7 +95,7 @@ export default defineComponent({ data() { return { [symbols.PAGE_INFO]: computed(() => ({ - title: this.$ts.userInfo, + title: this.user ? acct(this.user) : this.$ts.userInfo, icon: 'fas fa-info-circle', actions: this.user ? [this.user.url ? { text: this.user.url, @@ -84,17 +107,23 @@ export default defineComponent({ })), init: null, user: null, + info: null, + moderator: false, + silenced: false, + suspended: false, + } + }, + + computed: { + iAmModerator(): boolean { + return this.$i && (this.$i.isAdmin || this.$i.isModerator); } }, watch: { userId: { handler() { - this.init = () => os.api('users/show', { - userId: this.userId - }).then(user => { - this.user = user; - }); + this.init = this.createFetcher(); }, immediate: true } @@ -103,6 +132,114 @@ export default defineComponent({ methods: { number, bytes, + userPage, + acct, + + createFetcher() { + if (this.iAmModerator) { + return () => Promise.all([os.api('users/show', { + userId: this.userId + }), os.api('admin/show-user', { + userId: this.userId + })]).then(([user, info]) => { + this.user = user; + this.info = info; + this.moderator = this.info.isModerator; + this.silenced = this.info.isSilenced; + this.suspended = this.info.isSuspended; + }); + } else { + return () => os.api('users/show', { + userId: this.userId + }).then((user) => { + this.user = user; + }); + } + }, + + refreshUser() { + this.init = this.createFetcher(); + }, + + async updateRemoteUser() { + await os.apiWithDialog('admin/update-remote-user', { userId: this.user.id }); + this.refreshUser(); + }, + + async resetPassword() { + os.apiWithDialog('admin/reset-password', { + userId: this.user.id, + }, undefined, ({ password }) => { + os.dialog({ + type: 'success', + text: this.$t('newPasswordIs', { password }) + }); + }); + }, + + async toggleSilence(v) { + const confirm = await os.dialog({ + type: 'warning', + showCancelButton: true, + text: v ? this.$ts.silenceConfirm : this.$ts.unsilenceConfirm, + }); + if (confirm.canceled) { + this.silenced = !v; + } else { + await os.api(v ? 'admin/silence-user' : 'admin/unsilence-user', { userId: this.user.id }); + await this.refreshUser(); + } + }, + + async toggleSuspend(v) { + const confirm = await os.dialog({ + type: 'warning', + showCancelButton: true, + text: v ? this.$ts.suspendConfirm : this.$ts.unsuspendConfirm, + }); + if (confirm.canceled) { + this.suspended = !v; + } else { + await os.api(v ? 'admin/suspend-user' : 'admin/unsuspend-user', { userId: this.user.id }); + await this.refreshUser(); + } + }, + + async toggleModerator(v) { + await os.api(v ? 'admin/moderators/add' : 'admin/moderators/remove', { userId: this.user.id }); + await this.refreshUser(); + }, + + async deleteAllFiles() { + const confirm = await os.dialog({ + type: 'warning', + showCancelButton: true, + text: this.$ts.deleteAllFilesConfirm, + }); + if (confirm.canceled) return; + const process = async () => { + await os.api('admin/delete-all-files-of-a-user', { userId: this.user.id }); + os.success(); + }; + await process().catch(e => { + os.dialog({ + type: 'error', + text: e.toString() + }); + }); + await this.refreshUser(); + }, } }); + + diff --git a/src/client/router.ts b/src/client/router.ts index 93de287ea5..26a4dac499 100644 --- a/src/client/router.ts +++ b/src/client/router.ts @@ -59,7 +59,6 @@ export const router = createRouter({ { path: '/my/antennas', component: page('my-antennas/index') }, { path: '/my/clips', component: page('my-clips/index') }, { path: '/scratchpad', component: page('scratchpad') }, - { path: '/instance/user/:user', component: page('instance/user'), props: route => ({ userId: route.params.user }) }, { path: '/instance/:page(.*)?', component: page('instance/index'), props: route => ({ initialPage: route.params.page || null }) }, { path: '/instance', component: page('instance/index') }, { path: '/notes/:note', name: 'note', component: page('note'), props: route => ({ noteId: route.params.note }) }, diff --git a/src/client/scripts/get-user-menu.ts b/src/client/scripts/get-user-menu.ts index 9a003b5c38..ceb2bfe173 100644 --- a/src/client/scripts/get-user-menu.ts +++ b/src/client/scripts/get-user-menu.ts @@ -124,13 +124,7 @@ export function getUserMenu(user) { action: () => { copyToClipboard(`@${user.username}@${user.host || host}`); } - }, ($i && ($i.isAdmin || $i.isModerator)) ? { - icon: 'fas fa-info-circle', - text: i18n.locale.info, - action: () => { - os.pageWindow(`/instance/user/${user.id}`); - } - } : { + }, { icon: 'fas fa-info-circle', text: i18n.locale.info, action: () => { diff --git a/src/client/scripts/lookup-user.ts b/src/client/scripts/lookup-user.ts index 1bcfd8e9db..269777d874 100644 --- a/src/client/scripts/lookup-user.ts +++ b/src/client/scripts/lookup-user.ts @@ -10,7 +10,7 @@ export async function lookupUser() { if (canceled) return; const show = (user) => { - os.pageWindow(`/instance/user/${user.id}`); + os.pageWindow(`/user-info/${user.id}`); }; const usernamePromise = os.api('users/show', parseAcct(result)); -- cgit v1.2.3-freya