Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add setting to enable log timestamps #2147

Merged
merged 1 commit into from
Jul 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
getQueryParams,
getResourcesAPI,
getTektonAPI,
isLogTimestampsEnabled,
useCollection,
useResource
} from './utils';
Expand Down Expand Up @@ -104,9 +105,11 @@ export function useNamespaces(queryConfig) {
}

export function getPodLogURL({ container, name, namespace, follow }) {
const timestamps = isLogTimestampsEnabled();
const queryParams = {
...(container && { container }),
...(follow && { follow })
...(follow && { follow }),
...(timestamps && { timestamps })
};
const uri = `${getKubeAPI(
'pods',
Expand Down
8 changes: 8 additions & 0 deletions src/api/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -210,3 +210,11 @@ export function useResource(kind, api, params, queryConfig) {
useWebSocket({ kind });
return query;
}

export function isLogTimestampsEnabled() {
return localStorage.getItem('tkn-logs-timestamps') === 'true';
}

export function setLogTimestampsEnabled(enabled) {
localStorage.setItem('tkn-logs-timestamps', enabled);
}
50 changes: 50 additions & 0 deletions src/api/utils.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -388,3 +388,53 @@ describe('useResource', () => {
expect(result.current.data).toEqual(updatedResource);
});
});

describe('isLogTimestampsEnabled', () => {
afterEach(() => {
localStorage.removeItem('tkn-logs-timestamps');
});

it('handles valid values', () => {
localStorage.setItem('tkn-logs-timestamps', true);
expect(utils.isLogTimestampsEnabled()).toBe(true);
localStorage.setItem('tkn-logs-timestamps', false);
expect(utils.isLogTimestampsEnabled()).toBe(false);
});

it('handles invalid values', () => {
localStorage.setItem('tkn-logs-timestamps', 'foo');
expect(utils.isLogTimestampsEnabled()).toBe(false);
});
});

describe('isLogTimestampsEnabled', () => {
afterEach(() => {
localStorage.removeItem('tkn-logs-timestamps');
});

it('handles valid values', () => {
localStorage.setItem('tkn-logs-timestamps', true);
expect(utils.isLogTimestampsEnabled()).toBe(true);
localStorage.setItem('tkn-logs-timestamps', false);
expect(utils.isLogTimestampsEnabled()).toBe(false);
});

it('handles invalid values', () => {
localStorage.setItem('tkn-logs-timestamps', 'foo');
expect(utils.isLogTimestampsEnabled()).toBe(false);
});
});

describe('setLogTimestampsEnabled', () => {
afterEach(() => {
localStorage.removeItem('tkn-logs-timestamps');
});

it('persists the specified value', () => {
utils.setLogTimestampsEnabled(true);
expect(localStorage.getItem('tkn-logs-timestamps')).toEqual('true');

utils.setLogTimestampsEnabled(false);
expect(localStorage.getItem('tkn-logs-timestamps')).toEqual('false');
});
});
24 changes: 23 additions & 1 deletion src/containers/Settings/Settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,18 @@ limitations under the License.
import React from 'react';
import { injectIntl } from 'react-intl';
import { useTitleSync } from '@tektoncd/dashboard-utils';
import { RadioTile, TileGroup } from 'carbon-components-react';
import { RadioTile, TileGroup, Toggle } from 'carbon-components-react';
import {
Asleep16 as DarkIcon,
Light16 as LightIcon,
Devices16 as SystemIcon
} from '@carbon/icons-react';

import { getTheme, setTheme } from '../../utils';
import {
isLogTimestampsEnabled,
setLogTimestampsEnabled
} from '../../api/utils';

export function Settings({ intl }) {
useTitleSync({
Expand Down Expand Up @@ -71,6 +75,24 @@ export function Settings({ intl }) {
})}
</RadioTile>
</TileGroup>

<Toggle
defaultToggled={isLogTimestampsEnabled()}
id="tkn--log-timestamps-toggle"
labelText={intl.formatMessage({
id: 'dashboard.logs.showTimestamps.label',
defaultMessage: 'Show log timestamps'
})}
labelA={intl.formatMessage({
id: 'dashboard.toggle.off',
defaultMessage: 'Off'
})}
labelB={intl.formatMessage({
id: 'dashboard.toggle.on',
defaultMessage: 'On'
})}
onToggle={checked => setLogTimestampsEnabled(checked)}
/>
</div>
</div>
);
Expand Down
33 changes: 17 additions & 16 deletions src/containers/Settings/Settings.scss
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,31 @@ limitations under the License.
.tkn--settings {
.tkn--settings--content {
.bx--tile-group {
margin-bottom: 2rem;
max-width: 400px;
}

.bx--tile {
display: flex;
align-items: center;

.bx--tile__checkmark {
top: calc(50% - 0.5rem);
}

.bx--tile-content {
.bx--tile {
display: flex;
align-items: center;

svg {
fill: $icon-01;
margin-right: 0.5rem;
.bx--tile__checkmark {
top: calc(50% - 0.5rem);
}

.bx--tile-content {
display: flex;
align-items: center;

svg {
fill: $icon-01;
margin-right: 0.5rem;
}
}
}
}

.bx--tile:not(:last-child) {
margin-bottom: 0.5rem;
.bx--tile:not(:last-child) {
margin-bottom: 0.5rem;
}
}
}
}
16 changes: 16 additions & 0 deletions src/containers/Settings/Settings.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import { fireEvent } from '@testing-library/react';

import { render } from '../../utils/test';
import * as Utils from '../../utils';
import * as APIUtils from '../../api/utils';

import Settings from '.';

describe('Settings', () => {
Expand All @@ -34,4 +36,18 @@ describe('Settings', () => {
fireEvent.click(getByText(/dark/i));
expect(Utils.setTheme).toHaveBeenCalledWith('dark');
});

it('should render the log timestamp settings correctly', () => {
jest
.spyOn(APIUtils, 'isLogTimestampsEnabled')
.mockImplementation(() => true);
jest.spyOn(APIUtils, 'setLogTimestampsEnabled');

const { getByLabelText, getByText } = render(<Settings />);

expect(getByText(/show log timestamps/i)).toBeTruthy();
expect(getByText(/on/i)).toBeTruthy();
fireEvent.click(getByLabelText(/show log timestamps/i));
expect(APIUtils.setLogTimestampsEnabled).toHaveBeenCalledWith(false);
});
});
3 changes: 3 additions & 0 deletions src/nls/messages_de.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "",
"dashboard.metadata.labels": "",
"dashboard.metadata.namespace": "",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "",
"dashboard.trigger.noHeaders": "",
"dashboard.trigger.noOverlays": "",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_en.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "Return to default",
"dashboard.logs.scrollToBottom": "Scroll to end of logs",
"dashboard.logs.scrollToTop": "Scroll to start of logs",
"dashboard.logs.showTimestamps.label": "Show log timestamps",
"dashboard.metadata.dateCreated": "Date created:",
"dashboard.metadata.labels": "Labels:",
"dashboard.metadata.namespace": "Namespace:",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "Theme",
"dashboard.theme.light": "Light",
"dashboard.theme.system": "System",
"dashboard.toggle.off": "Off",
"dashboard.toggle.on": "On",
"dashboard.tooltipDropdown.empty": "No items found",
"dashboard.trigger.noHeaders": "No headers found for this interceptor.",
"dashboard.trigger.noOverlays": "No overlays found for this interceptor.",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_es.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "",
"dashboard.metadata.labels": "",
"dashboard.metadata.namespace": "",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "",
"dashboard.trigger.noHeaders": "",
"dashboard.trigger.noOverlays": "",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "",
"dashboard.metadata.labels": "",
"dashboard.metadata.namespace": "",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "",
"dashboard.trigger.noHeaders": "",
"dashboard.trigger.noOverlays": "",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_it.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "",
"dashboard.metadata.labels": "",
"dashboard.metadata.namespace": "",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "",
"dashboard.trigger.noHeaders": "",
"dashboard.trigger.noOverlays": "",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "デフォルトに戻す",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "作成日:",
"dashboard.metadata.labels": "ラベル:",
"dashboard.metadata.namespace": "Namespace:",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "項目が見つかりません",
"dashboard.trigger.noHeaders": "このinterceptorのヘッダーが見つかりません。",
"dashboard.trigger.noOverlays": "このinterceptorのオーバーレイが見つかりません。",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "",
"dashboard.metadata.labels": "",
"dashboard.metadata.namespace": "",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "",
"dashboard.trigger.noHeaders": "",
"dashboard.trigger.noOverlays": "",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "",
"dashboard.metadata.labels": "",
"dashboard.metadata.namespace": "",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "",
"dashboard.trigger.noHeaders": "",
"dashboard.trigger.noOverlays": "",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_zh-Hans.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "创建日期:",
"dashboard.metadata.labels": "标签:",
"dashboard.metadata.namespace": "Namespace:",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "未找到项目",
"dashboard.trigger.noHeaders": "未找到该 Interceptor 的 header。",
"dashboard.trigger.noOverlays": "未找到该 Interceptor 的 overlay。",
Expand Down
3 changes: 3 additions & 0 deletions src/nls/messages_zh-Hant.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"dashboard.logs.restore": "",
"dashboard.logs.scrollToBottom": "",
"dashboard.logs.scrollToTop": "",
"dashboard.logs.showTimestamps.label": "",
"dashboard.metadata.dateCreated": "",
"dashboard.metadata.labels": "",
"dashboard.metadata.namespace": "",
Expand Down Expand Up @@ -250,6 +251,8 @@
"dashboard.theme.label": "",
"dashboard.theme.light": "",
"dashboard.theme.system": "",
"dashboard.toggle.off": "",
"dashboard.toggle.on": "",
"dashboard.tooltipDropdown.empty": "",
"dashboard.trigger.noHeaders": "",
"dashboard.trigger.noOverlays": "",
Expand Down