Home Reference Source

src/types/view/value/function.js

  1. import {List} from 'immutable';
  2. import moment from 'moment';
  3.  
  4. import {numericalDisplay, textDisplay} from '../utils';
  5.  
  6. import ValueType from './';
  7.  
  8. /**
  9. * @extends ValueType
  10. */
  11. export default class FunctionType extends ValueType {
  12. static typeName = 'function';
  13.  
  14. static fns = {
  15. ceil: value => Math.ceil(value),
  16. floor: value => Math.floor(value),
  17. round: value => Math.round(value),
  18.  
  19. list: (...values) => List(values)
  20. .filter(value => value),
  21.  
  22. formatDate: (value, format) => moment(value * 1000)
  23. .format(format),
  24.  
  25. addDate: (value, dateString) => moment(value * 1000)
  26. .add(...(dateString || '').split(' '))
  27. .valueOf() / 1000,
  28.  
  29. countDays: (endTimes, startTimes, addOne = true) => startTimes
  30. .map((startTime, index) => {
  31. const rawEndTime = endTimes.get(index);
  32. const endTime = (rawEndTime === null || typeof rawEndTime == 'undefined') ?
  33. (Date.now() / 1000) :
  34. endTimes.get(index);
  35. return endTime - startTime;
  36. })
  37. .map(time => time / (60 * 60 * 24))
  38. .map(days => Math.floor(days + (addOne ? 1 : 0)))
  39. .reduce((totalDays, days) => totalDays + days, 0)
  40. };
  41.  
  42. static fnDisplays = {
  43. ceil: numericalDisplay,
  44. floor: numericalDisplay,
  45. round: numericalDisplay,
  46. formatDate: textDisplay,
  47. addDate: textDisplay,
  48. countDays: numericalDisplay
  49. };
  50.  
  51. static parseOptions(field, parseField) {
  52. return super.parseOptions(field, parseField)
  53. .update('args', List(), this.parseOneOrMany(parseField));
  54. }
  55.  
  56. initialize(renderData) {
  57. return super.initialize(renderData, this.getArgs());
  58. }
  59.  
  60. getFn() {
  61. return this.options.get('fn');
  62. }
  63.  
  64. getArgs() {
  65. return this.options.get('args');
  66. }
  67.  
  68. getValue(renderData) {
  69. const values = this.getChildValues(renderData, this.getArgs());
  70. const func = FunctionType.fns[this.getFn()];
  71. return func(...values.toArray());
  72. }
  73.  
  74. getDisplay(renderData) {
  75. const value = this.getValue(renderData);
  76. const func = FunctionType.fnDisplays[this.getFn()];
  77. return func(value);
  78. }
  79. }
  80.