@@ -18,3 +18,5 @@ require('./signin-history.tag');
 | 
			
		||||
require('./api-info.tag');
 | 
			
		||||
require('./twitter-setting.tag');
 | 
			
		||||
require('./authorized-apps.tag');
 | 
			
		||||
require('./poll.tag');
 | 
			
		||||
require('./poll-editor.tag');
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								src/web/app/common/tags/poll-editor.tag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/web/app/common/tags/poll-editor.tag
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
<mk-poll-editor>
 | 
			
		||||
	<ul>
 | 
			
		||||
		<li each={ choice, i in choices }>
 | 
			
		||||
			<input value={ choice } oninput={ oninput.bind(null, i) }>
 | 
			
		||||
			<button onclick={ remove.bind(null, i) }>削除</button>
 | 
			
		||||
		</li>
 | 
			
		||||
	</ul>
 | 
			
		||||
	<button onclick={ add }>選択肢を追加</button>
 | 
			
		||||
	<style type="stylus">
 | 
			
		||||
		:scope
 | 
			
		||||
			display block
 | 
			
		||||
 | 
			
		||||
			> ul
 | 
			
		||||
				display block
 | 
			
		||||
				margin 0
 | 
			
		||||
				padding 0
 | 
			
		||||
				list-style none
 | 
			
		||||
 | 
			
		||||
				> li
 | 
			
		||||
					display block
 | 
			
		||||
					margin 4px
 | 
			
		||||
					padding 8px 12px
 | 
			
		||||
					width 100%
 | 
			
		||||
 | 
			
		||||
	</style>
 | 
			
		||||
	<script>
 | 
			
		||||
		@choices = ['', '']
 | 
			
		||||
 | 
			
		||||
		@oninput = (i, e) ~>
 | 
			
		||||
			@choices[i] = e.target.value
 | 
			
		||||
 | 
			
		||||
		@add = ~>
 | 
			
		||||
			@choices.push ''
 | 
			
		||||
			@update!
 | 
			
		||||
 | 
			
		||||
		@remove = (i) ~>
 | 
			
		||||
			console.log i
 | 
			
		||||
			console.log @choices.filter((_, _i) -> _i != i)
 | 
			
		||||
			@choices = @choices.filter((_, _i) -> _i != i)
 | 
			
		||||
			@update!
 | 
			
		||||
 | 
			
		||||
		@get = ~>
 | 
			
		||||
			return {
 | 
			
		||||
				choices: @choices.filter (choice) -> choice != ''
 | 
			
		||||
			}
 | 
			
		||||
	</script>
 | 
			
		||||
</mk-poll-editor>
 | 
			
		||||
							
								
								
									
										73
									
								
								src/web/app/common/tags/poll.tag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/web/app/common/tags/poll.tag
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
<mk-poll>
 | 
			
		||||
	<ul>
 | 
			
		||||
		<li each={ poll.choices } onclick={ vote.bind(null, id) } class={ voted: voted }>
 | 
			
		||||
			<div class="backdrop" if={ parent.result } style={ 'width:' + (votes / parent.total * 100) + '%' }></div>
 | 
			
		||||
			<span>
 | 
			
		||||
				<i class="fa fa-check" if={ is_voted }></i>
 | 
			
		||||
				{ text }
 | 
			
		||||
				<span class="votes" if={ parent.result }>({ votes }票)</span>
 | 
			
		||||
			</span>
 | 
			
		||||
		</li>
 | 
			
		||||
	</ul>
 | 
			
		||||
	<p>{ total }人が投票</p>
 | 
			
		||||
	<style type="stylus">
 | 
			
		||||
		:scope
 | 
			
		||||
			display block
 | 
			
		||||
 | 
			
		||||
			> ul
 | 
			
		||||
				display block
 | 
			
		||||
				margin 0
 | 
			
		||||
				padding 0
 | 
			
		||||
				list-style none
 | 
			
		||||
 | 
			
		||||
				> li
 | 
			
		||||
					display block
 | 
			
		||||
					margin 4px
 | 
			
		||||
					padding 4px 8px
 | 
			
		||||
					width 100%
 | 
			
		||||
					border-radius 4px
 | 
			
		||||
					overflow hidden
 | 
			
		||||
					cursor pointer
 | 
			
		||||
 | 
			
		||||
					&:hover
 | 
			
		||||
						background rgba(0, 0, 0, 0.05)
 | 
			
		||||
 | 
			
		||||
					&:active
 | 
			
		||||
						background rgba(0, 0, 0, 0.1)
 | 
			
		||||
 | 
			
		||||
					> .backdrop
 | 
			
		||||
						position absolute
 | 
			
		||||
						top 0
 | 
			
		||||
						left 0
 | 
			
		||||
						height 100%
 | 
			
		||||
						background $theme-color
 | 
			
		||||
 | 
			
		||||
					> .votes
 | 
			
		||||
						margin-left 4px
 | 
			
		||||
 | 
			
		||||
	</style>
 | 
			
		||||
	<script>
 | 
			
		||||
		@mixin \api
 | 
			
		||||
 | 
			
		||||
		@post = @opts.post
 | 
			
		||||
		@poll = @post.poll
 | 
			
		||||
		@total = @poll.choices.reduce ((a, b) -> a + b.votes), 0
 | 
			
		||||
		@result = @poll.choices.some (c) -> c.is_voted
 | 
			
		||||
 | 
			
		||||
		@vote = (id) ~>
 | 
			
		||||
			if (@poll.choices.some (c) -> c.is_voted) then return
 | 
			
		||||
			@api \posts/polls/vote do
 | 
			
		||||
				post_id: @post.id
 | 
			
		||||
				choice: id
 | 
			
		||||
			.then ~>
 | 
			
		||||
				@poll.choices.for-each (c) ->
 | 
			
		||||
					if c.id == id
 | 
			
		||||
						c.votes++
 | 
			
		||||
						c.is_voted = true
 | 
			
		||||
				@update do
 | 
			
		||||
					poll: @poll
 | 
			
		||||
					result: true
 | 
			
		||||
					total: @total + 1
 | 
			
		||||
 | 
			
		||||
	</script>
 | 
			
		||||
</mk-poll>
 | 
			
		||||
		Reference in New Issue
	
	Block a user