123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. (function (factory) {
  2. if (typeof module === "object" && typeof module.exports === "object") {
  3. var v = factory(require, exports);
  4. if (v !== undefined) module.exports = v;
  5. }
  6. else if (typeof define === "function" && define.amd) {
  7. define(["require", "exports", "./util"], factory);
  8. }
  9. })(function (require, exports) {
  10. "use strict";
  11. Object.defineProperty(exports, "__esModule", { value: true });
  12. var util_1 = require("./util");
  13. function renderDateTime(template, value, locale) {
  14. if (util_1.isBlank(value)) {
  15. return '';
  16. }
  17. var tokens = [];
  18. var hasText = false;
  19. FORMAT_KEYS.forEach(function (format, index) {
  20. if (template.indexOf(format.f) > -1) {
  21. var token = '{' + index + '}';
  22. var text = renderTextFormat(format.f, value[format.k], value, locale);
  23. if (!hasText && text && util_1.isPresent(value[format.k])) {
  24. hasText = true;
  25. }
  26. tokens.push(token, text);
  27. template = template.replace(format.f, token);
  28. }
  29. });
  30. if (!hasText) {
  31. return '';
  32. }
  33. for (var i = 0; i < tokens.length; i += 2) {
  34. template = template.replace(tokens[i], tokens[i + 1]);
  35. }
  36. return template;
  37. }
  38. exports.renderDateTime = renderDateTime;
  39. function renderTextFormat(format, value, date, locale) {
  40. if (format === FORMAT_DDDD || format === FORMAT_DDD) {
  41. try {
  42. value = (new Date(date.year, date.month - 1, date.day)).getDay();
  43. if (format === FORMAT_DDDD) {
  44. return (util_1.isPresent(locale.dayNames) ? locale.dayNames : DAY_NAMES)[value];
  45. }
  46. return (util_1.isPresent(locale.dayShortNames) ? locale.dayShortNames : DAY_SHORT_NAMES)[value];
  47. }
  48. catch (e) { }
  49. return '';
  50. }
  51. if (format === FORMAT_A) {
  52. return date ? date.hour < 12 ? 'AM' : 'PM' : util_1.isPresent(value) ? value.toUpperCase() : '';
  53. }
  54. if (format === FORMAT_a) {
  55. return date ? date.hour < 12 ? 'am' : 'pm' : util_1.isPresent(value) ? value : '';
  56. }
  57. if (util_1.isBlank(value)) {
  58. return '';
  59. }
  60. if (format === FORMAT_YY || format === FORMAT_MM ||
  61. format === FORMAT_DD || format === FORMAT_HH ||
  62. format === FORMAT_mm || format === FORMAT_ss) {
  63. return twoDigit(value);
  64. }
  65. if (format === FORMAT_YYYY) {
  66. return fourDigit(value);
  67. }
  68. if (format === FORMAT_MMMM) {
  69. return (util_1.isPresent(locale.monthNames) ? locale.monthNames : MONTH_NAMES)[value - 1];
  70. }
  71. if (format === FORMAT_MMM) {
  72. return (util_1.isPresent(locale.monthShortNames) ? locale.monthShortNames : MONTH_SHORT_NAMES)[value - 1];
  73. }
  74. if (format === FORMAT_hh || format === FORMAT_h) {
  75. if (value === 0) {
  76. return '12';
  77. }
  78. if (value > 12) {
  79. value -= 12;
  80. }
  81. if (format === FORMAT_hh && value < 10) {
  82. return ('0' + value);
  83. }
  84. }
  85. return value.toString();
  86. }
  87. exports.renderTextFormat = renderTextFormat;
  88. function dateValueRange(format, min, max) {
  89. var opts = [];
  90. var i;
  91. if (format === FORMAT_YYYY || format === FORMAT_YY) {
  92. // year
  93. i = max.year;
  94. while (i >= min.year) {
  95. opts.push(i--);
  96. }
  97. }
  98. else if (format === FORMAT_MMMM || format === FORMAT_MMM ||
  99. format === FORMAT_MM || format === FORMAT_M ||
  100. format === FORMAT_hh || format === FORMAT_h) {
  101. // month or 12-hour
  102. for (i = 1; i < 13; i++) {
  103. opts.push(i);
  104. }
  105. }
  106. else if (format === FORMAT_DDDD || format === FORMAT_DDD ||
  107. format === FORMAT_DD || format === FORMAT_D) {
  108. // day
  109. for (i = 1; i < 32; i++) {
  110. opts.push(i);
  111. }
  112. }
  113. else if (format === FORMAT_HH || format === FORMAT_H) {
  114. // 24-hour
  115. for (i = 0; i < 24; i++) {
  116. opts.push(i);
  117. }
  118. }
  119. else if (format === FORMAT_mm || format === FORMAT_m) {
  120. // minutes
  121. for (i = 0; i < 60; i++) {
  122. opts.push(i);
  123. }
  124. }
  125. else if (format === FORMAT_ss || format === FORMAT_s) {
  126. // seconds
  127. for (i = 0; i < 60; i++) {
  128. opts.push(i);
  129. }
  130. }
  131. else if (format === FORMAT_A || format === FORMAT_a) {
  132. // AM/PM
  133. opts.push('am', 'pm');
  134. }
  135. return opts;
  136. }
  137. exports.dateValueRange = dateValueRange;
  138. function dateSortValue(year, month, day, hour, minute) {
  139. if (hour === void 0) { hour = 0; }
  140. if (minute === void 0) { minute = 0; }
  141. return parseInt("1" + fourDigit(year) + twoDigit(month) + twoDigit(day) + twoDigit(hour) + twoDigit(minute), 10);
  142. }
  143. exports.dateSortValue = dateSortValue;
  144. function dateDataSortValue(data) {
  145. if (data) {
  146. return dateSortValue(data.year, data.month, data.day, data.hour, data.minute);
  147. }
  148. return -1;
  149. }
  150. exports.dateDataSortValue = dateDataSortValue;
  151. function daysInMonth(month, year) {
  152. return (month === 4 || month === 6 || month === 9 || month === 11) ? 30 : (month === 2) ? isLeapYear(year) ? 29 : 28 : 31;
  153. }
  154. exports.daysInMonth = daysInMonth;
  155. function isLeapYear(year) {
  156. return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
  157. }
  158. exports.isLeapYear = isLeapYear;
  159. var ISO_8601_REGEXP = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/;
  160. var TIME_REGEXP = /^((\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/;
  161. function parseDate(val) {
  162. // manually parse IS0 cuz Date.parse cannot be trusted
  163. // ISO 8601 format: 1994-12-15T13:47:20Z
  164. var parse;
  165. if (util_1.isPresent(val) && val !== '') {
  166. // try parsing for just time first, HH:MM
  167. parse = TIME_REGEXP.exec(val);
  168. if (util_1.isPresent(parse)) {
  169. // adjust the array so it fits nicely with the datetime parse
  170. parse.unshift(undefined, undefined);
  171. parse[2] = parse[3] = undefined;
  172. }
  173. else {
  174. // try parsing for full ISO datetime
  175. parse = ISO_8601_REGEXP.exec(val);
  176. }
  177. }
  178. if (util_1.isBlank(parse)) {
  179. // wasn't able to parse the ISO datetime
  180. return null;
  181. }
  182. // ensure all the parse values exist with at least 0
  183. for (var i = 1; i < 8; i++) {
  184. parse[i] = (parse[i] !== undefined ? parseInt(parse[i], 10) : null);
  185. }
  186. var tzOffset = 0;
  187. if (util_1.isPresent(parse[9]) && util_1.isPresent(parse[10])) {
  188. // hours
  189. tzOffset = parseInt(parse[10], 10) * 60;
  190. if (util_1.isPresent(parse[11])) {
  191. // minutes
  192. tzOffset += parseInt(parse[11], 10);
  193. }
  194. if (parse[9] === '-') {
  195. // + or -
  196. tzOffset *= -1;
  197. }
  198. }
  199. return {
  200. year: parse[1],
  201. month: parse[2],
  202. day: parse[3],
  203. hour: parse[4],
  204. minute: parse[5],
  205. second: parse[6],
  206. millisecond: parse[7],
  207. tzOffset: tzOffset,
  208. };
  209. }
  210. exports.parseDate = parseDate;
  211. function compareDates(d1, d2) {
  212. var date1 = new Date(d1.year, d1.month, d1.day, d1.hour, d1.minute, d1.second);
  213. var date2 = new Date(d2.year, d2.month, d2.day, d2.hour, d2.minute, d2.second);
  214. return date1.getTime() - date2.getTime();
  215. }
  216. exports.compareDates = compareDates;
  217. function updateDate(existingData, newData) {
  218. if (util_1.isPresent(newData) && newData !== '') {
  219. if (util_1.isString(newData)) {
  220. // new date is a string, and hopefully in the ISO format
  221. // convert it to our DateTimeData if a valid ISO
  222. newData = parseDate(newData);
  223. if (newData) {
  224. // successfully parsed the ISO string to our DateTimeData
  225. Object.assign(existingData, newData);
  226. return true;
  227. }
  228. }
  229. else if ((util_1.isPresent(newData.year) || util_1.isPresent(newData.hour) || util_1.isPresent(newData.month) || util_1.isPresent(newData.day) || util_1.isPresent(newData.minute) || util_1.isPresent(newData.second))) {
  230. // newData is from of a datetime picker's selected values
  231. // update the existing DateTimeData data with the new values
  232. // do some magic for 12-hour values
  233. if (util_1.isPresent(newData.ampm) && util_1.isPresent(newData.hour)) {
  234. if (newData.ampm.value === 'pm') {
  235. newData.hour.value = (newData.hour.value === 12 ? 12 : newData.hour.value + 12);
  236. }
  237. else {
  238. newData.hour.value = (newData.hour.value === 12 ? 0 : newData.hour.value);
  239. }
  240. }
  241. // merge new values from the picker's selection
  242. // to the existing DateTimeData values
  243. for (var k in newData) {
  244. existingData[k] = newData[k].value;
  245. }
  246. return true;
  247. }
  248. // eww, invalid data
  249. console.warn("Error parsing date: \"" + newData + "\". Please provide a valid ISO 8601 datetime format: https://www.w3.org/TR/NOTE-datetime");
  250. }
  251. else {
  252. // blank data, clear everything out
  253. for (var k in existingData) {
  254. delete existingData[k];
  255. }
  256. }
  257. return false;
  258. }
  259. exports.updateDate = updateDate;
  260. function parseTemplate(template) {
  261. var formats = [];
  262. template = template.replace(/[^\w\s]/gi, ' ');
  263. FORMAT_KEYS.forEach(function (format) {
  264. if (format.f.length > 1 && template.indexOf(format.f) > -1 && template.indexOf(format.f + format.f.charAt(0)) < 0) {
  265. template = template.replace(format.f, ' ' + format.f + ' ');
  266. }
  267. });
  268. var words = template.split(' ').filter(function (w) { return w.length > 0; });
  269. words.forEach(function (word, i) {
  270. FORMAT_KEYS.forEach(function (format) {
  271. if (word === format.f) {
  272. if (word === FORMAT_A || word === FORMAT_a) {
  273. // this format is an am/pm format, so it's an "a" or "A"
  274. if ((formats.indexOf(FORMAT_h) < 0 && formats.indexOf(FORMAT_hh) < 0) ||
  275. VALID_AMPM_PREFIX.indexOf(words[i - 1]) === -1) {
  276. // template does not already have a 12-hour format
  277. // or this am/pm format doesn't have a hour, minute, or second format immediately before it
  278. // so do not treat this word "a" or "A" as the am/pm format
  279. return;
  280. }
  281. }
  282. formats.push(word);
  283. }
  284. });
  285. });
  286. return formats;
  287. }
  288. exports.parseTemplate = parseTemplate;
  289. function getValueFromFormat(date, format) {
  290. if (format === FORMAT_A || format === FORMAT_a) {
  291. return (date.hour < 12 ? 'am' : 'pm');
  292. }
  293. if (format === FORMAT_hh || format === FORMAT_h) {
  294. return (date.hour > 12 ? date.hour - 12 : date.hour);
  295. }
  296. return date[convertFormatToKey(format)];
  297. }
  298. exports.getValueFromFormat = getValueFromFormat;
  299. function convertFormatToKey(format) {
  300. for (var k in FORMAT_KEYS) {
  301. if (FORMAT_KEYS[k].f === format) {
  302. return FORMAT_KEYS[k].k;
  303. }
  304. }
  305. return null;
  306. }
  307. exports.convertFormatToKey = convertFormatToKey;
  308. function convertDataToISO(data) {
  309. // https://www.w3.org/TR/NOTE-datetime
  310. var rtn = '';
  311. if (util_1.isPresent(data)) {
  312. if (util_1.isPresent(data.year)) {
  313. // YYYY
  314. rtn = fourDigit(data.year);
  315. if (util_1.isPresent(data.month)) {
  316. // YYYY-MM
  317. rtn += '-' + twoDigit(data.month);
  318. if (util_1.isPresent(data.day)) {
  319. // YYYY-MM-DD
  320. rtn += '-' + twoDigit(data.day);
  321. if (util_1.isPresent(data.hour)) {
  322. // YYYY-MM-DDTHH:mm:SS
  323. rtn += "T" + twoDigit(data.hour) + ":" + twoDigit(data.minute) + ":" + twoDigit(data.second);
  324. if (data.millisecond > 0) {
  325. // YYYY-MM-DDTHH:mm:SS.SSS
  326. rtn += '.' + threeDigit(data.millisecond);
  327. }
  328. if (util_1.isBlank(data.tzOffset) || data.tzOffset === 0) {
  329. // YYYY-MM-DDTHH:mm:SSZ
  330. rtn += 'Z';
  331. }
  332. else {
  333. // YYYY-MM-DDTHH:mm:SS+/-HH:mm
  334. rtn += (data.tzOffset > 0 ? '+' : '-') + twoDigit(Math.floor(data.tzOffset / 60)) + ':' + twoDigit(data.tzOffset % 60);
  335. }
  336. }
  337. }
  338. }
  339. }
  340. else if (util_1.isPresent(data.hour)) {
  341. // HH:mm
  342. rtn = twoDigit(data.hour) + ':' + twoDigit(data.minute);
  343. if (util_1.isPresent(data.second)) {
  344. // HH:mm:SS
  345. rtn += ':' + twoDigit(data.second);
  346. if (util_1.isPresent(data.millisecond)) {
  347. // HH:mm:SS.SSS
  348. rtn += '.' + threeDigit(data.millisecond);
  349. }
  350. }
  351. }
  352. }
  353. return rtn;
  354. }
  355. exports.convertDataToISO = convertDataToISO;
  356. function twoDigit(val) {
  357. return ('0' + (util_1.isPresent(val) ? Math.abs(val) : '0')).slice(-2);
  358. }
  359. function threeDigit(val) {
  360. return ('00' + (util_1.isPresent(val) ? Math.abs(val) : '0')).slice(-3);
  361. }
  362. function fourDigit(val) {
  363. return ('000' + (util_1.isPresent(val) ? Math.abs(val) : '0')).slice(-4);
  364. }
  365. var FORMAT_YYYY = 'YYYY';
  366. var FORMAT_YY = 'YY';
  367. var FORMAT_MMMM = 'MMMM';
  368. var FORMAT_MMM = 'MMM';
  369. var FORMAT_MM = 'MM';
  370. var FORMAT_M = 'M';
  371. var FORMAT_DDDD = 'DDDD';
  372. var FORMAT_DDD = 'DDD';
  373. var FORMAT_DD = 'DD';
  374. var FORMAT_D = 'D';
  375. var FORMAT_HH = 'HH';
  376. var FORMAT_H = 'H';
  377. var FORMAT_hh = 'hh';
  378. var FORMAT_h = 'h';
  379. var FORMAT_mm = 'mm';
  380. var FORMAT_m = 'm';
  381. var FORMAT_ss = 'ss';
  382. var FORMAT_s = 's';
  383. var FORMAT_A = 'A';
  384. var FORMAT_a = 'a';
  385. var FORMAT_KEYS = [
  386. { f: FORMAT_YYYY, k: 'year' },
  387. { f: FORMAT_MMMM, k: 'month' },
  388. { f: FORMAT_DDDD, k: 'day' },
  389. { f: FORMAT_MMM, k: 'month' },
  390. { f: FORMAT_DDD, k: 'day' },
  391. { f: FORMAT_YY, k: 'year' },
  392. { f: FORMAT_MM, k: 'month' },
  393. { f: FORMAT_DD, k: 'day' },
  394. { f: FORMAT_HH, k: 'hour' },
  395. { f: FORMAT_hh, k: 'hour' },
  396. { f: FORMAT_mm, k: 'minute' },
  397. { f: FORMAT_ss, k: 'second' },
  398. { f: FORMAT_M, k: 'month' },
  399. { f: FORMAT_D, k: 'day' },
  400. { f: FORMAT_H, k: 'hour' },
  401. { f: FORMAT_h, k: 'hour' },
  402. { f: FORMAT_m, k: 'minute' },
  403. { f: FORMAT_s, k: 'second' },
  404. { f: FORMAT_A, k: 'ampm' },
  405. { f: FORMAT_a, k: 'ampm' },
  406. ];
  407. var DAY_NAMES = [
  408. 'Sunday',
  409. 'Monday',
  410. 'Tuesday',
  411. 'Wednesday',
  412. 'Thursday',
  413. 'Friday',
  414. 'Saturday',
  415. ];
  416. var DAY_SHORT_NAMES = [
  417. 'Sun',
  418. 'Mon',
  419. 'Tue',
  420. 'Wed',
  421. 'Thu',
  422. 'Fri',
  423. 'Sat',
  424. ];
  425. var MONTH_NAMES = [
  426. 'January',
  427. 'February',
  428. 'March',
  429. 'April',
  430. 'May',
  431. 'June',
  432. 'July',
  433. 'August',
  434. 'September',
  435. 'October',
  436. 'November',
  437. 'December',
  438. ];
  439. var MONTH_SHORT_NAMES = [
  440. 'Jan',
  441. 'Feb',
  442. 'Mar',
  443. 'Apr',
  444. 'May',
  445. 'Jun',
  446. 'Jul',
  447. 'Aug',
  448. 'Sep',
  449. 'Oct',
  450. 'Nov',
  451. 'Dec',
  452. ];
  453. var VALID_AMPM_PREFIX = [
  454. FORMAT_hh, FORMAT_h, FORMAT_mm, FORMAT_m, FORMAT_ss, FORMAT_s
  455. ];
  456. });
  457. //# sourceMappingURL=datetime-util.js.map