81 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // License: LGPL-3.0-or-later
 | |
| const h = require('snabbdom/h')
 | |
| const flyd = require('flyd')
 | |
| const R = require('ramda')
 | |
| const request = require('../../common/request')
 | |
| const format = require('../../common/format')
 | |
| const branding = require('../../components/nonprofit-branding')
 | |
| flyd.mergeAll = require('flyd/module/mergeall')
 | |
| 
 | |
| const quantityLeft = require('./gift-option-quantity-left')
 | |
| const giftButton = require('./gift-option-button')
 | |
| 
 | |
| // Pass in a stream that has a value when the gift options need to be refreshed, so we know when to refresh em!
 | |
| function init(giftsNeedRefresh$, parentState) {
 | |
|   var state = {
 | |
|     timeRemaining$: parentState.timeRemaining$
 | |
|   , clickOption$: flyd.stream()
 | |
|   , openEditGiftModal$: flyd.stream()
 | |
|   }
 | |
| 
 | |
|   // XXX some legacy viewscript mixed in here
 | |
|   flyd.map(gift => {
 | |
|     appl.open_modal('giftOptionFormModal')
 | |
|     appl.def('gift_options', {current: gift, is_updating: true})
 | |
|     appl.def('gift_option_action', 'Edit')
 | |
|   }, state.openEditGiftModal$)
 | |
| 
 | |
|   const pageloadGifts$ = index()
 | |
|   const refreshedGifts$ = flyd.flatMap(index, giftsNeedRefresh$)
 | |
|   state.giftOptions$ = flyd.mergeAll([
 | |
|     pageloadGifts$
 | |
|   , refreshedGifts$
 | |
|   , flyd.stream([]) // default before ajax loads
 | |
|   ])
 | |
|   return state
 | |
| }
 | |
| 
 | |
| function index() {
 | |
|   const path = `/nonprofits/${app.nonprofit_id}/campaigns/${app.campaign_id}/campaign_gift_options`
 | |
|   return flyd.map(
 | |
|     req => req.body.data
 | |
|   , request({path, method: 'get'}).load
 | |
|   )
 | |
| }
 | |
| 
 | |
| function view(state) {
 | |
|   return h('aside.sideGifts.u-marginBottom--15', {
 | |
|     class: {'u-hide': !state.giftOptions$().length}
 | |
|   }, R.map(giftBox(state), state.giftOptions$())
 | |
|   )
 | |
| }
 | |
| 
 | |
| const giftBox = state => gift => {
 | |
|   return h('section.u-relative', [
 | |
|     h('div.sideGift.pastelBox--grey--dark', [
 | |
|       h('h5.u-marginTop--0', gift.name)
 | |
|     , totalContributions(gift)
 | |
|     , quantityLeft(gift)
 | |
|     , h('p.u-marginBottom--15', gift.description)
 | |
|     , h('div', [ giftButton(state, gift) ])
 | |
|     ])
 | |
|   , (app.current_campaign_editor && app.is_parent_campaign) // Show edit button only if the current user is a parent campaign editor
 | |
|     ? h('button.button--tiny.absolute.edit.hasShadow', {
 | |
|         on: {click: ev => state.openEditGiftModal$(gift)}
 | |
|       }, [
 | |
|         h('i.fa.fa-pencil')
 | |
|       , ' Edit Gift'
 | |
|       ])
 | |
|     : '' // do not show gift edit button
 | |
|   ])
 | |
| }
 | |
| 
 | |
| const totalContributions = gift => {
 | |
|   if(gift.hide_contributions) return ''
 | |
|   return h('p', [
 | |
|     h('i.fa.fa-star', { style: { color: branding.base} })
 | |
|   , ` ${format.numberWithCommas(gift.total_gifts)} Contribution${gift.total_gifts === 1 ? '' : 's'}`
 | |
|   ])
 | |
| }
 | |
| 
 | |
| module.exports = {view, init}
 | 
