180 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
| <mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy">
 | |
| 	<span slot="header">
 | |
| 		<span v-html="title" :class="$style.title"></span>
 | |
| 		<span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}%i18n:@choose-file%)</span>
 | |
| 	</span>
 | |
| 
 | |
| 	<mk-drive
 | |
| 		ref="browser"
 | |
| 		:class="$style.browser"
 | |
| 		:multiple="multiple"
 | |
| 		@selected="onSelected"
 | |
| 		@change-selection="onChangeSelection"
 | |
| 	/>
 | |
| 	<div :class="$style.footer">
 | |
| 		<button :class="$style.upload" title="%i18n:@upload%" @click="upload">%fa:upload%</button>
 | |
| 		<button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
 | |
| 		<button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">%i18n:@ok%</button>
 | |
| 	</div>
 | |
| </mk-window>
 | |
| </template>
 | |
| 
 | |
| <script lang="ts">
 | |
| import Vue from 'vue';
 | |
| export default Vue.extend({
 | |
| 	props: {
 | |
| 		multiple: {
 | |
| 			default: false
 | |
| 		},
 | |
| 		title: {
 | |
| 			default: '%fa:R file%%i18n:@choose-prompt%s'
 | |
| 		}
 | |
| 	},
 | |
| 	data() {
 | |
| 		return {
 | |
| 			files: []
 | |
| 		};
 | |
| 	},
 | |
| 	methods: {
 | |
| 		onSelected(file) {
 | |
| 			this.files = [file];
 | |
| 			this.ok();
 | |
| 		},
 | |
| 		onChangeSelection(files) {
 | |
| 			this.files = files;
 | |
| 		},
 | |
| 		upload() {
 | |
| 			(this.$refs.browser as any).selectLocalFile();
 | |
| 		},
 | |
| 		ok() {
 | |
| 			this.$emit('selected', this.multiple ? this.files : this.files[0]);
 | |
| 			(this.$refs.window as any).close();
 | |
| 		},
 | |
| 		cancel() {
 | |
| 			(this.$refs.window as any).close();
 | |
| 		}
 | |
| 	}
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <style lang="stylus" module>
 | |
| @import '~const.styl'
 | |
| 
 | |
| .title
 | |
| 	> [data-fa]
 | |
| 		margin-right 4px
 | |
| 
 | |
| .count
 | |
| 	margin-left 8px
 | |
| 	opacity 0.7
 | |
| 
 | |
| .browser
 | |
| 	height calc(100% - 72px)
 | |
| 
 | |
| .footer
 | |
| 	height 72px
 | |
| 	background lighten($theme-color, 95%)
 | |
| 
 | |
| .upload
 | |
| 	display inline-block
 | |
| 	position absolute
 | |
| 	top 8px
 | |
| 	left 16px
 | |
| 	cursor pointer
 | |
| 	padding 0
 | |
| 	margin 8px 4px 0 0
 | |
| 	width 40px
 | |
| 	height 40px
 | |
| 	font-size 1em
 | |
| 	color rgba($theme-color, 0.5)
 | |
| 	background transparent
 | |
| 	outline none
 | |
| 	border solid 1px transparent
 | |
| 	border-radius 4px
 | |
| 
 | |
| 	&:hover
 | |
| 		background transparent
 | |
| 		border-color rgba($theme-color, 0.3)
 | |
| 
 | |
| 	&:active
 | |
| 		color rgba($theme-color, 0.6)
 | |
| 		background transparent
 | |
| 		border-color rgba($theme-color, 0.5)
 | |
| 		box-shadow 0 2px 4px rgba(darken($theme-color, 50%), 0.15) inset
 | |
| 
 | |
| 	&:focus
 | |
| 		&:after
 | |
| 			content ""
 | |
| 			pointer-events none
 | |
| 			position absolute
 | |
| 			top -5px
 | |
| 			right -5px
 | |
| 			bottom -5px
 | |
| 			left -5px
 | |
| 			border 2px solid rgba($theme-color, 0.3)
 | |
| 			border-radius 8px
 | |
| 
 | |
| .ok
 | |
| .cancel
 | |
| 	display block
 | |
| 	position absolute
 | |
| 	bottom 16px
 | |
| 	cursor pointer
 | |
| 	padding 0
 | |
| 	margin 0
 | |
| 	width 120px
 | |
| 	height 40px
 | |
| 	font-size 1em
 | |
| 	outline none
 | |
| 	border-radius 4px
 | |
| 
 | |
| 	&:focus
 | |
| 		&:after
 | |
| 			content ""
 | |
| 			pointer-events none
 | |
| 			position absolute
 | |
| 			top -5px
 | |
| 			right -5px
 | |
| 			bottom -5px
 | |
| 			left -5px
 | |
| 			border 2px solid rgba($theme-color, 0.3)
 | |
| 			border-radius 8px
 | |
| 
 | |
| 	&:disabled
 | |
| 		opacity 0.7
 | |
| 		cursor default
 | |
| 
 | |
| .ok
 | |
| 	right 16px
 | |
| 	color $theme-color-foreground
 | |
| 	background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%)
 | |
| 	border solid 1px lighten($theme-color, 15%)
 | |
| 
 | |
| 	&:not(:disabled)
 | |
| 		font-weight bold
 | |
| 
 | |
| 	&:hover:not(:disabled)
 | |
| 		background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%)
 | |
| 		border-color $theme-color
 | |
| 
 | |
| 	&:active:not(:disabled)
 | |
| 		background $theme-color
 | |
| 		border-color $theme-color
 | |
| 
 | |
| .cancel
 | |
| 	right 148px
 | |
| 	color #888
 | |
| 	background linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
 | |
| 	border solid 1px #e2e2e2
 | |
| 
 | |
| 	&:hover
 | |
| 		background linear-gradient(to bottom, #f9f9f9 0%, #ececec 100%)
 | |
| 		border-color #dcdcdc
 | |
| 
 | |
| 	&:active
 | |
| 		background #ececec
 | |
| 		border-color #dcdcdc
 | |
| 
 | |
| </style>
 | 
