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

feat: dashboard slideshow #3081

Open
wants to merge 101 commits into
base: feat/release-DHIS2-18441-and-DHIS2-13038
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
fa9f0d5
chore: update ItemGrid to current standard and fix missing dep in use…
jenniferarnesen Sep 3, 2024
3d3990e
feat: fullscreen for visualization items
jenniferarnesen Sep 3, 2024
6f604b0
feat: add the navigation buttons and keep track of current index in I…
jenniferarnesen Sep 4, 2024
f25c305
fix: remove stray char
jenniferarnesen Sep 4, 2024
6033db1
chore: full of debug comments
jenniferarnesen Sep 5, 2024
99c8983
feat: use single fs element and load different vis into it
jenniferarnesen Sep 6, 2024
aa5bf33
feat: sizing of the iframe as well as positioning of the nav buttons …
jenniferarnesen Sep 6, 2024
7116a28
chore: remove props no longer used
jenniferarnesen Sep 6, 2024
2c79ce3
chore: override display for LL
jenniferarnesen Sep 9, 2024
41ffd12
chore: fs for LL items
jenniferarnesen Sep 9, 2024
609b249
fix: only show Slideshow if fullscreen allowed in sys settings
jenniferarnesen Sep 9, 2024
8c08c6a
fix: filter out SPACER and MESSAGES items from sorted items list
jenniferarnesen Sep 9, 2024
3df05ba
feat: styling and show/hide controls
jenniferarnesen Sep 9, 2024
5765c9b
Merge branch 'master' into feat/slide-show-display-none
jenniferarnesen Sep 27, 2024
2a6bd82
Merge branch 'master' into feat/slide-show-display-none
jenniferarnesen Oct 8, 2024
0934590
chore: fix jest tests
jenniferarnesen Oct 8, 2024
ed77aac
feat: add exit button and always show controls on hover
jenniferarnesen Oct 8, 2024
6c4e86b
chore: consistent class names
jenniferarnesen Oct 8, 2024
540377c
fix: always show fs controls at bottm
jenniferarnesen Oct 10, 2024
63a33a1
fix: persistent nav bar
jenniferarnesen Oct 31, 2024
cada906
Merge branch 'master' into feat/slide-show-display-none
jenniferarnesen Nov 1, 2024
a25b0d6
fix: slideshow control bar styles
cooper-joe Nov 5, 2024
4d8f8df
fix: text item style
jenniferarnesen Nov 5, 2024
021a6de
chore: move fullscreen handling to a hook
jenniferarnesen Nov 6, 2024
34a643a
chore: renaming vars
jenniferarnesen Nov 8, 2024
6d70db5
fix: force load when in fullscreen
jenniferarnesen Nov 8, 2024
ff6b76a
fix: add controls buffer to App items
jenniferarnesen Nov 8, 2024
78d9280
chore: slideshow button tooltip and refactor fs enabled on types
jenniferarnesen Nov 10, 2024
642f5ec
fix: remove padding around items when in fullscreen
jenniferarnesen Nov 12, 2024
d447245
chore: update comment
jenniferarnesen Nov 12, 2024
985f5e9
chore: no fullscreen items tooltip message
jenniferarnesen Nov 12, 2024
8be0a82
fix: text item style fixes
jenniferarnesen Nov 12, 2024
05c7893
chore: rename redux to slideshow
jenniferarnesen Nov 21, 2024
b5793b6
fix: margins and styling on app item in fullscreen
jenniferarnesen Nov 21, 2024
fd265f9
fix: styling fixes for List items
jenniferarnesen Nov 21, 2024
d5a35f8
chore: isFS not needed in plugin
jenniferarnesen Nov 22, 2024
1b4f9b2
fix: clean and organize CSS
jenniferarnesen Nov 25, 2024
84c65a9
chore: marginblock around text item
jenniferarnesen Nov 25, 2024
f5ebb4a
chore: remove unneeded css classes
jenniferarnesen Nov 26, 2024
efa4e82
chore: remove fullscreen css from previous solution that isnt needed now
jenniferarnesen Nov 26, 2024
dedcd15
chore: call it isFullscreen
jenniferarnesen Nov 26, 2024
65b8f18
fix: print issue with tables
jenniferarnesen Nov 27, 2024
86fa2ff
chore: subtract 40px from item height instead of adding extra div to …
jenniferarnesen Nov 27, 2024
e68cc4d
feat: force load current next and previous items when in fullscreen
jenniferarnesen Nov 27, 2024
29d35e9
chore: remove unused css
jenniferarnesen Nov 27, 2024
6a63d6d
feat: use opacity to go to next or prev slide for smooth transition
jenniferarnesen Nov 27, 2024
5668b66
feat: make smooth transition when entering fullscreen and paging
jenniferarnesen Nov 28, 2024
3b12aa8
Merge branch 'master' into feat/slide-show-display-none
jenniferarnesen Nov 28, 2024
3c60122
chore: remove temp code from ListItem
jenniferarnesen Nov 28, 2024
b952fe8
Merge branch 'feat/slide-show-display-none' of github.com:dhis2/dashb…
jenniferarnesen Nov 28, 2024
1ac2ee3
chore: rename from fullscreen to slideshow
jenniferarnesen Nov 28, 2024
6916453
chore: rename fullscreen to slideshow
jenniferarnesen Nov 29, 2024
7145728
chore: separate SlideshowControlbar component
jenniferarnesen Nov 29, 2024
acfa1c4
chore: cypress test
jenniferarnesen Nov 29, 2024
5f48ea5
chore: snapshot test update
jenniferarnesen Nov 29, 2024
e2273c7
chore: code smell fixes
jenniferarnesen Nov 29, 2024
5b46fca
chore: restore
jenniferarnesen Nov 29, 2024
ce23d41
chore: rename prop to fullscreenView
jenniferarnesen Dec 2, 2024
e2247da
test: add more cypress testing
jenniferarnesen Dec 2, 2024
b38adb9
fix: override width and height and z-index for displayed item
jenniferarnesen Dec 3, 2024
00f1ab6
chore: add checks to cypress test
jenniferarnesen Dec 3, 2024
629f7bf
chore: make scrollbox the exception not the rule
jenniferarnesen Dec 3, 2024
b3b1f97
chore: add check for no item context menu button in fullscreen
jenniferarnesen Dec 3, 2024
f3b72f3
chore: update snapshots
jenniferarnesen Dec 4, 2024
165ed4f
chore: useMemo instead of useRef in useSlideshow
jenniferarnesen Dec 4, 2024
f3985b5
fix: set height of slideshow controlbar to 40px
jenniferarnesen Dec 4, 2024
b1855a6
fix: set height on slideshow grid to prevent growing controlbar on hi…
jenniferarnesen Dec 4, 2024
caf0e6b
fix: disable slideshow button when offline and not cached
jenniferarnesen Dec 5, 2024
b6573bf
fix: show nav buttons as disabled when only one item
jenniferarnesen Dec 6, 2024
8043cfc
fix: add background color to fs element to avoid brief flashing of black
jenniferarnesen Dec 6, 2024
286fd89
fix: do not tab to invisible elements
jenniferarnesen Dec 6, 2024
24888cd
fix: more tweaking to get transition to slideshow bg colors right
jenniferarnesen Dec 6, 2024
f1fc4c8
Merge branch 'master' into feat/slide-show-display-none
jenniferarnesen Dec 6, 2024
9f4906f
fix: tabIndex is a string not a number
jenniferarnesen Dec 10, 2024
347e520
fix: messages item scrollbar was missing
jenniferarnesen Dec 11, 2024
df0fda2
fix: display message on unloaded items when offline and not cached
jenniferarnesen Dec 11, 2024
b01cfa4
feat: filter badges
jenniferarnesen Dec 12, 2024
e38ecf5
fix: with flex external container needed to prevent button from takin…
jenniferarnesen Dec 12, 2024
b2d7937
feat: add tooltip to filter badge - not working yet
jenniferarnesen Dec 12, 2024
a01587e
feat: show all filters in a popover when clicking a button with total…
HendrikThePendric Dec 12, 2024
2dce45e
fix: use string pluralization and remove unneeded style
jenniferarnesen Dec 13, 2024
c5eb94a
fix: show different message when single filter
jenniferarnesen Dec 16, 2024
0c5f5e8
fix: use correct prop in i18n
jenniferarnesen Dec 16, 2024
ecc63aa
chore: temporary to get a build
jenniferarnesen Dec 17, 2024
6e7071a
test: add cypress test that navigates backwards to start
jenniferarnesen Dec 17, 2024
11e1f8c
fix: remove tabbing when element not visible during slideshow
jenniferarnesen Dec 18, 2024
26ab9fa
fix: nav buttons and page counter should maintain ltr
jenniferarnesen Dec 18, 2024
524c937
fix: slideshow filter content and style
cooper-joe Dec 18, 2024
9870891
Merge branch 'feat/slide-show-display-none' of github.com:dhis2/dashb…
jenniferarnesen Dec 19, 2024
e7ceb68
fix: rtl navigation according to Gassim
jenniferarnesen Dec 19, 2024
d42f7dd
fix: the arrow buttons also must respect ltr or rtl
jenniferarnesen Dec 19, 2024
2881ee9
Merge branch 'feat/release-DHIS2-18441-and-DHIS2-13038' into feat/sli…
HendrikThePendric Dec 19, 2024
9004dfd
chore: fix pot file after merge
HendrikThePendric Dec 19, 2024
5c204e2
chore: align slideshow button with new design
HendrikThePendric Dec 19, 2024
f885519
chore: add isCahced prop to ViewDashboardContent for slideshow feature
HendrikThePendric Dec 19, 2024
657f621
chore: fix stylelint errors
HendrikThePendric Dec 19, 2024
c84dad9
fix: restore package json version
jenniferarnesen Dec 19, 2024
2e1e4e2
fix: return false for itemTypes not present in the itemType map
HendrikThePendric Dec 19, 2024
a9024ee
fix: make list items scrollable
jenniferarnesen Dec 19, 2024
61a47f7
fix: ensure itemfooter line has the same color as the lines in the in…
HendrikThePendric Dec 19, 2024
0acdbbf
fix: omit menu button in fs as it messes up height calcs
jenniferarnesen Dec 19, 2024
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
31 changes: 31 additions & 0 deletions cypress/e2e/slideshow.feature
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
jenniferarnesen marked this conversation as resolved.
Show resolved Hide resolved

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
1 change: 1 addition & 0 deletions cypress/e2e/slideshow/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
'../common/index.js'
103 changes: 103 additions & 0 deletions cypress/e2e/slideshow/slideshow.js
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')
})
46 changes: 36 additions & 10 deletions i18n/en.pot
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"POT-Creation-Date: 2024-12-18T12:26:05.212Z\n"
"PO-Revision-Date: 2024-12-18T12:26:05.212Z\n"
"POT-Creation-Date: 2024-12-19T11:30:27.893Z\n"
"PO-Revision-Date: 2024-12-19T11:30:27.893Z\n"

