| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import { LogControl } from './log_control'; |
| import { LogViewActions } from './log_view_actions'; |
| import { FfxLogData } from '../src/log_data'; |
| import { State } from '../src/state'; |
| import { LogList } from './log_list'; |
| |
| export const RESUMING_LOG_STREAMING_LOG = 'Resuming log streaming, press [pause icon] to pause.'; |
| export const PAUSING_LOG_STREAMING_LOG = 'Playback has been paused, press [play icon] to resume.'; |
| |
| export type ExternalActionRequestEvent = |
| | { type: 'pause-log-streaming' } |
| | { type: 'resume-log-streaming' }; |
| |
| export class LoggingView extends EventTarget { |
| private logActionContainer: HTMLDivElement; |
| private logControl: LogControl; |
| private logList: LogList; |
| private logListContainer: HTMLDivElement; |
| private logViewActions: LogViewActions; |
| |
| public static readonly externalActionRequestEvent: string = 'external-action-request-event'; |
| |
| constructor(private state: State, private root: HTMLElement) { |
| super(); |
| this.logList = new LogList(state); |
| |
| this.logControl = new LogControl(this.state.currentFilterText); |
| this.logControl.addEventListener(LogControl.filterChangeEvent, (e) => { |
| const event = e as CustomEvent; |
| const { filter, text } = event.detail; |
| this.state.registerFilter(filter, text); |
| }); |
| |
| this.logViewActions = new LogViewActions({ |
| wrappingLogs: this.state.shouldWrapLogs, |
| /** |
| * TODO(fxbug.dev/109719): make this behavior persisted and automatic |
| * with focus changes |
| */ |
| playActive: true |
| }); |
| this.logViewActions.addEventListener(LogViewActions.clearRequestedEvent, (e) => { |
| this.logList.reset(); |
| }); |
| this.logViewActions.addEventListener(LogViewActions.wrapLogsChangeEvent, (e) => { |
| const event = e as CustomEvent; |
| const { wrapLogs } = event.detail; |
| this.logList.logWrapping = wrapLogs; |
| this.state.shouldWrapLogs = wrapLogs; |
| }); |
| this.logViewActions.addEventListener(LogViewActions.playPauseChangeEvent, (e) => { |
| const event = e as CustomEvent; |
| const { playActive } = event.detail; |
| this.onPlayPauseChangeEvent(playActive); |
| }); |
| |
| this.logActionContainer = document.createElement('div'); |
| this.logActionContainer.id = 'log-action-container'; |
| this.logListContainer = document.createElement('div'); |
| this.logListContainer.id = 'log-list-container'; |
| |
| this.root.appendChild(this.logActionContainer); |
| this.logActionContainer.appendChild(this.logControl); |
| this.logActionContainer.appendChild(this.logViewActions); |
| |
| this.root.appendChild(this.logListContainer); |
| this.logListContainer.appendChild(this.logList.element); |
| } |
| |
| /** |
| * Appends a log to the current list of logs |
| */ |
| public addLog(log: FfxLogData) { |
| this.logList.addLog(log); |
| } |
| |
| /** |
| * Resets the state and contents of the webview to contain nothing. |
| * The persistent state is maintained as that represents user selections. |
| */ |
| public reset() { |
| this.state.reset(); |
| this.logList.reset(); |
| this.logControl.reset(); |
| } |
| |
| /** |
| * Handles a play/pause event emitted by the log actions view. |
| * @param playActive whether or not the streaming of logs is active |
| */ |
| private onPlayPauseChangeEvent(playActive: boolean) { |
| const detail: ExternalActionRequestEvent = |
| playActive |
| ? { type: 'resume-log-streaming' } |
| : { type: 'pause-log-streaming' }; |
| this.dispatchEvent(new CustomEvent(LoggingView.externalActionRequestEvent, { |
| detail, |
| })); |
| |
| this.logList.addLog({ |
| data: { |
| // eslint-disable-next-line @typescript-eslint/naming-convention |
| ViewerEvent: playActive |
| ? RESUMING_LOG_STREAMING_LOG |
| : PAUSING_LOG_STREAMING_LOG |
| }, |
| timestamp: Date.now(), |
| version: 0 |
| }); |
| } |
| } |