diff --git a/frontend/styles/views/series/series-view.css b/frontend/styles/views/series/series-view.css index 1027485..5dbe703 100644 --- a/frontend/styles/views/series/series-view.css +++ b/frontend/styles/views/series/series-view.css @@ -37,3 +37,37 @@ background-color: var(--lumo-contrast-5pct); padding: var(--lumo-space-s) var(--lumo-space-l); } + +.v-grid-cell.red { + color: red; +} + +.v-grid-cell.yellow { + color: yellow; +} + +.v-grid-cell.green { + color: green; +} + +[part~="cell"].success { + background: green; +} + +.success { + background: green; +} + +.v-grid-cell.success { + color: green; +} + +.error { + color: red; +} + +series-cliffhanger + +series-cliffhanger-open + +series-open \ No newline at end of file diff --git a/src/main/java/at/windesign/application/data/entity/Serie.java b/src/main/java/at/windesign/application/data/entity/Serie.java index 22696f2..8866234 100644 --- a/src/main/java/at/windesign/application/data/entity/Serie.java +++ b/src/main/java/at/windesign/application/data/entity/Serie.java @@ -12,6 +12,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; +import java.util.Objects; import java.util.SortedMap; public class Serie @@ -146,6 +147,19 @@ public class Serie this.maxSeason = maxSeason; } + public String getSeriesStyle() + { + String style = ""; + + if(seriesCliffhanger) + style = style + "font-style: italic; "; + + if(Objects.equals(seriesStatus, "Returning Series")) + style = style + "font-weight: bold; "; + + return style; + } + @Override public String toString() { diff --git a/src/main/java/at/windesign/application/data/service/EpisodeService.java b/src/main/java/at/windesign/application/data/service/EpisodeService.java index fcae5f5..cfaf453 100644 --- a/src/main/java/at/windesign/application/data/service/EpisodeService.java +++ b/src/main/java/at/windesign/application/data/service/EpisodeService.java @@ -19,26 +19,26 @@ public class EpisodeService try { return jdbcTemplate.query("SELECT serie.seriesID seriesID," + - " serie.seriesName seriesName," + - " YEAR(serie.firstAired) seriesFirstAired," + - " serie.resolution seriesResolution," + - " serie.cliffhanger seriesCliffhanger," + - " serie.status seriesStatus," + - " serie.download seriesDownload," + - " season.seasonNumber seasonNumber," + - " episode.episodeNumber episodeNumber," + - " episode.state episodeState," + - " ( SELECT MIN(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) minSeason," + - " ( SELECT MAX(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) maxSeason" + - " FROM serie" + - " LEFT JOIN season ON serie.seriesID = season.seriesID" + - " LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" + - " WHERE season.seasonNumber != 0 OR" + - " serie.seriesID >= 1000000 " + - " ORDER BY serie.seriesName," + - " serie.firstAired," + - " season.seasonNumber," + - " episode.episodeNumber;", + " serie.seriesName seriesName," + + " YEAR(serie.firstAired) seriesFirstAired," + + " serie.resolution seriesResolution," + + " serie.cliffhanger seriesCliffhanger," + + " serie.status seriesStatus," + + " serie.download seriesDownload," + + " season.seasonNumber seasonNumber," + + " episode.episodeNumber episodeNumber," + + " episode.state episodeState," + + " ( SELECT MIN(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) minSeason," + + " ( SELECT MAX(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) maxSeason" + + " FROM serie" + + " LEFT JOIN season ON serie.seriesID = season.seriesID" + + " LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" + + " WHERE season.seasonNumber != 0 OR" + + " serie.seriesID >= 1000000 " + + " ORDER BY serie.seriesName," + + " serie.firstAired," + + " season.seasonNumber," + + " episode.episodeNumber;", (rs, rowNum) -> new Episode(rs.getInt("seriesID"), rs.getString("seriesName"), rs.getInt("seriesFirstAired"), rs.getString("seriesResolution"), rs.getBoolean("seriesCliffhanger"), rs.getString("seriesStatus"), rs.getString("seriesDownload"), rs.getInt("seasonNumber"), rs.getInt("episodeNumber"), rs.getInt("episodeState"), rs.getInt("minSeason"), rs.getInt("maxSeason"))); } catch(Exception e) diff --git a/src/main/java/at/windesign/application/views/Series/SeriesView.java b/src/main/java/at/windesign/application/views/Series/SeriesView.java index 7aba5b3..0fe2d8f 100644 --- a/src/main/java/at/windesign/application/views/Series/SeriesView.java +++ b/src/main/java/at/windesign/application/views/Series/SeriesView.java @@ -19,6 +19,8 @@ import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.server.StreamResource; import org.springframework.beans.factory.annotation.Autowired; +import com.vaadin.flow.data.renderer.ComponentRenderer; +import com.vaadin.flow.data.renderer.TemplateRenderer; import javax.imageio.ImageIO; import javax.xml.transform.stream.StreamSource; @@ -50,6 +52,9 @@ public class SeriesView extends Div implements AfterNavigationObserver private boolean isInitialized = false; + private Integer stateWidth = 4; + private Integer stateHeight = 20; + public SeriesView() { setId("series-view"); @@ -57,10 +62,12 @@ public class SeriesView extends Div implements AfterNavigationObserver serie = new Grid<>(); serie.addThemeVariants(GridVariant.LUMO_NO_BORDER); serie.setHeightFull(); - serie.addColumn(Serie::getSeriesName).setHeader("Series Name"); + serie.addColumn(TemplateRenderer.of("
[[item.name]]
") + .withProperty("name", Serie::getSeriesName) + .withProperty("style", Serie::getSeriesStyle)) + .setHeader("Series Name"); serie.addColumn(Serie::getSeriesFirstAired).setHeader("First Aired"); serie.addColumn(Serie::getSeriesResolution).setHeader("Resolution"); - serie.addColumn(Serie::getSeriesCliffhanger).setHeader("Cliffhanger"); serie.addItemDoubleClickListener( event -> @@ -68,6 +75,8 @@ public class SeriesView extends Div implements AfterNavigationObserver Notification.show("Clicked Item: " + event.getItem()); }); + serie.getColumns().forEach(col -> col.setAutoWidth(true)); + add(serie); } @@ -87,9 +96,6 @@ public class SeriesView extends Div implements AfterNavigationObserver final Integer sFinal = s; serie.addComponentColumn(i -> { -// StreamResource r = new StreamResource("image.png", () -> getImageInputStream(sFinal, i.getEpisodeState())); -// Image img = new Image(r, ""); -// return img; return new Image(new StreamResource("image.png", () -> getImageInputStream(sFinal, i.getEpisodeState())), ""); }).setHeader("Season " + sFinal); } @@ -125,10 +131,10 @@ public class SeriesView extends Div implements AfterNavigationObserver private InputStream getImageInputStream(Integer curSeason, SortedMap state) { - ByteArrayOutputStream imagebuffer = null; - Integer season = -1; - Integer episode = -1; - boolean found = false; + ByteArrayOutputStream imagebuffer = null; + Integer season = -1; + Integer episode = -1; + SortedMap seasonState = new TreeMap<>(); for(Integer key : state.keySet()) { @@ -136,13 +142,12 @@ public class SeriesView extends Div implements AfterNavigationObserver episode = key & 0xFF; if(season == curSeason) - { - found = true; + seasonState.put(episode, state.get(key)); + else if(season > curSeason) break; - } } - if(!found) + if(seasonState.size() == 0) { BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); Graphics2D drawable = image.createGraphics(); @@ -161,13 +166,38 @@ public class SeriesView extends Div implements AfterNavigationObserver } } - BufferedImage image = new BufferedImage(100, 10, BufferedImage.TYPE_INT_RGB); + BufferedImage image = new BufferedImage(stateWidth * seasonState.lastKey(), stateHeight, BufferedImage.TYPE_INT_RGB); Graphics2D drawable = image.createGraphics(); + Color colGrey = new Color(192, 192, 192); + Color colBlue = new Color(0, 0, 192); + Color colGreen = new Color(0, 192, 0); + Color colBlack = new Color(0, 0, 0); + Color col = colBlack; - drawable.setColor(Color.WHITE); - drawable.fillRect(0, 0, 100, 10); - drawable.setColor(Color.BLACK); - drawable.drawString("S" + season + "E" + episode, 5, 10); + drawable.setColor(colBlack); + drawable.fillRect(0, 0, stateWidth * seasonState.lastKey(), stateHeight); + + for(Integer key : seasonState.keySet()) + { + switch(seasonState.get(key)) + { + case 0: + col = colBlack; + break; + case 1: + col = colGrey; + break; + case 2: + col = colBlue; + break; + case 3: + col = colGreen; + break; + } + + drawable.setColor(col); + drawable.fillRect((key - 1) * stateWidth, 0, stateWidth - 1, stateHeight); + } try {