diff --git a/CHANGELOG.md b/CHANGELOG.md index a611029968..8c1e3af097 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 12.x.x (unreleased) ### Improvements +- Client: Preferences Registry ### Bugfixes - @@ -13,6 +14,7 @@ You should also include the user name that made the change. ### Improvements - Client: Add vi-VN language support +- Client: Add unix time widget @syuilo ### Bugfixes - Server: リモートユーザーを正しくブロックできるように修正する @xianonn diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 3a3572da4f..c80ca8e9b7 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -52,6 +52,7 @@ searchUser: "ユーザーを検索" reply: "返信" loadMore: "もっと見る" showMore: "もっと見る" +showLess: "閉じる" youGotNewFollower: "フォローされました" receiveFollowRequest: "フォローリクエストされました" followRequestAccepted: "フォローが承認されました" @@ -562,6 +563,7 @@ author: "作者" leaveConfirm: "未保存の変更があります。破棄しますか?" manage: "管理" plugins: "プラグイン" +preferencesBackups: "設定のバックアップ" deck: "デッキ" undeck: "デッキ解除" useBlurEffectForModal: "モーダルにぼかし効果を使用" @@ -970,6 +972,25 @@ _plugin: installWarn: "信頼できないプラグインはインストールしないでください。" manage: "プラグインの管理" +_preferencesBackups: + list: "作成したバックアップ" + saveNew: "新規保存" + loadFile: "ファイルを読み込み" + apply: "このデバイスに適用" + save: "上書き保存" + inputName: "バックアップ名を入力" + cannotSave: "保存できません" + nameAlreadyExists: "バックアップ名「{name}」は既に存在します。違う名前を指定してください。" + applyConfirm: "バックアップ「{name}」を現在のデバイスに適用しますか?現在のデバイス設定は失われます。" + saveConfirm: "{name}に上書き保存しますか?" + deleteConfirm: "{name}を削除しますか?" + renameConfirm: "「{old}」を「{new}」に変更しますか?" + noBackups: "バックアップはありません。「新規保存」で現在のクライアント設定をサーバーに保存できます。" + createdAt: "作成日時: {date} {time}" + updatedAt: "更新日時: {date} {time}" + cannotLoad: "読み込みできません" + invalidFile: "ファイル形式が違います。" + _registry: scope: "スコープ" key: "キー" @@ -1310,6 +1331,7 @@ _widgets: activity: "アクティビティ" photos: "フォト" digitalClock: "デジタル時計" + unixClock: "UNIX時計" federation: "連合" instanceCloud: "インスタンスクラウド" postForm: "投稿フォーム" diff --git a/package.json b/package.json index 46e246aee3..f5bde522d3 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "devDependencies": { "@types/gulp": "4.0.9", "@types/gulp-rename": "2.0.1", - "@typescript-eslint/parser": "5.30.7", + "@typescript-eslint/parser": "5.31.0", "cross-env": "7.0.3", "cypress": "10.3.1", "start-server-and-test": "1.14.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index 72e5af7074..0e18a48d01 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -17,9 +17,7 @@ "@tensorflow/tfjs-node": "3.19.0" }, "dependencies": { - "@bull-board/api": "4.0.0", - "@bull-board/koa": "4.0.0", - "@bull-board/ui": "4.0.0", + "@bull-board/koa": "4.1.1", "@discordapp/twemoji": "14.0.2", "@elastic/elasticsearch": "7.17.0", "@koa/cors": "3.3.0", @@ -32,10 +30,10 @@ "archiver": "5.3.1", "autobind-decorator": "2.4.0", "autwh": "0.1.0", - "aws-sdk": "2.1165.0", + "aws-sdk": "2.1185.0", "bcryptjs": "2.4.3", "blurhash": "1.1.5", - "bull": "4.8.4", + "bull": "4.8.5", "cacheable-lookup": "6.0.4", "cbor": "8.1.0", "chalk": "5.0.1", @@ -48,9 +46,9 @@ "deep-email-validator": "0.1.21", "escape-regexp": "0.0.1", "feed": "4.2.2", - "file-type": "17.1.3", + "file-type": "17.1.4", "fluent-ffmpeg": "2.1.2", - "got": "12.2.0", + "got": "12.3.0", "hpagent": "0.1.2", "ioredis": "4.28.5", "ip-cidr": "3.0.10", @@ -76,7 +74,7 @@ "mocha": "10.0.0", "multer": "1.4.4", "nested-property": "4.0.0", - "node-fetch": "3.2.9", + "node-fetch": "3.2.10", "nodemailer": "6.7.7", "nsfwjs": "2.4.1", "oauth": "^0.9.15", @@ -125,9 +123,9 @@ "xev": "3.0.2" }, "devDependencies": { - "@redocly/openapi-core": "1.0.0-beta.104", + "@redocly/openapi-core": "1.0.0-beta.105", "@types/bcryptjs": "2.4.2", - "@types/bull": "3.15.8", + "@types/bull": "3.15.9", "@types/cbor": "6.0.0", "@types/escape-regexp": "0.0.1", "@types/fluent-ffmpeg": "2.1.20", @@ -147,7 +145,7 @@ "@types/koa__multer": "2.0.4", "@types/koa__router": "8.0.11", "@types/mocha": "9.1.1", - "@types/node": "18.6.1", + "@types/node": "18.6.3", "@types/node-fetch": "3.0.3", "@types/nodemailer": "6.4.4", "@types/oauth": "0.9.1", @@ -169,8 +167,8 @@ "@types/web-push": "3.3.2", "@types/websocket": "1.0.5", "@types/ws": "8.5.3", - "@typescript-eslint/eslint-plugin": "5.30.7", - "@typescript-eslint/parser": "5.30.7", + "@typescript-eslint/eslint-plugin": "5.31.0", + "@typescript-eslint/parser": "5.31.0", "cross-env": "7.0.3", "eslint": "8.20.0", "eslint-plugin-import": "2.26.0", diff --git a/packages/backend/src/server/web/views/flush.pug b/packages/backend/src/server/web/views/flush.pug index be013d19b6..c3de247270 100644 --- a/packages/backend/src/server/web/views/flush.pug +++ b/packages/backend/src/server/web/views/flush.pug @@ -51,7 +51,7 @@ html .then(registrations => { return Promise.all(registrations.map(registration => registration.unregister())); }) - .catch(e => { throw Error(e) }); + .catch(e => { throw new Error(e) }); } message(successText); diff --git a/packages/backend/test/tsconfig.json b/packages/backend/test/tsconfig.json index 3f9020d467..bc7a9968b5 100644 --- a/packages/backend/test/tsconfig.json +++ b/packages/backend/test/tsconfig.json @@ -9,7 +9,7 @@ "noFallthroughCasesInSwitch": true, "declaration": false, "sourceMap": true, - "target": "es2017", + "target": "es2021", "module": "es2020", "moduleResolution": "node", "allowSyntheticDefaultImports": true, diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 22338a4976..dea4eb27db 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -9,7 +9,7 @@ "noFallthroughCasesInSwitch": true, "declaration": false, "sourceMap": false, - "target": "es2017", + "target": "es2021", "module": "es2020", "moduleResolution": "node", "allowSyntheticDefaultImports": true, diff --git a/packages/client/package.json b/packages/client/package.json index c77f4214a8..664d0f7d50 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@discordapp/twemoji": "14.0.2", - "@fortawesome/fontawesome-free": "6.1.1", + "@fortawesome/fontawesome-free": "6.1.2", "@rollup/plugin-alias": "3.1.9", "@rollup/plugin-json": "4.1.0", "@rollup/pluginutils": "^4.2.1", @@ -48,7 +48,7 @@ "stringz": "2.1.0", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", - "three": "0.142.0", + "three": "0.143.0", "throttle-debounce": "5.0.0", "tinycolor2": "1.4.2", "tsc-alias": "1.7.0", @@ -57,7 +57,7 @@ "typescript": "4.7.4", "uuid": "8.3.2", "vanilla-tilt": "1.7.2", - "vite": "3.0.3", + "vite": "3.0.4", "vue": "3.2.37", "vue-prism-editor": "2.0.0-alpha.2", "vuedraggable": "4.0.1" @@ -74,14 +74,14 @@ "@types/throttle-debounce": "5.0.0", "@types/tinycolor2": "1.4.3", "@types/uuid": "8.3.4", - "@typescript-eslint/eslint-plugin": "5.30.7", - "@typescript-eslint/parser": "5.30.7", + "@typescript-eslint/eslint-plugin": "5.31.0", + "@typescript-eslint/parser": "5.31.0", "cross-env": "7.0.3", "cypress": "10.3.1", "eslint": "8.20.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-vue": "9.3.0", - "rollup": "2.77.0", + "rollup": "2.77.2", "start-server-and-test": "1.14.0" } } diff --git a/packages/client/src/components/note.vue b/packages/client/src/components/note.vue index 5c0efc4639..f6f7632313 100644 --- a/packages/client/src/components/note.vue +++ b/packages/client/src/components/note.vue @@ -41,7 +41,7 @@

