1+ /**
2+ * Copyright (c) 2022-present Hengyang Zhang
3+ *
4+ * This software is released under the MIT License.
5+ * https://opensource.org/licenses/MIT
6+ */
7+
8+ import { t } from "@app/locale"
9+ import { formatTime } from "@util/time"
10+ import { periodFormatter } from "./formatter"
11+ import {
12+ exportCsv as exportCsv_ ,
13+ exportJson as exportJson_ ,
14+ } from "@util/file"
15+
16+ type _ExportInfo = {
17+ host : string
18+ alias ?: string
19+ date ?: string
20+ total ?: string
21+ focus ?: string
22+ time ?: number
23+ }
24+
25+ /**
26+ * Compute the name of downloaded file
27+ */
28+ function computeFileName ( filterParam : timer . app . report . FilterOption ) : string {
29+ let baseName = t ( msg => msg . report . exportFileName )
30+ const { dateRange, mergeDate, mergeHost, timeFormat } = filterParam
31+ if ( dateRange && dateRange . length === 2 ) {
32+ const start = dateRange [ 0 ]
33+ const end = dateRange [ 1 ]
34+ baseName += '_' + formatTime ( start , '{y}{m}{d}' )
35+ baseName += '_' + formatTime ( end , '{y}{m}{d}' )
36+ }
37+ mergeDate && ( baseName += '_' + t ( msg => msg . report . mergeDate ) )
38+ mergeHost && ( baseName += '_' + t ( msg => msg . report . mergeDomain ) )
39+ timeFormat && ( baseName += '_' + t ( msg => msg . timeFormat [ timeFormat ] ) )
40+ return baseName
41+ }
42+
43+ const generateJsonData = ( rows : timer . stat . Row [ ] ) => rows . map ( row => {
44+ const data : _ExportInfo = { host : row . host }
45+ data . date = row . date
46+ data . alias = row . alias
47+ // Always display by seconds
48+ data . total = periodFormatter ( row . total , "second" , true )
49+ data . focus = periodFormatter ( row . focus , "second" , true )
50+ data . time = row . time
51+ return data
52+ } )
53+
54+ /**
55+ * Export json data
56+ *
57+ * @param filterParam filter params
58+ * @param rows row data
59+ */
60+ export function exportJson ( filterParam : timer . app . report . FilterOption , rows : timer . stat . Row [ ] ) : void {
61+ const fileName = computeFileName ( filterParam )
62+ const jsonData = generateJsonData ( rows )
63+ exportJson_ ( jsonData , fileName )
64+ }
65+
66+ function generateCsvData ( rows : timer . stat . Row [ ] , filterParam : timer . app . report . FilterOption ) : string [ ] [ ] {
67+ const { mergeDate, mergeHost } = filterParam
68+ const columnName : string [ ] = [ ]
69+ if ( ! mergeDate ) {
70+ columnName . push ( t ( msg => msg . item . date ) )
71+ }
72+ columnName . push ( t ( msg => msg . item . host ) )
73+ if ( ! mergeHost ) {
74+ columnName . push ( t ( msg => msg . siteManage . column . alias ) )
75+ }
76+ columnName . push ( t ( msg => msg . item . total ) )
77+ columnName . push ( t ( msg => msg . item . focus ) )
78+ columnName . push ( t ( msg => msg . item . time ) )
79+ const data = [ columnName ]
80+ rows . forEach ( row => {
81+ const line = [ ]
82+ if ( ! mergeDate ) {
83+ line . push ( row . date )
84+ }
85+ line . push ( row . host )
86+ if ( ! mergeHost ) {
87+ line . push ( row . alias || '' )
88+ }
89+ line . push ( periodFormatter ( row . total , "second" , true ) )
90+ line . push ( periodFormatter ( row . focus , "second" , true ) )
91+ line . push ( row . time )
92+ data . push ( line )
93+ } )
94+ return data
95+ }
96+
97+ /**
98+ * Export csv data
99+ *
100+ * @param filterParam filter params
101+ * @param rows row data
102+ */
103+ export function exportCsv ( filterParam : timer . app . report . FilterOption , rows : timer . stat . Row [ ] ) : void {
104+ const fileName = computeFileName ( filterParam )
105+ const csvData = generateCsvData ( rows , filterParam )
106+ exportCsv_ ( csvData , fileName )
107+ }
0 commit comments