Update: SignalR 2.0.3 Migration; Noticeboards

Migrate all SignalR 1.x Persistent Connections to SignalR 2.x Hubs.
Abstracts ScheduledTaskStatus with core interface and adds a Mock for
optional status reporting. Noticeboards rewritten (with new theme) to be
more resilient and accurate.
This commit is contained in:
Gary Sharp committed 2014-06-01 23:27:07 +10:00
1 parent f6fae26bc7
commit 4cd57f4a90
116 files changed
+9874 -6462

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -1,90 +1,209 @@
@import "../Declarations";
@import "../normalize";
@import "../FontAwesome/font-awesome";
html, body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
overflow: hidden;
margin: 0;
padding: 0;
height: 100%;
width: 100%;
overflow: hidden;
}
body
{
background-color: #84abcb;
font-size: 1em;
font-family: @FontFamilyBody;
color: #333;
body {
background: linear-gradient(to bottom, darken(@ButtonColour, 10%), @ButtonColour) left top repeat-x @ButtonColour;
font-size: 16px;
font-family: @FontFamilyBody;
color: @white;
cursor: auto;
}
h1, h2, h3, h4 {
margin: 0;
padding: 0;
margin: 0;
padding: 0;
}
div#page {
margin: 0px;
padding: 0px;
margin: 0px;
padding: 0px;
height: 100%;
}
header {
font-family: @FontFamilyHeading;
font-weight: @FontWeightHeading;
font-stretch: @FontStretchHeading;
font-size: 2em;
padding: 10px 20px;
background-color: rgba(255, 255, 255, 0.7);
border-bottom: 10px solid rgba(255, 255, 255, 0.8);
height: 40px;
box-shadow: 0 5px 20px #555;
}
header, #header {
position: relative;
background-color: @HeaderBackgroundColour;
margin: 0;
padding: 0;
height: 34px;
div#mainFooter {
clear: both;
padding: 10px 20px;
background-color: rgba(255, 255, 255, 0.7);
text-align: right;
height: 20px;
color: #000;
font-size: 0.8em;
}
#heading {
margin-left: 4px;
display: inline-block;
font-size: 1.1em;
font-weight: bold;
line-height: 34px;
text-transform: uppercase;
}
.list {
float: left;
margin: 15px 5px 10px 5px;
h3 {
color: #000;
font-family: @FontFamilyHeading;
font-weight: @FontWeightHeading;
#credits {
font-family: @FontFamilyHeading;
font-weight: @FontWeightHeading;
font-stretch: @FontStretchHeading;
margin-left: 10px;
margin-bottom: 10px;
font-size: 1.4em;
}
div.content {
border: 2px solid rgba(255, 255, 255, 0);
background: rgba(255, 255, 255, 0.3);
border-radius: 2px;
overflow: hidden;
ul {
padding: 0;
margin: 0;
list-style: none;
li {
font-size: 1em;
margin: 3px;
background-color: #fff;
border: 5px solid rgba(132, 171, 203, 0.2);
border-radius: 2px;
padding: 4px 5px;
.small {
font-size: 0.75em;
font-style: italic;
}
}
li.alert {
background-color: #FFADAD;
}
font-size: .8em;
position: absolute;
top: 0;
right: 4px;
height: 34px;
i {
margin-bottom: -10px;
display: inline-block;
height: 34px;
width: 34px;
background-image: url(data:image/png;base64,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) /*Images/Heading.png*/;
}
}
}
}
}
#statusConnecting, #statusError {
display: none;
}
#mainSection {
display: block;
position: relative;
height: calc(~"100% - 34px");
.list {
height: calc(~"100% - 25px");
float: left;
margin: 15px 0 0 6px;
h3 {
font-family: @FontFamilyHeading;
font-weight: @FontWeightHeading;
font-stretch: @FontStretchHeading;
text-transform: uppercase;
margin-left: 10px;
margin-bottom: 10px;
font-size: 1.4em;
height: 30px;
}
div.content {
background: rgba(255, 255, 255, 0.2);
height: calc(~"100% - 30px");
overflow: hidden;
div.noContent {
font-family: @FontFamilyHeading;
font-weight: @FontWeightHeading;
font-stretch: @FontStretchHeading;
font-size: 1.1em;
text-align: center;
text-transform: lowercase;
margin-top: 40px;
color: rgba(255, 255, 255, 0.8);
}
ul {
padding: 0;
margin: 0;
list-style: none;
li {
position: relative;
margin: 4px 2px;
background-color: #fff;
border: 1px solid lighten(@ButtonColour, 10%);
padding: 6px 8px;
color: @black;
clear: both;
overflow: hidden;
white-space: nowrap;
-ms-text-overflow: ellipsis;
-o-text-overflow: ellipsis;
text-overflow: ellipsis;
.small {
display: inline-block;
float: right;
font-size: 0.8em;
margin-top: 0.1em;
}
&.alert {
background-color: @StatusError;
color: @white;
}
&:after {
clear: both;
content: ".";
display: block;
height: 0;
visibility: hidden;
font-size: 0;
}
}
}
}
}
#inProcess {
width: calc(~"28% - 8px");
}
#readyForReturn {
width: calc(~"36% - 8px");
}
#waitingForUserAction {
width: calc(~"36% - 8px");
}
}
footer, #footer {
position: absolute;
bottom: 0;
width: 100%;
height: 50px;
background: linear-gradient(to bottom, fadeout(@ButtonColour, 100%), @ButtonColour 90%) left top repeat-x;
display: block;
}
body.status-connecting {
#statusConnecting {
display: inline-block;
color: @StatusAlert;
margin-left: 14px;
line-height: 34px;
span {
padding-left: 4px;
font-size: .8em;
}
}
#mainSection {
display: none;
}
}
body.status-error {
#statusError {
display: inline-block;
color: @StatusAlert;
margin-left: 14px;
line-height: 34px;
span {
padding-left: 4px;
font-size: .8em;
}
}
#mainSection {
opacity: 0.3;
}
}
@@ -1 +1 @@
html,body{margin:0;padding:0;height:100%;width:100%;overflow:hidden}body{background-color:#84abcb;font-size:1em;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;color:#333;cursor:auto}h1,h2,h3,h4{margin:0;padding:0}div#page{margin:0;padding:0}header{font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;font-size:2em;padding:10px 20px;background-color:rgba(255,255,255,.7);border-bottom:10px solid rgba(255,255,255,.8);height:40px;box-shadow:0 5px 20px #555}div#mainFooter{clear:both;padding:10px 20px;background-color:rgba(255,255,255,.7);text-align:right;height:20px;color:#000;font-size:.8em}.list{float:left;margin:15px 5px 10px 5px}.list h3{color:#000;font-family:"Segoe UI",Arial,Verdana,Tahoma,sans-serif;font-weight:lighter;font-stretch:condensed;margin-left:10px;margin-bottom:10px;font-size:1.4em}.list div.content{border:2px solid rgba(255,255,255,0);background:rgba(255,255,255,.3);border-radius:2px;overflow:hidden}.list div.content ul{padding:0;margin:0;list-style:none}.list div.content ul li{font-size:1em;margin:3px;background-color:#fff;border:5px solid rgba(132,171,203,.2);border-radius:2px;padding:4px 5px}.list div.content ul li .small{font-size:.75em;font-style:italic}.list div.content ul li.alert{background-color:#ffadad}
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"“" "”" "‘" "’"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@font-face{font-family:'FontAwesome';src:url('/ClientSource/Style/FontAwesome//fontawesome-webfont.eot?v=4.1.0');src:url('/ClientSource/Style/FontAwesome//fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),url('/ClientSource/Style/FontAwesome//fontawesome-webfont.woff?v=4.1.0') format('woff'),url('/ClientSource/Style/FontAwesome//fontawesome-webfont.ttf?v=4.1.0') format('truetype'),url('/ClientSource/Style/FontAwesome//fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);}100%{-o-transform:rotate(359deg);}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.faLine truncated
@@ -1,23 +1,23 @@
<?xml version='1.0' ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="us-ascii" method="html" indent="yes" />
<xsl:template match="/ArrayOfUserHeldDeviceModel">
<xsl:template match="/ArrayOfIHeldDeviceItem">
<table class="ms-listviewtable" width="100%" border="0" cellSpacing="0" cellPadding="0">
<tbody>
<tr class="ms-viewheadertr ms-vhltr">
<th class="ms-vh2">Username</th>
<th class="ms-vh2">Name</th>
</tr>
<xsl:apply-templates select="UserHeldDeviceModel">
<xsl:sort select="UserId" />
<xsl:apply-templates select="IHeldDeviceItem">
<xsl:sort select="UserIdFriendly" />
</xsl:apply-templates>
</tbody>
</table>
</xsl:template>
<xsl:template match="UserHeldDeviceModel">
<xsl:template match="IHeldDeviceItem">
<tr class="ms-itmhover" style="cursor: default">
<td class="ms-vb-title ms-vb-firstCell">
<xsl:value-of select="UserId"/>
<xsl:value-of select="UserIdFriendly"/>
</td>
<td class="ms-vb2 ms-vb-lastCell" style="cursor: default">
<xsl:value-of select="UserDisplayName"/>