-
Notifications
You must be signed in to change notification settings - Fork 36
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: implement dashboard slideshow (#3081)
Implements https://dhis2.atlassian.net/browse/DHIS2-13038 Details: 1. When entering the slideshow/fullscreen, the parent div of the ItemGrid is put into browser fullscreen. That same div remains in fullscreen the entire time, while the dashboard items are displayed/hidden in turn using css opacity. Css opacity is used instead of display or visibility so that the items can first be resized to fullscreen while "invisible", and then be made visible. This means that the user doesn't see a flash of the visualization in its regular item size before it gets resized. 2. Progressive loading. When the dashboard goes into fullscreen/slideshow, then progressive loading will load the next and previous items in the fullscreen display order instead of being based on proximity to the viewport. 3. RTL support has been implemented for the slideshow navigation buttons. It was decided after discussions with in-house RTL experts that the order of the dashboard items would remain LTR.
- Loading branch information
1 parent
45e6f4c
commit cb2b931
Showing
80 changed files
with
1,239 additions
and
376 deletions.
There are no files selected for viewing
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,31 @@ | ||
Feature: Slideshow | ||
|
||
Scenario: I view a dashboard in slideshow | ||
Given I open the "Delivery" dashboard | ||
When I click the slideshow button | ||
Then item 1 is shown in fullscreen | ||
When I click the next slide button | ||
Then item 2 is shown in fullscreen | ||
When I click the previous slide button | ||
Then item 1 is shown in fullscreen | ||
When I click the exit slideshow button | ||
Then the normal view is shown | ||
|
||
|
||
Scenario: I view fullscreen on the second item of the dashboard | ||
Given I open the "Delivery" dashboard | ||
When I click the fullscreen button on the second item | ||
Then item 2 is shown in fullscreen | ||
When I click the exit slideshow button | ||
Then the normal view is shown | ||
|
||
Scenario: I view fullscreen on the third item of the dashboard and navigate backwards | ||
Given I open the "Delivery" dashboard | ||
When I click the fullscreen button on the third item | ||
Then item 3 is shown in fullscreen | ||
When I click the previous slide button | ||
Then item 2 is shown in fullscreen | ||
When I click the previous slide button | ||
Then item 1 is shown in fullscreen | ||
When I click the exit slideshow button | ||
Then the normal view is shown |
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 @@ | ||
'../common/index.js' |
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,103 @@ | ||
import { When, Then } from '@badeball/cypress-cucumber-preprocessor' | ||
import { | ||
getDashboardItem, | ||
clickMenuButton, | ||
} from '../../elements/dashboardItem.js' | ||
|
||
const sortedDashboardItemIds = ['GaVhJpqABYX', 'qXsjttMYuoZ', 'Rwb3oXJ3bZ9'] | ||
|
||
const assertItemIsVisible = (slideshowItemIndex) => { | ||
getDashboardItem(sortedDashboardItemIds[slideshowItemIndex]).should( | ||
'have.css', | ||
'opacity', | ||
'1' | ||
) | ||
} | ||
|
||
const assertItemIsNotVisible = (slideshowItemIndex) => { | ||
getDashboardItem(sortedDashboardItemIds[slideshowItemIndex]).should( | ||
'have.css', | ||
'opacity', | ||
'0' | ||
) | ||
} | ||
|
||
const getSlideshowExitButton = () => | ||
cy.getByDataTest('slideshow-exit-button', { timeout: 15000 }) | ||
|
||
When('I click the slideshow button', () => { | ||
cy.get('button').contains('Slideshow').realClick() | ||
}) | ||
|
||
Then('item 1 is shown in fullscreen', () => { | ||
getSlideshowExitButton().should('be.visible') | ||
|
||
// check that only the first item is shown | ||
assertItemIsVisible(0) | ||
assertItemIsNotVisible(1) | ||
assertItemIsNotVisible(2) | ||
|
||
cy.getByDataTest('slideshow-page-counter').should('have.text', '1 / 11') | ||
|
||
// visible item does not have context menu button | ||
getDashboardItem(sortedDashboardItemIds[0]) | ||
.findByDataTest('dashboarditem-menu-button') | ||
.should('not.exist') | ||
}) | ||
|
||
When('I click the exit slideshow button', () => { | ||
getSlideshowExitButton().realClick() | ||
}) | ||
|
||
Then('the normal view is shown', () => { | ||
getSlideshowExitButton().should('not.exist') | ||
|
||
// check that multiple items are shown | ||
assertItemIsVisible(0) | ||
assertItemIsVisible(1) | ||
assertItemIsVisible(2) | ||
|
||
// items have context menu button | ||
getDashboardItem(sortedDashboardItemIds[0]) | ||
.findByDataTest('dashboarditem-menu-button') | ||
.should('be.visible') | ||
|
||
getDashboardItem(sortedDashboardItemIds[1]) | ||
.findByDataTest('dashboarditem-menu-button') | ||
.should('be.visible') | ||
}) | ||
|
||
// When I click the next slide button | ||
When('I click the next slide button', () => { | ||
cy.getByDataTest('slideshow-next-button').realClick() | ||
}) | ||
|
||
Then('item 2 is shown in fullscreen', () => { | ||
assertItemIsNotVisible(0) | ||
assertItemIsVisible(1) | ||
assertItemIsNotVisible(2) | ||
|
||
cy.getByDataTest('slideshow-page-counter').should('have.text', '2 / 11') | ||
}) | ||
|
||
When('I click the previous slide button', () => { | ||
cy.getByDataTest('slideshow-prev-button').realClick() | ||
}) | ||
|
||
When('I click the fullscreen button on the second item', () => { | ||
clickMenuButton(sortedDashboardItemIds[1]) | ||
cy.contains('View fullscreen').realClick() | ||
}) | ||
|
||
When('I click the fullscreen button on the third item', () => { | ||
clickMenuButton(sortedDashboardItemIds[2]) | ||
cy.contains('View fullscreen').realClick() | ||
}) | ||
|
||
Then('item 3 is shown in fullscreen', () => { | ||
assertItemIsNotVisible(0) | ||
assertItemIsNotVisible(1) | ||
assertItemIsVisible(2) | ||
|
||
cy.getByDataTest('slideshow-page-counter').should('have.text', '3 / 11') | ||
}) |
Large diffs are not rendered by default.
Oops, something went wrong.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified
BIN
+319 KB
(170%)
docs/resources/images/dashboard-item-menu-interpretations.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
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 |
---|---|---|
@@ -0,0 +1,6 @@ | ||
import { SET_SLIDESHOW } from '../reducers/slideshow.js' | ||
|
||
export const acSetSlideshow = (isSlideshow) => ({ | ||
type: SET_SLIDESHOW, | ||
value: isSlideshow, | ||
}) |
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
Oops, something went wrong.