Added common files (geo layers, css, js and images) as well as the geo plot method and a mechanism to insert the mnr css etc files in the header

This commit is contained in:
2026-02-05 11:00:43 +00:00
parent 21c15a4f0d
commit a37e664c82
32 changed files with 1150 additions and 8 deletions

View File

@@ -12,5 +12,8 @@ RoxygenNote: 7.3.3
Imports:
AVSDevR.DBClient,
dplyr,
htmltools,
magrittr,
R6
plotly,
R6,
shiny

View File

@@ -7,7 +7,11 @@ export(MNR.DB.Applications)
export(MNR.DB.Geometries)
export(MNR.DB.Organisations)
export(MNR.DB.Users)
export(MNR.GeoPlot)
export(resourcePrefix)
export(use_mnr_ui)
import(dplyr)
import(plotly)
importFrom(AVSDevR.DBClient,DBClient)
importFrom(AVSDevR.DBClient,DBConnection)
importFrom(R6,R6Class)

View File

@@ -3,4 +3,5 @@
#' @importFrom AVSDevR.DBClient DBClient
#' @importFrom R6 R6Class
#' @import dplyr
#' @import plotly
NULL

View File

@@ -6,6 +6,7 @@ MNR.DB.Organisations <- R6::R6Class(
public = list(
getOrganisation = function(org_id, collect = TRUE) {
private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::filter(id == !!org_id) %>%
private$db_client$collectOrReturn()
},
@@ -55,9 +56,37 @@ MNR.DB.Organisations <- R6::R6Class(
}
},
getUsersFromOrg = function(org_name = "", org_id = -1, collect = TRUE) {
getOrganisationMembers = function(
org_name = "", org_id = -1, collect = TRUE
) {
private$db_client$table("users") %>%
dplyr::filter(flag_enabled == TRUE, flag_verified == TRUE) %>%
dplyr::filter(flag_enabled == TRUE) %>%
dplyr::filter(flag_verified == TRUE) %>%
dplyr::mutate(known_as = paste(first_name, last_name)) %>%
dplyr::left_join(
private$db_client$table("organisation_members") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::select(user_id, organisation_id),
by = c(id = "user_id")
) %>%
dplyr::inner_join(
private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::filter((id == !!org_id) | (name == !!org_name)) %>%
dplyr::select(id),
by = c(organisation_id = "id")
) %>%
dplyr::select(-organisation_id) %>%
private$db_client$collectOrReturn()
},
#' @depricated
getUsersFromOrg = function(org_name = "", org_id = -1, collect = TRUE) {
.Deprecated(new = "getOrganisationMembers")
private$db_client$table("users") %>%
dplyr::filter(flag_enabled == TRUE) %>%
dplyr::filter(flag_verified == TRUE) %>%
dplyr::mutate(known_as = paste(first_name, last_name)) %>%
dplyr::left_join(
private$db_client$table("organisation_members") %>%
@@ -76,6 +105,7 @@ MNR.DB.Organisations <- R6::R6Class(
isAgent = function(user_id) {
private$db_client$table("organisation_members") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::filter(user_id == !!user_id) %>%
dplyr::inner_join(
private$db_client$table("organisation_agents") %>%
@@ -87,9 +117,54 @@ MNR.DB.Organisations <- R6::R6Class(
magrittr::is_greater_than(0)
},
getOrganisationAgents = function(org_id, as_int = FALSE, collect = TRUE) {
qry <- private$db_client$table("organisation_agents") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::filter(organisation_id == !!org_id) %>%
dplyr::select(id = agent_id) %>%
dplyr::distinct() %>%
dplyr::left_join(
private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE),
by = "id"
)
if (as_int) {
qry %>%
dplyr::pull(id)
} else {
qry %>%
private$db_client$collectOrReturn()
}
},
getAgentRecipients = function(agent_id, as_int = FALSE, collect = TRUE) {
qry <- private$db_client$table("organisation_agents") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::filter(agent_id == !!agent_id) %>%
dplyr::select(id = organisation_id) %>%
dplyr::distinct() %>%
dplyr::left_join(
private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE),
by = "id"
)
if (as_int) {
qry %>%
dplyr::pull(id)
} else {
qry %>%
private$db_client$collectOrReturn()
}
},
#' @depricated
getAgentForOrganisations = function(
org_ids, as_int = FALSE, name_only = TRUE, collect = TRUE
) {
.Deprecated(new = "getOrganisationAgents")
qry <- private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::inner_join(
@@ -113,9 +188,12 @@ MNR.DB.Organisations <- R6::R6Class(
}
},
#' @depricated
getRecipientOrganisations = function(
org_id, as_int = FALSE, name_only = TRUE, collect = TRUE
) {
.Deprecated(new = "getAgentRecipients")
qry <- private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::inner_join(
@@ -139,16 +217,19 @@ MNR.DB.Organisations <- R6::R6Class(
}
},
#' @depricated
getUserOrgs = function(
user_id, as_int = TRUE, name_only = TRUE, collect = TRUE
) {
.Deprecated(new = "getUserOrganisation")
qry <- private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::left_join(
private$db_client$table("organisation_members") %>%
dplyr::select(user_id, organisation_id),
by = c(id = "organisation_id")
) %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::filter(user_id == !!user_id)
if (as_int) {
@@ -167,12 +248,13 @@ MNR.DB.Organisations <- R6::R6Class(
user_id, as_int = TRUE, name_only = TRUE, collect = TRUE
) {
qry <- private$db_client$table("organisations") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::left_join(
private$db_client$table("organisation_members") %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::select(user_id, organisation_id),
by = c(id = "organisation_id")
) %>%
dplyr::filter(flag_approved == TRUE) %>%
dplyr::filter(user_id == !!user_id) %>%
dplyr::slice_min(user_id, n = 1)

View File

@@ -14,13 +14,13 @@ MNR.DB.Users <- R6::R6Class(
},
getUser = function(user_id, collect = TRUE) {
db_uf$getUser(user_id, collect)
private$db_uf$getUser(user_id, collect)
},
getUserName = function(user_id) {
db_uf$getUserName(user_id)
private$db_uf$getUserName(user_id)
},
getUserRoles = function(user_id, collect = TRUE) {
db_uf$getUserRoles(user_id, collect)
private$db_uf$getUserRoles(user_id, collect)
},
isApplicationsAdmin = function(user_id) {

382
R/geoPlot.R Normal file
View File

@@ -0,0 +1,382 @@
#' @export
# nolint next: object_name_linter. R6Class
MNR.GeoPlot <- R6::R6Class(
"MNR.GeoPlot",
public = list(
initialize = function() {
private$bootGridLines()
},
bootLayers = function() {
private$boundaryIoM <- sf::st_read(
file.path(
system.file(package = "AVSDevR.MarineNoiseRegistry"),
"layers",
"20230411_IoM"
),
quiet = TRUE
)
private$boundaryMSFD <- sf::st_read(
file.path(
system.file(package = "AVSDevR.MarineNoiseRegistry"),
"layers",
"20250123_MSFD_BoundaryLine"
),
quiet = TRUE
)
private$boundaryUKCS <- sf::st_read(
file.path(
system.file(package = "AVSDevR.MarineNoiseRegistry"),
"layers",
"20230411_UKCSBoundary"
),
quiet = TRUE
)
private$boundaryUKTerritorial <- sf::st_read(
file.path(
system.file(package = "AVSDevR.MarineNoiseRegistry"),
"layers",
"20250123_UK_Territorial_Sea_Limit"
),
quiet = TRUE
)
},
bootQuadrants = function() {
old_opts <- options(sf_use_s2 = FALSE)
on.exit({
options(old_opts)
})
private$quadrants <- sf::st_read(
file.path(
system.file(package = "AVSDevR.MarineNoiseRegistry"),
"layers",
"20230411_OGBQuadrants"
),
quiet = TRUE
)
private$quadrant_annotations <- suppressWarnings({
private$quadrants %>%
dplyr::select(quadrnt) %>%
sf::st_centroid()
})
},
bootConservationAreas = function(db_client) {
old_opts <- options(sf_use_s2 = FALSE)
on.exit({
options(old_opts)
})
private$conservation_areas <- db_client$table("conservation_areas") %>%
dplyr::select(name, season, geom) %>%
db_client$collectGeometries() %>%
sf::st_sf() %>%
sf::st_cast("MULTIPOLYGON")
colour_palette <- private$conservation_areas %>%
dplyr::mutate(
colour = sapply(season, function(s) {
switch(
s,
Winter = "rgba(30,203,225,0.3)",
Summer = "rgba(225,52,30,0.3)",
"rgba(235,175,20,0.3)"
)
})
) %>%
dplyr::pull(colour)
private$conservation_area_colours <- private$conservation_areas %>%
sf::st_coordinates() %>%
tibble::as_tibble() %>%
dplyr::mutate(colour = colour_palette[L3]) %>%
dplyr::pull(colour)
},
makeBasePlot = function(
..., with_jncc_layers = TRUE, with_quadrants = FALSE,
with_conservation_areas = FALSE
) {
do.call(plotly::plot_ly, list(...)) %>%
private$addGridLines() %>%
private$addQuadrants(with_quadrants) %>%
private$addJNCCLayers(with_jncc_layers) %>%
private$addConservationAreas(with_conservation_areas) %>%
plotly::layout(
mapbox = list(style = "carto-positron"),
legend = list(
groupclick = "toggleitem",
itemdoubleclick = FALSE
),
xaxis = list(
title = list(text = "Longitude", font = list(size = 18)),
visible = FALSE,
# Grid:
showgrid = TRUE,
gridcolor = "#BEBEBE",
# Line:
showline = TRUE,
linewidth = 2,
linecolor = "#7F7F7F",
mirror = TRUE,
zeroline = FALSE,
# Ticks:
showticklabels = TRUE,
tickmode = "linear",
tick0 = 0,
dtick = 5,
ticksuffix = " &#176; W"
),
yaxis = list(
title = list(text = "Latitude", font = list(size = 18)),
visible = FALSE,
# Grid:
showgrid = TRUE,
gridcolor = "#BEBEBE",
# Line:
showline = TRUE,
linewidth = 2,
linecolor = "#7F7F7F",
mirror = TRUE,
zeroline = FALSE,
# Ticks:
showticklabels = TRUE,
tickmode = "linear",
tick0 = 0,
dtick = 5,
ticksuffix = " &#176; N"
)
)
},
boundMap = function(
p, c_lat = 56, c_lon = -5.5, zoom = 3.5, xmin = -25, ymin = 45, xmax = 5,
ymax = 65
) {
p %>%
plotly::layout(
mapbox = list(
zoom = zoom,
center = list(lat = c_lat, lon = c_lon),
`_fitBounds` = list(
bounds = list(list(xmin, ymin), list(xmax, ymax)),
options = list()
)
)
)
}
),
private = list(
major_lines = NULL,
minor_lines = NULL,
zero_lines = NULL,
boundaryIoM = NULL,
boundaryMSFD = NULL,
boundaryUKCS = NULL,
boundaryUKTerritorial = NULL,
quadrants = NULL,
quadrant_annotations = NULL,
conservation_areas = NULL,
conservation_area_colours = NULL,
bootGridLines = function() {
old_opts <- options(sf_use_s2 = FALSE)
on.exit({
options(old_opts)
})
points <- tibble::tibble()
for (lat in seq(-90, +90, 5)) {
points <- points %>%
dplyr::bind_rows(
tibble::tibble(
grp = nrow(points) + 1,
lat = lat,
lon = c(-180, 180),
is_major = (lat %% 10) == 0
)
)
}
for (lon in seq(-180, +175, 5)) {
points <- points %>%
dplyr::bind_rows(
tibble::tibble(
grp = nrow(points) + 1,
lat = c(-90, 90),
lon = lon,
is_major = (lat %% 10) == 0
)
)
}
suppressMessages({
private$major_lines <- points %>%
dplyr::filter(is_major) %>%
sf::st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
dplyr::group_by(grp) %>%
dplyr::summarise() %>%
sf::st_cast("LINESTRING")
private$minor_lines <- points %>%
dplyr::filter(!is_major) %>%
sf::st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
dplyr::group_by(grp) %>%
dplyr::summarise() %>%
sf::st_cast("LINESTRING")
private$zero_lines <- points %>%
dplyr::filter((lat == 0) | (lon == 0)) %>%
sf::st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
dplyr::group_by(grp) %>%
dplyr::summarise() %>%
sf::st_cast("LINESTRING")
})
},
addGridLines = function(p) {
p %>%
plotly::add_sf(
type = "scattermapbox",
data = private$minor_lines,
name = "minor_grid_lines",
line = list(width = 1),
color = I("#6161ff20"),
showlegend = FALSE,
hoverinfo = I("skip")
) %>%
plotly::add_sf(
type = "scattermapbox",
data = private$major_lines,
name = "major_grid_lines",
line = list(width = 2),
color = I("#6161ff30"),
showlegend = FALSE,
hoverinfo = I("skip")
) %>%
plotly::add_sf(
type = "scattermapbox",
data = private$zero_lines,
name = "zero_grid_lines",
line = list(width = 2),
color = I("#3131ff40"),
showlegend = FALSE,
hoverinfo = I("skip")
)
},
addJNCCLayers = function(p, with_jncc_layers) {
if (length(with_jncc_layers) == 0 || !with_jncc_layers) {
return(p)
}
if (is.null(private$boundaryIoM)) {
rlang::abort(
"JNCC layers have not been loaded. Call bootLayers first!"
)
}
p %>%
plotly::add_sf(
type = "scattermapbox",
data = dplyr::bind_rows(
sf::st_cast(private$boundaryUKCS, "LINESTRING", warn = FALSE),
sf::st_cast(private$boundaryIoM, "LINESTRING", warn = FALSE),
sf::st_cast(private$boundaryMSFD, "LINESTRING", warn = FALSE)
),
fillcolor = "#96005b00",
line = list(width = 1.5),
color = I("#96005b"),
name = "UKMS Sub-region Borders",
legendgrouptitle = list(text = "<b>Regional Boundaries</b>"),
legendgroup = "regional_boundaries",
legendrank = 850,
hoverinfo = I("skip")
) %>%
plotly::add_sf(
type = "scattermapbox",
data = private$boundaryUKCS,
fillcolor = "#00000000",
line = list(width = 1.5),
color = I("#000000"),
name = "UK Continental Shelf",
legendgrouptitle = list(text = "<b>Regional Boundaries</b>"),
legendgroup = "regional_boundaries",
legendrank = 800,
hoverinfo = I("skip")
) %>%
plotly::add_sf(
type = "scattermapbox",
data = private$boundaryUKTerritorial,
fillcolor = "#008ac100",
line = list(width = 1),
color = I("#008ac1"),
name = "UK Territorial Sea Limit",
legendgrouptitle = list(text = "<b>Regional Boundaries</b>"),
legendgroup = "regional_boundaries",
legendrank = 800,
hoverinfo = I("skip")
)
},
addQuadrants = function(p, with_quadrants) {
if (length(with_quadrants) == 0 || !with_quadrants) {
return(p)
}
if (is.null(private$quadrants)) {
rlang::abort(
"Quadrants have not been loaded. Call bootQuadrants first!"
)
}
p %>%
plotly::add_sf(
type = "scattermapbox",
data = private$quadrants,
fillcolor = "rgba(0,0,0,0)",
line = list(width = 1),
color = I("#bebebe"),
name = "Oil & Gas Quadrants",
legendgrouptitle = list(text = "<b>Oil & Gas</b>"),
legendgroup = "oil_and_gas",
legendrank = 900,
hoverinfo = I("none")
) %>%
plotly::add_sf(
type = "scattermapbox",
data = private$quadrant_annotations,
color = I("#bebebe00"),
name = "Oil & Gas Quadrant Labels",
showlegend = FALSE,
text = ~quadrnt,
hoverinfo = I("text"),
hovertemplate = I("O&G Quadrant: %{text}<extra></extra>")
)
},
addConservationAreas = function(p, with_conservation_areas) {
if (length(with_conservation_areas) == 0 || !with_conservation_areas) {
return(p)
}
if (is.null(private$conservation_areas)) {
rlang::abort(
"Conservation Areas have not been loaded. \
Call bootConservationAreas first!"
)
}
p %>%
plotly::add_sf(
type = "scattermapbox",
data = private$conservation_areas,
fillcolor = private$conservation_area_colours,
line = list(width = 0),
color = I(private$conservation_area_colours),
name = ~paste0(name, " (", season, ")"),
legendgrouptitle = list(
text = "<b>Special Areas of Conservation</b>"
),
legendgroup = "conservation_areas",
legendrank = 950
)
}
)
)

36
R/use_mnr_ui.R Normal file
View File

@@ -0,0 +1,36 @@
#' @export
use_mnr_ui <- function() {
attachResourcePaths()
htmltools::tags$head(
htmltools::singleton(
htmltools::HTML(paste0(
"<link href='", resourcePrefix(), "/css/mnr.css' rel='stylesheet'>"
))
),
htmltools::singleton(
htmltools::HTML(paste0(
"<link href='", resourcePrefix(),
"/css/mnr-shiny.css' rel='stylesheet'>"
))
),
htmltools::singleton(
htmltools::HTML(paste0(
"<script src='", resourcePrefix(), "js/frameHeight.js'></script>"
))
)
)
}
#' @export
resourcePrefix <- function() {
paste0("avsdev_mnr_", utils::packageVersion("AVSDevR.MarineNoiseRegistry"))
}
attachResourcePaths <- function() {
if (!(resourcePrefix() %in% names(shiny::resourcePaths()))) {
shiny::addResourcePath(
resourcePrefix(),
system.file("www", package = "AVSDevR.MarineNoiseRegistry")
)
}
}

3
R/zzz.R Normal file
View File

@@ -0,0 +1,3 @@
.onAttach <- function(libname, pkgname) {
attachResourcePaths()
}

Binary file not shown.

View File

@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433],METADATA["World",-180.0,-90.0,180.0,90.0,0.0,0.0174532925199433,0.0,1262]]

View File

@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

View File

@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

View File

@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

View File

@@ -0,0 +1,8 @@
div.selectize-input > div.item {
line-height: 41px;
}
input[type="text"], input[type="password"], input[type="number"] {
font-size: 12pt !important;
height: 41px !important;
}

567
inst/www/css/mnr.css Normal file
View File

@@ -0,0 +1,567 @@
/* JNCC preferred font */
*, body, h1, h2, h3, h4, h5, h6, th {
font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
body, th {
/* font-size: 14.25pt; */
font-size: 12pt;
}
h1 {
font-size: 31.5pt;
}
h2 {
font-size: 22.5pt;
}
h3 {
font-size: 21pt;
}
h4 {
font-size: 19pt;
}
h5 {
font-size: 15pt;
}
h6 {
font-size: 12pt;
}
.tablesorter-bootstrap tfoot td, .tablesorter-bootstrap tfoot th, .tablesorter-bootstrap thead td, .tablesorter-bootstrap thead th {
font-size: 12pt !important;
}
/*
* Skin: Green - JNCC
* -----------
*/
.skin-green .main-header .navbar {
background-color: #3f9c35 !important;
}
.skin-green .main-header .navbar .sidebar-toggle:hover {
background-color: #36822c !important;
}
@media (max-width: 767px) {
.skin-green .main-header .navbar .dropdown-menu li a:hover {
background: #36822c !important;
}
}
.skin-green .main-header .logo {
background-color: #36822c !important;
}
.skin-green .main-header .logo:hover {
background-color: #337a2a !important;
}
.skin-green .main-header li.user-header {
background-color: #3f9c35 !important;
}
.skin-green .sidebar-menu > li.active > a {
border-left-color: #3f9c35 !important;
}
.widget-user-header.bg-green {
background-color: #3f9c35 !important;
}
.bg-success, .alert-success, .bg-green {
background-color: #3f9c35 !important;
}
.box-success {
border: 1px solid #3f9c35 !important;
}
.box-success > .box-header {
background-color: #3f9c35 !important;
}
.btn-success {
background-color: #3f9c35 !important;
}
.btn-success:hover {
background-color: #008d4c !important;
}
.box.box-solid > .box-header .btn:hover, .box.box-solid > .box-header a:hover {
background: rgba(0, 0, 0, 0.1) !important;
}
.table.dataTable tbody td.active,
.table.dataTable tbody tr.active td {
background-color: #3f9c35 !important;
}
table.dataTable tbody tr.selected > * {
box-shadow: inset 0 0 0 9999px #3f9c35 !important;
}
table.dataTable.hover tbody tr.selected:hover > *,
table.dataTable.display tbody tr.selected:hover > * {
box-shadow: inset 0 0 0 9999px #44a939 !important;
}
/* Cookie control banner */
.ccc-notify-text {
margin-top: 7em;
margin-bottom: 7em;
padding-right: 2em;
}
/* AdminLTE overrides - Including for accessibility*/
.callout.callout-warning, .callout.callout-info, .alert-warning, .alert-info {
font-size: 18pt;
}
.callout.callout-success, .alert-success {
font-size: 18pt;
/* background-color: #36822c !important; */
}
.callout.callout-danger, .alert-danger, .alert-error {
background-color: #DA3A25 !important;
}
.alert .close {
font-size: 30pt;
top: -15px;
}
.main-header {
position: fixed;
top: 0;
width: 100%;
}
.main-header .logo {
font-size: 15pt;
width: 270px;
}
@media (max-width: 767px) {
.main-header .logo, .main-header .navbar {
width: 100%;
}
}
.main-header .navbar {
margin-left: 270px;
}
@media (max-width: 767px) {
.main-header .navbar {
margin-left: 0px;
}
}
.main-sidebar {
position: fixed;
top: 0;
width: 270px;
}
@media (max-width: 767px) {
.main-sidebar {
-webkit-transform: translate(-270px, 0);
-ms-transform: translate(-270px, 0);
-o-transform: translate(-270px, 0);
transform: translate(-270px, 0);
}
}
.main-header .sidebar-toggle {
line-height: 20px;
}
.main-sidebar .user-panel .info p {
white-space: break-spaces;
}
.sidebar-menu {
/* height: calc(100vh - 125px); */
position: fixed;
width: 270px;
overflow-y: scroll;
top: 125px;
bottom: 0;
height: auto;
-webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out;
-moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out;
-o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out;
transition: transform 0.3s ease-in-out, width 0.3s ease-in-out;
}
.sidebar-menu:hover {
overflow-y: scroll;
}
.sidebar-mini.sidebar-collapse .sidebar-menu {
width: 50px;
-webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out;
-moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out;
-o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out;
transition: transform 0.3s ease-in-out, width 0.3s ease-in-out;
}
@media (max-width: 767px) {
.sidebar-menu {
top: 175px;
}
}
@media (max-width: 767px) {
.sidebar-open .content-wrapper, .sidebar-open .main-footer {
-webkit-transform: translate(270px, 0);
-ms-transform: translate(270px, 0);
-o-transform: translate(270px, 0);
transform: translate(270px, 0);
}
}
.content-header h1 {
font-size: 30pt;
}
.content-wrapper {
margin-top: 50px;
}
@media (max-width: 767px) {
.content-wrapper {
margin-top: 100px;
}
}
.content-wrapper, .main-footer {
margin-left: 270px;
}
@media (max-width: 767px) {
.content-wrapper, .main-footer {
margin-left: 0;
}
}
.widget-user-desc a {
font-size: 14pt;
color: #FFFFFF;
font-weight: bold;
}
.widget-user-desc a:hover {
color: #BBBBFF;
}
.widget-user-2 .widget-user-username {
font-weight: bolder;
}
/* AdminLTE extensions */
.widget-user-3 .widget-user-header {
padding: 20px;
border-top-right-radius: 3px;
border-top-left-radius: 3px;
}
.widget-user-3 h1 {
padding: 0px;
margin: 0px;
font-size: 18pt;
}
.login-box-footer {
margin-top: 20px;
}
/* UF extensions */
.page-description {
font-size: 14pt;
padding-top: 4px;
color: #6D6D6D;
}
/* Navbar tweaks */
.landing-nav > .container{
display: flex;
}
.navbar-spacer {
display: inline-block;
flex-grow: 1;
padding-top: 15px;
padding-bottom: 15px;
line-height: 20px;
color: #ffffff;
font-weight: bolder;
z-index: 900;
}
.landing-nav .collapse {
float: right;
}
.landing-nav .navbar-spacer {
display: none;
}
.landing-nav > .container > .navbar-spacer {
display: inline-block;
}
@media (max-width: 767px) {
.landing-nav > .container{
display: inherit;
}
.landing-nav .collapse {
float: none;
}
.landing-nav .navbar-spacer {
display: inline-block;
}
.landing-nav > .container > .navbar-spacer {
display: none;
}
}
.landing-nav > .container{
display: flex;
}
.navbar-beta {
display: inline-block;
flex-grow: 1;
padding-top: 15px;
padding-bottom: 15px;
line-height: 20px;
color: #ffffff;
font-weight: bolder;
z-index: 900;
}
.navbar-brand .navbar-beta {
font-size: 18pt;
font-weight: normal;
}
.navbar-beta a {
color: #ffffff;
}
.landing-nav .collapse {
float: right;
}
.landing-nav.navbar-beta {
font-size: 18pt;
display: none;
}
.landing-nav > .container > .navbar-beta {
display: inline-block;
}
@media (max-width: 767px) {
.landing-nav > .container {
display: inherit;
}
.landing-nav .collapse {
float: none;
}
.landing-nav.navbar-beta {
display: inline-block;
}
.navbar-brand .navbar-beta {
display: none;
}
.landing-nav > .container > .navbar-beta {
display: none;
}
}
@media (min-width: 900px) {
.public-app-frame {
width: 90vw;
}
}
@media (max-width: 900px) {
.public-app-frame {
width: 100vw;
}
}
/* Cookies table */
.table-cookies {
border: 1px solid #888888 !important;
max-width: 80%;
margin-left: auto;
margin-right: auto;
}
.table-cookies th, .table-cookies td {
border: 1px solid #888888 !important;
}
.table-cookies thead th, .table-cookies thead td {
border-bottom-width: 2px !important;
}
/* Good/Bad list styling */
ul.good-list {
list-style-type: '\2713';
}
ul.good-list li::marker {
color: #3c763d;
font-size: 24px;
line-height: 1.1;
}
ul.bad-list {
list-style-type: '\2717';
}
ul.bad-list li::marker {
color: #a94442;
font-size: 24px;
line-height: 1.1;
}
/* */
.anchor-location {
padding-top: 60px;
margin-top: -60px;
}
@media (max-width: 767px) {
.anchor-location {
padding-top: 120px;
margin-top: -120px;
}
}
.switch {
top: 5px;
}
.switch-label {
font-weight: normal;
}
.modal-title {
font-size: 21pt;
}
/* Accessibility overrides */
a {
color: #286080;
}
p a, h1 a, h2 a, h3 a, h4 a, td a, .content li a, .message-banner a, .link {
color: #286080;
text-decoration: underline;
}
.dropdown-menu a {
color: #286080;
text-decoration: none !important;
}
a:hover,
a:active,
a:focus {
text-decoration: underline;
color: #72afd2;
}
.login-box-footer a {
text-decoration: underline;
}
.btn {
font-size: 14pt;
/*
font-size: 12pt;
*/
font-weight: bold;
}
.btn-info {
background-color: #009FC7;
}
.btn-warning {
background-color: #CB820B;
}
.text-muted {
color: #6D6D6D;
}
.login-box-body h2 {
font-size: 16pt;
font-weight: bold;
}
input[type="text"], input[type="password"], input[type="number"] {
/*
font-size: 14pt !important;
height: 41px !important;
*/
font-size: 12pt !important;
height: 37px !important;
}
.content-jump-link {
position: absolute;
left: -10000px;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
}
.content-jump-link:focus {
position: static;
width: auto;
height: auto;
}
.box-header > i {
font-weight: bolder;
font-size: 18pt !important;
}
.box-title {
font-weight: bolder;
font-size: 18pt !important;
}
.breadcrumb li {
font-size: 14pt;
color: #6B6B6B;
}
.breadcrumb li:active {
font-size: 14pt;
color: #6B6B6B;
}
.breadcrumb > .active {
color: #6B6B6B;
}
.breadcrumb > li + li::before {
content: "/\00a0" !important;
color: #6B6B6B;
}
.dropdown-menu {
font-size: 12pt;
}
.navbar-brand {
font-size: 24pt;
line-height: 27.15px;
padding: 0px;
}
@media (max-width: 767px) {
.navbar-brand {
font-size: 20pt;
padding: 15px;
}
}
.navbar-brand a {
color: #FFFFFF;
}
.navbar .nav > li > a {
font-size: 14pt;
font-weight: bold;
}
.navbar .nav .dropdown-menu a {
font-size: 14pt;
}
.sidebar-toggle {
font-size: 14pt;
}
.login-logo a {
text-decoration: none;
}
.skin-green .sidebar-menu > li.header {
color: #70979E;
font-weight: bolder;
}
.uf-table-info {
color: #757575;
}
.label {
padding-top: 0.5em;
}
.btn-xs, .btn-group-xs > .btn {
padding: 1px 5px;
}
.badge {
padding: 6px 9px 3px 9px;
}

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 469.608 469.608" style="enable-background:new 0 0 469.608 469.608;" xml:space="preserve">
<g color="white">
<path stroke="currentcolor" fill="currentcolor" d="M469.319,393.442c-6.666-23.331-32.769-68.993-37.333-76.886c-1.341-6.537-7.994-35.272-27.521-70.626
c-19.823-35.888-57.234-85.49-123.144-119.301c-7.696-20.583,3.65-30.175,18.127-39.652c3.123-2.045,5.591-3.66,7.428-5.497
c1.97-1.97,2.686-4.871,1.857-7.531c-0.827-2.661-3.063-4.643-5.803-5.148c-36.537-6.732-63.44,3.299-79.568,12.899
c-12.168,7.243-20.183,15.305-24.095,19.763c-24.559-2.471-48.747-0.317-71.928,6.564c-52.111,15.468-81.911,48.536-92.304,62.036
c-9.396,12.205-14.68,26.871-15.279,42.41l-0.007,0.179c-0.222,6.346-2.134,12.43-5.529,17.594
c-20.086,30.542-15.226,46.029-7.611,53.644c14.286,14.285,35.165-0.543,51.941-12.459c8.523-6.053,17.337-12.312,22.859-13.393
c1.928-0.377,4.279-0.926,7.255-1.622c6.936-1.62,17.006-3.968,29.851-5.962c2.775,3.399,7.632,9.11,13.555,15.066
c12.931,13.001,24.302,20.469,33.799,22.195c0.446,0.081,0.896,0.121,1.342,0.121c1.742,0,3.446-0.607,4.806-1.742
c1.708-1.425,2.694-3.534,2.694-5.758c0-7.312-0.833-23.804-1.372-33.694c3.846,0.053,7.793,0.175,11.836,0.371
c6.305,5.807,12.969,10.405,18.001,13.523c16.243,10.066,34.749,16.83,46.047,16.83c3.803,0,7.004-2.847,7.448-6.624
c0.443-3.763,0.249-7.71-0.548-11.825c42.339,12.464,82.526,34.395,119.732,65.351c-7.828,7.705-16.992,17.807-24.289,28.956
c-9.89,15.109-13.937,28.575-12.029,40.023c0.374,2.24,1.741,4.19,3.721,5.303c1.979,1.113,4.355,1.27,6.463,0.427
c3.34-1.335,6.953-3.429,11.137-5.854c20.232-11.723,50.808-29.442,96.482,8.17c1.378,1.135,3.069,1.71,4.769,1.71
c1.426,0,2.856-0.406,4.109-1.227C468.964,399.976,470.22,396.599,469.319,393.442z M279.509,81.603
c0.539,0,1.077,0.004,1.623,0.013c-4.094,3.333-8.215,7.426-11.386,12.477c-4.642,7.395-6.533,15.565-5.676,24.414
c-15.406-6.558-30.883-11.33-46.278-14.316C228.647,94.735,249.173,81.603,279.509,81.603z M136.287,248.193
c6.82-0.675,14.175-1.184,22.035-1.429c0.326,5.974,0.78,14.692,1.079,22.149C151.811,264.105,143.255,255.918,136.287,248.193z
M355.505,378.89c4.15-13.778,17.18-31.573,36.634-49.405c1.576-1.445,2.46-3.494,2.431-5.632c-0.029-2.138-0.97-4.162-2.585-5.563
c-43.679-37.89-91.55-63.678-142.334-76.705c-3.684-6.89-8.748-14.141-15.224-21.737c-11.65-13.667-23.588-23.441-24.091-23.851
c-3.212-2.617-7.936-2.135-10.552,1.077c-2.616,3.211-2.134,7.935,1.077,10.552c0.112,0.091,11.375,9.313,22.15,21.954
c10.222,11.991,16.422,22.74,18.294,31.599c-8.059-2.003-19.142-6.522-30.23-13.394c-16.235-10.061-27.028-21.757-29.611-32.087
c-1.005-4.019-5.078-6.464-9.095-5.457c-4.019,1.004-6.462,5.077-5.457,9.095c1.084,4.336,2.938,8.444,5.286,12.291
c-41.509-0.418-71.591,6.595-86.947,10.182c-2.83,0.661-5.064,1.183-6.726,1.508c-8.692,1.702-18.393,8.591-28.663,15.884
c-12.174,8.646-27.323,19.407-32.65,14.082c-4.966-4.966-1.312-18.299,9.538-34.795c4.907-7.463,7.669-16.215,7.986-25.279
l0.006-0.155c0.478-12.414,4.688-24.115,12.175-33.839c9.502-12.343,36.777-42.586,84.687-56.807
c44.949-13.342,92.197-7.854,140.434,16.313c63.844,31.989,99.955,79.619,119.006,113.943c20.749,37.382,26.386,67.6,26.438,67.893
c0.155,0.866,0.462,1.699,0.905,2.459c0.221,0.378,16.512,28.367,27.638,52.295C404.699,352.283,373.906,368.299,355.505,378.89z"
/>
<path stroke="currentcolor" fill="currentcolor" d="M179.239,125.68c-12.455-0.239-24.891,0.817-36.965,3.139c-4.068,0.782-6.731,4.714-5.949,8.781
c0.69,3.589,3.833,6.085,7.357,6.085c0.47,0,0.946-0.044,1.424-0.136c11.048-2.125,22.432-3.089,33.846-2.872
c4.117,0.066,7.563-3.214,7.642-7.355C186.673,129.181,183.38,125.759,179.239,125.68z"/>
<path stroke="currentcolor" fill="currentcolor" d="M266.235,147.532c-18.506-8.885-37.251-15.145-55.715-18.605c-4.07-0.762-7.99,1.919-8.753,5.99
c-0.763,4.071,1.919,7.99,5.99,8.753c17.173,3.218,34.664,9.067,51.986,17.384c58.37,28.029,91.331,69.762,108.703,99.836
c1.39,2.405,3.909,3.75,6.501,3.75c1.272,0,2.563-0.325,3.744-1.007c3.587-2.072,4.815-6.659,2.743-10.246
C363.004,221.483,328.058,177.219,266.235,147.532z"/>
<circle stroke="currentcolor" fill="currentcolor" cx="59.208" cy="211.178" r="8.215"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,7 @@
window.addEventListener('message', function (event) {
if (event.data == "FrameHeight") {
var body = document.body, html = document.documentElement;
var height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
event.source.postMessage({ "FrameHeight": height }, "*");
}
});