-
+
@@ -60,9 +60,12 @@
- +
{{ appearNote.channel.name }}
@@ -161,10 +164,11 @@ const reactButton = ref(); let appearNote = $computed(() => isRenote ? note.renote as misskey.entities.Note : note); const isMyRenote = $i && ($i.id === note.userId); const showContent = ref(false); -const collapsed = ref(appearNote.cw == null && appearNote.text != null && ( +const isLong = (appearNote.cw == null && appearNote.text != null && ( (appearNote.text.split('\n').length > 9) || (appearNote.text.length > 500) )); +const collapsed = ref(appearNote.cw == null && isLong); const isDeleted = ref(false); const muted = ref(checkWordMute(appearNote, $i, defaultStore.state.mutedWords)); const translation = ref(null); @@ -441,6 +445,24 @@ function readPromo() { } > .content { + &.isLong { + > .showLess { + width: 100%; + margin-top: 1em; + position: sticky; + bottom: 1em; + + > span { + display: inline-block; + background: var(--popup); + padding: 6px 10px; + font-size: 0.8em; + border-radius: 999px; + box-shadow: 0 2px 6px rgb(0 0 0 / 20%); + } + } + } + &.collapsed { position: relative; max-height: 9em; diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue index 0ca91d0ebe..862435eb3f 100644 --- a/packages/client/src/pages/settings/index.vue +++ b/packages/client/src/pages/settings/index.vue @@ -171,6 +171,11 @@ const menuDef = computed(() => [{ }], }, { items: [{ + icon: 'fas fa-floppy-disk', + text: i18n.ts.preferencesBackups, + to: '/settings/preferences-backups', + active: currentPage?.route.name === 'preferences-backups', + }, { type: 'button', icon: 'fas fa-trash', text: i18n.ts.clearCache, diff --git a/packages/client/src/pages/settings/preferences-backups.vue b/packages/client/src/pages/settings/preferences-backups.vue new file mode 100644 index 0000000000..991bb7902d --- /dev/null +++ b/packages/client/src/pages/settings/preferences-backups.vue @@ -0,0 +1,444 @@ + + + + + diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts index faed958e15..c309436084 100644 --- a/packages/client/src/router.ts +++ b/packages/client/src/router.ts @@ -157,6 +157,10 @@ export const routes = [{ path: '/delete-account', name: 'delete-account', component: page(() => import('./pages/settings/delete-account.vue')), + }, { + path: '/preferences-backups', + name: 'preferences-backups', + component: page(() => import('./pages/settings/preferences-backups.vue')), }, { path: '/other', name: 'other', diff --git a/packages/client/src/widgets/digital-clock.vue b/packages/client/src/widgets/digital-clock.vue index a17ed040c9..743c5657b4 100644 --- a/packages/client/src/widgets/digital-clock.vue +++ b/packages/client/src/widgets/digital-clock.vue @@ -1,21 +1,21 @@ + +