daisho
Version:
Modular dashboard framework
1,560 lines (1,389 loc) • 184 kB
JavaScript
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) + ' – ' + 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">–</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 && !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