From c039665a9729ba671c2eadf38c7ef06b6000e044 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 25 Apr 2021 22:32:46 +0900 Subject: Fix #7481 --- src/client/components/drive.file.vue | 2 +- src/client/components/drive.folder.vue | 2 +- src/client/components/drive.vue | 2 +- src/client/components/post-form-attaches.vue | 2 +- src/client/pages/mentions.vue | 1 - src/client/ui/deck/mentions-column.vue | 1 - 6 files changed, 4 insertions(+), 6 deletions(-) (limited to 'src/client') diff --git a/src/client/components/drive.file.vue b/src/client/components/drive.file.vue index 293465e428..37b1afc1b3 100644 --- a/src/client/components/drive.file.vue +++ b/src/client/components/drive.file.vue @@ -81,7 +81,7 @@ export default defineComponent({ getMenu() { return [{ text: this.$ts.rename, - icon: faICursor, + icon: 'fas fa-i-cursor', action: this.rename }, { text: this.file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive, diff --git a/src/client/components/drive.folder.vue b/src/client/components/drive.folder.vue index 6ddd392527..4c09e7775a 100644 --- a/src/client/components/drive.folder.vue +++ b/src/client/components/drive.folder.vue @@ -247,7 +247,7 @@ export default defineComponent({ } }, null, { text: this.$ts.rename, - icon: faICursor, + icon: 'fas fa-i-cursor', action: this.rename }, null, { text: this.$ts.delete, diff --git a/src/client/components/drive.vue b/src/client/components/drive.vue index bd5bd8008b..06f9cf7806 100644 --- a/src/client/components/drive.vue +++ b/src/client/components/drive.vue @@ -614,7 +614,7 @@ export default defineComponent({ type: 'label' }, this.folder ? { text: this.$ts.renameFolder, - icon: faICursor, + icon: 'fas fa-i-cursor', action: () => { this.renameFolder(this.folder); } } : undefined, this.folder ? { text: this.$ts.deleteFolder, diff --git a/src/client/components/post-form-attaches.vue b/src/client/components/post-form-attaches.vue index eba7e7af36..f832ea87b5 100644 --- a/src/client/components/post-form-attaches.vue +++ b/src/client/components/post-form-attaches.vue @@ -93,7 +93,7 @@ export default defineComponent({ if (this.menu) return; this.menu = os.modalMenu([{ text: this.$ts.renameFile, - icon: faICursor, + icon: 'fas fa-i-cursor', action: () => { this.rename(file) } }, { text: file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive, diff --git a/src/client/pages/mentions.vue b/src/client/pages/mentions.vue index a12993ebb8..798d3e342d 100644 --- a/src/client/pages/mentions.vue +++ b/src/client/pages/mentions.vue @@ -25,7 +25,6 @@ export default defineComponent({ endpoint: 'notes/mentions', limit: 10, }, - faAt }; }, diff --git a/src/client/ui/deck/mentions-column.vue b/src/client/ui/deck/mentions-column.vue index 053ef918f0..c625bb3ea1 100644 --- a/src/client/ui/deck/mentions-column.vue +++ b/src/client/ui/deck/mentions-column.vue @@ -36,7 +36,6 @@ export default defineComponent({ endpoint: 'notes/mentions', limit: 10, }, - faAt } }, -- cgit v1.2.3-freya From 8bce241170cd5b40b200c3b00d104677c35ba8e5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 26 Apr 2021 10:46:55 +0900 Subject: :art: --- src/client/pages/user/index.vue | 6 +-- src/client/scripts/theme.ts | 2 + src/client/themes/d-astro.json5 | 76 ++++++++++++++++++++++++++++++++++++++ src/client/themes/l-light.json5 | 2 +- src/client/themes/l-vivid.json5 | 82 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 src/client/themes/d-astro.json5 create mode 100644 src/client/themes/l-vivid.json5 (limited to 'src/client') diff --git a/src/client/pages/user/index.vue b/src/client/pages/user/index.vue index a1fe7ec09f..717ca5d8fe 100644 --- a/src/client/pages/user/index.vue +++ b/src/client/pages/user/index.vue @@ -161,15 +161,15 @@
- + {{ number(user.notesCount) }} {{ $ts.notes }} - + {{ number(user.followingCount) }} {{ $ts.following }} - + {{ number(user.followersCount) }} {{ $ts.followers }} diff --git a/src/client/scripts/theme.ts b/src/client/scripts/theme.ts index b0bf620a7d..09441c8a76 100644 --- a/src/client/scripts/theme.ts +++ b/src/client/scripts/theme.ts @@ -18,9 +18,11 @@ export const builtinThemes = [ require('@client/themes/l-light.json5'), require('@client/themes/l-apricot.json5'), require('@client/themes/l-rainy.json5'), + require('@client/themes/l-vivid.json5'), require('@client/themes/d-dark.json5'), require('@client/themes/d-persimmon.json5'), + require('@client/themes/d-astro.json5'), require('@client/themes/d-black.json5'), ] as Theme[]; diff --git a/src/client/themes/d-astro.json5 b/src/client/themes/d-astro.json5 new file mode 100644 index 0000000000..a88e949c3c --- /dev/null +++ b/src/client/themes/d-astro.json5 @@ -0,0 +1,76 @@ +{ + id: '080a01c5-377d-4fbb-88cc-6bb5d04977ea', + base: 'dark', + name: 'Mi Astro', + author: 'syuilo', + props: { + bg: '#232125', + fg: '#efdab9', + cwBg: '#687390', + cwFg: '#393f4f', + link: '#78b0a0', + warn: '#ecb637', + badge: '#31b1ce', + error: '#ec4137', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: '#2a272b', + accent: '#81c08b', + header: ':alpha<0.7<@bg', + infoBg: '#253142', + infoFg: '#fff', + renote: '#659CC8', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#ff9156', + mention: '#ffd152', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#86b300', + buttonBg: 'rgba(255, 255, 255, 0.05)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#707b97', + indicator: '@accent', + mentionMe: '#fb5d38', + messageBg: ':lighten<5<@bg', + navActive: '@accent', + infoWarnBg: '#42321c', + infoWarnFg: '#ffbd3e', + navHoverFg: ':lighten<17<@fg', + dateLabelFg: '@fg', + inputBorder: '#959da2', + panelBorder: 'rgba(0, 0, 0, 0)', + panelShadow: '" 0 8px 24px rgba(0, 0, 0, 0.12)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@accent', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + }, +} diff --git a/src/client/themes/l-light.json5 b/src/client/themes/l-light.json5 index fdc1700b95..27a973c88a 100644 --- a/src/client/themes/l-light.json5 +++ b/src/client/themes/l-light.json5 @@ -10,7 +10,7 @@ props: { bg: '#f9f9f9', fg: '#676767', - divider: 'rgb(223, 223, 223)', + divider: '#e8e8e8', header: ':alpha<0.7<@panel', navBg: '#fff', panel: '#fff', diff --git a/src/client/themes/l-vivid.json5 b/src/client/themes/l-vivid.json5 new file mode 100644 index 0000000000..a21e053b0a --- /dev/null +++ b/src/client/themes/l-vivid.json5 @@ -0,0 +1,82 @@ +{ + id: '6128c2a9-5c54-43fe-a47d-17942356470b', + + name: 'Mi Vivid', + author: 'syuilo', + + base: 'light', + + props: { + bg: '#fafafa', + fg: '#444', + cwBg: '#b1b9c1', + cwFg: '#fff', + link: '#ff9400', + warn: '#ecb637', + badge: '#31b1ce', + error: '#ec4137', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: '#fff', + accent: '#008cff', + header: ':alpha<0.7<@panel', + infoBg: '#e5f5ff', + infoFg: '#72818a', + renote: '@accent', + shadow: 'rgba(0, 0, 0, 0.1)', + divider: 'rgba(0, 0, 0, 0.08)', + hashtag: '#92d400', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.3)', + success: '#86b300', + buttonBg: 'rgba(0, 0, 0, 0.05)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#bbc4ce', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@panel', + navActive: '@accent', + infoWarnBg: '#fff0db', + infoWarnFg: '#573c08', + navHoverFg: ':darken<17<@fg', + dateLabelFg: '@fg', + inputBorder: '#dae0e4', + panelBorder: 'rgba(0, 0, 0, 0)', + panelShadow: '" 0 8px 24px rgb(21 43 75 / 8%)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@accent', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(0, 0, 0, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':darken<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + htmlThemeColor: '@bg', + panelHighlight: ':darken<3<@panel', + listItemHoverBg: 'rgba(0, 0, 0, 0.03)', + scrollbarHandle: 'rgba(0, 0, 0, 0.2)', + wallpaperOverlay: 'rgba(255, 255, 255, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: '@divider', + scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)', + X2: ':darken<2<@panel', + X3: 'rgba(0, 0, 0, 0.05)', + X4: 'rgba(0, 0, 0, 0.1)', + X5: 'rgba(0, 0, 0, 0.05)', + X6: 'rgba(0, 0, 0, 0.25)', + X7: 'rgba(0, 0, 0, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.1)', + X12: 'rgba(0, 0, 0, 0.1)', + X13: 'rgba(0, 0, 0, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + }, +} -- cgit v1.2.3-freya From 42539575a659a6dbf165f0e9c20495a748ce61b6 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 26 Apr 2021 11:10:45 +0900 Subject: ギャラリー投稿の編集と削除 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/pages/gallery/edit.vue | 168 +++++++++++++++++++++++ src/client/pages/gallery/new.vue | 110 --------------- src/client/pages/gallery/post.vue | 10 ++ src/client/router.ts | 3 +- src/server/api/endpoints/gallery/posts/delete.ts | 40 ++++++ src/server/api/endpoints/gallery/posts/update.ts | 81 +++++++++++ 6 files changed, 301 insertions(+), 111 deletions(-) create mode 100644 src/client/pages/gallery/edit.vue delete mode 100644 src/client/pages/gallery/new.vue create mode 100644 src/server/api/endpoints/gallery/posts/delete.ts create mode 100644 src/server/api/endpoints/gallery/posts/update.ts (limited to 'src/client') diff --git a/src/client/pages/gallery/edit.vue b/src/client/pages/gallery/edit.vue new file mode 100644 index 0000000000..cd6a0defdd --- /dev/null +++ b/src/client/pages/gallery/edit.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/client/pages/gallery/new.vue b/src/client/pages/gallery/new.vue deleted file mode 100644 index 3f9756df8e..0000000000 --- a/src/client/pages/gallery/new.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/src/client/pages/gallery/post.vue b/src/client/pages/gallery/post.vue index 9bd102cee2..703506a78d 100644 --- a/src/client/pages/gallery/post.vue +++ b/src/client/pages/gallery/post.vue @@ -19,6 +19,7 @@ {{ post.likedCount }}
+
@@ -84,6 +85,11 @@ export default defineComponent({ title: this.post.title, text: this.post.description, }, + actions: [{ + icon: 'fas fa-pencil-alt', + text: this.$ts.edit, + handler: this.edit + }] } : null), otherPostsPagination: { endpoint: 'users/gallery/posts', @@ -154,6 +160,10 @@ export default defineComponent({ this.post.likedCount--; }); }, + + edit() { + this.$router.push(`/gallery/${this.post.id}/edit`); + } } }); diff --git a/src/client/router.ts b/src/client/router.ts index 5371bf17d9..8dcc1d1eb4 100644 --- a/src/client/router.ts +++ b/src/client/router.ts @@ -38,7 +38,8 @@ export const router = createRouter({ { path: '/pages/new', component: page('page-editor/page-editor') }, { path: '/pages/edit/:pageId', component: page('page-editor/page-editor'), props: route => ({ initPageId: route.params.pageId }) }, { path: '/gallery', component: page('gallery/index') }, - { path: '/gallery/new', component: page('gallery/new') }, + { path: '/gallery/new', component: page('gallery/edit') }, + { path: '/gallery/:postId/edit', component: page('gallery/edit'), props: route => ({ postId: route.params.postId }) }, { path: '/gallery/:postId', component: page('gallery/post'), props: route => ({ postId: route.params.postId }) }, { path: '/channels', component: page('channels') }, { path: '/channels/new', component: page('channel-editor') }, diff --git a/src/server/api/endpoints/gallery/posts/delete.ts b/src/server/api/endpoints/gallery/posts/delete.ts new file mode 100644 index 0000000000..8b54828b20 --- /dev/null +++ b/src/server/api/endpoints/gallery/posts/delete.ts @@ -0,0 +1,40 @@ +import $ from 'cafy'; +import define from '../../../define'; +import { ApiError } from '../../../error'; +import { GalleryPosts } from '../../../../../models'; +import { ID } from '@/misc/cafy-id'; + +export const meta = { + tags: ['gallery'], + + requireCredential: true as const, + + kind: 'write:gallery', + + params: { + postId: { + validator: $.type(ID), + }, + }, + + errors: { + noSuchPost: { + message: 'No such post.', + code: 'NO_SUCH_POST', + id: 'ae52f367-4bd7-4ecd-afc6-5672fff427f5' + }, + } +}; + +export default define(meta, async (ps, user) => { + const post = await GalleryPosts.findOne({ + id: ps.postId, + userId: user.id, + }); + + if (post == null) { + throw new ApiError(meta.errors.noSuchPost); + } + + await GalleryPosts.delete(post.id); +}); diff --git a/src/server/api/endpoints/gallery/posts/update.ts b/src/server/api/endpoints/gallery/posts/update.ts new file mode 100644 index 0000000000..c8bb8d48c9 --- /dev/null +++ b/src/server/api/endpoints/gallery/posts/update.ts @@ -0,0 +1,81 @@ +import $ from 'cafy'; +import * as ms from 'ms'; +import define from '../../../define'; +import { ID } from '../../../../../misc/cafy-id'; +import { DriveFiles, GalleryPosts } from '../../../../../models'; +import { GalleryPost } from '../../../../../models/entities/gallery-post'; +import { ApiError } from '../../../error'; + +export const meta = { + tags: ['gallery'], + + requireCredential: true as const, + + kind: 'write:gallery', + + limit: { + duration: ms('1hour'), + max: 300 + }, + + params: { + postId: { + validator: $.type(ID), + }, + + title: { + validator: $.str.min(1), + }, + + description: { + validator: $.optional.nullable.str, + }, + + fileIds: { + validator: $.arr($.type(ID)).unique().range(1, 32), + }, + + isSensitive: { + validator: $.optional.bool, + default: false, + }, + }, + + res: { + type: 'object' as const, + optional: false as const, nullable: false as const, + ref: 'GalleryPost', + }, + + errors: { + + } +}; + +export default define(meta, async (ps, user) => { + const files = (await Promise.all(ps.fileIds.map(fileId => + DriveFiles.findOne({ + id: fileId, + userId: user.id + }) + ))).filter(file => file != null); + + if (files.length === 0) { + throw new Error(); + } + + await GalleryPosts.update({ + id: ps.postId, + userId: user.id, + }, { + updatedAt: new Date(), + title: ps.title, + description: ps.description, + isSensitive: ps.isSensitive, + fileIds: files.map(file => file.id) + }); + + const post = await GalleryPosts.findOneOrFail(ps.postId); + + return await GalleryPosts.pack(post, user); +}); -- cgit v1.2.3-freya From 77ccf3b929e46f6df1222f70fff936cab449fe21 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 26 Apr 2021 12:47:54 +0900 Subject: Fix #7483 --- src/client/components/captcha.vue | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'src/client') diff --git a/src/client/components/captcha.vue b/src/client/components/captcha.vue index 26215df09d..5da8ede3b9 100644 --- a/src/client/components/captcha.vue +++ b/src/client/components/captcha.vue @@ -6,7 +6,7 @@