diff --git a/.github/workflows/javascript.yaml b/.github/workflows/javascript.yaml index 5b20c8da..801ddbe9 100644 --- a/.github/workflows/javascript.yaml +++ b/.github/workflows/javascript.yaml @@ -33,4 +33,4 @@ jobs: docker network create frontend - run: | - docker compose run --rm prettier 'assets/**/*.js' --check + docker compose run --rm prettier 'assets/**/*.{js,jsx}' --check diff --git a/assets/admin/app.jsx b/assets/admin/app.jsx index bca4ee6a..c34c6d70 100644 --- a/assets/admin/app.jsx +++ b/assets/admin/app.jsx @@ -92,7 +92,7 @@ function App() { useEffect(() => { AdminConfigLoader.loadConfig().then((loadedConfig) => { setConfig(loadedConfig); - }) + }); }, []); const handleReauthenticate = () => { @@ -122,7 +122,7 @@ function App() { // If there is a selected tenant, fetch from local storage and use if (localStorage.getItem(localStorageKeys.SELECTED_TENANT)) { setSelectedTenant( - JSON.parse(localStorage.getItem(localStorageKeys.SELECTED_TENANT)) + JSON.parse(localStorage.getItem(localStorageKeys.SELECTED_TENANT)), ); } diff --git a/assets/admin/components/activation-code/activation-code-columns.jsx b/assets/admin/components/activation-code/activation-code-columns.jsx index 9350f5db..bc7761a1 100644 --- a/assets/admin/components/activation-code/activation-code-columns.jsx +++ b/assets/admin/components/activation-code/activation-code-columns.jsx @@ -50,7 +50,7 @@ function getActivationCodeColumns() { const ActivationCodeColumns = ColumnHoc(getActivationCodeColumns, true, true); const SelectActivationCodeColumns = SelectColumnHoc( getActivationCodeColumns, - true + true, ); export { SelectActivationCodeColumns, ActivationCodeColumns }; diff --git a/assets/admin/components/activation-code/activation-code-list.jsx b/assets/admin/components/activation-code/activation-code-list.jsx index cbf72dd9..bbccbe15 100644 --- a/assets/admin/components/activation-code/activation-code-list.jsx +++ b/assets/admin/components/activation-code/activation-code-list.jsx @@ -40,7 +40,7 @@ function ActivationCodeList() { const [isDeleting, setIsDeleting] = useState(false); const [listData, setListData] = useState(); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-activation-code") + t("loading-messages.loading-activation-code"), ); // Remove from tenant call @@ -104,7 +104,7 @@ function ActivationCodeList() { setIsDeleting(false); displayError( t("error-messages.activation-code-delete-error"), - isDeleteError + isDeleteError, ); } }, [isDeleteError]); @@ -120,7 +120,7 @@ function ActivationCodeList() { if (activationCodeGetError) { displayError( t("error-messages.activation-code-load-error"), - activationCodeGetError + activationCodeGetError, ); } }, [activationCodeGetError]); @@ -139,7 +139,7 @@ function ActivationCodeList() { userActivationCodeActivationCode: JSON.stringify({ activationCode: item[0].code, }), - }) + }), ) .then((response) => { if (response.data) { diff --git a/assets/admin/components/feed-sources/feed-source-form.jsx b/assets/admin/components/feed-sources/feed-source-form.jsx index 31b7d2d8..cca9b7fa 100644 --- a/assets/admin/components/feed-sources/feed-source-form.jsx +++ b/assets/admin/components/feed-sources/feed-source-form.jsx @@ -206,7 +206,7 @@ FeedSourceForm.propTypes = { title: PropTypes.string, key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, template: PropTypes.element, - }) + }), ).isRequired, mode: PropTypes.string, }; diff --git a/assets/admin/components/feed-sources/feed-source-manager.jsx b/assets/admin/components/feed-sources/feed-source-manager.jsx index 0499cd17..70a885c4 100644 --- a/assets/admin/components/feed-sources/feed-source-manager.jsx +++ b/assets/admin/components/feed-sources/feed-source-manager.jsx @@ -39,11 +39,11 @@ function FeedSourceManager({ // State const [headerText] = useState( - saveMethod === "PUT" ? t("edit-feed-source") : t("create-new-feed-source") + saveMethod === "PUT" ? t("edit-feed-source") : t("create-new-feed-source"), ); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-feed-source") + t("loading-messages.loading-feed-source"), ); const [submitting, setSubmitting] = useState(false); @@ -172,7 +172,7 @@ function FeedSourceManager({ if (loadingError) { displayError( t("error-messages.load-feed-source-error", { id }), - loadingError + loadingError, ); } }, [loadingError]); diff --git a/assets/admin/components/feed-sources/feed-sources-columns.jsx b/assets/admin/components/feed-sources/feed-sources-columns.jsx index a4710994..cc39082d 100644 --- a/assets/admin/components/feed-sources/feed-sources-columns.jsx +++ b/assets/admin/components/feed-sources/feed-sources-columns.jsx @@ -33,7 +33,7 @@ function getFeedSourcesColumns({ apiCall, infoModalRedirect, infoModalTitle }) { tenants?.length === 0 || !tenants.find( (tenant) => - tenant.tenantKey === context.selectedTenant.get.tenantKey + tenant.tenantKey === context.selectedTenant.get.tenantKey, ) ); }, diff --git a/assets/admin/components/feed-sources/feed-sources-list.jsx b/assets/admin/components/feed-sources/feed-sources-list.jsx index 514c4d59..0c463513 100644 --- a/assets/admin/components/feed-sources/feed-sources-list.jsx +++ b/assets/admin/components/feed-sources/feed-sources-list.jsx @@ -31,7 +31,7 @@ function FeedSourcesList() { const [listData, setListData] = useState(); const [isDeleting, setIsDeleting] = useState(false); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-feed-sources") + t("loading-messages.loading-feed-sources"), ); // Delete call @@ -123,7 +123,7 @@ function FeedSourcesList() { if (feedSourcesGetError) { displayError( t("error-messages.feed-sources-load-error"), - feedSourcesGetError + feedSourcesGetError, ); } }, [feedSourcesGetError]); diff --git a/assets/admin/components/feed-sources/templates/calendar-api-feed-type.jsx b/assets/admin/components/feed-sources/templates/calendar-api-feed-type.jsx index dd595bec..ac11c728 100644 --- a/assets/admin/components/feed-sources/templates/calendar-api-feed-type.jsx +++ b/assets/admin/components/feed-sources/templates/calendar-api-feed-type.jsx @@ -17,8 +17,8 @@ const CalendarApiFeedType = ({ useEffect(() => { if (feedSourceId && feedSourceId !== "") { - const endpoint = "/" + feedSourceId + "/config/locations"; - setOptionsEndpoint(endpoint); + const endpoint = "/" + feedSourceId + "/config/locations"; + setOptionsEndpoint(endpoint); } }, [feedSourceId]); diff --git a/assets/admin/components/feed-sources/templates/colibo-feed-type.jsx b/assets/admin/components/feed-sources/templates/colibo-feed-type.jsx index 7ccd2891..c1b72e46 100644 --- a/assets/admin/components/feed-sources/templates/colibo-feed-type.jsx +++ b/assets/admin/components/feed-sources/templates/colibo-feed-type.jsx @@ -19,7 +19,7 @@ const ColiboFeedType = ({ useEffect(() => { if (feedSourceId && feedSourceId !== "") { - const endpoint = '/' + feedSourceId + "/config/recipients"; + const endpoint = "/" + feedSourceId + "/config/recipients"; setOptionsEndpoint(endpoint); } }, [feedSourceId]); diff --git a/assets/admin/components/groups/group-edit.jsx b/assets/admin/components/groups/group-edit.jsx index 7009f08f..066003b6 100644 --- a/assets/admin/components/groups/group-edit.jsx +++ b/assets/admin/components/groups/group-edit.jsx @@ -23,7 +23,7 @@ function GroupEdit() { const [formStateObject, setFormStateObject] = useState(); const [savingGroup, setSavingGroup] = useState(false); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-group") + t("loading-messages.loading-group"), ); const { id } = useParams(); const [PutV2ScreenGroup, { error: saveError, isSuccess: isSaveSuccess }] = @@ -68,7 +68,7 @@ function GroupEdit() { ? loadError.error : loadError.data["hydra:description"], id, - }) + }), ); } }, [loadError]); diff --git a/assets/admin/components/groups/groups-list.jsx b/assets/admin/components/groups/groups-list.jsx index 1031a790..a90537a7 100644 --- a/assets/admin/components/groups/groups-list.jsx +++ b/assets/admin/components/groups/groups-list.jsx @@ -37,7 +37,7 @@ function GroupsList() { const [isDeleting, setIsDeleting] = useState(false); const [listData, setListData] = useState(); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-groups") + t("loading-messages.loading-groups"), ); // Delete call diff --git a/assets/admin/components/media/image-list.jsx b/assets/admin/components/media/image-list.jsx index 6850bd1d..1dc476ca 100644 --- a/assets/admin/components/media/image-list.jsx +++ b/assets/admin/components/media/image-list.jsx @@ -85,7 +85,7 @@ ImageList.propTypes = { "@id": PropTypes.string, description: PropTypes.string, assets: PropTypes.shape({ uri: PropTypes.string }), - }) + }), ), }; diff --git a/assets/admin/components/media/media-create.jsx b/assets/admin/components/media/media-create.jsx index 15c48b38..462e9141 100644 --- a/assets/admin/components/media/media-create.jsx +++ b/assets/admin/components/media/media-create.jsx @@ -72,7 +72,7 @@ function MediaCreate() { setLoadingMessage( t("loading-messages.saving-media", { title: element.title || t("unamed"), - }) + }), ); const formData = new FormData(); formData.append("file", element.file); diff --git a/assets/admin/components/media/media-form.jsx b/assets/admin/components/media/media-form.jsx index 1f896cc0..64c4bfbd 100644 --- a/assets/admin/components/media/media-form.jsx +++ b/assets/admin/components/media/media-form.jsx @@ -88,7 +88,7 @@ MediaForm.propTypes = { media: PropTypes.arrayOf( PropTypes.shape({ url: PropTypes.string, - }) + }), ).isRequired, handleInput: PropTypes.func.isRequired, handleSubmit: PropTypes.func.isRequired, diff --git a/assets/admin/components/media/media-list.jsx b/assets/admin/components/media/media-list.jsx index 9009158b..23ae751d 100644 --- a/assets/admin/components/media/media-list.jsx +++ b/assets/admin/components/media/media-list.jsx @@ -55,10 +55,10 @@ function MediaList({ fromModal = false, multiple = true }) { const [media, setMedia] = useState([]); const [page, setPage] = useState(parseInt(pageParams || 1, 10)); const [searchText, setSearchText] = useState( - searchParams === null ? "" : searchParams + searchParams === null ? "" : searchParams, ); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-media") + t("loading-messages.loading-media"), ); // Delete method diff --git a/assets/admin/components/navigation/logo.jsx b/assets/admin/components/navigation/logo.jsx index 5f1c0bc4..f670f0ea 100644 --- a/assets/admin/components/navigation/logo.jsx +++ b/assets/admin/components/navigation/logo.jsx @@ -4,7 +4,7 @@ import DisplayLogo from "./logo.svg"; const Logo = () => { return (
- +
); }; diff --git a/assets/admin/components/navigation/nav-items/restricted-nav-route.jsx b/assets/admin/components/navigation/nav-items/restricted-nav-route.jsx index d56c8f37..1532bb97 100644 --- a/assets/admin/components/navigation/nav-items/restricted-nav-route.jsx +++ b/assets/admin/components/navigation/nav-items/restricted-nav-route.jsx @@ -15,7 +15,7 @@ function RestrictedNavRoute({ children, roles }) { // If the user has a role with access to children. const userHasRequiredRole = context.selectedTenant.get?.roles.find((value) => - roles.includes(value) + roles.includes(value), ); if (!userHasRequiredRole) { diff --git a/assets/admin/components/navigation/nav-items/tenant-selector.jsx b/assets/admin/components/navigation/nav-items/tenant-selector.jsx index 7035a0ba..bac865d6 100644 --- a/assets/admin/components/navigation/nav-items/tenant-selector.jsx +++ b/assets/admin/components/navigation/nav-items/tenant-selector.jsx @@ -28,7 +28,7 @@ function TenantSelector() { setSelectedTenant(newTenant); localStorage.setItem( localStorageKeys.SELECTED_TENANT, - JSON.stringify(newTenant) + JSON.stringify(newTenant), ); } diff --git a/assets/admin/components/playlist/playlist-campaign-form.jsx b/assets/admin/components/playlist/playlist-campaign-form.jsx index 3ebf6531..2ceff5a8 100644 --- a/assets/admin/components/playlist/playlist-campaign-form.jsx +++ b/assets/admin/components/playlist/playlist-campaign-form.jsx @@ -65,7 +65,7 @@ function PlaylistCampaignForm({ }, ]; const [previewOrientation, setPreviewOrientation] = useState( - previewOrientationOptions[0].value + previewOrientationOptions[0].value, ); const navigate = useNavigate(); const [publishedFromError, setPublishedFromError] = useState(false); diff --git a/assets/admin/components/playlist/playlist-campaign-list.jsx b/assets/admin/components/playlist/playlist-campaign-list.jsx index 5649750a..479e0ebf 100644 --- a/assets/admin/components/playlist/playlist-campaign-list.jsx +++ b/assets/admin/components/playlist/playlist-campaign-list.jsx @@ -44,7 +44,7 @@ function PlaylistCampaignList({ location }) { const [isDeleting, setIsDeleting] = useState(false); const [listData, setListData] = useState(); const [loadingMessage, setLoadingMessage] = useState( - t(`${location}.loading-messages.loading`) + t(`${location}.loading-messages.loading`), ); // Delete call @@ -136,7 +136,7 @@ function PlaylistCampaignList({ location }) { if (playlistsGetError) { displayError( t(`${location}.error-messages.load-error`), - playlistsGetError + playlistsGetError, ); } }, [playlistsGetError]); diff --git a/assets/admin/components/playlist/playlist-campaign-manager.jsx b/assets/admin/components/playlist/playlist-campaign-manager.jsx index 566de7de..29d7cdc4 100644 --- a/assets/admin/components/playlist/playlist-campaign-manager.jsx +++ b/assets/admin/components/playlist/playlist-campaign-manager.jsx @@ -80,12 +80,12 @@ function PlaylistCampaignManager({ // Set published to format accepted by bootstrap date component if (localFormStateObject.published.from) { localFormStateObject.published.from = dayjs( - localFormStateObject.published.from + localFormStateObject.published.from, ).format("YYYY-MM-DDTHH:mm"); } if (localFormStateObject.published.to) { localFormStateObject.published.to = dayjs( - localFormStateObject.published.to + localFormStateObject.published.to, ).format("YYYY-MM-DDTHH:mm"); } @@ -120,13 +120,13 @@ function PlaylistCampaignManager({ api.endpoints.putV2ScreensByIdCampaigns.initiate({ id: playlistId, body: JSON.stringify(selectedScreens), - }) + }), ) .then((response) => { if (response.error) { displayError( t(`${location}.error-messages.save-screens-error`), - response.error + response.error, ); reject(response.error); } else { @@ -155,13 +155,13 @@ function PlaylistCampaignManager({ api.endpoints.putV2ScreenGroupsByIdCampaigns.initiate({ id: playlistId, body: JSON.stringify(selectedScreenGroups), - }) + }), ) .then((response) => { if (response.error) { displayError( t(`${location}.error-messages.save-group-error`), - response.error + response.error, ); reject(response.error); } else { @@ -189,13 +189,13 @@ function PlaylistCampaignManager({ api.endpoints.putV2PlaylistsByIdSlides.initiate({ id: playlistId, body: JSON.stringify(selectedSlides), - }) + }), ) .then((response) => { if (response.error) { displayError( t(`${location}.error-messages.save-slides-error`), - response.error + response.error, ); reject(response.error); } else { diff --git a/assets/admin/components/playlist/playlist-form.jsx b/assets/admin/components/playlist/playlist-form.jsx index 985bef8f..d61d30e4 100644 --- a/assets/admin/components/playlist/playlist-form.jsx +++ b/assets/admin/components/playlist/playlist-form.jsx @@ -74,7 +74,7 @@ PlaylistForm.propTypes = { duration: PropTypes.number, id: PropTypes.string, rrule: PropTypes.string, - }) + }), ), tenants: PropTypes.arrayOf( PropTypes.shape({ @@ -90,9 +90,9 @@ PlaylistForm.propTypes = { roles: PropTypes.arrayOf(PropTypes.string), tenantKey: PropTypes.string, title: PropTypes.string, - }) + }), ), - }) + }), ), }), handleInput: PropTypes.func.isRequired, diff --git a/assets/admin/components/playlist/playlist-gantt-chart.jsx b/assets/admin/components/playlist/playlist-gantt-chart.jsx index 25f3b2fa..7be7ca4b 100644 --- a/assets/admin/components/playlist/playlist-gantt-chart.jsx +++ b/assets/admin/components/playlist/playlist-gantt-chart.jsx @@ -18,7 +18,7 @@ function PlaylistGanttChart({ slides }) { /** Get show from local storage */ useEffect(() => { const localStorageShow = localStorage.getItem( - localStorageKeys.VIEW_GANT_PLAYLIST + localStorageKeys.VIEW_GANT_PLAYLIST, ); setShowGantt(localStorageShow === "true"); }, []); @@ -32,7 +32,7 @@ function PlaylistGanttChart({ slides }) { const inAYear = new Date( today.getFullYear() + 1, today.getMonth(), - today.getDate() + today.getDate(), ); setDataForGantChart( slides.map((slide) => { @@ -45,7 +45,7 @@ function PlaylistGanttChart({ slides }) { stroke: "black", title: slide.title, }; - }) + }), ); } }, [slides]); @@ -85,7 +85,7 @@ function PlaylistGanttChart({ slides }) { PlaylistGanttChart.propTypes = { slides: PropTypes.arrayOf( - PropTypes.shape({ name: PropTypes.string, id: PropTypes.string }) + PropTypes.shape({ name: PropTypes.string, id: PropTypes.string }), ).isRequired, }; export default PlaylistGanttChart; diff --git a/assets/admin/components/playlist/playlists-columns.jsx b/assets/admin/components/playlist/playlists-columns.jsx index d09babdb..8bb28ae0 100644 --- a/assets/admin/components/playlist/playlists-columns.jsx +++ b/assets/admin/components/playlist/playlists-columns.jsx @@ -37,7 +37,7 @@ function getPlaylistColumns({ tenants?.length === 0 || !tenants.find( (tenant) => - tenant.tenantKey === context.selectedTenant.get.tenantKey + tenant.tenantKey === context.selectedTenant.get.tenantKey, ) ); }, diff --git a/assets/admin/components/preview/preview.jsx b/assets/admin/components/preview/preview.jsx index f896ab00..2efe5933 100644 --- a/assets/admin/components/preview/preview.jsx +++ b/assets/admin/components/preview/preview.jsx @@ -32,11 +32,9 @@ function Preview({ urlSearchParams.set("preview-id", id); urlSearchParams.set( "preview-token", - localStorage.getItem(LocalStorageKeys.API_TOKEN) - ); - const tenantEntry = localStorage.getItem( - LocalStorageKeys.SELECTED_TENANT + localStorage.getItem(LocalStorageKeys.API_TOKEN), ); + const tenantEntry = localStorage.getItem(LocalStorageKeys.SELECTED_TENANT); urlSearchParams.set("preview-tenant", JSON.parse(tenantEntry).tenantKey); setPreviewClientUrl(`/client?${urlSearchParams}`); diff --git a/assets/admin/components/proptypes/column-proptypes.jsx b/assets/admin/components/proptypes/column-proptypes.jsx index 2ec27d01..7a854f4e 100644 --- a/assets/admin/components/proptypes/column-proptypes.jsx +++ b/assets/admin/components/proptypes/column-proptypes.jsx @@ -6,7 +6,7 @@ const ColumnProptypes = PropTypes.arrayOf( label: PropTypes.string, content: PropTypes.func, key: PropTypes.string, - }) + }), ); export default ColumnProptypes; diff --git a/assets/admin/components/restricted-route.jsx b/assets/admin/components/restricted-route.jsx index c6b19ec3..3b110faa 100644 --- a/assets/admin/components/restricted-route.jsx +++ b/assets/admin/components/restricted-route.jsx @@ -16,7 +16,7 @@ function RestrictedRoute({ children, roles }) { // If the user has a role with access to children. const userHasRequiredRole = context.selectedTenant.get?.roles.find((value) => - roles.includes(value) + roles.includes(value), ); if (context.authenticated.get && !userHasRequiredRole) { return ; diff --git a/assets/admin/components/screen/screen-form.jsx b/assets/admin/components/screen/screen-form.jsx index 4f46e7cc..3cf5715b 100644 --- a/assets/admin/components/screen/screen-form.jsx +++ b/assets/admin/components/screen/screen-form.jsx @@ -80,7 +80,7 @@ function ScreenForm({ }, ]; const [previewOrientation, setPreviewOrientation] = useState( - previewOrientationOptions[0].value + previewOrientationOptions[0].value, ); /** @@ -116,7 +116,7 @@ function ScreenForm({ useEffect(() => { if (layoutOptions) { const localSelectedLayout = layoutOptions.find( - (layout) => layout["@id"] === screen.layout + (layout) => layout["@id"] === screen.layout, ); if (localSelectedLayout) { setSelectedLayout(localSelectedLayout); diff --git a/assets/admin/components/screen/screen-list.jsx b/assets/admin/components/screen/screen-list.jsx index ab26b6de..6d553730 100644 --- a/assets/admin/components/screen/screen-list.jsx +++ b/assets/admin/components/screen/screen-list.jsx @@ -41,7 +41,7 @@ function ScreenList() { const [isDeleting, setIsDeleting] = useState(false); const [listData, setListData] = useState(); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-screens") + t("loading-messages.loading-screens"), ); const [showScreenStatus, setShowScreenStatus] = useState(false); diff --git a/assets/admin/components/screen/screen-manager.jsx b/assets/admin/components/screen/screen-manager.jsx index c73baeb8..dc0354dd 100644 --- a/assets/admin/components/screen/screen-manager.jsx +++ b/assets/admin/components/screen/screen-manager.jsx @@ -75,7 +75,7 @@ function ScreenManager({ if (saveErrorPut || saveErrorPost) { displayError( t("error-messages.save-screen-error"), - saveErrorPut || saveErrorPost + saveErrorPut || saveErrorPost, ); setSavingScreen(false); } @@ -108,13 +108,13 @@ function ScreenManager({ if (localFormStateObject.orientation) { localFormStateObject.orientation = orientationOptions.filter( (orientation) => - orientation["@id"] === localFormStateObject.orientation + orientation["@id"] === localFormStateObject.orientation, ); } if (localFormStateObject.resolution) { localFormStateObject.resolution = resolutionOptions.filter( - (resolution) => resolution["@id"] === localFormStateObject.resolution + (resolution) => resolution["@id"] === localFormStateObject.resolution, ); } @@ -198,7 +198,7 @@ function ScreenManager({ returnArray.push({ playlists: [], regionId: idFromUrl(regionId), - }) + }), ); } return returnArray; diff --git a/assets/admin/components/screen/screen-status.jsx b/assets/admin/components/screen/screen-status.jsx index 6530968a..9fc67e95 100644 --- a/assets/admin/components/screen/screen-status.jsx +++ b/assets/admin/components/screen/screen-status.jsx @@ -48,7 +48,7 @@ function ScreenStatus({ screen, handleInput = () => {}, mode = "default" }) { screenBindObject: JSON.stringify({ bindKey, }), - }) + }), ).then((response) => { if (response.error) { const err = response.error; @@ -56,7 +56,7 @@ function ScreenStatus({ screen, handleInput = () => {}, mode = "default" }) { t("error-messages.error-binding", { status: err.status, }), - err + err, ); } else { // Set screenUser to true, to indicate it has been set. @@ -73,7 +73,7 @@ function ScreenStatus({ screen, handleInput = () => {}, mode = "default" }) { dispatch( api.endpoints.postScreenUnbind.initiate({ id: idFromUrl(screen["@id"]), - }) + }), ).then((response) => { if (response.error) { const err = response.error; @@ -81,7 +81,7 @@ function ScreenStatus({ screen, handleInput = () => {}, mode = "default" }) { t("error-messages.error-unbinding", { status: err.status, }), - err + err, ); } else { // Set screenUser and status to null, to indicate it has been removed. @@ -254,7 +254,7 @@ function ScreenStatus({ screen, handleInput = () => {}, mode = "default" }) {
  • {t("latest-request")}:{" "} {dayjs(status.latestRequestDateTime).format( - "D/M YYYY HH:mm" + "D/M YYYY HH:mm", )}
  • )} @@ -273,14 +273,14 @@ function ScreenStatus({ screen, handleInput = () => {}, mode = "default" }) {
  • {t("release-timestamp")}:{" "} {dayjs(status.releaseTimestamp * 1000).format( - "D/M YYYY HH:mm" + "D/M YYYY HH:mm", )} {notRunningLatestRelease && ( <> {" "}({t("newest")}:{" "} {clientRelease?.releaseTimestamp && dayjs(clientRelease?.releaseTimestamp * 1000).format( - "D/M YYYY HH:mm" + "D/M YYYY HH:mm", )} ) diff --git a/assets/admin/components/screen/util/campaign-icon.jsx b/assets/admin/components/screen/util/campaign-icon.jsx index 94ccafcf..c114808b 100644 --- a/assets/admin/components/screen/util/campaign-icon.jsx +++ b/assets/admin/components/screen/util/campaign-icon.jsx @@ -29,7 +29,7 @@ function CampaignIcon({ id, delay = 1000 }) { const { data: campaigns, isLoading } = useGetV2ScreensByIdCampaignsQuery( { id }, - { skip: !getData } + { skip: !getData }, ); const { data: groups, isLoading: isLoadingScreenGroups } = useGetV2ScreensByIdScreenGroupsQuery({ id }, { skip: !getData }); @@ -37,7 +37,7 @@ function CampaignIcon({ id, delay = 1000 }) { useEffect(() => { if (campaigns) { setAllCampaigns( - campaigns["hydra:member"].map(({ campaign }) => campaign) + campaigns["hydra:member"].map(({ campaign }) => campaign), ); setScreenCampaignsChecked(true); } @@ -49,12 +49,12 @@ function CampaignIcon({ id, delay = 1000 }) { dispatch( api.endpoints.getV2ScreenGroupsByIdCampaigns.initiate({ id: idFromUrl(group["@id"]), - }) + }), ).then((result) => { let allCampaignsCopy = [...allCampaigns]; if (allCampaignsCopy.length > 0 && result.data) { allCampaignsCopy = allCampaignsCopy.concat( - result.data["hydra:member"].map(({ campaign }) => campaign) + result.data["hydra:member"].map(({ campaign }) => campaign), ); } setAllCampaigns(allCampaignsCopy); diff --git a/assets/admin/components/screen/util/grid-generation-and-select.jsx b/assets/admin/components/screen/util/grid-generation-and-select.jsx index a30674c6..98db2f5d 100644 --- a/assets/admin/components/screen/util/grid-generation-and-select.jsx +++ b/assets/admin/components/screen/util/grid-generation-and-select.jsx @@ -1,7 +1,10 @@ import { useState, useEffect } from "react"; import PropTypes from "prop-types"; import { Tabs, Tab, Alert } from "react-bootstrap"; -import { createGridArea, createGrid } from "../../../../shared/grid-generator/grid-generator"; +import { + createGridArea, + createGrid, +} from "../../../../shared/grid-generator/grid-generator"; import { useTranslation } from "react-i18next"; import { useDispatch } from "react-redux"; import idFromUrl from "../../util/helpers/id-from-url"; @@ -84,8 +87,8 @@ function GridGenerationAndSelect({ self.findIndex( (secondPlaylist) => secondPlaylist["@id"] === playlist["@id"] && - secondPlaylist.region === playlist.region - ) + secondPlaylist.region === playlist.region, + ), ); return localSelectedPlaylists; @@ -102,8 +105,8 @@ function GridGenerationAndSelect({ regionId: idFromUrl(id), page: 1, itemsPerPage: 50, - }) - ) + }), + ), ); }); @@ -124,7 +127,7 @@ function GridGenerationAndSelect({ region: regionId, })), ]; - } + }, ); playlists = playlists.sort((a, b) => a.weight - b.weight); setSelectedPlaylists(playlists); @@ -160,7 +163,7 @@ function GridGenerationAndSelect({ const indexOfItemToRemove = selectedPlaylists.findIndex( ({ "@id": id, region }) => { return region === inputRegion && id === inputPlaylist; - } + }, ); const selectedPlaylistsCopy = [...selectedPlaylists]; selectedPlaylistsCopy.splice(indexOfItemToRemove, 1); @@ -213,7 +216,7 @@ function GridGenerationAndSelect({ screenId={screenId} regionId={idFromUrl(data["@id"])} selectedPlaylists={selectedPlaylists.filter( - ({ region }) => region === idFromUrl(data["@id"]) + ({ region }) => region === idFromUrl(data["@id"]), )} /> {data?.type === "touch-buttons" && ( diff --git a/assets/admin/components/screen/util/screen-gantt-chart.jsx b/assets/admin/components/screen/util/screen-gantt-chart.jsx index e9b13f2e..4b02a454 100644 --- a/assets/admin/components/screen/util/screen-gantt-chart.jsx +++ b/assets/admin/components/screen/util/screen-gantt-chart.jsx @@ -22,7 +22,7 @@ function ScreenGanttChart({ playlists, id }) { /** Get show from local storage */ useEffect(() => { const localStorageShow = localStorage.getItem( - localStorageKeys.VIEW_GANT_SCREEN + localStorageKeys.VIEW_GANT_SCREEN, ); setShowGantt(localStorageShow === "true"); }, []); @@ -42,7 +42,7 @@ function ScreenGanttChart({ playlists, id }) { const redirectPossible = tenants?.length === 0 || !tenants.find( - (tenant) => tenant.tenantKey === context.selectedTenant.get.tenantKey + (tenant) => tenant.tenantKey === context.selectedTenant.get.tenantKey, ); // If the playlist has scheduling, a playlist per scheduling will @@ -52,7 +52,7 @@ function ScreenGanttChart({ playlists, id }) { // Get rrule dates in an array // From today, to in a year - which is also the upper boundary of the gantt chart const occurrences = RRule.fromString( - rrule.replace("\\n", "\n") + rrule.replace("\\n", "\n"), ).between(new Date(), inAYear); // Map published and add to data structure @@ -61,7 +61,7 @@ function ScreenGanttChart({ playlists, id }) { // End date is start date plus duration, as rrule const endDateTime = new Date(occurrence).setSeconds( - startDateTime.getSeconds() + duration + startDateTime.getSeconds() + duration, ); const playlistWithPublished = { ...playlist }; @@ -129,7 +129,7 @@ function ScreenGanttChart({ playlists, id }) { ScreenGanttChart.propTypes = { playlists: PropTypes.arrayOf( - PropTypes.shape({ name: PropTypes.string, id: PropTypes.number }) + PropTypes.shape({ name: PropTypes.string, id: PropTypes.number }), ).isRequired, id: PropTypes.string.isRequired, }; diff --git a/assets/admin/components/slide/content/contacts/contacts.jsx b/assets/admin/components/slide/content/contacts/contacts.jsx index 9307c446..8a6599f3 100644 --- a/assets/admin/components/slide/content/contacts/contacts.jsx +++ b/assets/admin/components/slide/content/contacts/contacts.jsx @@ -49,7 +49,7 @@ function Contacts({ const updateContact = (changedContact) => { const newContacts = [...contacts]; const findIndex = newContacts.findIndex( - ({ id }) => id === changedContact.id + ({ id }) => id === changedContact.id, ); newContacts[findIndex] = changedContact; onChange({ target: { id: name, value: newContacts } }); @@ -114,7 +114,7 @@ Contacts.propTypes = { phone: PropTypes.string, title: PropTypes.string, email: PropTypes.string, - }) + }), ).isRequired, formGroupClasses: PropTypes.string, onChange: PropTypes.func.isRequired, diff --git a/assets/admin/components/slide/content/feed-selector.jsx b/assets/admin/components/slide/content/feed-selector.jsx index b233b5af..49511204 100644 --- a/assets/admin/components/slide/content/feed-selector.jsx +++ b/assets/admin/components/slide/content/feed-selector.jsx @@ -65,7 +65,7 @@ function FeedSelector({ key: source["@id"], id: source["@id"], }; - }) + }), ); } }, [feedSourcesData]); @@ -79,7 +79,7 @@ function FeedSelector({ dispatch( api.endpoints.getV2FeedSourcesById.initiate({ id: idFromUrl(value.feedSource), - }) + }), ) .then((response) => { setFeedSourceData(response.data); diff --git a/assets/admin/components/slide/content/file-dropzone.jsx b/assets/admin/components/slide/content/file-dropzone.jsx index 26e489a2..32e2bd21 100644 --- a/assets/admin/components/slide/content/file-dropzone.jsx +++ b/assets/admin/components/slide/content/file-dropzone.jsx @@ -22,7 +22,7 @@ function FileDropzone({ onFilesAdded, acceptedMimetypes = null }) { return { code: "file-too-large", message: `${file.name} (${Math.floor( - file.size / 1000000 + file.size / 1000000, )} MB) ${largerThanText} (${allowedSize / 1000000} MB)`, }; } diff --git a/assets/admin/components/slide/content/media-selector-modal.jsx b/assets/admin/components/slide/content/media-selector-modal.jsx index f96f363e..511a82bf 100644 --- a/assets/admin/components/slide/content/media-selector-modal.jsx +++ b/assets/admin/components/slide/content/media-selector-modal.jsx @@ -119,7 +119,7 @@ MediaSelectorModal.propTypes = { multiple: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, selectedMedia: PropTypes.arrayOf( - PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string]) + PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string]), ).isRequired, selectMedia: PropTypes.func.isRequired, show: PropTypes.bool.isRequired, diff --git a/assets/admin/components/slide/content/multiselect-from-endpoint.jsx b/assets/admin/components/slide/content/multiselect-from-endpoint.jsx index acabe4b9..a953a2dd 100644 --- a/assets/admin/components/slide/content/multiselect-from-endpoint.jsx +++ b/assets/admin/components/slide/content/multiselect-from-endpoint.jsx @@ -42,7 +42,7 @@ function MultiselectFromEndpoint({ // Attach tenant key . const tenantKey = JSON.parse( - localStorage.getItem(localStorageKeys.SELECTED_TENANT) + localStorage.getItem(localStorageKeys.SELECTED_TENANT), ); if (tenantKey) { @@ -62,11 +62,11 @@ function MultiselectFromEndpoint({ key: element.value, title: element.title, }; - }) + }), ); }) .catch(() => - displayError(t("multiselect-from-endpoint.error-fetching")) + displayError(t("multiselect-from-endpoint.error-fetching")), ); } }, [optionsEndpoint]); diff --git a/assets/admin/components/slide/content/poster/poster-selector-v1.jsx b/assets/admin/components/slide/content/poster/poster-selector-v1.jsx index 39db9e62..6f73c122 100644 --- a/assets/admin/components/slide/content/poster/poster-selector-v1.jsx +++ b/assets/admin/components/slide/content/poster/poster-selector-v1.jsx @@ -27,7 +27,7 @@ function PosterSelectorV1({ const { t } = useTranslation("common"); const apiToken = localStorage.getItem(localStorageKeys.API_TOKEN); const tenantKey = JSON.parse( - localStorage.getItem(localStorageKeys.SELECTED_TENANT) + localStorage.getItem(localStorageKeys.SELECTED_TENANT), ); const headers = { @@ -45,23 +45,23 @@ function PosterSelectorV1({ const [singleDisplayOverrides, setSingleDisplayOverrides] = useState(false); const [singleSelectedEvent, setSingleSelectedEvent] = useState( - getValueFromConfiguration("singleSelectedEvent") ?? null + getValueFromConfiguration("singleSelectedEvent") ?? null, ); const [singleSelectedOccurrence, setSingleSelectedOccurrence] = useState( - getValueFromConfiguration("singleSelectedOccurrence") ?? null + getValueFromConfiguration("singleSelectedOccurrence") ?? null, ); const [subscriptionPlaceValue, setSubscriptionPlaceValue] = useState( - getValueFromConfiguration("subscriptionPlaceValue") ?? [] + getValueFromConfiguration("subscriptionPlaceValue") ?? [], ); const [subscriptionOrganizerValue, setSubscriptionOrganizerValue] = useState( - getValueFromConfiguration("subscriptionOrganizerValue") ?? [] + getValueFromConfiguration("subscriptionOrganizerValue") ?? [], ); const [subscriptionTagValue, setSubscriptionTagValue] = useState( - getValueFromConfiguration("subscriptionTagValue") ?? [] + getValueFromConfiguration("subscriptionTagValue") ?? [], ); const [subscriptionNumberValue, setSubscriptionNumberValue] = useState( - getValueFromConfiguration("subscriptionNumberValue") ?? 5 + getValueFromConfiguration("subscriptionNumberValue") ?? 5, ); const [subscriptionEvents, setSubscriptionEvents] = useState(null); @@ -74,7 +74,7 @@ function PosterSelectorV1({ const url = feedSource.admin[0].endpointEntity; const eventId = getValueFromConfiguration("singleSelectedEvent"); const occurrenceId = getValueFromConfiguration( - "singleSelectedOccurrence" + "singleSelectedOccurrence", ); if (eventId !== null) { @@ -327,7 +327,7 @@ function PosterSelectorV1({ return capitalize( dayjs(date) .locale(localeDa) - .format(format ?? "LLLL") + .format(format ?? "LLLL"), ); }; @@ -439,7 +439,7 @@ function PosterSelectorV1({ /> {searchEvent?.occurrences?.length > 0 && formatDate( - searchEvent?.occurrences[0]?.startDate + searchEvent?.occurrences[0]?.startDate, )} {searchEvent?.occurrences?.length > 1 && ( , ... @@ -663,17 +663,17 @@ function PosterSelectorV1({ - ) + ), )} @@ -713,7 +713,7 @@ function PosterSelectorV1({ loadDropdownOptions( inputValue, callback, - "places" + "places", ) } value={subscriptionPlaceValue} @@ -742,7 +742,7 @@ function PosterSelectorV1({ loadDropdownOptions( inputValue, callback, - "organizers" + "organizers", ) } value={subscriptionOrganizerValue} @@ -771,7 +771,7 @@ function PosterSelectorV1({ loadDropdownOptions( inputValue, callback, - "tags" + "tags", ) } value={subscriptionTagValue} @@ -862,10 +862,10 @@ function PosterSelectorV1({ <> {`${formatDate( firstOccurrence.startDate, - "L" + "L", )} - ${formatDate( firstOccurrence.endDate, - "L" + "L", )}`} )} @@ -898,7 +898,7 @@ PosterSelectorV1.propTypes = { PropTypes.shape({ endpointEntity: PropTypes.string, endpointSearch: PropTypes.string, - }) + }), ), }).isRequired, }; diff --git a/assets/admin/components/slide/content/poster/poster-selector-v2.jsx b/assets/admin/components/slide/content/poster/poster-selector-v2.jsx index 6f139757..2e0e9c3b 100644 --- a/assets/admin/components/slide/content/poster/poster-selector-v2.jsx +++ b/assets/admin/components/slide/content/poster/poster-selector-v2.jsx @@ -96,7 +96,7 @@ PosterSelectorV2.propTypes = { PropTypes.shape({ endpointEntity: PropTypes.string, endpointSearch: PropTypes.string, - }) + }), ), }).isRequired, }; diff --git a/assets/admin/components/slide/content/poster/poster-single-events.jsx b/assets/admin/components/slide/content/poster/poster-single-events.jsx index c62685f8..28c986ef 100644 --- a/assets/admin/components/slide/content/poster/poster-single-events.jsx +++ b/assets/admin/components/slide/content/poster/poster-single-events.jsx @@ -51,8 +51,9 @@ function PosterSingleEvents({ events, handleSelectEvent }) { handleSelectEvent( entityId, occurrences.map( - ({ entityId: occurrenceEntityId }) => occurrenceEntityId - ) + ({ entityId: occurrenceEntityId }) => + occurrenceEntityId, + ), ) } > @@ -60,7 +61,7 @@ function PosterSingleEvents({ events, handleSelectEvent }) { - ) + ), )} {events?.length === 0 && ( diff --git a/assets/admin/components/slide/content/poster/poster-single-occurences.jsx b/assets/admin/components/slide/content/poster/poster-single-occurences.jsx index d3b49891..28b3dc12 100644 --- a/assets/admin/components/slide/content/poster/poster-single-occurences.jsx +++ b/assets/admin/components/slide/content/poster/poster-single-occurences.jsx @@ -48,7 +48,7 @@ PosterSingleOccurrences.propTypes = { entityId: PropTypes.number.isRequired, start: PropTypes.string.isRequired, ticketPriceRange: PropTypes.string.isRequired, - }) + }), ).isRequired, handleSelectOccurrence: PropTypes.func.isRequired, }; diff --git a/assets/admin/components/slide/content/poster/poster-single-search.jsx b/assets/admin/components/slide/content/poster/poster-single-search.jsx index 725b3b07..48fa2b4e 100644 --- a/assets/admin/components/slide/content/poster/poster-single-search.jsx +++ b/assets/admin/components/slide/content/poster/poster-single-search.jsx @@ -35,21 +35,21 @@ function PosterSingleSearch({ useEffect(() => { loadDropdownOptionsPromise(optionsEndpoint, getHeaders(), "", "tags").then( - (r) => setTagOptions(r) + (r) => setTagOptions(r), ); loadDropdownOptionsPromise( optionsEndpoint, getHeaders(), "", - "locations" + "locations", ).then((r) => setLocationOptions(r)); loadDropdownOptionsPromise( optionsEndpoint, getHeaders(), "", - "organizations" + "organizations", ).then((r) => setOrganizationOptions(r)); }, []); diff --git a/assets/admin/components/slide/content/poster/poster-single.jsx b/assets/admin/components/slide/content/poster/poster-single.jsx index ca3744de..86e330c8 100644 --- a/assets/admin/components/slide/content/poster/poster-single.jsx +++ b/assets/admin/components/slide/content/poster/poster-single.jsx @@ -251,7 +251,7 @@ PosterSingle.propTypes = { endpointEntity: PropTypes.string, endpointSearch: PropTypes.string, endpointOption: PropTypes.string, - }) + }), ), }).isRequired, }; diff --git a/assets/admin/components/slide/content/poster/poster-subscription-criteria.jsx b/assets/admin/components/slide/content/poster/poster-subscription-criteria.jsx index d2da9977..d44a0e49 100644 --- a/assets/admin/components/slide/content/poster/poster-subscription-criteria.jsx +++ b/assets/admin/components/slide/content/poster/poster-subscription-criteria.jsx @@ -36,21 +36,21 @@ function PosterSubscriptionCriteria({ useEffect(() => { loadDropdownOptionsPromise(optionsEndpoint, getHeaders(), "", "tags").then( - (r) => setTags(r) + (r) => setTags(r), ); loadDropdownOptionsPromise( optionsEndpoint, getHeaders(), "", - "locations" + "locations", ).then((r) => setLocations(r)); loadDropdownOptionsPromise( optionsEndpoint, getHeaders(), "", - "organizations" + "organizations", ).then((r) => setOrganizations(r)); }, []); @@ -163,13 +163,13 @@ PosterSubscriptionCriteria.propTypes = { optionsEndpoint: PropTypes.string.isRequired, configuration: PropTypes.shape({ subscriptionPlaceValue: PropTypes.arrayOf( - PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }) + PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }), ), subscriptionOrganizerValue: PropTypes.arrayOf( - PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }) + PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }), ), subscriptionTagValue: PropTypes.arrayOf( - PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }) + PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }), ), subscriptionNumberValue: PropTypes.number, }).isRequired, diff --git a/assets/admin/components/slide/content/poster/poster-subscription.jsx b/assets/admin/components/slide/content/poster/poster-subscription.jsx index d62eb93f..b5c62aaf 100644 --- a/assets/admin/components/slide/content/poster/poster-subscription.jsx +++ b/assets/admin/components/slide/content/poster/poster-subscription.jsx @@ -148,7 +148,7 @@ function PosterSubscription({ ); - } + }, )} @@ -167,13 +167,13 @@ function PosterSubscription({ PosterSubscription.propTypes = { configuration: PropTypes.shape({ subscriptionPlaceValue: PropTypes.arrayOf( - PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }) + PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }), ), subscriptionOrganizerValue: PropTypes.arrayOf( - PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }) + PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }), ), subscriptionTagValue: PropTypes.arrayOf( - PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }) + PropTypes.shape({ label: PropTypes.string, value: PropTypes.number }), ), subscriptionNumberValue: PropTypes.number, }).isRequired, @@ -185,7 +185,7 @@ PosterSubscription.propTypes = { endpointOption: PropTypes.string, endpointSearch: PropTypes.string, endpointSubscription: PropTypes.string, - }) + }), ), }).isRequired, }; diff --git a/assets/admin/components/slide/content/station/station-selector.jsx b/assets/admin/components/slide/content/station/station-selector.jsx index 44047ac1..3678f7c0 100644 --- a/assets/admin/components/slide/content/station/station-selector.jsx +++ b/assets/admin/components/slide/content/station/station-selector.jsx @@ -77,7 +77,7 @@ function StationSelector({ accessId: config.rejseplanenApiKey || "", format: "json", input: searchText, - })}` + })}`, ) .then((response) => response.json()) .then((rpData) => { @@ -120,7 +120,7 @@ StationSelector.propTypes = { name: PropTypes.string, x: PropTypes.string, y: PropTypes.string, - }) + }), ), helpText: PropTypes.string, }; diff --git a/assets/admin/components/slide/preview/slide-preview.jsx b/assets/admin/components/slide/preview/slide-preview.jsx index afd65adc..50735843 100644 --- a/assets/admin/components/slide/preview/slide-preview.jsx +++ b/assets/admin/components/slide/preview/slide-preview.jsx @@ -40,7 +40,11 @@ function SlidePreview({ useEffect(() => { if (slide) { // Local slide and local content, to not accidentally mess with the actual content. - const newSlide = { ...slide, templateData, executionId: 'EXE-ID-PREVIEW' }; + const newSlide = { + ...slide, + templateData, + executionId: "EXE-ID-PREVIEW", + }; if (mediaData) { newSlide.mediaData = mediaData; @@ -50,7 +54,7 @@ function SlidePreview({ // Find tempid keys const keys = Object.keys(mediaDataCopy).filter((key) => - key.includes("TEMP") + key.includes("TEMP"), ); // Create "fake" url to file @@ -89,7 +93,8 @@ function SlidePreview({ if (entries.length > 0) { const first = entries[0]; setFontSizeRem( - first.contentRect.width / (orientation === "vertical" ? 1080 : 1920) + first.contentRect.width / + (orientation === "vertical" ? 1080 : 1920), ); } } diff --git a/assets/admin/components/slide/slide-create.jsx b/assets/admin/components/slide/slide-create.jsx index bb5a39d2..a8403756 100644 --- a/assets/admin/components/slide/slide-create.jsx +++ b/assets/admin/components/slide/slide-create.jsx @@ -16,7 +16,7 @@ function SlideCreate() { let themeInfo = null; if (localStorage.getItem(localStorageKeys.THEME)) { const prevSelectedThemes = JSON.parse( - localStorage.getItem(localStorageKeys.THEME) + localStorage.getItem(localStorageKeys.THEME), ); themeInfo = prevSelectedThemes[context.selectedTenant.get.tenantKey] || null; diff --git a/assets/admin/components/slide/slide-form.jsx b/assets/admin/components/slide/slide-form.jsx index e226b706..5e1a1062 100644 --- a/assets/admin/components/slide/slide-form.jsx +++ b/assets/admin/components/slide/slide-form.jsx @@ -81,7 +81,7 @@ function SlideForm({ }, ]; const [previewOrientation, setPreviewOrientation] = useState( - previewOrientationOptions[0].value + previewOrientationOptions[0].value, ); const [previewOverlayVisible, setPreviewOverlayVisible] = useState(false); @@ -159,7 +159,7 @@ function SlideForm({ const newSelectedTemplates = []; if (selectedTemplate) { - const slideConfig = getConfig(selectedTemplate['id']); + const slideConfig = getConfig(selectedTemplate["id"]); setContentFormElements(slideConfig.adminForm ?? []); setDisableLivePreview(slideConfig?.options?.disableLivePreview ?? false); newSelectedTemplates.push(selectedTemplate); @@ -392,7 +392,9 @@ function SlideForm({ } > - {t("preview-in-full-screen")} + + {t("preview-in-full-screen")} + @@ -402,41 +404,41 @@ function SlideForm({ )} {!disableLivePreview && ( - <> - {previewOrientation === "horizontal" && ( -
    - 0 ? selectedTheme[0] : {} - } - orientation={previewOrientation} - /> -
    - )} - {previewOrientation === "vertical" && ( -
    - 0 ? selectedTheme[0] : {} - } - orientation={previewOrientation} - /> -
    - )} - - )} + <> + {previewOrientation === "horizontal" && ( +
    + 0 ? selectedTheme[0] : {} + } + orientation={previewOrientation} + /> +
    + )} + {previewOrientation === "vertical" && ( +
    + 0 ? selectedTheme[0] : {} + } + orientation={previewOrientation} + /> +
    + )} + + )} {previewOverlayVisible && ( <> {config?.enhancedPreview && ( @@ -570,7 +572,7 @@ SlideForm.propTypes = { headerText: PropTypes.string.isRequired, selectTheme: PropTypes.func.isRequired, selectedTheme: PropTypes.arrayOf( - PropTypes.shape({ "@id": PropTypes.string.isRequired }) + PropTypes.shape({ "@id": PropTypes.string.isRequired }), ), selectTemplate: PropTypes.func.isRequired, selectedTemplate: PropTypes.shape({ diff --git a/assets/admin/components/slide/slide-manager.jsx b/assets/admin/components/slide/slide-manager.jsx index 8487387e..414dc29e 100644 --- a/assets/admin/components/slide/slide-manager.jsx +++ b/assets/admin/components/slide/slide-manager.jsx @@ -51,7 +51,7 @@ function SlideManager({ // State const [headerText] = useState( - saveMethod === "PUT" ? t("edit-slide-header") : t("create-slide-header") + saveMethod === "PUT" ? t("edit-slide-header") : t("create-slide-header"), ); const [getTheme, setGetTheme] = useState(true); const [getTemplate, setGetTemplate] = useState(true); @@ -64,7 +64,7 @@ function SlideManager({ const [selectedTheme, setSelectedTheme] = useState(); const [saveWithoutClose, setSaveWithoutClose] = useState(false); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-slide") + t("loading-messages.loading-slide"), ); // Initialize to empty slide object. @@ -219,14 +219,14 @@ function SlideManager({ formStateObject?.templateInfo && Object.prototype.hasOwnProperty.call( formStateObject.templateInfo, - "@id" + "@id", ) && getTemplate ) { dispatch( api.endpoints.getV2TemplatesById.initiate({ id: idFromUrl(formStateObject.templateInfo["@id"]), - }) + }), ) .then((result) => { const template = result.data; @@ -243,7 +243,7 @@ function SlideManager({ dispatch( api.endpoints.getV2ThemesById.initiate({ id: idFromUrl(formStateObject.theme), - }) + }), ) .then((result) => { // To only get the theme once. @@ -273,7 +273,7 @@ function SlideManager({ dispatch( api.endpoints.getV2FeedsByIdData.initiate({ id: idFromUrl(initialState.feed["@id"]), - }) + }), ).then((response) => { setFormStateObject({ ...localFormStateObject, @@ -293,8 +293,8 @@ function SlideManager({ localFormStateObject.media.forEach((media) => { promises.push( dispatch( - api.endpoints.getv2MediaById.initiate({ id: idFromUrl(media) }) - ) + api.endpoints.getv2MediaById.initiate({ id: idFromUrl(media) }), + ), ); }); @@ -313,12 +313,12 @@ function SlideManager({ // Set published to format accepted by bootstrap date component if (localFormStateObject.published.from) { localFormStateObject.published.from = dayjs( - localFormStateObject.published.from + localFormStateObject.published.from, ).format("YYYY-MM-DDTHH:mm"); } if (localFormStateObject.published.to) { localFormStateObject.published.to = dayjs( - localFormStateObject.published.to + localFormStateObject.published.to, ).format("YYYY-MM-DDTHH:mm"); } @@ -453,7 +453,7 @@ function SlideManager({ setPlaylistsToAdd( playlists.map((playlist) => { return { playlist: idFromUrl(playlist) }; - }) + }), ); } @@ -490,21 +490,21 @@ function SlideManager({ if (formStateObject.theme) { const { tenantKey } = context.selectedTenant.get; let previouslySavedTheme = localStorage.getItem( - localStorageKeys.THEME + localStorageKeys.THEME, ); if (previouslySavedTheme) { previouslySavedTheme = JSON.parse(previouslySavedTheme); previouslySavedTheme[tenantKey] = formStateObject.theme; localStorage.setItem( localStorageKeys.THEME, - JSON.stringify(previouslySavedTheme) + JSON.stringify(previouslySavedTheme), ); } else { const themeToSave = {}; themeToSave[tenantKey] = formStateObject.theme; localStorage.setItem( localStorageKeys.THEME, - JSON.stringify(themeToSave) + JSON.stringify(themeToSave), ); } } @@ -563,8 +563,8 @@ function SlideManager({ (mediaId) => mediaId === submittedMedia.tempId ? savedMediaData["@id"] - : mediaId - ) + : mediaId, + ), ); const newMediaData = { ...mediaData }; diff --git a/assets/admin/components/slide/slides-list.jsx b/assets/admin/components/slide/slides-list.jsx index f3176811..54ea42b2 100644 --- a/assets/admin/components/slide/slides-list.jsx +++ b/assets/admin/components/slide/slides-list.jsx @@ -39,7 +39,7 @@ function SlidesList() { const [isDeleting, setIsDeleting] = useState(false); const [listData, setListData] = useState(); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-slides") + t("loading-messages.loading-slides"), ); // Delete call diff --git a/assets/admin/components/themes/theme-manager.jsx b/assets/admin/components/themes/theme-manager.jsx index 89c5cc85..da38e845 100644 --- a/assets/admin/components/themes/theme-manager.jsx +++ b/assets/admin/components/themes/theme-manager.jsx @@ -38,11 +38,11 @@ function ThemeManager({ // State const [headerText] = useState( - saveMethod === "PUT" ? t("edit-theme") : t("create-new-theme") + saveMethod === "PUT" ? t("edit-theme") : t("create-new-theme"), ); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-theme") + t("loading-messages.loading-theme"), ); const [saveWithoutClose, setSaveWithoutClose] = useState(false); diff --git a/assets/admin/components/themes/themes-list.jsx b/assets/admin/components/themes/themes-list.jsx index 6c257cfe..684485e9 100644 --- a/assets/admin/components/themes/themes-list.jsx +++ b/assets/admin/components/themes/themes-list.jsx @@ -31,7 +31,7 @@ function ThemesList() { const [isDeleting, setIsDeleting] = useState(false); const [listData, setListData] = useState(); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-themes") + t("loading-messages.loading-themes"), ); const { diff --git a/assets/admin/components/user/login.jsx b/assets/admin/components/user/login.jsx index f56677a1..d3a443cc 100644 --- a/assets/admin/components/user/login.jsx +++ b/assets/admin/components/user/login.jsx @@ -1,16 +1,16 @@ -import {React, useEffect, useState, useContext} from "react"; -import {Button, Form, Row} from "react-bootstrap"; -import {useTranslation} from "react-i18next"; -import {useDispatch} from "react-redux"; -import {useLocation} from "react-router-dom"; +import { React, useEffect, useState, useContext } from "react"; +import { Button, Form, Row } from "react-bootstrap"; +import { useTranslation } from "react-i18next"; +import { useDispatch } from "react-redux"; +import { useLocation } from "react-router-dom"; import queryString from "query-string"; import Col from "react-bootstrap/Col"; -import {MultiSelect} from "react-multi-select-component"; +import { MultiSelect } from "react-multi-select-component"; import UserContext from "../../context/user-context"; import FormInput from "../util/forms/form-input"; -import {api} from "../../redux/api/api.generated.ts"; +import { api } from "../../redux/api/api.generated.ts"; import AdminConfigLoader from "../util/admin-config-loader.js"; -import {displayError} from "../util/list/toast-component/display-toast"; +import { displayError } from "../util/list/toast-component/display-toast"; import localStorageKeys from "../util/local-storage-keys"; import LoginSidebar from "../navigation/login-sidebar/login-sidebar"; import "./login.scss"; @@ -23,421 +23,420 @@ import LoadingComponent from "../util/loading-component/loading-component"; * @returns {object} - The component */ function Login() { - // Hooks - const {t} = useTranslation("common", {keyPrefix: "login"}); - const {search} = useLocation(); - const dispatch = useDispatch(); - - // Context - const context = useContext(UserContext); - - // Local state - const [ready, setReady] = useState(false); - const [error, setError] = useState(false); - const [password, setPassword] = useState(""); - const [activationCode, setActivationCode] = useState(""); - const [email, setEmail] = useState(""); - const [loggedIn, setLoggedIn] = useState(false); - const [errorMessage, setErrorMessage] = useState(""); - const [loginMethods, setLoginMethods] = useState([]); - - /** - * Login, both called from oidc login and manuel login. - * - * @param {object} data - Login data - */ - const login = (data) => { - const {user} = data; - const {tenants} = data; - - if (!tenants) { - setError(true); - displayError(t("missing-tenants")); - } + // Hooks + const { t } = useTranslation("common", { keyPrefix: "login" }); + const { search } = useLocation(); + const dispatch = useDispatch(); + + // Context + const context = useContext(UserContext); + + // Local state + const [ready, setReady] = useState(false); + const [error, setError] = useState(false); + const [password, setPassword] = useState(""); + const [activationCode, setActivationCode] = useState(""); + const [email, setEmail] = useState(""); + const [loggedIn, setLoggedIn] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + const [loginMethods, setLoginMethods] = useState([]); + + /** + * Login, both called from oidc login and manuel login. + * + * @param {object} data - Login data + */ + const login = (data) => { + const { user } = data; + const { tenants } = data; + + if (!tenants) { + setError(true); + displayError(t("missing-tenants")); + } + + // Set data in local storage, to persist login on refresh + localStorage.setItem(localStorageKeys.API_TOKEN, data.token); + localStorage.setItem( + localStorageKeys.API_REFRESH_TOKEN, + data.refresh_token, + ); + localStorage.setItem(localStorageKeys.USER_NAME, user?.fullname); + localStorage.setItem(localStorageKeys.EMAIL, user?.email); + localStorage.setItem(localStorageKeys.TENANTS, JSON.stringify(tenants)); + + context.userName.set(user?.fullname); + context.email.set(user?.email); + context.tenants.set(tenants); + context.userType.set(user?.type); + + // If there are more than one tenant, the user should pick a tenant + if (tenants.length === 1) { + // authenticated, and use the only tenant. + context.authenticated.set(true); + localStorage.setItem( + localStorageKeys.SELECTED_TENANT, + JSON.stringify(tenants[0]), + ); + context.selectedTenant.set(tenants[0]); + } + + setLoggedIn(true); + }; + + /** + * Select tenant function + * + * @param {Array} selected - The multiform returns an array of selected + * values, this is a single select, so it will only have one entry + */ + const onSelectTenant = (selected) => { + const { value } = selected[0]; + + // set selected tenant in context + context.selectedTenant.set( + context.tenants.get.find((tenant) => tenant.tenantKey === value), + ); - // Set data in local storage, to persist login on refresh - localStorage.setItem(localStorageKeys.API_TOKEN, data.token); - localStorage.setItem( - localStorageKeys.API_REFRESH_TOKEN, - data.refresh_token - ); - localStorage.setItem(localStorageKeys.USER_NAME, user?.fullname); - localStorage.setItem(localStorageKeys.EMAIL, user?.email); - localStorage.setItem(localStorageKeys.TENANTS, JSON.stringify(tenants)); - - context.userName.set(user?.fullname); - context.email.set(user?.email); - context.tenants.set(tenants); - context.userType.set(user?.type); - - // If there are more than one tenant, the user should pick a tenant - if (tenants.length === 1) { - // authenticated, and use the only tenant. - context.authenticated.set(true); - localStorage.setItem( - localStorageKeys.SELECTED_TENANT, - JSON.stringify(tenants[0]) - ); - context.selectedTenant.set(tenants[0]); - } + // Set authenticated when tenant is selected + context.authenticated.set(true); - setLoggedIn(true); - }; + // Save selected tenant in localstorage + localStorage.setItem( + localStorageKeys.SELECTED_TENANT, + JSON.stringify( + context.tenants.get.find((tenant) => tenant.tenantKey === value), + ), + ); + }; + + const refreshTokenAndLogin = () => { + fetch(`/v2/authentication/token/refresh`, { + mode: "cors", + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify({ + refresh_token: localStorage.getItem(localStorageKeys.API_REFRESH_TOKEN), + }), + }) + .then((resp) => resp.json()) + .then((data) => { + if (data.code !== 200) { + setErrorMessage(data.message); + } - /** - * Select tenant function - * - * @param {Array} selected - The multiform returns an array of selected - * values, this is a single select, so it will only have one entry - */ - const onSelectTenant = (selected) => { - const {value} = selected[0]; - - // set selected tenant in context - context.selectedTenant.set( - context.tenants.get.find((tenant) => tenant.tenantKey === value) - ); - - // Set authenticated when tenant is selected - context.authenticated.set(true); - - // Save selected tenant in localstorage - localStorage.setItem( - localStorageKeys.SELECTED_TENANT, - JSON.stringify( - context.tenants.get.find((tenant) => tenant.tenantKey === value) - ) - ); - }; + if (data?.token) { + login(data); + } + }) + .catch((err) => { + setError(true); + displayError(t("error-refreshing-code"), err); + }); + }; + + const onActivationCodeSubmit = (e) => { + e.preventDefault(); + e.stopPropagation(); + + dispatch( + api.endpoints.postV2UserActivationCodesActivate.initiate({ + userActivationCodeActivationCode: JSON.stringify({ + activationCode, + }), + }), + ) + .then(() => { + refreshTokenAndLogin(); + }) + .catch((err) => { + setError(true); + displayError(t("error-activating-code"), err); + }); + }; + + const onSubmit = (e) => { + e.preventDefault(); + e.stopPropagation(); + + dispatch( + api.endpoints.loginCheckPost.initiate({ + body: JSON.stringify({ + providerId: email, + password, + }), + }), + ) + .then((response) => { + if (response?.error) { + if (response?.error?.data?.message === "Invalid credentials.") { + setError(true); + displayError(t("invalid-credentials"), response.error); + } else { + setError(true); + displayError(t("error"), response.error); + } + } + if (response?.data?.token) { + login(response.data); + } + }) + .catch((err) => { + setError(true); + displayError(t("error"), err); + }); + }; + + useEffect(() => { + const loginMethodDefaults = [ + { + type: "oidc", + provider: "internal", + enabled: true, + label: null, + icon: null, + }, + { + type: "oidc", + provider: "external", + enabled: true, + label: null, + icon: null, + }, + { + type: "username-password", + enabled: true, + label: null, + icon: null, + }, + ]; + + AdminConfigLoader.loadConfig().then((loadedConfig) => { + setLoginMethods(loadedConfig.loginMethods ?? loginMethodDefaults); + }); + }, []); + + useEffect(() => { + let isMounted = true; + let code = null; + let state = null; + + if (search) { + const query = queryString.parse(search); + + code = query.code; + state = query.state; + + if (state && code) { + const searchParams = new URLSearchParams({ + state, + code, + }); - const refreshTokenAndLogin = () => { - fetch(`/v2/authentication/token/refresh`, { - mode: "cors", - method: "POST", - headers: { - "Content-Type": "application/json", - }, - credentials: "include", - body: JSON.stringify({ - refresh_token: localStorage.getItem( - localStorageKeys.API_REFRESH_TOKEN - ), - }), + fetch(`/v2/authentication/oidc/token?${searchParams}`, { + mode: "cors", + credentials: "include", }) - .then((resp) => resp.json()) - .then((data) => { - if (data.code !== 200) { - setErrorMessage(data.message); - } - - if (data?.token) { - login(data); - } - }) - .catch((err) => { - setError(true); - displayError(t("error-refreshing-code"), err); - }); - }; - - const onActivationCodeSubmit = (e) => { - e.preventDefault(); - e.stopPropagation(); - - dispatch( - api.endpoints.postV2UserActivationCodesActivate.initiate({ - userActivationCodeActivationCode: JSON.stringify({ - activationCode, - }), - }) - ) - .then(() => { - refreshTokenAndLogin(); - }) - .catch((err) => { - setError(true); - displayError(t("error-activating-code"), err); - }); - }; - - const onSubmit = (e) => { - e.preventDefault(); - e.stopPropagation(); - - dispatch( - api.endpoints.loginCheckPost.initiate({ - body: JSON.stringify({ - providerId: email, - password, - }), - }) - ) - .then((response) => { - if (response?.error) { - if (response?.error?.data?.message === "Invalid credentials.") { - setError(true); - displayError(t("invalid-credentials"), response.error); - } else { - setError(true); - displayError(t("error"), response.error); - } - } - if (response?.data?.token) { - login(response.data); - } - }) - .catch((err) => { - setError(true); - displayError(t("error"), err); - }); - }; + .then((resp) => resp.json()) + .then((data) => { + if (data.code !== 200) { + setErrorMessage(data.message); + } - useEffect(() => { - const loginMethodDefaults = [ - { - type: "oidc", - provider: "internal", - enabled: true, - label: null, - icon: null, - }, - { - type: "oidc", - provider: "external", - enabled: true, - label: null, - icon: null, - }, - { - type: "username-password", - enabled: true, - label: null, - icon: null, - }, - ]; - - AdminConfigLoader.loadConfig().then((loadedConfig) => { - setLoginMethods( - loadedConfig.loginMethods ?? loginMethodDefaults - ); - }); - }, []); - - useEffect(() => { - let isMounted = true; - let code = null; - let state = null; - - if (search) { - const query = queryString.parse(search); - - code = query.code; - state = query.state; - - if (state && code) { - const searchParams = new URLSearchParams({ - state, - code, - }); - - fetch(`/v2/authentication/oidc/token?${searchParams}`, { - mode: "cors", - credentials: "include", - }) - .then((resp) => resp.json()) - .then((data) => { - if (data.code !== 200) { - setErrorMessage(data.message); - } - - if (isMounted) { - if (data?.token) { - login(data); - } - } - }) - .finally(() => { - setReady(true); - }); - } else { - setReady(true); + if (isMounted) { + if (data?.token) { + login(data); + } } - } else { + }) + .finally(() => { setReady(true); - } - - return () => { - isMounted = false; - }; - }, [search]); - - const oidcLogins = loginMethods.filter( - (loginMethod) => loginMethod.enabled && loginMethod.type === "oidc" - ); - const usernamePasswordLogins = loginMethods.filter( - (loginMethod) => - loginMethod.enabled && loginMethod.type === "username-password" - ); - - return ( - <> - {ready && ( -
    -
    - - - - - - -
    - {errorMessage && errorMessage !== "" && ( -
    - {errorMessage} -
    - )} - - {loggedIn && - !context.selectedTenant.get && - (context.tenants.get.length ?? 0) === 0 && - context.userType.get === "OIDC_EXTERNAL" && ( - <> -
    - setActivationCode(ev.target.value)} - value={activationCode} - name="activationCode" - label={t("activation-code")} - required - /> - - - - - )} - - {loggedIn && - !context.selectedTenant.get && - (context.tenants.get.length ?? 0) > 1 && ( - <> -

    {t("logged-in-select-tenant")}

    - -
    - - {t("select-tenant-label")} - - - { - return { - label: item.title, - value: item.tenantKey, - }; - }) || [] - } - hasSelectAll={false} - onChange={onSelectTenant} - className="single-select" - labelledBy="tenant" - /> - {t("tenant-help-text")} -
    - - )} - - {!loggedIn && ( - <> -

    {t("login-header")}

    - - {oidcLogins.length > 0 && ( - <> -

    - {t("oidc-mit-id-header")} -

    - -
    - {oidcLogins.map((loginMethod) => ( - - ))} -
    - - )} - - {usernamePasswordLogins.length > 0 && - usernamePasswordLogins.map((loginMethod) => ( -
    -

    - {loginMethod.label ?? t("os2-display-user-header")} -

    - -
    - setEmail(ev.target.value)} - value={email} - name="email" - label={t("email")} - required - /> - - setPassword(ev.target.value)} - value={password} - name="password" - label={t("password")} - type="password" - required - /> - - - -
    - ))} - - )} -
    - -
    + }); + } else { + setReady(true); + } + } else { + setReady(true); + } + + return () => { + isMounted = false; + }; + }, [search]); + + const oidcLogins = loginMethods.filter( + (loginMethod) => loginMethod.enabled && loginMethod.type === "oidc", + ); + const usernamePasswordLogins = loginMethods.filter( + (loginMethod) => + loginMethod.enabled && loginMethod.type === "username-password", + ); + + return ( + <> + {ready && ( +
    +
    + + + + + + +
    + {errorMessage && errorMessage !== "" && ( +
    + {errorMessage}
    + )} + + {loggedIn && + !context.selectedTenant.get && + (context.tenants.get.length ?? 0) === 0 && + context.userType.get === "OIDC_EXTERNAL" && ( + <> +
    + + setActivationCode(ev.target.value) + } + value={activationCode} + name="activationCode" + label={t("activation-code")} + required + /> + + + + + )} + + {loggedIn && + !context.selectedTenant.get && + (context.tenants.get.length ?? 0) > 1 && ( + <> +

    {t("logged-in-select-tenant")}

    + +
    + + {t("select-tenant-label")} + + + { + return { + label: item.title, + value: item.tenantKey, + }; + }) || [] + } + hasSelectAll={false} + onChange={onSelectTenant} + className="single-select" + labelledBy="tenant" + /> + {t("tenant-help-text")} +
    + + )} + + {!loggedIn && ( + <> +

    {t("login-header")}

    + + {oidcLogins.length > 0 && ( + <> +

    + {t("oidc-mit-id-header")} +

    + +
    + {oidcLogins.map((loginMethod) => ( + + ))} +
    + + )} + + {usernamePasswordLogins.length > 0 && + usernamePasswordLogins.map((loginMethod) => ( +
    +

    + {loginMethod.label ?? + t("os2-display-user-header")} +

    + +
    + setEmail(ev.target.value)} + value={email} + name="email" + label={t("email")} + required + /> + + setPassword(ev.target.value)} + value={password} + name="password" + label={t("password")} + type="password" + required + /> + + + +
    + ))} + + )}
    - )} - - {!ready && ( - - )} - - ); + +
    +
    +
    + )} + + {!ready && ( + + )} + + ); } export default Login; diff --git a/assets/admin/components/user/oidc-login.jsx b/assets/admin/components/user/oidc-login.jsx index 2b3d1e7e..af39c7ac 100644 --- a/assets/admin/components/user/oidc-login.jsx +++ b/assets/admin/components/user/oidc-login.jsx @@ -42,7 +42,7 @@ function OIDCLogin({ config }) { if (icon !== null) { if (icon === "mitID") { - iconRender = ; + iconRender = ; } else if (icon.indexOf("fa") === 0) { iconRender = ( @@ -56,13 +56,10 @@ function OIDCLogin({ config }) { * "v2/authentication/oidc/urls" session can be active at a time. */ const onClick = () => { - fetch( - `/v2/authentication/oidc/urls?providerKey=${provider}`, - { - mode: "cors", - credentials: "include", - } - ) + fetch(`/v2/authentication/oidc/urls?providerKey=${provider}`, { + mode: "cors", + credentials: "include", + }) .then((resp) => { resp.json().then((data) => { window.location.href = data.authorizationUrl; diff --git a/assets/admin/components/users/users-list.jsx b/assets/admin/components/users/users-list.jsx index dc91577c..e3d66022 100644 --- a/assets/admin/components/users/users-list.jsx +++ b/assets/admin/components/users/users-list.jsx @@ -37,7 +37,7 @@ function UsersList() { const [isDeleting, setIsDeleting] = useState(false); const [listData, setListData] = useState(); const [loadingMessage, setLoadingMessage] = useState( - t("loading-messages.loading-users") + t("loading-messages.loading-users"), ); const [items, setItems] = useState([]); diff --git a/assets/admin/components/util/drag-and-drop-table/drag-and-drop-table.jsx b/assets/admin/components/util/drag-and-drop-table/drag-and-drop-table.jsx index cacd7559..16394065 100644 --- a/assets/admin/components/util/drag-and-drop-table/drag-and-drop-table.jsx +++ b/assets/admin/components/util/drag-and-drop-table/drag-and-drop-table.jsx @@ -82,7 +82,7 @@ function DragAndDropTable({ const reorderedListOfPlaylists = reorder( data, result.source.index, - result.destination.index + result.destination.index, ); const target = { value: reorderedListOfPlaylists, id: name }; onDropped({ target }); @@ -133,7 +133,7 @@ function DragAndDropTable({ {...providedDraggable.dragHandleProps} style={getItemStyle( providedSnapshot.isDragging, - providedDraggable.draggableProps.style + providedDraggable.draggableProps.style, )} className={data.className ?? ""} > @@ -179,7 +179,7 @@ DragAndDropTable.propTypes = { name: PropTypes.string, id: PropTypes.string, className: PropTypes.string, - }) + }), ).isRequired, columns: ColumnProptypes.isRequired, name: PropTypes.string.isRequired, diff --git a/assets/admin/components/util/forms/checkbox-options.jsx b/assets/admin/components/util/forms/checkbox-options.jsx index 9ad11adb..cfe37f6f 100644 --- a/assets/admin/components/util/forms/checkbox-options.jsx +++ b/assets/admin/components/util/forms/checkbox-options.jsx @@ -57,7 +57,7 @@ CheckboxOptions.propTypes = { PropTypes.shape({ value: PropTypes.string.isRequired, title: PropTypes.string.isRequired, - }) + }), ), }), onChange: PropTypes.func.isRequired, diff --git a/assets/admin/components/util/forms/form-table/form-table.jsx b/assets/admin/components/util/forms/form-table/form-table.jsx index 1915c95e..4fd2004c 100644 --- a/assets/admin/components/util/forms/form-table/form-table.jsx +++ b/assets/admin/components/util/forms/form-table/form-table.jsx @@ -118,7 +118,7 @@ function FormTable({ name, onChange, formGroupClasses = "", value = [] }) { const removeColumn = (removeId) => { // remove column const columnsCopy = [...columns].filter( - (column) => column.accessor !== removeId + (column) => column.accessor !== removeId, ); setColumns(columnsCopy); @@ -155,7 +155,7 @@ function FormTable({ name, onChange, formGroupClasses = "", value = [] }) { }; } return row; - }) + }), ); }; @@ -248,10 +248,10 @@ FormTable.propTypes = { Header: PropTypes.string, accessor: PropTypes.string, key: PropTypes.string, - }) + }), ), type: PropTypes.string, - }) + }), ), formGroupClasses: PropTypes.string, onChange: PropTypes.func.isRequired, diff --git a/assets/admin/components/util/forms/multiselect-dropdown/groups/groups-dropdown.jsx b/assets/admin/components/util/forms/multiselect-dropdown/groups/groups-dropdown.jsx index 4088e64e..26a806e9 100644 --- a/assets/admin/components/util/forms/multiselect-dropdown/groups/groups-dropdown.jsx +++ b/assets/admin/components/util/forms/multiselect-dropdown/groups/groups-dropdown.jsx @@ -46,14 +46,14 @@ GroupsDropdown.propTypes = { value: PropTypes.string, label: PropTypes.number, disabled: PropTypes.bool, - }) + }), ), name: PropTypes.string.isRequired, errors: PropTypes.arrayOf(PropTypes.string), data: PropTypes.arrayOf( PropTypes.shape({ title: PropTypes.string, - }) + }), ).isRequired, }; diff --git a/assets/admin/components/util/forms/multiselect-dropdown/multi-dropdown.jsx b/assets/admin/components/util/forms/multiselect-dropdown/multi-dropdown.jsx index 6e5e6b5c..aa0e72b6 100644 --- a/assets/admin/components/util/forms/multiselect-dropdown/multi-dropdown.jsx +++ b/assets/admin/components/util/forms/multiselect-dropdown/multi-dropdown.jsx @@ -88,7 +88,7 @@ function MultiSelectComponent({ const optionsWithSelected = removeDuplicatesByKey( [...localMappedOptions, ...localMappedSelected], - "value" + "value", ); setMappedOptions(optionsWithSelected); @@ -111,7 +111,7 @@ function MultiSelectComponent({ return optionsToFilter.filter( ({ label: shadowLabel }) => - shadowLabel && shadowLabel.match(new RegExp(filter, "i")) + shadowLabel && shadowLabel.match(new RegExp(filter, "i")), ); }; @@ -128,16 +128,16 @@ function MultiSelectComponent({ if ("@id" in selectedAndOptions[0]) { selectedOptions = removeDuplicatesByKey( selectedAndOptions.filter((option) => - idsOfSelectedEntries.includes(option["@id"]) + idsOfSelectedEntries.includes(option["@id"]), ), - "@id" + "@id", ); } else { selectedOptions = removeDuplicatesByKey( selectedAndOptions.filter(({ id }) => - idsOfSelectedEntries.includes(id) + idsOfSelectedEntries.includes(id), ), - "id" + "id", ); } @@ -210,7 +210,7 @@ MultiSelectComponent.propTypes = { value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), label: PropTypes.string, disabled: PropTypes.bool, - }) + }), ), handleSelection: PropTypes.func.isRequired, selected: PropTypes.arrayOf( @@ -218,7 +218,7 @@ MultiSelectComponent.propTypes = { value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), label: PropTypes.string, disabled: PropTypes.bool, - }) + }), ), filterCallback: PropTypes.func, noSelectedString: PropTypes.string, diff --git a/assets/admin/components/util/forms/multiselect-dropdown/playlists/playlists-dropdown.jsx b/assets/admin/components/util/forms/multiselect-dropdown/playlists/playlists-dropdown.jsx index 5fcd618f..86682604 100644 --- a/assets/admin/components/util/forms/multiselect-dropdown/playlists/playlists-dropdown.jsx +++ b/assets/admin/components/util/forms/multiselect-dropdown/playlists/playlists-dropdown.jsx @@ -50,14 +50,14 @@ PlaylistsDropdown.propTypes = { value: PropTypes.number, label: PropTypes.string, disabled: PropTypes.bool, - }) + }), ).isRequired, helpText: PropTypes.string, filterCallback: PropTypes.func.isRequired, data: PropTypes.arrayOf( PropTypes.shape({ title: PropTypes.string, - }) + }), ).isRequired, name: PropTypes.string.isRequired, errors: PropTypes.arrayOf(PropTypes.string), diff --git a/assets/admin/components/util/forms/multiselect-dropdown/screens/screens-dropdown.jsx b/assets/admin/components/util/forms/multiselect-dropdown/screens/screens-dropdown.jsx index 93eb5afb..5b4ca755 100644 --- a/assets/admin/components/util/forms/multiselect-dropdown/screens/screens-dropdown.jsx +++ b/assets/admin/components/util/forms/multiselect-dropdown/screens/screens-dropdown.jsx @@ -51,13 +51,13 @@ ScreensDropdown.propTypes = { value: PropTypes.number, label: PropTypes.string, disabled: PropTypes.bool, - }) + }), ), filterCallback: PropTypes.func.isRequired, data: PropTypes.arrayOf( PropTypes.shape({ title: PropTypes.string, - }) + }), ).isRequired, name: PropTypes.string.isRequired, errors: PropTypes.arrayOf(PropTypes.string), diff --git a/assets/admin/components/util/forms/multiselect-dropdown/slides/slides-dropdown.jsx b/assets/admin/components/util/forms/multiselect-dropdown/slides/slides-dropdown.jsx index 3f015422..14cd4d34 100644 --- a/assets/admin/components/util/forms/multiselect-dropdown/slides/slides-dropdown.jsx +++ b/assets/admin/components/util/forms/multiselect-dropdown/slides/slides-dropdown.jsx @@ -45,14 +45,14 @@ SlidesDropdown.propTypes = { value: PropTypes.number, label: PropTypes.string, disabled: PropTypes.bool, - }) + }), ), name: PropTypes.string.isRequired, errors: PropTypes.arrayOf(PropTypes.string), data: PropTypes.arrayOf( PropTypes.shape({ title: PropTypes.string, - }) + }), ).isRequired, }; diff --git a/assets/admin/components/util/forms/multiselect-dropdown/tenants/tenants-dropdown.jsx b/assets/admin/components/util/forms/multiselect-dropdown/tenants/tenants-dropdown.jsx index e9ad28e6..c5d9a3da 100644 --- a/assets/admin/components/util/forms/multiselect-dropdown/tenants/tenants-dropdown.jsx +++ b/assets/admin/components/util/forms/multiselect-dropdown/tenants/tenants-dropdown.jsx @@ -41,14 +41,14 @@ TenantsDropdown.propTypes = { value: PropTypes.number, label: PropTypes.string, disabled: PropTypes.bool, - }) + }), ), name: PropTypes.string.isRequired, errors: PropTypes.arrayOf(PropTypes.string), data: PropTypes.arrayOf( PropTypes.shape({ title: PropTypes.string, - }) + }), ).isRequired, }; diff --git a/assets/admin/components/util/forms/radio-buttons.jsx b/assets/admin/components/util/forms/radio-buttons.jsx index 53b7c555..29e4a366 100644 --- a/assets/admin/components/util/forms/radio-buttons.jsx +++ b/assets/admin/components/util/forms/radio-buttons.jsx @@ -67,7 +67,7 @@ RadioButtons.propTypes = { PropTypes.shape({ id: PropTypes.string.isRequired, label: PropTypes.string.isRequired, - }) + }), ).isRequired, disabled: PropTypes.bool, handleChange: PropTypes.func.isRequired, diff --git a/assets/admin/components/util/forms/select.jsx b/assets/admin/components/util/forms/select.jsx index 5c6f5106..d9d98df8 100644 --- a/assets/admin/components/util/forms/select.jsx +++ b/assets/admin/components/util/forms/select.jsx @@ -115,7 +115,7 @@ Select.propTypes = { PropTypes.shape({ id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), title: PropTypes.string.isRequired, - }) + }), ).isRequired, disabled: PropTypes.bool, tooltip: PropTypes.string, diff --git a/assets/admin/components/util/gantt-chart.jsx b/assets/admin/components/util/gantt-chart.jsx index 9c9e431b..f63357a1 100644 --- a/assets/admin/components/util/gantt-chart.jsx +++ b/assets/admin/components/util/gantt-chart.jsx @@ -40,7 +40,7 @@ function GanttChart({ id, data, component }) { dateAxis.max = new Date( d.getFullYear() + 1, d.getMonth(), - d.getDate() + d.getDate(), ).getTime(); dateAxis.dateFormatter.dateFormat = "yyyy-MM-dd"; @@ -56,7 +56,7 @@ function GanttChart({ id, data, component }) { function redirect(ev) { if (ev.target.dataItem.dataContext.redirectPossible) { navigate( - `/${component}/edit/${idFromUrl(ev.target.dataItem.dataContext.id)}` + `/${component}/edit/${idFromUrl(ev.target.dataItem.dataContext.id)}`, ); } } @@ -102,7 +102,7 @@ GanttChart.propTypes = { regions: PropTypes.arrayOf(PropTypes.string), title: PropTypes.string, id: PropTypes.string, - }) + }), ).isRequired, id: PropTypes.string.isRequired, component: PropTypes.string.isRequired, diff --git a/assets/admin/components/util/list/list-button.jsx b/assets/admin/components/util/list/list-button.jsx index 3b6bd8fa..3ce938c4 100644 --- a/assets/admin/components/util/list/list-button.jsx +++ b/assets/admin/components/util/list/list-button.jsx @@ -35,7 +35,7 @@ function ListButton({ page: 1, itemsPerPage: 0, }, - { skip: !getData } + { skip: !getData }, ); } diff --git a/assets/admin/components/util/list/list.jsx b/assets/admin/components/util/list/list.jsx index 4dd87ec4..89010ca1 100644 --- a/assets/admin/components/util/list/list.jsx +++ b/assets/admin/components/util/list/list.jsx @@ -363,7 +363,7 @@ function List({ List.propTypes = { data: PropTypes.arrayOf( - PropTypes.shape({ name: PropTypes.string, id: PropTypes.string }) + PropTypes.shape({ name: PropTypes.string, id: PropTypes.string }), ).isRequired, columns: ColumnProptypes.isRequired, handleDelete: PropTypes.func, diff --git a/assets/admin/components/util/list/toast-component/display-toast.jsx b/assets/admin/components/util/list/toast-component/display-toast.jsx index 8493df50..ca7dec08 100644 --- a/assets/admin/components/util/list/toast-component/display-toast.jsx +++ b/assets/admin/components/util/list/toast-component/display-toast.jsx @@ -35,7 +35,7 @@ export function displayError(errorString, error) { } const displayText = `${errorString} ${errorText} ${dayjs().format( - "HH:mm:ss" + "HH:mm:ss", )}`; toast.error(displayText, { diff --git a/assets/admin/components/util/multi-and-table/select-groups-table.jsx b/assets/admin/components/util/multi-and-table/select-groups-table.jsx index 58a914a2..be8a0d48 100644 --- a/assets/admin/components/util/multi-and-table/select-groups-table.jsx +++ b/assets/admin/components/util/multi-and-table/select-groups-table.jsx @@ -47,7 +47,7 @@ function SelectGroupsTable({ page, id, }, - { skip: !id } + { skip: !id }, ); /** Map loaded data. */ @@ -58,7 +58,7 @@ function SelectGroupsTable({ newGroups = alreadySelectedGroups["hydra:member"].map( (localScreenGroup) => { return localScreenGroup[mappingId]; - } + }, ); } setTotalItems(alreadySelectedGroups["hydra:totalItems"]); diff --git a/assets/admin/components/util/multi-and-table/select-playlists-table.jsx b/assets/admin/components/util/multi-and-table/select-playlists-table.jsx index b101a08b..fd8dd514 100644 --- a/assets/admin/components/util/multi-and-table/select-playlists-table.jsx +++ b/assets/admin/components/util/multi-and-table/select-playlists-table.jsx @@ -44,7 +44,7 @@ function SelectPlaylistsTable({ handleChange, name, id = "", helpText }) { page, id, }, - { skip: !id } + { skip: !id }, ); /** Map loaded data. */ @@ -54,7 +54,7 @@ function SelectPlaylistsTable({ handleChange, name, id = "", helpText }) { const newPlaylists = alreadySelectedPlaylists["hydra:member"].map( ({ playlist }) => { return playlist; - } + }, ); setSelectedData([...selectedData, ...newPlaylists]); } diff --git a/assets/admin/components/util/multi-and-table/select-screens-table.jsx b/assets/admin/components/util/multi-and-table/select-screens-table.jsx index 21bb2d14..58afc35d 100644 --- a/assets/admin/components/util/multi-and-table/select-screens-table.jsx +++ b/assets/admin/components/util/multi-and-table/select-screens-table.jsx @@ -40,14 +40,14 @@ function SelectScreensTable({ handleChange, name, campaignId = "" }) { itemsPerPage: 10, page, }, - { skip: !campaignId } + { skip: !campaignId }, ); useEffect(() => { if (alreadySelectedScreens) { setTotalItems(alreadySelectedScreens["hydra:totalItems"]); const newScreens = alreadySelectedScreens["hydra:member"].map( - ({ screen }) => screen + ({ screen }) => screen, ); setSelectedData([...selectedData, ...newScreens]); } diff --git a/assets/admin/components/util/multi-and-table/select-slides-table.jsx b/assets/admin/components/util/multi-and-table/select-slides-table.jsx index a716cfcc..86481db6 100644 --- a/assets/admin/components/util/multi-and-table/select-slides-table.jsx +++ b/assets/admin/components/util/multi-and-table/select-slides-table.jsx @@ -41,7 +41,7 @@ function SelectSlidesTable({ handleChange, name, slideId = "" }) { itemsPerPage: 30, page, }, - { skip: !slideId } + { skip: !slideId }, ); const sortByStatus = () => { diff --git a/assets/admin/components/util/schedule/schedule.jsx b/assets/admin/components/util/schedule/schedule.jsx index 92736388..a8ec48c0 100644 --- a/assets/admin/components/util/schedule/schedule.jsx +++ b/assets/admin/components/util/schedule/schedule.jsx @@ -43,7 +43,7 @@ function Schedule({ schedules, onChange }) { useEffect(() => { const newSchedules = schedules.map((schedule) => - createScheduleFromRRule(schedule.id, schedule.duration, schedule.rrule) + createScheduleFromRRule(schedule.id, schedule.duration, schedule.rrule), ); setLocalSchedules(newSchedules); }, [schedules]); @@ -76,7 +76,7 @@ function Schedule({ schedules, onChange }) { const newLocalSchedules = [...localSchedules]; const index = newLocalSchedules.findIndex( - (schedule) => schedule.id === scheduleId + (schedule) => schedule.id === scheduleId, ); newLocalSchedules[index][targetId] = value; newLocalSchedules[index].rrule = getRruleString(newLocalSchedules[index]); @@ -91,7 +91,7 @@ function Schedule({ schedules, onChange }) { */ const removeSchedule = (scheduleId) => { const newLocalSchedules = [...localSchedules].filter( - (schedule) => schedule.id !== scheduleId + (schedule) => schedule.id !== scheduleId, ); onChange(newLocalSchedules); }; @@ -108,7 +108,7 @@ function Schedule({ schedules, onChange }) { } if (Array.isArray(value)) { return value.map((monthNumber) => - byMonthOptions.find((month) => month.value === monthNumber) + byMonthOptions.find((month) => month.value === monthNumber), ); } return []; @@ -135,9 +135,9 @@ function Schedule({ schedules, onChange }) { date.getMonth(), date.getDate(), date.getHours(), - date.getMinutes() - ) - ) + date.getMinutes(), + ), + ), ); }; @@ -312,8 +312,8 @@ function Schedule({ schedules, onChange }) { label={t("schedule.end")} value={getDateValue( new Date( - schedule.dtstart.getTime() + schedule.duration * 1000 - ) + schedule.dtstart.getTime() + schedule.duration * 1000, + ), )} name="end" onChange={({ target }) => @@ -361,7 +361,7 @@ function Schedule({ schedules, onChange }) { changeSchedule( schedule.id, target.id, - target.value + target.value, ) } value={schedule.freq} @@ -405,7 +405,7 @@ function Schedule({ schedules, onChange }) { } value={getTimeValue( schedule.byhour, - schedule.byminute + schedule.byminute, )} label={t("schedule.bytime")} type="time" @@ -433,8 +433,8 @@ function Schedule({ schedules, onChange }) { ? schedule.byweekday.map((weekdayNumber) => byWeekdayOptions.find( (weekDay) => - weekDay.value === weekdayNumber - ) + weekDay.value === weekdayNumber, + ), ) : [] } @@ -445,7 +445,7 @@ function Schedule({ schedules, onChange }) { clearSelected: t("schedule.clear-selection"), selectAll: t("schedule.selected-all"), selectSomeItems: t( - "schedule.select-some-options" + "schedule.select-some-options", ), }} labelledBy="Select" @@ -453,7 +453,7 @@ function Schedule({ schedules, onChange }) { changeSchedule( schedule.id, "byweekday", - value.map((v) => v.value) + value.map((v) => v.value), ); }} /> @@ -479,14 +479,14 @@ function Schedule({ schedules, onChange }) { clearSelected: t("schedule.clear-selection"), selectAll: t("schedule.selected-all"), selectSomeItems: t( - "schedule.select-some-options" + "schedule.select-some-options", ), }} onChange={(values) => changeSchedule( schedule.id, "bymonth", - values.map((v) => v.value) + values.map((v) => v.value), ) } /> @@ -516,7 +516,7 @@ function Schedule({ schedules, onChange }) { changeSchedule( schedule.id, target.id, - target.value + target.value, ) } name="byweekno" @@ -539,7 +539,7 @@ function Schedule({ schedules, onChange }) { {getNextOccurrences( schedule.rruleObject, schedule.duration, - schedule.count ? Math.min(schedule.count, 5) : 5 + schedule.count ? Math.min(schedule.count, 5) : 5, ).map((occurrence) => (
    {occurrence.text} @@ -571,7 +571,7 @@ Schedule.propTypes = { id: PropTypes.string.isRequired, rrule: PropTypes.string.isRequired, duration: PropTypes.number.isRequired, - }) + }), ).isRequired, onChange: PropTypes.func.isRequired, }; diff --git a/assets/admin/components/util/select-column-hoc.jsx b/assets/admin/components/util/select-column-hoc.jsx index a46715f9..0714aca4 100644 --- a/assets/admin/components/util/select-column-hoc.jsx +++ b/assets/admin/components/util/select-column-hoc.jsx @@ -46,7 +46,7 @@ function SelectColumnHoc(columns, omitStandardColumns) {
    {!tenants?.find( (tenant) => - tenant.tenantKey === context.selectedTenant.get.tenantKey + tenant.tenantKey === context.selectedTenant.get.tenantKey, ) && }