@things-factory/dataset 6.0.77 → 6.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/client/pages/data-set/data-set-list-page.ts +93 -91
  2. package/client/pages/data-summary/data-summary-list-page.ts +7 -7
  3. package/client/pages/data-summary/data-summary-search-page.ts +18 -34
  4. package/client/pages/data-summary/data-summary-view.ts +4 -4
  5. package/dist-client/pages/data-set/data-set-list-page.d.ts +1 -0
  6. package/dist-client/pages/data-set/data-set-list-page.js +88 -92
  7. package/dist-client/pages/data-set/data-set-list-page.js.map +1 -1
  8. package/dist-client/pages/data-summary/data-summary-list-page.js +7 -7
  9. package/dist-client/pages/data-summary/data-summary-list-page.js.map +1 -1
  10. package/dist-client/pages/data-summary/data-summary-search-page.js +18 -34
  11. package/dist-client/pages/data-summary/data-summary-search-page.js.map +1 -1
  12. package/dist-client/pages/data-summary/data-summary-view.js +2 -2
  13. package/dist-client/pages/data-summary/data-summary-view.js.map +1 -1
  14. package/dist-client/tsconfig.tsbuildinfo +1 -1
  15. package/dist-server/controllers/generate-data-summary.js +156 -13
  16. package/dist-server/controllers/generate-data-summary.js.map +1 -1
  17. package/dist-server/routes.js +20 -0
  18. package/dist-server/routes.js.map +1 -1
  19. package/dist-server/service/data-set/data-set-type.js +8 -0
  20. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  21. package/dist-server/service/data-set/data-set.js +22 -1
  22. package/dist-server/service/data-set/data-set.js.map +1 -1
  23. package/dist-server/service/data-summary/data-summary-mutation.js +16 -4
  24. package/dist-server/service/data-summary/data-summary-mutation.js.map +1 -1
  25. package/dist-server/service/data-summary/data-summary-type.js.map +1 -1
  26. package/dist-server/service/data-summary/data-summary.js +10 -23
  27. package/dist-server/service/data-summary/data-summary.js.map +1 -1
  28. package/dist-server/tsconfig.tsbuildinfo +1 -1
  29. package/helps/dataset/data-set.md +26 -11
  30. package/helps/dataset/ui/data-item-list.md +16 -9
  31. package/package.json +11 -11
  32. package/server/controllers/generate-data-summary.ts +202 -14
  33. package/server/routes.ts +29 -0
  34. package/server/service/data-set/data-set-type.ts +7 -1
  35. package/server/service/data-set/data-set.ts +20 -0
  36. package/server/service/data-summary/data-summary-mutation.ts +13 -4
  37. package/server/service/data-summary/data-summary-type.ts +2 -7
  38. package/server/service/data-summary/data-summary.ts +9 -24
  39. package/translations/en.json +4 -0
  40. package/translations/ko.json +5 -1
  41. package/translations/ms.json +4 -0
  42. package/translations/zh.json +4 -0
@@ -7,6 +7,7 @@ import moment from 'moment-timezone'
7
7
  import gql from 'graphql-tag'
8
8
  import { css, html } from 'lit'
9
9
  import { customElement, property, query, state } from 'lit/decorators.js'
10
+ import { asyncReplace } from 'lit/directives/async-replace.js'
10
11
  import { connect } from 'pwa-helpers/connect-mixin'
11
12
 
