<!DOCTYPE html>
<html>
<head>
<link href="//cdn.jsdelivr.net/picnicss/4.1.1/picnic.min.css" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<meta charset="utf-8">
<title>Mag.JS</title>
</head>
<body>
<h1>Hello Mag.JS!</h1>
<a target="_top" href="https://github.com/magnumjs/mag.js">GitHub</a>
<hr/>
<div class="hide">
<div id="contacts">
<a class="addLink" href="#">Add another attendee</a>
<fieldset>
<legend>Attendee #</legend>
<label>Name:</label>
<input name="name">
<br>
<label>Email:</label>
<input name="email">
<a href="#">remove</a>
</fieldset>
</div>
</div>
<div id="app">
<div class="volunteer-form">
<h3>Please enter your contact information:</h3>
<listcontacts></listcontacts>
<div id="total">
<label>Total:<span/></label><b>$10</b>
</div>
<div id="coupon">
<form>
<div class="errorcode"></div>
<label>Enter coupon (if you have one):</label>
<input name="coupon">
<button>Validate coupon</button>
</form>
</div>
</div>
<p><em>Hint: The correct coupon code is <b>happy</b></em>
</p>
</div>
<script src="//rawgit.com/magnumjs/mag.js/master/dist/mag.0.22.min.js"></script>
<script src="//rawgit.com/magnumjs/mag.js/master/dist/mag.addons.0.21.min.js"></script> <script src="contacts.js"></script>
<script src="coupon.js"></script>
<script src="total.js"></script>
<script src="volunteer-form.js"></script>
<script>
mag.module('app', VolunteerForm)
</script>
</body>
</html>
.hide {
display: none;
}
a { display: block;}
a:after {content:" \bb";}
#Mag.JS
## plunker demo of mithril 2 mag volunteer form
This is from the [Mithril tutorial-part 2](from http://gilbert.ghost.io/mithril-js-tutorial-2/)
var Contacts = {}
Contacts.model = function() {
this.name = mag.prop('[Your name]')
this.email = mag.prop('[Your email]')
};
Contacts.controller = function(props) {
mag.show(this)
var ctrl = this
ctrl.contacts = props.contacts
ctrl.add = function() {
var newModel = new Contacts.model()
ctrl.contacts().push(newModel)
}
ctrl.remove = function(idx) {
ctrl.contacts().splice(idx, 1)
}
}
Contacts.view = function(ctrl) {
ctrl.fieldset = ctrl.contacts().map(function(contact, idx) {
return {
'legend': "Attendee #" + (idx + 1),
name: {
_value: contact.name(),
_onchange: mag.withProp('value', contact.name)
},
email: {
_value: contact.email(),
_onchange: mag.withProp('value', contact.email)
},
a: removeAnchor(ctrl, idx)
}
})
ctrl.addLink = {
_onclick: ctrl.add,
_href: '#',
_text: 'Add another attendee'
}
}
function removeAnchor(ctrl, idx) {
if (ctrl.contacts().length >= 2) {
return {
_text: 'remove',
_onclick: ctrl.remove.bind({}, idx),
_href: '#'
}
}
}
var VolunteerForm = {}
VolunteerForm.controller = function() {
var ctrl = this
ctrl.contacts = mag.prop([new Contacts.model()])
ctrl.discount = mag.prop(0)
}
VolunteerForm.view = function(ctrl) {
ctrl['volunteer-form'] = {
'h3': 'Please enter your contact information:'
}
ctrl.listcontacts = mag.module('contacts', Contacts, {
contacts: ctrl.contacts
})
mag.module('total', Total, {
count: ctrl.contacts().length,
discount: ctrl.discount()
})
mag.module('coupon', Coupon, {
onSuccess: ctrl.discount
})
}
var Total = {}
Total.pricePerCount = 10
Total.calcPrice = function(discount, count) {
var total = count * Total.pricePerCount
return roundCents(total - total * discount)
}
Total.calcDiscount = function(discount, count) {
var total = count * Total.pricePerCount
return roundCents(total * discount)
}
Total.view = function(ctrl, props) {
var total = Total.calcPrice(props.discount, props.count)
var discountedAmount = Total.calcDiscount(props.discount, props.count)
ctrl.span = props.discount > 0 ? "(Coupon discount: -$" + discountedAmount + ")" : ''
ctrl.b = "$" + total
}
function roundCents(num) {
return Math.round(num * 100) / 100
}
var Coupon = {}
Coupon.controller = function(props) {
var ctrl = this
ctrl.code = mag.prop('')
ctrl.error = mag.prop(null)
ctrl.onSubmit = function(e) {
e.preventDefault()
ctrl.error('') // Clear error
validateCoupon(ctrl.code())
.then(props.onSuccess, ctrl.error)
}
}
Coupon.view = function(ctrl) {
ctrl.form = {
_onsubmit: ctrl.onSubmit
}
ctrl.errorcode = ctrl.error() ? "Invalid coupon." : ''
ctrl.coupon = {
_value: ctrl.code(),
_onchange: mag.withProp('value', ctrl.code)
}
}
function validateCoupon(code) {
var isValid = (code === 'happy')
var discount = 0.20
// Stub AJAX promise:
// We would expect the server to return the percent discount
var deferred = mag.deferred()
if (isValid) deferred.resolve(discount)
else deferred.reject('invalid_code')
return deferred.promise
}