1 |
|
2 |
|
3 |
|
4 | 'use strict';
|
5 |
|
6 | const Base = require('../base/Component');
|
7 |
|
8 | module.exports = class Formatter extends Base {
|
9 |
|
10 | static getConstants () {
|
11 | return {
|
12 | KiB: 1024,
|
13 | MiB: 1024 * 1024,
|
14 | GiB: 1024 * 1024 * 1024,
|
15 | TiB: 1024 * 1024 * 1024 * 1024,
|
16 | };
|
17 | }
|
18 |
|
19 | static getMethodName (type) {
|
20 | return `as${StringHelper.toFirstUpperCase(type)}`;
|
21 | }
|
22 |
|
23 | constructor (config) {
|
24 | super({
|
25 | language: config.i18n ? config.i18n.language : 'en',
|
26 | nullFormat: '<span class="not-set">[not set]</span>',
|
27 | booleanFormat: ['No', 'Yes'],
|
28 | byteFractionalPart: 100,
|
29 | dateFormat: 'L',
|
30 | dateLongFormat: 'LL',
|
31 | timeFormat: 'LT',
|
32 | timeLongFormat: 'LTS',
|
33 | datetimeFormat: 'LLL',
|
34 | timestampFormat: 'L LTS',
|
35 | ...config
|
36 | });
|
37 | }
|
38 |
|
39 | format (value, type, params) {
|
40 | if (!type) {
|
41 | return this.asRaw(value, params);
|
42 | }
|
43 | const name = this.constructor.getMethodName(type);
|
44 | if (typeof this[name] === 'function') {
|
45 | return this[name](value, params);
|
46 | }
|
47 | this.log('error', `Unknown type: ${type}`);
|
48 | return this.asRaw(value, params);
|
49 | }
|
50 |
|
51 | translate (message, source, language) {
|
52 | return this.i18n
|
53 | ? this.i18n.translate(message, null, source, language || this.language)
|
54 | : message;
|
55 | }
|
56 |
|
57 | asRaw (value, params = {}) {
|
58 | return value === null || value === undefined
|
59 | ? this.translate(this.nullFormat, I18n.CORE_SOURCE, params.language)
|
60 | : value;
|
61 | }
|
62 |
|
63 | asBoolean (value, params = {}) {
|
64 | if (value === null || value === undefined) {
|
65 | return this.translate(this.nullFormat, I18n.CORE_SOURCE, params.language);
|
66 | }
|
67 | value = this.booleanFormat[value ? 1 : 0];
|
68 | return this.translate(value, I18n.CORE_SOURCE, params.language);
|
69 | }
|
70 |
|
71 | asBytes (value, params = {}) {
|
72 | if (value === null || value === undefined) {
|
73 | return this.translate(this.nullFormat, I18n.CORE_SOURCE, params.language);
|
74 | }
|
75 | let unit;
|
76 | if (value < this.KiB) {
|
77 | unit = 'B';
|
78 | } else if (value < this.MiB) {
|
79 | unit = 'KiB';
|
80 | value /= this.KiB;
|
81 | } else if (value < this.GiB) {
|
82 | unit = 'MiB';
|
83 | value /= this.MiB;
|
84 | } else if (value < this.TiB) {
|
85 | unit = 'GiB';
|
86 | value /= this.GiB;
|
87 | } else {
|
88 | unit = 'TiB';
|
89 | value /= this.TiB;
|
90 | }
|
91 | value = Math.round(value * this.byteFractionalPart) / this.byteFractionalPart;
|
92 | unit = this.translate(unit, I18n.CORE_SOURCE, params.language);
|
93 | return `${value} ${unit}`;
|
94 | }
|
95 |
|
96 | asUrl (value, params = {}) {
|
97 | return value
|
98 | ? `<a href="${value}" class="${params.className || ''}" target="${params.target || ''}">${params.text || value}</a>`
|
99 | : this.asRaw(value, params);
|
100 | }
|
101 |
|
102 |
|
103 |
|
104 | asDate (value, params = {}) {
|
105 | return value
|
106 | ? moment(value).locale(params.language || this.language).format(params.format || this.dateFormat)
|
107 | : this.asRaw(value, params);
|
108 | }
|
109 |
|
110 | asDateLong (value, params) {
|
111 | return this.asDate(value, {format: this.dateLongFormat, ...params});
|
112 | }
|
113 |
|
114 | asDuration (value, params = {}) {
|
115 | return value || value === 0
|
116 | ? moment.duration(value, params.units).locale(params.language || this.language).humanize(params.suffix)
|
117 | : this.asRaw(value, params);
|
118 | }
|
119 |
|
120 | asTime (value, params) {
|
121 | return this.asDate(value, {format: this.timeFormat, ...params});
|
122 | }
|
123 |
|
124 | asTimeLong (value, params) {
|
125 | return this.asDate(value, {format: this.timeLongFormat, ...params});
|
126 | }
|
127 |
|
128 | asDatetime (value, params) {
|
129 | return this.asDate(value, {format: this.datetimeFormat, ...params});
|
130 | }
|
131 |
|
132 | asTimestamp (value, params) {
|
133 | return this.asDate(value, {format: this.timestampFormat, ...params});
|
134 | }
|
135 |
|
136 | asFromNow (value, params = {}) {
|
137 | return value
|
138 | ? moment(value).locale(params.language || this.language).fromNow()
|
139 | : this.asRaw(value, params);
|
140 | }
|
141 |
|
142 | asToNow (value, params = {}) {
|
143 | return value
|
144 | ? moment(value).locale(params.language || this.language).toNow()
|
145 | : this.asRaw(value, params);
|
146 | }
|
147 |
|
148 | asFromDate (value, params = {}) {
|
149 | return value && params.date
|
150 | ? moment(value).locale(params.language || this.language).from(params.date)
|
151 | : this.asRaw(value, params);
|
152 | }
|
153 |
|
154 | asToDate (value, params = {}) {
|
155 | return value && params.date
|
156 | ? moment(value).locale(params.language || this.language).to(params.date)
|
157 | : this.asRaw(value, params);
|
158 | }
|
159 |
|
160 | asIso (value, params) {
|
161 | return value ? moment(value).toISOString() : this.asRaw(value, params);
|
162 | }
|
163 |
|
164 | asClientDate (value, params = {}) {
|
165 | if (!value) {
|
166 | return this.asRaw(value, params);
|
167 | }
|
168 | value = value instanceof Date ? value.toISOString() : moment(value).toISOString();
|
169 | return `<time datetime="${value}" data-format="${params.format || ''}" data-utc="${params.utc || ''}">${value}</time>`;
|
170 | }
|
171 | };
|
172 | module.exports.init();
|
173 |
|
174 | const moment = require('moment');
|
175 | const I18n = require('./I18n');
|
176 | const StringHelper = require('../helper/StringHelper'); |
\ | No newline at end of file |