12
13
  import {
@@ -24,99 +25,51 @@ import { i18next, localize } from '@operato/i18n'
24
25
  import { notify, openPopup } from '@operato/layout'
25
26
  import { PageView, store } from '@operato/shell'
26
27
  import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
27
- import { isMobileDevice } from '@operato/utils'
28
+ import { isMobileDevice, sleep } from '@operato/utils'
28
29
  import { OxPopup } from '@operato/popup'
29
30
 
31
+ const MIN = 60
32
+ const HOUR = 60 * MIN
33
+ const DAY = 24 * HOUR
34
+
30
35
  const DEFAULT_TZ = Intl.DateTimeFormat().resolvedOptions().timeZone
31
36
  const TIMEZONE_OPTIONS = ['', DEFAULT_TZ, ...moment.tz.names().filter(tz => tz !== DEFAULT_TZ)]
32
37
 
33
38
  const ENTRY_TYPES = [
34
- {
35
- display: '',
36
- value: ''
37
- },
38
- {
39
- display: 'Generated',
40
- value: 'generated'
41
- },
42
- {
43
- display: 'Board',
44
- value: 'board'
45
- },
46
- {
47
- display: 'CustomElement',
48
- value: 'custom-element'
49
- },
50
- {
51
- display: 'Page',
52
- value: 'page'
53
- },
54
- {
55
- display: 'External URL',
56
- value: 'external'
57
- }
39
+ { display: '', value: '' },
40
+ { display: 'Generated', value: 'generated' },
41
+ { display: 'Board', value: 'board' },
42
+ { display: 'CustomElement', value: 'custom-element' },
43
+ { display: 'Page', value: 'page' },
44
+ { display: 'External URL', value: 'external' }
58
45
  ]
59
46
 
60
47
  const MONITOR_TYPES = [
61
- {
62
- display: '',
63
- value: ''
64
- },
65
- {
66
- display: 'Generated',
67
- value: 'generated'
68
- },
69
- {
70
- display: 'Board',
71
- value: 'board'
72
- },
73
- {
74
- display: 'CustomElement',
75
- value: 'custom-element'
76
- },
77
- {
78
- display: 'Page',
79
- value: 'page'
80
- },
81
- {
82
- display: 'External URL',
83
- value: 'external'
84
- }
48
+ { display: '', value: '' },
49
+ { display: 'Generated', value: 'generated' },
50
+ { display: 'Board', value: 'board' },
51
+ { display: 'CustomElement', value: 'custom-element' },
52
+ { display: 'Page', value: 'page' },
53
+ { display: 'External URL', value: 'external' }
85
54
  ]
86
55
 
87
56
  const REPORT_TYPES = [
88
- {
89
- display: '',
90
- value: ''
91
- },
92
- {
93
- display: 'Generated',
94
- value: 'generated'
95
- },
96
- {
97
- display: 'Embed',
98
- value: 'embed'
99
- },
100
- {
101
- display: 'CustomElement',
102
- value: 'custom-element'
103
- },
104
- {
105
- display: 'Page',
106
- value: 'page'
107
- },
108
- {
109
- display: 'External URL',
110
- value: 'external'
111
- },
112
- {
113
- display: 'Jasper',
114
- value: 'jasper'
115
- },
116
- {
117
- display: 'Shiny',
118
- value: 'shiny'
119
- }
57
+ { display: '', value: '' },
58
+ { display: 'Generated', value: 'generated' },
59
+ { display: 'Embed', value: 'embed' },
60
+ { display: 'CustomElement', value: 'custom-element' },
61
+ { display: 'Page', value: 'page' },
62
+ { display: 'External URL', value: 'external' },
63
+ { display: 'Jasper', value: 'jasper' },
64
+ { display: 'Shiny', value: 'shiny' }
65
+ ]
66
+
67
+ const SUMMARY_PERIOD_TYPES = [
68
+ { display: '', value: '' },
69
+ { display: 'Hour', value: 'hour' },
70
+ { display: 'WorkShift', value: 'work-shift' },
71
+ { display: 'WorkDate', value: 'work-date' },
72
+ { display: 'Day', value: 'day' }
120
73
  ]
121
74
 
122
75
  const USECASE_OPTIONS = () => {
@@ -419,6 +372,22 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
419
372
  },
420
373
  width: 50
421
374
  },
375
+ {
376
+ type: 'select',
377
+ name: 'timezone',
378
+ header: i18next.t('field.timezone'),
379
+ record: {
380
+ editable: true,
381
+ options: TIMEZONE_OPTIONS
382
+ },
383
+ width: 120,
384
+ imex: {
385
+ width: 13,
386
+ header: i18next.t('field.timezone'),
387
+ type: 'select',
388
+ key: 'timezone'
389
+ }
390
+ },
422
391
  {
423
392
  type: 'crontab',
424
393
  name: 'schedule',
@@ -440,19 +409,27 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
440
409
  },
