Re-implement existing website template (from PHP). Add all assets.
|
@ -1,6 +1,6 @@
|
||||||
@{
|
@{
|
||||||
ViewData["Title"] = "Home Page";
|
ViewData["Title"] = "Home";
|
||||||
}
|
}
|
||||||
|
|
||||||
<p>Hi, I'm Rob. I'm a software developer. I primarily work with C# in my professional life, but my home projects are often PHP and Python based.</p>
|
<p>Hi, I'm Rob. I'm a senior software engineer at <a href="https://www.codecomputerlove.com/">Code Computerlove</a>.</p>
|
||||||
<p>If you wish to get in contact, then get in touch via my <a href="http://uk.linkedin.com/in/robertmarshall/"><img alt="LinkedIn profile" src="https://static.licdn.com/scds/common/u/img/webpromo/btn_liprofile_blue_80x15.png" title=""></a></p>
|
<p>If you wish to get in contact, then get in touch via my <a href="http://uk.linkedin.com/in/robertmarshall/"><img alt="LinkedIn profile" src="https://static.licdn.com/scds/common/u/img/webpromo/btn_liprofile_blue_80x15.png" title=""></a></p>
|
|
@ -1,37 +1,123 @@
|
||||||
<!DOCTYPE html>
|
@{
|
||||||
<html>
|
var angularSource = "ajax.googleapis.com/ajax/libs/angularjs";
|
||||||
<head>
|
var angularVersion = "1.5.0";
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>@ViewData["Title"] - Website</title>
|
|
||||||
|
|
||||||
<environment include="Development">
|
var jsFiles = new[]{
|
||||||
<link rel="stylesheet" href="~/css/site.css" />
|
"javascript.js",
|
||||||
</environment>
|
"controllers/main.js",
|
||||||
<environment exclude="Development">
|
"directives/equalHeightWidth.js",
|
||||||
<link rel="stylesheet" href="~/css/site.min.css" />
|
"directives/scopeInit.js",
|
||||||
</environment>
|
};
|
||||||
</head>
|
}
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<a id="logo" href="/"><img src="~/images/logo.png" alt="logo" /> Robware</a>
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="//git.robware.uk">Projects</a></li>
|
|
||||||
<li><a href="/blog">Blog</a></li>
|
|
||||||
<li><a href="/gallery">Gallery</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
<main>
|
|
||||||
@RenderBody()
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer>
|
<!DOCTYPE html>
|
||||||
</footer>
|
<html ng-app="robware">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>@ViewData["Title"] | Robware</title>
|
||||||
|
|
||||||
<script src="~/js/site.js" asp-append-version="true"></script>
|
<environment include="Development">
|
||||||
|
<link href="/css/style.css" rel="stylesheet" defer />
|
||||||
|
<link href="/css/style-med.css?" media="(max-width:1023px)" rel="stylesheet" defer />
|
||||||
|
<link href="/css/style-small.css" media="(max-width:680px)" rel="stylesheet" defer />
|
||||||
|
</environment>
|
||||||
|
<environment exclude="Development">
|
||||||
|
<link href="/css/style.min.css" rel="stylesheet" defer defer asp-append-version="true"/>
|
||||||
|
<link href="/css/style-med.min.css?" media="(max-width:1023px)" rel="stylesheet" defer defer asp-append-version="true"/>
|
||||||
|
<link href="/css/style-small.min.css" media="(max-width:680px)" rel="stylesheet" defer defer asp-append-version="true"/>
|
||||||
|
</environment>
|
||||||
|
<style type="text/css">
|
||||||
|
@RenderSection("CSS", required:false);
|
||||||
|
</style>
|
||||||
|
<style media="(max-width:1023px)">
|
||||||
|
@RenderSection("CSSMed", required:false);
|
||||||
|
</style>
|
||||||
|
<style media="(max-width:680px)">
|
||||||
|
@RenderSection("CSSSmall", required:false);
|
||||||
|
</style>
|
||||||
|
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js" defer></script>
|
||||||
|
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js" defer></script>
|
||||||
|
<script type="text/javascript" src="//@angularSource/@angularVersion/angular.min.js" defer></script>
|
||||||
|
<script type="text/javascript" src="//@angularSource/@angularVersion/angular-animate.min.js" defer></script>
|
||||||
|
@foreach (var file in jsFiles){
|
||||||
|
<script type="text/javascript" src="~/js/@file" defer asp-append-version="true"></script>
|
||||||
|
}
|
||||||
|
<script type="text/javascript">
|
||||||
|
@RenderSection("JavaScript", required: false)
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body ng-controller="main" ng-class="{scrollLock: (menuVisible && window.innerWidth < 1024) || spinnerVisible}">
|
||||||
|
<div id="menu" ng-show="shouldShowMenu()">
|
||||||
|
<div class="header">
|
||||||
|
<img src="/images/logo.png" /><h1>Robware</h1>
|
||||||
|
</div>
|
||||||
|
<div id="nav-container">
|
||||||
|
<nav>
|
||||||
|
<dl>
|
||||||
|
<dt class="active">
|
||||||
|
<a href="/home"><img src="/images/home.svg">Home</a>
|
||||||
|
</dt>
|
||||||
|
<dt>
|
||||||
|
<a href="/blog"><img src="/images/blog.svg">Blog</a><span class="go" style="display: none;">»</span><span class="expand" style="display: block;">+</span>
|
||||||
|
</dt>
|
||||||
|
<div class="sub-pages">
|
||||||
|
<dd>
|
||||||
|
<a href="/blog/view/using-a-json-string-as-a-configuration-source-for-a-.net-core-project">Using a JSON string as a configuration source f...</a>
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
<a href="/blog/view/the-home-automation-saga">The Home Automation Saga</a>
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
<a href="/blog/view/a-basic-timer-for-the-arduino">A basic timer for the Arduino</a>
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
<a href="/blog/view/diy-home-automation-update">DIY Home Automation: Update</a>
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
<a href="/blog/view/the-start-of-diy-home-automation-replacing-the-thermostat-part-2">The start of DIY home automation: replacing the...</a>
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
<a href="/blog/"><i>View all</i></a>
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
<dt>
|
||||||
|
<a href="http://git.robware.uk/rob"><img src="/images/projects.svg">Projects</a>
|
||||||
|
</dt>
|
||||||
|
<dt>
|
||||||
|
<a href="/gallery"><img src="/images/photo.svg">Gallery</a>
|
||||||
|
</dt>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
<div class="header">
|
||||||
|
<img src="/images/menu.svg" id="menu-button" ng-click="menuVisible=!menuVisible" />@{ // using code blocks to remove HTML space but to keep source tidy
|
||||||
|
}<h2>@{ // Shitty, I know, but eh...
|
||||||
|
}<span>@ViewData["Title"]</span>@{
|
||||||
|
}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="errors" ng-if="errors.length>0">
|
||||||
|
The following errors were encountered:
|
||||||
|
<ul>
|
||||||
|
<li ng-repeat="error in errors">{{error}}</li>
|
||||||
|
</ul>
|
||||||
|
Please rectify them and try again.
|
||||||
|
</div>
|
||||||
|
<div id="content">
|
||||||
|
<div id="body">
|
||||||
|
@RenderBody()
|
||||||
|
</div>
|
||||||
|
<div id="footer">@RenderSection("Footer", required: false)</div>
|
||||||
|
</div>
|
||||||
|
<div id="buttons-left">@RenderSection("ButtonsLeft", required: false)</div>
|
||||||
|
<div id="buttons-right">@RenderSection("ButtonsRight", required: false)</div>
|
||||||
|
</div>
|
||||||
|
<div class="backdrop" ng-show="shouldShowMenu()" ng-click="menuVisible=false"></div>
|
||||||
|
<div id="spinner" class="backdrop" ng-show="spinnerVisible">
|
||||||
|
<img src="/images/spinner.svg" />
|
||||||
|
</div>
|
||||||
|
|
||||||
@RenderSection("Scripts", required: false)
|
@RenderSection("Scripts", required: false)
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
31
Website/wwwroot/css/animations.less
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
.ng-leave {
|
||||||
|
opacity:1;
|
||||||
|
|
||||||
|
&.ng-leave-active {
|
||||||
|
opacity:0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ng-enter{
|
||||||
|
opacity:0;
|
||||||
|
|
||||||
|
&.ng-enter-active {
|
||||||
|
opacity:1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ng-hide-add{
|
||||||
|
opacity:1;
|
||||||
|
|
||||||
|
&.ng-hide-add-active{
|
||||||
|
opacity:0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ng-hide-remove{
|
||||||
|
opacity:0;
|
||||||
|
|
||||||
|
&.ng-hide-remove-active{
|
||||||
|
opacity:1;
|
||||||
|
}
|
||||||
|
}
|
24
Website/wwwroot/css/blog.less
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
.ng-leave {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.ng-leave.ng-leave-active {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.ng-enter {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.ng-enter.ng-enter-active {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.ng-hide-add {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.ng-hide-add.ng-hide-add-active {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.ng-hide-remove {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.ng-hide-remove.ng-hide-remove-active {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
23
Website/wwwroot/css/colours.less
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
@import "material_colours.less";
|
||||||
|
|
||||||
|
@background:@Grey-50;
|
||||||
|
|
||||||
|
@primary-100:@Red-100;
|
||||||
|
@primary-200:@Red-200;
|
||||||
|
@primary-300:@Red-300;
|
||||||
|
@primary-400:@Red-400;
|
||||||
|
@primary-500:@Red-500;
|
||||||
|
@primary-600:@Red-600;
|
||||||
|
@primary-700:@Red-700;
|
||||||
|
@primary-800:@Red-800;
|
||||||
|
@primary-900:@Red-900;
|
||||||
|
|
||||||
|
@accent-100:@Teal-100;
|
||||||
|
@accent-200:@Teal-200;
|
||||||
|
@accent-400:@Teal-400;
|
||||||
|
@accent-700:@Teal-700;
|
||||||
|
|
||||||
|
@primary:@primary-600;
|
||||||
|
@accent:@accent-400;
|
||||||
|
@control:@Grey-200;
|
||||||
|
@control2:@Grey-300;
|
35
Website/wwwroot/css/contextMenu.less
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
@import "colours.less";
|
||||||
|
|
||||||
|
.contextMenu{
|
||||||
|
position: absolute;
|
||||||
|
float:left;
|
||||||
|
background:@background;
|
||||||
|
border:1px solid @Grey-500;
|
||||||
|
border-radius:3px;
|
||||||
|
padding: 3px 0;
|
||||||
|
box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.5);
|
||||||
|
-webkit-user-select: none; /* Chrome all / Safari all */
|
||||||
|
-moz-user-select: none; /* Firefox all */
|
||||||
|
-ms-user-select: none; /* IE 10+ */
|
||||||
|
user-select: none;
|
||||||
|
cursor:default;
|
||||||
|
z-index:10000;
|
||||||
|
|
||||||
|
.menuItem{
|
||||||
|
padding: 0 5px;
|
||||||
|
position:relative;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
background: @accent-200;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(:last-child){
|
||||||
|
border-bottom: 1px solid @Grey-200;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arrow{
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
198
Website/wwwroot/css/gallery.less
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
@import "colours.less";
|
||||||
|
|
||||||
|
#tabs{
|
||||||
|
background:@primary;
|
||||||
|
margin:-20px;
|
||||||
|
margin-bottom:10px;
|
||||||
|
position:fixed;
|
||||||
|
width:100%;
|
||||||
|
box-shadow: 0px 0px 5px 0px rgba(50, 50, 50, 0.8);
|
||||||
|
overflow-x:auto;
|
||||||
|
white-space:nowrap;
|
||||||
|
|
||||||
|
a{
|
||||||
|
display:inline-block;
|
||||||
|
color:@primary-100;
|
||||||
|
padding:15px 30px;
|
||||||
|
text-decoration:none;
|
||||||
|
text-transform: uppercase;
|
||||||
|
|
||||||
|
&.active{
|
||||||
|
color:#fff;
|
||||||
|
border-bottom:3px solid #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.album{
|
||||||
|
width:33.33%;
|
||||||
|
/*float:left;*/
|
||||||
|
display:inline-block;
|
||||||
|
vertical-align:top;
|
||||||
|
|
||||||
|
div{
|
||||||
|
margin:5px;
|
||||||
|
padding:5px;
|
||||||
|
background:@control2;
|
||||||
|
}
|
||||||
|
|
||||||
|
span{
|
||||||
|
display:block;
|
||||||
|
text-align:center;
|
||||||
|
color:@Grey-800;
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.imageSelector{
|
||||||
|
.image{
|
||||||
|
width:25%;
|
||||||
|
display:inline-block;
|
||||||
|
vertical-align:top;
|
||||||
|
text-align:center;
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
>div{
|
||||||
|
background:@primary-300;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
background:@primary-400;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=checkbox]{
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
>div{
|
||||||
|
margin:5px;
|
||||||
|
padding:5px;
|
||||||
|
background:@control2;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
background:@Grey-400;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#album-viewer{
|
||||||
|
height:100%;
|
||||||
|
display:flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
#album-description{
|
||||||
|
flex: 0 0 auto;
|
||||||
|
|
||||||
|
.expander{
|
||||||
|
padding:5px;
|
||||||
|
background:@control2;
|
||||||
|
|
||||||
|
&:after{
|
||||||
|
float:right;
|
||||||
|
content: "+";
|
||||||
|
}
|
||||||
|
|
||||||
|
&.expanded:after{
|
||||||
|
content: '-';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.text{
|
||||||
|
background:@control;
|
||||||
|
padding:5px;
|
||||||
|
|
||||||
|
&.ng-hide{
|
||||||
|
//opacity: 0;
|
||||||
|
line-height: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#album-thumbnails{
|
||||||
|
flex: 0 0 auto;
|
||||||
|
overflow-x:auto;
|
||||||
|
overflow-y:hidden;
|
||||||
|
white-space:nowrap;
|
||||||
|
text-align:center;
|
||||||
|
|
||||||
|
img{
|
||||||
|
width:100px;
|
||||||
|
border:3px solid transparent;
|
||||||
|
|
||||||
|
&.selected{
|
||||||
|
border:3px solid @primary-300;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#album-images{
|
||||||
|
flex: 1 1 auto;
|
||||||
|
overflow:auto;
|
||||||
|
position:relative;
|
||||||
|
|
||||||
|
.image{
|
||||||
|
position:absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
overflow:hidden;
|
||||||
|
text-align:center;
|
||||||
|
|
||||||
|
img{
|
||||||
|
max-height: 100%;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#galleryUpload{
|
||||||
|
|
||||||
|
.upload{
|
||||||
|
font-size:2em;
|
||||||
|
padding:5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dragDrop{
|
||||||
|
min-height:200px;
|
||||||
|
border-color: @background;
|
||||||
|
background-position: center;
|
||||||
|
background-size: 100px;
|
||||||
|
margin-bottom:5px;
|
||||||
|
|
||||||
|
&.dragOver{
|
||||||
|
border: 3px dashed @Grey-700;
|
||||||
|
background-image: url("/images/upload.svg");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.newImage{
|
||||||
|
display:flex;
|
||||||
|
margin-bottom:5px;
|
||||||
|
|
||||||
|
.information{
|
||||||
|
flex:1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview{
|
||||||
|
flex:1;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.imageContainer{
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
bottom:0;
|
||||||
|
right:0;
|
||||||
|
text-align:right;
|
||||||
|
|
||||||
|
img{
|
||||||
|
height:100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
272
Website/wwwroot/css/material_colours.less
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
@Red-50:#ffebee;
|
||||||
|
@Red-100:#ffcdd2;
|
||||||
|
@Red-200:#ef9a9a;
|
||||||
|
@Red-300:#e57373;
|
||||||
|
@Red-400:#ef5350;
|
||||||
|
@Red-500:#f44336;
|
||||||
|
@Red-600:#e53935;
|
||||||
|
@Red-700:#d32f2f;
|
||||||
|
@Red-800:#c62828;
|
||||||
|
@Red-900:#b71c1c;
|
||||||
|
@Red-A100:#ff8a80;
|
||||||
|
@Red-A200:#ff5252;
|
||||||
|
@Red-A400:#ff1744;
|
||||||
|
@Red-A700:#d50000;
|
||||||
|
|
||||||
|
@Pink-50:#fce4ec;
|
||||||
|
@Pink-100:#f8bbd0;
|
||||||
|
@Pink-200:#f48fb1;
|
||||||
|
@Pink-300:#f06292;
|
||||||
|
@Pink-400:#ec407a;
|
||||||
|
@Pink-500:#e91e63;
|
||||||
|
@Pink-600:#d81b60;
|
||||||
|
@Pink-700:#c2185b;
|
||||||
|
@Pink-800:#ad1457;
|
||||||
|
@Pink-900:#880e4f;
|
||||||
|
@Pink-A100:#ff80ab;
|
||||||
|
@Pink-A200:#ff4081;
|
||||||
|
@Pink-A400:#f50057;
|
||||||
|
@Pink-A700:#c51162;
|
||||||
|
|
||||||
|
@Purple-50:#f3e5f5;
|
||||||
|
@Purple-100:#e1bee7;
|
||||||
|
@Purple-200:#ce93d8;
|
||||||
|
@Purple-300:#ba68c8;
|
||||||
|
@Purple-400:#ab47bc;
|
||||||
|
@Purple-500:#9c27b0;
|
||||||
|
@Purple-600:#8e24aa;
|
||||||
|
@Purple-700:#7b1fa2;
|
||||||
|
@Purple-800:#6a1b9a;
|
||||||
|
@Purple-900:#4a148c;
|
||||||
|
@Purple-A100:#ea80fc;
|
||||||
|
@Purple-A200:#e040fb;
|
||||||
|
@Purple-A400:#d500f9;
|
||||||
|
@Purple-A700:#aa00ff;
|
||||||
|
|
||||||
|
@DeepPurple-50:#ede7f6;
|
||||||
|
@DeepPurple-50100:#d1c4e9;
|
||||||
|
@DeepPurple-50200:#b39ddb;
|
||||||
|
@DeepPurple-50300:#9575cd;
|
||||||
|
@DeepPurple-50400:#7e57c2;
|
||||||
|
@DeepPurple-50500:#673ab7;
|
||||||
|
@DeepPurple-50600:#5e35b1;
|
||||||
|
@DeepPurple-50700:#512da8;
|
||||||
|
@DeepPurple-50800:#4527a0;
|
||||||
|
@DeepPurple-50900:#311b92;
|
||||||
|
@DeepPurple-50A100:#b388ff;
|
||||||
|
@DeepPurple-50A200:#7c4dff;
|
||||||
|
@DeepPurple-50A400:#651fff;
|
||||||
|
@DeepPurple-50A700:#6200ea;
|
||||||
|
|
||||||
|
@Indigo-50:#e8eaf6;
|
||||||
|
@Indigo-100:#c5cae9;
|
||||||
|
@Indigo-200:#9fa8da;
|
||||||
|
@Indigo-300:#7986cb;
|
||||||
|
@Indigo-400:#5c6bc0;
|
||||||
|
@Indigo-500:#3f51b5;
|
||||||
|
@Indigo-600:#3949ab;
|
||||||
|
@Indigo-700:#303f9f;
|
||||||
|
@Indigo-800:#283593;
|
||||||
|
@Indigo-900:#1a237e;
|
||||||
|
@Indigo-A100:#8c9eff;
|
||||||
|
@Indigo-A200:#536dfe;
|
||||||
|
@Indigo-A400:#3d5afe;
|
||||||
|
@Indigo-A700:#304ffe;
|
||||||
|
|
||||||
|
@Blue-50:#e3f2fd;
|
||||||
|
@Blue-100:#bbdefb;
|
||||||
|
@Blue-200:#90caf9;
|
||||||
|
@Blue-300:#64b5f6;
|
||||||
|
@Blue-400:#42a5f5;
|
||||||
|
@Blue-500:#2196f3;
|
||||||
|
@Blue-600:#1e88e5;
|
||||||
|
@Blue-700:#1976d2;
|
||||||
|
@Blue-800:#1565c0;
|
||||||
|
@Blue-900:#0d47a1;
|
||||||
|
@Blue-A100:#82b1ff;
|
||||||
|
@Blue-A200:#448aff;
|
||||||
|
@Blue-A400:#2979ff;
|
||||||
|
@Blue-A700:#2962ff;
|
||||||
|
|
||||||
|
@LightBlue-50:#e1f5fe;
|
||||||
|
@LightBlue-100:#b3e5fc;
|
||||||
|
@LightBlue-200:#81d4fa;
|
||||||
|
@LightBlue-300:#4fc3f7;
|
||||||
|
@LightBlue-400:#29b6f6;
|
||||||
|
@LightBlue-500:#03a9f4;
|
||||||
|
@LightBlue-600:#039be5;
|
||||||
|
@LightBlue-700:#0288d1;
|
||||||
|
@LightBlue-800:#0277bd;
|
||||||
|
@LightBlue-900:#01579b;
|
||||||
|
@LightBlue-A100:#80d8ff;
|
||||||
|
@LightBlue-A200:#40c4ff;
|
||||||
|
@LightBlue-A400:#00b0ff;
|
||||||
|
@LightBlue-A700:#0091ea;
|
||||||
|
|
||||||
|
@Cyan-50:#e0f7fa;
|
||||||
|
@Cyan-100:#b2ebf2;
|
||||||
|
@Cyan-200:#80deea;
|
||||||
|
@Cyan-300:#4dd0e1;
|
||||||
|
@Cyan-400:#26c6da;
|
||||||
|
@Cyan-500:#00bcd4;
|
||||||
|
@Cyan-600:#00acc1;
|
||||||
|
@Cyan-700:#0097a7;
|
||||||
|
@Cyan-800:#00838f;
|
||||||
|
@Cyan-900:#006064;
|
||||||
|
@Cyan-A100:#84ffff;
|
||||||
|
@Cyan-A200:#18ffff;
|
||||||
|
@Cyan-A400:#00e5ff;
|
||||||
|
@Cyan-A700:#00b8d4;
|
||||||
|
|
||||||
|
@Teal-50:#e0f2f1;
|
||||||
|
@Teal-100:#b2dfdb;
|
||||||
|
@Teal-200:#80cbc4;
|
||||||
|
@Teal-300:#4db6ac;
|
||||||
|
@Teal-400:#26a69a;
|
||||||
|
@Teal-500:#009688;
|
||||||
|
@Teal-600:#00897b;
|
||||||
|
@Teal-700:#00796b;
|
||||||
|
@Teal-800:#00695c;
|
||||||
|
@Teal-900:#004d40;
|
||||||
|
@Teal-A100:#a7ffeb;
|
||||||
|
@Teal-A200:#64ffda;
|
||||||
|
@Teal-A400:#1de9b6;
|
||||||
|
@Teal-A700:#00bfa5;
|
||||||
|
|
||||||
|
@Green-50:#e8f5e9;
|
||||||
|
@Green-100:#c8e6c9;
|
||||||
|
@Green-200:#a5d6a7;
|
||||||
|
@Green-300:#81c784;
|
||||||
|
@Green-400:#66bb6a;
|
||||||
|
@Green-500:#4caf50;
|
||||||
|
@Green-600:#43a047;
|
||||||
|
@Green-700:#388e3c;
|
||||||
|
@Green-800:#2e7d32;
|
||||||
|
@Green-900:#1b5e20;
|
||||||
|
@Green-A100:#b9f6ca;
|
||||||
|
@Green-A200:#69f0ae;
|
||||||
|
@Green-A400:#00e676;
|
||||||
|
@Green-A700:#00c853;
|
||||||
|
|
||||||
|
@LightGreen-50:#f1f8e9;
|
||||||
|
@LightGreen-100:#dcedc8;
|
||||||
|
@LightGreen-200:#c5e1a5;
|
||||||
|
@LightGreen-300:#aed581;
|
||||||
|
@LightGreen-400:#9ccc65;
|
||||||
|
@LightGreen-500:#8bc34a;
|
||||||
|
@LightGreen-600:#7cb342;
|
||||||
|
@LightGreen-700:#689f38;
|
||||||
|
@LightGreen-800:#558b2f;
|
||||||
|
@LightGreen-900:#33691e;
|
||||||
|
@LightGreen-A100:#ccff90;
|
||||||
|
@LightGreen-A200:#b2ff59;
|
||||||
|
@LightGreen-A400:#76ff03;
|
||||||
|
@LightGreen-A700:#64dd17;
|
||||||
|
|
||||||
|
@Lime-50:#f9fbe7;
|
||||||
|
@Lime-100:#f0f4c3;
|
||||||
|
@Lime-200:#e6ee9c;
|
||||||
|
@Lime-300:#dce775;
|
||||||
|
@Lime-400:#d4e157;
|
||||||
|
@Lime-500:#cddc39;
|
||||||
|
@Lime-600:#c0ca33;
|
||||||
|
@Lime-700:#afb42b;
|
||||||
|
@Lime-800:#9e9d24;
|
||||||
|
@Lime-900:#827717;
|
||||||
|
@Lime-A100:#f4ff81;
|
||||||
|
@Lime-A200:#eeff41;
|
||||||
|
@Lime-A400:#c6ff00;
|
||||||
|
@Lime-A700:#aeea00;
|
||||||
|
|
||||||
|
@Yellow-50:#fffde7;
|
||||||
|
@Yellow-100:#fff9c4;
|
||||||
|
@Yellow-200:#fff59d;
|
||||||
|
@Yellow-300:#fff176;
|
||||||
|
@Yellow-400:#ffee58;
|
||||||
|
@Yellow-500:#ffeb3b;
|
||||||
|
@Yellow-600:#fdd835;
|
||||||
|
@Yellow-700:#fbc02d;
|
||||||
|
@Yellow-800:#f9a825;
|
||||||
|
@Yellow-900:#f57f17;
|
||||||
|
@Yellow-A100:#ffff8d;
|
||||||
|
@Yellow-A200:#ffff00;
|
||||||
|
@Yellow-A400:#ffea00;
|
||||||
|
@Yellow-A700:#ffd600;
|
||||||
|
|
||||||
|
@Amber-50:#fff8e1;
|
||||||
|
@Amber-100:#ffecb3;
|
||||||
|
@Amber-200:#ffe082;
|
||||||
|
@Amber-300:#ffd54f;
|
||||||
|
@Amber-400:#ffca28;
|
||||||
|
@Amber-500:#ffc107;
|
||||||
|
@Amber-600:#ffb300;
|
||||||
|
@Amber-700:#ffa000;
|
||||||
|
@Amber-800:#ff8f00;
|
||||||
|
@Amber-900:#ff6f00;
|
||||||
|
@Amber-A100:#ffe57f;
|
||||||
|
@Amber-A200:#ffd740;
|
||||||
|
@Amber-A400:#ffc400;
|
||||||
|
@Amber-A700:#ffab00;
|
||||||
|
|
||||||
|
@Orange-50:#fff3e0;
|
||||||
|
@Orange-100:#ffe0b2;
|
||||||
|
@Orange-200:#ffcc80;
|
||||||
|
@Orange-300:#ffb74d;
|
||||||
|
@Orange-400:#ffa726;
|
||||||
|
@Orange-500:#ff9800;
|
||||||
|
@Orange-600:#fb8c00;
|
||||||
|
@Orange-700:#f57c00;
|
||||||
|
@Orange-800:#ef6c00;
|
||||||
|
@Orange-900:#e65100;
|
||||||
|
@Orange-A100:#ffd180;
|
||||||
|
@Orange-A200:#ffab40;
|
||||||
|
@Orange-A400:#ff9100;
|
||||||
|
@Orange-A700:#ff6d00;
|
||||||
|
|
||||||
|
@DeepOrange-50:#fbe9e7;
|
||||||
|
@DeepOrange-100:#ffccbc;
|
||||||
|
@DeepOrange-200:#ffab91;
|
||||||
|
@DeepOrange-300:#ff8a65;
|
||||||
|
@DeepOrange-400:#ff7043;
|
||||||
|
@DeepOrange-500:#ff5722;
|
||||||
|
@DeepOrange-600:#f4511e;
|
||||||
|
@DeepOrange-700:#e64a19;
|
||||||
|
@DeepOrange-800:#d84315;
|
||||||
|
@DeepOrange-900:#bf360c;
|
||||||
|
@DeepOrange-A100:#ff9e80;
|
||||||
|
@DeepOrange-A200:#ff6e40;
|
||||||
|
@DeepOrange-A400:#ff3d00;
|
||||||
|
@DeepOrange-A700:#dd2c00;
|
||||||
|
|
||||||
|
@Brown-50:#efebe9;
|
||||||
|
@Brown-100:#d7ccc8;
|
||||||
|
@Brown-200:#bcaaa4;
|
||||||
|
@Brown-300:#a1887f;
|
||||||
|
@Brown-400:#8d6e63;
|
||||||
|
@Brown-500:#795548;
|
||||||
|
@Brown-600:#6d4c41;
|
||||||
|
@Brown-700:#5d4037;
|
||||||
|
@Brown-800:#4e342e;
|
||||||
|
@Brown-900:#3e2723;
|
||||||
|
|
||||||
|
@Grey-50:#fafafa;
|
||||||
|
@Grey-100:#f5f5f5;
|
||||||
|
@Grey-200:#eeeeee;
|
||||||
|
@Grey-300:#e0e0e0;
|
||||||
|
@Grey-400:#bdbdbd;
|
||||||
|
@Grey-500:#9e9e9e;
|
||||||
|
@Grey-600:#757575;
|
||||||
|
@Grey-700:#616161;
|
||||||
|
@Grey-800:#424242;
|
||||||
|
@Grey-900:#212121;
|
||||||
|
|
||||||
|
@BlueGrey-50:#eceff1;
|
||||||
|
@BlueGrey-100:#cfd8dc;
|
||||||
|
@BlueGrey-200:#b0bec5;
|
||||||
|
@BlueGrey-300:#90a4ae;
|
||||||
|
@BlueGrey-400:#78909c;
|
||||||
|
@BlueGrey-500:#607d8b;
|
||||||
|
@BlueGrey-600:#546e7a;
|
||||||
|
@BlueGrey-700:#455a64;
|
||||||
|
@BlueGrey-800:#37474f;
|
||||||
|
@BlueGrey-900:#263238;
|
|
@ -1,49 +0,0 @@
|
||||||
html {
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
header {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-end;
|
|
||||||
justify-content: space-between;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
background: red;
|
|
||||||
padding: 10px;
|
|
||||||
|
|
||||||
#logo {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 24px;
|
|
||||||
height: 50px;
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: inherit;
|
|
||||||
|
|
||||||
img {
|
|
||||||
height: 100%;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nav {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-left: auto;
|
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style: none;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
li {
|
|
||||||
display: inline-block;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
background: green;
|
|
||||||
margin: auto;
|
|
||||||
max-width: 800px;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
50
Website/wwwroot/css/style-med.less
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
@import "colours.less";
|
||||||
|
|
||||||
|
body{
|
||||||
|
display:initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu{
|
||||||
|
left:0;
|
||||||
|
position:fixed;
|
||||||
|
height:100%;
|
||||||
|
box-shadow:-10px 0px 5px 10px @Grey-900;
|
||||||
|
transition:all ease-in-out 0.4s;
|
||||||
|
|
||||||
|
&.ng-hide{
|
||||||
|
left:-280px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#main{
|
||||||
|
.header{
|
||||||
|
#menu-button{
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#buttons-left, #buttons-right{
|
||||||
|
button{
|
||||||
|
width:60px;
|
||||||
|
height:60px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.backdrop{
|
||||||
|
display: initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row{
|
||||||
|
|
||||||
|
>.col {
|
||||||
|
width:100%;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.col-lg-1>.col, &.col-lg-2>.col, &.col-lg-3>.col, &.col-lg-4>.col{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
47
Website/wwwroot/css/style-small.less
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
dl{
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main{
|
||||||
|
.header {
|
||||||
|
span:not(:last-child){
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
>*{
|
||||||
|
padding-left: 15px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-container{
|
||||||
|
top:48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header{
|
||||||
|
height: 48px;
|
||||||
|
|
||||||
|
> *{
|
||||||
|
line-height: 48px;
|
||||||
|
font-size:18px;
|
||||||
|
}
|
||||||
|
span:not(:first-child):before{
|
||||||
|
content:none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.row{
|
||||||
|
>.col {
|
||||||
|
width:100%;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.col-md-1>.col, &.col-md-2>.col, &.col-md-3>.col, &.col-md-4>.col{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table{
|
||||||
|
width:100%;
|
||||||
|
}
|
426
Website/wwwroot/css/style.less
Normal file
|
@ -0,0 +1,426 @@
|
||||||
|
@import "colours.less";
|
||||||
|
@import "animations.less";
|
||||||
|
@import "contextMenu.less";
|
||||||
|
|
||||||
|
@import url(//fonts.googleapis.com/css?family=Roboto);
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
outline: none;
|
||||||
|
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
html{
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,body,h1,h2, button {
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, button, input, textarea{
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
body{
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
background:@background;
|
||||||
|
display:flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color:@accent;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
img{
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, dd{
|
||||||
|
&:hover, &.active{
|
||||||
|
background: @control;
|
||||||
|
cursor: pointer;
|
||||||
|
cursor: hand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
padding: 10px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin: 0;
|
||||||
|
padding: 10px 10px 10px 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a{
|
||||||
|
color: black;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h2{
|
||||||
|
margin-bottom:10px;
|
||||||
|
a{
|
||||||
|
color:inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h3{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
&:first-child{
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hr{
|
||||||
|
border: 1px solid @control;
|
||||||
|
}
|
||||||
|
|
||||||
|
table{
|
||||||
|
border-collapse: collapse;
|
||||||
|
|
||||||
|
input[type=text], textarea{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
th{
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
td, th{
|
||||||
|
padding:0 10px 5px 0;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
button{
|
||||||
|
border:none;
|
||||||
|
background:@control;
|
||||||
|
}
|
||||||
|
|
||||||
|
form{
|
||||||
|
button, input[type=submit]{
|
||||||
|
border:none;
|
||||||
|
background:@control;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
background: @control2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover{
|
||||||
|
cursor: pointer;
|
||||||
|
cursor: hand;
|
||||||
|
}
|
||||||
|
|
||||||
|
img{
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
p{
|
||||||
|
&:first-child{
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child{
|
||||||
|
margin-bottom:0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu{
|
||||||
|
background:@background;
|
||||||
|
width:280px;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
display:flex;
|
||||||
|
flex-direction: column;
|
||||||
|
box-shadow: -2px 0px 0px 0px @control inset;
|
||||||
|
z-index: 400;
|
||||||
|
overflow-x: hidden;
|
||||||
|
|
||||||
|
#nav-container{
|
||||||
|
overflow: auto;
|
||||||
|
width:100%;
|
||||||
|
flex:1 1 auto;
|
||||||
|
|
||||||
|
dl {
|
||||||
|
margin: 5px 0 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.header{
|
||||||
|
z-index: 401;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#main{
|
||||||
|
flex: 1 1 auto;
|
||||||
|
display:flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow:hidden;
|
||||||
|
height:100%;
|
||||||
|
position:relative;
|
||||||
|
|
||||||
|
.header{
|
||||||
|
flex: 0 0 auto;
|
||||||
|
z-index:1;
|
||||||
|
|
||||||
|
#menu-button{
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
>*{
|
||||||
|
padding-left: 20px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#content{
|
||||||
|
flex: 1 1 auto;
|
||||||
|
overflow:auto;
|
||||||
|
z-index:0;
|
||||||
|
height:100%;
|
||||||
|
display:flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
#body{
|
||||||
|
padding:20px;
|
||||||
|
//height:100%;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#buttons-left,#buttons-right{
|
||||||
|
position:absolute;
|
||||||
|
padding: 10px;
|
||||||
|
bottom: 0px;
|
||||||
|
|
||||||
|
button{
|
||||||
|
margin:10px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.25);
|
||||||
|
vertical-align: middle;
|
||||||
|
border:none;
|
||||||
|
background:@accent;
|
||||||
|
width:40px;
|
||||||
|
height:40px;
|
||||||
|
color: white;
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#buttons-left{
|
||||||
|
left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#buttons-right{
|
||||||
|
right: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cookiePopup{
|
||||||
|
position:absolute;
|
||||||
|
background:black;
|
||||||
|
top:50%;
|
||||||
|
left:50%;
|
||||||
|
padding:20px;
|
||||||
|
border-radius: 30px;
|
||||||
|
width:230px;
|
||||||
|
height:230px;
|
||||||
|
margin-top:-115px;
|
||||||
|
margin-left:-115px;
|
||||||
|
color:white;
|
||||||
|
|
||||||
|
> div{
|
||||||
|
margin-top:40px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#spinner{
|
||||||
|
position:absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
z-index: 1000;
|
||||||
|
transition: all ease-in-out 0.5s;
|
||||||
|
|
||||||
|
&.ng-hide{
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
>img{
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrollLock{
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
height:64px;
|
||||||
|
background:@primary;
|
||||||
|
color:white;
|
||||||
|
white-space:nowrap;
|
||||||
|
padding:0 !important;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 -9px 5px 10px rgba(50, 50, 50, 0.8);
|
||||||
|
|
||||||
|
>*{
|
||||||
|
line-height:64px;
|
||||||
|
font-size:24px;
|
||||||
|
font-weight:400;
|
||||||
|
padding-left: 10px;
|
||||||
|
white-space: nowrap;
|
||||||
|
display: inline;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
>h2>span{
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
>img{
|
||||||
|
height:50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
span{
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
&:not(:first-child):before{
|
||||||
|
margin:2px 10px 0 10px;
|
||||||
|
width:6px;
|
||||||
|
float:left;
|
||||||
|
height:62px;
|
||||||
|
background: url("/images/chevron.png") no-repeat scroll right center / contain rgba(0, 0, 0, 0);
|
||||||
|
content:"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle{
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.go, .expand{
|
||||||
|
display:none;
|
||||||
|
float:right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backdrop{
|
||||||
|
background: rgba(0,0,0,0.5);
|
||||||
|
width: 100%;
|
||||||
|
height:100%;
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
z-index:100;
|
||||||
|
display:none;
|
||||||
|
transition:all ease-in-out 0.5s;
|
||||||
|
|
||||||
|
&.ng-hide{
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.errors{
|
||||||
|
background: url(/images/error.svg) no-repeat scroll 10px 10px @Grey-800;
|
||||||
|
padding:10px;
|
||||||
|
padding-left:40px;
|
||||||
|
color:#fff;
|
||||||
|
|
||||||
|
ul{
|
||||||
|
margin: 0;
|
||||||
|
list-style: square;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.row{
|
||||||
|
width:100%;
|
||||||
|
clear:both;
|
||||||
|
|
||||||
|
>.col {
|
||||||
|
width:100%;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.col-lg-1, &.col-md-1, &.col-sm-1{
|
||||||
|
>.col{
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.col-lg-2, &.col-md-2, &.col-sm-2{
|
||||||
|
>.col{
|
||||||
|
width:50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.col-lg-3, &.col-md-3, &.col-sm-3{
|
||||||
|
>.col{
|
||||||
|
width:33.3333%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.col-lg-4, &.col-md-4, &.col-sm-4{
|
||||||
|
>.col{
|
||||||
|
width:25%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table.alternatingRows{
|
||||||
|
tr{
|
||||||
|
&:nth-child(1n){
|
||||||
|
background:@control;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(2n){
|
||||||
|
background:@control2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
td, th{
|
||||||
|
padding:3px;
|
||||||
|
|
||||||
|
&.number{
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.percentageBar{
|
||||||
|
width:100%;
|
||||||
|
height:20px;
|
||||||
|
background:@LightGreen-400;
|
||||||
|
overflow:hidden;
|
||||||
|
|
||||||
|
>div{
|
||||||
|
background:@Red-400;
|
||||||
|
height:100%;
|
||||||
|
transition: all 500ms ease-in-out;
|
||||||
|
}
|
||||||
|
}
|
42
Website/wwwroot/css/temperature.less
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
@import "colours.less";
|
||||||
|
|
||||||
|
@gaugeHeight:200px;
|
||||||
|
@gaugeWidth:200px;
|
||||||
|
|
||||||
|
.currentTemp{
|
||||||
|
background:@Red-100;
|
||||||
|
height:@gaugeHeight;
|
||||||
|
width:@gaugeWidth;
|
||||||
|
position:relative;
|
||||||
|
//border:1px solid @Grey-900;
|
||||||
|
display:inline-block;
|
||||||
|
|
||||||
|
.background{
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
top: 20%;
|
||||||
|
transition: all 500ms ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reading{
|
||||||
|
position: relative;
|
||||||
|
height:@gaugeHeight;
|
||||||
|
width:@gaugeWidth;
|
||||||
|
vertical-align:middle;
|
||||||
|
display:table-cell;
|
||||||
|
text-align:center;
|
||||||
|
font-size: 250%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shadow{
|
||||||
|
box-shadow: inset 0px 0px 5px 1px rgba(0,0,0,0.75);
|
||||||
|
border:2px solid @Grey-900;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
}
|
12
Website/wwwroot/images/add.svg
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="#CFD8DC" d="M19.967,7.972v12c0,1.1-0.9,2-2,2H5.958c-1.1,0-1.99-0.9-1.99-2l0.01-16c0-1.1,0.89-2,1.99-2h8L19.967,7.972
|
||||||
|
z"/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<polygon fill="#455A64" points="16,16 13,16 13,19 11,19 11,16 8,16 8,14 11,14 11,11 13,11 13,14 16,14 "/>
|
||||||
|
<polygon opacity="0.5" fill="#90A4AE" enable-background="new " points="19.967,8.067 19.967,9.067 13.967,9.067 13.967,2.067
|
||||||
|
"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 895 B |
11
Website/wwwroot/images/add_album.svg
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#4CAF50" enable-background="new " d="M4,6H2v14c0,1.1,0.9,2,2,2h14v-2H4V6z"/>
|
||||||
|
<path fill="#66BB6A" d="M22,4v12c0,1.1-0.9,2-2,2H8c-1.1,0-2-0.9-2-2V4c0-1.1,0.9-2,2-2h12C21.1,2,22,2.9,22,4z"/>
|
||||||
|
<path opacity="0.7" fill="#4CAF50" enable-background="new " d="M22,4v12c0,1.1-0.9,2-2,2h-6.04V2H20C21.1,2,22,2.9,22,4z"/>
|
||||||
|
<polygon fill="#FFFFFF" points="19,11 15,11 15,15 13,15 13,11 9,11 9,9 13,9 13,5 15,5 15,9 19,9 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 950 B |
9
Website/wwwroot/images/blog.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 15.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="#CFD8DC" d="M20,2H4C2.9,2,2.01,2.9,2.01,4L2,22l4-4h14c1.1,0,2-0.9,2-2V4C22,2.9,21.1,2,20,2z"/>
|
||||||
|
<path fill="#607D8B" d="M6,9h12v2H6V9z M14,14H6v-2h8V14z M18,8H6V6h12V8z"/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 703 B |
BIN
Website/wwwroot/images/chevron.png
Normal file
After Width: | Height: | Size: 48 KiB |
12
Website/wwwroot/images/delete.svg
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 15.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="#9E9E9E" d="M6,19c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2V6H6V19z"/>
|
||||||
|
<polygon fill="#616161" points="19,4 15.5,4 14.5,3 9.5,3 8.5,4 5,4 5,6 19,6 "/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<rect x="8" y="8" fill="#757575" width="2" height="11"/>
|
||||||
|
<rect x="12" y="8" fill="#757575" width="2" height="11"/>
|
||||||
|
<rect x="16" y="8" fill="#757575" width="2" height="11"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 851 B |
11
Website/wwwroot/images/desktop.svg
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#546E7A" d="M23,4v12c0,1.1-0.9,2-2,2h-7v2h2v2H8v-2h2v-2H3c-1.1,0-2-0.9-2-2V4c0-1.1,0.9-2,2-2h18C22.1,2,23,2.9,23,4z"
|
||||||
|
/>
|
||||||
|
<rect x="3" y="4" fill="#B3E5FC" width="18" height="12"/>
|
||||||
|
<rect x="10" y="17.98" fill="#455A64" width="4" height="2.02"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 776 B |
9
Website/wwwroot/images/done.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 15.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#81C784" d="M9,19L21,7l-1.41-1.41L9,16.17V19z"/>
|
||||||
|
<path fill="#4CAF50" d="M9,16.17L4.83,12l-1.42,1.41L9,19V16.17z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 648 B |
12
Website/wwwroot/images/edit.svg
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<polygon fill="#CFD8DC" points="17.266,10.453 19.094,8.656 15.344,4.891 13.703,6.547 "/>
|
||||||
|
<polygon fill="#78909C" points="17.811,9.94 6.75,21 3,21 3,17.25 14.061,6.19 "/>
|
||||||
|
<path fill="#B0BEC5" d="M20.71,7.04c0.39-0.39,0.39-1.02,0-1.41l-2.34-2.34c-0.39-0.39-1.021-0.39-1.41,0l-1.83,1.83l3.75,3.75
|
||||||
|
L20.71,7.04z"/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<polygon fill="#B0BEC5" points="6.75,21 3,21 3,17.25 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 890 B |
10
Website/wwwroot/images/error.svg
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 15.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#E57373" d="M12,2C6.48,2,2,6.48,2,12c0,5.52,4.48,10,10,10c5.52,0,10-4.48,10-10C22,6.48,17.52,2,12,2z"/>
|
||||||
|
<path fill="#F44336" d="M12,4c-4.417,0-8,3.583-8,8c0,4.414,3.583,8,8,8c4.414,0,8-3.586,8-8C20,7.583,16.414,4,12,4z"/>
|
||||||
|
<path fill="#CFD8DC" d="M13,17h-2v-2h2V17z M13,13h-2V7h2V13z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 819 B |
11
Website/wwwroot/images/gallery.svg
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#B3E5FC" d="M22,4v12c0,1.1-0.9,2-2,2H8c-1.1,0-2-0.9-2-2V4c0-1.1,0.9-2,2-2h12C21.1,2,22,2.9,22,4z"/>
|
||||||
|
<path fill="#81D4FA" d="M22,4v12c0,1.1-0.9,2-2,2h-6.03V2H20C21.1,2,22,2.9,22,4z"/>
|
||||||
|
<polygon fill="#66BB6A" points="11,12 13.029,14.71 16,11 20,16 8,16 "/>
|
||||||
|
<path fill="#81D4FA" d="M2,6v14c0,1.1,0.9,2,2,2h14v-2H4V6H2z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 852 B |
10
Website/wwwroot/images/home.svg
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 15.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<rect x="9.375" y="13.292" fill="#795548" width="5.333" height="6.708"/>
|
||||||
|
<polygon fill="#D7CCC8" points="5,12 5,20 10,20 10,14 14,14 14,20 19,20 19,12 19.021,12 12.01,5.691 "/>
|
||||||
|
<polygon fill="#F44336" points="12,3 2,12 5,12 12.01,5.691 19.021,12 22,12 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 777 B |
13
Website/wwwroot/images/library.svg
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#6D4C41" d="M4,6H2v14c0,1.1,0.9,2,2,2h14v-2H4V6z"/>
|
||||||
|
<path fill="#8D6E63" d="M22,4v12c0,1.1-0.9,2-2,2H8c-1.1,0-2-0.9-2-2V4c0-1.1,0.9-2,2-2h12C21.1,2,22,2.9,22,4z"/>
|
||||||
|
<path fill="#6D4C41" d="M22,4v12c0,1.1-0.9,2-2,2h-6.04V2H20C21.1,2,22,2.9,22,4z"/>
|
||||||
|
<rect x="9" y="9" fill="#FFFFFF" width="10" height="2"/>
|
||||||
|
<rect x="9" y="13" fill="#FFFFFF" width="6" height="2"/>
|
||||||
|
<rect x="9" y="5" fill="#FFFFFF" width="10" height="2"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 953 B |
BIN
Website/wwwroot/images/logo_email.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
10
Website/wwwroot/images/member.svg
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<circle fill="#1976D2" cx="12" cy="8" r="4"/>
|
||||||
|
<path fill="#1565C0" d="M12,14c-2.67,0-8,1.34-8,4v2h16v-2C20,15.34,14.67,14,12,14z"/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<polygon fill="none" points="62,-15 62,9 52.88,9 52.88,-12.92 38,-12.92 38,-15 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 735 B |
10
Website/wwwroot/images/menu.svg
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<rect x="3" y="16" fill="#FFFFFF" width="18" height="2"/>
|
||||||
|
<rect x="3" y="11" fill="#FFFFFF" width="18" height="2"/>
|
||||||
|
<rect x="3" y="6" fill="#FFFFFF" width="18" height="2"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 693 B |
8
Website/wwwroot/images/next.svg
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="#FFFFFF" d="M10,6L8.59,7.41L13.17,12l-4.58,4.59L10,18l6-6L10,6z"/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 597 B |
13
Website/wwwroot/images/photo.svg
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#BBDEFB" d="M21,19V5c0-1.1-0.9-2-2-2H5C3.9,3,3,3.9,3,5v14c0,1.1,0.9,2,2,2h14C20.1,21,21,20.1,21,19z M8.5,13.5
|
||||||
|
l2.5,3.01L14.5,12l4.5,6H5L8.5,13.5z"/>
|
||||||
|
<g>
|
||||||
|
<polygon fill="#43A047" points="19,17.979 5,17.979 8.5,13.479 11,16.489 14.5,11.979 "/>
|
||||||
|
<polygon fill="#66BB6A" points="5,17.979 8.5,13.479 12.234,17.979 "/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 856 B |
10
Website/wwwroot/images/power.svg
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<rect x="11" y="2" fill="#64B5F6" width="2" height="10"/>
|
||||||
|
<path fill="#42A5F5" d="M16.561,4.44l-1.451,1.45C16.84,6.94,18,8.83,18,11c0,3.311-2.689,6-6,6c-3.31,0-6-2.689-6-6
|
||||||
|
c0-2.17,1.16-4.06,2.88-5.12L7.44,4.44C5.36,5.88,4,8.28,4,11c0,4.42,3.58,8,8,8s8-3.58,8-8C20,8.28,18.641,5.88,16.561,4.44z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 818 B |
8
Website/wwwroot/images/previous.svg
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="#FFFFFF" d="M15.41,7.41L14,6l-6,6l6,6l1.41-1.41L10.83,12L15.41,7.41z"/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 602 B |
19
Website/wwwroot/images/projects.svg
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<path fill="#4E342E" d="M19.001,3.016H14.82c-0.42-1.16-1.521-2-2.819-2s-2.4,0.84-2.82,2h-4.18c-1.1,0-2,0.9-2,2v14
|
||||||
|
c0,1.101,0.9,2,2,2h14c1.101,0,2-0.899,2-2v-14C21.001,3.916,20.102,3.016,19.001,3.016z"/>
|
||||||
|
<path fill="#D7CCC8" d="M19.71,6.553c0-1.354-1.103-2.454-2.455-2.454H6.79c-1.356,0-2.455,1.099-2.455,2.454V17.23
|
||||||
|
c0,1.354,1.099,2.453,2.455,2.453h10.465c1.354,0,2.455-1.101,2.455-2.453V6.553z"/>
|
||||||
|
<circle fill="#F1F8E9" cx="12.001" cy="4.016" r="1"/>
|
||||||
|
</g>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<rect x="7" y="16" fill="#455A64" width="7" height="2"/>
|
||||||
|
<rect x="7" y="12" fill="#455A64" width="10" height="2"/>
|
||||||
|
<rect x="7" y="8" fill="#455A64" width="10" height="2"/>
|
||||||
|
<path fill="#FFA000" d="M7.011,6.213l9.984,0.031l0.002-1.236v-2h-2.18c-0.42-1.16-1.521-2-2.82-2s-2.4,0.84-2.82,2h-2.18v2
|
||||||
|
L7.011,6.213z M11.997,3.008c0.55,0,1,0.45,1,1s-0.45,1-1,1s-1-0.45-1-1S11.447,3.008,11.997,3.008z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
13
Website/wwwroot/images/register.svg
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<circle fill="#1976D2" cx="15" cy="8.13" r="4"/>
|
||||||
|
<polygon fill="#8BC34A" points="6,10 6,7 4,7 4,10 1,10 1,12 4,12 4,15 6,15 6,12 9,12 9,10 "/>
|
||||||
|
<path fill="#1565C0" d="M23,18v2H7v-2c0-2.66,5.33-4,8-4S23,15.34,23,18z"/>
|
||||||
|
<path fill="none" d="M15,12.13v-8c2.21,0,4,1.79,4,4S17.21,12.13,15,12.13z"/>
|
||||||
|
<path fill="none" d="M23,18v2h-8v-6C17.67,14,23,15.34,23,18z"/>
|
||||||
|
<polygon fill="none" points="39,-2 39,22 29.88,22 29.88,0.08 15,0.08 15,-2 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 961 B |
15
Website/wwwroot/images/save.svg
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<g id="Capa_1_1_">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<path fill="#37474F" d="M21,7v12c0,1.1-0.9,2-2,2H5c-1.11,0-2-0.9-2-2V5c0-1.1,0.89-2,2-2h12L21,7z"/>
|
||||||
|
<path opacity="0.5" fill="#455A64" d="M11.96,3v18H5c-1.11,0-2-0.9-2-2V5c0-1.1,0.89-2,2-2H11.96z"/>
|
||||||
|
<path fill="#B0BEC5" d="M15,16c0,1.66-1.34,3-3,3h-0.05C10.31,18.97,9,17.641,9,16s1.31-2.97,2.95-3H12C13.66,13,15,14.34,15,16z"
|
||||||
|
/>
|
||||||
|
<rect x="5" y="5" fill="#B0BEC5" width="10" height="4"/>
|
||||||
|
<path fill="#90A4AE" d="M15,16c0,1.66-1.34,3-3,3h-0.05v-6H12C13.66,13,15,14.34,15,16z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1 KiB |
8
Website/wwwroot/images/send.svg
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<polygon fill="#1E88E5" points="23,12 2.01,21 2,14 17,12 2,10 2.01,3 "/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 591 B |
1
Website/wwwroot/images/spinner.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><svg width='200px' height='200px' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="uil-ring-alt"><rect x="0" y="0" width="100" height="100" fill="none" class="bk"></rect><circle cx="50" cy="50" r="40" stroke="none" fill="none" stroke-width="10" stroke-linecap="round"></circle><circle cx="50" cy="50" r="40" stroke="#e53935" fill="none" stroke-width="6" stroke-linecap="round"><animate attributeName="stroke-dashoffset" dur="2s" repeatCount="indefinite" from="0" to="502"></animate><animate attributeName="stroke-dasharray" dur="2s" repeatCount="indefinite" values="150.6 100.4;1 250;150.6 100.4"></animate></circle></svg>
|
After Width: | Height: | Size: 706 B |
16
Website/wwwroot/images/status.svg
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<rect x="4" y="17" fill="#BA68C8" width="10" height="2"/>
|
||||||
|
<rect x="4" y="9" fill="#4DB6AC" width="16" height="2"/>
|
||||||
|
<rect x="4" y="13" fill="#DCE775" width="16" height="2"/>
|
||||||
|
<rect x="4" y="5" fill="#4FC3F7" width="16" height="2"/>
|
||||||
|
<path fill="none" d="M0,0v24h24V0H0z M22.49,19.42H13.97V19H14v-2h-0.03v-2H20v-2h-6.03v-2H20V9h-6.03V7H20V5h-6.03V3.28h8.521
|
||||||
|
V19.42z"/>
|
||||||
|
<rect x="13.97" y="17" opacity="0.2" fill="#546E7A" width="0.03" height="2"/>
|
||||||
|
<rect x="13.97" y="5" opacity="0.2" fill="#546E7A" width="6.03" height="2"/>
|
||||||
|
<rect x="13.97" y="9" opacity="0.2" fill="#546E7A" width="6.03" height="2"/>
|
||||||
|
<rect x="13.97" y="13" opacity="0.2" fill="#546E7A" width="6.03" height="2"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
10
Website/wwwroot/images/temperature.svg
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 15.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<rect x="9.375" y="13.292" fill="#795548" width="5.333" height="6.708"/>
|
||||||
|
<polygon fill="#D7CCC8" points="5,12 5,20 10,20 10,14 14,14 14,20 19,20 19,12 19.021,12 12.01,5.691 "/>
|
||||||
|
<polygon fill="#F44336" points="12,3 2,12 5,12 12.01,5.691 19.021,12 22,12 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 777 B |
9
Website/wwwroot/images/upload.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 15.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
<polygon fill="#03A9F4" points="9,16 15,16 15,10 19,10 12,3 5,10 9,10 "/>
|
||||||
|
<rect x="5" y="18" fill="#0288D1" width="14" height="2"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 652 B |
11
Website/wwwroot/images/weight.svg
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.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"
|
||||||
|
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||||
|
<g id="Capa_1_1_">
|
||||||
|
<polygon fill="#E53935" points="22,12 22,18 16,18 18.29,15.71 13.41,10.83 9.41,14.83 2,7.41 3.41,6 9.41,12 13.41,8 19.71,14.29
|
||||||
|
"/>
|
||||||
|
<path fill="none" d="M0,0h24v24H0V0z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 682 B |
12
Website/wwwroot/js/controllers/gallery.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
angular.module("robware").controller('gallery', ["$scope", function($scope) {
|
||||||
|
$scope.images=[];
|
||||||
|
$scope.imageToShow=0;
|
||||||
|
|
||||||
|
$scope.showNextImage=function(){
|
||||||
|
$scope.imageToShow=Math.min($scope.imageToShow+1, $scope.images.length-1);
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.showPreviousImage=function(){
|
||||||
|
$scope.imageToShow=Math.max($scope.imageToShow-1, 0);
|
||||||
|
};
|
||||||
|
}]);
|
77
Website/wwwroot/js/controllers/galleryManage.js
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
angular.module("robware").controller('galleryManage', ["$scope", "$http", function($scope, $http) {
|
||||||
|
$scope.albums=[];
|
||||||
|
var albumActions={};
|
||||||
|
|
||||||
|
var moveIndex="Move selected to album";
|
||||||
|
$scope.contextMenuActions={
|
||||||
|
"Delete selected":deleteSelected
|
||||||
|
};
|
||||||
|
|
||||||
|
function getSelectedImageIds(){
|
||||||
|
var images=[];
|
||||||
|
angular.forEach($scope.selectedAlbum.Images, function(image){
|
||||||
|
if (image.selected)
|
||||||
|
images.push(image.ImageId);
|
||||||
|
});
|
||||||
|
return images;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateAlbums(data){
|
||||||
|
var selectedId=$scope.selectedAlbum.AlbumId;
|
||||||
|
$scope.albums=data;
|
||||||
|
angular.forEach($scope.albums, function(album){
|
||||||
|
if (album.AlbumId===selectedId)
|
||||||
|
$scope.selectedAlbum=album;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteSelected(){
|
||||||
|
var images=getSelectedImageIds();
|
||||||
|
if (images.length===0 || !confirm("Are you sure you want to delete?"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var data={
|
||||||
|
selectedImages:images
|
||||||
|
};
|
||||||
|
|
||||||
|
$http.post("/gallery/deleteimages",data).then(function(response){
|
||||||
|
updateAlbums(response.data);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function moveImages(newAlbum){
|
||||||
|
var images=getSelectedImageIds();
|
||||||
|
if (images.length===0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var data={
|
||||||
|
selectedImages:images,
|
||||||
|
targetAlbumId:newAlbum.AlbumId
|
||||||
|
};
|
||||||
|
$http.post("/gallery/move",data).then(function(response){
|
||||||
|
updateAlbums(response.data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.$watch("albums", function(){
|
||||||
|
if ($scope.selectedAlbum===undefined)
|
||||||
|
$scope.selectedAlbum=$scope.albums[0];
|
||||||
|
|
||||||
|
albumActions={};
|
||||||
|
angular.forEach($scope.albums, function(album){
|
||||||
|
albumActions[album.AlbumTitle]=function(){
|
||||||
|
moveImages(album);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
$scope.contextMenuActions[moveIndex]=albumActions;
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.selectImage=function(image){
|
||||||
|
image.selected=!image.selected;
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.editAlbum=function(album){
|
||||||
|
Navigate("/gallery/editablum/"+album.AlbumId);
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
|
101
Website/wwwroot/js/controllers/galleryUpload.js
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
angular.module("robware").controller('galleryUpload', ["$scope", "$http", function($scope, $http) {
|
||||||
|
$scope.images = [];
|
||||||
|
$scope.contextMenuActions = {
|
||||||
|
Remove: remove,
|
||||||
|
Clear: clear
|
||||||
|
};
|
||||||
|
|
||||||
|
function remove(containerScope) {
|
||||||
|
if (!containerScope.image)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var index = $scope.images.indexOf(containerScope.image);
|
||||||
|
if (index !== -1)
|
||||||
|
$scope.images.splice(index, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear() {
|
||||||
|
if (confirm("Are you sure you want to clear the uploads?"))
|
||||||
|
$scope.images = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeImages(toRemove) {
|
||||||
|
// I need this roundabout way to work with Angular's view engine
|
||||||
|
var imageReferences = [];
|
||||||
|
angular.forEach(toRemove, function(index) {
|
||||||
|
imageReferences.push($scope.images[index]);
|
||||||
|
});
|
||||||
|
angular.forEach(imageReferences, function(ref) {
|
||||||
|
$scope.images.splice($scope.images.indexOf(ref), 1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.getTotalImageSize = function() {
|
||||||
|
var totalSize = 0;
|
||||||
|
angular.forEach($scope.images, function(image) {
|
||||||
|
totalSize += image.file.size;
|
||||||
|
});
|
||||||
|
return totalSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.safeUploadSize = function() {
|
||||||
|
return $scope.maxUploadSize * 0.95;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.fileDrop = function(files) {
|
||||||
|
angular.forEach(files, function(file) {
|
||||||
|
var imageObject = {
|
||||||
|
file: file,
|
||||||
|
title: file.name.replace(/\.[^/.]+$/, ""),
|
||||||
|
description: "",
|
||||||
|
preview: ""
|
||||||
|
};
|
||||||
|
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.onload = function(e) {
|
||||||
|
imageObject.preview = e.target.result;
|
||||||
|
$scope.$apply();
|
||||||
|
};
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
|
||||||
|
$scope.images.push(imageObject);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.upload = function() {
|
||||||
|
var data = new FormData();
|
||||||
|
var errors = [];
|
||||||
|
angular.forEach($scope.images, function(image) {
|
||||||
|
if (!image.title)
|
||||||
|
errors.push("The image " + image.file.name + " doesn't have a title");
|
||||||
|
data.append("files[]", image.file);
|
||||||
|
data.append("title[]", image.title);
|
||||||
|
data.append("description[]", image.description);
|
||||||
|
});
|
||||||
|
|
||||||
|
var totalSize = 0;
|
||||||
|
data.getAll("files[]").forEach(function(entry){
|
||||||
|
totalSize += entry.size;
|
||||||
|
});
|
||||||
|
if (totalSize>$scope.safeUploadSize())
|
||||||
|
errors.push("Max upload size exceeded");
|
||||||
|
|
||||||
|
if (errors.length>0){
|
||||||
|
$scope.showErrors(errors);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$http({
|
||||||
|
method: 'POST',
|
||||||
|
url: '/gallery/uploadimages',
|
||||||
|
data: data,
|
||||||
|
showSpinner: true,
|
||||||
|
headers: {'Content-Type': undefined},
|
||||||
|
transformRequest: angular.identity
|
||||||
|
}).then(function(response) {
|
||||||
|
$scope.showErrors(response.data.errors);
|
||||||
|
removeImages(response.data.uploaded);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
|
107
Website/wwwroot/js/controllers/main.js
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/* global app, angular */
|
||||||
|
|
||||||
|
angular.module("robware", ['ngAnimate'], ["$httpProvider", function($httpProvider) {
|
||||||
|
/*
|
||||||
|
* Stolen from: http://stackoverflow.com/questions/19254029/angularjs-http-post-does-not-send-data
|
||||||
|
* Reason: send payload as form data instead of JSON, bind to controller action parameters
|
||||||
|
*/
|
||||||
|
// Use x-www-form-urlencoded Content-Type
|
||||||
|
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
|
||||||
|
/**
|
||||||
|
* The workhorse; converts an object to x-www-form-urlencoded serialization.
|
||||||
|
* @param {Object} obj
|
||||||
|
* @return {String}
|
||||||
|
*/
|
||||||
|
var param = function(obj) {
|
||||||
|
var query = '', name, value, fullSubName, subName, subValue, innerObj, i;
|
||||||
|
for (name in obj) {
|
||||||
|
value = obj[name];
|
||||||
|
if (value instanceof Array) {
|
||||||
|
for (i = 0; i < value.length; ++i) {
|
||||||
|
subValue = value[i];
|
||||||
|
fullSubName = name + '[' + i + ']';
|
||||||
|
innerObj = {};
|
||||||
|
innerObj[fullSubName] = subValue;
|
||||||
|
query += param(innerObj) + '&';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (value instanceof Object) {
|
||||||
|
for (subName in value) {
|
||||||
|
subValue = value[subName];
|
||||||
|
fullSubName = name + '[' + subName + ']';
|
||||||
|
innerObj = {};
|
||||||
|
innerObj[fullSubName] = subValue;
|
||||||
|
query += param(innerObj) + '&';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (value !== undefined && value !== null)
|
||||||
|
query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
|
||||||
|
}
|
||||||
|
|
||||||
|
return query.length ? query.substr(0, query.length - 1) : query;
|
||||||
|
};
|
||||||
|
// Override $http service's default transformRequest
|
||||||
|
$httpProvider.defaults.transformRequest = [
|
||||||
|
function(data) {
|
||||||
|
return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
$httpProvider.interceptors.push([
|
||||||
|
'$rootScope',
|
||||||
|
'$q',
|
||||||
|
function($rootScope, $q) {
|
||||||
|
return {
|
||||||
|
request: function(config) {
|
||||||
|
if (config.showSpinner)
|
||||||
|
$rootScope.showSpinner();
|
||||||
|
return config;
|
||||||
|
},
|
||||||
|
requestError: function(rejection) {
|
||||||
|
$rootScope.hideSpinner();
|
||||||
|
return $q.reject(rejection);
|
||||||
|
},
|
||||||
|
response: function(response) {
|
||||||
|
$rootScope.hideSpinner();
|
||||||
|
return response;
|
||||||
|
},
|
||||||
|
responseError: function(rejection) {
|
||||||
|
$rootScope.hideSpinner();
|
||||||
|
return $q.reject(rejection);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}]);
|
||||||
|
|
||||||
|
angular.module("robware").controller("main", ['$scope', '$rootScope', function ($scope, $rootScope) {
|
||||||
|
console.log(123);
|
||||||
|
var largeWindowBoundary = 1023;
|
||||||
|
|
||||||
|
$scope.menuVisible = false;//window.innerWidth > largeWindowBoundary;
|
||||||
|
|
||||||
|
$scope.shouldShowMenu = function() {
|
||||||
|
return $scope.menuVisible || window.innerWidth > largeWindowBoundary;
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.spinnerVisible = false;
|
||||||
|
|
||||||
|
$rootScope.showSpinner = function() {
|
||||||
|
$scope.spinnerVisible = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
$rootScope.hideSpinner = function() {
|
||||||
|
$scope.spinnerVisible = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
$(window).on("resize.doResize", function() {
|
||||||
|
$scope.$apply(function() {
|
||||||
|
//$scope.menuVisible = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.errors=[];
|
||||||
|
$scope.showErrors=function(errors){
|
||||||
|
$scope.errors=errors;
|
||||||
|
}
|
||||||
|
}]);
|
65
Website/wwwroot/js/controllers/status.js
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
angular.module("robware").controller('status', ["$scope", "statusService", "$interval", function($scope, statusService, $interval) {
|
||||||
|
$scope.chartData=[];
|
||||||
|
var chartDataId=0;
|
||||||
|
|
||||||
|
function reloadUptime() {
|
||||||
|
statusService.getUptime().then(function(data) {
|
||||||
|
$scope.uptime = data;
|
||||||
|
$scope.haveUptime = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$scope.haveUptime = false;
|
||||||
|
$scope.uptime = {};
|
||||||
|
reloadUptime();
|
||||||
|
$interval(reloadUptime, 60000);
|
||||||
|
|
||||||
|
function reloadSystemInfo() {
|
||||||
|
statusService.getSystemInfo().then(function(data) {
|
||||||
|
if ($scope.chartData.length>=50)
|
||||||
|
$scope.chartData.shift();
|
||||||
|
$scope.chartData=$scope.chartData.concat([{id: chartDataId, CPU: data.load[0]*100, Mem: data.memUsage, Temp: data.cpuTemp}]);
|
||||||
|
chartDataId++;
|
||||||
|
$scope.load = data.load;
|
||||||
|
$scope.cpuTemp = data.cpuTemp;
|
||||||
|
$scope.memory = {
|
||||||
|
free: data.memFree,
|
||||||
|
used: data.memUsage,
|
||||||
|
total: data.memTotal
|
||||||
|
};
|
||||||
|
$scope.haveSystemInfo = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$scope.haveSystemInfo = false;
|
||||||
|
$scope.load = {};
|
||||||
|
$scope.loadHistory = [];
|
||||||
|
$scope.cpuTemp = 0;
|
||||||
|
$scope.systemInfoRefreshInterval = 5;
|
||||||
|
var systemRefresh = $interval(reloadSystemInfo, $scope.systemInfoRefreshInterval * 1000);
|
||||||
|
reloadSystemInfo();
|
||||||
|
$scope.changeSystemInfoRefreshInterval = function(amount) {
|
||||||
|
$scope.systemInfoRefreshInterval += amount;
|
||||||
|
if ($scope.systemInfoRefreshInterval < 1)
|
||||||
|
return;
|
||||||
|
$interval.cancel(systemRefresh);
|
||||||
|
systemRefresh = $interval(reloadSystemInfo, $scope.systemInfoRefreshInterval * 1000);
|
||||||
|
};
|
||||||
|
|
||||||
|
function reloadProcesses() {
|
||||||
|
statusService.getProcesses().then(function(data) {
|
||||||
|
$scope.processes = data;
|
||||||
|
$scope.haveProcesses = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$scope.haveProcesses = false;
|
||||||
|
$scope.processses = {};
|
||||||
|
$scope.processRefreshInterval = 10;
|
||||||
|
var processRefesh = $interval(reloadProcesses, $scope.processRefreshInterval * 1000);
|
||||||
|
reloadProcesses();
|
||||||
|
$scope.changeProcesRefreshInterval = function(amount) {
|
||||||
|
$scope.processRefreshInterval += amount;
|
||||||
|
if ($scope.processRefreshInterval < 1)
|
||||||
|
return;
|
||||||
|
$interval.cancel(processRefesh);
|
||||||
|
processRefesh = $interval(reloadProcesses, $scope.processRefreshInterval * 1000);
|
||||||
|
};
|
||||||
|
}]);
|
56
Website/wwwroot/js/controllers/temperature.js
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
angular.module("robware").controller('temperature', ["$scope", "temperatureService", "$interval", function($scope, temperatureService, $interval) {
|
||||||
|
$scope.readings = [];
|
||||||
|
$scope.temperatureData = {};
|
||||||
|
|
||||||
|
$scope.$watch("readings", function() {
|
||||||
|
for (var i = 0; i < $scope.readings.length; i++) {
|
||||||
|
$scope.readings[i].Timestamp = new Date($scope.readings[i].Timestamp * 1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function getData() {
|
||||||
|
temperatureService.getReadings().then(function(data) {
|
||||||
|
$scope.readings = data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$interval(getData, 60000);
|
||||||
|
|
||||||
|
function updateCurrentTemperature() {
|
||||||
|
temperatureService.getCurrentTemperatureData().then(function(data) {
|
||||||
|
$scope.temperatureData = data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$interval(updateCurrentTemperature, 5000);
|
||||||
|
|
||||||
|
var graphAdjustment = 10;
|
||||||
|
|
||||||
|
$scope.getGraphPercentage = function() {
|
||||||
|
var graphTarget = ($scope.temperatureData.target * 1.2) - graphAdjustment;
|
||||||
|
var graphTemperature = $scope.temperatureData.temperature - graphAdjustment;
|
||||||
|
return Math.min((graphTemperature / graphTarget) * 100, 100);
|
||||||
|
};
|
||||||
|
|
||||||
|
function getPercentage() {
|
||||||
|
return (($scope.temperatureData.target - graphAdjustment) / (($scope.temperatureData.temperature * 1.5) - graphAdjustment)) * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.getRed = function() {
|
||||||
|
var percentage = getPercentage();
|
||||||
|
return 255 * (1 - (Math.min(50, percentage) / 50));
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.getBlue = function() {
|
||||||
|
var percentage = Math.max(getPercentage() - 50, 0);
|
||||||
|
return 255 * (Math.min(50, percentage) / 50);
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.getGreen = function() {
|
||||||
|
var percentage = getPercentage();
|
||||||
|
percentage = Math.min(percentage, 75);
|
||||||
|
percentage = Math.max(percentage, 25);
|
||||||
|
percentage = Math.abs(50 - percentage);
|
||||||
|
percentage /= 25;
|
||||||
|
return 255 * (1 - Math.max(percentage, 0));
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
|
48
Website/wwwroot/js/controllers/weight.js
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
angular.module("robware").controller("weight", ["$scope", "weightService", function($scope, weightService) {
|
||||||
|
$scope.submitting = false;
|
||||||
|
$scope.weight = null;
|
||||||
|
$scope.fat = null;
|
||||||
|
|
||||||
|
$scope.readings = [];
|
||||||
|
$scope.headings = {weight: "Weight (KG)", fat: "Fat %", bmi: "BMI"};
|
||||||
|
|
||||||
|
function refreshReadings() {
|
||||||
|
weightService.getReadings().then(function(data) {
|
||||||
|
$scope.readings = data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.$watch("readings", function() {
|
||||||
|
for (var i = 0; i < $scope.readings.length; i++) {
|
||||||
|
$scope.readings[i].date = new Date($scope.readings[i].date);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.addReading = function() {
|
||||||
|
if (!$scope.weight || !$scope.fat)
|
||||||
|
return;
|
||||||
|
|
||||||
|
$scope.submitting = true;
|
||||||
|
weightService.addWeight($scope.weight, $scope.fat).then(function(data) {
|
||||||
|
refreshReadings();
|
||||||
|
$scope.submitting = false;
|
||||||
|
$scope.weight = null;
|
||||||
|
$scope.fat = null;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.deleteReading = function(id) {
|
||||||
|
weightService.deleteWeight(id).then(function() {
|
||||||
|
refreshReadings();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.defineProperty($scope, "tenLatestReadings", {
|
||||||
|
get: function() {
|
||||||
|
var temp = $scope.readings.slice(-10);
|
||||||
|
temp.reverse();
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}]);
|
||||||
|
|
58
Website/wwwroot/js/directives/contextMenu.js
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
angular.module("robware").directive('contextMenu', function() {
|
||||||
|
return {
|
||||||
|
restrict: 'E',
|
||||||
|
templateUrl: '/scripts/directives/templates/contextMenu.html',
|
||||||
|
scope: {
|
||||||
|
actions: '=',
|
||||||
|
isChild: '=?'
|
||||||
|
},
|
||||||
|
link: function(scope, element) {
|
||||||
|
scope.isFunction = angular.isFunction;
|
||||||
|
scope.show=false;
|
||||||
|
scope.selectedElement=null;
|
||||||
|
scope.subMenuShowKey="";
|
||||||
|
|
||||||
|
scope.changeSubMenuShowKey=function(name){
|
||||||
|
scope.subMenuShowKey=name;
|
||||||
|
};
|
||||||
|
|
||||||
|
function show(x, y, target){
|
||||||
|
scope.changeSubMenuShowKey("");
|
||||||
|
scope.menuX=x+"px";
|
||||||
|
scope.menuY=y+"px";
|
||||||
|
scope.selectedElement=target;
|
||||||
|
scope.show=true;
|
||||||
|
};
|
||||||
|
|
||||||
|
function hide(){
|
||||||
|
scope.show=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.performAction=function(func){
|
||||||
|
if (!angular.isFunction(func))
|
||||||
|
return;
|
||||||
|
func($(scope.selectedElement).scope());
|
||||||
|
hide();
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).on("click", function(e){
|
||||||
|
hide();
|
||||||
|
scope.$apply();
|
||||||
|
});
|
||||||
|
|
||||||
|
var parent=element.parent()[0];
|
||||||
|
|
||||||
|
if (scope.isChild){
|
||||||
|
show(parent.clientWidth,parent.clientTop);
|
||||||
|
}else
|
||||||
|
$(parent).css("position","relative");
|
||||||
|
element.parent().on("contextmenu", function(e){
|
||||||
|
var offset=$(element).offset();
|
||||||
|
show(e.pageX-offset.left, e.pageY-offset.top, e.target);
|
||||||
|
scope.$apply();
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
38
Website/wwwroot/js/directives/dragDrop.js
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
angular.module("robware").directive('dragDrop', function() {
|
||||||
|
return {
|
||||||
|
restrict: 'A',
|
||||||
|
scope: {
|
||||||
|
dragDrop:'='
|
||||||
|
},
|
||||||
|
link: function(scope, element) {
|
||||||
|
function handleEvent(e){
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
|
||||||
|
element.on('dragover', function(e) {
|
||||||
|
handleEvent(e);
|
||||||
|
});
|
||||||
|
element.on('dragenter', function(e) {
|
||||||
|
handleEvent(e);
|
||||||
|
$(element).addClass("dragOver");
|
||||||
|
});
|
||||||
|
element.on('dragleave', function(e) {
|
||||||
|
handleEvent(e);
|
||||||
|
$(element).removeClass("dragOver");
|
||||||
|
});
|
||||||
|
element.on('drop', function(e){
|
||||||
|
handleEvent(e);
|
||||||
|
$(element).removeClass("dragOver");
|
||||||
|
|
||||||
|
if (e.originalEvent.dataTransfer){
|
||||||
|
if (e.originalEvent.dataTransfer.files.length > 0) {
|
||||||
|
scope.dragDrop(e.originalEvent.dataTransfer.files);
|
||||||
|
scope.$apply();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
14
Website/wwwroot/js/directives/equalHeightWidth.js
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
angular.module("robware").directive("equalWidth", function() {
|
||||||
|
return {
|
||||||
|
restrict: 'A',
|
||||||
|
link: function(scope, element) {
|
||||||
|
scope.getHeight = function() {
|
||||||
|
return $(element).height();
|
||||||
|
};
|
||||||
|
scope.$watch(scope.getHeight, function(height) {
|
||||||
|
$(element).width(height);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
122
Website/wwwroot/js/directives/googleChart.js
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
/* global google, angular */
|
||||||
|
|
||||||
|
angular.module("robware").directive('googleChart', function() {
|
||||||
|
return {
|
||||||
|
restrict: 'E',
|
||||||
|
templateUrl: '/scripts/directives/templates/googleChart.html',
|
||||||
|
scope: {
|
||||||
|
data: '=',
|
||||||
|
headings: '=?',
|
||||||
|
ignore: '=?',
|
||||||
|
height: '='
|
||||||
|
},
|
||||||
|
link: function(scope, element, attributes) {
|
||||||
|
var chartLoaded = false;
|
||||||
|
|
||||||
|
if (!scope.headings)
|
||||||
|
scope.headings = [];
|
||||||
|
|
||||||
|
if (!scope.ignore)
|
||||||
|
scope.ignore = [];
|
||||||
|
|
||||||
|
var chartData, chart;
|
||||||
|
var chartOptions = {
|
||||||
|
title: attributes.title,
|
||||||
|
height: scope.height || 400,
|
||||||
|
curveType: attributes.curveType,
|
||||||
|
legend: {
|
||||||
|
position: attributes.legendPosition || 'right'
|
||||||
|
},
|
||||||
|
vAxis: {
|
||||||
|
title: attributes.vAxisTitle
|
||||||
|
},
|
||||||
|
backgroundColor: attributes.background || 'transparent'
|
||||||
|
};
|
||||||
|
|
||||||
|
function formatToolTip(input, args) {
|
||||||
|
return input.replace(/{(.+?)(:.*?)?}/g, function(match, index, format) {
|
||||||
|
if (format)
|
||||||
|
format = format.slice(1);
|
||||||
|
if (args[index]===undefined)
|
||||||
|
return match;
|
||||||
|
if (isNumber(args[index]))
|
||||||
|
return args[index].toString(format, true);
|
||||||
|
return args[index].toString(format);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function shouldIgnore(value){
|
||||||
|
return scope.ignore.indexOf(value)>-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupChart() {
|
||||||
|
if (!chartLoaded)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var firstRow = scope.data[0];
|
||||||
|
var fields = {};
|
||||||
|
for (var propertyName in firstRow) {
|
||||||
|
if (shouldIgnore(propertyName))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var datum = firstRow[propertyName];
|
||||||
|
var type = typeof (datum);
|
||||||
|
if (type === "object")
|
||||||
|
type = datum.constructor.name;
|
||||||
|
fields[propertyName] = {
|
||||||
|
title: scope.headings[propertyName] || propertyName,
|
||||||
|
type: type.toLowerCase()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
chartData = new google.visualization.DataTable();
|
||||||
|
angular.forEach(fields, function(value) {
|
||||||
|
chartData.addColumn(value.type, value.title);
|
||||||
|
if (attributes['toolTip' + value.title.upperCaseFirst()])
|
||||||
|
chartData.addColumn({type: 'string', role: 'tooltip'});
|
||||||
|
});
|
||||||
|
|
||||||
|
angular.forEach(scope.data, function(value) {
|
||||||
|
var row = [];
|
||||||
|
angular.forEach(value, function(value2, index) {
|
||||||
|
if (shouldIgnore(index))
|
||||||
|
return;
|
||||||
|
|
||||||
|
row.push(value2);
|
||||||
|
var attrIndex = 'toolTip' + index.upperCaseFirst();
|
||||||
|
if (attributes[attrIndex])
|
||||||
|
row.push(formatToolTip(attributes[attrIndex], value));
|
||||||
|
});
|
||||||
|
chartData.addRow(row);
|
||||||
|
});
|
||||||
|
|
||||||
|
chart = new google.visualization.LineChart(element[0]);
|
||||||
|
drawChart();
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawChart() {
|
||||||
|
chart.draw(chartData, chartOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
$.getScript("https://www.google.com/jsapi", function() {
|
||||||
|
//google.load('visualization', '1.1', {packages: ['line'], callback:function(){
|
||||||
|
google.load('visualization', '1', {
|
||||||
|
packages: ['corechart'],
|
||||||
|
callback: function() {
|
||||||
|
chartLoaded = true;
|
||||||
|
setupChart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
scope.$watch("data", function(v) {
|
||||||
|
setupChart();
|
||||||
|
});
|
||||||
|
|
||||||
|
angular.element(window).bind('resize', function() {
|
||||||
|
drawChart();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
11
Website/wwwroot/js/directives/scopeInit.js
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
angular.module("robware").directive("scopeInit", function(){
|
||||||
|
return {
|
||||||
|
restrict : 'E',
|
||||||
|
link:function(scope, element, attributes){
|
||||||
|
var content=element[0].innerHTML.trim();
|
||||||
|
scope[attributes.value]=JSON.parse(content);
|
||||||
|
element.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
6
Website/wwwroot/js/directives/templates/contextMenu.html
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<div class="contextMenu" ng-if="show" ng-style="{left:menuX,top:menuY}">
|
||||||
|
<div ng-repeat="(name, func) in actions track by name" class="menuItem" ng-click="performAction(func)" ng-mouseover="changeSubMenuShowKey(name)">
|
||||||
|
{{name}}<span class="arrow" ng-if="!isFunction(func)"> ›</span>
|
||||||
|
<context-menu ng-if="!isFunction(func)" actions="func" is-child="true" ng-show="subMenuShowKey==name"></context-menu>
|
||||||
|
</div>
|
||||||
|
</div>
|
1
Website/wwwroot/js/directives/templates/googleChart.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<div class="mapsContainer">Loading chart...</div>
|
145
Website/wwwroot/js/javascript.js
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
function Navigate(url) {
|
||||||
|
window.location = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateCookie(name, value, days) {
|
||||||
|
var expires;
|
||||||
|
if (days) {
|
||||||
|
var date = new Date();
|
||||||
|
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
||||||
|
expires = "; expires=" + date.toGMTString();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
expires = "";
|
||||||
|
}
|
||||||
|
document.cookie = name + "=" + value + expires + "; path=/";
|
||||||
|
}
|
||||||
|
|
||||||
|
function round(value, decimals) {
|
||||||
|
return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isNumber(value){
|
||||||
|
return isFinite(String(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
String.prototype.upperCaseFirst = function() {
|
||||||
|
var lower = this.toLowerCase();
|
||||||
|
return lower.charAt(0).toUpperCase() + lower.slice(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
function twoDigitZeroPad(input){
|
||||||
|
input=input.toString();
|
||||||
|
return [!input[1] && '0' || "", input].join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
Date.prototype.oldToString = Date.prototype.toString;
|
||||||
|
Date.prototype.toString = function(format) {
|
||||||
|
if (!format)
|
||||||
|
return this.oldToString();
|
||||||
|
var me=this;
|
||||||
|
return format.replace(/./g, function(match) {
|
||||||
|
switch(match){
|
||||||
|
case 'd': return twoDigitZeroPad(me.getDate());
|
||||||
|
case 'm': return twoDigitZeroPad(me.getMonth()+1);
|
||||||
|
case 'y': return me.getFullYear();
|
||||||
|
case "H": return twoDigitZeroPad(me.getHours());
|
||||||
|
case "i": return twoDigitZeroPad(me.getMinutes());
|
||||||
|
case "s": return twoDigitZeroPad(me.getSeconds());
|
||||||
|
default: return match;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Number.prototype.oldToString=Number.prototype.toString;
|
||||||
|
Number.prototype.toString=function(input, shouldRound){
|
||||||
|
if (!shouldRound)
|
||||||
|
return this.oldToString(input);
|
||||||
|
|
||||||
|
return round(this, input);
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
var panels = $("nav > dl > .sub-pages");
|
||||||
|
var goIndicators = $("nav > dl > dt .go");
|
||||||
|
var expandIndicators = $("nav > dl > dt .expand");
|
||||||
|
panels.hide();
|
||||||
|
expandIndicators.show();
|
||||||
|
|
||||||
|
$("nav > dl > dt").click(function(e) {
|
||||||
|
var next = $(this).next();
|
||||||
|
if (!next.hasClass("sub-pages")) {
|
||||||
|
Navigate($(this).children("a").attr("href"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
panels.slideUp();
|
||||||
|
goIndicators.hide();
|
||||||
|
expandIndicators.show();
|
||||||
|
if (next.is(":visible")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
next.slideDown();
|
||||||
|
$(this).children(".go").show();
|
||||||
|
$(this).children(".expand").hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("nav dd").click(function(e) {
|
||||||
|
Navigate($(this).children("a").attr("href"));
|
||||||
|
});
|
||||||
|
|
||||||
|
$("nav a").click(function(e) {
|
||||||
|
$(this).parent().click();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#body").css("padding-bottom", window.innerHeight - $("#buttons-right").offset().top);
|
||||||
|
|
||||||
|
$("form[ajaxForm]").submit(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
form = $(this);
|
||||||
|
$.ajax({
|
||||||
|
url: form.attr("action"),
|
||||||
|
method: form.attr("method"),
|
||||||
|
data: form.serialize(),
|
||||||
|
success: function(data) {
|
||||||
|
var successFunction = form.attr("onsuccess");
|
||||||
|
if (successFunction !== undefined && window[successFunction] !== undefined)
|
||||||
|
window[successFunction](data);
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
var errorFunction = form.attr("onerror");
|
||||||
|
if (errorFunction !== undefined && window[errorFunction] !== undefined)
|
||||||
|
window[errorFunction]();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
var postFunction = form.attr("onpost");
|
||||||
|
if (postFunction !== undefined && window[postFunction] !== undefined)
|
||||||
|
window[postFunction]();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("td").each(function() {
|
||||||
|
var elem = $(this);
|
||||||
|
if (/^[+-]?\d+(\.\d+)?$/.test(elem.text())) {
|
||||||
|
elem.addClass("number");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).delegate('.allowTabInput', 'keydown', function(e) {
|
||||||
|
var keyCode = e.keyCode || e.which;
|
||||||
|
console.log(e);
|
||||||
|
if (keyCode == 9) {
|
||||||
|
e.preventDefault();
|
||||||
|
var start = $(this).get(0).selectionStart;
|
||||||
|
var end = $(this).get(0).selectionEnd;
|
||||||
|
|
||||||
|
// set textarea value to: text before caret + tab + text after caret
|
||||||
|
$(this).val($(this).val().substring(0, start)
|
||||||
|
+ "\t"
|
||||||
|
+ $(this).val().substring(end));
|
||||||
|
|
||||||
|
// put caret at right position again
|
||||||
|
$(this).get(0).selectionStart =
|
||||||
|
$(this).get(0).selectionEnd = start + 1;
|
||||||
|
}
|
||||||
|
});
|
60
Website/wwwroot/js/services/statusService.js
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
angular.module("robware").service('statusService', ["$http", function($http) {
|
||||||
|
function parseProcessData(data) {
|
||||||
|
var headers = data.shift();
|
||||||
|
var cpuIndex = -1;
|
||||||
|
var ignoreColNames = ["user", "pid", "vsz", "rss", "tty", "stat"];
|
||||||
|
var ignoreCols = [];
|
||||||
|
|
||||||
|
var processHeaders = []
|
||||||
|
for (var col in headers) {
|
||||||
|
if (headers[col].toLowerCase() === "%cpu")
|
||||||
|
cpuIndex = col;
|
||||||
|
|
||||||
|
if (ignoreColNames.indexOf(headers[col].toLowerCase()) > -1)
|
||||||
|
ignoreCols.push(col);
|
||||||
|
else
|
||||||
|
processHeaders.push(headers[col]);
|
||||||
|
}
|
||||||
|
|
||||||
|
data.sort(function (a, b) {
|
||||||
|
cpuA = parseFloat(a[cpuIndex]);
|
||||||
|
cpuB = parseFloat(b[cpuIndex]);
|
||||||
|
if (cpuA > cpuB)
|
||||||
|
return -1;
|
||||||
|
if (cpuA < cpuB)
|
||||||
|
return 1
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
var processData = [];
|
||||||
|
for (var row in data) {
|
||||||
|
var obj = {};
|
||||||
|
for (var col in data[row]) {
|
||||||
|
if (ignoreCols.indexOf(col) === -1)
|
||||||
|
obj[headers[col]] = data[row][col];
|
||||||
|
}
|
||||||
|
processData.push(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [processHeaders, processData];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getProcesses = function() {
|
||||||
|
return $http.get('/status/getprocesses').then(function(response) {
|
||||||
|
parsedData = parseProcessData(response.data);
|
||||||
|
return {headers: parsedData[0], data: parsedData[1]};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getSystemInfo=function(){
|
||||||
|
return $http.get('/status/getsysteminfo').then(function(response){
|
||||||
|
return response.data;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getUptime=function(){
|
||||||
|
return $http.get('/status/getuptime').then(function(response){
|
||||||
|
return response.data;
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}]);
|
13
Website/wwwroot/js/services/temperatureService.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
angular.module("robware").service('temperatureService', ["$http", function($http) {
|
||||||
|
this.getReadings = function() {
|
||||||
|
return $http.get('/temperature/getreadings', {dontShowSpinner:true}).then(function(response) {
|
||||||
|
return response.data;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getCurrentTemperatureData = function() {
|
||||||
|
return $http.get("/temperature/GetTemperatureData", {dontShowSpinner:true}).then(function(response) {
|
||||||
|
return response.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}]);
|
31
Website/wwwroot/js/services/weightService.js
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
angular.module("robware").service('weightService', ["$http", function($http) {
|
||||||
|
this.addWeight=function(weight, fat){
|
||||||
|
return $http({
|
||||||
|
method:'post',
|
||||||
|
url:'/weight/add',
|
||||||
|
data:{weight:weight, fat:fat},
|
||||||
|
showSpinner:true
|
||||||
|
}).then(function(response){
|
||||||
|
return response.data;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.deleteWeight=function(id){
|
||||||
|
return $http({
|
||||||
|
method:'post',
|
||||||
|
url:'/weight/delete',
|
||||||
|
data:{id:id},
|
||||||
|
showSpinner:true
|
||||||
|
}).then(function(response){
|
||||||
|
return response.data;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
this.getReadings=function(){
|
||||||
|
return $http({
|
||||||
|
method:'post',
|
||||||
|
url:'/weight/getreadings',
|
||||||
|
showSpinner:true
|
||||||
|
}).then(function(response){
|
||||||
|
return response.data;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}]);
|
|
@ -1,4 +0,0 @@
|
||||||
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
|
||||||
// for details on configuring this project to bundle and minify static web assets.
|
|
||||||
|
|
||||||
// Write your JavaScript code.
|
|