-
Notifications
You must be signed in to change notification settings - Fork 33
Migrate asciicinema component from hashicorp/ember-asciinema-player repo #3102
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
Open
hashicc
wants to merge
18
commits into
main
Choose a base branch
from
migrate-asciicinema-components
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 2 commits
Commits
Show all changes
18 commits
Select commit
Hold shift + click to select a range
9a0770c
chore: 🤖 add asciinema-player dependency
hashicc c05d632
chore: 🤖 migrate component and test from addon repo
hashicc 2a1a510
chore: 🤖 update component references in tests
hashicc 7438c86
chore: 🤖 swap styles import to asciinema-player
hashicc 97ebed5
chore: 🤖 Use specific version of ascii-cinema for our styles
hashicc ac2a713
chore: 🤖 import setupRenderingTest from app helpers
hashicc 4bc0231
chore: 🤖 update reference to test .cast file fetched
hashicc 793146e
style: 💄 prettier formatting updates
hashicc 8cc310e
chore: 🤖 refactor to using element modifier
hashicc 10c5bd2
chore: 🤖 remove unused/unreferenced property
hashicc bcd46e3
chore: 🤖 remove unused css classname
hashicc 4eb5977
chore: 🤖 rename asciinema player component class name
hashicc e5e4714
refactor: 💡 simplify implementation
hashicc aa7468a
refactor: 💡 replace addon component with app component
hashicc d11706d
fix: 🐛 pass in data as an object with the key data
hashicc 47f7442
refactor: 💡 remove @tracked on player property
hashicc 5571801
chore: 🤖 remove hashicorp/ember-asciinema-player dependency
hashicc 88fcfbe
fix: 🐛 update to correct location of asciinema-player.css
hashicc File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
13 changes: 13 additions & 0 deletions
13
ui/admin/app/components/session-recording/player/asciinema-player.hbs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| {{! | ||
| Copyright (c) HashiCorp, Inc. | ||
| SPDX-License-Identifier: MPL-2.0 | ||
| }} | ||
|
|
||
| <div | ||
| class='heap-player' | ||
| ...attributes | ||
| {{did-insert this.initializePlayer}} | ||
| {{will-destroy this.destroyPlayer}} | ||
| > | ||
|
|
||
| </div> | ||
112 changes: 112 additions & 0 deletions
112
ui/admin/app/components/session-recording/player/asciinema-player.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,112 @@ | ||
| /** | ||
| * Copyright (c) HashiCorp, Inc. | ||
| * SPDX-License-Identifier: MPL-2.0 | ||
| */ | ||
|
|
||
| import Component from '@glimmer/component'; | ||
| import { tracked } from '@glimmer/tracking'; | ||
| import { action } from '@ember/object'; | ||
| import { later } from '@ember/runloop'; | ||
| import * as AsciinemaPlayer from 'asciinema-player'; | ||
|
|
||
| export default class HeapPlayerComponent extends Component { | ||
| // =properties | ||
|
|
||
| /** | ||
| * @type {?AsciinemaPlayer} | ||
| */ | ||
| @tracked player = null; | ||
|
|
||
| /** | ||
| * | ||
| */ | ||
| initialized = false; | ||
|
|
||
| /** | ||
| * Options of the underlying AsciinemaPlayer supported by this component, | ||
| * which may be passed as named arguments to the player. | ||
| * @type {string[]} | ||
| * @see https://github.com/asciinema/asciinema-player#options | ||
| */ | ||
| supportedOptions = new Array( | ||
| 'autoPlay', | ||
| 'loop', | ||
| 'startAt', | ||
| 'speed', | ||
| 'idleTimeLimit', | ||
| 'theme', | ||
| 'poster', | ||
| 'fit', | ||
| 'controls', | ||
| 'markers', | ||
| 'pauseOnMarkers', | ||
| ); | ||
|
|
||
| /** | ||
| * An object of options where each possible key from `supportOptions` is | ||
| * included if and only if its associated value was passed to the component | ||
| * as an argument. | ||
| * | ||
| * E.g. `@autoPlay={{true}} @fit='both'` results in | ||
| * the options object `{autoPlay: true, fit: 'both'}`. | ||
| * @type {object} | ||
| * @see https://github.com/asciinema/asciinema-player#options | ||
| */ | ||
| get options() { | ||
| return this.supportedOptions.reduce( | ||
| (obj, key) => { | ||
| return this.args?.[key] !== undefined | ||
| ? { ...obj, [key]: this.args[key] } | ||
| : obj | ||
| }, | ||
| {} | ||
| ); | ||
| } | ||
|
|
||
| // =methods | ||
|
|
||
| /** | ||
| * Initializes the asciinema player within the current element. | ||
| * @param {object|string} | ||
| * source - URL or object passed through to AsciinemaPlayer.create(source). | ||
| * @param {Element} | ||
| * containerElement - DOM element passed from the did-insert modifier. | ||
| * @returns {AsciinemaPlayer} | ||
| */ | ||
| create(source, containerElement, options) { | ||
| // cleanup previous player, if any | ||
| this.dispose(); | ||
| // initialize a new AsciinemaPlayer | ||
| this.player = | ||
| AsciinemaPlayer.create(source, containerElement, options); | ||
| return this.player; | ||
| } | ||
|
|
||
| /** | ||
| * Calls asciinema-player's `dispose()` method to destroy the player and | ||
| * cleanup the DOM. Unsets this component's `player` property. | ||
| */ | ||
| dispose() { | ||
| this.player?.dispose(); | ||
| this.player = null; | ||
| } | ||
|
|
||
| // =actions | ||
|
|
||
| /** | ||
| * Creates an AsciinemaPlayer within the passed `containerElement`. | ||
| */ | ||
| @action | ||
| initializePlayer(containerElement) { | ||
| const { data } = this.args; | ||
| this.create({ data }, containerElement, this.options); | ||
| } | ||
|
|
||
| /** | ||
| * Destroys the currently initialized AsciinemaPlayer, if any. | ||
| */ | ||
| @action | ||
| destroyPlayer() { | ||
| later(() => this.dispose(), 250); | ||
|
||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
30 changes: 30 additions & 0 deletions
30
ui/admin/tests/integration/components/session-recording/player/asciinema-player-test.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| /** | ||
| * Copyright (c) HashiCorp, Inc. | ||
| * SPDX-License-Identifier: MPL-2.0 | ||
| */ | ||
|
|
||
| import { module, test } from 'qunit'; | ||
| import { setupRenderingTest } from 'dummy/tests/helpers'; | ||
| import { render, waitUntil } from '@ember/test-helpers'; | ||
| import { hbs } from 'ember-cli-htmlbars'; | ||
|
|
||
| module('Integration | Component | heap/player', function (hooks) { | ||
| setupRenderingTest(hooks); | ||
|
|
||
| test('it renders', async function (assert) { | ||
| assert.expect(1); | ||
|
|
||
| const asciicast = await fetch('/example.cast'); | ||
| const asciicastContent = await asciicast.text(); | ||
| this.set('data', asciicastContent); | ||
|
|
||
| await render(hbs`<Heap::Player @data={{this.data}} @poster='npt:1:30' />`); | ||
| // AsciinemaPlayer does not come with a "ready" event, and its | ||
| // initialization is async. Therefore tests must `waitUntil` the expected | ||
| // DOM state is reached. | ||
| await waitUntil(() => | ||
| assert.dom('.ap-player') | ||
| .hasAnyText('ember-asciinema-player git:(main*)') | ||
| ); | ||
| }); | ||
| }); |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ember template lint warns against using these