diff --git a/package.json b/package.json index 29067b4ea..f7001725e 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "deepcopy": "0.6.3", "diskusage": "0.2.4", "elasticsearch": "14.1.0", + "element-ui": "^2.2.0", "emojilib": "^2.2.12", "escape-regexp": "0.0.1", "eslint": "4.18.0", @@ -104,6 +105,7 @@ "eventemitter3": "3.0.1", "exif-js": "2.3.0", "express": "4.16.2", + "file-loader": "^1.1.10", "file-type": "7.6.0", "fuckadblock": "3.2.1", "gm": "1.23.1", @@ -137,6 +139,8 @@ "morgan": "1.9.0", "ms": "2.1.1", "multer": "1.3.0", + "node-sass": "^4.7.2", + "node-sass-json-importer": "^3.1.3", "nprogress": "0.2.0", "os-utils": "0.0.14", "progress-bar-webpack-plugin": "^1.11.0", @@ -152,6 +156,7 @@ "rimraf": "2.6.2", "rndstr": "1.0.0", "s-age": "1.1.2", + "sass-loader": "^6.0.6", "seedrandom": "2.4.3", "serve-favicon": "2.4.5", "speakeasy": "2.0.0", @@ -181,7 +186,7 @@ "vue-template-compiler": "2.5.13", "vuedraggable": "2.16.0", "web-push": "3.3.0", - "webpack": "^3.11.0", + "webpack": "3.11.0", "webpack-cli": "^2.0.8", "webpack-replace-loader": "1.3.0", "websocket": "1.0.25", diff --git a/src/api/endpoints/i/update.ts b/src/api/endpoints/i/update.ts index 43c524504..fc12665ad 100644 --- a/src/api/endpoints/i/update.ts +++ b/src/api/endpoints/i/update.ts @@ -46,13 +46,19 @@ module.exports = async (params, user, _, isSecure) => new Promise(async (res, re if (bannerIdErr) return rej('invalid banner_id param'); if (bannerId) user.banner_id = bannerId; + // Get 'is_bot' parameter + const [isBot, isBotErr] = $(params.is_bot).optional.boolean().$; + if (isBotErr) return rej('invalid is_bot param'); + if (isBot) user.is_bot = isBot; + await User.update(user._id, { $set: { name: user.name, description: user.description, avatar_id: user.avatar_id, banner_id: user.banner_id, - profile: user.profile + profile: user.profile, + is_bot: user.is_bot } }); diff --git a/src/api/models/user.ts b/src/api/models/user.ts index e92f244dd..278b949db 100644 --- a/src/api/models/user.ts +++ b/src/api/models/user.ts @@ -75,6 +75,7 @@ export type IUser = { last_used_at: Date; latest_post: IPost; pinned_post_id: mongo.ObjectID; + is_bot: boolean; is_pro: boolean; is_suspended: boolean; keywords: string[]; diff --git a/src/web/app/common/views/components/poll.vue b/src/web/app/common/views/components/poll.vue index 7ed5bc6b1..556d8ebf6 100644 --- a/src/web/app/common/views/components/poll.vue +++ b/src/web/app/common/views/components/poll.vue @@ -5,14 +5,14 @@
- {{ choice.text }} + {{ choice.text }} ({{ '%i18n:common.tags.mk-poll.vote-count%'.replace('{}', choice.votes) }})

{{ '%i18n:common.tags.mk-poll.total-users%'.replace('{}', total) }} - ・ + {{ showResult ? '%i18n:common.tags.mk-poll.vote%' : '%i18n:common.tags.mk-poll.show-result%' }} %i18n:common.tags.mk-poll.voted%

@@ -98,8 +98,12 @@ export default Vue.extend({ background $theme-color transition width 1s ease - > .votes - margin-left 4px + > span + > [data-fa] + margin-right 4px + + > .votes + margin-left 4px > p a diff --git a/src/web/app/config.ts b/src/web/app/config.ts index 2461b2215..b51279192 100644 --- a/src/web/app/config.ts +++ b/src/web/app/config.ts @@ -12,6 +12,7 @@ declare const _SW_PUBLICKEY_: string; declare const _THEME_COLOR_: string; declare const _COPYRIGHT_: string; declare const _VERSION_: string; +declare const _LICENSE_: string; export const host = _HOST_; export const url = _URL_; @@ -27,3 +28,4 @@ export const swPublickey = _SW_PUBLICKEY_; export const themeColor = _THEME_COLOR_; export const copyright = _COPYRIGHT_; export const version = _VERSION_; +export const license = _LICENSE_; diff --git a/src/web/app/desktop/script.ts b/src/web/app/desktop/script.ts index f0412805e..78549741b 100644 --- a/src/web/app/desktop/script.ts +++ b/src/web/app/desktop/script.ts @@ -4,6 +4,7 @@ // Style import './style.styl'; +import '../../element.scss'; import init from '../init'; import fuckAdBlock from '../common/scripts/fuck-ad-block'; diff --git a/src/web/app/desktop/style.styl b/src/web/app/desktop/style.styl index 4d295035f..49f71fbde 100644 --- a/src/web/app/desktop/style.styl +++ b/src/web/app/desktop/style.styl @@ -1,6 +1,5 @@ @import "../app" @import "../reset" -@import "../../../../node_modules/cropperjs/dist/cropper.css" @import "./ui" diff --git a/src/web/app/desktop/views/components/settings.profile.vue b/src/web/app/desktop/views/components/settings.profile.vue index 97a382d79..218da67e8 100644 --- a/src/web/app/desktop/views/components/settings.profile.vue +++ b/src/web/app/desktop/views/components/settings.profile.vue @@ -22,6 +22,10 @@ +
+

その他

+ +
@@ -56,6 +60,11 @@ export default Vue.extend({ }).then(() => { (this as any).apis.notify('プロフィールを更新しました'); }); + }, + onChangeIsBot() { + (this as any).api('i/update', { + is_bot: (this as any).os.i.is_bot + }); } } }); diff --git a/src/web/app/desktop/views/components/settings.vue b/src/web/app/desktop/views/components/settings.vue index c210997c3..b65623e33 100644 --- a/src/web/app/desktop/views/components/settings.vue +++ b/src/web/app/desktop/views/components/settings.vue @@ -23,10 +23,7 @@
- +
@@ -71,7 +68,8 @@

