From 1a576846245505c2720622cf72fe15bb5b8b8d81 Mon Sep 17 00:00:00 2001 From: CyferShepard Date: Sun, 30 Mar 2025 13:39:25 +0200 Subject: [PATCH] update to session card design #342 --- .../components/sessions/session-card.jsx | 132 +++++---- src/pages/components/sessions/sessions.jsx | 42 ++- src/pages/css/sessions.css | 264 +++++++++--------- 3 files changed, 224 insertions(+), 214 deletions(-) diff --git a/src/pages/components/sessions/session-card.jsx b/src/pages/components/sessions/session-card.jsx index 5f1c7af..09e9263 100644 --- a/src/pages/components/sessions/session-card.jsx +++ b/src/pages/components/sessions/session-card.jsx @@ -86,20 +86,37 @@ function SessionCard(props) { } return ( - + +
+ props.data.session.DeviceName.toLowerCase().includes(item)) || "other" + : clientData.find((item) => props.data.session.Client.toLowerCase().includes(item)) || "other") + } + alt="" + /> +
setIPModalVisible(false)} ipAddress={ipAddressLookup} />
- - + + + - + + + + + {props.data.session.DeviceName} + + + + + - {props.data.session.DeviceName + - " - " + - props.data.session.Client + - " " + - props.data.session.ApplicationVersion} + {props.data.session.Client + " " + props.data.session.ApplicationVersion} - - {props.data.session.NowPlayingItem.VideoStream !== "" && - - {props.data.session.NowPlayingItem.VideoStream} + {props.data.session.NowPlayingItem.VideoStream !== "" && ( + + + - } - - {props.data.session.NowPlayingItem.AudioStream !== "" && - {props.data.session.NowPlayingItem.AudioStream} - } - - - {props.data.session.NowPlayingItem.SubtitleStream !== "" && + {props.data.session.NowPlayingItem.VideoStream} + + )} + {props.data.session.NowPlayingItem.AudioStream !== "" && ( + + + + + {props.data.session.NowPlayingItem.AudioStream} + + )} + {props.data.session.NowPlayingItem.SubtitleStream !== "" && ( + + + + + {props.data.session.NowPlayingItem.SubtitleStream} - } - - + + + )} + + + + {isRemoteSession(props.data.session.RemoteEndPoint) && - (window.env.JS_GEOLITE_ACCOUNT_ID ?? import.meta.env.JS_GEOLITE_ACCOUNT_ID) ? ( + (window.env.JS_GEOLITE_ACCOUNT_ID ?? import.meta.env.JS_GEOLITE_ACCOUNT_ID) ? ( showIPDataModal(props.data.session.RemoteEndPoint)} > - : {props.data.session.RemoteEndPoint} + {props.data.session.RemoteEndPoint} ) : ( - - : {props.data.session.RemoteEndPoint} - + {props.data.session.RemoteEndPoint} )} - - - props.data.session.DeviceName.toLowerCase().includes(item)) || "other" - : clientData.find((item) => props.data.session.Client.toLowerCase().includes(item)) || "other") - } - alt="" - /> + + ETA + + {getETAFromTicks( + props.data.session.NowPlayingItem.RunTimeTicks - props.data.session.PlayState.PositionTicks + )} + + @@ -191,14 +217,12 @@ function SessionCard(props) { - ) : (props.data.session.NowPlayingItem.Type === "Audio" && props.data.session.NowPlayingItem.Artists.length > 0) ? ( + ) : props.data.session.NowPlayingItem.Type === "Audio" && + props.data.session.NowPlayingItem.Artists.length > 0 ? ( - - {props.data.session.NowPlayingItem.Artists[0]} - + {props.data.session.NowPlayingItem.Artists[0]} - ) : - ( + ) : ( <> )} @@ -231,7 +255,7 @@ function SessionCard(props) { {props.data.session.UserPrimaryImageTag !== undefined ? ( ) : ( diff --git a/src/pages/components/sessions/sessions.jsx b/src/pages/components/sessions/sessions.jsx index d7597f0..00195b2 100644 --- a/src/pages/components/sessions/sessions.jsx +++ b/src/pages/components/sessions/sessions.jsx @@ -63,25 +63,21 @@ function Sessions() { return ""; } - let transcodeType = i18next.t("SESSIONS.DIRECT_PLAY"); let transcodeVideoCodec = ""; - if (row.TranscodingInfo && !row.TranscodingInfo.IsVideoDirect){ + if (row.TranscodingInfo && !row.TranscodingInfo.IsVideoDirect) { transcodeType = i18next.t("SESSIONS.TRANSCODE"); transcodeVideoCodec = ` -> ${row.TranscodingInfo.VideoCodec.toUpperCase()}`; } - let bitRate = convertBitrate( - row.TranscodingInfo - ? row.TranscodingInfo.Bitrate - : videoStream.BitRate); + let bitRate = convertBitrate(row.TranscodingInfo ? row.TranscodingInfo.Bitrate : videoStream.BitRate); const originalVideoCodec = videoStream.Codec.toUpperCase(); - - return `${i18next.t("VIDEO")}: ${transcodeType} (${originalVideoCodec}${transcodeVideoCodec} - ${bitRate})`; - } + + return `${transcodeType} (${originalVideoCodec}${transcodeVideoCodec} - ${bitRate})`; + }; const getAudioStream = (row) => { - let mediaTypeAudio = row.NowPlayingItem.Type === 'Audio'; + let mediaTypeAudio = row.NowPlayingItem.Type === "Audio"; let streamIndex = row.PlayState.AudioStreamIndex; if ((streamIndex === undefined || streamIndex === -1) && !mediaTypeAudio) { return ""; @@ -89,31 +85,29 @@ function Sessions() { let transcodeType = i18next.t("SESSIONS.DIRECT_PLAY"); let transcodeCodec = ""; - if (row.TranscodingInfo && !row.TranscodingInfo.IsAudioDirect){ + if (row.TranscodingInfo && !row.TranscodingInfo.IsAudioDirect) { transcodeType = i18next.t("SESSIONS.TRANSCODE"); transcodeCodec = ` -> ${row.TranscodingInfo.AudioCodec.toUpperCase()}`; } let bitRate = ""; if (mediaTypeAudio) { - bitRate = " - " + convertBitrate( - row.TranscodingInfo - ? row.TranscodingInfo.Bitrate - : row.NowPlayingItem.Bitrate); + bitRate = " - " + convertBitrate(row.TranscodingInfo ? row.TranscodingInfo.Bitrate : row.NowPlayingItem.Bitrate); } let originalCodec = ""; - if (mediaTypeAudio){ - + if (mediaTypeAudio) { originalCodec = `${row.NowPlayingItem.Container.toUpperCase()}`; - } - else if (row.NowPlayingItem.MediaStreams && row.NowPlayingItem.MediaStreams.length && streamIndex < row.NowPlayingItem.MediaStreams.length) { - originalCodec = row.NowPlayingItem.MediaStreams[streamIndex].Codec.toUpperCase(); + } else if ( + row.NowPlayingItem.MediaStreams && + row.NowPlayingItem.MediaStreams.length && + streamIndex < row.NowPlayingItem.MediaStreams.length + ) { + originalCodec = row.NowPlayingItem.MediaStreams[streamIndex].Codec.toUpperCase(); } - return originalCodec != "" ? `${i18next.t("AUDIO")}: ${transcodeType} (${originalCodec}${transcodeCodec}${bitRate})` - : `${i18next.t("AUDIO")}: ${transcodeType}`; - } + return originalCodec != "" ? `${transcodeType} (${originalCodec}${transcodeCodec}${bitRate})` : `${transcodeType}`; + }; const getSubtitleStream = (row) => { let result = ""; @@ -129,7 +123,7 @@ function Sessions() { } if (row.NowPlayingItem.MediaStreams && row.NowPlayingItem.MediaStreams.length) { - result = `${i18next.t("SUBTITLES")}: ${row.NowPlayingItem.MediaStreams[subStreamIndex].DisplayTitle}`; + result = `${row.NowPlayingItem.MediaStreams[subStreamIndex].DisplayTitle}`; } return result; diff --git a/src/pages/css/sessions.css b/src/pages/css/sessions.css index a488024..30253ff 100644 --- a/src/pages/css/sessions.css +++ b/src/pages/css/sessions.css @@ -1,207 +1,199 @@ - - .sessions-container { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(auto, 520px)); - grid-auto-rows: 200px;/* max-width+offset so 215 + 20*/ - /* margin-right: 20px; */ + display: grid; + grid-template-columns: repeat(auto-fit, minmax(auto, 520px)); + grid-auto-rows: 270px; /* max-width+offset so 215 + 20*/ + /* margin-right: 20px; */ +} +.session-details { + margin: 0px !important; + padding: 0px !important; +} + +.session-details-title { + color: lightgray !important; + min-width: 80px; + padding: 0px !important; +} + +.card-device-image-overlay { + position: absolute; + top: 5px; /* Adjust as needed */ + right: 5px; /* Adjust as needed */ + z-index: 10; /* Ensure it appears above other elements */ } .session-card { - display: flex; - color: white; - - background-color: grey; - /* box-shadow: 0 0 20px 5px rgba(0, 0, 0, 0.8); */ - - max-height: 180px; - max-width: 500px; - - /* margin-left: 20px; */ - /* margin-bottom: 10px; */ - - background-size: cover; - border-radius: 8px 8px 0px 8px; - - display: grid; - grid-template-columns: auto 1fr; - grid-template-rows: auto auto 1fr; - + position: relative; /* Add this */ + border: 0 !important; + background-color: var(--background-color) !important; + color: white; + max-width: 520px; + max-height: 220px; } .progress-bar { - - /* grid-row: 2 / 3; + /* grid-row: 2 / 3; grid-column: 1/3; */ - height: 5px; - background-color: #101010 !important; - border-radius: 0px 0px 8px 8px; - - + height: 5px; + background-color: #101010 !important; + border-radius: 0px 0px 8px 8px; } .progress-custom { - height: 100%; - background-color: #00A4DC; - transition: width 0.2s ease-in-out; - border-radius: 0px 0px 0px 8px; + height: 100%; + background-color: #00a4dc; + transition: width 0.2s ease-in-out; + border-radius: 0px 0px 0px 8px; } .card-banner { - max-height: inherit; - height: 215px; - grid-row: 1 / 2; - grid-column-start: 1; - + max-height: inherit; + height: 215px; + grid-row: 1 / 2; + grid-column-start: 1; } .card-details { - padding-left: 5px; - max-height: inherit; - width: inherit; + padding-left: 5px; + max-height: inherit; + width: inherit; - grid-row: 1 / 3; + grid-row: 1 / 3; - grid-column: 2 / 3; - backdrop-filter: blur(1px); - background-color: rgb(0, 0, 0, 0.6); - border-radius: 0px 8px 0px 0px; + grid-column: 2 / 3; + backdrop-filter: blur(1px); + background-color: rgb(0, 0, 0, 0.6); + border-radius: 0px 8px 0px 0px; } - -.card-banner-image { - border-radius: 8px 0px 0px 0px; - max-height: inherit; - /* box-shadow: 0 0 20px 5px rgba(0, 0, 0, 0.8); */ +.session-card-banner-image { + max-width: 160px !important; + padding: 0px !important; + margin: 0px !important; } .card-user { - display: grid; - grid-template-columns: auto 1fr; - grid-template-rows: auto auto; + display: grid; + grid-template-columns: auto 1fr; + grid-template-rows: auto auto; - bottom: 30px; - right: 0; - padding-right: 5px; - position: absolute; + bottom: 30px; + right: 0; + padding-right: 5px; + position: absolute; } - .session-card-user-image { - border-radius: 50%; - max-width: 30px; - max-height: 30px; - margin-right: 5px; + border-radius: 50%; + max-width: 30px; + max-height: 30px; + margin-right: 5px; } -.card-user-image-default -{ - /* width: 50px !important; */ - font-size: large; +.card-user-image-default { + /* width: 50px !important; */ + font-size: large; } - .card-username { - grid-row: 1 / 2; - grid-column: 2 / 3; + grid-row: 1 / 2; + grid-column: 2 / 3; } .card-username a { - text-decoration: none; - color: white; + text-decoration: none; + color: white; } - -.card-username:hover a{ - - color: rgb(0, 164, 219); - } - +.card-username:hover a { + color: rgb(0, 164, 219); +} .card-device { - margin-top: 5px; - display: grid; - grid-template-columns: auto 1fr; - grid-template-rows: auto auto; - /* grid-column-gap: 10px; */ + margin-top: 5px; + display: grid; + grid-template-columns: auto 1fr; + grid-template-rows: auto auto; + /* grid-column-gap: 10px; */ } .card-device-name { - font-size: small; - grid-row: 1 / 2; - grid-column: 2 / 3; + font-size: small; + grid-row: 1 / 2; + grid-column: 2 / 3; } .card-device-image { - max-width: 40px; - margin-top:5px; - width: 100%; - height: min-content; + max-width: 40px; + margin-top: 5px; + width: 100%; + height: min-content; } .card-client { - font-size: small; - grid-row: 2 / 3; - grid-column: 2 / 3; + font-size: small; + grid-row: 2 / 3; + grid-column: 2 / 3; } .card-item-name { - bottom: 45px; - margin-left: 5px; - max-width: 200px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + bottom: 45px; + margin-left: 5px; + max-width: 200px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; - - position: absolute; + position: absolute; } .card-playback-position { - bottom: 5px; - /* right: 5px; */ - /* text-align: right; */ - /* position: absolute; */ + bottom: 5px; + /* right: 5px; */ + /* text-align: right; */ + /* position: absolute; */ } .device-info { -margin-bottom: 100%; + margin-bottom: 100%; } .card-ip { - grid-row: 2 / 3; - grid-column: 2 / 3; + grid-row: 2 / 3; + grid-column: 2 / 3; } -.card-text >a{ - text-decoration: none !important; - color: white !important; - } - - .card-text a:hover{ - color: var(--secondary-color) !important; - } - - - .ellipse -{ - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 1; - overflow: hidden; - text-overflow: ellipsis; +.card-text > a { + text-decoration: none !important; + color: white !important; } +.card-text a:hover { + color: var(--secondary-color) !important; +} +.ellipse { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + overflow: hidden; + text-overflow: ellipsis; +} + +.session-card-item-image { + width: 160px !important; + height: 220px; + border-radius: 8px 0px 0px 0px !important; +} @media (max-width: 350px) { - .card-device-image { - display: none; - } + .card-device-image { + display: none; + } - .card-client-version, .session-card-user-image - { - display: none !important; - } - } \ No newline at end of file + .card-client-version, + .session-card-user-image { + display: none !important; + } +}