-
Notifications
You must be signed in to change notification settings - Fork 80
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
feat: add component Details sidebar [FC-0062] #1303
Merged
ChrisChV
merged 5 commits into
openedx:master
from
open-craft:rpenido/fal-3803-component-sidebar-details-tab
Sep 25, 2024
Merged
Changes from 3 commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
2ba9b36
feat: add ComponentDetails component
rpenido 1788a4c
fix: remove description field
rpenido d2a4eff
fix: invalidate componentMetadata to get updated `modified` date
rpenido 0e4ba1a
fix: remove unused message
rpenido a9a7b21
fix: better error handling
rpenido 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
There are no files selected for viewing
28 changes: 28 additions & 0 deletions
28
src/library-authoring/component-info/ComponentDetails.test.tsx
This file contains 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,28 @@ | ||
import { | ||
initializeMocks, | ||
render, | ||
screen, | ||
} from '../../testUtils'; | ||
import { mockLibraryBlockMetadata } from '../data/api.mocks'; | ||
import ComponentDetails from './ComponentDetails'; | ||
|
||
describe('<ComponentDetails />', () => { | ||
it('should render the component usage', async () => { | ||
initializeMocks(); | ||
mockLibraryBlockMetadata.applyMock(); | ||
render(<ComponentDetails usageKey={mockLibraryBlockMetadata.usageKeyNeverPublished} />); | ||
expect(await screen.findByText('Component Usage')).toBeInTheDocument(); | ||
// TODO: replace with actual data when implement tag list | ||
expect(screen.queryByText('This will show the courses that use this component.')).toBeInTheDocument(); | ||
}); | ||
|
||
it('should render the component history', async () => { | ||
initializeMocks(); | ||
mockLibraryBlockMetadata.applyMock(); | ||
render(<ComponentDetails usageKey={mockLibraryBlockMetadata.usageKeyNeverPublished} />); | ||
// Show created date | ||
expect(await screen.findByText('June 20, 2024')).toBeInTheDocument(); | ||
// Show modified date | ||
expect(await screen.findByText('June 21, 2024')).toBeInTheDocument(); | ||
}); | ||
}); |
This file contains 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,47 @@ | ||
import { useIntl } from '@edx/frontend-platform/i18n'; | ||
import { Stack } from '@openedx/paragon'; | ||
|
||
import { useLibraryBlockMetadata } from '../data/apiHooks'; | ||
import HistoryWidget from '../generic/history-widget'; | ||
import { ComponentDeveloperInfo } from './ComponentDeveloperInfo'; | ||
import messages from './messages'; | ||
|
||
interface ComponentDetailsProps { | ||
usageKey: string; | ||
} | ||
|
||
const ComponentDetails = ({ usageKey }: ComponentDetailsProps) => { | ||
const intl = useIntl(); | ||
const { data: componentMetadata } = useLibraryBlockMetadata(usageKey); | ||
|
||
// istanbul ignore if: this should never happen | ||
if (!componentMetadata) { | ||
return null; | ||
} | ||
|
||
return ( | ||
<Stack gap={3}> | ||
<div> | ||
<h3 className="h5"> | ||
{intl.formatMessage(messages.detailsTabUsageTitle)} | ||
</h3> | ||
<small>This will show the courses that use this component.</small> | ||
</div> | ||
<hr className="w-100" /> | ||
<div> | ||
<h3 className="h5"> | ||
{intl.formatMessage(messages.detailsTabHistoryTitle)} | ||
</h3> | ||
<HistoryWidget | ||
{...componentMetadata} | ||
/> | ||
</div> | ||
{ | ||
// istanbul ignore next: this is only shown in development | ||
(process.env.NODE_ENV === 'development' ? <ComponentDeveloperInfo usageKey={usageKey} /> : null) | ||
} | ||
</Stack> | ||
); | ||
}; | ||
|
||
export default ComponentDetails; |
This file contains 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
This file contains 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
This file contains 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 |
---|---|---|
|
@@ -9,7 +9,7 @@ import { mockLibraryBlockMetadata } from '../data/api.mocks'; | |
import ComponentManagement from './ComponentManagement'; | ||
|
||
/* | ||
* FIXME: Summarize the reason here | ||
* This function is used to get the inner text of an element. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missed comment from the ComponentManagent tab test |
||
* https://stackoverflow.com/questions/47902335/innertext-is-undefined-in-jest-test | ||
*/ | ||
const getInnerText = (element: Element) => element?.textContent | ||
|
This file contains 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
This file contains 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
This file contains 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
This file contains 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
This file contains 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
6 changes: 6 additions & 0 deletions
6
src/library-authoring/generic/history-widget/HistoryWidget.scss
This file contains 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,6 @@ | ||
.history-widget-bar { | ||
border-left: 8px solid $info-300; | ||
border-radius: 4px; | ||
padding-left: 1rem; | ||
} | ||
|
This file contains 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,52 @@ | ||
import { FormattedMessage, FormattedDate } from '@edx/frontend-platform/i18n'; | ||
import { Stack } from '@openedx/paragon'; | ||
|
||
import messages from './messages'; | ||
|
||
const CustomFormattedDate = ({ date }: { date: string }) => ( | ||
<FormattedDate | ||
value={date} | ||
year="numeric" | ||
month="long" | ||
day="2-digit" | ||
/> | ||
); | ||
|
||
type HistoryWidgedProps = { | ||
modified: string | null; | ||
created: string | null; | ||
}; | ||
|
||
/** | ||
* This component displays the history of an entity (Last Modified and Created dates) | ||
* | ||
* This component doesn't handle fetching the data or any other side effects. It only displays the dates. | ||
* | ||
* @example | ||
* ```tsx | ||
* const { data: componentMetadata } = useLibraryBlockMetadata(usageKey); | ||
* | ||
* return <HistoryWidget {...componentMetadata} />; | ||
* ``` | ||
*/ | ||
const HistoryWidget = ({ | ||
modified, | ||
created, | ||
}: HistoryWidgedProps) => ( | ||
<Stack className="history-widget-bar small" gap={3}> | ||
{modified && ( | ||
<div> | ||
<div className="text-muted"><FormattedMessage {...messages.lastModifiedTitle} /> </div> | ||
<CustomFormattedDate date={modified} /> | ||
</div> | ||
)} | ||
{created && ( | ||
<div> | ||
<div className="text-muted"><FormattedMessage {...messages.createdTitle} /> </div> | ||
<CustomFormattedDate date={created} /> | ||
</div> | ||
)} | ||
</Stack> | ||
); | ||
|
||
export default HistoryWidget; |
This file contains 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,16 @@ | ||
import { defineMessages } from '@edx/frontend-platform/i18n'; | ||
|
||
const messages = defineMessages({ | ||
lastModifiedTitle: { | ||
id: 'course-authoring.library-authoring.generic.history-widget.last-modified', | ||
defaultMessage: 'Last Modified', | ||
description: 'Title of the last modified section in the library authoring sidebar.', | ||
}, | ||
createdTitle: { | ||
id: 'course-authoring.library-authoring.generic.history-widget.created', | ||
defaultMessage: 'Created', | ||
description: 'Title of the created section in the library authoring sidebar.', | ||
}, | ||
}); | ||
|
||
export default messages; |
This file contains 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 |
---|---|---|
@@ -1 +1,2 @@ | ||
@import "./status-widget/StatusWidget"; | ||
@import "./history-widget/HistoryWidget"; |
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.
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.
I think we can throw an error instead of
null
. (ex.)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.
Thank you @ChrisChV!
I added a better error handling here (a9a7b21), adding a loading and error state, as this could have an error from api.