UNPKG

daisho

Version:
1 lines 332 kB
{"version":3,"file":"daisho.mjs","sources":["../src/events.coffee","../src/services/menu.coffee","../src/utils.coffee","../src/services/page.coffee","../src/services/command.coffee","../src/services/navigation.coffee","../src/services/index.coffee","../src/views/controls/switch.coffee","../src/views/controls/checkbox.coffee","../src/vendor/baremetrics-calendar/calendar.coffee","../src/views/controls/date-range-picker.coffee","../src/views/controls/numeric.coffee","../src/views/controls/index.coffee","../src/views/dynamic.coffee","../node_modules/d3-collection/src/map.js","../node_modules/d3-collection/src/set.js","../node_modules/d3-scale/src/array.js","../node_modules/d3-scale/src/ordinal.js","../node_modules/d3-scale/src/constant.js","../node_modules/d3-scale/src/number.js","../node_modules/d3-scale/src/continuous.js","../node_modules/d3-format/src/formatDecimal.js","../node_modules/d3-format/src/exponent.js","../node_modules/d3-format/src/formatGroup.js","../node_modules/d3-format/src/formatDefault.js","../node_modules/d3-format/src/formatPrefixAuto.js","../node_modules/d3-format/src/formatRounded.js","../node_modules/d3-format/src/formatTypes.js","../node_modules/d3-format/src/formatSpecifier.js","../node_modules/d3-format/src/locale.js","../node_modules/d3-format/src/defaultLocale.js","../node_modules/d3-format/src/precisionFixed.js","../node_modules/d3-format/src/precisionPrefix.js","../node_modules/d3-format/src/precisionRound.js","../node_modules/d3-scale/src/tickFormat.js","../node_modules/d3-scale/src/linear.js","../node_modules/d3-scale/src/nice.js","../node_modules/d3-time/src/interval.js","../node_modules/d3-time/src/millisecond.js","../node_modules/d3-time/src/duration.js","../node_modules/d3-time/src/second.js","../node_modules/d3-time/src/minute.js","../node_modules/d3-time/src/hour.js","../node_modules/d3-time/src/day.js","../node_modules/d3-time/src/week.js","../node_modules/d3-time/src/month.js","../node_modules/d3-time/src/year.js","../node_modules/d3-time/src/utcMinute.js","../node_modules/d3-time/src/utcHour.js","../node_modules/d3-time/src/utcDay.js","../node_modules/d3-time/src/utcWeek.js","../node_modules/d3-time/src/utcMonth.js","../node_modules/d3-time/src/utcYear.js","../node_modules/d3-time-format/src/locale.js","../node_modules/d3-time-format/src/defaultLocale.js","../node_modules/d3-time-format/src/isoFormat.js","../node_modules/d3-time-format/src/isoParse.js","../node_modules/d3-scale/src/time.js","../node_modules/d3-scale/src/colors.js","../node_modules/d3-scale/src/category10.js","../node_modules/d3-scale/src/category20b.js","../node_modules/d3-scale/src/category20c.js","../node_modules/d3-scale/src/category20.js","../node_modules/d3-color/src/define.js","../node_modules/d3-color/src/color.js","../node_modules/d3-color/src/math.js","../node_modules/d3-color/src/lab.js","../node_modules/d3-color/src/cubehelix.js","../node_modules/d3-scale/src/cubehelix.js","../node_modules/d3-scale/src/rainbow.js","../node_modules/d3-scale/src/viridis.js","../src/views/graphics/d3.coffee","../src/views/graphics/chart.coffee","../src/views/graphics/counter.coffee","../src/views/graphics/model.coffee","../src/views/graphics/index.coffee","../src/views/table.coffee","../src/views/table-row.coffee","../src/views/command-bar.coffee","../src/views/dynamic-table.coffee","../src/views/hanzo-dynamic-table.coffee","../src/views/hanzo-static-table.coffee","../src/mediator.coffee","../src/views/middleware/index.coffee","../src/views/login.coffee","../src/views/main.coffee","../src/views/menu.coffee","../src/views/modal.coffee","../src/views/filter-facets.coffee","../src/views/index.coffee","../src/blueprints.coffee","../src/index.coffee"],"sourcesContent":["Events =\n Change:\n 'change'\n ChangeSuccess:\n 'change.success'\n ChangeFailed:\n 'change.failed'\n\n Login:\n 'daisho.login'\n LoginSuccess:\n 'daisho.login.success'\n LoginFailed:\n 'daisho.login.failed'\n\n Logout:\n 'daisho.logout'\n\n Refresh:\n 'daisho.refresh'\n ForceRefresh:\n 'daisho.refresh.force'\n\nexport default Events\n","import isFunction from 'es-is/function'\n\n\nclass MenuService\n menu: null\n menuHash: null\n initFn: null\n daisho: null\n debug: false\n\n constructor: (@daisho, @debug) ->\n @menu = []\n @menuHash = {}\n\n register: (name, opts) ->\n if @menuHash[name]\n console.log '---MENU SERVICE---\\nCollision for ' + name\n\n action = @run name\n @menuHash[name] =\n name: name\n action: action\n icon: opts.icon\n fn: if isFunction opts then opts else opts.action\n @menu.push @menuHash[name]\n\n run: (name) ->\n return =>\n data = @menuHash[name]\n if !data.action && @debug\n console.log '---MENU SERVICE---\\n' + name + ' not registered'\n data.fn()\n\nexport default MenuService\n","import moment from 'moment-timezone'\nimport analytics from 'shop.js-util/src/analytics'\n\nimport {\n requiresPostalCode\n requiresState\n} from 'shop.js-util/src/country'\n\nimport {\n luhnCheck\n cardFromNumber\n cardType\n restrictNumeric\n} from 'shop.js-util/src/card'\n\nimport {\n isZeroDecimal\n isCrypto\n renderUpdatedUICurrency\n renderUICurrencyFromJSON\n renderJSONCurrencyFromUI\n} from 'shop.js-util/src/currency'\n\nimport {\n rfc3339\n mmddyyyy\n yyyymmdd\n ddmmyyyy\n renderDate\n renderUIDate\n renderJSONDate\n} from 'shop.js-util/src/dates'\n\nimport {\n getLanguage\n} from 'shop.js-util/src/language'\n\nimport {\n renderCryptoQR\n} from 'shop.js-util/src/qrcodes'\n\nimport {\n getQueries\n getReferrer\n getMCIds\n} from 'shop.js-util/src/uri'\n\nexport default utils =\n analytics: analytics\n\n country:\n requiresPostalCode: requiresPostalCode\n requiresState: requiresState\n\n card:\n luhnCheck: luhnCheck\n cardFromNumber: cardFromNumber\n cardType: cardType\n restrictNumeric: restrictNumeric\n\n currency:\n isZeroDecimal: isZeroDecimal\n isCrypto: isCrypto\n\n renderUpdatedUICurrency: renderUpdatedUICurrency\n renderUICurrencyFromJSON: renderUICurrencyFromJSON\n renderJSONCurrencyFromUI: renderJSONCurrencyFromUI\n\n renderCurrency: renderUICurrencyFromJSON\n\n date:\n rfc3339: rfc3339\n mmddyyyy: mmddyyyy\n yyyymmdd: yyyymmdd\n ddmmyyyy: ddmmyyyy\n\n renderDate: renderDate\n renderUIDate: renderUIDate\n renderJSONDate: renderJSONDate\n moment: moment\n\n language:\n getLanguage: getLanguage\n\n qrcode:\n renderCryptoQR: renderCryptoQR\n\n uri:\n getQueries: getQueries\n getReferrer: getReferrer\n getMCIds: getMCIds\n\n# alias incase you don't remember\nutils.time = utils.date\n\nutils.nav =\n encode: (id, opts) ->\n str = '/' + id + '/'\n if !opts?\n return str\n\n if typeof opts == 'string'\n if opts != ''\n return str + opts + '/'\n\n return str\n\n for k, v of opts\n str += k + ':' + v + '/'\n\n return str\n\n decode: (str) ->\n opts = {}\n\n parts = str.split '/'\n id = parts.shift()\n\n for k, v of parts\n if v == ''\n continue\n\n vs = v.split ':'\n\n if vs.length == 1\n return [id, vs[0]]\n\n opts[k] = v\n\n return [id, opts]\n\n\n"," import utils from '../utils'\n\n # PageService manages the page life cycle (doesn't do rendering)\n class PageService\n cache: null\n daisho: null\n debug: false\n current: null\n initState: null\n pushState: true\n # replaceState overwrites pushstate\n replaceState: false\n\n # Create the service\n constructor: (@daisho, @debug)->\n # Initialize the page cache\n @cache = {}\n\n mount: ->\n update: ->\n\n has: (id) ->\n return @cache[id]?\n\n # Register a page and its life cycle callbacks, then store the page in the\n # cache.\n register: (id, enterFn, startFn, stopFn) ->\n if @cache[id]\n console.log '---PAGE SERVICE---\\nCollision for ' + id\n\n if enterFn && startFn && stopFn\n opts =\n enterFn: enterFn\n startFn: startFn\n stopFn: stopFn\n else if enterFn\n opts = enterFn\n\n @cache[id] =\n id: id\n enter: opts.enterFn\n start: opts.startFn\n stop: opts.stopFn\n root: null\n opts: null\n state: {}\n\n # set the initial state\n if !@initState?\n @initState = @daisho.services.navigation.getState()\n if !@initState?\n [id2, opts] = utils.nav.decode window.location.pathname.substr 1\n\n id = id2 if id2\n\n @initState =\n id: id\n opts: opts\n @replaceState = true\n else\n @pushState = false\n\n # Show a registered page from the cache\n show: (id, opts = {}) ->\n page = @cache[id]\n page.opts = opts if opts?\n opts = page.opts\n\n if !page?\n console.log '---PAGE SERVICE---\\n' + id + ' not registered'\n\n if @current?\n @current.root = @current.stop.call page.state, @\n\n if !page.root\n page.root = page.enter.call page.state, @, opts\n page.root = page.start.call page.state, @, opts\n if @debug\n console.log '---PAGE SERVICE---\\nDone serving page ' + id\n else\n page.root = page.start.call page.state, @, opts\n if @debug\n console.log '---PAGE SERVICE---\\nDone serving page ' + id\n\n # replace state\n if @replaceState\n # overwrite push state\n @pushState = true\n @replaceState = false\n\n @daisho.services.navigation.replaceState(id, opts)\n # don't push state\n else if !@pushState\n @pushState = true\n @replaceState = false\n # push state\n else\n @daisho.services.navigation.pushState(id, opts)\n @initState = null\n\n @daisho.scheduleUpdate()\n\n @current = page\n @current\n\n start: ()->\n @daisho.services.navigation.onPopState (state)=>\n @pushState = false\n @initState = state\n @show state.id, state.opts\n\n @show @initState.id, @initState.opts\n\n export default PageService\n","class CommandService\n commands: null\n daisho: null\n\n constructor: (@daisho, @debug) ->\n @commands = {}\n\n register: (command, hint, fn) ->\n if @commands[command]\n console.log '---CMD SERVICE---\\nCollision for ' + name\n\n @commands[command] =\n command: command\n hint: hint\n fn: fn\n\n find: (command) ->\n found = []\n for cmd, opts of @commands\n if opts.command.indexOf(command)== 0\n found.push opts\n\n found.sort (a,b) ->\n nameA = a.command.toLowerCase()\n nameB = b.command.toLowerCase()\n if (nameA < nameB)\n return -1\n if (nameA > nameB)\n return 1\n return 0\n\n found\n\n execute: (command, args) ->\n for i, arg of args\n # strip quotes\n if arg[0] == '\"'\n args[i] = args[i].substr 1\n if arg.substr(-1) == '\"'\n args[i] = args[i].slice 0, -1\n cmd = @commands[command]\n if !cmd\n console.log '---COMMAND SERVICE---\\n' + command + ' not registered'\n cmd.fn.apply @, args\n\nexport default CommandService\n","# encode key value pairs\nimport utils from '../utils'\n\nclass NavService\n constructor: (@daisho, @debug)->\n\n replaceState: (id, opts)->\n url = utils.nav.encode id, opts\n\n history.replaceState JSON.stringify(\n id: id\n opts: opts\n ), id, url\n\n pushState: (id, opts)->\n url = utils.nav.encode id, opts\n\n history.pushState JSON.stringify(\n id: id\n opts: opts\n ), id, url\n\n getState: ()->\n json = null\n try\n json = JSON.parse history?.state\n catch e\n console.log '---NAV SERVICE---\\ncould not parse history state'\n\n return json\n\n onPopState: (cb)->\n json = null\n window.onpopstate = (event)->\n try\n json = JSON.parse event.state\n catch e\n console.log '---NAV SERVICE---\\ncould not parse history state'\n\n cb json\n\nexport default NavService\n\n","import Menu from './menu'\nimport Page from './page'\nimport Command from './command'\nimport Navigation from './navigation'\n\nexport default Services =\n Menu: Menu\n Page: Page\n Command: Command\n Navigation: Navigation\n","import Checkbox from 'el-controls/src/controls/checkbox'\n\nimport html from '../../templates/controls/switch'\n\nexport default class Switch extends Checkbox\n tag: 'switch'\n html: html\n getValue: (event)->\n return event.target.checked\n\nSwitch.register()\n","import Switch from './switch'\n\nimport html from '../../templates/controls/checkbox'\n\nexport default class BetterCheckbox extends Switch\n tag: 'checkbox'\n html: html\n getValue: (event)->\n return event.target.checked\n\nBetterCheckbox.register()\n\n","# Design by Chris Meeks\n# Code by Tyler van der Hoeven\n# https://github.com/Baremetrics/calendar\nimport moment from 'moment-timezone'\n\nCalendar = (settings) ->\n self = this\n @settings = settings\n @calIsOpen = false\n @presetIsOpen = false\n @sameDayRange = settings.same_day_range or false\n @element = settings.element or $('.daterange')\n @selected = null\n @type = if @element.hasClass('daterange--single') then 'single' else 'double'\n @required = if settings.required == false then false else true\n @format = settings.format or {}\n @format.input = settings.format and settings.format.input or 'MMMM D, YYYY'\n @format.preset = settings.format and settings.format.preset or 'll'\n @format.jump_month = settings.format and settings.format.jump_month or 'MMMM'\n @format.jump_year = settings.format and settings.format.jump_year or 'YYYY'\n @placeholder = settings.placeholder or @format.input\n @days_array = if settings.days_array and settings.days_array.length == 7 then settings.days_array else moment.weekdaysMin()\n @orig_start_date = null\n @orig_end_date = null\n @orig_current_date = null\n @earliest_date = if settings.earliest_date then moment(settings.earliest_date) else moment('1900-01-01')\n @latest_date = if settings.latest_date then moment(settings.latest_date) else moment('2900-12-31')\n @end_date = if settings.end_date then moment(settings.end_date) else if @type == 'double' then moment() else null\n @start_date = if settings.start_date then moment(settings.start_date) else if @type == 'double' then @end_date.clone().subtract(1, 'month') else null\n @current_date = if settings.current_date then moment(settings.current_date) else if @type == 'single' then moment() else null\n @presets = if settings.presets == false or @type == 'single' then false else true\n @callback = settings.callback or @calendarSetDates\n @calendarHTML @type\n $('.dr-presets', @element).click ->\n self.presetToggle()\n return\n $('.dr-list-item', @element).click ->\n start = $('.dr-item-aside', this).data('start')\n end = $('.dr-item-aside', this).data('end')\n self.start_date = self.calendarCheckDate(start)\n self.end_date = self.calendarCheckDate(end)\n self.calendarSetDates()\n self.presetToggle()\n self.calendarSaveDates()\n return\n $('.dr-date', @element).on\n 'click': ->\n self.calendarOpen this\n return\n 'keyup': (event) ->\n if event.keyCode == 9 and !self.calIsOpen and !self.start_date and !self.end_date\n self.calendarOpen this\n return\n 'keydown': (event) ->\n `var timeframe`\n switch event.keyCode\n when 9\n # Tab\n if $(self.selected).hasClass('dr-date-start')\n event.preventDefault()\n self.calendarCheckDates()\n self.calendarSetDates()\n $('.dr-date-end', self.element).trigger 'click'\n else\n self.calendarCheckDates()\n self.calendarSetDates()\n self.calendarSaveDates()\n self.calendarClose 'force'\n when 13\n # Enter\n event.preventDefault()\n self.calendarCheckDates()\n self.calendarSetDates()\n self.calendarSaveDates()\n self.calendarClose 'force'\n when 27\n # ESC\n self.calendarSetDates()\n self.calendarClose 'force'\n when 38\n # Up\n event.preventDefault()\n timeframe = 'day'\n if event.shiftKey\n timeframe = 'week'\n if event.metaKey\n timeframe = 'month'\n back = moment(self.current_date).subtract(1, timeframe)\n $(this).html back.format(self.format.input)\n self.current_date = back\n when 40\n # Down\n event.preventDefault()\n timeframe = 'day'\n if event.shiftKey\n timeframe = 'week'\n if event.metaKey\n timeframe = 'month'\n forward = moment(self.current_date).add(1, timeframe)\n $(this).html forward.format(self.format.input)\n self.current_date = forward\n return\n $('.dr-month-switcher i', @element).click ->\n m = $('.dr-month-switcher span', self.element).data('month')\n y = $('.dr-year-switcher span', self.element).data('year')\n this_moment = moment([\n y\n m\n 1\n ])\n back = this_moment.clone().subtract(1, 'month')\n forward = this_moment.clone().add(1, 'month').startOf('day')\n if $(this).hasClass('dr-left')\n self.calendarOpen self.selected, back\n else if $(this).hasClass('dr-right')\n self.calendarOpen self.selected, forward\n return\n $('.dr-year-switcher i', @element).click ->\n m = $('.dr-month-switcher span', self.element).data('month')\n y = $('.dr-year-switcher span', self.element).data('year')\n this_moment = moment([\n y\n m\n 1\n ])\n back = this_moment.clone().subtract(1, 'year')\n forward = this_moment.clone().add(1, 'year').startOf('day')\n if $(this).hasClass('dr-left')\n self.calendarOpen self.selected, back\n else if $(this).hasClass('dr-right')\n self.calendarOpen self.selected, forward\n return\n $('.dr-dates-dash', @element).click ->\n $('.dr-date-start', self.element).trigger 'click'\n return\n # Once you click into a selection.. this lets you click out\n @element.on 'click', ->\n document.addEventListener 'click', (f) ->\n contains = self.element.find(f.path[0])\n if !contains.length\n if self.presetIsOpen\n self.presetToggle()\n if self.calIsOpen\n if $(self.selected).hasClass('dr-date-end')\n self.calendarSaveDates()\n self.calendarSetDates()\n self.calendarClose 'force'\n return\n return\n return\n\nselectOneDate = (other, cal, date) ->\n string = moment(date).format(cal.format.input)\n if other\n $('.dr-date', cal.element).not(cal.selected).html other.format(cal.format.input)\n $(cal.selected).html string\n cal.calendarOpen cal.selected\n if $(cal.selected).hasClass('dr-date-start')\n $('.dr-date-end', cal.element).trigger 'click'\n else\n cal.calendarSaveDates()\n cal.calendarClose 'force'\n return\n\nCalendar::presetToggle = ->\n if @presetIsOpen == false\n @orig_start_date = @start_date\n @orig_end_date = @end_date\n @orig_current_date = @current_date\n @presetIsOpen = true\n else if @presetIsOpen\n @presetIsOpen = false\n if @calIsOpen == true\n @calendarClose()\n $('.dr-preset-list', @element).slideToggle 200\n $('.dr-input', @element).toggleClass 'dr-active'\n $('.dr-presets', @element).toggleClass 'dr-active'\n @element.toggleClass 'dr-active'\n return\n\nCalendar::presetCreate = ->\n self = this\n ul_presets = $('<ul class=\"dr-preset-list\" style=\"display: none;\"></ul>')\n presets = if typeof self.settings.presets == 'object' then self.settings.presets else [\n {\n label: 'Last 30 days'\n start: moment(self.latest_date).subtract(29, 'days')\n end: self.latest_date\n }\n {\n label: 'Last month'\n start: moment(self.latest_date).subtract(1, 'month').startOf('month')\n end: moment(self.latest_date).subtract(1, 'month').endOf('month')\n }\n {\n label: 'Last 3 months'\n start: moment(self.latest_date).subtract(3, 'month').startOf('month')\n end: moment(self.latest_date).subtract(1, 'month').endOf('month')\n }\n {\n label: 'Last 6 months'\n start: moment(self.latest_date).subtract(6, 'month').startOf('month')\n end: moment(self.latest_date).subtract(1, 'month').endOf('month')\n }\n {\n label: 'Last year'\n start: moment(self.latest_date).subtract(12, 'month').startOf('month')\n end: moment(self.latest_date).subtract(1, 'month').endOf('month')\n }\n {\n label: 'All time'\n start: self.earliest_date\n end: self.latest_date\n }\n ]\n if moment(self.latest_date).diff(moment(self.latest_date).startOf('month'), 'days') >= 6 and typeof self.settings.presets != 'object'\n presets.splice 1, 0,\n label: 'This month'\n start: moment(self.latest_date).startOf('month')\n end: self.latest_date\n $.each presets, (i, d) ->\n if moment(d.start).isBefore(self.earliest_date)\n d.start = self.earliest_date\n if moment(d.start).isAfter(self.latest_date)\n d.start = self.latest_date\n if moment(d.end).isBefore(self.earliest_date)\n d.end = self.earliest_date\n if moment(d.end).isAfter(self.latest_date)\n d.end = self.latest_date\n startISO = moment(d.start).toISOString()\n endISO = moment(d.end).toISOString()\n string = moment(d.start).format(self.format.preset) + ' &ndash; ' + moment(d.end).format(self.format.preset)\n if $('.dr-preset-list', self.element).length\n item = $('.dr-preset-list .dr-list-item:nth-of-type(' + i + 1 + ') .dr-item-aside', self.element)\n item.data 'start', startISO\n item.data 'end', endISO\n item.html string\n else\n ul_presets.append '<li class=\"dr-list-item\">' + d.label + '<span class=\"dr-item-aside\" data-start=\"' + startISO + '\" data-end=\"' + endISO + '\">' + string + '</span>' + '</li>'\n return\n ul_presets\n\nCalendar::calendarSetDates = ->\n $('.dr-date-start', @element).html moment(@start_date).format(@format.input)\n $('.dr-date-end', @element).html moment(@end_date).format(@format.input)\n if !@start_date and !@end_date\n old_date = $('.dr-date', @element).html()\n new_date = moment(@current_date).format(@format.input)\n if old_date.length == 0 and !@required\n new_date = ''\n if old_date != new_date\n $('.dr-date', @element).html new_date\n return\n\nCalendar::calendarSaveDates = ->\n if @type == 'double'\n if !moment(@orig_end_date).isSame(@end_date) or !moment(@orig_start_date).isSame(@start_date)\n return @callback()\n else\n if !@required or !moment(@orig_current_date).isSame(@current_date)\n return @callback()\n return\n\nCalendar::calendarCheckDate = (d) ->\n # Today\n if d == 'today' or d == 'now'\n return if moment().isAfter(@latest_date) then @latest_date else if moment().isBefore(@earliest_date) then @earliest_date else moment()\n # Earliest\n if d == 'earliest'\n return @earliest_date\n # Latest\n if d == 'latest'\n return @latest_date\n # Convert string to a date if keyword ago or ahead exists\n if d and (/\\bago\\b/.test(d) or /\\bahead\\b/.test(d))\n return @stringToDate(d)\n regex = /(?:\\d)((?:st|nd|rd|th)?,?)/\n d_array = if d then d.replace(regex, '').split(' ') else []\n # Add current year if year is not included\n if d_array.length == 2\n d_array.push moment().format(@format.jump_year)\n d = d_array.join(' ')\n # Convert using settings format\n parsed_d = @parseDate(d)\n if !parsed_d.isValid()\n return moment(d)\n # occurs when parsing preset dates\n parsed_d\n\nCalendar::calendarCheckDates = ->\n startTxt = $('.dr-date-start', @element).html()\n endTxt = $('.dr-date-end', @element).html()\n c = @calendarCheckDate($(@selected).html())\n s = undefined\n e = undefined\n # Modify strings via some specific keywords to create valid dates\n # Finally set all strings as dates\n if startTxt == 'ytd' or endTxt == 'ytd'\n # Year to date\n s = moment().startOf('year')\n e = moment().endOf('year')\n else\n s = @calendarCheckDate(startTxt)\n e = @calendarCheckDate(endTxt)\n if c.isBefore(@earliest_date)\n c = @earliest_date\n if s.isBefore(@earliest_date)\n s = @earliest_date\n if e.isBefore(@earliest_date) or e.isBefore(s)\n e = s.clone().add(6, 'day')\n if c.isAfter(@latest_date)\n c = @latest_date\n if e.isAfter(@latest_date)\n e = @latest_date\n if s.isAfter(@latest_date) or s.isAfter(e)\n s = e.clone().subtract(6, 'day')\n # Push and save if it's valid otherwise return to previous state\n if @type == 'double'\n # Is this a valid date?\n if s.isSame(e) and !@sameDayRange\n return @calendarSetDates()\n @start_date = if s.isValid() then s else @start_date\n @end_date = if e.isValid() then e else @end_date\n @current_date = if c.isValid() then c else @current_date\n return\n\nCalendar::stringToDate = (str) ->\n date_arr = str.split(' ')\n if date_arr[2] == 'ago'\n return moment(@current_date).subtract(date_arr[0], date_arr[1])\n else if date_arr[2] == 'ahead'\n return moment(@current_date).add(date_arr[0], date_arr[1])\n @current_date\n\nCalendar::calendarOpen = (selected, switcher) ->\n self = this\n other = undefined\n cal_width = $('.dr-dates', @element).innerWidth() - 8\n @selected = selected or @selected\n if @presetIsOpen == true\n @presetToggle()\n if @calIsOpen == true\n @calendarClose if switcher then 'switcher' else undefined\n else if $(@selected).html().length\n @orig_start_date = @start_date\n @orig_end_date = @end_date\n @orig_current_date = @current_date\n @calendarCheckDates()\n @calendarCreate switcher\n @calendarSetDates()\n next_month = moment(switcher or @current_date).add(1, 'month').startOf('month').startOf('day')\n past_month = moment(switcher or @current_date).subtract(1, 'month').endOf('month')\n next_year = moment(switcher or @current_date).add(1, 'year').startOf('month').startOf('day')\n past_year = moment(switcher or @current_date).subtract(1, 'year').endOf('month')\n this_moment = moment(switcher or @current_date)\n $('.dr-month-switcher span', @element).data('month', this_moment.month()).html this_moment.format(@format.jump_month)\n $('.dr-year-switcher span', @element).data('year', this_moment.year()).html this_moment.format(@format.jump_year)\n $('.dr-switcher i', @element).removeClass 'dr-disabled'\n if next_month.isAfter(@latest_date)\n $('.dr-month-switcher .dr-right', @element).addClass 'dr-disabled'\n if past_month.isBefore(@earliest_date)\n $('.dr-month-switcher .dr-left', @element).addClass 'dr-disabled'\n if next_year.isAfter(@latest_date)\n $('.dr-year-switcher .dr-right', @element).addClass 'dr-disabled'\n if past_year.isBefore(@earliest_date)\n $('.dr-year-switcher .dr-left', @element).addClass 'dr-disabled'\n $('.dr-day', @element).on\n mouseenter: ->\n `var selected`\n selected = $(this)\n start_date = moment(self.start_date)\n end_date = moment(self.end_date)\n current_date = moment(self.current_date)\n\n setMaybeRange = (type) ->\n other = undefined\n self.range(6 * 7).forEach (i) ->\n next = selected.next().data('date')\n prev = selected.prev().data('date')\n curr = selected.data('date')\n if !curr\n return false\n if !prev\n prev = curr\n if !next\n next = curr\n if type == 'start'\n if moment(next).isSame(self.end_date) or self.sameDayRange and moment(curr).isSame(self.end_date)\n return false\n if moment(curr).isAfter(self.end_date)\n other = other or moment(curr).add(6, 'day').startOf('day')\n if i > 5 or (if next then moment(next).isAfter(self.latest_date) else false)\n $(selected).addClass 'dr-end'\n other = moment(curr)\n return false\n selected = selected.next().addClass('dr-maybe')\n else if type == 'end'\n if moment(prev).isSame(self.start_date) or self.sameDayRange and moment(curr).isSame(self.start_date)\n return false\n if moment(curr).isBefore(self.start_date)\n other = other or moment(curr).subtract(6, 'day')\n if i > 5 or (if prev then moment(prev).isBefore(self.earliest_date) else false)\n $(selected).addClass 'dr-start'\n other = moment(curr)\n return false\n selected = selected.prev().addClass('dr-maybe')\n return\n return\n\n if $(self.selected).hasClass('dr-date-start')\n selected.addClass 'dr-hover dr-hover-before'\n $('.dr-start', self.element).css\n 'border': 'none'\n 'padding-left': '0.3125rem'\n setMaybeRange 'start'\n if $(self.selected).hasClass('dr-date-end')\n selected.addClass 'dr-hover dr-hover-after'\n $('.dr-end', self.element).css\n 'border': 'none'\n 'padding-right': '0.3125rem'\n setMaybeRange 'end'\n if !self.start_date and !self.end_date\n selected.addClass 'dr-maybe'\n $('.dr-selected', self.element).css 'background-color', 'transparent'\n return\n mouseleave: ->\n if $(this).hasClass('dr-hover-before dr-end')\n $(this).removeClass 'dr-end'\n if $(this).hasClass('dr-hover-after dr-start')\n $(this).removeClass 'dr-start'\n $(this).removeClass 'dr-hover dr-hover-before dr-hover-after'\n $('.dr-start, .dr-end', self.element).css\n 'border': ''\n 'padding': ''\n $('.dr-maybe:not(.dr-current)', self.element).removeClass 'dr-start dr-end'\n $('.dr-day', self.element).removeClass 'dr-maybe'\n $('.dr-selected', self.element).css 'background-color', ''\n return\n if /iPad|iPhone|iPod/.test(navigator.userAgent) and !window.MSStream\n $('.dr-day', @element).on touchstart: ->\n selectOneDate other, self, $(this).data('date')\n return\n $('div[contenteditable]', @element).removeAttr 'contenteditable'\n else\n $('.dr-day', @element).on mousedown: ->\n selectOneDate other, self, $(this).data('date')\n return\n $('.dr-calendar', @element).css('width', cal_width).slideDown 200\n $('.dr-input', @element).addClass 'dr-active'\n $(selected).addClass('dr-active').focus()\n @element.addClass 'dr-active'\n @calIsOpen = true\n return\n\nCalendar::calendarClose = (type) ->\n self = this\n if !@calIsOpen or @presetIsOpen or type == 'force'\n $('.dr-calendar', @element).slideUp 200, ->\n $('.dr-day', self.element).remove()\n return\n else\n $('.dr-day', @element).remove()\n if type == 'switcher'\n return false\n $('.dr-input, .dr-date', @element).removeClass 'dr-active'\n @element.removeClass 'dr-active'\n @calIsOpen = false\n return\n\nCalendar::calendarCreate = (switcher) ->\n self = this\n array = @calendarArray(@start_date, @end_date, @current_date, switcher)\n array.forEach (d, i) ->\n classString = 'dr-day'\n if d.fade\n classString += ' dr-fade'\n if d.start\n classString += ' dr-start'\n if d.end\n classString += ' dr-end'\n if d.current\n classString += ' dr-current'\n if d.selected\n classString += ' dr-selected'\n if d.outside\n classString += ' dr-outside'\n $('.dr-day-list', self.element).append '<li class=\"' + classString + '\" data-date=\"' + d.date + '\">' + d.str + '</li>'\n return\n return\n\nCalendar::calendarArray = (start, end, current, switcher) ->\n self = this\n current = moment(current or start or end).startOf('day')\n reference = switcher or current or start or end\n startRange = moment(reference).startOf('month').startOf('week')\n endRange = moment(startRange).add(6 * 7 - 1, 'days').endOf('day')\n daysInRange = []\n d = moment(startRange)\n while d.isBefore(endRange)\n daysInRange.push\n str: +d.format('D')\n start: start and d.isSame(start, 'day')\n end: end and d.isSame(end, 'day')\n current: current and d.isSame(current, 'day')\n selected: start and end and d.isBetween(start, end)\n date: d.toISOString()\n outside: d.isBefore(self.earliest_date) or d.isAfter(self.latest_date)\n fade: !d.isSame(reference, 'month')\n d.add 1, 'd'\n daysInRange\n\nCalendar::calendarHTML = (type) ->\n ul_days_of_the_week = $('<ul class=\"dr-days-of-week-list\"></ul>')\n days = @days_array.splice(moment.localeData().firstDayOfWeek()).concat(@days_array.splice(0, moment.localeData().firstDayOfWeek()))\n $.each days, (i, elem) ->\n ul_days_of_the_week.append '<li class=\"dr-day-of-week\">' + elem + '</li>'\n return\n if type == 'double'\n return @element.append('<div class=\"dr-input\">' + '<div class=\"dr-dates\">' + '<div class=\"dr-date dr-date-start\" contenteditable>' + moment(@start_date).format(@format.input) + '</div>' + '<span class=\"dr-dates-dash\">&ndash;</span>' + '<div class=\"dr-date dr-date-end\" contenteditable>' + moment(@end_date).format(@format.input) + '</div>' + '</div>' + (if @presets then '<div class=\"dr-presets\">' + '<span class=\"dr-preset-bar\"></span>' + '<span class=\"dr-preset-bar\"></span>' + '<span class=\"dr-preset-bar\"></span>' + '</div>' else '') + '</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>' + (if @presets then @presetCreate()[0].outerHTML else '') + '</div>')\n @element.append '<div class=\"dr-input\">' + '<div class=\"dr-dates\">' + '<div class=\"dr-date\" contenteditable placeholder=\"' + @placeholder + '\">' + (if @settings.current_date then moment(@current_date).format(@format.input) else '') + '</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>'\n\nCalendar::parseDate = (d) ->\n if moment.defaultZone != null and moment.hasOwnProperty('tz')\n moment.tz d, @format.input, moment.defaultZone.name\n else\n moment d, @format.input\n\nCalendar::range = (length) ->\n range = new Array(length)\n idx = 0\n while idx < length\n range[idx] = idx\n idx++\n range\n\nexport default Calendar\n","import Calendar from '../../vendor/baremetrics-calendar/calendar'\nimport Text from 'el-controls/src/controls/text'\nimport utils from '../../utils'\nimport html from '../../templates/controls/date-range-picker'\n\nmoment = utils.date.moment\n\nexport default class DateRangePicker extends Text\n tag: 'date-range-picker-control'\n html: html\n\n after: '2015-01-01'\n before: moment()\n\n events:\n updated: ->\n @onUpdated()\n\n mount: ->\n @onUpdated()\n\n init: -> super()\n\n onUpdated: ->\n if !@calendar\n filter = @data.get 'filter'\n self = @\n @calendar = new Calendar\n element: $(@root).find('.daterange')\n earliest_date: moment @after\n latest_date: moment @before\n start_date: filter[0]\n end_date: filter[1]\n callback: ->\n start = utils.date.renderJSONDate @start_date\n end = utils.date.renderJSONDate @end_date\n\n console.log 'Start Date: ' + start + '\\nEnd Date: ' + end\n\n val = [start, end]\n self.data.set 'filter', val\n\n self.change()\n self.changed val\n\n getValue: (e) -> @data.get 'filter'\n","import Text from 'el-controls/src/controls/text'\n\nimport html from '../../templates/controls/numeric'\n\nclass Numeric extends Text\n tag: 'numeric'\n html: html\n\n numericValue: ()->\n val = parseFloat @input.ref.get(@input.name)\n val = null if isNaN val\n\n return val\n\n getValue: ()->\n val = super\n val = parseFloat val\n val = null if isNaN val\n\n return val\n\nexport default Numeric\n\n","import Checkbox from './checkbox'\nimport DateRangePicker from './date-range-picker'\nimport Numeric from './numeric'\nimport Switch from './switch'\n\nimport * as ElControls from 'el-controls/src'\n\nexport default Controls =\n Checkbox: Checkbox\n DateRangePicker: DateRangePicker\n Numeric: Numeric\n Switch: Switch\n\n register: ->\n Checkbox.register()\n DateRangePicker.register()\n Numeric.register()\n Switch.register()\n","import El from 'el.js'\nimport Events from '../events'\n\n# View with built-in caching for optimizing frequently updated data-driven\n# views.\nclass DynamicView extends El.Form\n tag: 'daisho-dynamic'\n html: ''\n\n # data.get field for caching staleness\n # null means we cache on the entire data object\n _dataStaleField: null\n\n # last version of data cached for staleness check\n _dataStaleCached: ''\n\n # refresh lock\n _locked: false\n\n # should automatically refresh on an update call?\n autoRefresh: true\n\n # can be before or after\n refreshTiming: 'before'\n\n _p: false\n\n # add some helpers to automagically bind refresh function\n init: ->\n # make @_refresh automatically save the stale data\n r = @_refresh\n @_refresh = =>\n if @_locked\n return @locked\n\n @_locked = true\n p = r.apply @, arguments\n @_locked = p\n if p?.then?\n p.then =>\n try\n @_dataStaleCached = JSON.stringify @data.get @_dataStaleField\n catch e\n console.error 'could not save stale data', e\n @_locked = false\n .catch (e)->\n console.error 'count not save stale data', e\n else\n try\n @_dataStaleCached = JSON.stringify @data.get @_dataStaleField\n catch e\n console.error 'could not save stale data'\n @_locked = false\n return p\n\n if @autoRefresh\n if @mediator?\n @mediator.on Events.Refresh, =>\n return @refresh.apply @, arguments\n\n if @refreshTiming == 'before'\n @on 'update', ()=>\n return @refresh.apply @, arguments\n else\n @on 'updated', ()=>\n return @refresh.apply @, arguments\n\n # this bypasses all the staleness checks\n if @mediator?\n @mediator.on Events.ForceRefresh, =>\n return @_refresh.apply @, arguments\n\n super()\n\n # refresh checks if something is stale\n refresh: ->\n # abort if root isn't attached to the dom\n if !$(@root).closest('body')[0]?\n return\n\n # abort if data isn't stale\n _dataStaleCached = JSON.stringify @data.get @_dataStaleField\n if _dataStaleCached == @_dataStaleCached\n return\n\n return @_refresh.apply @, arguments\n\n # overwrite with refresh implementation\n # _refresh: ->\n\n # simple page change api\n show: (id, opts) ->\n return ()=>\n @services.page.show id, opts\n\n\nexport default DynamicView\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nexport default map;\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nexport default set;\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","import {map} from \"d3-collection\";\nimport {slice} from \"./array\";\n\nexport var implicit = {name: \"implicit\"};\n\nexport default function ordinal(range) {\n var index = map(),\n domain = [],\n unknown = implicit;\n\n range = range == null ? [] : slice.call(range);\n\n function scale(d) {\n var key = d + \"\", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return scale;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function deinterpolateLinear(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(b);\n}\n\nfunction deinterpolateClamp(deinterpolate) {\n return function(a, b) {\n var d = deinterpolate(a = +a, b = +b);\n return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n };\n}\n\nfunction reinterpolateClamp(reinterpolate) {\n return function(a, b) {\n var r = reinterpolate(a = +a, b = +b);\n return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n };\n}\n\nfunction bimap(domain, range, deinterpolate, reinterpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, deinterpolate, reinterpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = deinterpolate(domain[i], domain[i + 1]);\n r[i] = reinterpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp());\n}\n\n// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\nexport default function continuous(deinterpolate, reinterpolate) {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n clamp = false,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);\n }\n\n scale.invert = function(y) {\n return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map.call(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = slice.call(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, rescale()) : clamp;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n return rescale();\n}\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(x, p) {\n x = x.toPrecision(p);\n\n out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (x[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n case \"e\": break out;\n default: if (i0 > 0) i0 = 0; break;\n }\n }\n\n return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Mat