@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
104 lines (91 loc) • 3.67 kB
text/typescript
import ReportStoreService from './reportStoreService'
import ReportDataStore from '../data/reportDataStore'
import { ReportType } from '../types/UserReports'
import { ReportStoreConfig } from '../types/ReportStore'
import logger from '../utils/logger'
export default class BookmarkService extends ReportStoreService {
bookmarksInitialised: boolean
constructor(reportDataStore: ReportDataStore) {
super(reportDataStore)
logger.info('Service created: BookmarkService')
}
async getAllBookmarks(userId: string) {
const userConfig = await this.getState(userId)
return userConfig.bookmarks
}
async addBookmark(userId: string, reportId: string, id: string, type: ReportType, automatic?: boolean) {
const userConfig = await this.getState(userId)
if (!this.isBookmarkedCheck(userConfig, id, reportId)) {
userConfig.bookmarks.unshift({ reportId, id, type, automatic })
}
await this.saveState(userId, userConfig)
}
async removeBookmark(userId: string, id: string, reportId: string) {
const userConfig = await this.getState(userId)
const index = userConfig.bookmarks.findIndex((bookmark) => {
const bmVarId = bookmark.variantId || bookmark.id
return bmVarId === id && bookmark.reportId === reportId
})
if (index >= 0) {
userConfig.bookmarks.splice(index, 1)
}
await this.saveState(userId, userConfig)
}
isBookmarked = async (id: string, reportId: string, userId: string) => {
const userConfig = await this.getState(userId)
const isBookmarked = this.isBookmarkedCheck(userConfig, id, reportId)
let bookmark
if (isBookmarked) {
bookmark = this.getBookmark(userConfig, id, reportId)
}
return bookmark?.automatic ? undefined : isBookmarked
}
isBookmarkedCheck = (userConfig: ReportStoreConfig, id: string, reportId: string) => {
return userConfig.bookmarks.some((bookmark) => {
const bmVarId = bookmark.variantId || bookmark.id
return bmVarId === id && bookmark.reportId === reportId
})
}
getBookmark = (userConfig: ReportStoreConfig, id: string, reportId: string) => {
return userConfig.bookmarks.find((bookmark) => {
const bmVarId = bookmark.variantId || bookmark.id
return bmVarId === id && bookmark.reportId === reportId
})
}
isAutomatic = async (userId: string, id: string, reportId: string) => {
const userConfig = await this.getState(userId)
const bookmark = this.getBookmark(userConfig, id, reportId)
return bookmark?.automatic
}
async createBookMarkToggleHtml({
userId,
reportId,
id,
csrfToken,
ctxId,
reportType,
}: {
userId: string
reportId: string
id: string
csrfToken: string
ctxId: string
reportType: ReportType
}) {
const userConfig = await this.getState(userId)
const checked = this.isBookmarkedCheck(userConfig, id, reportId) ? 'checked' : null
let tooltip = 'Add bookmark'
let automatic = false
if (checked) {
tooltip = 'Remove bookmark'
const bookmark = this.getBookmark(userConfig, id, reportId)
automatic = bookmark.automatic
}
return automatic
? ''
: `<div class='dpr-bookmark dpr-bookmark-table' data-dpr-module="bookmark-toggle">
<input class="bookmark-input" aria-label="bookmark toggle" type='checkbox' id='${reportId}-${id}-${ctxId}' data-report-id='${reportId}' data-id='${id}' data-report-type='${reportType}' data-csrf-token='${csrfToken}' ${checked} />
<label id="${id}-${reportId}-${ctxId}-bookmark-label" for='${reportId}-${id}-${ctxId}'><span class="dpr-bookmark-label govuk-body-s">${tooltip}</span></label>
</div>`
}
}