441
410
  {
442
411
  type: 'select',
443
- name: 'timezone',
444
- header: i18next.t('field.timezone'),
412
+ name: 'summaryPeriod',
413
+ label: true,
414
+ header: i18next.t('field.summary-period'),
445
415
  record: {
446
416
  editable: true,
447
- options: TIMEZONE_OPTIONS
417
+ options: SUMMARY_PERIOD_TYPES
448
418
  },
449
- width: 120,
450
- imex: {
451
- width: 13,
452
- header: i18next.t('field.timezone'),
453
- type: 'select',
454
- key: 'timezone'
455
- }
419
+ width: 80
420
+ },
421
+ {
422
+ type: 'string',
423
+ name: 'nextSummarySchedule',
424
+ header: i18next.t('field.next-summary-schedule'),
425
+ record: {
426
+ editable: false,
427
+ renderer: (value, column, record, rowIndex, field) => {
428
+ return html` <span>${asyncReplace(this.summaryScheduleTimer(record.dueAt))}</span>`
429
+ }
430
+ },
431
+ sortable: false,
432
+ width: 140
456
433
  },
457
434
  {
458
435
  type: 'resource-object',
@@ -641,6 +618,8 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
641
618
  schedule
642
619
  timezone
643
620
  scheduleId
621
+ summaryPeriod
622
+ summaryScheduleId
644
623
  dataKeySet {
645
624
  id
646
625
  name
@@ -901,4 +880,27 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
901
880
  }
902
881
  )
903
882
  }
883
+
884
+ async *summaryScheduleTimer(exp) {
885
+ while (exp) {
886
+ var secs = Math.round((Number(exp) - Date.now()) / 1000)
887
+ var positive = secs >= 0
888
+
889
+ secs = Math.abs(secs)
890
+ const days = Math.floor(secs / DAY)
891
+ secs -= days * DAY
892
+ const hours = Math.floor(secs / HOUR)
893
+ secs -= hours * HOUR
894
+ const minutes = Math.floor(secs / MIN)
895
+ const seconds = secs - minutes * MIN
896
+
897
+ yield `${positive ? '' : '- '}${days ? `${days}${i18next.t('label.days')} ` : ''}${
898
+ hours ? `${hours}${i18next.t('label.hours')} ` : ''
899
+ }${minutes ? `${minutes}${i18next.t('label.minutes')} ` : ''}`
900
+
901
+ do {
902
+ await sleep(60 * 1000)
903
+ } while (!this.active)
904
+ }
905
+ }
904
906
  }
@@ -159,8 +159,8 @@ export class DataSummaryListPage extends connect(store)(localize(i18next)(PageVi
159
159
  },
160
160
  {
161
161
  type: 'string',
162
- name: 'workDate',
163
- header: i18next.t('field.work-date'),
162
+ name: 'date',
163
+ header: i18next.t('field.date'),
164
164
  sortable: true,
165
165
  filter: {
166
166
  type: 'date',
@@ -172,8 +172,8 @@ export class DataSummaryListPage extends connect(store)(localize(i18next)(PageVi
172
172
  },
173
173
  {
174
174
  type: 'string',
175
- name: 'workShift',
176
- header: i18next.t('field.work-shift'),
175
+ name: 'period',
176
+ header: i18next.t('field.time-period'),
177
177
  sortable: true,
178
178
  width: 60,
179
179
  imex: true
@@ -347,7 +347,7 @@ export class DataSummaryListPage extends connect(store)(localize(i18next)(PageVi
347
347
  },
348
348
  sorters: [
349
349
  {
350
- name: 'workDate',
350
+ name: 'date',
351
351
  desc: true
352
352
  }
353
353
  ]
@@ -366,8 +366,8 @@ export class DataSummaryListPage extends connect(store)(localize(i18next)(PageVi
366
366
  dataSet {
367
367
  id
368
368
  }
369
- workDate
370
- workShift
369
+ date
370
+ period
371
371
  key01
372
372
  key02
373
373
  key03
@@ -25,6 +25,13 @@ import { isMobileDevice } from '@operato/utils'
25
25
  import { OxPopup } from '@operato/popup'
26
26
  import { DataItem } from '@operato/dataset'
27
27
 
28
+ enum DataSetSummaryPeriodType {
29
+ Hour = 'hour',
30
+ WorkShift = 'work-shift',
31
+ WorkDate = 'work-date',
32
+ Day = 'day'
33
+ }
34
+
28
35
  @customElement('data-summary-search-page')
29
36
  export class DataSummarySearchPage extends connect(store)(localize(i18next)(PageView)) {
30
37
  static styles = [
@@ -131,6 +138,7 @@ export class DataSummarySearchPage extends connect(store)(localize(i18next)(Page
131
138
  query ($id: String!) {
132
139
  dataSet(id: $id) {
133
140
  id
141
+ summaryPeriod
134
142
  dataItems {
135
143
  name
136
144
  description
@@ -240,35 +248,10 @@ export class DataSummarySearchPage extends connect(store)(localize(i18next)(Page
240
248
  }
241
249
  }
242
250
  },
243
- // {
244
- // type: 'string',
245
- // name: 'name',
246
- // label: true,
247
- // header: i18next.t('field.name'),
248
- // record: {
249
- // editable: false
250
- // },
251
- // filter: 'search',
252
- // sortable: true,
253
- // width: 120,
254
- // imex: true
255
- // },
256
- // {
257
- // type: 'string',
258
- // name: 'description',
259
- // label: true,
260
- // header: i18next.t('field.description'),
261
- // record: {
262
- // editable: false
263
- // },
264
- // filter: 'search',
265
- // width: 150,
266
- // imex: true
267
- // },
268
251
  {
269
252
  type: 'string',
270
- name: 'workDate',
271
- header: i18next.t('field.work-date'),
253
+ name: 'date',
254
+ header: i18next.t('field.date'),
272
255
  sortable: true,
273
256
  filter: {
274
257
  type: 'date',
@@ -278,10 +261,11 @@ export class DataSummarySearchPage extends connect(store)(localize(i18next)(Page
278
261
  width: 80,
279
262
  imex: true
280
263
  },
281
- {
264
+ (this.dataSet.summaryPeriod == DataSetSummaryPeriodType.Hour ||
265
+ this.dataSet.summaryPeriod == DataSetSummaryPeriodType.WorkShift) && {
282
266
  type: 'string',
283
- name: 'workShift',
284
- header: i18next.t('field.work-shift'),
267
+ name: 'period',
268
+ header: i18next.t('field.time-period'),
285
269
  sortable: true,
286
270
  width: 60,
287
271
  imex: true
@@ -341,7 +325,7 @@ export class DataSummarySearchPage extends connect(store)(localize(i18next)(Page
341
325
  width: 180,
342
326
  imex: true
343
327
  }
344
- ],
328
+ ].filter(Boolean),
345
329
  rows: {
346
330
  appendable: false,
347
331
  selectable: {
@@ -362,7 +346,7 @@ export class DataSummarySearchPage extends connect(store)(localize(i18next)(Page
362
346
  },
363
347
  sorters: [
364
348
  {
365
- name: 'workDate',
349
+ name: 'date',
366
350
  desc: true
367
351
  }
368
352
  ]
@@ -387,8 +371,8 @@ export class DataSummarySearchPage extends connect(store)(localize(i18next)(Page
387
371
  id
388
372
  name
389
373
  description
390
- workDate
391
- workShift
374
+ date
375
+ period
392
376
  key01
393
377
  key02
394
378
  key03
@@ -13,8 +13,8 @@ type DataSummary = {
13
13
  name: string
14
14
  description: string
15
15
  dataItems?: DataItem[]
16
- workDate?: string
17
- workShift?: string
16
+ date?: string
17
+ period?: string
18
18
  key01?: string
19
19
  key02?: string
20
20
  key03?: string
@@ -103,8 +103,8 @@ class DataSummaryView extends localize(i18next)(LitElement) {
103
103
  spec
104
104
  stat
105
105
  }
106
- workDate
107
- workShift
106
+ date
107
+ shift
108
108
  key01
109
109
  key02
110
110
  key03
@@ -69,5 +69,6 @@ export declare class DataSetListPage extends DataSetListPage_base {
69
69
  }[];
70
70
  }>;
71
71
  importHandler(records: any): Promise<void>;
72
+ summaryScheduleTimer(exp: any): AsyncGenerator<string, void, unknown>;
72
73
  }
73
74
  export {};
@@ -1,4 +1,4 @@
1
- import { __decorate, __metadata } from "tslib";
1
+ import { __asyncGenerator, __await, __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
3
  import './data-item-list.js';
4
4
  import './data-set-importer.js';
@@ -7,6 +7,7 @@ import moment from 'moment-timezone';
7
7
  import gql from 'graphql-tag';
8
8
  import { css, html } from 'lit';
9
9
  import { customElement, query, state } from 'lit/decorators.js';
10
+ import { asyncReplace } from 'lit/directives/async-replace.js';
10
11
  import { connect } from 'pwa-helpers/connect-mixin';
11
12
  import { getEditor, getRenderer, DataGrist } from '@operato/data-grist';
12
13
  import { OxDataUseCase } from '@operato/dataset';
@@ -15,95 +16,45 @@ import { i18next, localize } from '@operato/i18n';
15
16
  import { notify, openPopup } from '@operato/layout';
16
17
  import { PageView, store } from '@operato/shell';
17
18
  import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
18
- import { isMobileDevice } from '@operato/utils';
19
+ import { isMobileDevice, sleep } from '@operato/utils';
19
20
  import { OxPopup } from '@operato/popup';
21
+ const MIN = 60;
22
+ const HOUR = 60 * MIN;
23
+ const DAY = 24 * HOUR;
20
24
  const DEFAULT_TZ = Intl.DateTimeFormat().resolvedOptions().timeZone;
21
25
  const TIMEZONE_OPTIONS = ['', DEFAULT_TZ, ...moment.tz.names().filter(tz => tz !== DEFAULT_TZ)];
22
26
  const ENTRY_TYPES = [
23
- {
24
- display: '',
25
- value: ''
26
- },
27
- {
28
- display: 'Generated',
29
- value: 'generated'
30
- },
31
- {
32
- display: 'Board',
33
- value: 'board'
34
- },
35
- {
36
- display: 'CustomElement',
37
- value: 'custom-element'
38
- },
39
- {
40
- display: 'Page',
41
- value: 'page'
42
- },
43
- {
44
- display: 'External URL',
45
- value: 'external'
46
- }
27
+ { display: '', value: '' },
28
+ { display: 'Generated', value: 'generated' },
29
+ { display: 'Board', value: 'board' },
30
+ { display: 'CustomElement', value: 'custom-element' },
31
+ { display: 'Page', value: 'page' },
32
+ { display: 'External URL', value: 'external' }
47
33
  ];
48
34
  const MONITOR_TYPES = [
49
- {
50
- display: '',
51
- value: ''
52
- },
53
- {
54
- display: 'Generated',
55
- value: 'generated'
56
- },
57
- {
58
- display: 'Board',
59
- value: 'board'
60
- },
61
- {
62
- display: 'CustomElement',
63
- value: 'custom-element'
64
- },
65
- {
66
- display: 'Page',
67
- value: 'page'
68
- },
69
- {
70
- display: 'External URL',
71
- value: 'external'
72
- }
35
+ { display: '', value: '' },
36
+ { display: 'Generated', value: 'generated' },
37
+ { display: 'Board', value: 'board' },
38
+ { display: 'CustomElement', value: 'custom-element' },
39
+ { display: 'Page', value: 'page' },
40
+ { display: 'External URL', value: 'external' }
73
41
  ];
74
42
  const REPORT_TYPES = [
75
- {
76
- display: '',
77
- value: ''
78
- },
79
- {
80
- display: 'Generated',
81
- value: 'generated'
82
- },
83
- {
84
- display: 'Embed',
85
- value: 'embed'
86
- },
87
- {
88
- display: 'CustomElement',
89
- value: 'custom-element'
90
- },
91
- {
92
- display: 'Page',
93
- value: 'page'
94
- },
95
- {
96
- display: 'External URL',
97
- value: 'external'
98
- },
99
- {
100
- display: 'Jasper',
101
- value: 'jasper'
102
- },
103
- {
104
- display: 'Shiny',
105
- value: 'shiny'
106
- }
43
+ { display: '', value: '' },
44
+ { display: 'Generated', value: 'generated' },
45
+ { display: 'Embed', value: 'embed' },
46
+ { display: 'CustomElement', value: 'custom-element' },
47
+ { display: 'Page', value: 'page' },
48
+ { display: 'External URL', value: 'external' },
49
+ { display: 'Jasper', value: 'jasper' },
50
+ { display: 'Shiny', value: 'shiny' }
51
+ ];
52
+ const SUMMARY_PERIOD_TYPES = [
53
+ { display: '', value: '' },
54
+ { display: 'Hour', value: 'hour' },
55
+ { display: 'WorkShift', value: 'work-shift' },
56
+ { display: 'WorkDate', value: 'work-date' },
57
+ { display: 'Day', value: 'day' }
107
58
  ];
108
59
  const USECASE_OPTIONS = () => {
109
60
  return ['', ...OxDataUseCase.getUseCaseNames()].map(name => {
@@ -370,6 +321,22 @@ let DataSetListPage = class DataSetListPage extends connect(store)(localize(i18n
370
321
  },
371
322
  width: 50
372
323
  },
324
+ {
325
+ type: 'select',
326
+ name: 'timezone',
327
+ header: i18next.t('field.timezone'),
328
+ record: {
329
+ editable: true,
330
+ options: TIMEZONE_OPTIONS
331
+ },
332
+ width: 120,
333
+ imex: {
334
+ width: 13,
335
+ header: i18next.t('field.timezone'),
336
+ type: 'select',
337
+ key: 'timezone'
338
+ }
339
+ },
373
340
  {
374
341
  type: 'crontab',
375
342
  name: 'schedule',
@@ -391,19 +358,27 @@ let DataSetListPage = class DataSetListPage extends connect(store)(localize(i18n
391
358
  },
392
359
  {
393
360
  type: 'select',
394
- name: 'timezone',
395
- header: i18next.t('field.timezone'),
361
+ name: 'summaryPeriod',
362
+ label: true,
363
+ header: i18next.t('field.summary-period'),
396
364
  record: {
397
365
  editable: true,
398
- options: TIMEZONE_OPTIONS
366
+ options: SUMMARY_PERIOD_TYPES
399
367
  },
400
- width: 120,
401
- imex: {
402
- width: 13,
403
- header: i18next.t('field.timezone'),
404
- type: 'select',
405
- key: 'timezone'
406
- }
368
+ width: 80
369
+ },
370
+ {
371
+ type: 'string',
372
+ name: 'nextSummarySchedule',
373
+ header: i18next.t('field.next-summary-schedule'),
374
+ record: {
375
+ editable: false,
376
+ renderer: (value, column, record, rowIndex, field) => {
377
+ return html ` <span>${asyncReplace(this.summaryScheduleTimer(record.dueAt))}</span>`;
378
+ }
379
+ },
380
+ sortable: false,
381
+ width: 140
407
382
  },
408
383
  {
409
384
  type: 'resource-object',
@@ -591,6 +566,8 @@ let DataSetListPage = class DataSetListPage extends connect(store)(localize(i18n
591
566
  schedule
592
567
  timezone
593
568
  scheduleId
569
+ summaryPeriod
570
+ summaryScheduleId
594
571
  dataKeySet {
595
572
  id
596
573
  name
@@ -827,6 +804,25 @@ let DataSetListPage = class DataSetListPage extends connect(store)(localize(i18n
827
804
  title: i18next.t('title.import data-set')
828
805
  });
829
806
  }
807
+ summaryScheduleTimer(exp) {
808
+ return __asyncGenerator(this, arguments, function* summaryScheduleTimer_1() {
809
+ while (exp) {
810
+ var secs = Math.round((Number(exp) - Date.now()) / 1000);
811
+ var positive = secs >= 0;
812
+ secs = Math.abs(secs);
813
+ const days = Math.floor(secs / DAY);
814
+ secs -= days * DAY;
815
+ const hours = Math.floor(secs / HOUR);
816
+ secs -= hours * HOUR;
817
+ const minutes = Math.floor(secs / MIN);
818
+ const seconds = secs - minutes * MIN;
819
+ yield yield __await(`${positive ? '' : '- '}${days ? `${days}${i18next.t('label.days')} ` : ''}${hours ? `${hours}${i18next.t('label.hours')} ` : ''}${minutes ? `${minutes}${i18next.t('label.minutes')} ` : ''}`);
820
+ do {
821
+ yield __await(sleep(60 * 1000));
822
+ } while (!this.active);
823
+ }
824
+ });
825
+ }
830
826
  };
831
827
  DataSetListPage.styles = [
832
828
  ScrollbarStyles,