msgid "Untitled dashboard"
msgstr "Untitled dashboard"
Expand Down Expand Up @@ -50,12 +50,21 @@ msgstr "One item per page"
msgid "Close dashboard"
msgstr "Close dashboard"

msgid "No dashboard items to show in slideshow"
msgstr "No dashboard items to show in slideshow"

msgid "Not available offline"
msgstr "Not available offline"

msgid "Edit"
msgstr "Edit"

msgid "Share"
msgstr "Share"

msgid "Slideshow"
msgstr "Slideshow"

msgid "Clear dashboard filters?"
msgstr "Clear dashboard filters?"

Expand Down Expand Up @@ -111,6 +120,9 @@ msgstr "Search for a dashboard"
msgid "No dashboards found"
msgstr "No dashboards found"

msgid "{{appKey}} app not found"
msgstr "{{appKey}} app not found"

msgid "Remove this item"
msgstr "Remove this item"

Expand Down Expand Up @@ -237,8 +249,11 @@ msgstr "There was an error loading data for this item"
msgid "Open this item in {{appName}}"
msgstr "Open this item in {{appName}}"

msgid "Not available offline"
msgstr "Not available offline"
msgid "Resources"
msgstr "Resources"

msgid "Reports"
msgstr "Reports"

msgid "Visualizations"
msgstr "Visualizations"
Expand All @@ -264,12 +279,6 @@ msgstr "Line lists"
msgid "Apps"
msgstr "Apps"

