monkeeShark/src/client/app/desktop/views/components/drive.file.vue

340 lines
6.8 KiB
Vue
Raw Normal View History

2018-02-14 10:03:48 +00:00
<template>
2018-07-24 19:36:02 +00:00
<div class="gvfdktuvdgwhmztnuekzkswkjygptfcv"
2018-02-14 10:03:48 +00:00
:data-is-selected="isSelected"
:data-is-contextmenu-showing="isContextmenuShowing"
@click="onClick"
draggable="true"
@dragstart="onDragstart"
@dragend="onDragend"
2018-02-18 03:35:18 +00:00
@contextmenu.prevent.stop="onContextmenu"
2018-02-14 10:03:48 +00:00
:title="title"
>
2018-08-18 18:56:44 +00:00
<div class="label" v-if="$store.state.i.avatarId == file.id">
<img src="/assets/label.svg"/>
<p>{{ $t('avatar') }}</p>
2018-02-14 10:03:48 +00:00
</div>
2018-08-18 18:56:44 +00:00
<div class="label" v-if="$store.state.i.bannerId == file.id">
<img src="/assets/label.svg"/>
<p>{{ $t('banner') }}</p>
2018-02-14 10:03:48 +00:00
</div>
2018-08-18 18:56:44 +00:00
<div class="label red" v-if="file.isSensitive">
<img src="/assets/label-red.svg"/>
<p>{{ $t('nsfw') }}</p>
2018-08-18 18:56:44 +00:00
</div>
<x-file-thumbnail class="thumbnail" :file="file" fit="contain"/>
2018-02-14 10:03:48 +00:00
<p class="name">
2018-02-18 03:35:18 +00:00
<span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span>
<span class="ext" v-if="file.name.lastIndexOf('.') != -1">{{ file.name.substr(file.name.lastIndexOf('.')) }}</span>
2018-02-14 10:03:48 +00:00
</p>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
2018-02-18 03:35:18 +00:00
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
import updateAvatar from '../../api/update-avatar';
import updateBanner from '../../api/update-banner';
import { appendQuery } from '../../../../../prelude/url';
import XFileThumbnail from '../../../common/views/components/drive-file-thumbnail.vue';
2018-02-14 10:03:48 +00:00
export default Vue.extend({
i18n: i18n('desktop/views/components/drive.file.vue'),
2018-02-18 03:35:18 +00:00
props: ['file'],
components: {
XFileThumbnail
},
2018-02-14 10:03:48 +00:00
data() {
return {
isContextmenuShowing: false,
isDragging: false
};
},
computed: {
2018-02-18 03:35:18 +00:00
browser(): any {
return this.$parent;
},
2018-02-14 10:03:48 +00:00
isSelected(): boolean {
return this.browser.selectedFiles.some(f => f.id == this.file.id);
},
title(): string {
Use PostgreSQL instead of MongoDB (#4572) * wip * Update note.ts * Update timeline.ts * Update core.ts * wip * Update generate-visibility-query.ts * wip * wip * wip * wip * wip * Update global-timeline.ts * wip * wip * wip * Update vote.ts * wip * wip * Update create.ts * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Update files.ts * wip * wip * Update CONTRIBUTING.md * wip * wip * wip * wip * wip * wip * wip * wip * Update read-notification.ts * wip * wip * wip * wip * wip * wip * wip * Update cancel.ts * wip * wip * wip * Update show.ts * wip * wip * Update gen-id.ts * Update create.ts * Update id.ts * wip * wip * wip * wip * wip * wip * wip * Docker: Update files about Docker (#4599) * Docker: Use cache if files used by `yarn install` was not updated This patch reduces the number of times to installing node_modules. For example, `yarn install` step will be skipped when only ".config/default.yml" is updated. * Docker: Migrate MongoDB to Postgresql Misskey uses Postgresql as a database instead of Mongodb since version 11. * Docker: Uncomment about data persistence This patch will save a lot of databases. * wip * wip * wip * Update activitypub.ts * wip * wip * wip * Update logs.ts * wip * Update drive-file.ts * Update register.ts * wip * wip * Update mentions.ts * wip * wip * wip * Update recommendation.ts * wip * Update index.ts * wip * Update recommendation.ts * Doc: Update docker.ja.md and docker.en.md (#1) (#4608) Update how to set up misskey. * wip * :v: * wip * Update note.ts * Update postgre.ts * wip * wip * wip * wip * Update add-file.ts * wip * wip * wip * Clean up * Update logs.ts * wip * :pizza: * wip * Ad notes * wip * Update api-visibility.ts * Update note.ts * Update add-file.ts * tests * tests * Update postgre.ts * Update utils.ts * wip * wip * Refactor * wip * Refactor * wip * wip * Update show-users.ts * Update update-instance.ts * wip * Update feed.ts * Update outbox.ts * Update outbox.ts * Update user.ts * wip * Update list.ts * Update update-hashtag.ts * wip * Update update-hashtag.ts * Refactor * Update update.ts * wip * wip * :v: * clean up * docs * Update push.ts * wip * Update api.ts * wip * :v: * Update make-pagination-query.ts * :v: * Delete hashtags.ts * Update instances.ts * Update instances.ts * Update create.ts * Update search.ts * Update reversi-game.ts * Update signup.ts * Update user.ts * id * Update example.yml * :art: * objectid * fix * reversi * reversi * Fix bug of chart engine * Add test of chart engine * Improve test * Better testing * Improve chart engine * Refactor * Add test of chart engine * Refactor * Add chart test * Fix bug * コミットし忘れ * Refactoring * :v: * Add tests * Add test * Extarct note tests * Refactor * 存在しないユーザーにメンションできなくなっていた問題を修正 * Fix bug * Update update-meta.ts * Fix bug * Update mention.vue * Fix bug * Update meta.ts * Update CONTRIBUTING.md * Fix bug * Fix bug * Fix bug * Clean up * Clean up * Update notification.ts * Clean up * Add mute tests * Add test * Refactor * Add test * Fix test * Refactor * Refactor * Add tests * Update utils.ts * Update utils.ts * Fix test * Update package.json * Update update.ts * Update manifest.ts * Fix bug * Fix bug * Add test * :art: * Update endpoint permissions * Updaye permisison * Update person.ts #4299 * データベースと同期しないように * Fix bug * Fix bug * Update reversi-game.ts * Use a feature of Node v11.7.0 to extract a public key (#4644) * wip * wip * :v: * Refactoring #1540 * test * test * test * test * test * test * test * Fix bug * Fix test * :sushi: * wip * #4471 * Add test for #4335 * Refactor * Fix test * Add tests * :clock4: * Fix bug * Add test * Add test * rename * Fix bug
2019-04-07 12:50:36 +00:00
return `${this.file.name}\n${this.file.type} ${Vue.filter('bytes')(this.file.size)}`;
2018-02-14 10:03:48 +00:00
}
},
methods: {
onClick() {
this.browser.chooseFile(this.file);
},
onContextmenu(e) {
this.isContextmenuShowing = true;
this.$contextmenu(e, [{
2018-02-18 03:35:18 +00:00
type: 'item',
text: this.$t('contextmenu.rename'),
icon: 'i-cursor',
2018-06-08 02:46:45 +00:00
action: this.rename
2018-02-18 03:35:18 +00:00
}, {
2018-07-19 17:40:37 +00:00
type: 'item',
text: this.file.isSensitive ? this.$t('contextmenu.unmark-as-sensitive') : this.$t('contextmenu.mark-as-sensitive'),
icon: this.file.isSensitive ? ['far', 'eye'] : ['far', 'eye-slash'],
2018-07-19 17:40:37 +00:00
action: this.toggleSensitive
}, null, {
2018-02-18 03:35:18 +00:00
type: 'item',
text: this.$t('contextmenu.copy-url'),
icon: 'link',
2018-06-08 02:46:45 +00:00
action: this.copyUrl
2018-02-18 03:35:18 +00:00
}, {
type: 'link',
href: appendQuery(this.file.url, 'download'),
text: this.$t('contextmenu.download'),
icon: 'download',
download: this.file.name
2018-06-08 02:46:45 +00:00
}, null, {
2018-02-18 03:35:18 +00:00
type: 'item',
text: this.$t('@.delete'),
icon: ['far', 'trash-alt'],
2018-06-08 02:46:45 +00:00
action: this.deleteFile
}, null, {
2018-02-18 03:35:18 +00:00
type: 'nest',
text: this.$t('contextmenu.else-files'),
2018-02-18 03:35:18 +00:00
menu: [{
type: 'item',
text: this.$t('contextmenu.set-as-avatar'),
2018-06-08 02:46:45 +00:00
action: this.setAsAvatar
2018-02-18 03:35:18 +00:00
}, {
type: 'item',
text: this.$t('contextmenu.set-as-banner'),
2018-06-08 02:46:45 +00:00
action: this.setAsBanner
2018-02-18 03:35:18 +00:00
}]
2018-08-13 13:08:59 +00:00
}, /*{
2018-02-18 03:35:18 +00:00
type: 'nest',
text: this.$t('contextmenu.open-in-app'),
2018-02-18 03:35:18 +00:00
menu: [{
type: 'item',
2018-05-20 11:26:38 +00:00
text: '%i18n:@contextmenu.add-app%...',
2018-06-08 02:46:45 +00:00
action: this.addApp
2018-02-18 03:35:18 +00:00
}]
2018-08-13 13:08:59 +00:00
}*/], {
closed: () => {
this.isContextmenuShowing = false;
}
});
2018-02-14 10:03:48 +00:00
},
onDragstart(e) {
e.dataTransfer.effectAllowed = 'move';
2018-02-26 21:25:17 +00:00
e.dataTransfer.setData('mk_drive_file', JSON.stringify(this.file));
2018-02-14 10:03:48 +00:00
this.isDragging = true;
// 親ブラウザに対して、ドラッグが開始されたフラグを立てる
// (=あなたの子供が、ドラッグを開始しましたよ)
this.browser.isDragSource = true;
},
onDragend(e) {
this.isDragging = false;
this.browser.isDragSource = false;
},
onThumbnailLoaded() {
2019-04-08 10:56:42 +00:00
if (this.file.properties.avgColor) {
2018-02-14 10:03:48 +00:00
anime({
targets: this.$refs.thumbnail,
2019-04-17 08:13:49 +00:00
backgroundColor: 'transparent', // TODO fade
2018-02-14 10:03:48 +00:00
duration: 100,
easing: 'linear'
});
}
2018-02-18 03:35:18 +00:00
},
rename() {
2018-12-02 11:10:53 +00:00
this.$root.dialog({
title: this.$t('contextmenu.rename-file'),
2018-12-02 11:10:53 +00:00
input: {
placeholder: this.$t('contextmenu.input-new-file-name'),
default: this.file.name,
allowEmpty: false
}
}).then(({ canceled, result: name }) => {
if (canceled) return;
2018-11-08 23:13:34 +00:00
this.$root.api('drive/files/update', {
2018-03-29 05:48:47 +00:00
fileId: this.file.id,
2018-02-18 03:35:18 +00:00
name: name
});
2018-02-18 03:35:18 +00:00
});
},
2018-07-19 17:40:37 +00:00
toggleSensitive() {
2018-11-08 23:13:34 +00:00
this.$root.api('drive/files/update', {
2018-07-19 17:40:37 +00:00
fileId: this.file.id,
isSensitive: !this.file.isSensitive
});
},
2018-02-18 03:35:18 +00:00
copyUrl() {
copyToClipboard(this.file.url);
2018-12-02 06:28:52 +00:00
this.$root.dialog({
title: this.$t('contextmenu.copied'),
2018-11-14 07:30:58 +00:00
text: this.$t('contextmenu.copied-url-to-clipboard')
2018-02-18 03:35:18 +00:00
});
},
setAsAvatar() {
updateAvatar(this.$root)(this.file);
2018-02-18 03:35:18 +00:00
},
setAsBanner() {
updateBanner(this.$root)(this.file);
2018-02-18 03:35:18 +00:00
},
addApp() {
alert('not implemented yet');
},
deleteFile() {
2018-11-08 23:13:34 +00:00
this.$root.api('drive/files/delete', {
fileId: this.file.id
});
2018-02-14 10:03:48 +00:00
}
}
});
</script>
<style lang="stylus" scoped>
2018-09-28 10:59:19 +00:00
.gvfdktuvdgwhmztnuekzkswkjygptfcv
2018-02-14 10:03:48 +00:00
padding 8px 0 0 0
2019-03-19 08:35:50 +00:00
min-height 180px
2018-02-14 10:03:48 +00:00
border-radius 4px
&, *
cursor pointer
&:hover
2018-04-28 23:51:17 +00:00
background rgba(#000, 0.05)
2018-02-14 10:03:48 +00:00
> .label
&:before
&:after
background #0b65a5
2018-08-18 18:56:44 +00:00
&.red
&:before
&:after
background #c12113
2018-02-14 10:03:48 +00:00
&:active
2018-04-28 23:51:17 +00:00
background rgba(#000, 0.1)
2018-02-14 10:03:48 +00:00
> .label
&:before
&:after
background #0b588c
2018-08-18 18:56:44 +00:00
&.red
&:before
&:after
background #ce2212
2018-02-14 10:03:48 +00:00
&[data-is-selected]
2018-09-26 11:19:35 +00:00
background var(--primary)
2018-02-14 10:03:48 +00:00
&:hover
2018-09-26 11:19:35 +00:00
background var(--primaryLighten10)
2018-02-14 10:03:48 +00:00
&:active
2018-09-26 11:19:35 +00:00
background var(--primaryDarken10)
2018-02-14 10:03:48 +00:00
> .label
&:before
&:after
display none
> .name
2018-09-26 11:19:35 +00:00
color var(--primaryForeground)
2018-02-14 10:03:48 +00:00
> .thumbnail
color var(--primaryForeground)
2018-02-14 10:03:48 +00:00
&[data-is-contextmenu-showing]
&:after
content ""
pointer-events none
position absolute
top -4px
right -4px
bottom -4px
left -4px
2018-09-26 11:19:35 +00:00
border 2px dashed var(--primaryAlpha03)
2018-02-14 10:03:48 +00:00
border-radius 4px
> .label
position absolute
top 0
left 0
pointer-events none
&:before
2018-08-18 18:56:44 +00:00
&:after
2018-02-14 10:03:48 +00:00
content ""
display block
position absolute
z-index 1
2018-08-18 18:56:44 +00:00
background #0c7ac9
&:before
2018-02-14 10:03:48 +00:00
top 0
left 57px
width 28px
height 8px
&:after
top 57px
left 0
width 8px
height 28px
2018-08-18 18:56:44 +00:00
&.red
&:before
&:after
background #c12113
2018-02-14 10:03:48 +00:00
> img
position absolute
z-index 2
top 0
left 0
> p
position absolute
z-index 3
top 19px
left -28px
width 120px
margin 0
text-align center
line-height 28px
color #fff
transform rotate(-45deg)
> .thumbnail
width 128px
height 128px
margin auto
color var(--driveFileIcon)
2018-02-14 10:03:48 +00:00
> .name
display block
margin 4px 0 0 0
font-size 0.8em
text-align center
word-break break-all
2018-09-28 10:59:19 +00:00
color var(--text)
2018-02-14 10:03:48 +00:00
overflow hidden
> .ext
opacity 0.5
</style>