UNPKG

backgrid-moment-cell

Version:

Backgrid.js datetime cell type formatted via moment.js.

209 lines (157 loc) 6.85 kB
/* backgrid-moment-cell http://github.com/wyuenho/backgrid Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors Licensed under the MIT @license. */ (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD define(["underscore", "backgrid", "moment"], factory); } else if (typeof exports === 'object') { // CommonJS module.exports = factory(require("underscore"), require("backgrid"), require("moment")); } else { // Browser globals factory(root._, root.Backgrid, root.moment); } }(this, function (_, Backgrid, moment) { "use strict"; var exports = {}; /** MomentFormatter converts bi-directionally any datetime values in any format supported by [moment()](http://momentjs.com/docs/#/parsing/) to any datetime format [moment.fn.format()](http://momentjs.com/docs/#/displaying/format/) supports. @class Backgrid.Extension.MomentFormatter @extends Backgrid.CellFormatter @constructor */ var MomentFormatter = exports.MomentFormatter = Backgrid.Extension.MomentFormatter = function (options) { _.extend(this, this.defaults, options); }; var useLocale = "locale" in moment && _.isFunction(moment, "locale"); MomentFormatter.prototype = new Backgrid.CellFormatter; _.extend(MomentFormatter.prototype, { /** @cfg {Object} options @cfg {boolean} [options.modelInUnixOffset=false] Whether the model values should be read/written as the number of milliseconds since UNIX Epoch. @cfg {boolean} [options.modelInUnixTimestamp=false] Whether the model values should be read/written as the number of seconds since UNIX Epoch. @cfg {boolean} [options.modelInUTC=true] Whether the model values should be read/written in UTC mode or local mode. @cfg {string} [options.modelLang=moment.locale() moment>=2.8.0 | moment.lang() moment<2.8.0] The locale the model values should be read/written in. @cfg {string} [options.modelFormat=moment.defaultFormat] The format this moment formatter should use to read/write model values. Only meaningful if the values are strings. @cfg {boolean} [options.displayInUnixOffset=false] Whether the display values should be read/written as the number of milliseconds since UNIX Epoch. @cfg {boolean} [options.displayInUnixTimestamp=false] Whether the display values should be read/written as the number of seconds since UNIX Epoch. @cfg {boolean} [options.displayInUTC=true] Whether the display values should be read/written in UTC mode or local mode. @cfg {string} [options.displayLang=moment.locale() moment>=2.8.0 | moment.lang() moment<2.8.0] The locale the display values should be read/written in. @cfg {string} [options.displayFormat=moment.defaultFormat] The format this moment formatter should use to read/write dislay values. */ defaults: { modelInUnixOffset: false, modelInUnixTimestamp: false, modelInUTC: true, modelLang: useLocale ? moment.locale() : moment.lang(), modelFormat: moment.defaultFormat, displayInUnixOffset: false, displayInUnixTimestamp: false, displayInUTC: true, displayLang: useLocale ? moment.locale() : moment.lang(), displayFormat: moment.defaultFormat }, /** Converts datetime values from the model for display. @member Backgrid.Extension.MomentFormatter @param {*} rawData @return {string} */ fromRaw: function (rawData) { if (rawData == null) return ''; var m = this.modelInUnixOffset ? moment(rawData) : this.modelInUnixTimestamp ? moment.unix(rawData) : this.modelInUTC ? moment.utc(rawData, this.modelFormat, this.modelLang) : moment(rawData, this.modelFormat, this.modelLang); if (this.displayInUnixOffset) return +m; if (this.displayInUnixTimestamp) return m.unix(); if (this.displayLang) { if (useLocale) m.locale(this.displayLang); else m.lang(this.displayLang); } if (this.displayInUTC) m.utc(); else m.local(); return m.format(this.displayFormat); }, /** Converts datetime values from user input to model values. @member Backgrid.Extension.MomentFormatter @param {string} formattedData @return {string} */ toRaw: function (formattedData) { var m = this.displayInUnixOffset ? moment(+formattedData) : this.displayInUnixTimestamp ? moment.unix(+formattedData) : this.displayInUTC ? moment.utc(formattedData, this.displayFormat, this.displayLang) : moment(formattedData, this.displayFormat, this.displayLang); if (!m || !m.isValid()) return; if (this.modelInUnixOffset) return +m; if (this.modelInUnixTimestamp) return m.unix(); if (this.modelLang) { if (useLocale) m.locale(this.modelLang); else m.lang(this.modelLang); } if (this.modelInUTC) m.utc(); else m.local(); return m.format(this.modelFormat); } }); /** Renders a datetime cell that uses a Backgrid.Extension.MomentFormatter to convert and validate values. @class Backgrid.Extension.MomentCell @extends Backgrid.Cell */ var MomentCell = exports.MomentCell = Backgrid.Extension.MomentCell = Backgrid.Cell.extend({ editor: Backgrid.InputCellEditor, /** @property */ className: "moment-cell", /** @property {Backgrid.CellFormatter} [formatter=Backgrid.Extension.MomentFormatter] */ formatter: MomentFormatter, /** Initializer. Accept Backgrid.Extension.MomentFormatter.options and Backgrid.Cell.initialize required parameters. */ initialize: function (options) { MomentCell.__super__.initialize.apply(this, arguments); var formatterDefaults = MomentFormatter.prototype.defaults; var formatterDefaultKeys = _.keys(formatterDefaults); var classAttrs = _.pick(this, formatterDefaultKeys); var formatterOptions = _.pick(options, formatterDefaultKeys); // Priority of the options for the formatter, from highest to lowerest // 1. MomentCell instance options // 2. MomentCell class attributes // 3. MomentFormatter defaults // this.formatter will have been instantiated now _.extend(this.formatter, formatterDefaults, classAttrs, formatterOptions); this.editor = this.editor.extend({ attributes: _.extend({}, this.editor.prototype.attributes || this.editor.attributes || {}, { placeholder: this.formatter.displayFormat }) }); } }); _.extend(MomentCell.prototype, MomentFormatter.prototype.defaults); return exports; }));