wip
This commit is contained in:
		| @@ -1,138 +0,0 @@ | ||||
| <mk-contextmenu> | ||||
| 	<yield /> | ||||
| 	<style lang="stylus" scoped> | ||||
| 		:scope | ||||
| 			$width = 240px | ||||
| 			$item-height = 38px | ||||
| 			$padding = 10px | ||||
|  | ||||
| 			display none | ||||
| 			position fixed | ||||
| 			top 0 | ||||
| 			left 0 | ||||
| 			z-index 4096 | ||||
| 			width $width | ||||
| 			font-size 0.8em | ||||
| 			background #fff | ||||
| 			border-radius 0 4px 4px 4px | ||||
| 			box-shadow 2px 2px 8px rgba(0, 0, 0, 0.2) | ||||
| 			opacity 0 | ||||
|  | ||||
| 			ul | ||||
| 				display block | ||||
| 				margin 0 | ||||
| 				padding $padding 0 | ||||
| 				list-style none | ||||
|  | ||||
| 			li | ||||
| 				display block | ||||
|  | ||||
| 				&.separator | ||||
| 					margin-top $padding | ||||
| 					padding-top $padding | ||||
| 					border-top solid 1px #eee | ||||
|  | ||||
| 				&.has-child | ||||
| 					> p | ||||
| 						cursor default | ||||
|  | ||||
| 						> [data-fa]:last-child | ||||
| 							position absolute | ||||
| 							top 0 | ||||
| 							right 8px | ||||
| 							line-height $item-height | ||||
|  | ||||
| 					&:hover > ul | ||||
| 						visibility visible | ||||
|  | ||||
| 					&:active | ||||
| 						> p, a | ||||
| 							background $theme-color | ||||
|  | ||||
| 				> p, a | ||||
| 					display block | ||||
| 					z-index 1 | ||||
| 					margin 0 | ||||
| 					padding 0 32px 0 38px | ||||
| 					line-height $item-height | ||||
| 					color #868C8C | ||||
| 					text-decoration none | ||||
| 					cursor pointer | ||||
|  | ||||
| 					&:hover | ||||
| 						text-decoration none | ||||
|  | ||||
| 					* | ||||
| 						pointer-events none | ||||
|  | ||||
| 					> i | ||||
| 						width 28px | ||||
| 						margin-left -28px | ||||
| 						text-align center | ||||
|  | ||||
| 				&:hover | ||||
| 					> p, a | ||||
| 						text-decoration none | ||||
| 						background $theme-color | ||||
| 						color $theme-color-foreground | ||||
|  | ||||
| 				&:active | ||||
| 					> p, a | ||||
| 						text-decoration none | ||||
| 						background darken($theme-color, 10%) | ||||
| 						color $theme-color-foreground | ||||
|  | ||||
| 			li > ul | ||||
| 				visibility hidden | ||||
| 				position absolute | ||||
| 				top 0 | ||||
| 				left $width | ||||
| 				margin-top -($padding) | ||||
| 				width $width | ||||
| 				background #fff | ||||
| 				border-radius 0 4px 4px 4px | ||||
| 				box-shadow 2px 2px 8px rgba(0, 0, 0, 0.2) | ||||
| 				transition visibility 0s linear 0.2s | ||||
|  | ||||
| 	</style> | ||||
| 	<script lang="typescript"> | ||||
| 		import * as anime from 'animejs'; | ||||
| 		import contains from '../../common/scripts/contains'; | ||||
|  | ||||
| 		this.root.addEventListener('contextmenu', e => { | ||||
| 			e.preventDefault(); | ||||
| 		}); | ||||
|  | ||||
| 		this.mousedown = e => { | ||||
| 			e.preventDefault(); | ||||
| 			if (!contains(this.root, e.target) && (this.root != e.target)) this.close(); | ||||
| 			return false; | ||||
| 		}; | ||||
|  | ||||
| 		this.open = pos => { | ||||
| 			document.querySelectorAll('body *').forEach(el => { | ||||
| 				el.addEventListener('mousedown', this.mousedown); | ||||
| 			}); | ||||
|  | ||||
| 			this.root.style.display = 'block'; | ||||
| 			this.root.style.left = pos.x + 'px'; | ||||
| 			this.root.style.top = pos.y + 'px'; | ||||
|  | ||||
| 			anime({ | ||||
| 				targets: this.root, | ||||
| 				opacity: [0, 1], | ||||
| 				duration: 100, | ||||
| 				easing: 'linear' | ||||
| 			}); | ||||
| 		}; | ||||
|  | ||||
| 		this.close = () => { | ||||
| 			document.querySelectorAll('body *').forEach(el => { | ||||
| 				el.removeEventListener('mousedown', this.mousedown); | ||||
| 			}); | ||||
|  | ||||
| 			this.$emit('closed'); | ||||
| 			this.$destroy(); | ||||
| 		}; | ||||
| 	</script> | ||||
| </mk-contextmenu> | ||||
| @@ -1,44 +0,0 @@ | ||||
| <mk-drive-browser-base-contextmenu> | ||||
| 	<mk-contextmenu ref="ctx"> | ||||
| 		<ul> | ||||
| 			<li @click="parent.createFolder"> | ||||
| 				<p>%fa:R folder%%i18n:desktop.tags.mk-drive-browser-base-contextmenu.create-folder%</p> | ||||
| 			</li> | ||||
| 			<li @click="parent.upload"> | ||||
| 				<p>%fa:upload%%i18n:desktop.tags.mk-drive-browser-base-contextmenu.upload%</p> | ||||
| 			</li> | ||||
| 			<li @click="parent.urlUpload"> | ||||
| 				<p>%fa:cloud-upload-alt%%i18n:desktop.tags.mk-drive-browser-base-contextmenu.url-upload%</p> | ||||
| 			</li> | ||||
| 		</ul> | ||||
| 	</mk-contextmenu> | ||||
| 	<script lang="typescript"> | ||||
| 		this.browser = this.opts.browser; | ||||
|  | ||||
| 		this.on('mount', () => { | ||||
| 			this.$refs.ctx.on('closed', () => { | ||||
| 				this.$emit('closed'); | ||||
| 				this.$destroy(); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		this.open = pos => { | ||||
| 			this.$refs.ctx.open(pos); | ||||
| 		}; | ||||
|  | ||||
| 		this.createFolder = () => { | ||||
| 			this.browser.createFolder(); | ||||
| 			this.$refs.ctx.close(); | ||||
| 		}; | ||||
|  | ||||
| 		this.upload = () => { | ||||
| 			this.browser.selectLocalFile(); | ||||
| 			this.$refs.ctx.close(); | ||||
| 		}; | ||||
|  | ||||
| 		this.urlUpload = () => { | ||||
| 			this.browser.urlUpload(); | ||||
| 			this.$refs.ctx.close(); | ||||
| 		}; | ||||
| 	</script> | ||||
| </mk-drive-browser-base-contextmenu> | ||||
							
								
								
									
										142
									
								
								src/web/app/desktop/views/components/contextmenu.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								src/web/app/desktop/views/components/contextmenu.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| <template> | ||||
| <div class="mk-contextmenu" @contextmenu.prevent="() => {}"> | ||||
| 	<slot></slot> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| import * as anime from 'animejs'; | ||||
| import contains from '../../../common/scripts/contains'; | ||||
|  | ||||
| export default Vue.extend({ | ||||
| 	props: ['x', 'y'], | ||||
| 	mounted() { | ||||
| 		document.querySelectorAll('body *').forEach(el => { | ||||
| 			el.addEventListener('mousedown', this.onMousedown); | ||||
| 		}); | ||||
|  | ||||
| 		this.$el.style.display = 'block'; | ||||
| 		this.$el.style.left = this.x + 'px'; | ||||
| 		this.$el.style.top = this.y + 'px'; | ||||
|  | ||||
| 		anime({ | ||||
| 			targets: this.$el, | ||||
| 			opacity: [0, 1], | ||||
| 			duration: 100, | ||||
| 			easing: 'linear' | ||||
| 		}); | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		onMousedown(e) { | ||||
| 			e.preventDefault(); | ||||
| 			if (!contains(this.$el, e.target) && (this.$el != e.target)) this.close(); | ||||
| 			return false; | ||||
| 		}, | ||||
| 		close() { | ||||
| 			Array.from(document.querySelectorAll('body *')).forEach(el => { | ||||
| 				el.removeEventListener('mousedown', this.onMousedown); | ||||
| 			}); | ||||
|  | ||||
| 			this.$emit('closed'); | ||||
| 			this.$destroy(); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="stylus" scoped> | ||||
| .mk-contextmenu | ||||
| 	$width = 240px | ||||
| 	$item-height = 38px | ||||
| 	$padding = 10px | ||||
|  | ||||
| 	display none | ||||
| 	position fixed | ||||
| 	top 0 | ||||
| 	left 0 | ||||
| 	z-index 4096 | ||||
| 	width $width | ||||
| 	font-size 0.8em | ||||
| 	background #fff | ||||
| 	border-radius 0 4px 4px 4px | ||||
| 	box-shadow 2px 2px 8px rgba(0, 0, 0, 0.2) | ||||
| 	opacity 0 | ||||
|  | ||||
| 	ul | ||||
| 		display block | ||||
| 		margin 0 | ||||
| 		padding $padding 0 | ||||
| 		list-style none | ||||
|  | ||||
| 	li | ||||
| 		display block | ||||
|  | ||||
| 		&.separator | ||||
| 			margin-top $padding | ||||
| 			padding-top $padding | ||||
| 			border-top solid 1px #eee | ||||
|  | ||||
| 		&.has-child | ||||
| 			> p | ||||
| 				cursor default | ||||
|  | ||||
| 				> [data-fa]:last-child | ||||
| 					position absolute | ||||
| 					top 0 | ||||
| 					right 8px | ||||
| 					line-height $item-height | ||||
|  | ||||
| 			&:hover > ul | ||||
| 				visibility visible | ||||
|  | ||||
| 			&:active | ||||
| 				> p, a | ||||
| 					background $theme-color | ||||
|  | ||||
| 		> p, a | ||||
| 			display block | ||||
| 			z-index 1 | ||||
| 			margin 0 | ||||
| 			padding 0 32px 0 38px | ||||
| 			line-height $item-height | ||||
| 			color #868C8C | ||||
| 			text-decoration none | ||||
| 			cursor pointer | ||||
|  | ||||
| 			&:hover | ||||
| 				text-decoration none | ||||
|  | ||||
| 			* | ||||
| 				pointer-events none | ||||
|  | ||||
| 			> i | ||||
| 				width 28px | ||||
| 				margin-left -28px | ||||
| 				text-align center | ||||
|  | ||||
| 		&:hover | ||||
| 			> p, a | ||||
| 				text-decoration none | ||||
| 				background $theme-color | ||||
| 				color $theme-color-foreground | ||||
|  | ||||
| 		&:active | ||||
| 			> p, a | ||||
| 				text-decoration none | ||||
| 				background darken($theme-color, 10%) | ||||
| 				color $theme-color-foreground | ||||
|  | ||||
| 	li > ul | ||||
| 		visibility hidden | ||||
| 		position absolute | ||||
| 		top 0 | ||||
| 		left $width | ||||
| 		margin-top -($padding) | ||||
| 		width $width | ||||
| 		background #fff | ||||
| 		border-radius 0 4px 4px 4px | ||||
| 		box-shadow 2px 2px 8px rgba(0, 0, 0, 0.2) | ||||
| 		transition visibility 0s linear 0.2s | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										46
									
								
								src/web/app/desktop/views/components/drive-contextmenu.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/web/app/desktop/views/components/drive-contextmenu.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| <template> | ||||
| <mk-contextmenu ref="menu" @closed="onClosed"> | ||||
| 	<ul> | ||||
| 		<li @click="createFolder"> | ||||
| 			<p>%fa:R folder%%i18n:desktop.tags.mk-drive-browser-base-contextmenu.create-folder%</p> | ||||
| 		</li> | ||||
| 		<li @click="upload"> | ||||
| 			<p>%fa:upload%%i18n:desktop.tags.mk-drive-browser-base-contextmenu.upload%</p> | ||||
| 		</li> | ||||
| 		<li @click="urlUpload"> | ||||
| 			<p>%fa:cloud-upload-alt%%i18n:desktop.tags.mk-drive-browser-base-contextmenu.url-upload%</p> | ||||
| 		</li> | ||||
| 	</ul> | ||||
| </mk-contextmenu> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import Vue from 'vue'; | ||||
| export default Vue.extend({ | ||||
| 	props: ['browser'], | ||||
| 	mounted() { | ||||
|  | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		close() { | ||||
| 			(this.$refs.menu as any).close(); | ||||
| 		}, | ||||
| 		onClosed() { | ||||
| 			this.$emit('closed'); | ||||
| 			this.$destroy(); | ||||
| 		}, | ||||
| 		createFolder() { | ||||
| 			this.browser.createFolder(); | ||||
| 			this.close(); | ||||
| 		}, | ||||
| 		upload() { | ||||
| 			this.browser.selectLocalFile(); | ||||
| 			this.close(); | ||||
| 		}, | ||||
| 		urlUpload() { | ||||
| 			this.browser.urlUpload(); | ||||
| 			this.close(); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo