Skip to content

Commit a0fddda

Browse files
authored
Merge pull request #693 from NatLabRockies/695-et-tz
use ET timezone consistently in the admin UI
2 parents 1cb2bd5 + f905b2e commit a0fddda

File tree

11 files changed

+108
-32
lines changed

11 files changed

+108
-32
lines changed

src/api-umbrella/admin-ui/app/components/admins/index-table.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,15 @@ export default class IndexTable extends Component {
6565
name: 'Last Signed In',
6666
title: t('Last Signed In'),
6767
defaultContent: '-',
68-
render: DataTablesHelpers.renderTime,
68+
render: DataTablesHelpers.renderTime(this.session.data.authenticated.analytics_timezone),
6969
},
7070
{
7171
data: 'created_at',
7272
type: 'date',
7373
name: 'Created',
7474
title: t('Created'),
7575
defaultContent: '-',
76-
render: DataTablesHelpers.renderTime,
76+
render: DataTablesHelpers.renderTime(this.session.data.authenticated.analytics_timezone),
7777
},
7878
],
7979
});

src/api-umbrella/admin-ui/app/components/api-users/index-table.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export default class IndexTable extends Component {
5858
type: 'date',
5959
title: 'Created',
6060
defaultContent: '-',
61-
render: DataTablesHelpers.renderTime,
61+
render: DataTablesHelpers.renderTime(this.session.data.authenticated.analytics_timezone),
6262
},
6363
{
6464
data: 'registration_source',

src/api-umbrella/admin-ui/app/components/stats/logs/results-table.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// eslint-disable-next-line ember/no-classic-components
22
import Component from '@ember/component';
33
import { action, computed } from '@ember/object';
4+
import { inject } from '@ember/service';
45
import { observes } from '@ember-decorators/object';
56
import Logs from 'api-umbrella-admin-ui/models/stats/logs';
67
import DataTablesHelpers from 'api-umbrella-admin-ui/utils/data-tables-helpers';
@@ -22,6 +23,9 @@ marked.use({
2223
export default class ResultsTable extends Component {
2324
tagName = '';
2425

26+
@inject('session')
27+
session;
28+
2529
@action
2630
didInsert(element) {
2731
this.table = $(element).find('table').DataTable({
@@ -58,7 +62,7 @@ export default class ResultsTable extends Component {
5862
type: 'date',
5963
title: 'Time',
6064
defaultContent: '-',
61-
render: DataTablesHelpers.renderTime,
65+
render: DataTablesHelpers.renderTime(this.session.data.authenticated.analytics_timezone),
6266
},
6367
{
6468
data: 'request_method',

src/api-umbrella/admin-ui/app/components/stats/users/results-table.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// eslint-disable-next-line ember/no-classic-components
22
import Component from '@ember/component';
33
import { action, computed } from '@ember/object';
4+
import { inject } from '@ember/service';
45
import { observes } from '@ember-decorators/object';
56
import DataTablesHelpers from 'api-umbrella-admin-ui/utils/data-tables-helpers';
67
import classic from 'ember-classic-decorator';
@@ -14,6 +15,9 @@ import numeral from 'numeral';
1415
export default class ResultsTable extends Component {
1516
tagName = '';
1617

18+
@inject('session')
19+
session;
20+
1721
@action
1822
didInsert(element) {
1923
this.table = $(element).find('table').DataTable({
@@ -60,7 +64,7 @@ export default class ResultsTable extends Component {
6064
type: 'date',
6165
title: 'Signed Up',
6266
defaultContent: '-',
63-
render: DataTablesHelpers.renderTime,
67+
render: DataTablesHelpers.renderTime(this.session.data.authenticated.analytics_timezone),
6468
},
6569
{
6670
data: 'hits',
@@ -79,7 +83,7 @@ export default class ResultsTable extends Component {
7983
type: 'date',
8084
title: 'Last Request',
8185
defaultContent: '-',
82-
render: DataTablesHelpers.renderTime,
86+
render: DataTablesHelpers.renderTime(this.session.data.authenticated.analytics_timezone),
8387
},
8488
{
8589
data: 'use_description',

src/api-umbrella/admin-ui/app/helpers/format-date.js

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
1-
import { helper } from '@ember/component/helper';
1+
import Helper from '@ember/component/helper';
2+
import { inject } from '@ember/service';
23
import isString from 'lodash-es/isString';
34
import moment from 'moment-timezone';
45

5-
export function formatDate(params) {
6-
let date = params[0];
7-
let format = params[1];
6+
export default class FormatDate extends Helper {
7+
@inject session;
88

9-
if(!format || !isString(format)) {
10-
format = 'YYYY-MM-DD HH:mm Z';
11-
}
9+
compute(positional) {
10+
let date = positional[0];
11+
let format = positional[1];
12+
13+
if(!format || !isString(format)) {
14+
format = 'YYYY-MM-DD LT z';
15+
}
1216

13-
if(date) {
14-
return moment(date).format(format);
15-
} else {
16-
return '';
17+
if(date) {
18+
return moment(date).tz(this.session.data.authenticated.analytics_timezone).format(format);
19+
} else {
20+
return '';
21+
}
1722
}
1823
}
19-
20-
export default helper(formatDate);

src/api-umbrella/admin-ui/app/utils/data-tables-helpers.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,13 @@ export default {
8181
}
8282
},
8383

84-
renderTime(value, type) {
85-
if(type === 'display' && value && value !== '-') {
86-
return moment(value).format('YYYY-MM-DD HH:mm:ss');
87-
}
84+
renderTime(timezone) {
85+
return function(value, type) {
86+
if(type === 'display' && value && value !== '-') {
87+
return moment(value).tz(timezone).format('YYYY-MM-DD LTS z');
88+
}
8889

89-
return value;
90+
return value;
91+
}
9092
},
9193
};

src/api-umbrella/utils/time.lua

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ local null = ngx.null
77
local date = icu_date.new()
88
local format_iso8601 = icu_date.formats.pattern("yyyy-MM-dd'T'HH:mm:ssZZZZZ")
99
local format_iso8601_ms = icu_date.formats.pattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ")
10-
local format_csv = icu_date.formats.pattern("yyyy-MM-dd HH:mm:ss")
1110
local format_postgres = icu_date.formats.pattern("yyyy-MM-dd HH:mm:ss.SSSSxxx")
1211
local format_postgres_no_millis = icu_date.formats.pattern("yyyy-MM-dd HH:mm:ssxxx")
1312

@@ -80,7 +79,7 @@ function _M.timestamp_ms_to_csv(timestamp)
8079
end
8180

8281
date:set_millis(timestamp)
83-
return date:format(format_csv)
82+
return date:format(format_iso8601_ms)
8483
end
8584

8685
function _M.iso8601_to_timestamp(string)
@@ -116,7 +115,7 @@ function _M.iso8601_to_csv(string)
116115
end
117116

118117
date:parse(format_iso8601, string)
119-
return date:format(format_csv)
118+
return date:format(format_iso8601)
120119
end
121120

122121
function _M.iso8601_ms_to_csv(string)
@@ -125,7 +124,7 @@ function _M.iso8601_ms_to_csv(string)
125124
end
126125

127126
date:parse(format_iso8601_ms, string)
128-
return date:format(format_csv)
127+
return date:format(format_iso8601_ms)
129128
end
130129

131130
function _M.opensearch_to_csv(value)

test/admin_ui/test_api_users.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,16 @@ def test_form
6868
assert_field("Restrict Access to HTTP Referers", :with => "*.example.com/*\n*//example2.com/*")
6969
assert_select("Account Enabled", :selected => "Disabled")
7070
end
71+
72+
def test_metadata_timezone_display
73+
user = FactoryBot.create(:api_user, {
74+
:created_at => Time.parse("2015-01-16T06:06:28.816Z").utc,
75+
:updated_at => Time.parse("2015-07-16T06:09:33.273Z").utc,
76+
})
77+
admin_login
78+
visit "/admin/#/api_users/#{user.id}/edit"
79+
80+
assert_text("Created: 2015-01-15 11:06 PM MST by ")
81+
assert_text("Last Updated: 2015-07-16 12:09 AM MDT by ")
82+
end
7183
end

test/admin_ui/test_stats_logs.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,4 +305,34 @@ def test_filter_options
305305
"is not null",
306306
]
307307
end
308+
309+
def test_table_displays_time_in_local_timezone
310+
FactoryBot.create(:log_item, :request_at => Time.parse("2015-01-16T06:06:28.816Z").utc, :request_method => "OPTIONS")
311+
FactoryBot.create(:log_item, :request_at => Time.parse("2015-01-16T08:23:31.273Z").utc, :request_method => "OPTIONS")
312+
FactoryBot.create(:log_item, :request_at => Time.parse("2015-01-16T19:02:43.902Z").utc, :request_method => "OPTIONS")
313+
LogItem.refresh_indices!
314+
315+
admin_login
316+
visit "/admin/#/stats/logs?search=&start_at=2015-01-12&end_at=2015-01-18&interval=day"
317+
refute_selector(".busy-blocker")
318+
319+
assert_equal("2015-01-16 12:02:43 PM MST", find("#results_table table tbody tr:nth-child(1) td:first-child").text)
320+
assert_equal("2015-01-16 1:23:31 AM MST", find("#results_table table tbody tr:nth-child(2) td:first-child").text)
321+
assert_equal("2015-01-15 11:06:28 PM MST", find("#results_table table tbody tr:nth-child(3) td:first-child").text)
322+
end
323+
324+
def test_table_displays_time_in_local_timezone_during_dst
325+
FactoryBot.create(:log_item, :request_at => Time.parse("2015-07-16T06:06:28.816Z").utc, :request_method => "OPTIONS")
326+
FactoryBot.create(:log_item, :request_at => Time.parse("2015-07-16T08:23:31.273Z").utc, :request_method => "OPTIONS")
327+
FactoryBot.create(:log_item, :request_at => Time.parse("2015-07-16T19:02:43.902Z").utc, :request_method => "OPTIONS")
328+
LogItem.refresh_indices!
329+
330+
admin_login
331+
visit "/admin/#/stats/logs?search=&start_at=2015-07-12&end_at=2015-07-18&interval=day"
332+
refute_selector(".busy-blocker")
333+
334+
assert_equal("2015-07-16 1:02:43 PM MDT", find("#results_table table tbody tr:nth-child(1) td:first-child").text)
335+
assert_equal("2015-07-16 2:23:31 AM MDT", find("#results_table table tbody tr:nth-child(2) td:first-child").text)
336+
assert_equal("2015-07-16 12:06:28 AM MDT", find("#results_table table tbody tr:nth-child(3) td:first-child").text)
337+
end
308338
end

test/apis/admin/stats/test_logs.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,4 +226,26 @@ def test_no_results_non_existent_indices
226226
"recordsTotal" => 0,
227227
}, data)
228228
end
229+
230+
def test_csv_timestamps_in_iso8601_utc_format
231+
FactoryBot.create(:log_item, :request_at => Time.parse("2015-01-16T06:06:28.816Z").utc, :request_user_agent => unique_test_id)
232+
LogItem.refresh_indices!
233+
234+
response = Typhoeus.get("https://127.0.0.1:9081/admin/stats/logs.csv", http_options.deep_merge(admin_session).deep_merge({
235+
:params => {
236+
"start_at" => "2015-01-13",
237+
"end_at" => "2015-01-18",
238+
"interval" => "day",
239+
"start" => "0",
240+
"length" => "10",
241+
},
242+
}))
243+
244+
assert_response_code(200, response)
245+
246+
csv = CSV.parse(response.body)
247+
assert_equal(2, csv.length)
248+
assert_equal("Time", csv[0][0])
249+
assert_equal("2015-01-16T06:06:28.816Z", csv[1][0])
250+
end
229251
end

0 commit comments

Comments
 (0)