msgid "Reports"
msgstr "Reports"

msgid "Resources"
msgstr "Resources"

msgid "Users"
msgstr "Users"

Expand Down Expand Up @@ -566,6 +575,23 @@ msgstr ""
msgid "Yes, remove filters"
msgstr "Yes, remove filters"

msgid "Exit slideshow"
msgstr "Exit slideshow"

msgid "Previous item"
msgstr "Previous item"

msgid "Next item"
msgstr "Next item"

msgid "{{name}}: {{filter}}"
msgstr "{{name}}: {{filter}}"

msgid "{{count}} filters active"
msgid_plural "{{count}} filters active"
msgstr[0] "{{count}} filter active"
msgstr[1] "{{count}} filters active"

msgid "Loading dashboard – {{name}}"
msgstr "Loading dashboard – {{name}}"

Expand Down
6 changes: 6 additions & 0 deletions src/actions/slideshow.js
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,
})
43 changes: 40 additions & 3 deletions src/components/DashboardsBar/InformationBlock/ActionsBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,19 @@ import { connect } from 'react-redux'
import { useHistory, Redirect } from 'react-router-dom'
import { acClearItemFilters } from '../../../actions/itemFilters.js'
import { acSetShowDescription } from '../../../actions/showDescription.js'
import { acSetSlideshow } from '../../../actions/slideshow.js'
import { apiPostShowDescription } from '../../../api/description.js'
import ConfirmActionDialog from '../../../components/ConfirmActionDialog.js'
import DropdownButton from '../../../components/DropdownButton/DropdownButton.js'
import MenuItem from '../../../components/MenuItemWithTooltip.js'
import { useSystemSettings } from '../../../components/SystemSettingsProvider.js'
import { itemTypeSupportsFullscreen } from '../../../modules/itemTypes.js'
import { useCacheableSection } from '../../../modules/useCacheableSection.js'
import { orObject } from '../../../modules/util.js'
import { ROUTE_START_PATH } from '../../../pages/start/index.js'
import { sGetNamedItemFilters } from '../../../reducers/itemFilters.js'
import { sGetSelected } from '../../../reducers/selected.js'
import { sGetShowDescription } from '../../../reducers/showDescription.js'
import ConfirmActionDialog from '../../ConfirmActionDialog.js'
import DropdownButton from '../../DropdownButton/DropdownButton.js'
import MenuItem from '../../MenuItemWithTooltip.js'
import FilterSelector from './FilterSelector.js'
import classes from './styles/ActionsBar.module.css'