%i18n:desktop.tags.mk-settings.license%

- %license% +
+ サードパーティ
@@ -84,6 +82,7 @@ import XMute from './settings.mute.vue'; import XPassword from './settings.password.vue'; import X2fa from './settings.2fa.vue'; import XApi from './settings.api.vue'; +import { docsUrl, license, lang } from '../../../config'; export default Vue.extend({ components: { @@ -96,10 +95,15 @@ export default Vue.extend({ data() { return { page: 'profile', - + license, showPostFormOnTopOfTl: false }; }, + computed: { + licenseUrl(): string { + return `${docsUrl}/${lang}/license`; + } + }, created() { this.showPostFormOnTopOfTl = (this as any).os.i.client_settings.showPostFormOnTopOfTl; }, @@ -162,13 +166,23 @@ export default Vue.extend({ color #4a535a > h1 - display block margin 0 0 1em 0 padding 0 0 8px 0 font-size 1em color #555 border-bottom solid 1px #eee + &, >>> * + > section + margin 32px 0 + + > h2 + margin 0 0 1em 0 + padding 0 0 8px 0 + font-size 1em + color #555 + border-bottom solid 1px #eee + > .web > div border-bottom solid 1px #eee diff --git a/src/web/app/init.ts b/src/web/app/init.ts index f9855fd5c..dc3057935 100644 --- a/src/web/app/init.ts +++ b/src/web/app/init.ts @@ -5,9 +5,11 @@ import Vue from 'vue'; import VueRouter from 'vue-router'; import VModal from 'vue-js-modal'; +import Element from 'element-ui'; Vue.use(VueRouter); Vue.use(VModal); +Vue.use(Element); // Register global directives require('./common/views/directives'); diff --git a/src/web/docs/api/entities/user.yaml b/src/web/docs/api/entities/user.yaml index e62ad84db..528b9b0e1 100644 --- a/src/web/docs/api/entities/user.yaml +++ b/src/web/docs/api/entities/user.yaml @@ -111,6 +111,12 @@ props: desc: ja: "ドライブの容量(bytes)" en: "The capacity of drive of this user (bytes)" + - name: "is_bot" + type: "boolean" + optional: true + desc: + ja: "botか否か(自己申告であることに留意)" + en: "Whether is bot or not" - name: "twitter" type: "object" optional: true diff --git a/src/web/element.scss b/src/web/element.scss new file mode 100644 index 000000000..917198e02 --- /dev/null +++ b/src/web/element.scss @@ -0,0 +1,12 @@ +/* Element variable definitons */ +/* SEE: http://element.eleme.io/#/en-US/component/custom-theme */ + +@import '../const.json'; + +/* theme color */ +$--color-primary: $themeColor; + +/* icon font path, required */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; diff --git a/webpack/webpack.config.ts b/webpack/webpack.config.ts index 775ecbd34..a87341945 100644 --- a/webpack/webpack.config.ts +++ b/webpack/webpack.config.ts @@ -3,6 +3,7 @@ */ import * as fs from 'fs'; +import jsonImporter from 'node-sass-json-importer'; const minify = require('html-minifier').minify; import I18nReplacer from '../src/common/build/i18n'; import { pattern as faPattern, replacement as faReplacement } from '../src/common/build/fa'; @@ -111,12 +112,28 @@ module.exports = Object.keys(langs).map(lang => { { loader: 'css-loader' }, { loader: 'stylus-loader' } ] + }, { + test: /\.scss$/, + exclude: /node_modules/, + use: [{ + loader: 'style-loader' + }, { + loader: 'css-loader' + }, { + loader: 'sass-loader', + options: { + importer: jsonImporter, + } + }] }, { test: /\.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] + }, { + test: /\.(eot|woff|woff2|svg|ttf)([\?]?.*)$/, + loader: 'file-loader' }, { test: /\.ts$/, exclude: /node_modules/,