-
- {row.original.user.username}
+
+
+ {row.original.user.username}
),
},
{
accessorKey: "currentlyPlaying", // currentlyPlaying.name can be undefined which results in a warning. This is why we use currentlyPlaying instead of currentlyPlaying.name
header: "Currently playing",
+ mantineTableHeadCellProps: {
+ style: {
+ fontSize: "7cqmin",
+ padding: "2cqmin",
+ width: "45%",
+ },
+ },
Cell: ({ row }) => {
if (row.original.currentlyPlaying) {
return (
-
- {row.original.currentlyPlaying.name}
-
+
+
+ {row.original.currentlyPlaying.name}
+
+
);
}
@@ -83,49 +116,153 @@ export default function MediaServerWidget({ integrationIds, isEditMode }: Widget
// Only render the flat list of sessions when the currentStreams change
// Otherwise it will always create a new array reference and cause the table to re-render
- const flatSessions = useMemo(() => currentStreams.flatMap((pair) => pair.sessions), [currentStreams]);
+ const flatSessions = useMemo(
+ () =>
+ currentStreams.flatMap((pair) =>
+ pair.sessions.map((session) => ({
+ ...session,
+ integrationKind: pair.integrationKind,
+ integrationName: integrationDefs[pair.integrationKind].name,
+ integrationIcon: getIconUrl(pair.integrationKind),
+ })),
+ ),
+ [currentStreams],
+ );
+ const baseStyle: MantineStyleProp = {
+ "--total-width": "calc(100cqw / var(--total-width))",
+ "--ratio-width": "calc(100cqw / var(--total-width))",
+ "--space-size": "calc(var(--ratio-width) * 0.1)", //Standard gap and spacing value
+ "--text-fz": "calc(var(--ratio-width) * 0.45)", //General Font Size
+ "--icon-size": "calc(var(--ratio-width) * 2 / 3)", //Normal icon size
+ "--mrt-base-background-color": "transparent",
+ };
+ const { openModal } = useModalAction(itemInfoModal);
const table = useTranslatedMantineReactTable({
columns,
data: flatSessions,
- enableRowSelection: false,
+ enablePagination: false,
+ enableTopToolbar: false,
+ enableBottomToolbar: false,
+ enableSorting: false,
+ enableColumnActions: false,
+ enableStickyHeader: false,
enableColumnOrdering: false,
+ enableRowSelection: false,
enableFullScreenToggle: false,
enableGlobalFilter: false,
enableDensityToggle: false,
enableFilters: false,
- enablePagination: true,
- enableSorting: true,
enableHiding: false,
- enableTopToolbar: false,
- enableColumnActions: false,
- enableStickyHeader: true,
initialState: {
density: "xs",
},
mantinePaperProps: {
- display: "flex",
- h: "100%",
+ flex: 1,
withBorder: false,
- style: {
- flexDirection: "column",
- },
+ shadow: undefined,
},
mantineTableProps: {
+ className: "media-server-widget-table",
style: {
tableLayout: "fixed",
},
},
mantineTableContainerProps: {
style: {
- flexGrow: 5,
+ height: "100%",
},
},
+ mantineTableBodyCellProps: ({ row }) => ({
+ onClick: () => {
+ openModal({
+ item: row.original,
+ title:
+ row.original.currentlyPlaying?.type === "movie" ? (
+
+ ) : row.original.currentlyPlaying?.type === "tv" ? (
+
+ ) : row.original.currentlyPlaying?.type === "video" ? (
+
+ ) : (
+
+ ),
+ });
+ },
+ }),
+ });
+
+ const uniqueIntegrations = Array.from(new Set(flatSessions.map((session) => session.integrationKind))).map((kind) => {
+ const session = flatSessions.find((session) => session.integrationKind === kind);
+ return {
+ integrationKind: kind,
+ integrationIcon: session?.integrationIcon,
+ integrationName: session?.integrationName,
+ };
});
return (
-
+
-
+
+ {uniqueIntegrations.map((integration) => (
+
+
+
+ {integration.integrationName}
+
+
+ ))}
+
+
);
}
+
+const itemInfoModal = createModal<{ item: StreamSession; title: React.ReactNode }>(({ innerProps }) => {
+ const t = useScopedI18n("widget.mediaServer.items");
+
+ return (
+
+
+ {innerProps.title}
+ {innerProps.item.currentlyPlaying?.name}
+
+ {innerProps.item.currentlyPlaying?.episodeName}
+ {innerProps.item.currentlyPlaying?.seasonName && (
+ <>
+ {" - "}
+ {innerProps.item.currentlyPlaying.seasonName}
+ >
+ )}
+
+
+
+
+
+
+ );
+}).withOptions({
+ defaultTitle() {
+ return "";
+ },
+ size: "auto",
+ centered: true,
+});
+
+const NormalizedLine = ({ itemKey, value }: { itemKey: string; value: string }) => {
+ return (
+
+ {itemKey}:
+ {value}
+
+ );
+};