Expand All @@ -32,13 +35,15 @@ const ActionsBar = ({
access,
showDescription,
starred,
setSlideshow,
toggleDashboardStarred,
showAlert,
updateShowDescription,
removeAllFilters,
restrictFilters,
allowedFilters,
filtersLength,
dashboardItems,
}) => {
const history = useHistory()
const [moreOptionsIsOpen, setMoreOptionsIsOpen] = useState(false)
Expand All @@ -49,6 +54,7 @@ const ActionsBar = ({
const { isDisconnected: offline } = useDhis2ConnectionStatus()
const { lastUpdated, isCached, startRecording, remove } =
useCacheableSection(id)
const { allowVisFullscreen } = useSystemSettings().systemSettings

const onRecordError = useCallback(() => {
showAlert({
Expand Down Expand Up @@ -94,6 +100,10 @@ const ActionsBar = ({

const userAccess = orObject(access)

const hasSlideshowItems = dashboardItems?.some(
(i) => itemTypeSupportsFullscreen(i.type) || false
)

const getMoreMenu = () => (
<FlyoutMenu>
{lastUpdated ? (
Expand Down Expand Up @@ -176,6 +186,12 @@ const ActionsBar = ({
return <Redirect to={redirectUrl} />
}

const slideshowTooltipContent = !hasSlideshowItems
? i18n.t('No dashboard items to show in slideshow')
: offline && !isCached
? i18n.t('Not available offline')
: null

return (
<>
<div className={classes.actions}>
Expand Down Expand Up @@ -204,6 +220,24 @@ const ActionsBar = ({
</Button>
</OfflineTooltip>
) : null}
{allowVisFullscreen ? (
<OfflineTooltip
content={slideshowTooltipContent}
disabled={!!slideshowTooltipContent}
disabledWhenOffline={false}
>
<Button
secondary
small
disabled={!!slideshowTooltipContent}
className={classes.slideshowButton}
onClick={() => setSlideshow(0)}
dataTest="enter-slideshow-button"
>
{i18n.t('Slideshow')}
</Button>
</OfflineTooltip>
) : null}
<FilterSelector
allowedFilters={allowedFilters}
restrictFilters={restrictFilters}
Expand Down Expand Up @@ -248,10 +282,12 @@ const ActionsBar = ({
ActionsBar.propTypes = {
access: PropTypes.object,
allowedFilters: PropTypes.array,
dashboardItems: PropTypes.array,
filtersLength: PropTypes.number,
id: PropTypes.string,
removeAllFilters: PropTypes.func,
restrictFilters: PropTypes.bool,
setSlideshow: PropTypes.func,
showAlert: PropTypes.func,
showDescription: PropTypes.bool,
starred: PropTypes.bool,
Expand All @@ -270,6 +306,7 @@ const mapStateToProps = (state) => {
}

export default connect(mapStateToProps, {
setSlideshow: acSetSlideshow,
removeAllFilters: acClearItemFilters,
updateShowDescription: acSetShowDescription,
})(ActionsBar)
Loading
Loading