projects/lighthouses/app/dev/app.R

#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
#    http://shiny.rstudio.com/
#

library(someR)
library(shiny)
library(shinydashboard)
library(reactable)
library(reactablefmtr)
library(dplyr)
library(shiny)
library(shinycssloaders)

# Define UI for application that draws a histogram
ui <- # Define UI for application that draws a histogram

  dashboardPage(skin = "black",title="#lighthouselisten",

    ### HEADER ###
    dbHeader <- dashboardHeader(disable = F, title = "#lighthouselisten v2.0", dropdownMenuOutput("ddmenu")),

    ### SIDEBAR ###
    dashboardSidebar(disable = T, collapsed = T),

    ### BODY ###
    dashboardBody(

      # extend screen automatically
      tags$head(tags$style(HTML('.content-wrapper { overflow: auto; }'))),

      # current week
      fluidRow(
        column(
          width = 12,
            box(title = h3("Scoreboard"), width = 12, collapsible = T, solidHeader = F,
              tabsetPanel(type = "pills", selected = "Idag",
                tabPanel(
                  "Idag",
                  reactableOutput("curday_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Igår",
                  reactableOutput("lastday_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Denne Uge",
                  reactableOutput("curweek_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Sidste Uge",
                  reactableOutput("lastweek_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Denne Måned",
                  reactableOutput("curmonth_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Sidste Måned",
                  reactableOutput("lastmonth_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Dette År",
                  reactableOutput("curyear_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Sidste År",
                  reactableOutput("lastyear_table") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                )
              )
            ),
            box(title = h3("Tweets"), width = 12, collapsible = T, solidHeader = T,
              tabsetPanel(type = "pills", selected = "Idag",
                tabPanel(
                  "Idag",
                  reactableOutput("curday_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Igår",
                  reactableOutput("lastday_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Denne Uge",
                  reactableOutput("curweek_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Sidste Uge",
                  reactableOutput("lastweek_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Denne Måned",
                  reactableOutput("curmonth_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Sidste Måned",
                  reactableOutput("lastmonth_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Dette År",
                  reactableOutput("curyear_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                ),
                tabPanel(
                  "Sidste År",
                  reactableOutput("lastyear_tweets") %>% withSpinner(type = 2, color.background = "white", color="#438ccd", size = 3)
                )
              )
            )
          )
        )
      )
    )

# Define server logic required to draw a histogram
server <- shinyServer(function(input, output, session) {

  # Load Data for Scoreboard ----
  dat <- reactive({

    # load data
    con <- someR::con_sql()
    res <- dbSendQuery(
      con,
      "SELECT
        username,
        name,
        profile_image_url,
        variable,
        value
      FROM twitter_scoreboard
      WHERE list IN ('lighthouselisten')"
    )
    dat <- dbFetch(res, n = -1)
    dbClearResult(res)
    DBI::dbDisconnect(con)

    dat <- reshape2::dcast(
      dat,
      "username + name + profile_image_url ~ variable",
      value.var = "value"
    )



    return(dat)

  })

  # Load Data for Tweets ----
  dat_tweets <- reactive({

    # load data
    con <- someR::con_sql()
    res <- dbSendQuery(
      con,
      "SELECT
        *
        FROM twitter_tweets
        WHERE list IN ('lighthouselisten')
        AND variable IN (
          'name',
          'profile_image_url',
          'public_metrics_like_count',
          'public_metrics_retweet_count',
          'public_metrics_reply_count',
          'tweet_type',
          'text',
          'sentiment_mean',
          'sentiment_total',
          'impact'
        )
      "
    )
    dat <- dbFetch(res, n = -1)
    dbClearResult(res)
    DBI::dbDisconnect(con)

    dat <- reshape2::dcast(
      dat,
      formula = "id + username + created_at ~ variable"
    )

    # select columns and do filters
    dat %>% dplyr::select(
      profile_image_url,
      username,
      name,
      created_at,
      tweet_type,
      public_metrics_like_count,
      public_metrics_reply_count,
      public_metrics_retweet_count,
      impact,
      sentiment_total,
      text,
      id
    ) %>% dplyr::arrange(
      desc(created_at)
    ) -> dat_tweets

    # remove retweets and comments
    dat_tweets %>% dplyr::filter(
      tweet_type == "tweet"
    ) %>% dplyr::select(
      -tweet_type
    ) -> dat_tweets

    # derive time variables
    dat_tweets %>% dplyr::mutate(
      date = as.Date(created_at),
      year = lubridate::year(created_at),
      month = lubridate::month(created_at, label = T),
      week = lubridate::week(created_at),
      wday = lubridate::wday(created_at, label = T),
      hour = lubridate::hour(created_at)
    ) -> dat_tweets

    # format
    dat_tweets %>% dplyr::mutate(
      id = as.character(id),
      username = as.character(username),
      name = as.character(name),
      profile_image_url = as.character(profile_image_url),
      created_at = as.character(created_at),
      public_metrics_like_count = as.numeric(public_metrics_like_count),
      impact = as.numeric(impact),
      public_metrics_retweet_count = as.numeric(public_metrics_retweet_count),
      public_metrics_reply_count = as.numeric(public_metrics_reply_count),
      sentiment_total = as.numeric(sentiment_total),
      text = as.character(text)
    ) -> dat_tweets

    # this day
    dat_tweets %>% dplyr::filter(
      date == Sys.Date(),
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_curday

    # last day
    dat_tweets %>% dplyr::filter(
      date == Sys.Date()-1,
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_lastday

    # this week
    dat_tweets %>% dplyr::filter(
      year == lubridate::year(Sys.Date()),
      week == lubridate::week(Sys.Date())
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_curweek

    # last week
    dat_tweets %>% dplyr::filter(
      year == lubridate::year(Sys.Date()),
      week == lubridate::week(Sys.Date())-1
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_lastweek

    # this month
    dat_tweets %>% dplyr::filter(
      year == lubridate::year(Sys.Date()),
      month == lubridate::month(Sys.Date(), label = T)
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_curmonth

    # last month
    dat_tweets %>% dplyr::filter(
      year == lubridate::year(Sys.Date()),
      month == lubridate::month(lubridate::rollback(Sys.Date()), label = T)
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_lastmonth

    # this year
    dat_tweets %>% dplyr::filter(
      year == lubridate::year(Sys.Date())
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_curyear

    # last year
    dat_tweets %>% dplyr::filter(
      year == lubridate::year(Sys.Date())-1
    ) %>% dplyr::select(
      -date,
      -year,
      -month,
      -week,
      -wday,
      -hour
    ) %>% dplyr::arrange(
      desc(sentiment_total)
    ) -> dat_tweets_lastyear

    out <- list(
      curday = dat_tweets_curday,
      lastday = dat_tweets_lastday,
      curweek = dat_tweets_curweek,
      lastweek = dat_tweets_lastweek,
      curmonth = dat_tweets_curmonth,
      lastmonth = dat_tweets_lastmonth,
      curyear = dat_tweets_curyear,
      lastyear = dat_tweets_lastyear
    )

    return(out)

  })

  dblastupdate <- reactive({

    # load data
    con <- someR::con_sql()
    res <- dbSendQuery(con, "SELECT max(timestamp) FROM twitter_tweets_raw")
    dat <- dbFetch(res, n = -1)
    dbClearResult(res)
    DBI::dbDisconnect(con)

    val <- dat$`max(timestamp)`

    return(dat)

  })

  # design dropdownmenu
  output$ddmenu <- renderMenu(
    dropdownMenu(headerText = "",
      type = "notifications",
      messageItem(
        from = "Brug for hjælp?",
        message = "Skriv til @Fast4Ward_ på Twitter",
        icon = icon("life-ring"),
      ),
      notificationItem(
        text = paste0("Sidst Opdateret: ",dblastupdate()),
        icon = shiny::icon("refresh", ib = "glyphicon")
      )
    )
  )

  # Orchestrate Data for Scoreboard ----
  dat_tables <- reactive({

    ## Write to Log ----
    log <- data.frame(
      time = Sys.time() + 60*60*2
    )
    write.table(
      log,
      "/home/kasper/someR/projects/lighthouses/logs/visitors.csv", row.names = F, append = T, col.names = F
    )

    # Data for Current Day ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_curday,
      activity_curday,
      tweets_curday,
      comments_curday,
      retweets_curday,
      likes_curday,
      impact_curday,
      commentsprtweet_curday
    ) %>% dplyr::arrange(
      desc(likes_curday)
    ) -> table_curday
    table_curday[["placering"]] <- 1:nrow(table_curday)
    #table_curday[is.na(table_curday)] <- 0

    table_curday %>% dplyr::select(
      profile_image_url,
      name,
      followers_curday,

      placering,
      likes_curday,
      impact_curday,
      commentsprtweet_curday,
      retweets_curday,
      activity_curday,
      tweets_curday,
      comments_curday
    ) -> table_curday

    # Data for Last Day ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_lastday,
      activity_lastday,
      tweets_lastday,
      comments_lastday,
      retweets_lastday,
      likes_lastday,
      impact_lastday,
      commentsprtweet_lastday
    ) %>% dplyr::arrange(
      desc(likes_lastday)
    ) -> table_lastday
    table_lastday[["placering"]] <- 1:nrow(table_lastday)
    #table_lastday[is.na(table_lastday)] <- 0

    table_lastday %>% dplyr::select(
      profile_image_url,
      name,
      followers_lastday,

      placering,
      likes_lastday,
      impact_lastday,
      commentsprtweet_lastday,
      retweets_lastday,
      activity_lastday,
      tweets_lastday,
      comments_lastday
    ) -> table_lastday

    # Data for Current Week ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_curweek,
      activity_curweek,
      tweets_curweek,
      comments_curweek,
      retweets_curweek,
      likes_curweek,
      impact_curweek,
      commentsprtweet_curweek
    ) %>% dplyr::arrange(
      desc(likes_curweek)
    ) -> table_curweek
    table_curweek[["placering"]] <- 1:nrow(table_curweek)
    #table_curweek[is.na(table_curweek)] <- 0

    table_curweek %>% dplyr::select(
      profile_image_url,
      name,
      followers_curweek,

      placering,
      likes_curweek,
      impact_curweek,
      commentsprtweet_curweek,
      retweets_curweek,
      activity_curweek,
      tweets_curweek,
      comments_curweek
    ) -> table_curweek

    # Data for Last Week ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_lastweek,
      activity_lastweek,
      tweets_lastweek,
      comments_lastweek,
      retweets_lastweek,
      likes_lastweek,
      impact_lastweek,
      commentsprtweet_lastweek
    ) %>% dplyr::arrange(
      desc(likes_lastweek)
    ) -> table_lastweek
    table_lastweek[["placering"]] <- 1:nrow(table_lastweek)
    #table_lastweek[is.na(table_lastweek)] <- 0

    table_lastweek %>% dplyr::select(
      profile_image_url,
      name,
      followers_lastweek,

      placering,
      likes_lastweek,
      impact_lastweek,
      commentsprtweet_lastweek,
      retweets_lastweek,
      activity_lastweek,
      tweets_lastweek,
      comments_lastweek
    ) -> table_lastweek

    # Data for Current Month ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_curmonth,
      activity_curmonth,
      tweets_curmonth,
      comments_curmonth,
      retweets_curmonth,
      likes_curmonth,
      impact_curmonth,
      commentsprtweet_curmonth
    ) %>% dplyr::arrange(
      desc(likes_curmonth)
    ) -> table_curmonth
    table_curmonth[["placering"]] <- 1:nrow(table_curmonth)
    #table_curmonth[is.na(table_curmonth)] <- 0

    table_curmonth %>% dplyr::select(
      profile_image_url,
      name,
      followers_curmonth,

      placering,
      likes_curmonth,
      impact_curmonth,
      commentsprtweet_curmonth,
      retweets_curmonth,
      activity_curmonth,
      tweets_curmonth,
      comments_curmonth
    ) -> table_curmonth

    # Data for Last Month ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_lastmonth,
      activity_lastmonth,
      tweets_lastmonth,
      comments_lastmonth,
      retweets_lastmonth,
      likes_lastmonth,
      impact_lastmonth,
      commentsprtweet_lastmonth
    ) %>% dplyr::arrange(
      desc(likes_lastmonth)
    ) -> table_lastmonth
    table_lastmonth[["placering"]] <- 1:nrow(table_lastmonth)
    #table_lastmonth[is.na(table_lastmonth)] <- 0

    table_lastmonth %>% dplyr::select(
      profile_image_url,
      name,
      followers_lastmonth,

      placering,
      likes_lastmonth,
      impact_lastmonth,
      commentsprtweet_lastmonth,
      retweets_lastmonth,
      activity_lastmonth,
      tweets_lastmonth,
      comments_lastmonth
    ) -> table_lastmonth

    # Data for Current Year ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_curyear,
      activity_curyear,
      tweets_curyear,
      comments_curyear,
      retweets_curyear,
      likes_curyear,
      impact_curyear,
      commentsprtweet_curyear
    ) %>% dplyr::arrange(
      desc(likes_curyear)
    ) -> table_curyear
    table_curyear[["placering"]] <- 1:nrow(table_curyear)
    #table_curyear[is.na(table_curyear)] <- 0

    table_curyear %>% dplyr::select(
      profile_image_url,
      name,
      followers_curyear,

      placering,
      likes_curyear,
      impact_curyear,
      commentsprtweet_curyear,
      retweets_curyear,
      activity_curyear,
      tweets_curyear,
      comments_curyear
    ) -> table_curyear

    # Data for Last Year ----
    dat() %>% dplyr::select(
      username,
      name,
      profile_image_url,
      followers_lastyear,
      activity_lastyear,
      tweets_lastyear,
      comments_lastyear,
      retweets_lastyear,
      likes_lastyear,
      impact_lastyear,
      commentsprtweet_lastyear
    ) %>% dplyr::arrange(
      desc(likes_lastyear)
    ) -> table_lastyear
    table_lastyear[["placering"]] <- 1:nrow(table_lastyear)
    #table_lastyear[is.na(table_lastyear)] <- 0

    table_lastyear %>% dplyr::select(
      profile_image_url,
      name,
      followers_lastyear,

      placering,
      likes_lastyear,
      impact_lastyear,
      commentsprtweet_lastyear,
      retweets_lastyear,
      activity_lastyear,
      tweets_lastyear,
      comments_lastyear
    ) -> table_lastyear

    # put into list
    out <- list(
      curday = table_curday,
      lastday = table_lastday,
      curweek = table_curweek,
      lastweek = table_lastweek,
      curmonth = table_curmonth,
      lastmonth = table_lastmonth,
      curyear = table_curyear,
      lastyear = table_lastyear
    )

    return(out)

  })

  # Scoreboards ----

  ## Current Day Scoreboard ----
  output$curday_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["curday"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_curday = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_curday = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_curday = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_curday = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_curday = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_curday = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_curday = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_curday = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curday"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_curday")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_curday", "impact_curday","commentsprtweet_curday","retweets_curday"))
      )
    )
  })

  # Current Day Tweets ----
  output$curday_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["curday"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["curday"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })

  ## Last Day Scoreboard ----
  output$lastday_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["lastday"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_lastday = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_lastday = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_lastday = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_lastday = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_lastday = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_lastday = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_lastday = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastday"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_lastday = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastday"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_lastday")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_lastday", "impact_lastday","commentsprtweet_lastday","retweets_lastday"))
      )
    )
  })

  # Last Day Tweets ----
  output$lastday_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["lastday"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["lastday"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })

  ## Current Week Scoreboard ----
  output$curweek_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["curweek"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_curweek = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_curweek = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_curweek = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_curweek = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_curweek = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_curweek = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_curweek = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_curweek = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curweek"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_curweek")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_curweek", "impact_curweek","commentsprtweet_curweek","retweets_curweek"))
      )
    )
  })

  # Current Week Tweets ----
  output$curweek_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["curweek"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["curweek"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })

  ## Last Week Scoreboard ----
  output$lastweek_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["lastweek"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_lastweek = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_lastweek = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_lastweek = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_lastweek = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_lastweek = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_lastweek = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_lastweek = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastweek"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_lastweek = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastweek"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_lastweek")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_lastweek", "impact_lastweek","commentsprtweet_lastweek","retweets_lastweek"))
      )
    )
  })

  # Last Week Tweets ----
  output$lastweek_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["lastweek"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["lastweek"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })

  ## Current Month Scoreboard ----
  output$curmonth_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["curmonth"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_curmonth = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_curmonth = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_curmonth = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_curmonth = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_curmonth = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_curmonth = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_curmonth = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_curmonth = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curmonth"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_curmonth")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_curmonth", "impact_curmonth","commentsprtweet_curmonth","retweets_curmonth"))
      )
    )
  })

  # Current Month Tweets ----
  output$curmonth_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["curmonth"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["curmonth"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })

  ## Last Month Scoreboard ----
  output$lastmonth_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["lastmonth"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_lastmonth = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_lastmonth = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_lastmonth = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_lastmonth = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_lastmonth = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_lastmonth = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_lastmonth = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastmonth"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_lastmonth = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastmonth"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_lastmonth")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_lastmonth", "impact_lastmonth","commentsprtweet_lastmonth","retweets_lastmonth"))
      )
    )
  })

  # Last Month Tweets ----
  output$lastmonth_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["lastmonth"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["lastmonth"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })

  ## Current Year Scoreboard ----
  output$curyear_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["curyear"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_curyear = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_curyear = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_curyear = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_curyear = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_curyear = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_curyear = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_curyear = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_curyear = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["curyear"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_curyear")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_curyear", "impact_curyear","commentsprtweet_curyear","retweets_curyear"))
      )
    )
  })

  # Current Year Tweets ----
  output$curyear_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["curyear"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["curyear"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })

  ## Last Year Scoreboard ----
  output$lastyear_table <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tables()[["lastyear"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        followers_lastyear = colDef(
          name = paste(emo::ji("man"),emo::ji("woman"),"Følgere", sep = " "),
          align = "center",
          minWidth = 80
        ),
        placering = colDef(
          name = paste(emo::ji("trophy"), sep = " "),
          align = "center",
          minWidth = 40,
          cell = function(value) {
            # Render as an X mark or check mark
            if (value == 1) emo::ji("1st_place_medal") else if (value == 2) emo::ji("2nd_place_medal") else if (value == 3) emo::ji("3rd_place_medal") else value
          }
        ),
        likes_lastyear = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        impact_lastyear = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        commentsprtweet_lastyear = colDef(
          name = paste(emo::ji("handshake"),"Engagement", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        activity_lastyear = colDef(
          name = paste(emo::ji("runner"),"Aktivitet", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        tweets_lastyear = colDef(
          name = paste(emo::ji("bird"),"Tweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        comments_lastyear = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastyear"]], font_color = "black", highlighter = "#ECECEC")
        ),
        retweets_lastyear = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 80,
          style = highlight_max(dat_tables()[["lastyear"]], font_color = "black", highlighter = "#ECECEC")
        )
      ),
      columnGroups = list(
        colGroup(name = "Lighthouse", columns = c("name", "profile_image_url", "followers_lastyear")),
        colGroup(name = "Scoreboard", columns = c("placering", "likes_lastyear", "impact_lastyear","commentsprtweet_lastyear","retweets_lastyear"))
      )
    )
  })

  # Tweets Last Year Table ----
  output$lastyear_tweets <- renderReactable({

    reactable(
      theme = fivethirtyeight(),
      dat_tweets()[["lastyear"]],
      resizable = TRUE,
      sortable = TRUE,
      filterable = TRUE,
      searchable = TRUE,
      pagination = TRUE,
      fullWidth = TRUE,
      wrap = FALSE,
      defaultColDef = colDef(
        #header = function(value) gsub("_", "_", value, fixed = TRUE),
        #cell = function(value) format(value, nsmall = 1),
        align = "center",
        minWidth = 120,
        vAlign = "center"
      ),
      columns = list(
        profile_image_url = colDef(
          name = "",
          minWidth = 40,
          filterable = F,
          cell = embed_img(),
          html = TRUE
        ),
        name = colDef(
          name = paste(emo::ji("star"),"Navn", sep = " "),
          align = "left",
          minWidth = 180,
          style = list(position = "sticky", left = 0, background = "#fff", zIndex = 1),
          headerStyle = list(position = "sticky", left = 0, background = "#fff", zIndex = 1)
        ),
        username = colDef(
          name = paste(emo::ji("star"),emo::ji("link"), sep = " "),
          align = "center",
          minWidth = 60,
          cell = function(value) {
            url <- paste0("https://twitter.com/", value)
            shiny::tags$a(href = url, style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        ),
        created_at = colDef(
          name = paste0(emo::ji("date"), " Tidspunkt"),
          align = "center",
          minWidth = 140
        ),
        public_metrics_like_count = colDef(
          name = paste(emo::ji("heart"),"Likes", sep = " "),
          align = "center",
          minWidth = 40
        ),
        impact = colDef(
          name = paste(emo::ji("collision"),"Impact", sep = " "),
          align = "center",
          minWidth = 40
        ),
        sentiment_total = colDef(
          name = paste(emo::ji("yellow heart"),"Happiness (BETA)", sep = " "),
          align = "center",
          minWidth = 160,
          sortNALast = TRUE
        ),
        public_metrics_reply_count = colDef(
          name = paste(emo::ji("left_speech_bubble"),"Kommentarer", sep = " "),
          align = "center",
          minWidth = 40
        ),
        public_metrics_retweet_count = colDef(
          name = paste(emo::ji("recycling_symbol"),"Retweets", sep = " "),
          align = "center",
          minWidth = 40
        ),
        text = colDef(
          name = paste(emo::ji("bird"),"Tweet", sep = " "),
          align = "left",
          minWidth = 720
        ),
        id = colDef(
          name = paste(emo::ji("bird"),emo::ji("link"), sep = ""),
          align = "center",
          minWidth = 60,
          html = TRUE,
          cell = function(value, index) {
            url <- paste0("https://twitter.com/",dat_tweets()[["lastyear"]]$username[index],"/status/",value)
            shiny::tags$a(href = url,style="text-decoration: none;", target = "_blank", emo::ji("link"))
          }
        )
      )
    )
  })
})


# Run the application
shinyApp(ui = ui, server = server)
kasper2619/someR documentation built on May 21, 2023, 3:53 a.m.