UNPKG

daisho

Version:
1,560 lines (1,389 loc) 184 kB
import isFunction from 'es-is/function'; import moment from 'moment-timezone'; import analytics from 'shop.js-util/src/analytics'; import { requiresPostalCode, requiresState } from 'shop.js-util/src/country'; import { luhnCheck, cardFromNumber, cardType, restrictNumeric } from 'shop.js-util/src/card'; import { isZeroDecimal, isCrypto, renderUpdatedUICurrency, renderUICurrencyFromJSON, renderJSONCurrencyFromUI } from 'shop.js-util/src/currency'; import { rfc3339, mmddyyyy, yyyymmdd, ddmmyyyy, renderDate, renderUIDate, renderJSONDate } from 'shop.js-util/src/dates'; import { getLanguage } from 'shop.js-util/src/language'; import { renderCryptoQR } from 'shop.js-util/src/qrcodes'; import { getQueries, getReferrer, getMCIds } from 'shop.js-util/src/uri'; import Checkbox from 'el-controls/src/controls/checkbox'; import Text from 'el-controls/src/controls/text'; import 'el-controls/src'; import El from 'el.js'; import { bisect, tickStep, ticks, bisector } from 'd3-array'; import { interpolate, interpolateRound, interpolateNumber, interpolateCubehelixLong } from 'd3-interpolate'; import extent from 'd3-array/src/extent'; import { axisBottom, axisLeft } from 'd3-axis'; import { line, symbolCircle, symbol } from 'd3-shape'; import { select } from 'd3-selection'; import { transition } from 'd3-transition'; import legendColor from 'd3-svg-legend/src/color'; import tip from 'd3-tip'; import Tween from 'es-tween'; import randomColor from 'randomcolor'; import { Text as Text$1 } from 'el-controls'; import 'referential'; import observable from 'riot-observable'; import Hanzo from 'hanzo.js'; import { raf } from 'es-raf'; import akasha from 'akasha'; import currencies from 'shop.js-util/src/data/currencies'; // src/events.coffee var Events; Events = { Change: 'change', ChangeSuccess: 'change.success', ChangeFailed: 'change.failed', Login: 'daisho.login', LoginSuccess: 'daisho.login.success', LoginFailed: 'daisho.login.failed', Logout: 'daisho.logout', Refresh: 'daisho.refresh', ForceRefresh: 'daisho.refresh.force' }; var Events$1 = Events; // src/services/menu.coffee var MenuService; MenuService = (function() { MenuService.prototype.menu = null; MenuService.prototype.menuHash = null; MenuService.prototype.initFn = null; MenuService.prototype.daisho = null; MenuService.prototype.debug = false; function MenuService(daisho, debug) { this.daisho = daisho; this.debug = debug; this.menu = []; this.menuHash = {}; } MenuService.prototype.register = function(name, opts) { var action; if (this.menuHash[name]) { console.log('---MENU SERVICE---\nCollision for ' + name); } action = this.run(name); this.menuHash[name] = { name: name, action: action, icon: opts.icon, fn: isFunction(opts) ? opts : opts.action }; return this.menu.push(this.menuHash[name]); }; MenuService.prototype.run = function(name) { return (function(_this) { return function() { var data; data = _this.menuHash[name]; if (!data.action && _this.debug) { console.log('---MENU SERVICE---\n' + name + ' not registered'); } return data.fn(); }; })(this); }; return MenuService; })(); var Menu = MenuService; // src/utils.coffee var utils; var utils$1 = utils = { analytics: analytics, country: { requiresPostalCode: requiresPostalCode, requiresState: requiresState }, card: { luhnCheck: luhnCheck, cardFromNumber: cardFromNumber, cardType: cardType, restrictNumeric: restrictNumeric }, currency: { isZeroDecimal: isZeroDecimal, isCrypto: isCrypto, renderUpdatedUICurrency: renderUpdatedUICurrency, renderUICurrencyFromJSON: renderUICurrencyFromJSON, renderJSONCurrencyFromUI: renderJSONCurrencyFromUI, renderCurrency: renderUICurrencyFromJSON }, date: { rfc3339: rfc3339, mmddyyyy: mmddyyyy, yyyymmdd: yyyymmdd, ddmmyyyy: ddmmyyyy, renderDate: renderDate, renderUIDate: renderUIDate, renderJSONDate: renderJSONDate, moment: moment }, language: { getLanguage: getLanguage }, qrcode: { renderCryptoQR: renderCryptoQR }, uri: { getQueries: getQueries, getReferrer: getReferrer, getMCIds: getMCIds } }; utils.time = utils.date; utils.nav = { encode: function(id, opts) { var k, str, v; str = '/' + id + '/'; if (opts == null) { return str; } if (typeof opts === 'string') { if (opts !== '') { return str + opts + '/'; } return str; } for (k in opts) { v = opts[k]; str += k + ':' + v + '/'; } return str; }, decode: function(str) { var id, k, opts, parts, v, vs; opts = {}; parts = str.split('/'); id = parts.shift(); for (k in parts) { v = parts[k]; if (v === '') { continue; } vs = v.split(':'); if (vs.length === 1) { return [id, vs[0]]; } opts[k] = v; } return [id, opts]; } }; // src/services/page.coffee var PageService; PageService = (function() { PageService.prototype.cache = null; PageService.prototype.daisho = null; PageService.prototype.debug = false; PageService.prototype.current = null; PageService.prototype.initState = null; PageService.prototype.pushState = true; PageService.prototype.replaceState = false; function PageService(daisho, debug) { this.daisho = daisho; this.debug = debug; this.cache = {}; } PageService.prototype.mount = function() {}; PageService.prototype.update = function() {}; PageService.prototype.has = function(id) { return this.cache[id] != null; }; PageService.prototype.register = function(id, enterFn, startFn, stopFn) { var id2, opts, ref; if (this.cache[id]) { console.log('---PAGE SERVICE---\nCollision for ' + id); } if (enterFn && startFn && stopFn) { opts = { enterFn: enterFn, startFn: startFn, stopFn: stopFn }; } else if (enterFn) { opts = enterFn; } this.cache[id] = { id: id, enter: opts.enterFn, start: opts.startFn, stop: opts.stopFn, root: null, opts: null, state: {} }; if (this.initState == null) { this.initState = this.daisho.services.navigation.getState(); if (this.initState == null) { ref = utils$1.nav.decode(window.location.pathname.substr(1)), id2 = ref[0], opts = ref[1]; if (id2) { id = id2; } this.initState = { id: id, opts: opts }; return this.replaceState = true; } else { return this.pushState = false; } } }; PageService.prototype.show = function(id, opts) { var page; if (opts == null) { opts = {}; } page = this.cache[id]; if (opts != null) { page.opts = opts; } opts = page.opts; if (page == null) { console.log('---PAGE SERVICE---\n' + id + ' not registered'); } if (this.current != null) { this.current.root = this.current.stop.call(page.state, this); } if (!page.root) { page.root = page.enter.call(page.state, this, opts); page.root = page.start.call(page.state, this, opts); if (this.debug) { console.log('---PAGE SERVICE---\nDone serving page ' + id); } } else { page.root = page.start.call(page.state, this, opts); if (this.debug) { console.log('---PAGE SERVICE---\nDone serving page ' + id); } } if (this.replaceState) { this.pushState = true; this.replaceState = false; this.daisho.services.navigation.replaceState(id, opts); } else if (!this.pushState) { this.pushState = true; this.replaceState = false; } else { this.daisho.services.navigation.pushState(id, opts); } this.initState = null; this.daisho.scheduleUpdate(); this.current = page; return this.current; }; PageService.prototype.start = function() { this.daisho.services.navigation.onPopState((function(_this) { return function(state) { _this.pushState = false; _this.initState = state; return _this.show(state.id, state.opts); }; })(this)); return this.show(this.initState.id, this.initState.opts); }; return PageService; })(); var Page = PageService; // src/services/command.coffee var CommandService; CommandService = (function() { CommandService.prototype.commands = null; CommandService.prototype.daisho = null; function CommandService(daisho, debug) { this.daisho = daisho; this.debug = debug; this.commands = {}; } CommandService.prototype.register = function(command, hint, fn) { if (this.commands[command]) { console.log('---CMD SERVICE---\nCollision for ' + name); } return this.commands[command] = { command: command, hint: hint, fn: fn }; }; CommandService.prototype.find = function(command) { var cmd, found, opts, ref; found = []; ref = this.commands; for (cmd in ref) { opts = ref[cmd]; if (opts.command.indexOf(command) === 0) { found.push(opts); } } found.sort(function(a, b) { var nameA, nameB; nameA = a.command.toLowerCase(); nameB = b.command.toLowerCase(); if (nameA < nameB) { return -1; } if (nameA > nameB) { return 1; } return 0; }); return found; }; CommandService.prototype.execute = function(command, args) { var arg, cmd, i; for (i in args) { arg = args[i]; if (arg[0] === '"') { args[i] = args[i].substr(1); } if (arg.substr(-1) === '"') { args[i] = args[i].slice(0, -1); } } cmd = this.commands[command]; if (!cmd) { console.log('---COMMAND SERVICE---\n' + command + ' not registered'); } return cmd.fn.apply(this, args); }; return CommandService; })(); var Command = CommandService; // src/services/navigation.coffee var NavService; NavService = (function() { function NavService(daisho, debug) { this.daisho = daisho; this.debug = debug; } NavService.prototype.replaceState = function(id, opts) { var url; url = utils$1.nav.encode(id, opts); return history.replaceState(JSON.stringify({ id: id, opts: opts }), id, url); }; NavService.prototype.pushState = function(id, opts) { var url; url = utils$1.nav.encode(id, opts); return history.pushState(JSON.stringify({ id: id, opts: opts }), id, url); }; NavService.prototype.getState = function() { var json; json = null; try { json = JSON.parse(typeof history !== "undefined" && history !== null ? history.state : void 0); } catch (error) { console.log('---NAV SERVICE---\ncould not parse history state'); } return json; }; NavService.prototype.onPopState = function(cb) { var json; json = null; return window.onpopstate = function(event) { try { json = JSON.parse(event.state); } catch (error) { console.log('---NAV SERVICE---\ncould not parse history state'); } return cb(json); }; }; return NavService; })(); var Navigation = NavService; // src/services/index.coffee var Services; var Services$1 = Services = { Menu: Menu, Page: Page, Command: Command, Navigation: Navigation }; // src/templates/controls/switch.pug var html = "\n<input class=\"{invalid: errorMessage, valid: valid}\" id=\"{ input.name }\" name=\"{ name || input.name }\" type=\"checkbox\" onchange=\"{ change }\" onblur=\"{ change }\" checked=\"{ input.ref.get(input.name) }\">\n<label class=\"switch\" for=\"{ name || input.name }\">\n <div class=\"switch-slider\"></div>\n</label>\n<label class=\"label\" for=\"{ name || input.name }\">{ label }</label>\n<yield></yield>"; // src/views/controls/switch.coffee var Switch, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; var Switch$1 = Switch = (function(superClass) { extend(Switch, superClass); function Switch() { return Switch.__super__.constructor.apply(this, arguments); } Switch.prototype.tag = 'switch'; Switch.prototype.html = html; Switch.prototype.getValue = function(event) { return event.target.checked; }; return Switch; })(Checkbox); Switch.register(); // src/templates/controls/checkbox.pug var html$1 = "\n<input class=\"{invalid: errorMessage, valid: valid}\" id=\"{ input.name }\" name=\"{ name || input.name }\" type=\"checkbox\" onchange=\"{ change }\" onblur=\"{ change }\" checked=\"{ input.ref.get(input.name) }\">\n<label class=\"label\" for=\"{ name || input.name }\">{ label }</label>\n<yield></yield>"; // src/views/controls/checkbox.coffee var BetterCheckbox, extend$1 = function(child, parent) { for (var key in parent) { if (hasProp$1.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp$1 = {}.hasOwnProperty; var Checkbox$1 = BetterCheckbox = (function(superClass) { extend$1(BetterCheckbox, superClass); function BetterCheckbox() { return BetterCheckbox.__super__.constructor.apply(this, arguments); } BetterCheckbox.prototype.tag = 'checkbox'; BetterCheckbox.prototype.html = html$1; BetterCheckbox.prototype.getValue = function(event) { return event.target.checked; }; return BetterCheckbox; })(Switch$1); BetterCheckbox.register(); // src/vendor/baremetrics-calendar/calendar.coffee var Calendar, selectOneDate; Calendar = function(settings) { var self; self = this; this.settings = settings; this.calIsOpen = false; this.presetIsOpen = false; this.sameDayRange = settings.same_day_range || false; this.element = settings.element || $('.daterange'); this.selected = null; this.type = this.element.hasClass('daterange--single') ? 'single' : 'double'; this.required = settings.required === false ? false : true; this.format = settings.format || {}; this.format.input = settings.format && settings.format.input || 'MMMM D, YYYY'; this.format.preset = settings.format && settings.format.preset || 'll'; this.format.jump_month = settings.format && settings.format.jump_month || 'MMMM'; this.format.jump_year = settings.format && settings.format.jump_year || 'YYYY'; this.placeholder = settings.placeholder || this.format.input; this.days_array = settings.days_array && settings.days_array.length === 7 ? settings.days_array : moment.weekdaysMin(); this.orig_start_date = null; this.orig_end_date = null; this.orig_current_date = null; this.earliest_date = settings.earliest_date ? moment(settings.earliest_date) : moment('1900-01-01'); this.latest_date = settings.latest_date ? moment(settings.latest_date) : moment('2900-12-31'); this.end_date = settings.end_date ? moment(settings.end_date) : this.type === 'double' ? moment() : null; this.start_date = settings.start_date ? moment(settings.start_date) : this.type === 'double' ? this.end_date.clone().subtract(1, 'month') : null; this.current_date = settings.current_date ? moment(settings.current_date) : this.type === 'single' ? moment() : null; this.presets = settings.presets === false || this.type === 'single' ? false : true; this.callback = settings.callback || this.calendarSetDates; this.calendarHTML(this.type); $('.dr-presets', this.element).click(function() { self.presetToggle(); }); $('.dr-list-item', this.element).click(function() { var end, start; start = $('.dr-item-aside', this).data('start'); end = $('.dr-item-aside', this).data('end'); self.start_date = self.calendarCheckDate(start); self.end_date = self.calendarCheckDate(end); self.calendarSetDates(); self.presetToggle(); self.calendarSaveDates(); }); $('.dr-date', this.element).on({ 'click': function() { self.calendarOpen(this); }, 'keyup': function(event) { if (event.keyCode === 9 && !self.calIsOpen && !self.start_date && !self.end_date) { self.calendarOpen(this); } }, 'keydown': function(event) { var timeframe; var back, forward, timeframe; switch (event.keyCode) { case 9: if ($(self.selected).hasClass('dr-date-start')) { event.preventDefault(); self.calendarCheckDates(); self.calendarSetDates(); $('.dr-date-end', self.element).trigger('click'); } else { self.calendarCheckDates(); self.calendarSetDates(); self.calendarSaveDates(); self.calendarClose('force'); } break; case 13: event.preventDefault(); self.calendarCheckDates(); self.calendarSetDates(); self.calendarSaveDates(); self.calendarClose('force'); break; case 27: self.calendarSetDates(); self.calendarClose('force'); break; case 38: event.preventDefault(); timeframe = 'day'; if (event.shiftKey) { timeframe = 'week'; } if (event.metaKey) { timeframe = 'month'; } back = moment(self.current_date).subtract(1, timeframe); $(this).html(back.format(self.format.input)); self.current_date = back; break; case 40: event.preventDefault(); timeframe = 'day'; if (event.shiftKey) { timeframe = 'week'; } if (event.metaKey) { timeframe = 'month'; } forward = moment(self.current_date).add(1, timeframe); $(this).html(forward.format(self.format.input)); self.current_date = forward; } } }); $('.dr-month-switcher i', this.element).click(function() { var back, forward, m, this_moment, y; m = $('.dr-month-switcher span', self.element).data('month'); y = $('.dr-year-switcher span', self.element).data('year'); this_moment = moment([y, m, 1]); back = this_moment.clone().subtract(1, 'month'); forward = this_moment.clone().add(1, 'month').startOf('day'); if ($(this).hasClass('dr-left')) { self.calendarOpen(self.selected, back); } else if ($(this).hasClass('dr-right')) { self.calendarOpen(self.selected, forward); } }); $('.dr-year-switcher i', this.element).click(function() { var back, forward, m, this_moment, y; m = $('.dr-month-switcher span', self.element).data('month'); y = $('.dr-year-switcher span', self.element).data('year'); this_moment = moment([y, m, 1]); back = this_moment.clone().subtract(1, 'year'); forward = this_moment.clone().add(1, 'year').startOf('day'); if ($(this).hasClass('dr-left')) { self.calendarOpen(self.selected, back); } else if ($(this).hasClass('dr-right')) { self.calendarOpen(self.selected, forward); } }); $('.dr-dates-dash', this.element).click(function() { $('.dr-date-start', self.element).trigger('click'); }); this.element.on('click', function() { document.addEventListener('click', function(f) { var contains; contains = self.element.find(f.path[0]); if (!contains.length) { if (self.presetIsOpen) { self.presetToggle(); } if (self.calIsOpen) { if ($(self.selected).hasClass('dr-date-end')) { self.calendarSaveDates(); } self.calendarSetDates(); self.calendarClose('force'); } } }); }); }; selectOneDate = function(other, cal, date) { var string; string = moment(date).format(cal.format.input); if (other) { $('.dr-date', cal.element).not(cal.selected).html(other.format(cal.format.input)); } $(cal.selected).html(string); cal.calendarOpen(cal.selected); if ($(cal.selected).hasClass('dr-date-start')) { $('.dr-date-end', cal.element).trigger('click'); } else { cal.calendarSaveDates(); cal.calendarClose('force'); } }; Calendar.prototype.presetToggle = function() { if (this.presetIsOpen === false) { this.orig_start_date = this.start_date; this.orig_end_date = this.end_date; this.orig_current_date = this.current_date; this.presetIsOpen = true; } else if (this.presetIsOpen) { this.presetIsOpen = false; } if (this.calIsOpen === true) { this.calendarClose(); } $('.dr-preset-list', this.element).slideToggle(200); $('.dr-input', this.element).toggleClass('dr-active'); $('.dr-presets', this.element).toggleClass('dr-active'); this.element.toggleClass('dr-active'); }; Calendar.prototype.presetCreate = function() { var presets, self, ul_presets; self = this; ul_presets = $('<ul class="dr-preset-list" style="display: none;"></ul>'); presets = typeof self.settings.presets === 'object' ? self.settings.presets : [ { label: 'Last 30 days', start: moment(self.latest_date).subtract(29, 'days'), end: self.latest_date }, { label: 'Last month', start: moment(self.latest_date).subtract(1, 'month').startOf('month'), end: moment(self.latest_date).subtract(1, 'month').endOf('month') }, { label: 'Last 3 months', start: moment(self.latest_date).subtract(3, 'month').startOf('month'), end: moment(self.latest_date).subtract(1, 'month').endOf('month') }, { label: 'Last 6 months', start: moment(self.latest_date).subtract(6, 'month').startOf('month'), end: moment(self.latest_date).subtract(1, 'month').endOf('month') }, { label: 'Last year', start: moment(self.latest_date).subtract(12, 'month').startOf('month'), end: moment(self.latest_date).subtract(1, 'month').endOf('month') }, { label: 'All time', start: self.earliest_date, end: self.latest_date } ]; if (moment(self.latest_date).diff(moment(self.latest_date).startOf('month'), 'days') >= 6 && typeof self.settings.presets !== 'object') { presets.splice(1, 0, { label: 'This month', start: moment(self.latest_date).startOf('month'), end: self.latest_date }); } $.each(presets, function(i, d) { var endISO, item, startISO, string; if (moment(d.start).isBefore(self.earliest_date)) { d.start = self.earliest_date; } if (moment(d.start).isAfter(self.latest_date)) { d.start = self.latest_date; } if (moment(d.end).isBefore(self.earliest_date)) { d.end = self.earliest_date; } if (moment(d.end).isAfter(self.latest_date)) { d.end = self.latest_date; } startISO = moment(d.start).toISOString(); endISO = moment(d.end).toISOString(); string = moment(d.start).format(self.format.preset) + ' &ndash; ' + moment(d.end).format(self.format.preset); if ($('.dr-preset-list', self.element).length) { item = $('.dr-preset-list .dr-list-item:nth-of-type(' + i + 1 + ') .dr-item-aside', self.element); item.data('start', startISO); item.data('end', endISO); item.html(string); } else { ul_presets.append('<li class="dr-list-item">' + d.label + '<span class="dr-item-aside" data-start="' + startISO + '" data-end="' + endISO + '">' + string + '</span>' + '</li>'); } }); return ul_presets; }; Calendar.prototype.calendarSetDates = function() { var new_date, old_date; $('.dr-date-start', this.element).html(moment(this.start_date).format(this.format.input)); $('.dr-date-end', this.element).html(moment(this.end_date).format(this.format.input)); if (!this.start_date && !this.end_date) { old_date = $('.dr-date', this.element).html(); new_date = moment(this.current_date).format(this.format.input); if (old_date.length === 0 && !this.required) { new_date = ''; } if (old_date !== new_date) { $('.dr-date', this.element).html(new_date); } } }; Calendar.prototype.calendarSaveDates = function() { if (this.type === 'double') { if (!moment(this.orig_end_date).isSame(this.end_date) || !moment(this.orig_start_date).isSame(this.start_date)) { return this.callback(); } } else { if (!this.required || !moment(this.orig_current_date).isSame(this.current_date)) { return this.callback(); } } }; Calendar.prototype.calendarCheckDate = function(d) { var d_array, parsed_d, regex; if (d === 'today' || d === 'now') { if (moment().isAfter(this.latest_date)) { return this.latest_date; } else if (moment().isBefore(this.earliest_date)) { return this.earliest_date; } else { return moment(); } } if (d === 'earliest') { return this.earliest_date; } if (d === 'latest') { return this.latest_date; } if (d && (/\bago\b/.test(d) || /\bahead\b/.test(d))) { return this.stringToDate(d); } regex = /(?:\d)((?:st|nd|rd|th)?,?)/; d_array = d ? d.replace(regex, '').split(' ') : []; if (d_array.length === 2) { d_array.push(moment().format(this.format.jump_year)); d = d_array.join(' '); } parsed_d = this.parseDate(d); if (!parsed_d.isValid()) { return moment(d); } return parsed_d; }; Calendar.prototype.calendarCheckDates = function() { var c, e, endTxt, s, startTxt; startTxt = $('.dr-date-start', this.element).html(); endTxt = $('.dr-date-end', this.element).html(); c = this.calendarCheckDate($(this.selected).html()); s = void 0; e = void 0; if (startTxt === 'ytd' || endTxt === 'ytd') { s = moment().startOf('year'); e = moment().endOf('year'); } else { s = this.calendarCheckDate(startTxt); e = this.calendarCheckDate(endTxt); } if (c.isBefore(this.earliest_date)) { c = this.earliest_date; } if (s.isBefore(this.earliest_date)) { s = this.earliest_date; } if (e.isBefore(this.earliest_date) || e.isBefore(s)) { e = s.clone().add(6, 'day'); } if (c.isAfter(this.latest_date)) { c = this.latest_date; } if (e.isAfter(this.latest_date)) { e = this.latest_date; } if (s.isAfter(this.latest_date) || s.isAfter(e)) { s = e.clone().subtract(6, 'day'); } if (this.type === 'double') { if (s.isSame(e) && !this.sameDayRange) { return this.calendarSetDates(); } this.start_date = s.isValid() ? s : this.start_date; this.end_date = e.isValid() ? e : this.end_date; } this.current_date = c.isValid() ? c : this.current_date; }; Calendar.prototype.stringToDate = function(str) { var date_arr; date_arr = str.split(' '); if (date_arr[2] === 'ago') { return moment(this.current_date).subtract(date_arr[0], date_arr[1]); } else if (date_arr[2] === 'ahead') { return moment(this.current_date).add(date_arr[0], date_arr[1]); } return this.current_date; }; Calendar.prototype.calendarOpen = function(selected, switcher) { var cal_width, next_month, next_year, other, past_month, past_year, self, this_moment; self = this; other = void 0; cal_width = $('.dr-dates', this.element).innerWidth() - 8; this.selected = selected || this.selected; if (this.presetIsOpen === true) { this.presetToggle(); } if (this.calIsOpen === true) { this.calendarClose(switcher ? 'switcher' : void 0); } else if ($(this.selected).html().length) { this.orig_start_date = this.start_date; this.orig_end_date = this.end_date; this.orig_current_date = this.current_date; } this.calendarCheckDates(); this.calendarCreate(switcher); this.calendarSetDates(); next_month = moment(switcher || this.current_date).add(1, 'month').startOf('month').startOf('day'); past_month = moment(switcher || this.current_date).subtract(1, 'month').endOf('month'); next_year = moment(switcher || this.current_date).add(1, 'year').startOf('month').startOf('day'); past_year = moment(switcher || this.current_date).subtract(1, 'year').endOf('month'); this_moment = moment(switcher || this.current_date); $('.dr-month-switcher span', this.element).data('month', this_moment.month()).html(this_moment.format(this.format.jump_month)); $('.dr-year-switcher span', this.element).data('year', this_moment.year()).html(this_moment.format(this.format.jump_year)); $('.dr-switcher i', this.element).removeClass('dr-disabled'); if (next_month.isAfter(this.latest_date)) { $('.dr-month-switcher .dr-right', this.element).addClass('dr-disabled'); } if (past_month.isBefore(this.earliest_date)) { $('.dr-month-switcher .dr-left', this.element).addClass('dr-disabled'); } if (next_year.isAfter(this.latest_date)) { $('.dr-year-switcher .dr-right', this.element).addClass('dr-disabled'); } if (past_year.isBefore(this.earliest_date)) { $('.dr-year-switcher .dr-left', this.element).addClass('dr-disabled'); } $('.dr-day', this.element).on({ mouseenter: function() { var selected; var current_date, end_date, setMaybeRange, start_date; selected = $(this); start_date = moment(self.start_date); end_date = moment(self.end_date); current_date = moment(self.current_date); setMaybeRange = function(type) { other = void 0; self.range(6 * 7).forEach(function(i) { var curr, next, prev; next = selected.next().data('date'); prev = selected.prev().data('date'); curr = selected.data('date'); if (!curr) { return false; } if (!prev) { prev = curr; } if (!next) { next = curr; } if (type === 'start') { if (moment(next).isSame(self.end_date) || self.sameDayRange && moment(curr).isSame(self.end_date)) { return false; } if (moment(curr).isAfter(self.end_date)) { other = other || moment(curr).add(6, 'day').startOf('day'); if (i > 5 || (next ? moment(next).isAfter(self.latest_date) : false)) { $(selected).addClass('dr-end'); other = moment(curr); return false; } } selected = selected.next().addClass('dr-maybe'); } else if (type === 'end') { if (moment(prev).isSame(self.start_date) || self.sameDayRange && moment(curr).isSame(self.start_date)) { return false; } if (moment(curr).isBefore(self.start_date)) { other = other || moment(curr).subtract(6, 'day'); if (i > 5 || (prev ? moment(prev).isBefore(self.earliest_date) : false)) { $(selected).addClass('dr-start'); other = moment(curr); return false; } } selected = selected.prev().addClass('dr-maybe'); } }); }; if ($(self.selected).hasClass('dr-date-start')) { selected.addClass('dr-hover dr-hover-before'); $('.dr-start', self.element).css({ 'border': 'none', 'padding-left': '0.3125rem' }); setMaybeRange('start'); } if ($(self.selected).hasClass('dr-date-end')) { selected.addClass('dr-hover dr-hover-after'); $('.dr-end', self.element).css({ 'border': 'none', 'padding-right': '0.3125rem' }); setMaybeRange('end'); } if (!self.start_date && !self.end_date) { selected.addClass('dr-maybe'); } $('.dr-selected', self.element).css('background-color', 'transparent'); }, mouseleave: function() { if ($(this).hasClass('dr-hover-before dr-end')) { $(this).removeClass('dr-end'); } if ($(this).hasClass('dr-hover-after dr-start')) { $(this).removeClass('dr-start'); } $(this).removeClass('dr-hover dr-hover-before dr-hover-after'); $('.dr-start, .dr-end', self.element).css({ 'border': '', 'padding': '' }); $('.dr-maybe:not(.dr-current)', self.element).removeClass('dr-start dr-end'); $('.dr-day', self.element).removeClass('dr-maybe'); $('.dr-selected', self.element).css('background-color', ''); } }); if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) { $('.dr-day', this.element).on({ touchstart: function() { selectOneDate(other, self, $(this).data('date')); } }); $('div[contenteditable]', this.element).removeAttr('contenteditable'); } else { $('.dr-day', this.element).on({ mousedown: function() { selectOneDate(other, self, $(this).data('date')); } }); } $('.dr-calendar', this.element).css('width', cal_width).slideDown(200); $('.dr-input', this.element).addClass('dr-active'); $(selected).addClass('dr-active').focus(); this.element.addClass('dr-active'); this.calIsOpen = true; }; Calendar.prototype.calendarClose = function(type) { var self; self = this; if (!this.calIsOpen || this.presetIsOpen || type === 'force') { $('.dr-calendar', this.element).slideUp(200, function() { $('.dr-day', self.element).remove(); }); } else { $('.dr-day', this.element).remove(); } if (type === 'switcher') { return false; } $('.dr-input, .dr-date', this.element).removeClass('dr-active'); this.element.removeClass('dr-active'); this.calIsOpen = false; }; Calendar.prototype.calendarCreate = function(switcher) { var array, self; self = this; array = this.calendarArray(this.start_date, this.end_date, this.current_date, switcher); array.forEach(function(d, i) { var classString; classString = 'dr-day'; if (d.fade) { classString += ' dr-fade'; } if (d.start) { classString += ' dr-start'; } if (d.end) { classString += ' dr-end'; } if (d.current) { classString += ' dr-current'; } if (d.selected) { classString += ' dr-selected'; } if (d.outside) { classString += ' dr-outside'; } $('.dr-day-list', self.element).append('<li class="' + classString + '" data-date="' + d.date + '">' + d.str + '</li>'); }); }; Calendar.prototype.calendarArray = function(start, end, current, switcher) { var d, daysInRange, endRange, reference, self, startRange; self = this; current = moment(current || start || end).startOf('day'); reference = switcher || current || start || end; startRange = moment(reference).startOf('month').startOf('week'); endRange = moment(startRange).add(6 * 7 - 1, 'days').endOf('day'); daysInRange = []; d = moment(startRange); while (d.isBefore(endRange)) { daysInRange.push({ str: +d.format('D'), start: start && d.isSame(start, 'day'), end: end && d.isSame(end, 'day'), current: current && d.isSame(current, 'day'), selected: start && end && d.isBetween(start, end), date: d.toISOString(), outside: d.isBefore(self.earliest_date) || d.isAfter(self.latest_date), fade: !d.isSame(reference, 'month') }); d.add(1, 'd'); } return daysInRange; }; Calendar.prototype.calendarHTML = function(type) { var days, ul_days_of_the_week; ul_days_of_the_week = $('<ul class="dr-days-of-week-list"></ul>'); days = this.days_array.splice(moment.localeData().firstDayOfWeek()).concat(this.days_array.splice(0, moment.localeData().firstDayOfWeek())); $.each(days, function(i, elem) { ul_days_of_the_week.append('<li class="dr-day-of-week">' + elem + '</li>'); }); if (type === 'double') { return this.element.append('<div class="dr-input">' + '<div class="dr-dates">' + '<div class="dr-date dr-date-start" contenteditable>' + moment(this.start_date).format(this.format.input) + '</div>' + '<span class="dr-dates-dash">&ndash;</span>' + '<div class="dr-date dr-date-end" contenteditable>' + moment(this.end_date).format(this.format.input) + '</div>' + '</div>' + (this.presets ? '<div class="dr-presets">' + '<span class="dr-preset-bar"></span>' + '<span class="dr-preset-bar"></span>' + '<span class="dr-preset-bar"></span>' + '</div>' : '') + '</div>' + '<div class="dr-selections">' + '<div class="dr-calendar" style="display: none;">' + '<div class="dr-range-switcher">' + '<div class="dr-switcher dr-month-switcher">' + '<i class="dr-left"></i>' + '<span>April</span>' + '<i class="dr-right"></i>' + '</div>' + '<div class="dr-switcher dr-year-switcher">' + '<i class="dr-left"></i>' + '<span>2015</span>' + '<i class="dr-right"></i>' + '</div>' + '</div>' + ul_days_of_the_week[0].outerHTML + '<ul class="dr-day-list"></ul>' + '</div>' + (this.presets ? this.presetCreate()[0].outerHTML : '') + '</div>'); } return this.element.append('<div class="dr-input">' + '<div class="dr-dates">' + '<div class="dr-date" contenteditable placeholder="' + this.placeholder + '">' + (this.settings.current_date ? moment(this.current_date).format(this.format.input) : '') + '</div>' + '</div>' + '</div>' + '<div class="dr-selections">' + '<div class="dr-calendar" style="display: none;">' + '<div class="dr-range-switcher">' + '<div class="dr-switcher dr-month-switcher">' + '<i class="dr-left"></i>' + '<span></span>' + '<i class="dr-right"></i>' + '</div>' + '<div class="dr-switcher dr-year-switcher">' + '<i class="dr-left"></i>' + '<span></span>' + '<i class="dr-right"></i>' + '</div>' + '</div>' + ul_days_of_the_week[0].outerHTML + '<ul class="dr-day-list"></ul>' + '</div>' + '</div>'); }; Calendar.prototype.parseDate = function(d) { if (moment.defaultZone !== null && moment.hasOwnProperty('tz')) { return moment.tz(d, this.format.input, moment.defaultZone.name); } else { return moment(d, this.format.input); } }; Calendar.prototype.range = function(length) { var idx, range; range = new Array(length); idx = 0; while (idx < length) { range[idx] = idx; idx++; } return range; }; var Calendar$1 = Calendar; // src/templates/controls/date-range-picker.pug var html$2 = "\n<div class=\"daterange daterange--double\"></div>"; // src/views/controls/date-range-picker.coffee var DateRangePicker, moment$1, extend$2 = function(child, parent) { for (var key in parent) { if (hasProp$2.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp$2 = {}.hasOwnProperty; moment$1 = utils$1.date.moment; var DateRangePicker$1 = DateRangePicker = (function(superClass) { extend$2(DateRangePicker, superClass); function DateRangePicker() { return DateRangePicker.__super__.constructor.apply(this, arguments); } DateRangePicker.prototype.tag = 'date-range-picker-control'; DateRangePicker.prototype.html = html$2; DateRangePicker.prototype.after = '2015-01-01'; DateRangePicker.prototype.before = moment$1(); DateRangePicker.prototype.events = { updated: function() { return this.onUpdated(); }, mount: function() { return this.onUpdated(); } }; DateRangePicker.prototype.init = function() { return DateRangePicker.__super__.init.call(this); }; DateRangePicker.prototype.onUpdated = function() { var filter, self; if (!this.calendar) { filter = this.data.get('filter'); self = this; return this.calendar = new Calendar$1({ element: $(this.root).find('.daterange'), earliest_date: moment$1(this.after), latest_date: moment$1(this.before), start_date: filter[0], end_date: filter[1], callback: function() { var end, start, val; start = utils$1.date.renderJSONDate(this.start_date); end = utils$1.date.renderJSONDate(this.end_date); console.log('Start Date: ' + start + '\nEnd Date: ' + end); val = [start, end]; self.data.set('filter', val); self.change(); return self.changed(val); } }); } }; DateRangePicker.prototype.getValue = function(e) { return this.data.get('filter'); }; return DateRangePicker; })(Text); // src/templates/controls/numeric.pug var html$3 = "\n<yield from=\"input\">\n <input class=\"{invalid: errorMessage, valid: valid, labeled: label}\" id=\"{ getId() }\" name=\"{ getName() }\" type=\"{ type }\" onchange=\"{ change }\" onblur=\"{ change }\" riot-value=\"{ input.ref.get(input.name) }\" autocomplete=\"{ autocomplete }\" autofocus=\"{ autofocus }\" disabled=\"{ disabled }\" maxlength=\"{ maxlength }\" readonly=\"{ readonly }\" placeholder=\"{ placeholder }\">\n</yield>\n<yield from=\"label\">\n <div class=\"label { active: numericValue() || numericValue() == 0 || placeholder }\" if=\"{ label }\">{ label }</div>\n</yield>\n<yield from=\"error\">\n <div class=\"error\" if=\"{ errorMessage }\">{ errorMessage }</div>\n</yield>\n<yield from=\"instructions\">\n <div class=\"helper\" if=\"{ instructions &amp;&amp; !errorMessage }\">{ instructions }</div>\n</yield>\n<yield></yield>"; // src/views/controls/numeric.coffee var Numeric, extend$3 = function(child, parent) { for (var key in parent) { if (hasProp$3.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp$3 = {}.hasOwnProperty; Numeric = (function(superClass) { extend$3(Numeric, superClass); function Numeric() { return Numeric.__super__.constructor.apply(this, arguments); } Numeric.prototype.tag = 'numeric'; Numeric.prototype.html = html$3; Numeric.prototype.numericValue = function() { var val; val = parseFloat(this.input.ref.get(this.input.name)); if (isNaN(val)) { val = null; } return val; }; Numeric.prototype.getValue = function() { var val; val = Numeric.__super__.getValue.apply(this, arguments); val = parseFloat(val); if (isNaN(val)) { val = null; } return val; }; return Numeric; })(Text); var Numeric$1 = Numeric; // src/views/controls/index.coffee var Controls; var Controls$1 = Controls = { Checkbox: Checkbox$1, DateRangePicker: DateRangePicker$1, Numeric: Numeric$1, Switch: Switch$1, register: function() { Checkbox$1.register(); DateRangePicker$1.register(); Numeric$1.register(); return Switch$1.register(); } }; // src/views/dynamic.coffee var DynamicView, extend$4 = function(child, parent) { for (var key in parent) { if (hasProp$4.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp$4 = {}.hasOwnProperty; DynamicView = (function(superClass) { extend$4(DynamicView, superClass); function DynamicView() { return DynamicView.__super__.constructor.apply(this, arguments); } DynamicView.prototype.tag = 'daisho-dynamic'; DynamicView.prototype.html = ''; DynamicView.prototype._dataStaleField = null; DynamicView.prototype._dataStaleCached = ''; DynamicView.prototype._locked = false; DynamicView.prototype.autoRefresh = true; DynamicView.prototype.refreshTiming = 'before'; DynamicView.prototype._p = false; DynamicView.prototype.init = function() { var r; r = this._refresh; this._refresh = (function(_this) { return function() { var p; if (_this._locked) { return _this.locked; } _this._locked = true; p = r.apply(_this, arguments); _this._locked = p; if ((p != null ? p.then : void 0) != null) { p.then(function() { var e; try { _this._dataStaleCached = JSON.stringify(_this.data.get(_this._dataStaleField)); } catch (error) { e = error; console.error('could not save stale data', e); } return _this._locked = false; })["catch"](function(e) { return console.error('count not save stale data', e); }); } else { try { _this._dataStaleCached = JSON.stringify(_this.data.get(_this._dataStaleField)); } catch (error) { console.error('could not save stale data'); } _this._locked = false; } return p; }; })(this); if (this.autoRefresh) { if (this.mediator != null) { this.mediator.on(Events$1.Refresh, (function(_this) { return function() { return _this.refresh.apply(_this, arguments); }; })(this)); } if (this.refreshTiming === 'before') { this.on('update', (function(_this) { return function() { return _this.refresh.apply(_this, arguments); }; })(this)); } else { this.on('updated', (function(_this) { return function() { return _this.refresh.apply(_this, arguments); }; })(this)); } } if (this.mediator != null) { this.mediator.on(Events$1.ForceRefresh, (function(_this) { return function() { return _this._refresh.apply(_this, arguments); }; })(this)); } return DynamicView.__super__.init.call(this); }; DynamicView.prototype.refresh = function() { var _dataStaleCached; if ($(this.root).closest('body')[0] == null) { return; } _dataStaleCached = JSON.stringify(this.data.get(this._dataStaleField)); if (_dataStaleCached === this._dataStaleCached) { return; } return this._refresh.apply(this, arguments); }; DynamicView.prototype.show = function(id, opts) { return (function(_this) { return function() { return _this.services.page.show(id, opts); }; })(this); }; return DynamicView; })(El.Form); var Dynamic = DynamicView; // node_modules/d3-collection/src/map.js var prefix = "$"; function Map() {} Map.prototype = map.prototype = { constructor: Map, has: function(key) { return (prefix + key) in this; }, get: function(key) { return this[prefix + key]; }, set: function(key, value) { this[prefix + key] = value; return this; }, remove: function(key) { var property = prefix + key; return property in this && delete this[property]; }, clear: function() { for (var property in this) if (property[0] === prefix) delete this[property]; }, keys: function() { var keys = []; for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); return keys; }, values: function() { var values = []; for (var property in this) if (property[0] === prefix) values.push(this[property]); return values; }, entries: function() { var entries = []; for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); return entries; }, size: function() { var size = 0; for (var property in this) if (property[0] === prefix) ++size; return size; }, empty: function() { for (var property in this) if (property[0] === prefix) return false; return true; }, each: function(f) { for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); } }; function map(object, f) { var map = new Map; // Copy constructor. if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); // Index array by numeric index or specified key function. else if (Array.isArray(object)) { var i = -1, n = object.length, o; if (f == null) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f(o = object[i], i, object), o); } // Convert object to map. else if (object) for (var key in object) map.set(key, object[key]); return map; } // node_modules/d3-collection/src/nest.js // node_modules/d3-collection/src/set.js function Set() {} var proto = map.prototype; Set.prototype = set.prototype = { constructor: Set, has: proto.has, add: function(value) { value += ""; this[prefix + value] = value; return this; }, remove: proto.remove, clear: proto.clear, values: proto.keys, size: proto.size, empty: proto.empty, each: proto.each }; function set(object, f) { var set = new Set; // Copy constructor. if (object instanceof Set) object.each(function(value) { set.add(value); }); // Otherwise, assume it’s an array. else if (object) { var i = -1, n = object.length; if (f == null) while (++i < n) set.add(object[i]); else while (++i < n) set.add(f(object[i], i, object)); } return set; } // node_modules/d3-collection/src/keys.js // node_modules/d3-collection/src/values.js // node_modules/d3-collection/src/entries.js // node_modules/d3-collection/src/index.js // node_modules/d3-scale/src/array.js var array = Array.prototype; var map$1 = array.map; var slice = array.slice; // node_modules/d3-scale/src/ordinal.js var implicit = {name: "implicit"}; function ordinal(range) { var index = map(), domain = [], unknown = implicit; range = range == null ? [] : slice.call(range); function scale(d) { var key = d + "", i = index.get(key); if (!i) { if (unknown !== implicit) return unknown; index.set(key, i = domain.push(d)); } return range[(i - 1) % range.length]; } scale.domain = function(_) { if (!arguments.length) ret