diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 848bf4bb4..1812a2660 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -265,6 +265,7 @@ watch: "ウォッチ"
unwatch: "ウォッチ解除"
accept: "許可"
reject: "拒否"
+normal: "正常"
instanceName: "インスタンス名"
instanceDescription: "インスタンスの紹介"
maintainerName: "管理者の名前"
@@ -319,6 +320,7 @@ notesAndReplies: "投稿と返信"
withFiles: "ファイル付き"
silence: "サイレンス"
silenceConfirm: "サイレンスしますか?"
+unsilence: "サイレンス解除"
unsilenceConfirm: "サイレンス解除しますか?"
popularUsers: "人気のユーザー"
recentlyUpdatedUsers: "最近投稿したユーザー"
@@ -483,6 +485,13 @@ scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を
output: "出力"
script: "スクリプト"
disablePagesScript: "Pagesのスクリプトを無効にする"
+updateRemoteUser: "リモートユーザー情報の更新"
+deleteAllFiles: "すべてのファイルを削除"
+deleteAllFilesConfirm: "すべてのファイルを削除しますか?"
+removeAllFollowing: "フォローを全解除"
+removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
+userSuspended: "このユーザーは凍結されています。"
+userSilenced: "このユーザーはサイレンスされています。"
_theme:
explore: "テーマを探す"
diff --git a/src/client/components/note.vue b/src/client/components/note.vue
index 07011ba50..18d5cc34b 100644
--- a/src/client/components/note.vue
+++ b/src/client/components/note.vue
@@ -561,13 +561,13 @@ export default Vue.extend({
}]
: []
),
- ...(this.appearNote.userId == this.$store.state.i.id ? [
+ ...(this.appearNote.userId == this.$store.state.i.id || this.$store.state.i.isModerator || this.$store.state.i.isAdmin ? [
null,
- {
+ this.appearNote.userId == this.$store.state.i.id ? {
icon: faEdit,
text: this.$t('deleteAndEdit'),
action: this.delEdit
- },
+ } : undefined,
{
icon: faTrashAlt,
text: this.$t('delete'),
diff --git a/src/client/components/user-menu.vue b/src/client/components/user-menu.vue
index b0139380e..a2275197d 100644
--- a/src/client/components/user-menu.vue
+++ b/src/client/components/user-menu.vue
@@ -4,7 +4,7 @@
-
-
diff --git a/src/client/pages/instance/federation.instance.vue b/src/client/pages/instance/federation.instance.vue
index b86f52809..08f4d1b4f 100644
--- a/src/client/pages/instance/federation.instance.vue
+++ b/src/client/pages/instance/federation.instance.vue
@@ -99,10 +99,19 @@
{{ $t('operations') }}
{{ $t('stopActivityDelivery') }}
{{ $t('blockThisInstance') }}
+
+ {{ $t('deleteAllFiles') }}
+ {{ $t('deleteAllFiles') }}
+
+
+ {{ $t('removeAllFollowing') }}
+ {{ $t('removeAllFollowing') }}
+ {{ $t('removeAllFollowingDescription', { host: instance.host }) }}
+
{{ $t('metadata') }}
- {{ JSON.stringify(instance.metadata, null, 2) }}
+ {{ JSON.stringify(instance, null, 2) }}
@@ -112,11 +121,13 @@
import Vue from 'vue';
import Chart from 'chart.js';
import i18n from '../../i18n';
-import { faTimes, faCrosshairs, faCloudDownloadAlt, faCloudUploadAlt, faUsers, faPencilAlt, faFileImage, faDatabase, faTrafficLight, faLongArrowAltUp, faLongArrowAltDown } from '@fortawesome/free-solid-svg-icons';
+import { faTimes, faCrosshairs, faCloudDownloadAlt, faCloudUploadAlt, faUsers, faPencilAlt, faFileImage, faDatabase, faTrafficLight, faLongArrowAltUp, faLongArrowAltDown, faMinusCircle, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
import XWindow from '../../components/window.vue';
import MkUsersDialog from '../../components/users-dialog.vue';
import MkSelect from '../../components/ui/select.vue';
+import MkButton from '../../components/ui/button.vue';
import MkSwitch from '../../components/ui/switch.vue';
+import MkInfo from '../../components/ui/info.vue';
const chartLimit = 90;
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
@@ -135,7 +146,9 @@ export default Vue.extend({
components: {
XWindow,
MkSelect,
+ MkButton,
MkSwitch,
+ MkInfo,
},
props: {
@@ -153,7 +166,7 @@ export default Vue.extend({
chartInstance: null,
chartSrc: 'requests',
chartSpan: 'hour',
- faTimes, faCrosshairs, faCloudDownloadAlt, faCloudUploadAlt, faUsers, faPencilAlt, faFileImage, faDatabase, faTrafficLight, faLongArrowAltUp, faLongArrowAltDown
+ faTimes, faCrosshairs, faCloudDownloadAlt, faCloudUploadAlt, faUsers, faPencilAlt, faFileImage, faDatabase, faTrafficLight, faLongArrowAltUp, faLongArrowAltDown, faMinusCircle, faTrashAlt
};
},
@@ -239,6 +252,28 @@ export default Vue.extend({
this.chartSrc = src;
},
+ removeAllFollowing() {
+ this.$root.api('admin/federation/remove-all-following', {
+ host: this.instance.host
+ }).then(() => {
+ this.$root.dialog({
+ type: 'success',
+ iconOnly: true, autoClose: true
+ });
+ });
+ },
+
+ deleteAllFiles() {
+ this.$root.api('admin/federation/delete-all-files', {
+ host: this.instance.host
+ }).then(() => {
+ this.$root.dialog({
+ type: 'success',
+ iconOnly: true, autoClose: true
+ });
+ });
+ },
+
renderChart() {
if (this.chartInstance) {
this.chartInstance.destroy();
diff --git a/src/client/pages/instance/users.user.vue b/src/client/pages/instance/users.user.vue
new file mode 100644
index 000000000..1fb064f7f
--- /dev/null
+++ b/src/client/pages/instance/users.user.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+ @{{ user | acct }}
+
+
+
+
+
+
+
+ {{ $t('moderator') }}
+ {{ $t('silence') }}
+ {{ $t('suspend') }}
+
+
+ {{ $t('profile')}}
+ {{ $t('updateRemoteUser') }}
+ {{ $t('resetPassword') }}
+ {{ $t('deleteAllFiles') }}
+
+
+
+
{{ JSON.stringify(info, null, 2) }}
+
+
+
+
+
+
+
+
diff --git a/src/client/pages/instance/users.vue b/src/client/pages/instance/users.vue
index db9e625e4..b209ab68c 100644
--- a/src/client/pages/instance/users.vue
+++ b/src/client/pages/instance/users.vue
@@ -12,19 +12,65 @@
{{ $t('lookup') }}
{{ $t('users') }}
+
+
+
+ {{ $t('sort') }}
+
+
+
+
+
+
+ {{ $t('state') }}
+
+
+
+
+
+
+
+
+ {{ $t('instance') }}
+
+
+
+
+
+
+
+ {{ $t('username') }}
+
+
+ {{ $t('host') }}
+
+
+
@@ -38,12 +84,13 @@