37 Commits

Author SHA1 Message Date
Stephan 78c327e3f3 Prevent rogue registrations from crashing db 2016-12-07 17:02:14 +01:00
Sebastiaan Janssen 1e5a959f25 7.5.5 upgrade was OK after all 2016-12-07 13:48:36 +01:00
Sebastiaan Janssen e1529e7f8f Html Agility Pack binding redirect missing 2016-12-07 13:31:04 +01:00
Sebastiaan Janssen 47123a7d0a Revert "Upgrade to Umbraco 7.5.5"
This reverts commit a0f27739b7.
2016-12-07 12:59:03 +01:00
Sebastiaan Janssen a0f27739b7 Upgrade to Umbraco 7.5.5 2016-12-07 11:57:20 +01:00
Sebastiaan Janssen 93474811f1 Replace all UmbracoContext.Current.Application with ApplicationContext.Current
UmbracoContext.Current == is based on a web request, if any code executes on a background thread or non-request thread then UmbracoContext.Current is null!
2016-11-25 21:04:49 +01:00
Sebastiaan Janssen 6f50fad596 Update all SqlHelper instanced to use the umbraco.Businesslogic version and wrapped them all in usings where necessary 2016-11-25 20:54:32 +01:00
Sebastiaan Janssen 538834dcc3 Update all SqlHelper instanced to use the umbraco.Businesslogic version and wrapped them all in usings where necessary 2016-11-25 20:49:30 +01:00
Sebastiaan Janssen 389ddaabb7 Disable Hangfire to see if that's causing the memory issues 2016-11-08 11:35:48 +01:00
Sebastiaan Janssen c7d2d53902 Get the email and name differently 2016-11-07 22:38:45 +01:00
Sebastiaan Janssen 367a98be56 Hangfire wasn't too happy with System.Net.MailAddress 2016-11-07 15:35:00 +01:00
Sebastiaan Janssen 2128fb883a Refactor MarkAsSolutionReminder to be a bit more efficient 2016-11-07 12:36:28 +01:00
Sebastiaan Janssen 729da39c87 Enable sending of mail 2016-10-31 13:39:14 +01:00
Sebastiaan Janssen 7e82ea86ec Little refactor and bugfix 2016-10-30 12:47:41 +01:00
Sebastiaan Janssen ddac31b8bc Ignore Hangfire route so Umbraco doesn't pick it up 2016-10-30 12:13:27 +01:00
Sebastiaan Janssen 491b5527ae Test solution reminder notification 2016-10-30 11:57:19 +01:00
Sebastiaan Janssen e63a9d4b16 Move docs from UaaS to UCloud 2016-10-27 21:11:00 +02:00
Sebastiaan Janssen 6dac0ad4e8 OUR-426 Rename Umbraco as a Service forum to Umbraco Cloud forum
#OUR-426 Fixed
2016-10-27 21:01:52 +02:00
Sebastiaan Janssen 19a737a770 OUR-424 Update "works on UaaS" to "works on Umbraco Cloud"
#OUR-424 Fixed
2016-10-27 20:42:21 +02:00
Simon Busborg c083576ef3 Fixed some cosmetic bugs on smaller devices. 2016-10-24 12:14:52 +02:00
Simon Busborg 82ba42b1aa Fixed button bug after flexbox 2016-10-24 09:22:19 +02:00
Sebastiaan Janssen f39bbc2979 Adds client to solution so task runner explorer can be used to build the client-side files in VS 2016-10-23 13:42:58 +02:00
Sebastiaan Janssen f04cf5bb40 Correcting the wrong version references 2016-10-22 12:51:37 +02:00
Sebastiaan Janssen 12727c7a50 Upgrade to 7.5.4 2016-10-22 11:56:47 +02:00
Sebastiaan Janssen 22a382ddad Added padding to wrong class 2016-10-17 14:04:56 +02:00
Sebastiaan Janssen 4e00102bad Some quick fixes for misaligned buttons 2016-10-17 13:53:31 +02:00
Sebastiaan Janssen 75039c5198 Correct Google tracking code 2016-10-17 13:23:11 +02:00
Sebastiaan Janssen cf048ebc01 Some small corrections to the download page 2016-10-17 09:30:42 +02:00
Sebastiaan Janssen ec6df31b0c Merge branch 'feature-release-downloadbutton' 2016-10-17 09:21:37 +02:00
Simon Busborg 9a36eea042 Removed header for double information about download 2016-10-10 12:04:10 +02:00
Simon Busborg e933ea81d7 Clean up of unused styling 2016-10-10 11:42:00 +02:00
Simon Busborg 7ffb0286e3 Fixes: OUR-404 Update release pages to have a far more prominent call to action for download and install instructions 2016-10-10 10:01:35 +02:00
Simon Busborg 100fa68a15 Added line-height to notifications 2016-10-10 10:00:31 +02:00
Simon Busborg 612de0e016 Updated buttons to fix Webkit bug 2016-10-10 10:00:14 +02:00
Simon Busborg 427e5b91af added flexbox to project 2016-10-10 09:59:54 +02:00
Simon Busborg 3299aee2bd Added a utility file with flexbox 2016-10-10 09:59:33 +02:00
Simon Busborg 39c1df41a7 Updated packages and dependency versions for gulp, outcommented “combine media queries” that broke the task runner 2016-10-10 09:59:19 +02:00
833 changed files with 135071 additions and 133132 deletions
+1
View File
@@ -63,3 +63,4 @@ OurUmbraco.Site/[Aa]ssets/js/app.min.js
OurUmbraco.Site/App_Data/migrations/*.txt
OurUmbraco.Site/apidocs/
OurUmbraco.Site/App_Data/Documentation/
OurUmbraco.Site/App_Data/NotificationTest/
+3 -3
View File
@@ -1,4 +1,4 @@
<!doctype html>
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
@@ -1104,8 +1104,8 @@ namespace TestProject.Controllers
<option class="features" value="1150">our.umb dev forum - Features</option>
<option class="general" value="5668">Core - General</option>
<option class="4.1feedback" value="5669">Core - 4.1 feedback</option>
<option class="generalquestions" value="73967">Umbraco as a Service - General Questions</option>
<option class="issues" value="73968">Umbraco as a Service - Issues</option>
<option class="generalquestions" value="73967">Umbraco Cloud - General Questions</option>
<option class="issues" value="73968">Umbraco Cloud - Issues</option>
</select>
</div>
+3 -3
View File
@@ -1,4 +1,4 @@
<!doctype html>
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
@@ -624,8 +624,8 @@ grunt</pre>
<div class="package-compatibility-versions">
<div class="versions">
<span class="smiley joyous">Umbraco as a Service (Works)</span>
<span class="smiley untested">Umbraco as a Service (Not working yet)</span>
<span class="smiley joyous">Umbraco Cloud (Works)</span>
<span class="smiley untested">Umbraco Cloud (Not working yet)</span>
<span class="smiley untested"> 7.2.x (untested)</span>
<span class="smiley happy"> 7.1.x (91%)</span>
<span class="smiley joyous"> 7.0.x (100%)</span>
+2 -2
View File
@@ -1,4 +1,4 @@
var gulp = require('gulp'),
var gulp = require('gulp'),
gutil = require('gulp-util'),
sass = require('gulp-sass'),
jshint = require('gulp-jshint'),
@@ -57,7 +57,7 @@ gulp.task('css', function () {
.pipe(sass())
.on('error', gutil.log)
.pipe(autoprefixer('last 1 version', 'ie 9', 'ios 7'))
.pipe(cmq({log: true}))
// .pipe(cmq({log: true}))
.pipe(rename({suffix: '.min'}))
.pipe(minifyCss())
.pipe(gulp.dest(settings.build + '/assets/css'))
+8 -13
View File
@@ -7,17 +7,16 @@
"dependencies": {
},
"devDependencies": {
"gulp": "3.8.x",
"gulp-util": "2.2.x",
"gulp": "^3.9.1",
"gulp-util": "3.0.x",
"gulp-watch": "0.6.x",
"gulp-minify-css": "1.1.x",
"node-sass": "3.2.x",
"gulp-sass": "2.0.x",
"gulp-combine-media-queries": "0.1.x",
"gulp-sass": "^2.2.0",
"gulp-combine-media-queries": "0.2.x",
"gulp-imagemin": "0.6.x",
"gulp-autoprefixer": "2.3.1",
"gulp-uglify": "0.3.x",
"gulp-jshint": "1.6.x",
"gulp-autoprefixer": "^3.1.0",
"gulp-uglify": "^1.5.3",
"gulp-jshint": "2.0.0",
"gulp-concat": "2.2.x",
"jshint-stylish": "0.2.x",
"gulp-clean": "0.3.x",
@@ -28,9 +27,5 @@
"test": "gulp build --verbose"
},
"author": "umbraco",
"license": "MIT",
"repository": {
"type": "git",
"url": "http://github.com/devdk/gulp-workflow.git"
}
"license": "MIT"
}
@@ -4,6 +4,7 @@
border: none !important;
padding: 20px;
line-height: 1.5;
@include colorset(alertbar);
@@ -1,7 +1,11 @@
button.button, .button, a.button {
background: $color-blue;
padding: 14px 40px;
display: inline-block;
padding: 12px 40px;
display: inline-flex;
align-items: center;
justify-content: center;
text-decoration: none;
border: none;
border-radius: 36px;
@@ -11,8 +15,7 @@ button.button, .button, a.button {
color: #fff;
text-align: center;
font-size: 1rem;
line-height: 1;
font-size: 14px;
margin: 0;
@@ -103,7 +106,7 @@ button.button, .button, a.button {
&.large {
font-size: 1.2rem;
font-size: 1.175rem;
}
File diff suppressed because it is too large Load Diff
@@ -1,475 +1,476 @@
.markdown-editor {
position: fixed;
bottom: -100%;
max-height: 100%;
width: 100%;
padding: .2rem;
background-color: rgba(darken(#fff, 1%), .94);
box-shadow: 0px -2px 6px 0px rgba(0, 0, 0, 0.08);
transition: bottom .6s $cubicSearch, top .6s $cubicSearch;
z-index: 800;
@media (max-width: $xs) {
top: 100%;
padding: 20px 0 0;
}
&.write {
bottom:0px;
overflow-y: scroll;
visibility: visible;
@media (max-width: $xs) {
top: 0;
}
}
&.mobile-preview {
@media (max-width: $md) {
#input-container {
display: none;
}
#preview-container {
display: block;
}
}
}
#preview-container {
@media (max-width: $md) {
display: none;
}
}
input, textarea, select{
border: 2px solid #E4E8E9;
color: #000;
&:focus, &:active{
outline: none;
border-color: $color-green;
}
&.warning {
border-color: $color-red !important;
}
}
.wmd-button {
position: relative;
margin-right: 15px;
left: 0 !important;
font-size: 1.4em;
top: 10px;
cursor: pointer;
float: left;
border-radius: 20px;
transition: top 300ms $cubicSearch, opacity 300ms $cubicSearch;
}
.show {
.wmd-button {
@media (min-width: $md){
top: 10px;
opacity: .9;
}
}
}
.reply-to {
p {
font-size: 1rem;
overflow: hidden;
color: darken($color-space, 25%);
background: transparent;
}
span {
font-weight: 800;
}
}
#wmd-button-bar {
position:relative;
height: 30px;
@media (max-width: $xs) {
display:none;
}
}
.input-row {
label {
display: block;
margin-bottom: 5px;
color: darken($color-space, 10%);
font-size: .9rem;
}
}
.wmd-button-row {
list-style: none;
li {
&:hover {
span {
color:black;
}
}
span {
background-image: none;
color: #727272;
transition: color .2s ease-in;
&:before {
font-family: "our-umbraco" !important;
content: attr(data-icon);
font-style: normal !important;
font-weight: normal !important;
font-variant: normal !important;
text-transform: none !important;
speak: none;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
}
#wmd-bold-button {
span {
@extend .our-icon-bold;
}
}
#wmd-italic-button {
span {
@extend .our-icon-italic;
}
}
#wmd-bold-button {
span {
@extend .our-icon-bold;
}
}
#wmd-link-button {
span {
@extend .our-icon-hyperlink;
}
}
#wmd-quote-button {
span {
@extend .our-icon-quote;
}
}
#wmd-quote-button {
span {
@extend .our-icon-quote;
}
}
#wmd-code-button {
span {
@extend .our-icon-code;
}
}
#wmd-image-button {
span {
@extend .our-icon-picture;
}
}
#wmd-olist-button {
span {
@extend .our-icon-ol;
}
}
#wmd-ulist-button {
span {
@extend .our-icon-ul;
}
}
#wmd-heading-button {
span {
@extend .our-icon-header;
}
}
#wmd-hr-button {
span {
@extend .our-icon-hr;
}
}
#wmd-undo-button {
span {
@extend .our-icon-undo;
}
}
#wmd-redo-button {
span {
@extend .our-icon-redo;
}
}
}
.wmd-spacer {
float: left;
position: relative;
width: 27px;
display: block;
opacity: 0;
height: 20px;
@media (max-width:$md) {
display: none;
}
}
#wmd-input {
height: 300px;
width: 100%;
padding: .5rem;
font-size: 1rem;
color: $color-text;
background: white;
border: 2px solid #E4E8E9;
@include transition(border-color, .2s);
@media (max-width: $xs) {
height: 152px;
}
&:focus {
border-color: $color-green;
}
}
#wmd-preview {
width: 100%;
min-height: 300px;
max-height: 300px;
overflow-y: scroll;
padding: .5rem 20px;
font-size: .8rem;
color: #000;
background: darken(#F5F7F7, 5%);
@media (max-width: $xs) {
max-height: 150px;
min-height: 150px;
margin-bottom: 0;
}
}
.markdown-close {
position: absolute;
right: 1.5rem;
top: 2rem;
font-size: 28px;
cursor: pointer;
opacity: .6;
@include transition(opacity, .3s);
@media (min-width: $md) {
top: 1.5rem;
}
&:hover {
opacity: 1;
}
}
.draft {
position: fixed;
bottom: -40px;
right: 30px;
background-color: $color-green;
color:white;
padding: 12px 20px;
cursor: pointer;
opacity: 0;
font-size: .9rem;
font-weight: bold;
transition: opacity .3s $cubicSearch, bottom .6s $cubicSearch, box-shadow .2s ease-in-out;
&.show {
bottom: 30px;
opacity: 1;
&:hover {
background: lighten($color-green, 5%);
@extend .BoxShadow;
}
}
}
.markdown-control {
font-family: $font-family;
font-size: .8rem;
-webkit-appearance: none;
@media (max-width: $xs) {
padding: 5px !important;
}
}
#topic-title {
padding: .5rem;
font-size: .8rem;
overflow: hidden;
color: #000;
background: #fff;
width: 100%;
}
select {
position: relative;
border: none;
border-radius: 0;
padding: .5rem;
font-size: .8rem;
overflow: hidden;
color: #000;
background: #fff;
width: 100%;
border: 2px solid #E4E8E9;
@media (max-width: $xs) {
margin-top: 20px;
}
&::after {
position: absolute;
display: block;
top: 0;
right: 0;
content: "<";
color: black;
}
}
#topic-category {
option.frontend {
background: #4ea7ff;
color: #fff;
}
option.core {
background: #ff661b;
color: #fff;
}
option.azure {
background: #1ed45c;
color: #fff;
}
}
#topic-submit {
border: none;
background: $color-green;
color: white;
padding: 10px;
width: 100%;
max-width: 140px;
font-family: $font-family;
cursor: pointer;
font-size: 1rem;
&:hover {
background: lighten($color-green, 5%);
}
}
#mobile-preview {
border: none;
background: none;
-webkit-appearance:none;
text-align: right;
float: right;
opacity: .4;
cursor: pointer;
@include transition(opacity, .3s);
i {
font-size: 24px;
display: inline-block;
transform: translate(-3px, 5px);
}
span {
font-size: 14px;
}
&:hover {
opacity: 1;
}
@media (max-width: $xs) {
margin-bottom: 10px;
}
}
&.mobile-preview {
#wmd-preview {
@media (max-width: $md) {
margin-bottom: 4px;
}
}
#mobile-preview {
color: $color-our;
opacity: 1;
}
}
}
.wmd-prompt-background {
background-color: black;
}
#insert-image-dialog {
position: fixed;
z-index: 1001;
@extend .copy-link-wrapper;
&.show {
clip: auto;
opacity: 1;
top: 50%;
left: 50%;
}
}
.wmd-prompt-dialog {
@extend .copy-link-wrapper;
opacity: 1;
clip: auto;
margin: 0 !important;
input[type="text"] {
text-align: left;
}
}
.markdown-spacer {
position: relative;
height: 0px;
transition: height .6s $cubicSearch;
&.write {
height: 500px;
}
.markdown-editor {
position: fixed;
bottom: -100%;
max-height: 100%;
width: 100%;
padding: .2rem;
background-color: rgba(darken(#fff, 1%), .94);
box-shadow: 0px -2px 6px 0px rgba(0, 0, 0, 0.08);
transition: bottom .6s $cubicSearch, top .6s $cubicSearch;
z-index: 800;
@media (max-width: $xs) {
top: 100%;
padding: 20px 0 0;
}
&.write {
bottom:0px;
overflow-y: scroll;
visibility: visible;
@media (max-width: $xs) {
top: 0;
}
}
&.mobile-preview {
@media (max-width: $md) {
#input-container {
display: none;
}
#preview-container {
display: block;
}
}
}
#preview-container {
@media (max-width: $md) {
display: none;
}
}
input, textarea, select{
border: 2px solid #E4E8E9;
color: #000;
&:focus, &:active{
outline: none;
border-color: $color-green;
}
&.warning {
border-color: $color-red !important;
}
}
.wmd-button {
position: relative;
margin-right: 15px;
left: 0 !important;
font-size: 1.4em;
top: 10px;
cursor: pointer;
float: left;
border-radius: 20px;
transition: top 300ms $cubicSearch, opacity 300ms $cubicSearch;
}
.show {
.wmd-button {
@media (min-width: $md){
top: 10px;
opacity: .9;
}
}
}
.reply-to {
p {
font-size: 1rem;
overflow: hidden;
color: darken($color-space, 25%);
background: transparent;
}
span {
font-weight: 800;
}
}
#wmd-button-bar {
position:relative;
height: 30px;
@media (max-width: $xs) {
display:none;
}
}
.input-row {
label {
display: block;
margin-bottom: 5px;
color: darken($color-space, 10%);
font-size: .9rem;
}
}
.wmd-button-row {
list-style: none;
li {
&:hover {
span {
color:black;
}
}
span {
background-image: none;
color: #727272;
transition: color .2s ease-in;
&:before {
font-family: "our-umbraco" !important;
content: attr(data-icon);
font-style: normal !important;
font-weight: normal !important;
font-variant: normal !important;
text-transform: none !important;
speak: none;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
}
#wmd-bold-button {
span {
@extend .our-icon-bold;
}
}
#wmd-italic-button {
span {
@extend .our-icon-italic;
}
}
#wmd-bold-button {
span {
@extend .our-icon-bold;
}
}
#wmd-link-button {
span {
@extend .our-icon-hyperlink;
}
}
#wmd-quote-button {
span {
@extend .our-icon-quote;
}
}
#wmd-quote-button {
span {
@extend .our-icon-quote;
}
}
#wmd-code-button {
span {
@extend .our-icon-code;
}
}
#wmd-image-button {
span {
@extend .our-icon-picture;
}
}
#wmd-olist-button {
span {
@extend .our-icon-ol;
}
}
#wmd-ulist-button {
span {
@extend .our-icon-ul;
}
}
#wmd-heading-button {
span {
@extend .our-icon-header;
}
}
#wmd-hr-button {
span {
@extend .our-icon-hr;
}
}
#wmd-undo-button {
span {
@extend .our-icon-undo;
}
}
#wmd-redo-button {
span {
@extend .our-icon-redo;
}
}
}
.wmd-spacer {
float: left;
position: relative;
width: 27px;
display: block;
opacity: 0;
height: 20px;
@media (max-width:$md) {
display: none;
}
}
#wmd-input {
height: 300px;
width: 100%;
padding: .5rem;
font-size: 1rem;
color: $color-text;
background: white;
border: 2px solid #E4E8E9;
@include transition(border-color, .2s);
@media (max-width: $xs) {
height: 152px;
}
&:focus {
border-color: $color-green;
}
}
#wmd-preview {
width: 100%;
min-height: 300px;
max-height: 300px;
overflow-y: scroll;
padding: .5rem 20px;
font-size: .8rem;
color: #000;
background: darken(#F5F7F7, 5%);
@media (max-width: $xs) {
max-height: 150px;
min-height: 150px;
margin-bottom: 0;
}
}
.markdown-close {
position: absolute;
right: 1.5rem;
top: 2rem;
font-size: 28px;
cursor: pointer;
opacity: .6;
@include transition(opacity, .3s);
@media (min-width: $md) {
top: 1.5rem;
}
&:hover {
opacity: 1;
}
}
.draft {
position: fixed;
bottom: -40px;
right: 30px;
background-color: $color-green;
color:white;
padding: 12px 20px;
cursor: pointer;
opacity: 0;
font-size: .9rem;
font-weight: bold;
transition: opacity .3s $cubicSearch, bottom .6s $cubicSearch, box-shadow .2s ease-in-out;
&.show {
bottom: 30px;
opacity: 1;
&:hover {
background: lighten($color-green, 5%);
@extend .BoxShadow;
}
}
}
.markdown-control {
font-family: $font-family;
font-size: .8rem;
-webkit-appearance: none;
@media (max-width: $xs) {
padding: 5px !important;
}
}
#topic-title {
padding: .5rem;
font-size: .8rem;
overflow: hidden;
color: #000;
background: #fff;
width: 100%;
}
select {
position: relative;
border: none;
border-radius: 0;
padding: .5rem;
font-size: .8rem;
overflow: hidden;
color: #000;
background: #fff;
width: 100%;
border: 2px solid #E4E8E9;
@media (max-width: $xs) {
margin-top: 20px;
}
&::after {
position: absolute;
display: block;
top: 0;
right: 0;
content: "<";
color: black;
}
}
#topic-category {
option.frontend {
background: #4ea7ff;
color: #fff;
}
option.core {
background: #ff661b;
color: #fff;
}
option.azure {
background: #1ed45c;
color: #fff;
}
}
#topic-submit {
border: none;
background: $color-green;
color: white;
padding: 10px !important;
padding-left: 32px;
width: 100%;
max-width: 140px;
font-family: $font-family;
cursor: pointer;
font-size: 1rem;
&:hover {
background: lighten($color-green, 5%);
}
}
#mobile-preview {
border: none;
background: none;
-webkit-appearance:none;
text-align: right;
float: right;
opacity: .4;
cursor: pointer;
@include transition(opacity, .3s);
i {
font-size: 24px;
display: inline-block;
transform: translate(-3px, 5px);
}
span {
font-size: 14px;
}
&:hover {
opacity: 1;
}
@media (max-width: $xs) {
margin-bottom: 10px;
}
}
&.mobile-preview {
#wmd-preview {
@media (max-width: $md) {
margin-bottom: 4px;
}
}
#mobile-preview {
color: $color-our;
opacity: 1;
}
}
}
.wmd-prompt-background {
background-color: black;
}
#insert-image-dialog {
position: fixed;
z-index: 1001;
@extend .copy-link-wrapper;
&.show {
clip: auto;
opacity: 1;
top: 50%;
left: 50%;
}
}
.wmd-prompt-dialog {
@extend .copy-link-wrapper;
opacity: 1;
clip: auto;
margin: 0 !important;
input[type="text"] {
text-align: left;
}
}
.markdown-spacer {
position: relative;
height: 0px;
transition: height .6s $cubicSearch;
&.write {
height: 500px;
}
}
@@ -7,9 +7,9 @@
input {
-webkit-appearance: none;
border-radius: 0;
border: 1px solid darken(whitesmoke, 15%);
padding: 20px 6px 20px 6px;
padding: 20px 10px 20px 10px;
outline: none;
display: block;
width: 100%;
@@ -529,6 +529,8 @@
font-size: .7rem;
letter-spacing: .5px;
text-align: center;
transform: translate(-50%, -50%);
cursor: pointer;
@@ -63,11 +63,11 @@ html {
display: inline-block;
overflow: hidden;
width: 100%;
max-width: $sb-desktop / 100% * $sb-width;
text-align: center;
@media (min-width: $md) {
float: right;
max-width: $sb-desktop / 100% * $sb-width;
}
}
}
@@ -80,7 +80,7 @@ html {
padding-bottom: 200px;
@media (max-width:992px) {
display: block;
width: 100%;
@@ -96,10 +96,10 @@ html {
@media (min-width: 2100px) {
width:100% - $sb-retina-width;
}
.main-content {
display: block;
width: 100%;
width: 100%;
padding-left: 20px;
padding-right: 20px;
padding-top: 20px;
@@ -173,7 +173,7 @@ html {
cursor: pointer;
}
@media (max-width: 992px) {
border-left: none;
border-left: none;
background-color: lighten($color-our,10%);
padding-top: 10px;
padding-bottom: 10px;
@@ -50,6 +50,11 @@
@media (min-width: $md) {
margin-bottom: 0;
}
span {
padding-top: 5px;
padding-left: 5px;
}
}
}
+68 -37
View File
@@ -91,16 +91,20 @@
&-head {
flex-direction: row;
display: none;
padding: 20px 15px;
border-bottom: 1px solid whitesmoke;
@media (min-width: $md) {
display: flex;
font-size: .8rem;
text-transform: uppercase;
font-weight: bold;
padding: 20px 15px;
border-bottom: 1px solid whitesmoke;
letter-spacing: .5px;
font-size: .8rem;
text-transform: uppercase;
font-weight: bold;
letter-spacing: .5px;
}
}
@@ -112,19 +116,6 @@
display: flex;
flex-direction: column;
small {
color: darken($color-space, 25%);
font-size: 1rem;
margin-bottom: .2rem;
}
span {
font-size: .8rem;
color: $color-space;
}
}
}
@@ -135,18 +126,25 @@
padding: 25px 15px;
display: flex;
flex-direction: row;
align-items: center;
flex-direction: column;
align-items: flex-start;
border-bottom: 1px solid rgba($color-space, .11);
@media (min-width: $md) {
flex-direction: row;
align-items: center;
}
.topic {
font-size: .95rem;
font-size: 1.15rem;
line-height: 1.3;
order: 2;
h3 {
word-break: break-all;
font-weight: 600;
}
a {
@@ -181,8 +179,9 @@
@media (min-width: $md) {
font-size: 1.15rem;
line-height: 1.3;
h3 {
font-weight: 100;
}
span {
font-size: .9rem;
@@ -220,35 +219,62 @@
.topic {
flex: 0 0 50%;
margin-right: 5%;
order: 2;
margin: 10px 0;
@media (min-width: $md) {
flex: 0 0 50%;
margin-right: 10%;
margin: 0 10% 0 0;
order: 1;
}
}
.category {
flex: 0 0 30%;
margin-right: 5%;
order: 1;
@media (min-width: $md) {
flex: 0 0 28%;
margin-right: 2%;
order: 2;
}
}
.posts {
flex: 0 0 10%;
text-align: center;
order: 3;
@media (max-width: $md) {
transform: translate(-6px, 0);
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
font-size: .8rem;
small {
margin-right: 3px;
margin-bottom: 0;
font-weight: normal;
font-size: .8rem;
color: $color-black;
}
@media (min-width: $md) {
text-align: center;
flex-direction: column;
small {
margin-right: 0px;
margin-bottom: 5px;
font-weight: bold;
font-size: 1rem;
}
}
}
}
@@ -295,10 +321,14 @@
color: #4f5f63;
text-transform: uppercase;
font-weight: 700;
letter-spacing: .2px;
display: block;
margin-bottom: .5rem;
text-align: left;
line-height: 1.2;
@media (min-width: $md) {
letter-spacing: .2px;
}
}
.options {
@@ -352,7 +382,6 @@
span {
position: relative;
flex: 1 1 auto;
margin-right: 20px;
display: flex;
justify-content: center;
@@ -373,6 +402,8 @@
transition: color 150ms ease;
font-size: .7rem;
text-align: center;
@media(min-width: $md) {
font-size: .9rem;
}
+276 -162
View File
@@ -1,39 +1,31 @@
.download {
.download.latest .dot {
margin-top: 2rem;
}
.dot.progress {
.download .dot.progress {
text-indent: .3rem;
text-align: center;
line-height: 2.8rem;
}
.counter {
font-size: 1.1rem;;
}
}
&.latest {
.dot {
margin-top: 2rem;
}
}
.download .dot.progress .counter {
font-size: 1.1rem;
}
.explain {
flex-direction: column;
.changes {
small {
line-height: .5rem;
}
@media (min-width: 768px) {
flex-direction: row;
}
}
.explain .changes small {
line-height: .5rem;
}
.chart {
@@ -41,171 +33,100 @@
top: -4px;
left: -8px;
z-index: 1;
.percentage {
display: inline-block;
position: absolute;
top: 9px;
left: 16px;
font-size: 1.1rem;
color: darken($color-our, 30%);
}
canvas {
top: 1px;
position: absolute;
left: 5px;
}
}
.chart .percentage {
display: inline-block;
position: absolute;
top: 9px;
left: 16px;
font-size: 1.1rem;
color: darken($color-our, 30%);
}
.chart canvas {
top: 1px;
position: absolute;
left: 5px;
}
.get-release {
i {
font-size: 2.5rem;
line-height: 5rem;
}
.chart {
position: absolute;
top: -4px;
left: -8px;
z-index: 1;
}
.get-release {
line-height: 1.5;
padding: 2.5rem 0;
margin: 2.5rem 0;
padding: 3rem 0;
margin: 0 0 3.5rem ;
border-bottom: 1px solid darken(whitesmoke, 5%);
border-top: 1px solid darken(whitesmoke, 5%);
}
.get-release i {
font-size: 2.5rem;
line-height: 5rem;
}
h3 {
font-size: 1.1rem;
margin-bottom: .3rem;
color: $color-headline;
.get-release h3 {
font-size: 1.1rem;
margin-bottom: .3rem;
color: $color-headline;
}
.get-release h3 a {
text-decoration: none;
a {
text-decoration: none;
&:hover {
color: $color-our;
}
}
}
p {
color: $color-headline;
font-size: .95rem;
line-height: 1.3;
margin-bottom: .5rem;
}
small {
font-size: .7rem;
color: $color-text;
&:hover {
color: $color-our;
}
}
.release {
min-height: 160px;
&.zip {
i {
color: $color-headline;
}
}
&.bin {
i {
color: rgba(#000, .4);
font-size: 1.6rem;
}
h4 {
font-size: .9rem;
margin-bottom: .3rem;
color: $color-headline;
a {
text-decoration: none;
&:hover {
color: $color-our;
}
}
}
&.col-sm-5 {
padding-top: 18px;
}
}
&.col-sm-1 {
text-align: center;
}
.get-release p {
color: $color-headline;
font-size: .95rem;
line-height: 1.3;
margin-bottom: .5rem;
}
.latest {
.dot.big {
margin-bottom: 30px;
}
.explain {
h4 {
font-size: 2.5rem;
}
p {
font-size: 1.1rem;
color: $color-text
;
}
.col-xs-12 {
min-height: 0;
}
}
.get-release small {
font-size: .8rem;
color: rgba($color-text, .6);
}
.latest .dot.big {
margin-bottom: 30px;
}
.latest .explain h4 {
font-size: 2.5rem;
}
.latest .explain p {
font-size: 1.1rem;
color: $color-text;
}
.latest .explain .col-xs-12 {
min-height: 0;
}
// Single release page
.release{
.release {
.markdown-syntax {
p, li, ul, a {
p, li, ul {
color: $color-headline;
font-size: .95rem;
}
@@ -216,7 +137,7 @@
}
a {
a {
text-decoration: underline;
font-family: $font-family;
}
@@ -253,12 +174,12 @@
}
}
}
.releaseTable {
.col-xs-3 {
&:first-child {
.progress {
.top {
@@ -282,6 +203,7 @@
}
}
// Progress page
.inprogress {
@@ -324,11 +246,12 @@
}
}
// Roadmap page
.plannedreleases {
.dot.big {
text-indent: 0;
line-height: 3rem;
line-height: 3rem;
}
.chart {
top: 0px;
@@ -342,3 +265,194 @@
}
}
}
.release-page .explain h2 {
margin: 0;
font-size: 2em;
color: rgba(0,0,0,.8);
}
.release-page .explain small {
margin-bottom: 0;
}
.release-page .dot {
border: none;
}
.release-page .dot.big {
position: relative;
text-indent: 0;
margin: 0;
}
.release-page .chart {
height: 60px;
width: 60px;
top: initial;
left: initial;
text-align: center;
}
.release-page .chart p {
vertical-align: middle;
line-height: 3.7rem;
display: inline-block;
}
.release-page .chart canvas {
top: 0px;
left: 0px;
}
.statuses ul {
list-style-type: none;
}
.statuses ul li {
position: relative;
margin-bottom: 10px;
padding-left: 10px;
}
.statuses li:before {
position: absolute;
top: -4px;
left: -25px;
font-size: 1.5em;
}
.release-progress-indicator {
flex: 1 1 auto;
}
.release-progress-action {
flex: 1 1 auto;
margin-top: 30px;
}
.release-progress-version {
margin-left: 15px;
}
.release-section-group {
flex: 1 1 100%;
padding: 0;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
@media (min-width: 768px) {
flex: 1 1 47%;
padding: 0 3% 0 0;
align-items: flex-start;
text-align: left;
}
}
.release-section-group:nth-child(even) {
flex: 1 1 100%;
padding: 0;
@media (min-width: 768px) {
flex: 1 1 47%;
padding: 0 0 0 3%;
}
}
.release-section-action {
height: 80px;
display: flex;
justify-content: flex-start;
align-items: center;
box-sizing: border-box;
}
.release-section code {
overflow: auto;
background-color: #333;
background-clip: padding-box;
color: #fff;
font-size: 12px;
line-height: 1.4em;
text-align: center;
text-decoration: none;
padding: 14px 16px 14px 16px;
width: auto;
border-radius: 5px;
border: none;
}
.release-section code a {
text-decoration: none;
}
.release-section + .release-section {
margin-top: 30px;
}
.release-section-group + .release-section-group {
margin-top: 30px;
@media (min-width: 768px) {
margin-top: 0;
}
}
.release-page h2 {
font-size: 1.4rem;
font-weight: bold;
margin-bottom: 0;
}
.release-page h3 {
font-size: 1.1rem;
font-weight: bold;
margin-bottom: 0;
}
// Other files
.release-other-files {
margin-top: 3rem;
}
.release-other-files h3 {
font-size: 1.1rem;
margin-bottom: 5px;
}
.release-other-files small {
font-size: .8rem;
color: rgba($color-text, .5);
}
.release-other-files .release {
min-height: auto;
margin-bottom: 30px;
}
.release-other-files .release a {
display: inline-block;
margin-bottom: 10px;
margin-top: 10px;
}
.release-other-files .release p {
margin-top: 0;
}
@@ -45,6 +45,7 @@ section.forum {
.forum-thread {
flex: 0 0 100%;
display: flex;
overflow: hidden;
@media (min-width: $md) {
flex: 1 0 49%;
@@ -77,6 +78,8 @@ section.forum {
flex-direction: column;
flex: 1 0 75%;
overflow: hidden;
padding: 0 10px 0 0;
@media (min-width: $md) {
@@ -89,6 +92,7 @@ section.forum {
.category {
margin: .5rem 0 0;
max-width: 95%;
span {
font-size: .75rem;
@@ -132,14 +136,14 @@ section.forum {
padding: 25px;
margin-bottom: 30px;
border: 1px solid darken(#f6f6f6, 5%);
transition: box-shadow .2s;
transition: box-shadow .2s ease, border-color .2s ease;
text-decoration: none;
display: flex;
align-items: center;
&:hover {
border-color: transparent;
border-color: white;
@include box_shadow(2);
}
@@ -182,7 +186,6 @@ section.forum {
color: #000;
line-height: 1.3;
font-size: 1rem;
word-break: break-all;
@media (min-width: $md) {
font-size: 1.1rem;
+5
View File
@@ -15,6 +15,11 @@
@import 'playground';
/**
/* Utilities
**/
@import 'utilities/flexbox';
/**
/* Elements
**/
@@ -0,0 +1,67 @@
/*
Flexbox
*/
.flex { display: flex; }
.flex-inline { display: inline-flex; }
.flex-column { flex-direction: column; }
.flex-wrap { flex-wrap: wrap; }
.items-start { align-items: flex-start; }
.items-end { align-items: flex-end; }
.items-center { align-items: center; }
.items-baseline { align-items: baseline; }
.items-stretch { align-items: stretch; }
.self-start { align-self: flex-start; }
.self-end { align-self: flex-end; }
.self-center { align-self: center; }
.self-baseline { align-self: baseline; }
.self-stretch { align-self: stretch; }
.justify-start { justify-content: flex-start; }
.justify-end { justify-content: flex-end; }
.justify-center { justify-content: center; }
.justify-between { justify-content: space-between; }
.justify-around { justify-content: space-around; }
.content-start { align-content: flex-start; }
.content-end { align-content: flex-end; }
.content-center { align-content: center; }
.content-between { align-content: space-between; }
.content-around { align-content: space-around; }
.content-stretch { align-content: stretch; }
.flx-i {
flex: 1;
}
.flx-g0 {
flex-grow: 0;
}
.flx-s0 {
flex-shrink: 0;
}
.flx-b0 {
flex-basis: 0%;
}
.flx-g1 {
flex-grow: 1;
}
.flx-s1 {
flex-shrink: 1;
}
.flx-b1 {
flex-basis: 100%;
}
/* 1. Fix for Chrome 44 bug. https://code.google.com/p/chromium/issues/detail?id=506893 */
.flex-auto {
flex: 1 1 auto;
min-width: 0; /* 1 */
min-height: 0; /* 1 */
}
.flex-none { flex: none; }
@@ -1,31 +1,31 @@
function modelsBuilderController($scope, umbRequestHelper, $log, $http, modelsBuilderResource) {
$scope.generate = function() {
$scope.generating = true;
umbRequestHelper.resourcePromise(
$http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")),
'Failed to generate.')
.then(function (result) {
$scope.generating = false;
$scope.dashboard = result;
});
};
$scope.reload = function () {
$scope.ready = false;
modelsBuilderResource.getDashboard().then(function (result) {
$scope.dashboard = result;
$scope.ready = true;
});
};
function init() {
modelsBuilderResource.getDashboard().then(function(result) {
$scope.dashboard = result;
$scope.ready = true;
});
}
init();
}
function modelsBuilderController($scope, umbRequestHelper, $log, $http, modelsBuilderResource) {
$scope.generate = function() {
$scope.generating = true;
umbRequestHelper.resourcePromise(
$http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")),
'Failed to generate.')
.then(function (result) {
$scope.generating = false;
$scope.dashboard = result;
});
};
$scope.reload = function () {
$scope.ready = false;
modelsBuilderResource.getDashboard().then(function (result) {
$scope.dashboard = result;
$scope.ready = true;
});
};
function init() {
modelsBuilderResource.getDashboard().then(function(result) {
$scope.dashboard = result;
$scope.ready = true;
});
}
init();
}
angular.module("umbraco").controller("Umbraco.Dashboard.ModelsBuilderController", modelsBuilderController);
@@ -1,41 +1,41 @@
<div id="modelsBuilder" ng-controller="Umbraco.Dashboard.ModelsBuilderController">
<div ng-show="ready" style="float: right;">
<button type="button" class="btn" ng-click="reload()"><span>Reload</span></button>
</div>
<h3>Models Builder</h3>
<div ng-show="!ready">
Loading...
</div>
<div ng-show="ready">
<div ng-bind-html-unsafe="dashboard.text"></div>
<div ng-if="dashboard.outOfDateModels">
<p>Models are <strong>out-of-date</strong>.
</p>
</div>
<div ng-if="dashboard.canGenerate">
<div ng-if="dashboard.generateCausesRestart">
<p style="color: red; font-weight: bold;">Generating models will restart the application.</p>
</div>
<div ng-show="!generating">
<button type="button" ng-click="generate()" class="btn btn-danger">
<span>Generate models</span>
</button>
</div>
<div class="umb-loader-wrapper" ng-show="generating">
<div class="umb-loader"></div>
</div>
</div>
<div ng-if="dashboard.lastError" style="margin-top: 32px;" ng-show="!generating">
<span style="color: red; font-weight: bold;">Last generation failed with the following error:</span>
<pre style="width: 80%; white-space: pre-line; background: #f8f8f8; padding: 4px; font-size: small;">{{dashboard.lastError}}</pre>
</div>
</div>
</div>
<div id="modelsBuilder" ng-controller="Umbraco.Dashboard.ModelsBuilderController">
<div ng-show="ready" style="float: right;">
<button type="button" class="btn" ng-click="reload()"><span>Reload</span></button>
</div>
<h3>Models Builder</h3>
<div ng-show="!ready">
Loading...
</div>
<div ng-show="ready">
<div ng-bind-html-unsafe="dashboard.text"></div>
<div ng-if="dashboard.outOfDateModels">
<p>Models are <strong>out-of-date</strong>.
</p>
</div>
<div ng-if="dashboard.canGenerate">
<div ng-if="dashboard.generateCausesRestart">
<p style="color: red; font-weight: bold;">Generating models will restart the application.</p>
</div>
<div ng-show="!generating">
<button type="button" ng-click="generate()" class="btn btn-danger">
<span>Generate models</span>
</button>
</div>
<div class="umb-loader-wrapper" ng-show="generating">
<div class="umb-loader"></div>
</div>
</div>
<div ng-if="dashboard.lastError" style="margin-top: 32px;" ng-show="!generating">
<span style="color: red; font-weight: bold;">Last generation failed with the following error:</span>
<pre style="width: 80%; white-space: pre-line; background: #f8f8f8; padding: 4px; font-size: small;">{{dashboard.lastError}}</pre>
</div>
</div>
</div>
@@ -1,23 +1,23 @@
function modelsBuilderResource($q, $http, umbRequestHelper) {
return {
getModelsOutOfDateStatus: function () {
return umbRequestHelper.resourcePromise(
$http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetModelsOutOfDateStatus")),
"Failed to get models out-of-date status");
},
buildModels: function () {
return umbRequestHelper.resourcePromise(
$http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")),
"Failed to build models");
},
getDashboard: function () {
return umbRequestHelper.resourcePromise(
$http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetDashboard")),
"Failed to get dashboard");
}
};
}
angular.module("umbraco.resources").factory("modelsBuilderResource", modelsBuilderResource);
function modelsBuilderResource($q, $http, umbRequestHelper) {
return {
getModelsOutOfDateStatus: function () {
return umbRequestHelper.resourcePromise(
$http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetModelsOutOfDateStatus")),
"Failed to get models out-of-date status");
},
buildModels: function () {
return umbRequestHelper.resourcePromise(
$http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")),
"Failed to build models");
},
getDashboard: function () {
return umbRequestHelper.resourcePromise(
$http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetDashboard")),
"Failed to get dashboard");
}
};
}
angular.module("umbraco.resources").factory("modelsBuilderResource", modelsBuilderResource);
@@ -1,7 +1,7 @@
{
//array of files we want to inject into the application on app_start
javascript: [
'~/App_Plugins/ModelsBuilder/modelsbuilder.controller.js',
'~/App_Plugins/ModelsBuilder/modelsbuilder.resource.js'
]
{
//array of files we want to inject into the application on app_start
javascript: [
'~/App_Plugins/ModelsBuilder/modelsbuilder.controller.js',
'~/App_Plugins/ModelsBuilder/modelsbuilder.resource.js'
]
}
+1 -1
View File
@@ -1,2 +1,2 @@
<%@ Application Inherits="Umbraco.Web.UmbracoApplication" Language="C#" %>
<%@ Application Inherits="Umbraco.Web.UmbracoApplication" Language="C#" %>
+54 -53
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\UmbracoCms.7.5.3\build\UmbracoCms.props" Condition="Exists('..\packages\UmbracoCms.7.5.3\build\UmbracoCms.props')" />
<Import Project="..\packages\UmbracoCms.7.5.5\build\UmbracoCms.props" Condition="Exists('..\packages\UmbracoCms.7.5.5\build\UmbracoCms.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -47,32 +47,32 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper, Version=3.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
<Reference Include="AutoMapper, Version=3.3.1.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL">
<HintPath>..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="AutoMapper.Net4, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
<Reference Include="AutoMapper.Net4, Version=3.3.1.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL">
<HintPath>..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="businesslogic, Version=1.0.6092.24022, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\businesslogic.dll</HintPath>
<Reference Include="businesslogic, Version=1.0.6183.23126, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\businesslogic.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ClientDependency.Core, Version=1.9.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ClientDependency.1.9.1\lib\net45\ClientDependency.Core.dll</HintPath>
<Reference Include="ClientDependency.Core, Version=1.9.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ClientDependency.1.9.2\lib\net45\ClientDependency.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ClientDependency.Core.Mvc, Version=1.8.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ClientDependency-Mvc5.1.8.0.0\lib\net45\ClientDependency.Core.Mvc.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="cms, Version=1.0.6092.24022, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\cms.dll</HintPath>
<Reference Include="cms, Version=1.0.6183.23126, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\cms.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="controls, Version=1.0.6092.24024, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\controls.dll</HintPath>
<Reference Include="controls, Version=1.0.6183.23128, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\controls.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="CookComputing.XmlRpcV2, Version=2.5.0.0, Culture=neutral, PublicKeyToken=a7d6e17aa302004d, processorArchitecture=MSIL">
@@ -83,32 +83,32 @@
<HintPath>..\packages\EasyHttp.1.6.29.0\lib\net40\EasyHttp.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Examine, Version=0.1.69.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Examine.0.1.69.0\lib\Examine.dll</HintPath>
<Reference Include="Examine, Version=0.1.70.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Examine.0.1.70.0\lib\Examine.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="HtmlAgilityPack, Version=1.4.9.0, Culture=neutral, PublicKeyToken=bd319b19eaf3b43a, processorArchitecture=MSIL">
<HintPath>..\packages\HtmlAgilityPack.1.4.9\lib\Net45\HtmlAgilityPack.dll</HintPath>
<Reference Include="HtmlAgilityPack, Version=1.4.9.5, Culture=neutral, PublicKeyToken=bd319b19eaf3b43a, processorArchitecture=MSIL">
<HintPath>..\packages\HtmlAgilityPack.1.4.9.5\lib\Net45\HtmlAgilityPack.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ImageProcessor, Version=2.4.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.2.4.4.0\lib\net45\ImageProcessor.dll</HintPath>
<Reference Include="ImageProcessor, Version=2.4.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.2.4.5.0\lib\net45\ImageProcessor.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ImageProcessor.Web, Version=4.6.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.Web.4.6.4.0\lib\net45\ImageProcessor.Web.dll</HintPath>
<Reference Include="ImageProcessor.Web, Version=4.6.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.Web.4.6.6.0\lib\net45\ImageProcessor.Web.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="InfoCaster.Umbraco.UrlTracker, Version=3.11.5900.30099, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UrlTracker.3.11\lib\InfoCaster.Umbraco.UrlTracker.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="interfaces, Version=1.0.6092.24017, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\interfaces.dll</HintPath>
<Reference Include="interfaces, Version=1.0.6183.23122, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\interfaces.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="JsonFx, Version=2.0.1209.2802, Culture=neutral, PublicKeyToken=315052dd637f8a52, processorArchitecture=MSIL">
@@ -116,7 +116,7 @@
<HintPath>..\packages\JsonFx.2.0.1209.2802\lib\net40\JsonFx.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\log4net.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\log4net.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181, processorArchitecture=MSIL">
@@ -128,7 +128,7 @@
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data, Version=1.0.1559.20655, Culture=neutral">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
@@ -204,8 +204,8 @@
<HintPath>..\packages\semver.1.1.2\lib\net451\Semver.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SQLCE4Umbraco, Version=1.0.6092.24023, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\SQLCE4Umbraco.dll</HintPath>
<Reference Include="SQLCE4Umbraco, Version=1.0.6183.23127, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\SQLCE4Umbraco.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Collections.Immutable, Version=1.1.36.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
@@ -214,11 +214,11 @@
</Reference>
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\System.Data.SqlServerCe.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\System.Data.SqlServerCe.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http" />
@@ -282,47 +282,47 @@
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Xml.Linq" />
<Reference Include="TidyNet, Version=1.0.0.0, Culture=neutral">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\TidyNet.dll</HintPath>
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\TidyNet.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco, Version=1.0.6092.24026, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\umbraco.dll</HintPath>
<Reference Include="umbraco, Version=1.0.6183.23129, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\umbraco.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Umbraco.Core, Version=1.0.6092.24019, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\Umbraco.Core.dll</HintPath>
<Reference Include="Umbraco.Core, Version=1.0.6183.23123, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\Umbraco.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.DataLayer, Version=1.0.6092.24022, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\umbraco.DataLayer.dll</HintPath>
<Reference Include="umbraco.DataLayer, Version=1.0.6183.23126, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\umbraco.DataLayer.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.editorControls, Version=1.0.6092.24028, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\umbraco.editorControls.dll</HintPath>
<Reference Include="umbraco.editorControls, Version=1.0.6183.23131, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\umbraco.editorControls.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Umbraco.IdentityExtensions, Version=1.0.5779.34109, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.IdentityExtensions.1.0.0\lib\net45\Umbraco.IdentityExtensions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.MacroEngines, Version=1.0.6092.24028, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\umbraco.MacroEngines.dll</HintPath>
<Reference Include="umbraco.MacroEngines, Version=1.0.6183.23132, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\umbraco.MacroEngines.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Umbraco.ModelsBuilder, Version=3.0.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Umbraco.ModelsBuilder.3.0.4\lib\Umbraco.ModelsBuilder.dll</HintPath>
<Reference Include="Umbraco.ModelsBuilder, Version=3.0.5.96, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Umbraco.ModelsBuilder.3.0.5\lib\Umbraco.ModelsBuilder.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="umbraco.providers, Version=1.0.6092.24024, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\umbraco.providers.dll</HintPath>
<Reference Include="umbraco.providers, Version=1.0.6183.23128, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\umbraco.providers.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Umbraco.Web.UI, Version=1.0.6092.24029, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\Umbraco.Web.UI.dll</HintPath>
<Reference Include="Umbraco.Web.UI, Version=1.0.6183.23133, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\Umbraco.Web.UI.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="UmbracoExamine, Version=0.7.0.24023, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.3\lib\UmbracoExamine.dll</HintPath>
<Reference Include="UmbracoExamine, Version=0.7.0.23127, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\UmbracoCms.Core.7.5.5\lib\UmbracoExamine.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter, Version=2.0.7.0, Culture=neutral, processorArchitecture=MSIL">
@@ -1707,7 +1707,6 @@
<Content Include="Views\MacroPartials\Navigation\TopNavigation.cshtml" />
<Content Include="masterpages\ForumMaster.master" />
<Content Include="masterpages\DocumentationMaster.master" />
<Content Include="masterpages\AddMarkdownProp.master" />
<Content Include="masterpages\ComRepositoryFrontpage.master" />
<Content Include="Assets\css\fonts\icomoon\icomoon.eot" />
<Content Include="Assets\css\fonts\icomoon\icomoon.ttf" />
@@ -4282,7 +4281,6 @@
<Content Include="masterpages\ManageSpam.master" />
<Content Include="macroScripts\ManageSpam.cshtml" />
<Content Include="masterpages\ProjectsVersioned.master" />
<Content Include="macroScripts\ProjectsVersioned.cshtml" />
<Content Include="macroScripts\ProjectsVersionList.cshtml" />
<Content Include="masterpages\ProjectCompatibility.master" />
<Content Include="macroScripts\EditProjectCompatibility.cshtml" />
@@ -4409,7 +4407,9 @@
<Content Include="Views\Partials\Grid\Editors\Embed.cshtml" />
<Content Include="Views\Partials\Grid\Editors\Base.cshtml" />
<Content Include="Views\Partials\Grid\Bootstrap3.cshtml" />
<Content Include="Views\Partials\Grid\Bootstrap3-Fluid.cshtml" />
<Content Include="Views\Partials\Grid\Bootstrap2.cshtml" />
<Content Include="Views\Partials\Grid\Bootstrap2-Fluid.cshtml" />
<None Include="web.Debug.config">
<DependentUpon>web.config</DependentUpon>
</None>
@@ -4482,14 +4482,15 @@
<!-- Only runs if the ClientFiles build folder doesn't yet exist -->
<CallTarget Targets="ClientFilesBuild" Condition="!Exists('$(ProjectDir)\..\OurUmbraco.Client\build\assets')" />
</Target>
<Import Project="..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets" Condition="Exists('..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\UmbracoCms.7.5.3\build\UmbracoCms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\UmbracoCms.7.5.3\build\UmbracoCms.props'))" />
<Error Condition="!Exists('..\packages\UmbracoCms.7.5.3\build\UmbracoCms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\UmbracoCms.7.5.3\build\UmbracoCms.targets'))" />
<Error Condition="!Exists('..\packages\UmbracoCms.7.5.5\build\UmbracoCms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\UmbracoCms.7.5.5\build\UmbracoCms.props'))" />
<Error Condition="!Exists('..\packages\UmbracoCms.7.5.5\build\UmbracoCms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\UmbracoCms.7.5.5\build\UmbracoCms.targets'))" />
</Target>
<Import Project="..\packages\UmbracoCms.7.5.3\build\UmbracoCms.targets" Condition="Exists('..\packages\UmbracoCms.7.5.3\build\UmbracoCms.targets')" />
<Import Project="..\packages\UmbracoCms.7.5.5\build\UmbracoCms.targets" Condition="Exists('..\packages\UmbracoCms.7.5.5\build\UmbracoCms.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="AfterBuild">
@@ -4,7 +4,7 @@
if (string.IsNullOrWhiteSpace(memberGuid) == false)
{
var memberService = UmbracoContext.Current.Application.Services.MemberService;
var memberService = ApplicationContext.Current.Services.MemberService;
var member = memberService.GetByKey(new Guid(memberGuid));
if (member == null)
@@ -10,5 +10,5 @@
<h4><a href="?category=@childPage.Name">@childPage.Name</a></h4>
</li>
}
<li><h4><a href="?category=uaas">Umbraco as a Service</a></h4></li>
<li><h4><a href="?category=uaas">Umbraco Cloud</a></h4></li>
</ul>
@@ -22,7 +22,7 @@
}
if (category != null)
{
headline = category == "uaas" ? "Umbraco as a Service" : category.ToLowerInvariant();
headline = category == "uaas" ? "Umbraco Cloud" : category.ToLowerInvariant();
}
var searchFilters = new SearchFilters(BooleanOperation.And);
@@ -0,0 +1,92 @@
@inherits UmbracoViewPage<dynamic>
@using Umbraco.Web.Templates
@using Newtonsoft.Json.Linq
@*
Razor helpers located at the bottom of this file
*@
@if (Model != null && Model.sections != null)
{
var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1;
<div class="umb-grid">
@if (oneColumn)
{
foreach (var section in Model.sections) {
<div class="grid-section">
@foreach (var row in section.rows) {
@renderRow(row, true);
}
</div>
}
}else {
<div class="container-fluid">
<div class="row-fluid clearfix">
@foreach (var s in Model.sections) {
<div class="grid-section">
<div class="@("span" + s.grid) column">
@foreach (var row in s.rows) {
@renderRow(row, false);
}
</div>
</div>
}
</div>
</div>
}
</div>
}
@helper renderRow(dynamic row, bool singleColumn){
<div @RenderElementAttributes(row)>
@Umbraco.If(singleColumn, "<div class='container-fluid'>")
<div class="row-fluid clearfix">
@foreach ( var area in row.areas ) {
<div class="@("span" + area.grid) column">
<div @RenderElementAttributes(area)>
@foreach (var control in area.controls) {
if (control !=null && control.editor != null && control.editor.view != null ) {
<text>@Html.Partial("grid/editors/base", (object)control)</text>
}
}
</div>
</div>}
</div>
@Umbraco.If(singleColumn, "</div>")
</div>
}
@functions {
public static MvcHtmlString RenderElementAttributes(dynamic contentItem)
{
var attrs = new List<string>();
JObject cfg = contentItem.config;
if(cfg != null)
foreach (JProperty property in cfg.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
attrs.Add(property.Name + "=\"" + propertyValue + "\"");
}
JObject style = contentItem.styles;
if (style != null) {
var cssVals = new List<string>();
foreach (JProperty property in style.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
if (string.IsNullOrWhiteSpace(propertyValue) == false)
{
cssVals.Add(property.Name + ":" + propertyValue + ";");
}
}
if (cssVals.Any())
attrs.Add("style='" + string.Join(" ", cssVals) + "'");
}
return new MvcHtmlString(string.Join(" ", attrs));
}
}
@@ -64,21 +64,29 @@
JObject cfg = contentItem.config;
if(cfg != null)
foreach (JProperty property in cfg.Properties()) {
attrs.Add(property.Name + "=\"" + property.Value.ToString() + "\"");
foreach (JProperty property in cfg.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
attrs.Add(property.Name + "=\"" + propertyValue + "\"");
}
JObject style = contentItem.styles;
if (style != null) {
var cssVals = new List<string>();
foreach (JProperty property in style.Properties())
cssVals.Add(property.Name + ":" + property.Value.ToString() + ";");
if (style != null) {
var cssVals = new List<string>();
foreach (JProperty property in style.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
if (string.IsNullOrWhiteSpace(propertyValue) == false)
{
cssVals.Add(property.Name + ":" + propertyValue + ";");
}
}
if (cssVals.Any())
attrs.Add("style=\"" + string.Join(" ", cssVals) + "\"");
if (cssVals.Any())
attrs.Add("style=\"" + string.Join(" ", cssVals) + "\"");
}
return new MvcHtmlString(string.Join(" ", attrs));
}
}
@@ -0,0 +1,88 @@
@inherits UmbracoViewPage<dynamic>
@using Umbraco.Web.Templates
@using Newtonsoft.Json.Linq
@*
Razor helpers located at the bottom of this file
*@
@if (Model != null && Model.sections != null)
{
var oneColumn = ((System.Collections.ICollection)Model.sections).Count == 1;
<div class="umb-grid">
@if (oneColumn)
{
foreach (var section in Model.sections) {
<div class="grid-section">
@foreach (var row in section.rows) {
@renderRow(row);
}
</div>
}
}else {
<div class="row clearfix">
@foreach (var s in Model.sections) {
<div class="grid-section">
<div class="col-md-@s.grid column">
@foreach (var row in s.rows) {
@renderRow(row);
}
</div>
</div>
}
</div>
}
</div>
}
@helper renderRow(dynamic row){
<div @RenderElementAttributes(row)>
<div class="row clearfix">
@foreach ( var area in row.areas ) {
<div class="col-md-@area.grid column">
<div @RenderElementAttributes(area)>
@foreach (var control in area.controls) {
if (control !=null && control.editor != null && control.editor.view != null ) {
<text>@Html.Partial("grid/editors/base", (object)control)</text>
}
}
</div>
</div>}
</div>
</div>
}
@functions {
public static MvcHtmlString RenderElementAttributes(dynamic contentItem)
{
var attrs = new List<string>();
JObject cfg = contentItem.config;
if(cfg != null)
foreach (JProperty property in cfg.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
attrs.Add(property.Name + "=\"" + propertyValue + "\"");
}
JObject style = contentItem.styles;
if (style != null) {
var cssVals = new List<string>();
foreach (JProperty property in style.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
if (string.IsNullOrWhiteSpace(propertyValue) == false)
{
cssVals.Add(property.Name + ":" + propertyValue + ";");
}
}
if (cssVals.Any())
attrs.Add("style='" + string.Join(" ", cssVals) + "'");
}
return new MvcHtmlString(string.Join(" ", attrs));
}
}
@@ -64,21 +64,29 @@
JObject cfg = contentItem.config;
if(cfg != null)
foreach (JProperty property in cfg.Properties()) {
attrs.Add(property.Name + "=\"" + property.Value.ToString() + "\"");
foreach (JProperty property in cfg.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
attrs.Add(property.Name + "=\"" + propertyValue + "\"");
}
JObject style = contentItem.styles;
if (style != null) {
var cssVals = new List<string>();
foreach (JProperty property in style.Properties())
cssVals.Add(property.Name + ":" + property.Value.ToString() + ";");
if (style != null) {
var cssVals = new List<string>();
foreach (JProperty property in style.Properties())
{
var propertyValue = TemplateUtilities.CleanForXss(property.Value.ToString());
if (string.IsNullOrWhiteSpace(propertyValue) == false)
{
cssVals.Add(property.Name + ":" + propertyValue + ";");
}
}
if (cssVals.Any())
attrs.Add("style=\"" + string.Join(" ", cssVals) + "\"");
if (cssVals.Any())
attrs.Add("style=\"" + string.Join(" ", cssVals) + "\"");
}
return new MvcHtmlString(string.Join(" ", attrs));
}
}
@@ -1,5 +1,4 @@
@model dynamic
@using Umbraco.Web.Templates
@functions {
public static string EditorView(dynamic contentItem)
@@ -1,3 +1,2 @@
@model dynamic
@using Umbraco.Web.Templates
@Html.Raw(Model.value)
@@ -1,6 +1,4 @@
@inherits UmbracoViewPage<dynamic>
@using Umbraco.Web.Templates
@if (Model.value != null)
{
@@ -1,5 +1,4 @@
@model dynamic
@using Umbraco.Web.Templates
@if (Model.value != null)
{
@@ -4,10 +4,9 @@
@if (Model.editor.config.markup != null)
{
string markup = Model.editor.config.markup.ToString();
var UmbracoHelper = new UmbracoHelper(UmbracoContext.Current);
markup = markup.Replace("#value#", UmbracoHelper.ReplaceLineBreaksForHtml(Model.value.ToString()));
markup = markup.Replace("#value#", UmbracoHelper.ReplaceLineBreaksForHtml(TemplateUtilities.CleanForXss(Model.value.ToString())));
markup = markup.Replace("#style#", Model.editor.config.style.ToString());
<text>
@@ -66,11 +66,11 @@
<div class="versions">
@if (Model.WorksOnUaaS)
{
<span class="smiley joyous">Works on Umbraco as a Service</span>
<span class="smiley joyous">Works on Umbraco Cloud</span>
}
else
{
<span class="smiley untested">Untested or doesn't work on Umbraco as a Service</span>
<span class="smiley untested">Untested or doesn't work on Umbraco Cloud</span>
}
@foreach (var ver in Model.VersionCompatibilities)
{
+3
View File
@@ -8,6 +8,9 @@
</configSections>
@@ -10,7 +10,7 @@ NOTES:
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
* A new version will invalidate both client and server cache and create new persisted files
-->
<clientDependency version="1272768233" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<clientDependency version="1837202336" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<!--
This section is used for Web Forms only, the enableCompositeFiles="true" is optional and by default is set to true.
+13 -3
View File
@@ -30,7 +30,17 @@
<control showOnce="true" addPanel="true" panelCaption="">
views/dashboard/developer/developerdashboardvideos.html
</control>
</tab>
</tab>
<tab caption="Health Check">
<control>
views/dashboard/developer/healthcheck.html
</control>
</tab>
<tab caption="Redirect URL Management">
<control>
views/dashboard/developer/redirecturls.html
</control>
</tab>
<tab caption="Examine Management">
<control>
views/dashboard/developer/examinemanagement.html
@@ -119,8 +129,8 @@
<area>developer</area>
</areas>
<tab caption="Models Builder">
<control>
/App_Plugins/ModelsBuilder/modelsbuilder.htm
<control>
/App_Plugins/ModelsBuilder/modelsbuilder.htm
</control>
</tab>
</section>
@@ -80,7 +80,28 @@ You get this notification because you posted to our forum.
You can unsubscribe from your profile on our.umbraco.org
</body>
</notification>
<notification name="MarkAsSolutionReminderSingle"
assembly="NotificationsCore"
type="NotificationsCore.NotificationTypes.MarkAsSolutionReminderSingle">
<subject>Umbraco community: Solution Reminder</subject>
<body>
We noticed that the topic {0} you created in the Umbraco Community Forum does not have a post marked as a solution.
If one of the replies helped answer your question or resolve your issue please mark it as a solution so others can quickly find it.
You can view the topic and replies here: {1}
Thank You from the Umbraco Community!
--------------------------------------------------
You get this notification because you posted to our forum.
You can unsubscribe from your profile on our.umbraco.org
</body>
</notification>
</instant>
</configuration>
@@ -39,7 +39,7 @@
"view": "textstring",
"icon": "icon-quote",
"config": {
"style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px",
"style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-style: italic; font-size: 18px",
"markup": "<blockquote>#value#</blockquote>"
}
}
@@ -1,304 +0,0 @@
@inherits umbraco.MacroEngines.DynamicNodeContext
@using System.Globalization
@using System.Text.RegularExpressions
@using OurUmbraco.MarketPlace.Models
@using OurUmbraco.Our
@using uForum.Businesslogic
@{
var queriedVersion = Request.QueryString["v"];
int requestedVersion;
int.TryParse(queriedVersion, out requestedVersion);
Version properVersion = null;
if (requestedVersion != 0)
{
properVersion = GetProperVersion(requestedVersion.ToString(CultureInfo.InvariantCulture));
}
var projectGroups = Model.Children.Where("nodeTypeAlias == \"ProjectGroup\"");
var projects = new List<UmbracoProject>();
foreach (var projectGroup in projectGroups)
{
foreach (var project in projectGroup.Children)
{
if (project.projectLive)
{
var versionsList = new List<int>();
var compatibleVersions = project.CompatibleVersions.Split(',');
foreach (var compatibleVersion in compatibleVersions)
{
if (string.IsNullOrWhiteSpace(compatibleVersion) == false && compatibleVersion != "saved")
{
int version;
if (int.TryParse(compatibleVersion.Substring(1), out version))
{
versionsList.Add(version);
}
}
}
var umbracoProject = new UmbracoProject
{
Id = project.Id,
Name = project.Name,
CreateDate = project.CreateDate,
CompatibleVersions = versionsList
};
projects.Add(umbracoProject);
}
}
}
if (requestedVersion == 0)
{
<div class="deliPromoBox clearfix">
@{
var vs = new List<int>();
foreach (var project in projects.OrderByDescending(x => x.CreateDate))
{
foreach (var version in project.CompatibleVersions.Where(version => vs.Contains(version) == false))
{
vs.Add(version);
}
}
foreach (var v in vs.OrderBy(x => x).Where(x => x.ToString(CultureInfo.InvariantCulture).StartsWith("3") == false && x.ToString(CultureInfo.InvariantCulture).StartsWith("5") == false).Skip(6))
{
<a href="/Projects/ProjectsVersioned?v=@v">Umbraco @(GetProperVersion(v.ToString(CultureInfo.InvariantCulture)).ToString(2)).x</a><br />
}
}
</div>
}
else
{
<h1 class="deliCatHead">Umbraco @(properVersion.ToString(2)).x compatible projects</h1>
<p><strong>Note:</strong> packages higher up in this list are more likely to actually work as they have been reported <br />to be working with Umbraco version @(properVersion.ToString(2)).x.</p>
<div class="deliPromoBox clearfix">
<div class="deliPromoArea">
<div class="deliPromoBox new clearfix">
@{
var vs = new List<int>();
foreach (var project in projects.OrderByDescending(x => x.CreateDate))
{
foreach (var version in project.CompatibleVersions.Where(version => vs.Contains(version) == false))
{
vs.Add(version);
}
}
}
<ul class="promoOptions">
@foreach (var v in vs.OrderBy(x => x).Where(x => x.ToString(CultureInfo.InvariantCulture).StartsWith("3") == false && x.ToString(CultureInfo.InvariantCulture).StartsWith("5") == false).Skip(6))
{
var itemProperVersion = GetProperVersion(v.ToString(CultureInfo.InvariantCulture)).ToString(2);
var currentProperVersion = properVersion.ToString(2);
<li><a href="?v=@v" class="newnav @(itemProperVersion == currentProperVersion ? "on": null)">@(itemProperVersion).x</a></li>
}
</ul>
@{
var projectIds = projects.Where(x => x.CompatibleVersions.Contains(requestedVersion)).Select(x => x.Id).ToArray();
var selection = string.Join(",", projectIds);
if (string.IsNullOrWhiteSpace(selection) == false)
{
var reader = Data.SqlHelper.ExecuteReader("SELECT id, nodeId, downloads FROM wikiFiles WHERE type = 'package' AND nodeId IN (" + selection + ")");
while (reader.Read())
{
var project = projects.FirstOrDefault(x => x.Id == reader.GetInt("nodeId"));
if (project != null)
{
project.TotalDownloads = project.TotalDownloads + reader.GetInt("downloads");
project.FileId = reader.GetInt("id");
}
}
reader = Data.SqlHelper.ExecuteReader("SELECT id, SUM([points]) AS Karma FROM powersProject WHERE id IN (" + selection + ") GROUP BY Id");
while (reader.Read())
{
var project = projects.FirstOrDefault(x => x.Id == reader.GetInt("id"));
if (project != null)
{
project.Karma = reader.GetInt("Karma");
}
}
var i = 1;
foreach (var project in projects.OrderBy(x => x.TotalDownloads).Where(x => x.CompatibleVersions.Contains(requestedVersion)))
{
project.TotalDownloadsRank = i + 5;
i++;
}
i = 1;
foreach (var project in projects.OrderBy(x => x.DownloadsCurrentVersion).Where(x => x.CompatibleVersions.Contains(requestedVersion)))
{
project.CurrentVersionDownloadsRank = i + 10;
i++;
}
i = 1;
foreach (var project in projects.OrderBy(x => x.Karma).Where(x => x.CompatibleVersions.Contains(requestedVersion)))
{
project.KarmaRank = i + 5;
i++;
}
foreach (var project in projects.Where(x => x.CompatibleVersions.Contains(requestedVersion)))
{
project.TotalRank = project.TotalDownloadsRank + project.CurrentVersionDownloadsRank + project.KarmaRank;
}
var fileIds = projects.Where(x => x.CompatibleVersions.Contains(requestedVersion)).Select(x => x.FileId).ToArray();
selection = string.Join(",", fileIds);
reader = Data.SqlHelper.ExecuteReader("SELECT * FROM DeliVersionCompatibility WHERE fileID IN(" + selection + ") AND version LIKE '" + GetProperVersion(requestedVersion.ToString(CultureInfo.InvariantCulture)).ToString(2) + ".%'");
while (reader.Read())
{
var project = projects.FirstOrDefault(x => x.Id == reader.GetInt("projectId"));
if (project != null)
{
project.ReportsCount++;
if (reader.GetBoolean("isCompatible"))
{
project.CompatibilityCount++;
}
}
}
var totalProjects = projects.Count(x => x.CompatibleVersions.Contains(requestedVersion));
foreach (var project in projects.Where(x => x.CompatibleVersions.Contains(requestedVersion)))
{
if (project.ReportsCount > 0 && project.CompatibilityCount == 0)
{
project.TotalRank = -30;
continue;
}
if (project.ReportsCount > 0)
{
project.TotalRank = project.TotalRank + (project.CompatibilityCount + totalProjects);
float compats = project.CompatibilityCount;
float numReps = project.ReportsCount;
var percentage = compats/numReps;
project.CompatibilityScore = percentage;
project.TotalRank = (int) (project.TotalRank*percentage);
}
}
<p class="viewAll">Showing @totalProjects projects</p>
}
}
<ul id="newest-projects">
@foreach (var project in projects.OrderByDescending(x => x.TotalRank).Where(x => x.CompatibleVersions.Contains(requestedVersion)))
{
var node = Library.NodeById(project.Id);
var description = node.Description.ToString();
var category = node.Parent.Name;
var screenshot = node.DefaultScreenshotPath.ToString();
var icon = string.IsNullOrEmpty(screenshot)
? "/css/img/package2.png"
: string.Format("image={0}?bgcolor=fff&width=50&height=50&format=png", screenshot);
<li class="clearfix">
<div class="deliPackage">
<div class="brief">
<a href="@node.Url" class="packageIcon" style="background:url(@icon) no-repeat top left;">Package</a>
<h3><a href="@node.Url">@project.Name</a></h3>
<div class="category">@category</div>
<div class="commercialIndicator @node.ListingType">@node.ListingType</div>
</div>
<div class="hiLite">
<p><a href="@node.Url">@(ShortenText(description))</a></p>
</div>
<div class="popularity">
<div class="karma">
@project.Karma <small>Karma</small>
</div>
<div class="downloads">
@project.TotalDownloads <small>Downloads</small>
</div>
</div>
</div>
</li>
}
</ul>
</div>
</div>
</div>
}
}
@functions {
public Version GetProperVersion(string version)
{
if (version == "4.1.0")
{
return new Version(version);
}
version = version.Replace(".", "");
if (version.EndsWith("x"))
{
version = version.Substring(0, version.IndexOf("x", StringComparison.Ordinal));
}
if (version == "410" || version == "4100")
{
return new Version("4.10");
}
if (version == "411" || version == "4110")
{
return new Version("4.11");
}
if (version.EndsWith("x"))
{
version = version.Substring(0, version.IndexOf("x", StringComparison.Ordinal) - 1);
}
var splitVersion = version.ToCharArray();
version = string.Join(".", splitVersion);
if (version.Length == 1)
{
version = version + ".0";
}
var tempRevision = new Version(version);
return tempRevision.Revision == -1 ? new Version(tempRevision.Major, tempRevision.Minor, 0) : tempRevision;
}
public static string ShortenText(string text)
{
text = Utils.StripHTML(text).Replace("&nbsp;", "");
if (text.Length > 210)
{
text = text.Substring(0, 210);
text = text.Substring(0, text.LastIndexOf(' '));
}
text = Regex.Replace(text, @"[^a-zA-Z0-9\s.?!&;]", ""); //strip all crap from the listing such as ======================================= !!!!
return text.Trim();
}
}
@@ -1,57 +0,0 @@
<%@ Master Language="C#" MasterPageFile="~/umbraco/masterpages/default.master" AutoEventWireup="true" %>
<asp:Content ContentPlaceHolderID="ContentPlaceHolderDefault" runat="server">
<%@ Master Language="C#" MasterPageFile="~/umbraco/masterpages/default.master" AutoEventWireup="true" %>
<asp:Content ContentPlaceHolderID="ContentPlaceHolderDefault" runat="server">
<body onload="JavaScript:timedRefresh(5000);">
<umbraco:Macro runat="server" language="cshtml">
@using System.Threading
@using System.Diagnostics
@using uForum.Businesslogic
@{
var stopwatch1 = new Stopwatch();
stopwatch1.Start();
var records = 10;
if (Request.QueryString["records"] != null)
{
records = int.Parse(Request.QueryString["records"]);
}
var sql = string.Format("SELECT TOP {0} contentNodeId, versionId FROM [our.umbraco.org.live].[dbo].[cmsPropertyData] WHERE contentNodeId IN (SELECT NodeId FROM [our.umbraco.org.live].[dbo].[cmsMember]) AND contentNodeId NOT IN (SELECT contentNodeId FROM [our.umbraco.org.live].[dbo].[cmsPropertyData] WHERE propertytypeid = 203) GROUP BY contentNodeId, versionId", records);
var reader = Data.SqlHelper.ExecuteReader(sql);
while (reader.Read())
{
var contentNodeId = reader.GetInt("contentNodeId");
var versionId = reader.GetGuid("versionId").ToString();
var stopwatch2 = new Stopwatch();
stopwatch2.Start();
Data.SqlHelper.ExecuteNonQuery("INSERT INTO [our.umbraco.org.live].[dbo].[cmsPropertyData] (contentNodeId, versionId, propertyTypeId) VALUES (@id, @versionId, 203)", Data.SqlHelper.CreateParameter("@id", contentNodeId), Data.SqlHelper.CreateParameter("@versionId", versionId));
stopwatch2.Stop();
<span style="font-size: 9px;">@contentNodeId - @stopwatch2.Elapsed.Ticks</span>
}
reader.Close();
reader.Dispose();
stopwatch1.Stop();
<hr />
<p>Updated @records records in @stopwatch1.Elapsed.Seconds seconds</p>
}
</umbraco:Macro>
<script type="text/JavaScript">
<!--
function timedRefresh(timeoutPeriod) {
setTimeout("location.reload(true);",timeoutPeriod);
}
// -->
</script>
</body>
</asp:Content>
</asp:Content>
+133 -139
View File
@@ -5,22 +5,22 @@
<asp:Content ID="Content1" ContentPlaceHolderId="Head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderId="Main" runat="server">
<umbraco:Macro ID="Macro6" Language="cshtml" runat="server">
@{
if(Request.Params["fromdownload"] != null) {
var downloads = Model.ReleaseDownload.Where("Visible");
var downloads = Model.ReleaseDownload.Where("Visible");
if(downloads.Any())
{
var downloadIds = new List<int>();
foreach (var item in downloads)
{
{
downloadIds.Add(item.Id);
}
Response.Redirect("/ReleaseDownload?id=" + downloadIds.First(), false);
}
}
}
}
</umbraco:Macro>
<%
@@ -29,7 +29,7 @@
var release = allReleases.First(x => x.version == currentPage.Name);
var completedIssues = release.issues.Count(x => x.state == "Fixed");
var totalIssues = release.issues.Count();
var percentComplete = Math.Round(((double) 100/totalIssues)*completedIssues);
var percentComplete = Math.Round(((double)100 / totalIssues) * completedIssues);
var releaseDateParsed = DateTime.Now;
if (release.releaseDate != string.Empty)
{
@@ -38,7 +38,7 @@
var releaseDate = release.releaseDate == "" ? "Not yet determined" : releaseDateParsed.ToString("dddd, MMMM d yyyy");
var umbracoHelper = new Umbraco.Web.UmbracoHelper(UmbracoContext.Current);
var releaseContent = umbracoHelper.TypedContent(umbracoHelper.UmbracoContext.PageId);
if (releaseContent != null)
@@ -60,7 +60,7 @@
<div class="sidebar-area">
<div class="sidebar-content">
<div class="content-wrapper">
<nav>
<ul class="level-1">
<%
@@ -102,150 +102,112 @@
<div>
<umbraco:Macro linkToCurrent="1" Alias="Breadcrumb" runat="server"></umbraco:Macro>
</div>
<style>
.release-page .explain h2 {
margin-top: 12px;
font-size: 2em;
margin-bottom: .3rem;
color: rgba(0,0,0,.8);
}
.release-page .dot {
border: none;
}
<div class="explain flex items-center">
.release-page .dot.big {
position: relative;
text-indent: 0;
margin: 15px auto 0;
}
<div class="release-progress-indicator flex flex-wrap items-center">
.release-page .chart {
height: 60px;
width: 60px;
top: initial;
left: initial;
text-align: center;
}
.release-page .chart p {
vertical-align: middle;
line-height: 3.7rem;
display: inline-block;
}
.release-page .chart canvas {
top: 0px;
left: 0px;
}
.statuses ul {
list-style-type: none;
}
.statuses ul li {
position: relative;
margin-bottom: 10px;
padding-left: 10px;
}
.statuses li:before {
position: absolute;
top: -4px;
left: -25px;
font-size: 1.5em;
}
</style>
<div class="row explain">
<div class="col-sm-2">
<span class="dot big progress">
<span class="dot big progress">
<div class="chart" data-percent="<%= percentComplete %>">
<p><%= percentComplete %>%</p>
</div>
</span>
</div>
<div class="col-sm-10">
<h2>
v<umbraco:Item ID="Item1" field="pageName" runat="server" />
</h2>
<small>Status: <span><%= release.released ? "Released" : "In Progress" %></span></small>
<% if (release.released == false)
{ %>
<h3>
<span><%= percentComplete %>% complete</span>
<span><%= 100 - percentComplete %>% in progress</span>
</h3>
<h3>Target release date: <span style="color:#5B5B5B"><%= releaseDate %></span></h3>
<% } %>
<umbraco:Macro ID="Macro5" Language="cshtml" runat="server">
@if(Model.HasValue("releaseNotes")) {
<small><p>@Model.releaseNotes</p></small>
}
</umbraco:Macro>
<span class="release-progress-version flex flex-column">
<h2>
<strong><umbraco:Item ID="Item1" field="pageName" runat="server" /></strong>
</h2>
<small>Status: <span><%= release.released ? "Released" : "In Progress" %></span></small>
<% if (release.released == false)
{ %>
<h3>
<span><%= percentComplete %>% complete</span>
<span><%= 100 - percentComplete %>% in progress</span>
</h3>
<h3>Target release date: <span style="color:#5B5B5B"><%= releaseDate %></span></h3>
<% } %>
<umbraco:Macro ID="Macro5" Language="cshtml" runat="server">
@if(Model.HasValue("releaseNotes")) {
<small><p>@Model.releaseNotes</p></small>
}
</umbraco:Macro>
</span>
</div>
</div>
<div>
<umbraco:Macro ID="Macro2" Language="cshtml" runat="server">
@{
var downloads = Model.ReleaseDownload.Where("Visible");
var countIsOdd = ((downloads.Count() & 1) != 0) ? true : false;
@{
var downloads = Model.ReleaseDownload.Where("Visible");
var countIsOdd = ((downloads.Count() & 1) != 0) ? true : false;
if(downloads.Any())
{
<div class="get-release row">
@foreach (var item in downloads)
{
var background = item.IsFirst() ? "/images/releases/download.png" : "/media/2483095/download.png";
var width = (item.IsLast() && countIsOdd) ? 895 : 380;
var numberOfDownloads = 0;
int.TryParse(item.NumberOfDownloads, out numberOfDownloads);
numberOfDownloads = numberOfDownloads + OurUmbraco.Our.Utils.GetReleaseDownloadCount(item.Id);
if(item.Name.Contains("WebPI") == false)
{
<div class="release @(item.IsFirst() == false ? "bin" : "zip") col-sm-1">
<i class="icon-Download-alt"></i>
</div>
<div class="release @(item.IsFirst() == false ? "bin" : "zip") col-md-5">
<h3><a href="/ReleaseDownload?id=@item.Id" onclick="_gaq.push(['_trackEvent', 'Release', 'Download', '@item.Name']);">@item.Name</a></h3>
@if(item.IsFirst())
{
<p>This is the main Umbraco download, generally you won't need anything else.</p>
}
<small>Downloaded @numberOfDownloads times - uploaded @item.UploadDate.ToString("D")</small>
</div>
} else {
<div style="display: none;"><a href="/ReleaseDownload?id=@item.Id" onclick="_gaq.push(['_trackEvent', 'Release', 'Download', '@item.Name']);">@item.Name</a></div>
<div class="get-release">
<div class="release-section flex flex-row flex-wrap">
<!-- Download button -->
<div class="release-section-group">
<h3>Download and install</h3>
@foreach (var item in downloads)
{
if (item.IsFirst())
{
var numberOfDownloads = 0;
int.TryParse(item.NumberOfDownloads, out numberOfDownloads);
numberOfDownloads = numberOfDownloads + OurUmbraco.Our.Utils.GetReleaseDownloadCount(item.Id);
<div class="release-section-action">
<a class="button green" href="/ReleaseDownload?id=@item.Id" onclick="ga('send', 'event', 'Release', 'Download', '@item.Name');">Download Umbraco @Model.Name</a>
</div>
<p>This is the main Umbraco download, generally you won't need anything else. You can find installation instructions under <strong>"<a href="/documentation/Getting-Started/Setup/Install/install-umbraco-manually">Getting Started</a>"</strong>.</p>
<small>Downloaded @numberOfDownloads times - uploaded @item.UploadDate.ToString("D")</small>
}
}
</div>
<!-- NuGet installation -->
@if(Model.HasNuGet) {
<div class="release-section-group">
<h3>Install using NuGet</h3>
<div class="release-section-action">
<code><a href="https://nuget.org/packages/UmbracoCms/@Model.Name" onclick="ga('send', 'event', 'Release', 'NuGetClick', '@Model.Name');">PM&gt; Install-Package UmbracoCms -Version @Model.Name</a></code>
</div>
<p>Installs Umbraco Cms in your Visual Studio ASP.NET project. To install Umbraco Cms, run the above command in the Package Manager Console. <a target="_blank" href="/documentation/Getting-Started/Setup/Install/install-umbraco-with-nuget">Read more in the documentation</a>.</p>
</div>
}
}
</div>
</div>
}
}
}
</umbraco:Macro>
<div class="row markdown-syntax">
<div class="col-md-5">
<% if (release.releaseDescription != string.Empty && currentPage.HasValue("bodyText") == false)
{ %>
{ %>
<span>
<h2>Summary</h2>
<p><span><%= release.releaseDescription %></span></p>
</span>
<% } %>
<umbraco:Macro ID="Macro3" Language="cshtml" runat="server">
@if(Model.HasValue("bodyText")) {
<h2>Release notes</h2>
@Model.BodyText
}
</umbraco:Macro>
<h2>Related changes from the issue tracker</h2>
<div class="panel-wrapper">
<div class="panel-left">
@@ -264,8 +226,10 @@
<li class="<%= issue.StateIcon() %>" title="<%= issue.state %>">
<a href="http://issues.umbraco.org/issue/<%= issue.id %>" target="_blank"><%= issue.id %> - <%= issue.title %></a>
</li>
</ul>
<% } } else { %>
</ul>
<% }
}
else { %>
<p>No items to display</p>
<% } %>
</div>
@@ -282,8 +246,10 @@
<li class="<%= issue.StateIcon() %>" title="<%= issue.state %>">
<a href="http://issues.umbraco.org/issue/<%= issue.id %>" target="_blank"><%= issue.id %> - <%= issue.title %></a>
</li>
</ul>
<% } } else { %>
</ul>
<% }
}
else { %>
<p>No items to display</p>
<% } %>
</div>
@@ -300,18 +266,20 @@
<li class="<%= issue.StateIcon() %>" title="<%= issue.state %>">
<a href="http://issues.umbraco.org/issue/<%= issue.id %>" target="_blank"><%= issue.id %> - <%= issue.title %></a>
</li>
</ul>
<% } } else { %>
</ul>
<% }
}
else { %>
<p>No items to display</p>
<% } %>
</div>
</div>
</div>
</div>
</div><!-- col-md-5 -->
<div class="col-md-5 col-md-offset-2">
<h2>Getting started</h2>
@@ -327,26 +295,52 @@
<p>You'll find our über active community working hard to help each other at Our Umbraco: <a href="http://our.umbraco.org">http://our.umbraco.org</a></p>
<h2>Upgrading from older versions</h2>
<p>Make sure to read the <a href="http://our.umbraco.org/documentation/Installation/Upgrading/">upgrade instructions</a> before you attempt an upgrade.</p>
<umbraco:Macro ID="Macro4" runat="server" Language="cshtml">
<h2>Found a bug?</h2>
<p>We're happy to help you with any problems you encounter, so please report them in <a href="http://issues.umbraco.org/issues/U4">the issue tracker</a> and use the “Affected versions” field to set it to @Model.Name. <br />Do a search first though, if the issue already exists, give it an extra vote.</p>
@if(Model.HasValue("linkToChangeset")) {
<h2>Source code</h2>
<p>The source for <a href="@Model.LinkToChangeset">this specific release is available for download from the repository</a> (click the "ZIP" button).</p>
}
@if(Model.HasNuGet) {
<h2>Also available on NuGet</h2>
<div class="nuget-badge">
<a href="https://nuget.org/packages/UmbracoCms/@Model.Name">
<p><code>PM&gt; Install-Package UmbracoCms -Version @Model.Name</code></p>
</a>
<!-- Other files -->
@{
var downloads = Model.ReleaseDownload.Where("Visible");
var countIsOdd = ((downloads.Count() & 1) != 0) ? true : false;
if(downloads.Any())
{
<div class="release-other-files">
<h2>All files</h2>
@foreach (var item in downloads)
{
var background = item.IsFirst() ? "/images/releases/download.png" : "/media/2483095/download.png";
var width = (item.IsLast() && countIsOdd) ? 895 : 380;
var numberOfDownloads = 0;
int.TryParse(item.NumberOfDownloads, out numberOfDownloads);
numberOfDownloads = numberOfDownloads + OurUmbraco.Our.Utils.GetReleaseDownloadCount(item.Id);
if(item.Name.Contains("WebPI") == false)
{
<div class="release @(item.IsFirst() == false ? "bin" : "zip")">
<div><strong><a href="/ReleaseDownload?id=@item.Id" onclick="ga('send', 'event', 'Release', 'Download', '@item.Name');">@item.Name</a></strong></div>
@if(item.IsFirst())
{
<p>This is the main Umbraco download, generally you won't need anything else.</p>
}
<small>Downloaded @numberOfDownloads times - uploaded @item.UploadDate.ToString("D")</small>
</div>
} else {
<div style="display: none;"><a href="/ReleaseDownload?id=@item.Id" onclick="ga('send', 'event', 'Release', 'Download', '@item.Name');">@item.Name</a></div>
}
}
</div>
}
}
}
</umbraco:Macro>
</div><!-- col-md-5 col-md-offset-2 -->
@@ -362,7 +356,7 @@
</asp:Content>
<asp:Content ContentPlaceHolderId="EndScripts" runat="server">
<script src="https://cdnjs.cloudflare.com/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.min.js"></script>
<script type="text/javascript">
setTimeout(function () {
$('.chart').easyPieChart({
@@ -29,10 +29,12 @@
currentMember = member.Id;
}
Application.SqlHelper.ExecuteNonQuery(
@"insert into projectDownload(projectId,memberId,timestamp) values(@id, @memberId, getdate())",
Application.SqlHelper.CreateParameter("@id", docId),
Application.SqlHelper.CreateParameter("@memberId", currentMember));
using (var sqlHelper = Application.SqlHelper)
{
sqlHelper.ExecuteNonQuery(@"insert into projectDownload(projectId,memberId,timestamp) values(@id, @memberId, getdate())",
sqlHelper.CreateParameter("@id", docId),
sqlHelper.CreateParameter("@memberId", currentMember));
}
Response.Redirect(link, false);
}
@@ -149,32 +149,32 @@ The five people with most votes from 15 March until 15 April 2011 will become 20
<p><strong>You need to <a href="http://our.umbraco.org/member/login?redirectUrl=http://our.umbraco.org/UmbracoMVP2011">log in</a> before casting your vote.</strong></p>
<%}else{
// Umbraco.Forms.Data.Storage.RecordStorage s = new Umbraco.Forms.Data.Storage.RecordStorage();
//var all = s.GetAllRecords(new Guid("12c58e28-ca9e-4e05-9849-8ae8ed555109"));
//var voted = all.Find(r => r.MemberKey.ToString() == umbraco.cms.businesslogic.member.Member.GetCurrentMember().Id.ToString());
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.AppSettings["umbracoDbDSN"]);
System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand(
"SELECT 1 FROM UFRecords where form = '12C58E28-CA9E-4E05-9849-8AE8ED555109' and memberkey = @memberkey",
conn);
// Umbraco.Forms.Data.Storage.RecordStorage s = new Umbraco.Forms.Data.Storage.RecordStorage();
//var all = s.GetAllRecords(new Guid("12c58e28-ca9e-4e05-9849-8ae8ed555109"));
//var voted = all.Find(r => r.MemberKey.ToString() == umbraco.cms.businesslogic.member.Member.GetCurrentMember().Id.ToString());
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.AppSettings["umbracoDbDSN"]);
System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand(
"SELECT 1 FROM UFRecords where form = '12C58E28-CA9E-4E05-9849-8AE8ED555109' and memberkey = @memberkey",
conn);
comm.Parameters.AddWithValue("@memberkey",umbraco.cms.businesslogic.member.Member.GetCurrentMember().Id);
conn.Open();
bool membervoted = false;
System.Data.SqlClient.SqlDataReader rdr = comm.ExecuteReader();
while (rdr.Read())
using (var reader = comm.ExecuteReader())
{
membervoted = true;
while (reader.Read())
{
membervoted = true;
}
conn.Close();
}
conn.Close();
if (membervoted == false)
{
if (membervoted == false)
{
%>
+9 -9
View File
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AspNetMvc" version="3.0.20105.1" targetFramework="net4" />
<package id="AutoMapper" version="3.0.0" targetFramework="net452" />
<package id="ClientDependency" version="1.9.1" targetFramework="net452" />
<package id="AutoMapper" version="3.3.1" targetFramework="net452" />
<package id="ClientDependency" version="1.9.2" targetFramework="net452" />
<package id="ClientDependency-Mvc" version="1.8.0.0" targetFramework="net451" />
<package id="ClientDependency-Mvc5" version="1.8.0.0" targetFramework="net452" />
<package id="EasyHttp" version="1.6.29.0" targetFramework="net451" />
<package id="Examine" version="0.1.69.0" targetFramework="net452" />
<package id="HtmlAgilityPack" version="1.4.9" targetFramework="net452" />
<package id="ImageProcessor" version="2.4.4.0" targetFramework="net452" />
<package id="ImageProcessor.Web" version="4.6.4.0" targetFramework="net452" />
<package id="Examine" version="0.1.70.0" targetFramework="net452" />
<package id="HtmlAgilityPack" version="1.4.9.5" targetFramework="net452" />
<package id="ImageProcessor" version="2.4.5.0" targetFramework="net452" />
<package id="ImageProcessor.Web" version="4.6.6.0" targetFramework="net452" />
<package id="jQuery" version="1.4.1" targetFramework="net451" />
<package id="jQuery.Validation" version="1.8" targetFramework="net451" />
<package id="jQuery.Validation.Unobtrusive" version="2.0.20710.0" targetFramework="net451" />
@@ -50,9 +50,9 @@
<package id="SharpZipLib" version="0.86.0" targetFramework="net452" />
<package id="System.Collections.Immutable" version="1.1.36" targetFramework="net452" />
<package id="System.Reflection.Metadata" version="1.0.21" targetFramework="net452" />
<package id="Umbraco.ModelsBuilder" version="3.0.4" targetFramework="net452" />
<package id="UmbracoCms" version="7.5.3" targetFramework="net452" />
<package id="UmbracoCms.Core" version="7.5.3" targetFramework="net452" />
<package id="Umbraco.ModelsBuilder" version="3.0.5" targetFramework="net452" />
<package id="UmbracoCms" version="7.5.5" targetFramework="net452" />
<package id="UmbracoCms.Core" version="7.5.5" targetFramework="net452" />
<package id="UmbracoCms.IdentityExtensions" version="1.0.0" targetFramework="net451" />
<package id="UmbracoCms.IdentityExtensions.Google" version="1.0.0" targetFramework="net451" />
<package id="UrlRewritingNet" version="2.0.7" targetFramework="net452" />
@@ -1,24 +1,24 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet makes a breadcrumb of parents using an unordered html list.
How it works:
- It uses the Ancestors() method to get all parents and then generates links so the visitor can go back
- Finally it outputs the name of the current page (without a link)
*@
@{ var selection = CurrentPage.Ancestors(); }
@if (selection.Any())
{
<ul class="breadcrumb">
@* For each page in the ancestors collection which have been ordered by Level (so we start with the highest top node first) *@
@foreach (var item in selection.OrderBy("Level"))
{
<li><a href="@item.Url">@item.Name</a> <span class="divider">/</span></li>
}
@* Display the current page as the last item in the list *@
<li class="active">@CurrentPage.Name</li>
</ul>
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet makes a breadcrumb of parents using an unordered html list.
How it works:
- It uses the Ancestors() method to get all parents and then generates links so the visitor can go back
- Finally it outputs the name of the current page (without a link)
*@
@{ var selection = CurrentPage.Ancestors(); }
@if (selection.Any())
{
<ul class="breadcrumb">
@* For each page in the ancestors collection which have been ordered by Level (so we start with the highest top node first) *@
@foreach (var item in selection.OrderBy("Level"))
{
<li><a href="@item.Url">@item.Name</a> <span class="divider">/</span></li>
}
@* Display the current page as the last item in the list *@
<li class="active">@CurrentPage.Name</li>
</ul>
}
@@ -1,66 +1,66 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Controllers
@{
var profileModel = Members.GetCurrentMemberProfileModel();
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
var success = TempData["ProfileUpdateSuccess"] != null;
}
@*NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed*@
@Html.RenderJsHere()
@if (Members.IsLoggedIn() && profileModel != null)
{
if (success)
{
@* This message will show if RedirectOnSucces is set to false (default) *@
<p>Profile updated</p>
}
using (Html.BeginUmbracoForm<UmbProfileController>("HandleUpdateProfile"))
{
<fieldset>
<legend>Edit profile</legend>
@Html.ValidationSummary("profileModel", true)
@Html.LabelFor(m => profileModel.Name)
@Html.TextBoxFor(m => profileModel.Name)
@Html.ValidationMessageFor(m => profileModel.Name)
<br />
@Html.LabelFor(m => profileModel.Email)
@Html.TextBoxFor(m => profileModel.Email)
@Html.ValidationMessageFor(m => profileModel.Email)
<br />
@for (var i = 0; i < profileModel.MemberProperties.Count; i++)
{
@Html.LabelFor(m => profileModel.MemberProperties[i].Value, profileModel.MemberProperties[i].Name)
@*
By default this will render a textbox but if you want to change the editor template for this property you can
easily change it. For example, if you wanted to render a custom editor for this field called "MyEditor" you would
create a file at ~/Views/Shared/EditorTemplates/MyEditor.cshtml", then you will change the next line of code to
render your specific editor template like:
@Html.EditorFor(m => profileModel.MemberProperties[i].Value, "MyEditor")
*@
@Html.EditorFor(m => profileModel.MemberProperties[i].Value)
@Html.HiddenFor(m => profileModel.MemberProperties[i].Alias)
<br />
}
<button>Save</button>
</fieldset>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Controllers
@{
var profileModel = Members.GetCurrentMemberProfileModel();
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
var success = TempData["ProfileUpdateSuccess"] != null;
}
@*NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed*@
@Html.RenderJsHere()
@if (Members.IsLoggedIn() && profileModel != null)
{
if (success)
{
@* This message will show if RedirectOnSucces is set to false (default) *@
<p>Profile updated</p>
}
using (Html.BeginUmbracoForm<UmbProfileController>("HandleUpdateProfile"))
{
<fieldset>
<legend>Edit profile</legend>
@Html.ValidationSummary("profileModel", true)
@Html.LabelFor(m => profileModel.Name)
@Html.TextBoxFor(m => profileModel.Name)
@Html.ValidationMessageFor(m => profileModel.Name)
<br />
@Html.LabelFor(m => profileModel.Email)
@Html.TextBoxFor(m => profileModel.Email)
@Html.ValidationMessageFor(m => profileModel.Email)
<br />
@for (var i = 0; i < profileModel.MemberProperties.Count; i++)
{
@Html.LabelFor(m => profileModel.MemberProperties[i].Value, profileModel.MemberProperties[i].Name)
@*
By default this will render a textbox but if you want to change the editor template for this property you can
easily change it. For example, if you wanted to render a custom editor for this field called "MyEditor" you would
create a file at ~/Views/Shared/EditorTemplates/MyEditor.cshtml", then you will change the next line of code to
render your specific editor template like:
@Html.EditorFor(m => profileModel.MemberProperties[i].Value, "MyEditor")
*@
@Html.EditorFor(m => profileModel.MemberProperties[i].Value)
@Html.HiddenFor(m => profileModel.MemberProperties[i].Alias)
<br />
}
<button>Save</button>
</fieldset>
}
}
@@ -1,50 +1,50 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to display a gallery of images from media the media section.
Works with either a 'Single Media Picker' or a 'Multiple Media Picker' macro parameter (see below).
How it works:
- Confirm the macro parameter has been passed in with a value
- Loop through all the media Id's passed in (might be a single item, might be many)
- Display any individual images, as well as any folders of images
Macro Parameters To Create, for this macro to work:
Alias:mediaIds Name:Select folders and/or images Type: Multiple Media Picker
Type: (note: you can use a Single Media Picker if that's more appropriate to your needs)
*@
@{ var mediaIds = Model.MacroParameters["mediaIds"]; }
@if (mediaIds != null)
{
<ul class="thumbnails">
@foreach (var mediaId in mediaIds.ToString().Split(','))
{
var media = Umbraco.Media(mediaId);
@* a single image *@
if (media.DocumentTypeAlias == "Image")
{
@Render(media);
}
@* a folder with images under it *@
if (media.Children("Image").Any())
{
foreach (var image in media.Children("Image"))
{
@Render(image);
}
}
}
</ul>
}
@helper Render(dynamic item)
{
<li class="span2">
<a href="@item.umbracoFile.src" class="thumbnail">
<img src="@item.umbracoFile.src" alt="@item.Name" />
</a>
</li>
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to display a gallery of images from media the media section.
Works with either a 'Single Media Picker' or a 'Multiple Media Picker' macro parameter (see below).
How it works:
- Confirm the macro parameter has been passed in with a value
- Loop through all the media Id's passed in (might be a single item, might be many)
- Display any individual images, as well as any folders of images
Macro Parameters To Create, for this macro to work:
Alias:mediaIds Name:Select folders and/or images Type: Multiple Media Picker
Type: (note: you can use a Single Media Picker if that's more appropriate to your needs)
*@
@{ var mediaIds = Model.MacroParameters["mediaIds"]; }
@if (mediaIds != null)
{
<ul class="thumbnails">
@foreach (var mediaId in mediaIds.ToString().Split(','))
{
var media = Umbraco.Media(mediaId);
@* a single image *@
if (media.DocumentTypeAlias == "Image")
{
@Render(media);
}
@* a folder with images under it *@
if (media.Children("Image").Any())
{
foreach (var image in media.Children("Image"))
{
@Render(image);
}
}
}
</ul>
}
@helper Render(dynamic item)
{
<li class="span2">
<a href="@item.umbracoFile.src" class="thumbnail">
<img src="@item.umbracoFile.src" alt="@item.Name" />
</a>
</li>
}
@@ -1,24 +1,24 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet makes a list of links to the of parents of the current page using an unordered html list.
How it works:
- It uses the Ancestors() method to get all parents and then generates links so the visitor can go back
- Finally it outputs the name of the current page (without a link)
*@
@{ var selection = CurrentPage.Ancestors(); }
@if (selection.Any())
{
<ul>
@* For each page in the ancestors collection which have been ordered by Level (so we start with the highest top node first) *@
@foreach (var item in selection.OrderBy("Level"))
{
<li><a href="@item.Url">@item.Name</a> &raquo;</li>
}
@* Display the current page as the last item in the list *@
<li>@CurrentPage.Name</li>
</ul>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet makes a list of links to the of parents of the current page using an unordered html list.
How it works:
- It uses the Ancestors() method to get all parents and then generates links so the visitor can go back
- Finally it outputs the name of the current page (without a link)
*@
@{ var selection = CurrentPage.Ancestors(); }
@if (selection.Any())
{
<ul>
@* For each page in the ancestors collection which have been ordered by Level (so we start with the highest top node first) *@
@foreach (var item in selection.OrderBy("Level"))
{
<li><a href="@item.Url">@item.Name</a> &raquo;</li>
}
@* Display the current page as the last item in the list *@
<li>@CurrentPage.Name</li>
</ul>
}
@@ -1,33 +1,33 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to list all child pages under a specific page in the content tree.
How it works:
- Confirm the startNodeId macro parameter has been passed in with a value
- Loop through all child pages
- Display a list of link to those pages, sorted by the value of the propertyAlias
Macro Parameters To Create, for this macro to work:
Alias:startNodeId Name:Select starting page Type:Content Picker
*@
@{ var startNodeId = Model.MacroParameters["startNodeId"]; }
@if (startNodeId != null)
{
@* Get the starting page *@
var startNode = Umbraco.Content(startNodeId);
var selection = startNode.Children.Where("Visible");
if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li>
<a href="@item.Url">@item.Name</a>
</li>
}
</ul>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to list all child pages under a specific page in the content tree.
How it works:
- Confirm the startNodeId macro parameter has been passed in with a value
- Loop through all child pages
- Display a list of link to those pages, sorted by the value of the propertyAlias
Macro Parameters To Create, for this macro to work:
Alias:startNodeId Name:Select starting page Type:Content Picker
*@
@{ var startNodeId = Model.MacroParameters["startNodeId"]; }
@if (startNodeId != null)
{
@* Get the starting page *@
var startNode = Umbraco.Content(startNodeId);
var selection = startNode.Children.Where("Visible");
if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li>
<a href="@item.Url">@item.Name</a>
</li>
}
</ul>
}
}
@@ -1,15 +1,15 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@{ var selection = CurrentPage.Children.Where("Visible"); }
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li>
<a href="@item.Url">@item.Name</a>
</li>
}
</ul>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@{ var selection = CurrentPage.Children.Where("Visible"); }
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li>
<a href="@item.Url">@item.Name</a>
</li>
}
</ul>
}
@@ -1,11 +1,11 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@{ var selection = CurrentPage.Children.Where("Visible").OrderBy("CreateDate desc"); }
@* OrderBy() takes the property to sort by and optionally order desc/asc *@
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@{ var selection = CurrentPage.Children.Where("Visible").OrderBy("CreateDate desc"); }
@* OrderBy() takes the property to sort by and optionally order desc/asc *@
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
@@ -1,11 +1,11 @@
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{ var selection = CurrentPage.Children.Where("Visible").OrderBy("Name"); }
@* OrderBy() takes the property to sort by *@
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{ var selection = CurrentPage.Children.Where("Visible").OrderBy("Name"); }
@* OrderBy() takes the property to sort by *@
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
@@ -1,26 +1,26 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to list all child pages with a specific property, sorted by the value of that property.
How it works:
- Confirm the propertyAlias macro parameter has been passed in with a value
- Loop through all child pages that have the propertyAlias
- Display a list of link to those pages, sorted by the value of the propertyAlias
Macro Parameters To Create, for this macro to work:
Alias:propertyAlias Name:Property Alias Type:Textbox
*@
@{ var propertyAlias = Model.MacroParameters["propertyAlias"]; }
@if (propertyAlias != null)
{
var selection = CurrentPage.Children.Where("Visible").OrderBy(propertyAlias);
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to list all child pages with a specific property, sorted by the value of that property.
How it works:
- Confirm the propertyAlias macro parameter has been passed in with a value
- Loop through all child pages that have the propertyAlias
- Display a list of link to those pages, sorted by the value of the propertyAlias
Macro Parameters To Create, for this macro to work:
Alias:propertyAlias Name:Property Alias Type:Textbox
*@
@{ var propertyAlias = Model.MacroParameters["propertyAlias"]; }
@if (propertyAlias != null)
{
var selection = CurrentPage.Children.Where("Visible").OrderBy(propertyAlias);
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
}
@@ -1,25 +1,25 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet shows how simple it is to fetch only children of a certain Document Type using Razor.
Be sure to change "DocumentTypeAlias" below to match your needs, such as "TextPage" or "NewsItems".
(You can find the alias of your Document Type by editing it in the Settings section)
*@
@{ var selection = CurrentPage.Children("DocumentTypeAlias").Where("Visible"); }
@*
As an example of more querying, if you have a true/false property with the alias of shouldBeFeatured:
var selection= CurrentPage.Children("DocumentTypeAlias").Where("shouldBeFeatured == true").Where("Visible");
*@
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet shows how simple it is to fetch only children of a certain Document Type using Razor.
Be sure to change "DocumentTypeAlias" below to match your needs, such as "TextPage" or "NewsItems".
(You can find the alias of your Document Type by editing it in the Settings section)
*@
@{ var selection = CurrentPage.Children("DocumentTypeAlias").Where("Visible"); }
@*
As an example of more querying, if you have a true/false property with the alias of shouldBeFeatured:
var selection= CurrentPage.Children("DocumentTypeAlias").Where("shouldBeFeatured == true").Where("Visible");
*@
@if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li><a href="@item.Url">@item.Name</a></li>
}
</ul>
}
@@ -1,61 +1,61 @@
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@*
This snippet creates links for every single page (no matter how deep) below
the page currently being viewed by the website visitor, displayed as nested unordered html lists.
*@
@{ var selection = CurrentPage.Children.Where("Visible"); }
@* Ensure that the Current Page has children *@
@if (selection.Any())
{
@* Get the first page in the children, where the property umbracoNaviHide is not True *@
var naviLevel = CurrentPage.FirstChild().Where("Visible").Level;
@* Add in level for a CSS hook *@
<ul class="level-@naviLevel">
@* For each child page where the property umbracoNaviHide is not True *@
@foreach (var item in selection)
{
<li>
<a href="@item.Url">@item.Name</a>
@* if this child page has any children, where the property umbracoNaviHide is not True *@
@if (item.Children.Where("Visible").Any())
{
@* Call our helper to display the children *@
@childPages(item.Children)
}
</li>
}
</ul>
}
@helper childPages(dynamic selection)
{
@* Ensure that we have a collection of pages *@
if (selection.Any())
{
@* Get the first page in pages and get the level *@
var naviLevel = selection.First().Level;
@* Add in level for a CSS hook *@
<ul class="level-@(naviLevel)">
@foreach (var item in selection.Where("Visible"))
{
<li>
<a href="@item.Url">@item.Name</a>
@* if the this page has any children, where the property umbracoNaviHide is not True *@
@if (item.Children.Where("Visible").Any())
{
@* Call our helper to display the children *@
@childPages(item.Children)
}
</li>
}
</ul>
}
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@*
This snippet creates links for every single page (no matter how deep) below
the page currently being viewed by the website visitor, displayed as nested unordered html lists.
*@
@{ var selection = CurrentPage.Children.Where("Visible"); }
@* Ensure that the Current Page has children *@
@if (selection.Any())
{
@* Get the first page in the children, where the property umbracoNaviHide is not True *@
var naviLevel = CurrentPage.FirstChild().Where("Visible").Level;
@* Add in level for a CSS hook *@
<ul class="level-@naviLevel">
@* For each child page where the property umbracoNaviHide is not True *@
@foreach (var item in selection)
{
<li>
<a href="@item.Url">@item.Name</a>
@* if this child page has any children, where the property umbracoNaviHide is not True *@
@if (item.Children.Where("Visible").Any())
{
@* Call our helper to display the children *@
@childPages(item.Children)
}
</li>
}
</ul>
}
@helper childPages(dynamic selection)
{
@* Ensure that we have a collection of pages *@
if (selection.Any())
{
@* Get the first page in pages and get the level *@
var naviLevel = selection.First().Level;
@* Add in level for a CSS hook *@
<ul class="level-@(naviLevel)">
@foreach (var item in selection.Where("Visible"))
{
<li>
<a href="@item.Url">@item.Name</a>
@* if the this page has any children, where the property umbracoNaviHide is not True *@
@if (item.Children.Where("Visible").Any())
{
@* Call our helper to display the children *@
@childPages(item.Children)
}
</li>
}
</ul>
}
}
@@ -1,33 +1,33 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to display a series of images from a media folder.
How it works:
- Confirm the macro parameter has been passed in with a value
- Loop through all the media Id's passed in (might be a single item, might be many)
- Display any individual images, as well as any folders of images
Macro Parameters To Create, for this macro to work:
Alias:mediaId Name:Select folder with images Type:Single Media Picker
*@
@{ var mediaId = Model.MacroParameters["mediaId"]; }
@if (mediaId != null)
{
@* Get all the media item associated with the id passed in *@
var media = Umbraco.Media(mediaId);
var selection = media.Children("Image");
if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li>
<img src="@item.umbracoFile" alt="@item.Name" />
</li>
}
</ul>
}
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
Macro to display a series of images from a media folder.
How it works:
- Confirm the macro parameter has been passed in with a value
- Loop through all the media Id's passed in (might be a single item, might be many)
- Display any individual images, as well as any folders of images
Macro Parameters To Create, for this macro to work:
Alias:mediaId Name:Select folder with images Type:Single Media Picker
*@
@{ var mediaId = Model.MacroParameters["mediaId"]; }
@if (mediaId != null)
{
@* Get all the media item associated with the id passed in *@
var media = Umbraco.Media(mediaId);
var selection = media.Children("Image");
if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li>
<img src="@item.umbracoFile" alt="@item.Name" />
</li>
}
</ul>
}
}
@@ -1,41 +1,41 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Models
@using Umbraco.Web.Controllers
@{
var loginModel = new LoginModel();
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
}
@* NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed *@
@Html.RenderJsHere()
@using (Html.BeginUmbracoForm<UmbLoginController>("HandleLogin"))
{
<fieldset>
<legend>Login</legend>
@Html.ValidationSummary("loginModel", true)
@Html.LabelFor(m => loginModel.Username)
@Html.TextBoxFor(m => loginModel.Username)
@Html.ValidationMessageFor(m => loginModel.Username)
<br />
@Html.LabelFor(m => loginModel.Password)
@Html.PasswordFor(m => loginModel.Password)
@Html.ValidationMessageFor(m => loginModel.Password)
<br />
<button>Login</button>
</fieldset>
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Models
@using Umbraco.Web.Controllers
@{
var loginModel = new LoginModel();
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
}
@* NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed *@
@Html.RenderJsHere()
@using (Html.BeginUmbracoForm<UmbLoginController>("HandleLogin"))
{
<fieldset>
<legend>Login</legend>
@Html.ValidationSummary("loginModel", true)
@Html.LabelFor(m => loginModel.Username)
@Html.TextBoxFor(m => loginModel.Username)
@Html.ValidationMessageFor(m => loginModel.Username)
<br />
@Html.LabelFor(m => loginModel.Password)
@Html.PasswordFor(m => loginModel.Password)
@Html.ValidationMessageFor(m => loginModel.Password)
<br />
<button>Login</button>
</fieldset>
}
@@ -1,43 +1,43 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Models
@using Umbraco.Web.Controllers
@{
var loginStatusModel = Members.GetCurrentLoginStatus();
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
var logoutModel = new PostRedirectModel();
@*
Here you can specify a redirect URL for after logging out, by default umbraco will simply
redirect to the current page. Example to redirect to the home page:
logoutModel.RedirectUrl = "/";
*@
}
@* NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed *@
@Html.RenderJsHere()
@if (loginStatusModel.IsLoggedIn)
{
<p>You are currently logged in as @loginStatusModel.Name</p>
using (Html.BeginUmbracoForm<UmbLoginStatusController>("HandleLogout"))
{
<fieldset>
<legend>Logout</legend>
<button>Logout</button>
</fieldset>
@Html.HiddenFor(m => logoutModel.RedirectUrl)
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Models
@using Umbraco.Web.Controllers
@{
var loginStatusModel = Members.GetCurrentLoginStatus();
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
var logoutModel = new PostRedirectModel();
@*
Here you can specify a redirect URL for after logging out, by default umbraco will simply
redirect to the current page. Example to redirect to the home page:
logoutModel.RedirectUrl = "/";
*@
}
@* NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed *@
@Html.RenderJsHere()
@if (loginStatusModel.IsLoggedIn)
{
<p>You are currently logged in as @loginStatusModel.Name</p>
using (Html.BeginUmbracoForm<UmbLoginStatusController>("HandleLogout"))
{
<fieldset>
<legend>Logout</legend>
<button>Logout</button>
</fieldset>
@Html.HiddenFor(m => logoutModel.RedirectUrl)
}
}
@@ -1,21 +1,21 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet lists the items from a Multinode tree picker, using the pickers default settings.
Content Values stored as xml.
To get it working with any site's data structure, set the selection equal to the property which has the
multinode treepicker (so: replace "PropertyWithPicker" with the alias of your property).
*@
@{ var selection = CurrentPage.PropertyWithPicker.Split(','); }
<ul>
@foreach (var id in selection)
{
var item = Umbraco.Content(id);
<li>
<a href="@item.Url">@item.Name</a>
</li>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet lists the items from a Multinode tree picker, using the pickers default settings.
Content Values stored as xml.
To get it working with any site's data structure, set the selection equal to the property which has the
multinode treepicker (so: replace "PropertyWithPicker" with the alias of your property).
*@
@{ var selection = CurrentPage.PropertyWithPicker.Split(','); }
<ul>
@foreach (var id in selection)
{
var item = Umbraco.Content(id);
<li>
<a href="@item.Url">@item.Name</a>
</li>
}
</ul>
@@ -1,18 +1,18 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet displays a list of links of the pages immediately under the top-most page in the content tree.
This is the home page for a standard website.
It also highlights the current active page/section in the navigation with the css class "current".
*@
@{ var selection = CurrentPage.Site().Children.Where("Visible"); }
<ul>
@foreach (var item in selection)
{
<li class="@(item.IsAncestorOrSelf(CurrentPage) ? "current" : null)">
<a href="@item.Url">@item.Name</a>
</li>
}
</ul>
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet displays a list of links of the pages immediately under the top-most page in the content tree.
This is the home page for a standard website.
It also highlights the current active page/section in the navigation with the css class "current".
*@
@{ var selection = CurrentPage.Site().Children.Where("Visible"); }
<ul>
@foreach (var item in selection)
{
<li class="@(item.IsAncestorOrSelf(CurrentPage) ? "current" : null)">
<a href="@item.Url">@item.Name</a>
</li>
}
</ul>
@@ -1,104 +1,104 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Controllers
@{
@*
You can specify a custom member type alias in the constructor, the default is 'Member'
for example, to use 'Custom Member' you'd use this syntax:
var registerModel = Members.CreateRegistrationModel("Custom Member");
*@
var registerModel = Members.CreateRegistrationModel();
@*
Configurable here:
registerModel.RedirectUrl - Optional. What path to redirect to if registration is successful.
By default the member will be redirected to the current umbraco page
unless this is specified.
registerModel.UsernameIsEmail - the default is true
if you want the username to be different from the email
address, set this to true and add a new Username field in
the form below
@Html.LabelFor(m => registerModel.Username)
@Html.TextBoxFor(m => registerModel.Username)
@Html.ValidationMessageFor(m => registerModel.Username)
*@
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
var success = TempData["FormSuccess"] != null;
}
@*NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed*@
@Html.RenderJsHere()
@if (success)
{
@* This message will show if RedirectOnSucces is set to false (default) *@
<p>Registration succeeeded.</p>
}
else
{
using (Html.BeginUmbracoForm<UmbRegisterController>("HandleRegisterMember"))
{
<fieldset>
<legend>Register Member</legend>
@Html.ValidationSummary("registerModel", true)
@Html.LabelFor(m => registerModel.Name)
@Html.TextBoxFor(m => registerModel.Name)
@Html.ValidationMessageFor(m => registerModel.Name)
<br />
@Html.LabelFor(m => registerModel.Email)
@Html.TextBoxFor(m => registerModel.Email)
@Html.ValidationMessageFor(m => registerModel.Email)
<br />
@Html.LabelFor(m => registerModel.Password)
@Html.PasswordFor(m => registerModel.Password)
@Html.ValidationMessageFor(m => registerModel.Password)
<br />
@if (registerModel.MemberProperties != null)
{
@*
It will only displays properties marked as "Member can edit" on the "Info" tab of the Member Type.
*@
for (var i = 0; i < registerModel.MemberProperties.Count; i++)
{
@Html.LabelFor(m => registerModel.MemberProperties[i].Value, registerModel.MemberProperties[i].Name)
@*
By default this will render a textbox but if you want to change the editor template for this property you can
easily change it. For example, if you wanted to render a custom editor for this field called "MyEditor" you would
create a file at ~/Views/Shared/EditorTemplates/MyEditor.cshtml", then you will change the next line of code to
render your specific editor template like:
@Html.EditorFor(m => profileModel.MemberProperties[i].Value, "MyEditor")
*@
@Html.EditorFor(m => registerModel.MemberProperties[i].Value)
@Html.HiddenFor(m => registerModel.MemberProperties[i].Alias)
<br />
}
}
@Html.HiddenFor(m => registerModel.MemberTypeAlias)
@Html.HiddenFor(m => registerModel.RedirectUrl)
@Html.HiddenFor(m => registerModel.UsernameIsEmail)
<button>Register</button>
</fieldset>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@using System.Web.Mvc.Html
@using ClientDependency.Core.Mvc
@using Umbraco.Web
@using Umbraco.Web.Controllers
@{
@*
You can specify a custom member type alias in the constructor, the default is 'Member'
for example, to use 'Custom Member' you'd use this syntax:
var registerModel = Members.CreateRegistrationModel("Custom Member");
*@
var registerModel = Members.CreateRegistrationModel();
@*
Configurable here:
registerModel.RedirectUrl - Optional. What path to redirect to if registration is successful.
By default the member will be redirected to the current umbraco page
unless this is specified.
registerModel.UsernameIsEmail - the default is true
if you want the username to be different from the email
address, set this to true and add a new Username field in
the form below
@Html.LabelFor(m => registerModel.Username)
@Html.TextBoxFor(m => registerModel.Username)
@Html.ValidationMessageFor(m => registerModel.Username)
*@
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
Html.RequiresJs("/umbraco_client/ui/jquery.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js");
Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js");
var success = TempData["FormSuccess"] != null;
}
@*NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed*@
@Html.RenderJsHere()
@if (success)
{
@* This message will show if RedirectOnSucces is set to false (default) *@
<p>Registration succeeeded.</p>
}
else
{
using (Html.BeginUmbracoForm<UmbRegisterController>("HandleRegisterMember"))
{
<fieldset>
<legend>Register Member</legend>
@Html.ValidationSummary("registerModel", true)
@Html.LabelFor(m => registerModel.Name)
@Html.TextBoxFor(m => registerModel.Name)
@Html.ValidationMessageFor(m => registerModel.Name)
<br />
@Html.LabelFor(m => registerModel.Email)
@Html.TextBoxFor(m => registerModel.Email)
@Html.ValidationMessageFor(m => registerModel.Email)
<br />
@Html.LabelFor(m => registerModel.Password)
@Html.PasswordFor(m => registerModel.Password)
@Html.ValidationMessageFor(m => registerModel.Password)
<br />
@if (registerModel.MemberProperties != null)
{
@*
It will only displays properties marked as "Member can edit" on the "Info" tab of the Member Type.
*@
for (var i = 0; i < registerModel.MemberProperties.Count; i++)
{
@Html.LabelFor(m => registerModel.MemberProperties[i].Value, registerModel.MemberProperties[i].Name)
@*
By default this will render a textbox but if you want to change the editor template for this property you can
easily change it. For example, if you wanted to render a custom editor for this field called "MyEditor" you would
create a file at ~/Views/Shared/EditorTemplates/MyEditor.cshtml", then you will change the next line of code to
render your specific editor template like:
@Html.EditorFor(m => profileModel.MemberProperties[i].Value, "MyEditor")
*@
@Html.EditorFor(m => registerModel.MemberProperties[i].Value)
@Html.HiddenFor(m => registerModel.MemberProperties[i].Alias)
<br />
}
}
@Html.HiddenFor(m => registerModel.MemberTypeAlias)
@Html.HiddenFor(m => registerModel.RedirectUrl)
@Html.HiddenFor(m => registerModel.UsernameIsEmail)
<button>Register</button>
</fieldset>
}
}
@@ -1,42 +1,42 @@
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet makes a list of links of all visible pages of the site, as nested unordered html lists.
How it works:
- It uses a custom Razor helper called Traverse() to select and display the markup and links.
*@
@{ var selection = CurrentPage.Site(); }
<div class="sitemap">
@* Render the sitemap by passing the root node to the traverse helper, below *@
@Traverse(selection)
</div>
@* Helper method to travers through all descendants *@
@helper Traverse(dynamic node)
{
@* Update the level to reflect how deep you want the sitemap to go *@
var maxLevelForSitemap = 4;
@* Select visible children *@
var selection = node.Children.Where("Visible").Where("Level <= " + maxLevelForSitemap);
@* If any items are returned, render a list *@
if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li class="level-@item.Level">
<a href="@item.Url">@item.Name</a>
@* Run the traverse helper again for any child pages *@
@Traverse(item)
</li>
}
</ul>
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
This snippet makes a list of links of all visible pages of the site, as nested unordered html lists.
How it works:
- It uses a custom Razor helper called Traverse() to select and display the markup and links.
*@
@{ var selection = CurrentPage.Site(); }
<div class="sitemap">
@* Render the sitemap by passing the root node to the traverse helper, below *@
@Traverse(selection)
</div>
@* Helper method to travers through all descendants *@
@helper Traverse(dynamic node)
{
@* Update the level to reflect how deep you want the sitemap to go *@
var maxLevelForSitemap = 4;
@* Select visible children *@
var selection = node.Children.Where("Visible").Where("Level <= " + maxLevelForSitemap);
@* If any items are returned, render a list *@
if (selection.Any())
{
<ul>
@foreach (var item in selection)
{
<li class="level-@item.Level">
<a href="@item.Url">@item.Name</a>
@* Run the traverse helper again for any child pages *@
@Traverse(item)
</li>
}
</ul>
}
}
+98 -98
View File
@@ -1,98 +1,98 @@
@using System.Collections
@using System.Net.Http
@using System.Web.Mvc.Html
@using Umbraco.Core
@using ClientDependency.Core
@using ClientDependency.Core.Mvc
@using Microsoft.Owin.Security
@using Newtonsoft.Json
@using Newtonsoft.Json.Linq
@using Umbraco.Core.IO
@using Umbraco.Web
@using Umbraco.Web.Editors
@using umbraco
@inherits System.Web.Mvc.WebViewPage
@{
var isDebug = false;
if (Request.RawUrl.IndexOf('?') >= 0)
{
var parsed = HttpUtility.ParseQueryString(Request.RawUrl.Split('?')[1]);
var attempt = parsed["umbDebug"].TryConvertTo<bool>();
if (attempt && attempt.Result)
{
isDebug = true;
}
}
Html
.RequiresCss("assets/css/umbraco.css", "Umbraco")
.RequiresCss("tree/treeicons.css", "UmbracoClient")
.RequiresCss("lib/bootstrap-social/bootstrap-social.css", "Umbraco")
.RequiresCss("lib/font-awesome/css/font-awesome.min.css", "Umbraco");
}
<!DOCTYPE html>
<html lang="en">
<head>
<base href="@GlobalSettings.Path.EnsureEndsWith('/')" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="robots" content="noindex, nofollow">
<title ng-bind="$root.locationTitle">Umbraco</title>
@Html.RenderCssHere(
new BasicPath("Umbraco", IOHelper.ResolveUrl(SystemDirectories.Umbraco)),
new BasicPath("UmbracoClient", IOHelper.ResolveUrl(SystemDirectories.UmbracoClient)))
</head>
<noscript><h5><strong>&nbsp; JavaScript is disabled. Please enable to continue!</strong></h5></noscript>
<body ng-class="{touch:touchDevice,emptySection:emptySection}" ng-controller="Umbraco.MainController" id="umbracoMainPageBody">
<div ng-hide="!authenticated" ng-cloak id="mainwrapper" class="clearfix" ng-click="closeDialogs($event)">
<umb-navigation></umb-navigation>
<section id="contentwrapper">
<div id="contentcolumn" ng-view>
</div>
</section>
<umb-notifications></umb-notifications>
</div>
@Html.BareMinimumServerVariablesScript(Url, Url.Action("ExternalLogin", "BackOffice", new { area = ViewBag.UmbracoPath }))
<script type="text/javascript">
document.angularReady = function(app) {
@Html.AngularValueExternalLoginInfoScript((IEnumerable<string>)ViewBag.ExternalSignInError)
@Html.AngularValueResetPasswordCodeInfoScript(ViewData["PasswordResetCode"])
}
</script>
@*And finally we can load in our angular app*@
<script type="text/javascript" src="lib/rgrove-lazyload/lazyload.js"></script>
<script type="text/javascript" src="@Url.GetUrlWithCacheBust("Application", "BackOffice")"></script>
@if (isDebug)
{
@Html.RenderProfiler()
}
<umb-overlay
ng-if="ysodOverlay.show"
model="ysodOverlay"
position="right"
view="ysodOverlay.view">
</umb-overlay>
</body>
</html>
@using System.Collections
@using System.Net.Http
@using System.Web.Mvc.Html
@using Umbraco.Core
@using ClientDependency.Core
@using ClientDependency.Core.Mvc
@using Microsoft.Owin.Security
@using Newtonsoft.Json
@using Newtonsoft.Json.Linq
@using Umbraco.Core.IO
@using Umbraco.Web
@using Umbraco.Web.Editors
@using umbraco
@inherits System.Web.Mvc.WebViewPage
@{
var isDebug = false;
if (Request.RawUrl.IndexOf('?') >= 0)
{
var parsed = HttpUtility.ParseQueryString(Request.RawUrl.Split('?')[1]);
var attempt = parsed["umbDebug"].TryConvertTo<bool>();
if (attempt && attempt.Result)
{
isDebug = true;
}
}
Html
.RequiresCss("assets/css/umbraco.css", "Umbraco")
.RequiresCss("tree/treeicons.css", "UmbracoClient")
.RequiresCss("lib/bootstrap-social/bootstrap-social.css", "Umbraco")
.RequiresCss("lib/font-awesome/css/font-awesome.min.css", "Umbraco");
}
<!DOCTYPE html>
<html lang="en">
<head>
<base href="@GlobalSettings.Path.EnsureEndsWith('/')" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="robots" content="noindex, nofollow">
<title ng-bind="$root.locationTitle">Umbraco</title>
@Html.RenderCssHere(
new BasicPath("Umbraco", IOHelper.ResolveUrl(SystemDirectories.Umbraco)),
new BasicPath("UmbracoClient", IOHelper.ResolveUrl(SystemDirectories.UmbracoClient)))
</head>
<noscript><h5><strong>&nbsp; JavaScript is disabled. Please enable to continue!</strong></h5></noscript>
<body ng-class="{touch:touchDevice,emptySection:emptySection}" ng-controller="Umbraco.MainController" id="umbracoMainPageBody">
<div ng-hide="!authenticated" ng-cloak id="mainwrapper" class="clearfix" ng-click="closeDialogs($event)">
<umb-navigation></umb-navigation>
<section id="contentwrapper">
<div id="contentcolumn" ng-view>
</div>
</section>
<umb-notifications></umb-notifications>
</div>
@Html.BareMinimumServerVariablesScript(Url, Url.Action("ExternalLogin", "BackOffice", new { area = ViewBag.UmbracoPath }))
<script type="text/javascript">
document.angularReady = function(app) {
@Html.AngularValueExternalLoginInfoScript((IEnumerable<string>)ViewBag.ExternalSignInError)
@Html.AngularValueResetPasswordCodeInfoScript(ViewData["PasswordResetCode"])
}
</script>
@*And finally we can load in our angular app*@
<script type="text/javascript" src="lib/rgrove-lazyload/lazyload.js"></script>
<script type="text/javascript" src="@Url.GetUrlWithCacheBust("Application", "BackOffice")"></script>
@if (isDebug)
{
@Html.RenderProfiler()
}
<umb-overlay
ng-if="ysodOverlay.show"
model="ysodOverlay"
position="right"
view="ysodOverlay.view">
</umb-overlay>
</body>
</html>
@@ -1,51 +1,51 @@
<div ng-controller="Umbraco.DashboardController">
<umb-load-indicator ng-if="page.loading"></umb-load-indicator>
<form
ng-show="!page.loading"
class="umb-dashboard"
val-form-manager>
<umb-editor-view
footer="false"
umb-tabs>
<umb-editor-header
name="dashboard.name"
name-locked="page.nameLocked"
tabs="dashboard.tabs"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-container>
<umb-tabs-content view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in dashboard.tabs" rel="{{tab.id}}">
<div ng-repeat="property in tab.properties" ng-switch on="property.serverSide">
<div class="span12 clearfix" ng-switch-when="false">
<h3 ng-show="property.caption">{{property.caption}}</h3>
<div ng-include="property.path"></div>
</div>
<div class="span12 umb-dashboard-control clearfix" ng-switch-when="true">
<h3 ng-show="property.caption">{{property.caption}}</h3>
<iframe ng-src="dashboard/usercontrolproxy.aspx?ctrl={{ property.path}}"></iframe>
</div>
</div>
</umb-tab>
</umb-tabs-content>
</umb-editor-container>
</umb-editor-view>
</form>
</div>
<div ng-controller="Umbraco.DashboardController">
<umb-load-indicator ng-if="page.loading"></umb-load-indicator>
<form
ng-show="!page.loading"
class="umb-dashboard"
val-form-manager>
<umb-editor-view
footer="false"
umb-tabs>
<umb-editor-header
name="dashboard.name"
name-locked="page.nameLocked"
tabs="dashboard.tabs"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-container>
<umb-tabs-content view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in dashboard.tabs" rel="{{tab.id}}">
<div ng-repeat="property in tab.properties" ng-switch on="property.serverSide">
<div class="span12 clearfix" ng-switch-when="false">
<h3 ng-show="property.caption">{{property.caption}}</h3>
<div ng-include="property.path"></div>
</div>
<div class="span12 umb-dashboard-control clearfix" ng-switch-when="true">
<h3 ng-show="property.caption">{{property.caption}}</h3>
<iframe ng-src="dashboard/usercontrolproxy.aspx?ctrl={{ property.path}}"></iframe>
</div>
</div>
</umb-tab>
</umb-tabs-content>
</umb-editor-container>
</umb-editor-view>
</form>
</div>
@@ -1,50 +1,50 @@
<form novalidate name="insertMacroForm" ng-submit="submitForm()" ng-controller="Umbraco.Dialogs.InsertMacroController" val-form-manager>
<div class="umb-panel">
<div class="umb-panel-footer">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href class="btn btn-link" ng-click="close()">
<localize key="cancel" />
</a>
<button type="submit" class="btn btn-primary">
<localize key="buttons_select"/>
</button>
</div>
</div>
<div class="umb-panel-body no-header umb-scrollable" auto-scale="90" ng-switch="wizardStep">
<umb-control-group label="Choose a macro" ng-switch-when="macroSelect">
<select class="umb-editor" ng-change="submitForm()"
name="selectedMacro"
ng-model="$parent.$parent.selectedMacro"
ng-options="m as m.name for m in macros"
required>
<option value=""><localize key="choose" />...</option>
</select>
<span class="help-inline" val-msg-for="selectedMacro" val-toggle-msg="required"><localize key="required" /></span>
</umb-control-group>
<div class="umb-pane" ng-switch-when="paramSelect">
<h5>{{$parent.$parent.selectedMacro.name}}</h5>
<ul class="unstyled">
<li ng-repeat="param in $parent.macroParams">
<ng-form name="parameterForm">
<umb-control-group label="{{param.name}}">
<umb-editor model="param"></umb-editor>
</umb-control-group>
</ng-form>
</li>
</ul>
</div>
</div>
</div>
</form>
<form novalidate name="insertMacroForm" ng-submit="submitForm()" ng-controller="Umbraco.Dialogs.InsertMacroController" val-form-manager>
<div class="umb-panel">
<div class="umb-panel-footer">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href class="btn btn-link" ng-click="close()">
<localize key="cancel" />
</a>
<button type="submit" class="btn btn-primary">
<localize key="buttons_select"/>
</button>
</div>
</div>
<div class="umb-panel-body no-header umb-scrollable" auto-scale="90" ng-switch="wizardStep">
<umb-control-group label="Choose a macro" ng-switch-when="macroSelect">
<select class="umb-editor" ng-change="submitForm()"
name="selectedMacro"
ng-model="$parent.$parent.selectedMacro"
ng-options="m as m.name for m in macros"
required>
<option value=""><localize key="choose" />...</option>
</select>
<span class="help-inline" val-msg-for="selectedMacro" val-toggle-msg="required"><localize key="required" /></span>
</umb-control-group>
<div class="umb-pane" ng-switch-when="paramSelect">
<h5>{{$parent.$parent.selectedMacro.name}}</h5>
<ul class="unstyled">
<li ng-repeat="param in $parent.macroParams">
<ng-form name="parameterForm">
<umb-control-group label="{{param.name}}">
<umb-editor model="param"></umb-editor>
</umb-control-group>
</ng-form>
</li>
</ul>
</div>
</div>
</div>
</form>
@@ -1,14 +1,14 @@
<div class="umb-dialog" ng-controller="Umbraco.Dialogs.LegacyDeleteController">
<div class="umb-dialog-body" >
<div class="umb-pane">
<p>
Are you sure you want to delete <strong>{{currentNode.name}}</strong> ?
</p>
<umb-confirm on-confirm="performDelete" on-cancel="cancel">
</umb-confirm>
</div>
</div>
</div>
<div class="umb-dialog" ng-controller="Umbraco.Dialogs.LegacyDeleteController">
<div class="umb-dialog-body" >
<div class="umb-pane">
<p>
Are you sure you want to delete <strong>{{currentNode.name}}</strong> ?
</p>
<umb-confirm on-confirm="performDelete" on-cancel="cancel">
</umb-confirm>
</div>
</div>
</div>
@@ -1,76 +1,76 @@
<div class="umb-panel" ng-controller="Umbraco.Dialogs.LinkPickerController">
<div class="umb-panel-body no-header with-footer compact">
<umb-pane>
<umb-control-group label="@content_urls">
<input type="text"
localize="placeholder"
placeholder="@general_url"
class="umb-editor umb-textstring"
ng-model="target.url"
ng-disabled="target.id"
/>
</umb-control-group>
<umb-control-group label="@content_nodeName">
<input type="text"
localize="placeholder"
placeholder="@placeholders_entername"
class="umb-editor umb-textstring"
ng-model="target.name" />
</umb-control-group>
<umb-control-group label="@content_target">
<select class="umb-editor umb-dropdown" ng-model="target.target">
<option value=""></option>
<option value="_blank">Opens the linked document in a new window or tab</option>
<option value="_top">Opens the linked document in the full body of the window</option>
<option value="_parent">Opens the linked document in the parent frame</option>
</select>
</umb-control-group>
</umb-pane>
<umb-tree-search-box hide-search-callback="hideSearch"
search-callback="onSearchResults"
search-from-id="{{searchInfo.searchFromId}}"
search-from-name="{{searchInfo.searchFromName}}"
show-search="{{searchInfo.showSearch}}"
section="{{section}}">
</umb-tree-search-box>
<br/>
<umb-tree-search-results ng-if="searchInfo.showSearch"
results="searchInfo.results"
select-result-callback="selectResult">
</umb-tree-search-results>
<div ng-hide="searchInfo.showSearch">
<umb-tree section="content"
hideheader="true"
hideoptions="true"
eventhandler="dialogTreeEventHandler"
isdialog="true"
enablecheckboxes="true">
</umb-tree>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<a href ng-click="switchToMediaPicker()" class="btn">Link to file</a>
<button
class="btn btn-primary"
ng-click="submit(target)">
<localize key="buttons_select">Select</localize>
</button>
</div>
</div>
</div>
<div class="umb-panel" ng-controller="Umbraco.Dialogs.LinkPickerController">
<div class="umb-panel-body no-header with-footer compact">
<umb-pane>
<umb-control-group label="@content_urls">
<input type="text"
localize="placeholder"
placeholder="@general_url"
class="umb-editor umb-textstring"
ng-model="target.url"
ng-disabled="target.id"
/>
</umb-control-group>
<umb-control-group label="@content_nodeName">
<input type="text"
localize="placeholder"
placeholder="@placeholders_entername"
class="umb-editor umb-textstring"
ng-model="target.name" />
</umb-control-group>
<umb-control-group label="@content_target">
<select class="umb-editor umb-dropdown" ng-model="target.target">
<option value=""></option>
<option value="_blank">Opens the linked document in a new window or tab</option>
<option value="_top">Opens the linked document in the full body of the window</option>
<option value="_parent">Opens the linked document in the parent frame</option>
</select>
</umb-control-group>
</umb-pane>
<umb-tree-search-box hide-search-callback="hideSearch"
search-callback="onSearchResults"
search-from-id="{{searchInfo.searchFromId}}"
search-from-name="{{searchInfo.searchFromName}}"
show-search="{{searchInfo.showSearch}}"
section="{{section}}">
</umb-tree-search-box>
<br/>
<umb-tree-search-results ng-if="searchInfo.showSearch"
results="searchInfo.results"
select-result-callback="selectResult">
</umb-tree-search-results>
<div ng-hide="searchInfo.showSearch">
<umb-tree section="content"
hideheader="true"
hideoptions="true"
eventhandler="dialogTreeEventHandler"
isdialog="true"
enablecheckboxes="true">
</umb-tree>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<a href ng-click="switchToMediaPicker()" class="btn">Link to file</a>
<button
class="btn btn-primary"
ng-click="submit(target)">
<localize key="buttons_select">Select</localize>
</button>
</div>
</div>
</div>
</div>
@@ -1,135 +1,135 @@
<div ng-controller="Umbraco.Dialogs.LoginController">
<div id="login" class="umb-modalcolumn umb-dialog" ng-class="{'show-validation': loginForm.$invalid}" ng-cloak konami-code="activateKonamiMode()">
<div class="form">
<h1>{{greeting}}</h1>
<div ng-show="view == 'login'">
<p>
<span ng-show="dialogData.isTimedOut"><localize key="login_timeout">Log in below</localize>.</span>
<localize key="login_instruction">Log in below</localize>
</p>
<div class="external-logins" ng-if="externalLoginProviders.length > 0">
<div class="text-error" ng-repeat="error in externalLoginInfo.errors">
<span>{{error}}</span>
</div>
<form method="POST" name="externalLoginForm" action="{{externalLoginFormAction}}">
<div ng-repeat="login in externalLoginProviders">
<button type="submit" class="btn btn-block btn-social"
ng-class="login.properties.SocialStyle"
id="{{login.authType}}" name="provider" value="{{login.authType}}"
title="Log in using your {{login.caption}} account">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
<localize key="login_signInWith">Sign in with</localize> {{login.caption}}
</button>
</div>
</form>
<div id="hrOr">
<hr />
<div><localize key="general_or">or</localize></div>
</div>
</div>
<form method="POST" name="loginForm" ng-submit="loginSubmit(login, password)">
<div class="control-group" ng-class="{error: loginForm.username.$invalid}">
<input type="text" ng-model="login" name="username" class="input-xlarge" localize="placeholder" placeholder="@placeholders_username" />
</div>
<div class="control-group" ng-class="{error: loginForm.password.$invalid}">
<input type="password" ng-model="password" name="password" class="input-xlarge" localize="placeholder" placeholder="@placeholders_password" autocomplete="off" />
</div>
<div class="control-group" ng-show="loginForm.$invalid">
<div class="text-error">{{errorMsg}}</div>
</div>
<button type="submit" class="btn" val-trigger-change="#login .form input"><localize key="general_login">Login</localize></button>
<div class="switch-view" ng-show="allowPasswordReset">
<a class="muted" href="#" prevent-default ng-click="showRequestPasswordReset()"><localize key="login_forgottenPassword">Forgotten password?</localize></a>
</div>
</form>
</div>
<div ng-show="view == 'request-password-reset'">
<p>
<localize key="login_forgottenPasswordInstruction">An email will be sent to the address specified with a link to reset your password</localize>
</p>
<form method="POST" name="requestPasswordResetForm" ng-submit="requestPasswordResetSubmit(email)">
<div class="control-group" ng-class="{error: requestPasswordResetForm.email.$invalid}">
<input type="text" ng-model="email" name="email" class="input-xlarge" localize="placeholder" placeholder="@placeholders_email" />
</div>
<div class="control-group" ng-show="requestPasswordResetForm.$invalid">
<div class="text-error">{{errorMsg}}</div>
</div>
<div class="control-group" ng-show="showEmailResetConfirmation">
<div class="text-info">
<localize key="login_requestPasswordResetConfirmation">An email with password reset instructions will be sent to the specified address if it matched our records</localize>
</div>
</div>
<button type="submit" class="btn" val-trigger-change="#login .form input"><localize key="general_submit">Submit</localize></button>
<div class="switch-view">
<a class="muted" href="#" prevent-default ng-click="showLogin()"><localize key="login_returnToLogin">Return to login form</localize></a>
</div>
</form>
</div>
<div ng-show="view == 'set-password'">
<p ng-hide="resetComplete">
<localize key="login_setPasswordInstruction">Please provide a new password.</localize>
</p>
<form method="POST" name="setPasswordForm" ng-submit="setPasswordSubmit(password, confirmPassword)">
<div ng-hide="resetComplete" class="control-group" ng-class="{error: setPasswordForm.password.$invalid}">
<input type="password" ng-model="password" name="password" class="input-xlarge" localize="placeholder" placeholder="@placeholders_password" />
</div>
<div ng-hide="resetComplete" class="control-group" ng-class="{error: setPasswordForm.confirmPassword.$invalid}">
<input type="password" ng-model="confirmPassword" name="confirmPassword" class="input-xlarge" localize="placeholder" placeholder="@placeholders_confirmPassword" />
</div>
<div ng-hide="resetComplete" class="control-group" ng-show="setPasswordForm.$invalid">
<div class="text-error">{{errorMsg}}</div>
</div>
<div class="control-group" ng-show="showSetPasswordConfirmation">
<div class="text-info">
<localize key="login_setPasswordConfirmation">Your new password has been set and you may now use it to log in.</localize>
</div>
</div>
<button ng-hide="resetComplete" type="submit" class="btn" val-trigger-change="#login .form input"><localize key="general_submit">Submit</localize></button>
<div class="switch-view">
<a class="muted" href="#" prevent-default ng-click="showLogin()"><localize key="login_returnToLogin">Return to login form</localize></a>
</div>
</form>
</div>
<div ng-show="view == 'password-reset-code-expired'">
<div class="text-error" ng-repeat="error in resetPasswordCodeInfo.errors">
<span>{{error}}</span>
</div>
<div class="switch-view">
<a class="muted" href="#" prevent-default ng-click="showLogin()"><localize key="login_returnToLogin">Return to login form</localize></a>
</div>
</div>
</div>
</div>
<div ng-controller="Umbraco.Dialogs.LoginController">
<div id="login" class="umb-modalcolumn umb-dialog" ng-class="{'show-validation': loginForm.$invalid}" ng-cloak konami-code="activateKonamiMode()">
<div class="form">
<h1>{{greeting}}</h1>
<div ng-show="view == 'login'">
<p>
<span ng-show="dialogData.isTimedOut"><localize key="login_timeout">Log in below</localize>.</span>
<localize key="login_instruction">Log in below</localize>
</p>
<div class="external-logins" ng-if="externalLoginProviders.length > 0">
<div class="text-error" ng-repeat="error in externalLoginInfo.errors">
<span>{{error}}</span>
</div>
<form method="POST" name="externalLoginForm" action="{{externalLoginFormAction}}">
<div ng-repeat="login in externalLoginProviders">
<button type="submit" class="btn btn-block btn-social"
ng-class="login.properties.SocialStyle"
id="{{login.authType}}" name="provider" value="{{login.authType}}"
title="Log in using your {{login.caption}} account">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
<localize key="login_signInWith">Sign in with</localize> {{login.caption}}
</button>
</div>
</form>
<div id="hrOr">
<hr />
<div><localize key="general_or">or</localize></div>
</div>
</div>
<form method="POST" name="loginForm" ng-submit="loginSubmit(login, password)">
<div class="control-group" ng-class="{error: loginForm.username.$invalid}">
<input type="text" ng-model="login" name="username" class="input-xlarge" localize="placeholder" placeholder="@placeholders_username" />
</div>
<div class="control-group" ng-class="{error: loginForm.password.$invalid}">
<input type="password" ng-model="password" name="password" class="input-xlarge" localize="placeholder" placeholder="@placeholders_password" autocomplete="off" />
</div>
<div class="control-group" ng-show="loginForm.$invalid">
<div class="text-error">{{errorMsg}}</div>
</div>
<button type="submit" class="btn" val-trigger-change="#login .form input"><localize key="general_login">Login</localize></button>
<div class="switch-view" ng-show="allowPasswordReset">
<a class="muted" href="#" prevent-default ng-click="showRequestPasswordReset()"><localize key="login_forgottenPassword">Forgotten password?</localize></a>
</div>
</form>
</div>
<div ng-show="view == 'request-password-reset'">
<p>
<localize key="login_forgottenPasswordInstruction">An email will be sent to the address specified with a link to reset your password</localize>
</p>
<form method="POST" name="requestPasswordResetForm" ng-submit="requestPasswordResetSubmit(email)">
<div class="control-group" ng-class="{error: requestPasswordResetForm.email.$invalid}">
<input type="text" ng-model="email" name="email" class="input-xlarge" localize="placeholder" placeholder="@placeholders_email" />
</div>
<div class="control-group" ng-show="requestPasswordResetForm.$invalid">
<div class="text-error">{{errorMsg}}</div>
</div>
<div class="control-group" ng-show="showEmailResetConfirmation">
<div class="text-info">
<localize key="login_requestPasswordResetConfirmation">An email with password reset instructions will be sent to the specified address if it matched our records</localize>
</div>
</div>
<button type="submit" class="btn" val-trigger-change="#login .form input"><localize key="general_submit">Submit</localize></button>
<div class="switch-view">
<a class="muted" href="#" prevent-default ng-click="showLogin()"><localize key="login_returnToLogin">Return to login form</localize></a>
</div>
</form>
</div>
<div ng-show="view == 'set-password'">
<p ng-hide="resetComplete">
<localize key="login_setPasswordInstruction">Please provide a new password.</localize>
</p>
<form method="POST" name="setPasswordForm" ng-submit="setPasswordSubmit(password, confirmPassword)">
<div ng-hide="resetComplete" class="control-group" ng-class="{error: setPasswordForm.password.$invalid}">
<input type="password" ng-model="password" name="password" class="input-xlarge" localize="placeholder" placeholder="@placeholders_password" />
</div>
<div ng-hide="resetComplete" class="control-group" ng-class="{error: setPasswordForm.confirmPassword.$invalid}">
<input type="password" ng-model="confirmPassword" name="confirmPassword" class="input-xlarge" localize="placeholder" placeholder="@placeholders_confirmPassword" />
</div>
<div ng-hide="resetComplete" class="control-group" ng-show="setPasswordForm.$invalid">
<div class="text-error">{{errorMsg}}</div>
</div>
<div class="control-group" ng-show="showSetPasswordConfirmation">
<div class="text-info">
<localize key="login_setPasswordConfirmation">Your new password has been set and you may now use it to log in.</localize>
</div>
</div>
<button ng-hide="resetComplete" type="submit" class="btn" val-trigger-change="#login .form input"><localize key="general_submit">Submit</localize></button>
<div class="switch-view">
<a class="muted" href="#" prevent-default ng-click="showLogin()"><localize key="login_returnToLogin">Return to login form</localize></a>
</div>
</form>
</div>
<div ng-show="view == 'password-reset-code-expired'">
<div class="text-error" ng-repeat="error in resetPasswordCodeInfo.errors">
<span>{{error}}</span>
</div>
<div class="switch-view">
<a class="muted" href="#" prevent-default ng-click="showLogin()"><localize key="login_returnToLogin">Return to login form</localize></a>
</div>
</div>
</div>
</div>
</div>
@@ -1,38 +1,38 @@
<div class="umb-panel" ng-controller="Umbraco.Dialogs.MacroPickerController">
<div class="umb-panel-body no-header with-footer umb-scrollable" ng-switch on="dialogMode">
<div class="umb-control-group">
<div ng-switch-when="list" ng-swicth-default class="tab-content form-horizontal umb-el-wrap">
<ul class="nav nav-tabs nav-stacked">
<li ng-repeat="macro in macros">
<a href="#" ng-click="configureMacro(macro)" prevent-default>
{{macro.name}}
</a>
</li>
</ul>
</div>
<div ng-switch-when="configure" class="tab-content form umb-el-wrap">
<h5>{{dialogData.macro.name}}</h5>
<div class="umb-pane" ng-repeat="model in dialogData.macro.properties">
<label class="control-label" ng-hide="model.hideLabel" for="{{model.alias}}">{{model.label}}
</label>
<div class="controls"
ng-include="model.editorView">
</div>
</div>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar">
<input type="button" ng-click="submit(dialogData)" class="btn btn-primary" value="select" />
</div>
</div>
</div>
<div class="umb-panel" ng-controller="Umbraco.Dialogs.MacroPickerController">
<div class="umb-panel-body no-header with-footer umb-scrollable" ng-switch on="dialogMode">
<div class="umb-control-group">
<div ng-switch-when="list" ng-swicth-default class="tab-content form-horizontal umb-el-wrap">
<ul class="nav nav-tabs nav-stacked">
<li ng-repeat="macro in macros">
<a href="#" ng-click="configureMacro(macro)" prevent-default>
{{macro.name}}
</a>
</li>
</ul>
</div>
<div ng-switch-when="configure" class="tab-content form umb-el-wrap">
<h5>{{dialogData.macro.name}}</h5>
<div class="umb-pane" ng-repeat="model in dialogData.macro.properties">
<label class="control-label" ng-hide="model.hideLabel" for="{{model.alias}}">{{model.label}}
</label>
<div class="controls"
ng-include="model.editorView">
</div>
</div>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar">
<input type="button" ng-click="submit(dialogData)" class="btn btn-primary" value="select" />
</div>
</div>
</div>
</div>
@@ -1,159 +1,161 @@
<form ng-controller="Umbraco.Dialogs.MediaPickerController" id="fileupload"
method="POST"
enctype="multipart/form-data"
umb-image-upload="options">
<div class="umb-panel umb-dialogs-mediapicker" ng-if="target">
<div class="umb-panel-body no-header with-footer compact">
<umb-pane>
<umb-control-group ng-if="target.url">
<div class="clearfix">
<umb-image-gravity src="target.url"
center="target.focalPoint" />
</div>
<div ng-if="cropSize">
<h5>Preview</h5>
<umb-image-thumbnail center="target.focalPoint"
src="target.url"
height="{{cropSize.height}}"
width="{{cropSize.width}}"
max-size="400" />
</div>
</umb-control-group>
<umb-control-group label="@general_url">
<input type="text"
localize="placeholder"
placeholder="@general_url"
class="umb-editor umb-textstring"
ng-model="target.url"
ng-disabled="target.id" />
</umb-control-group>
<umb-control-group label="@content_altTextOptional">
<input type="text"
class="umb-editor umb-textstring"
ng-model="target.altText" />
</umb-control-group>
</umb-pane>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="exitDetails()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button class="btn btn-primary"
ng-click="submit(target)">
<localize key="general_insert">Insert</localize>
</button>
</div>
</div>
</div>
</div>
<div class="umb-panel umb-dialogs-mediapicker browser"
on-drag-leave="dragLeave()"
on-drag-end="dragLeave()"
on-drag-enter="dragEnter()"
ng-hide="target">
<div class="umb-panel-header">
<div class="umb-el-wrap umb-panel-buttons umb-mediapicker-upload">
<div class="form-search">
<i class="icon-search"></i>
<input type="text"
ng-model="searchTerm"
class="umb-search-field search-query"
placeholder="Filter...">
</div>
<div class="upload-button">
<button class="btn fileinput-button" ng-click="upload()" ng-class="{disabled: disabled}">
<i class="icon-page-up"></i>
<localize key="general_upload">Upload</localize>
</button>
</div>
</div>
<div class="row">
<ul class="breadcrumb span12">
<li ng-hide="startNodeId != -1">
<a href ng-click="gotoFolder()" prevent-default>Media</a> /
</li>
<li ng-repeat="item in path">
<a href ng-click="gotoFolder(item)" prevent-default>{{item.name}}</a> /
</li>
<li>
<a href ng-hide="showFolderInput" ng-click="showFolderInput = true">
<i class="icon icon-add small"></i>
</a>
<input type="text"
class="input-foldername input-mini inline"
ng-show="showFolderInput"
ng-model="newFolderName"
ng-keydown="submitFolder($event)"
on-blur="showFolderInput = false"
focus-when="{{showFolderInput}}">
</li>
</ul>
</div>
</div>
<div class="umb-panel-body with-footer">
<umb-file-dropzone
hide-dropzone="{{!activeDrag && images.length > 0}}"
parent-id="{{currentFolder.id}}"
files-uploaded="onUploadComplete"
files-queued="onFilesQueue">
</umb-file-dropzone>
<umb-photo-folder
min-height="105"
min-width="150"
max-height="250"
ideal-items-per-row="3"
on-click="clickHandler"
ng-model="images"
images-only="{{onlyImages}}"
filter-by="searchTerm" />
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button class="btn btn-primary"
ng-show="multiPicker"
ng-click="submit(dialogData.selection)">
<localize key="buttons_select">Select</localize>({{dialogData.selection.length}})
</button>
</div>
</div>
</div>
</div>
</div>
<form ng-controller="Umbraco.Dialogs.MediaPickerController" id="fileupload"
method="POST"
enctype="multipart/form-data"
umb-image-upload="options">
<div class="umb-panel umb-dialogs-mediapicker" ng-if="target">
<div class="umb-panel-body no-header with-footer compact">
<umb-pane>
<umb-control-group ng-if="target.url">
<div class="clearfix">
<umb-image-gravity src="target.url"
center="target.focalPoint" />
</div>
<div ng-if="cropSize">
<h5>Preview</h5>
<umb-image-thumbnail center="target.focalPoint"
src="target.url"
height="{{cropSize.height}}"
width="{{cropSize.width}}"
max-size="400" />
</div>
</umb-control-group>
<umb-control-group label="@general_url">
<input type="text"
localize="placeholder"
placeholder="@general_url"
class="umb-editor umb-textstring"
ng-model="target.url"
ng-disabled="target.id" />
</umb-control-group>
<umb-control-group label="@content_altTextOptional">
<input type="text"
class="umb-editor umb-textstring"
ng-model="target.altText" />
</umb-control-group>
</umb-pane>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="exitDetails()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button class="btn btn-primary"
ng-click="submit(target)">
<localize key="general_insert">Insert</localize>
</button>
</div>
</div>
</div>
</div>
<div class="umb-panel umb-dialogs-mediapicker browser"
on-drag-leave="dragLeave()"
on-drag-end="dragLeave()"
on-drag-enter="dragEnter()"
ng-hide="target">
<div class="umb-panel-header">
<div class="umb-el-wrap umb-panel-buttons umb-mediapicker-upload">
<div class="form-search">
<i class="icon-search"></i>
<input type="text"
ng-model="searchTerm"
class="umb-search-field search-query"
placeholder="Filter...">
</div>
<div class="upload-button">
<button class="btn fileinput-button" ng-click="upload()" ng-class="{disabled: disabled}">
<i class="icon-page-up"></i>
<localize key="general_upload">Upload</localize>
</button>
</div>
</div>
<div class="row">
<ul class="breadcrumb span12">
<li ng-hide="startNodeId != -1">
<a href ng-click="gotoFolder()" prevent-default>Media</a> /
</li>
<li ng-repeat="item in path">
<a href ng-click="gotoFolder(item)" prevent-default>{{item.name}}</a> /
</li>
<li>
<a href ng-hide="showFolderInput" ng-click="showFolderInput = true">
<i class="icon icon-add small"></i>
</a>
<input type="text"
class="input-foldername input-mini inline"
ng-show="showFolderInput"
ng-model="newFolderName"
ng-keydown="submitFolder($event)"
on-blur="showFolderInput = false"
focus-when="{{showFolderInput}}">
</li>
</ul>
</div>
</div>
<div class="umb-panel-body with-footer">
<umb-file-dropzone
ng-if="acceptedMediatypes.length > 0"
accepted-mediatypes="acceptedMediatypes"
hide-dropzone="{{!activeDrag && images.length > 0}}"
parent-id="{{currentFolder.id}}"
files-uploaded="onUploadComplete"
files-queued="onFilesQueue">
</umb-file-dropzone>
<umb-photo-folder
min-height="105"
min-width="150"
max-height="250"
ideal-items-per-row="3"
on-click="clickHandler"
ng-model="images"
images-only="{{onlyImages}}"
filter-by="searchTerm" />
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button class="btn btn-primary"
ng-show="multiPicker"
ng-click="submit(dialogData.selection)">
<localize key="buttons_select">Select</localize>({{dialogData.selection.length}})
</button>
</div>
</div>
</div>
</div>
</div>
@@ -1,34 +1,34 @@
<div class="umb-panel" ng-controller="Umbraco.Dialogs.MemberGroupPickerController">
<div class="umb-panel-body with-footer no-header">
<div>
<umb-tree section="member"
treealias="memberGroups"
hideheader="true"
hideoptions="true"
isdialog="true"
eventhandler="dialogTreeEventHandler"
enablecheckboxes="{{multiPicker}}">
</umb-tree>
</div>
</div>
<div class="umb-panel-footer" >
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button class="btn btn-primary"
ng-click="submit(dialogData.selection)">
<localize key="buttons_select">Select</localize>
({{dialogData.selection.length}})
</button>
</div>
</div>
</div>
<div class="umb-panel" ng-controller="Umbraco.Dialogs.MemberGroupPickerController">
<div class="umb-panel-body with-footer no-header">
<div>
<umb-tree section="member"
treealias="memberGroups"
hideheader="true"
hideoptions="true"
isdialog="true"
eventhandler="dialogTreeEventHandler"
enablecheckboxes="{{multiPicker}}">
</umb-tree>
</div>
</div>
<div class="umb-panel-footer" >
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button class="btn btn-primary"
ng-click="submit(dialogData.selection)">
<localize key="buttons_select">Select</localize>
({{dialogData.selection.length}})
</button>
</div>
</div>
</div>
</div>
@@ -1,36 +1,36 @@
<form ng-controller="Umbraco.Dialogs.RteEmbedController" val-form-manager>
<div class="umb-panel">
<div class="umb-panel-body no-header with-footer">
<umb-pane>
<umb-control-group label="Url">
<input id="url" class="umb-editor input-block-level" type="text" ng-model="form.url" ng-keyup="$event.keyCode == 13 ? showPreview() : null" required />
<input type="button" ng-click="showPreview()" class="btn" value="Retrieve" />
</umb-control-group>
<div ng-show="form.supportsDimensions">
<umb-control-group label="Size">
<input type="text" ng-model="form.width" on-blur="changeSize('width')" style="width:50px"/> x <input type="text" ng-model="form.height" on-blur="changeSize('height')" style="width:50px"/>
<label for="constrain" style="display:inline">Constrain:</label>
<input id="constrain" type="checkbox" ng-model="form.constrain" style="margin-bottom: 10px;"/>
</umb-control-group>
</div>
<div>
<p ng-bind="form.info"></p>
<div ng-bind-html-unsafe="form.preview"></div>
</div>
</umb-pane>
</div>
<div class="umb-panel-footer">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href class="btn btn-link" ng-click="close()">
<localize key="cancel" />
</a>
<input type="button" ng-click="insert()" class="btn btn-primary" value="Ok" ng-disabled="!form.success" />
</div>
</div>
</div>
</form>
<form ng-controller="Umbraco.Dialogs.RteEmbedController" val-form-manager>
<div class="umb-panel">
<div class="umb-panel-body no-header with-footer">
<umb-pane>
<umb-control-group label="Url">
<input id="url" class="umb-editor input-block-level" type="text" ng-model="form.url" ng-keyup="$event.keyCode == 13 ? showPreview() : null" required />
<input type="button" ng-click="showPreview()" class="btn" value="Retrieve" />
</umb-control-group>
<div ng-show="form.supportsDimensions">
<umb-control-group label="Size">
<input type="text" ng-model="form.width" on-blur="changeSize('width')" style="width:50px"/> x <input type="text" ng-model="form.height" on-blur="changeSize('height')" style="width:50px"/>
<label for="constrain" style="display:inline">Constrain:</label>
<input id="constrain" type="checkbox" ng-model="form.constrain" style="margin-bottom: 10px;"/>
</umb-control-group>
</div>
<div>
<p ng-bind="form.info"></p>
<div ng-bind-html-unsafe="form.preview"></div>
</div>
</umb-pane>
</div>
<div class="umb-panel-footer">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href class="btn btn-link" ng-click="close()">
<localize key="cancel" />
</a>
<input type="button" ng-click="insert()" class="btn btn-primary" value="Ok" ng-disabled="!form.success" />
</div>
</div>
</div>
</form>
@@ -1,60 +1,60 @@
<div class="umb-panel" ng-controller="Umbraco.Dialogs.TreePickerController">
<div class="umb-panel-header">
<div class="umb-el-wrap umb-panel-buttons">
<umb-tree-search-box hide-search-callback="hideSearch"
search-callback="onSearchResults"
search-from-id="{{searchInfo.searchFromId}}"
search-from-name="{{searchInfo.searchFromName}}"
show-search="{{searchInfo.showSearch}}"
section="{{section}}">
</umb-tree-search-box>
</div>
</div>
<div class="umb-panel-body with-footer">
<div class="tab-content umb-control-group">
<umb-tree-search-results
ng-if="searchInfo.showSearch"
results="searchInfo.results"
select-result-callback="selectResult">
</umb-tree-search-results>
<div ng-hide="searchInfo.showSearch" ng-animate="'tree-fade-out'">
<umb-tree section="{{section}}"
treealias="{{treeAlias}}"
hideheader="{{hideHeader}}"
hideoptions="true"
isdialog="true"
customtreeparams="{{customTreeParams}}"
eventhandler="dialogTreeEventHandler"
enablelistviewsearch="true"
enablecheckboxes="{{multiPicker}}">
</umb-tree>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button
class="btn btn-primary"
ng-if="dialogOptions.multiPicker"
ng-click="multiSubmit(dialogData.selection)">
<localize key="buttons_select">Select</localize>
({{dialogData.selection.length}})
</button>
</div>
</div>
</div>
</div>
<div class="umb-panel" ng-controller="Umbraco.Dialogs.TreePickerController">
<div class="umb-panel-header">
<div class="umb-el-wrap umb-panel-buttons">
<umb-tree-search-box hide-search-callback="hideSearch"
search-callback="onSearchResults"
search-from-id="{{searchInfo.searchFromId}}"
search-from-name="{{searchInfo.searchFromName}}"
show-search="{{searchInfo.showSearch}}"
section="{{section}}">
</umb-tree-search-box>
</div>
</div>
<div class="umb-panel-body with-footer">
<div class="tab-content umb-control-group">
<umb-tree-search-results
ng-if="searchInfo.showSearch"
results="searchInfo.results"
select-result-callback="selectResult">
</umb-tree-search-results>
<div ng-hide="searchInfo.showSearch" ng-animate="'tree-fade-out'">
<umb-tree section="{{section}}"
treealias="{{treeAlias}}"
hideheader="{{hideHeader}}"
hideoptions="true"
isdialog="true"
customtreeparams="{{customTreeParams}}"
eventhandler="dialogTreeEventHandler"
enablelistviewsearch="true"
enablecheckboxes="{{multiPicker}}">
</umb-tree>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_cancel">Cancel</localize>
</a>
<button
class="btn btn-primary"
ng-if="dialogOptions.multiPicker"
ng-click="multiSubmit(dialogData.selection)">
<localize key="buttons_select">Select</localize>
({{dialogData.selection.length}})
</button>
</div>
</div>
</div>
</div>
@@ -1,119 +1,119 @@
<div class="umb-panel umb-user-panel" ng-controller="Umbraco.Dialogs.UserController">
<div class="umb-panel-header">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar">
<button ng-click="logout()" hotkey="ctrl+shift+l" class="btn btn-warning">
<localize key="general_logout">Log out</localize>
</button>
</div>
</div>
<h1 class="headline">{{user.name}}</h1>
<small class="umb-version">Umbraco version {{version}}</small>
<p class="muted">
<small>
<localize key="user_sessionExpires" />: {{remainingAuthSeconds | timespan}}
</small>
</p>
</div>
<div class="umb-panel-body umb-scrollable">
<div class="tab-content umb-control-group">
<div class="umb-pane" ng-if="!showPasswordFields">
<h5><localize key="user_yourProfile" /></h5>
<a href="#/users/framed/%252Fumbraco%252Fusers%252Fedituser.aspx%253Fid%253D{{user.id}}"
class="btn btn-primary"
ng-click="close()"
ng-if="canEditProfile">
<localize key="general_edit">Edit</localize>
</a>
<umb-button
type="button"
action="togglePasswordFields()"
label="Change password"
button-style="success">
</umb-button>
</div>
<div class="umb-pane external-logins" ng-if="externalLoginProviders.length > 0 && !showPasswordFields">
<h5>External login providers</h5>
<div ng-repeat="login in externalLoginProviders">
<form ng-if="login.linkedProviderKey == undefined" method="POST" name="externalLoginForm"
action="{{externalLinkLoginFormAction}}" id="oauthloginform" name="oauthloginform">
<input type="hidden" name="provider" value="{{login.authType}}" />
<button class="btn btn-block btn-social"
ng-class="login.properties.SocialStyle"
id="{{login.authType}}"
onclick="document.forms.oauthloginform.submit();">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
Link your {{login.caption}} account
</button>
</form>
<button ng-if="login.linkedProviderKey != undefined"
ng-click="unlink($event, login.authType, login.linkedProviderKey)"
class="btn btn-block btn-social"
ng-class="login.properties.SocialStyle"
id="{{login.authType}}"
name="provider"
value="{{login.authType}}">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
Un-link your {{login.caption}} account
</button>
</div>
</div>
<div class="umb-pane" ng-if="!showPasswordFields">
<h5><localize key="user_yourHistory" /></h5>
<ul class="umb-tree">
<li ng-repeat="item in history | orderBy:'time':true">
<a ng-href="{{item.link}}" ng-click="gotoHistory(item.link)" prevent-default>
<i class="{{item.icon}}"></i> {{item.name}}
</a>
</li>
</ul>
</div>
<div class="umb-pane" ng-show="showPasswordFields">
<h5>Change password</h5>
<form
name="passwordForm"
class="block-form"
ng-submit="changePassword()"
novalidate
val-form-manager>
<umb-editor model="changePasswordModel"></umb-editor>
<umb-button
type="button"
action="togglePasswordFields()"
label="Back"
button-style="Cancel">
</umb-button>
<umb-button
type="submit"
label="Change password"
state="changePasswordButtonState"
button-style="success">
</umb-button>
</form>
</div>
</div>
</div>
<div class="umb-panel umb-user-panel" ng-controller="Umbraco.Dialogs.UserController">
<div class="umb-panel-header">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar">
<button ng-click="logout()" hotkey="ctrl+shift+l" class="btn btn-warning">
<localize key="general_logout">Log out</localize>
</button>
</div>
</div>
<h1 class="headline">{{user.name}}</h1>
<small class="umb-version">Umbraco version {{version}}</small>
<p class="muted">
<small>
<localize key="user_sessionExpires" />: {{remainingAuthSeconds | timespan}}
</small>
</p>
</div>
<div class="umb-panel-body umb-scrollable">
<div class="tab-content umb-control-group">
<div class="umb-pane" ng-if="!showPasswordFields">
<h5><localize key="user_yourProfile" /></h5>
<a href="#/users/framed/%252Fumbraco%252Fusers%252Fedituser.aspx%253Fid%253D{{user.id}}"
class="btn btn-primary"
ng-click="close()"
ng-if="canEditProfile">
<localize key="general_edit">Edit</localize>
</a>
<umb-button
type="button"
action="togglePasswordFields()"
label="Change password"
button-style="success">
</umb-button>
</div>
<div class="umb-pane external-logins" ng-if="externalLoginProviders.length > 0 && !showPasswordFields">
<h5>External login providers</h5>
<div ng-repeat="login in externalLoginProviders">
<form ng-if="login.linkedProviderKey == undefined" method="POST" name="externalLoginForm"
action="{{externalLinkLoginFormAction}}" id="oauthloginform" name="oauthloginform">
<input type="hidden" name="provider" value="{{login.authType}}" />
<button class="btn btn-block btn-social"
ng-class="login.properties.SocialStyle"
id="{{login.authType}}"
onclick="document.forms.oauthloginform.submit();">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
Link your {{login.caption}} account
</button>
</form>
<button ng-if="login.linkedProviderKey != undefined"
ng-click="unlink($event, login.authType, login.linkedProviderKey)"
class="btn btn-block btn-social"
ng-class="login.properties.SocialStyle"
id="{{login.authType}}"
name="provider"
value="{{login.authType}}">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
Un-link your {{login.caption}} account
</button>
</div>
</div>
<div class="umb-pane" ng-if="!showPasswordFields">
<h5><localize key="user_yourHistory" /></h5>
<ul class="umb-tree">
<li ng-repeat="item in history | orderBy:'time':true">
<a ng-href="{{item.link}}" ng-click="gotoHistory(item.link)" prevent-default>
<i class="{{item.icon}}"></i> {{item.name}}
</a>
</li>
</ul>
</div>
<div class="umb-pane" ng-show="showPasswordFields">
<h5>Change password</h5>
<form
name="passwordForm"
class="block-form"
ng-submit="changePassword()"
novalidate
val-form-manager>
<umb-editor model="changePasswordModel"></umb-editor>
<umb-button
type="button"
action="togglePasswordFields()"
label="Back"
button-style="Cancel">
</umb-button>
<umb-button
type="submit"
label="Change password"
state="changePasswordButtonState"
button-style="success">
</umb-button>
</form>
</div>
</div>
</div>
@@ -1,3 +1,3 @@
<div ng-controller="Umbraco.LegacyController" id="legacyContainer" style="width: 100%; height: 100%;overflow: hidden;">
<iframe name="right" id="right" ng-src="{{legacyPath}}"></iframe>
<div ng-controller="Umbraco.LegacyController" id="legacyContainer" style="width: 100%; height: 100%;overflow: hidden;">
<iframe name="right" id="right" ng-src="{{legacyPath}}"></iframe>
</div>
@@ -1,3 +1,3 @@
<div ng-controller="Umbraco.LoginController">
<div ng-controller="Umbraco.LoginController">
</div>
@@ -1,27 +1,27 @@
<form ng-controller="Umbraco.Overlays.EmbedOverlay as vm">
<umb-control-group label="Url">
<input id="url" class="umb-editor input-block-level" type="text" style="margin-bottom: 10px;" ng-model="model.embed.url" ng-keyup="$event.keyCode == 13 ? vm.showPreview() : null" required />
<input type="button" ng-click="vm.showPreview()" class="btn" value="Retrieve" />
</umb-control-group>
<umb-control-group>
<p ng-bind="model.embed.info"></p>
<div ng-bind-html-unsafe="model.embed.preview"></div>
</umb-control-group>
<div ng-show="model.embed.supportsDimensions">
<umb-control-group label="Width">
<input type="text" ng-model="model.embed.width" on-blur="vm.changeSize('width')" />
</umb-control-group>
<umb-control-group label="Height">
<input type="text" ng-model="model.embed.height" on-blur="vm.changeSize('height')" />
</umb-control-group>
<umb-control-group label="Constrain:">
<input id="constrain" type="checkbox" ng-model="model.embed.constrain" />
</umb-control-group>
</div>
</form>
<form ng-controller="Umbraco.Overlays.EmbedOverlay as vm">
<umb-control-group label="Url">
<input id="url" class="umb-editor input-block-level" type="text" style="margin-bottom: 10px;" ng-model="model.embed.url" ng-keyup="$event.keyCode == 13 ? vm.showPreview() : null" required />
<input type="button" ng-click="vm.showPreview()" class="btn" value="Retrieve" />
</umb-control-group>
<umb-control-group>
<p ng-bind="model.embed.info"></p>
<div ng-bind-html-unsafe="model.embed.preview"></div>
</umb-control-group>
<div ng-show="model.embed.supportsDimensions">
<umb-control-group label="Width">
<input type="text" ng-model="model.embed.width" on-blur="vm.changeSize('width')" />
</umb-control-group>
<umb-control-group label="Height">
<input type="text" ng-model="model.embed.height" on-blur="vm.changeSize('height')" />
</umb-control-group>
<umb-control-group label="Constrain:">
<input id="constrain" type="checkbox" ng-model="model.embed.constrain" />
</umb-control-group>
</div>
</form>
@@ -18,18 +18,9 @@
</umb-control-group>
<umb-control-group label="@content_target">
<select class="umb-editor umb-dropdown" ng-model="model.target.target">
<option value=""></option>
<option value="_blank">
<localize key="defaultdialogs_openInNewWindow">Opens the linked document in a new window or tab</localize>
</option>
<option value="_top">
<localize key="defaultdialogs_openInFullBody">Opens the linked document in the full body of the window</localize>
</option>
<option value="_parent">
<localize key="defaultdialogs_openInParentFrame">Opens the linked document in the parent frame</localize>
</option>
</select>
<label class="checkbox no-indent">
<input type="checkbox" ng-model="model.target.target" ng-true-value="_blank" ng-false-value="" /> <localize key="defaultdialogs_openInNewWindow">Opens the linked document in a new window or tab</localize>
</label>
</umb-control-group>
<div class="umb-control-group">
@@ -1,42 +1,42 @@
<div ng-controller="Umbraco.Overlays.MacroPickerController">
<div ng-switch="wizardStep">
<umb-control-group label="Choose a macro" ng-switch-when="macroSelect">
<select class="umb-editor" ng-change="changeMacro()"
name="selectedMacro"
ng-model="model.selectedMacro"
ng-options="m as m.name for m in macros"
required>
<option value=""><localize key="choose" />...</option>
</select>
<span class="help-inline" val-msg-for="selectedMacro" val-toggle-msg="required"><localize key="required" /></span>
</umb-control-group>
<div ng-switch-when="paramSelect">
<h5>{{model.selectedMacro.name}}</h5>
<ul class="unstyled">
<li ng-repeat="param in model.macroParams">
<ng-form name="parameterForm">
<umb-control-group label="{{param.name}}">
<umb-editor model="param"></umb-editor>
</umb-control-group>
</ng-form>
</li>
</ul>
<umb-empty-state
ng-if="noMacroParams"
position="center">
<localize key="defaultdialogs_noMacroParams">There are no parameters for this macro</localize>
</umb-empty-state>
</div>
</div>
</div>
<div ng-controller="Umbraco.Overlays.MacroPickerController">
<div ng-switch="wizardStep">
<umb-control-group label="Choose a macro" ng-switch-when="macroSelect">
<select class="umb-editor" ng-change="changeMacro()"
name="selectedMacro"
ng-model="model.selectedMacro"
ng-options="m as m.name for m in macros"
required>
<option value=""><localize key="choose" />...</option>
</select>
<span class="help-inline" val-msg-for="selectedMacro" val-toggle-msg="required"><localize key="required" /></span>
</umb-control-group>
<div ng-switch-when="paramSelect">
<h5>{{model.selectedMacro.name}}</h5>
<ul class="unstyled">
<li ng-repeat="param in model.macroParams">
<ng-form name="parameterForm">
<umb-control-group label="{{param.name}}">
<umb-editor model="param"></umb-editor>
</umb-control-group>
</ng-form>
</li>
</ul>
<umb-empty-state
ng-if="noMacroParams"
position="center">
<localize key="defaultdialogs_noMacroParams">There are no parameters for this macro</localize>
</umb-empty-state>
</div>
</div>
</div>
@@ -1,140 +1,142 @@
<form ng-controller="Umbraco.Overlays.MediaPickerController" id="fileupload"
method="POST"
enctype="multipart/form-data"
umb-image-upload="options">
<div
on-drag-leave="dragLeave()"
on-drag-end="dragLeave()"
on-drag-enter="dragEnter()">
<div class="umb-control-group umb-mediapicker-upload">
<div class="form-search">
<i class="icon-search"></i>
<input
class="umb-search-field search-query"
ng-model="searchTerm"
localize="placeholder"
placeholder="@placeholders_filter"
type="text">
</div>
<div class="upload-button">
<umb-button
type="button"
key="general_upload"
label="Upload"
action="upload()"
disabled="disabled">
</umb-button>
</div>
</div>
<div class="row umb-control-group">
<ul class="umb-breadcrumbs">
<li ng-hide="startNodeId != -1" class="umb-breadcrumbs__ancestor">
<a href ng-click="gotoFolder()" prevent-default>Media</a>
<span class="umb-breadcrumbs__seperator">&#47;</span>
</li>
<li ng-repeat="item in path" class="umb-breadcrumbs__ancestor">
<a href ng-click="gotoFolder(item)" prevent-default>{{item.name}}</a>
<span class="umb-breadcrumbs__seperator">&#47;</span>
</li>
<li class="umb-breadcrumbs__ancestor">
<a href ng-hide="showFolderInput" ng-click="showFolderInput = true">
<i class="icon icon-add small"></i>
</a>
<input
type="text"
class="input-foldername input-mini inline"
ng-show="showFolderInput"
ng-model="newFolderName"
ng-keydown="enterSubmitFolder($event)"
on-blur="submitFolder()"
focus-when="{{showFolderInput}}" />
</li>
</ul>
</div>
<umb-file-dropzone
parent-id="{{currentFolder.id}}"
files-uploaded="onUploadComplete"
files-queued="onFilesQueue"
accept="{{acceptedFileTypes}}"
max-file-size="{{maxFileSize}}"
hide-dropzone="{{!activeDrag && images.length > 0 }}"
compact="{{ images.length > 0 }}">
</umb-file-dropzone>
<umb-media-grid
items="images"
filter-by="searchTerm"
on-click="clickHandler"
on-click-name="clickItemName"
item-max-width="150"
item-max-height="150"
item-min-width="100"
item-min-height="100"
only-images={{onlyImages}}>
</umb-media-grid>
</div>
<umb-overlay
ng-if="mediaPickerDetailsOverlay.show"
model="mediaPickerDetailsOverlay"
position="right">
<div class="umb-control-group">
<div ng-if="target.url">
<umb-image-gravity
src="target.url"
center="target.focalPoint">
</umb-image-gravity>
</div>
<div ng-if="cropSize">
<h5>
<localize key="general_preview">Preview</localize>
</h5>
<umb-image-thumbnail
center="target.focalPoint"
src="target.url"
height="{{cropSize.height}}"
width="{{cropSize.width}}"
max-size="400">
</umb-image-thumbnail>
</div>
</div>
<div class="umb-control-group">
<label><localize key="@general_url"></localize></label>
<input
type="text"
localize="placeholder"
placeholder="@general_url"
class="umb-editor umb-textstring"
ng-model="target.url"
ng-disabled="target.id" />
</div>
<div class="umb-control-group">
<label><localize key="@content_altTextOptional"></localize></label>
<input type="text" class="umb-editor umb-textstring" ng-model="target.altText" />
</div>
</umb-overlay>
</form>
<form ng-controller="Umbraco.Overlays.MediaPickerController" id="fileupload"
method="POST"
enctype="multipart/form-data"
umb-image-upload="options">
<div
on-drag-leave="dragLeave()"
on-drag-end="dragLeave()"
on-drag-enter="dragEnter()">
<div class="umb-control-group umb-mediapicker-upload">
<div class="form-search">
<i class="icon-search"></i>
<input
class="umb-search-field search-query"
ng-model="searchTerm"
localize="placeholder"
placeholder="@placeholders_filter"
type="text">
</div>
<div class="upload-button">
<umb-button
type="button"
key="general_upload"
label="Upload"
action="upload()"
disabled="disabled">
</umb-button>
</div>
</div>
<div class="row umb-control-group">
<ul class="umb-breadcrumbs">
<li ng-hide="startNodeId != -1" class="umb-breadcrumbs__ancestor">
<a href ng-click="gotoFolder()" prevent-default>Media</a>
<span class="umb-breadcrumbs__seperator">&#47;</span>
</li>
<li ng-repeat="item in path" class="umb-breadcrumbs__ancestor">
<a href ng-click="gotoFolder(item)" prevent-default>{{item.name}}</a>
<span class="umb-breadcrumbs__seperator">&#47;</span>
</li>
<li class="umb-breadcrumbs__ancestor">
<a href ng-hide="showFolderInput" ng-click="showFolderInput = true">
<i class="icon icon-add small"></i>
</a>
<input
type="text"
class="input-foldername input-mini inline"
ng-show="showFolderInput"
ng-model="newFolderName"
ng-keydown="enterSubmitFolder($event)"
on-blur="submitFolder()"
focus-when="{{showFolderInput}}" />
</li>
</ul>
</div>
<umb-file-dropzone
ng-if="acceptedMediatypes.length > 0"
accepted-mediatypes="acceptedMediatypes"
parent-id="{{currentFolder.id}}"
files-uploaded="onUploadComplete"
files-queued="onFilesQueue"
accept="{{acceptedFileTypes}}"
max-file-size="{{maxFileSize}}"
hide-dropzone="{{!activeDrag && images.length > 0 }}"
compact="{{ images.length > 0 }}">
</umb-file-dropzone>
<umb-media-grid
items="images"
filter-by="searchTerm"
on-click="clickHandler"
on-click-name="clickItemName"
item-max-width="150"
item-max-height="150"
item-min-width="100"
item-min-height="100"
only-images={{onlyImages}}>
</umb-media-grid>
</div>
<umb-overlay
ng-if="mediaPickerDetailsOverlay.show"
model="mediaPickerDetailsOverlay"
position="right">
<div class="umb-control-group">
<div ng-if="target.url">
<umb-image-gravity
src="target.url"
center="target.focalPoint">
</umb-image-gravity>
</div>
<div ng-if="cropSize">
<h5>
<localize key="general_preview">Preview</localize>
</h5>
<umb-image-thumbnail
center="target.focalPoint"
src="target.url"
height="{{cropSize.height}}"
width="{{cropSize.width}}"
max-size="400">
</umb-image-thumbnail>
</div>
</div>
<div class="umb-control-group">
<label><localize key="@general_url"></localize></label>
<input
type="text"
localize="placeholder"
placeholder="@general_url"
class="umb-editor umb-textstring"
ng-model="target.url"
ng-disabled="target.id" />
</div>
<div class="umb-control-group">
<label><localize key="@content_altTextOptional"></localize></label>
<input type="text" class="umb-editor umb-textstring" ng-model="target.altText" />
</div>
</umb-overlay>
</form>
@@ -0,0 +1,15 @@
<div ng-controller="Umbraco.Overlays.MediaTypePickerController">
<ul class="umb-card-grid">
<li
ng-repeat="mediatype in model.acceptedMediatypes | orderBy:'name'"
ng-click="select(mediatype)"
class="-three-in-row">
<a class="umb-card-grid-item" href="" title="{{mediatype.name}}">
<i class="{{ mediatype.icon }}"></i>
{{ mediatype.name }}
</a>
</li>
</ul>
</div>
@@ -1,12 +1,12 @@
<div ng-controller="Umbraco.Overlays.MemberGroupPickerController">
<umb-tree section="member"
treealias="memberGroups"
hideheader="true"
hideoptions="true"
isdialog="true"
eventhandler="dialogTreeEventHandler"
enablecheckboxes="{{model.multiPicker}}">
</umb-tree>
</div>
<div ng-controller="Umbraco.Overlays.MemberGroupPickerController">
<umb-tree section="member"
treealias="memberGroups"
hideheader="true"
hideoptions="true"
isdialog="true"
eventhandler="dialogTreeEventHandler"
enablecheckboxes="{{model.multiPicker}}">
</umb-tree>
</div>
@@ -1,34 +1,34 @@
<div ng-controller="Umbraco.Overlays.TreePickerController">
<div class="umb-control-group">
<umb-tree-search-box
hide-search-callback="hideSearch"
search-callback="onSearchResults"
search-from-id="{{searchInfo.searchFromId}}"
search-from-name="{{searchInfo.searchFromName}}"
show-search="{{searchInfo.showSearch}}"
section="{{section}}">
</umb-tree-search-box>
</div>
<umb-tree-search-results
ng-if="searchInfo.showSearch"
results="searchInfo.results"
select-result-callback="selectResult">
</umb-tree-search-results>
<div ng-hide="searchInfo.showSearch" ng-animate="'tree-fade-out'">
<umb-tree
section="{{section}}"
treealias="{{treeAlias}}"
hideheader="{{hideHeader}}"
hideoptions="true"
isdialog="true"
customtreeparams="{{customTreeParams}}"
eventhandler="dialogTreeEventHandler"
enablelistviewsearch="true"
enablecheckboxes="{{multiPicker}}">
</umb-tree>
</div>
</div>
<div ng-controller="Umbraco.Overlays.TreePickerController">
<div class="umb-control-group">
<umb-tree-search-box
hide-search-callback="hideSearch"
search-callback="onSearchResults"
search-from-id="{{searchInfo.searchFromId}}"
search-from-name="{{searchInfo.searchFromName}}"
show-search="{{searchInfo.showSearch}}"
section="{{section}}">
</umb-tree-search-box>
</div>
<umb-tree-search-results
ng-if="searchInfo.showSearch"
results="searchInfo.results"
select-result-callback="selectResult">
</umb-tree-search-results>
<div ng-hide="searchInfo.showSearch" ng-animate="'tree-fade-out'">
<umb-tree
section="{{section}}"
treealias="{{treeAlias}}"
hideheader="{{hideHeader}}"
hideoptions="true"
isdialog="true"
customtreeparams="{{customTreeParams}}"
eventhandler="dialogTreeEventHandler"
enablelistviewsearch="true"
enablecheckboxes="{{multiPicker}}">
</umb-tree>
</div>
</div>
@@ -1,27 +1,27 @@
<div ng-controller="Umbraco.Overlays.YsodController">
<h4 class="heading red">{{model.error.errorMsg}}</h4>
<p>{{model.error.data.ExceptionMessage || model.error.data.Message}}</p>
<div class="umb-control-group">
<h5>
<localize key="defaultdialogs_exceptionDetail">Exception Details:</localize>
</h5>
{{model.error.data.ExceptionType}}: {{model.error.data.ExceptionMessage}}
</div>
<div class="umb-control-group">
<h5>
<localize key="defaultdialogs_stacktrace">Stacktrace:</localize>
</h5>
<pre style="white-space: pre-wrap; overflow-x: auto;">{{model.error.data.StackTrace}}</pre>
</div>
<div class="umb-control-group" ng-repeat="e in model.error.data.InnerExceptions">
<h5>
<localize key="defaultdialogs_innerException">Inner Exception:</localize>
</h5>
<div>{{e.ExceptionType}}: {{e.ExceptionMessage}}</div>
<pre style="white-space: pre-wrap; overflow-x: auto;">{{e.StackTrace}}</pre>
</div>
</div>
<div ng-controller="Umbraco.Overlays.YsodController">
<h4 class="heading red">{{model.error.errorMsg}}</h4>
<p>{{model.error.data.ExceptionMessage || model.error.data.Message}}</p>
<div class="umb-control-group">
<h5>
<localize key="defaultdialogs_exceptionDetail">Exception Details:</localize>
</h5>
{{model.error.data.ExceptionType}}: {{model.error.data.ExceptionMessage}}
</div>
<div class="umb-control-group">
<h5>
<localize key="defaultdialogs_stacktrace">Stacktrace:</localize>
</h5>
<pre style="white-space: pre-wrap; overflow-x: auto;">{{model.error.data.StackTrace}}</pre>
</div>
<div class="umb-control-group" ng-repeat="e in model.error.data.InnerExceptions">
<h5>
<localize key="defaultdialogs_innerException">Inner Exception:</localize>
</h5>
<div>{{e.ExceptionType}}: {{e.ExceptionMessage}}</div>
<pre style="white-space: pre-wrap; overflow-x: auto;">{{e.StackTrace}}</pre>
</div>
</div>
@@ -1,17 +1,17 @@
<div>
<div class='umb-modalcolumn-header'>
<h1>{{menuDialogTitle}}</h1>
</div>
<div class='umb-modalcolumn-body'>
<ul class="umb-actions">
<li class="action" ng-class="{sep:action.seperator}" ng-repeat="action in menuActions">
<a prevent-default
ng-click="executeMenuItem(action)">
<i class="icon icon-{{action.cssclass}}"></i>
<span class="menu-label">{{action.name}}</span>
</a>
</li>
</ul>
</div>
<div>
<div class='umb-modalcolumn-header'>
<h1>{{menuDialogTitle}}</h1>
</div>
<div class='umb-modalcolumn-body'>
<ul class="umb-actions">
<li class="action" ng-class="{sep:action.seperator}" ng-repeat="action in menuActions">
<a prevent-default
ng-click="executeMenuItem(action)">
<i class="icon icon-{{action.cssclass}}"></i>
<span class="menu-label">{{action.name}}</span>
</a>
</li>
</ul>
</div>
</div>
@@ -1,104 +1,104 @@
<div id="leftcolumn" ng-controller="Umbraco.NavigationController"
ng-mouseleave="leaveTree($event)" ng-mouseenter="enterTree($event)">
<umb-sections sections="sections" ng-if="authenticated">
</umb-sections>
<!-- navigation container -->
<div id="navigation" ng-show="showNavigation" class="fill umb-modalcolumn" ng-animate="'slide'" nav-resize>
<div ng-swipe-left="nav.hideNavigation()" class="navigation-inner-container span6">
<!-- the search -->
<div ng-controller="Umbraco.SearchController" ng-if="authenticated">
<!-- Search form -->
<div id="search-form">
<div class="umb-modalcolumn-header">
<form class="form-search" novalidate>
<i class="icon-search"></i>
<input type="text"
hotkey="ctrl+space"
id="search-field"
ng-model="searchTerm"
class="umb-search-field search-query search-input"
localize="placeholder"
placeholder="@placeholders_search"
ng-keydown="navigateResults($event)"/>
</form>
</div>
</div>
<!-- Search results -->
<div id="search-results" class="umb-modalcolumn-body" ng-show="showSearchResults">
<ul class="umb-tree">
<li class="root">
<div>
<h5 class="umb-tree-header"><localize key="general_searchResults">Search results</localize></h5>
</div>
<ul class="umb-search-group" ng-repeat="group in groups">
<li ng-repeat="result in group.results" ng-class="{'current':selectedItem == result}">
<div class="umb-search-group-item">
<a class="umb-search-group-item-link" ng-class="{'first':$first}" ng-click="searchHide()" ng-href="#/{{result.editorPath}}">
<div class="umb-search-group-item-name">
<i class="icon umb-tree-icon sprTree {{result.icon}}"></i>
{{result.name}}
</div>
<small class="search-subtitle" ng-show="result.subTitle">
{{result.subTitle}}
</small>
</a>
<a href ng-click="searchShowMenu($event, {node: result})" class="umb-options"><i></i><i></i><i></i></a>
</div>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- the tree -->
<div id="tree" class="umb-modalcolumn-body" ng-if="authenticated">
<umb-tree
cachekey="_"
eventhandler="treeEventHandler"
section="{{currentSection}}" >
</umb-tree>
</div>
</div>
<div class="offset6" id="navOffset" style="z-index: 10">
<!-- The context menu -->
<div id='contextMenu' class="umb-modalcolumn fill shadow" ng-swipe-left="nav.hideMenu()" ng-show="showContextMenu" ng-animate="'slide'">
<umb-context-menu
menu-dialog-title="{{menuDialogTitle}}"
current-section="{{currentSection}}"
current-node="menuNode"
menu-actions="menuActions">
</umb-context-menu>
</div>
<!-- Tree dialogs -->
<div id="dialog" class='umb-modalcolumn fill shadow'
ng-swipe-left="nav.hideDialog()"
ng-show="showContextMenuDialog" ng-animate="'slide'">
<div class='umb-modalcolumn-header'>
<h1>{{menuDialogTitle}}</h1>
</div>
<div class='umb-modalcolumn-body'>
</div>
</div>
</div>
</div>
</div>
<div id="leftcolumn" ng-controller="Umbraco.NavigationController"
ng-mouseleave="leaveTree($event)" ng-mouseenter="enterTree($event)">
<umb-sections sections="sections" ng-if="authenticated">
</umb-sections>
<!-- navigation container -->
<div id="navigation" ng-show="showNavigation" class="fill umb-modalcolumn" ng-animate="'slide'" nav-resize>
<div ng-swipe-left="nav.hideNavigation()" class="navigation-inner-container span6">
<!-- the search -->
<div ng-controller="Umbraco.SearchController" ng-if="authenticated">
<!-- Search form -->
<div id="search-form">
<div class="umb-modalcolumn-header">
<form class="form-search" novalidate>
<i class="icon-search"></i>
<input type="text"
hotkey="ctrl+space"
id="search-field"
ng-model="searchTerm"
class="umb-search-field search-query search-input"
localize="placeholder"
placeholder="@placeholders_search"
ng-keydown="navigateResults($event)"/>
</form>
</div>
</div>
<!-- Search results -->
<div id="search-results" class="umb-modalcolumn-body" ng-show="showSearchResults">
<ul class="umb-tree">
<li class="root">
<div>
<h5 class="umb-tree-header"><localize key="general_searchResults">Search results</localize></h5>
</div>
<ul class="umb-search-group" ng-repeat="group in groups">
<li ng-repeat="result in group.results" ng-class="{'current':selectedItem == result}">
<div class="umb-search-group-item">
<a class="umb-search-group-item-link" ng-class="{'first':$first}" ng-click="searchHide()" ng-href="#/{{result.editorPath}}">
<div class="umb-search-group-item-name">
<i class="icon umb-tree-icon sprTree {{result.icon}}"></i>
{{result.name}}
</div>
<small class="search-subtitle" ng-show="result.subTitle">
{{result.subTitle}}
</small>
</a>
<a href ng-click="searchShowMenu($event, {node: result})" class="umb-options"><i></i><i></i><i></i></a>
</div>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- the tree -->
<div id="tree" class="umb-modalcolumn-body" ng-if="authenticated">
<umb-tree
cachekey="_"
eventhandler="treeEventHandler"
section="{{currentSection}}" >
</umb-tree>
</div>
</div>
<div class="offset6" id="navOffset" style="z-index: 10">
<!-- The context menu -->
<div id='contextMenu' class="umb-modalcolumn fill shadow" ng-swipe-left="nav.hideMenu()" ng-show="showContextMenu" ng-animate="'slide'">
<umb-context-menu
menu-dialog-title="{{menuDialogTitle}}"
current-section="{{currentSection}}"
current-node="menuNode"
menu-actions="menuActions">
</umb-context-menu>
</div>
<!-- Tree dialogs -->
<div id="dialog" class='umb-modalcolumn fill shadow'
ng-swipe-left="nav.hideDialog()"
ng-show="showContextMenuDialog" ng-animate="'slide'">
<div class='umb-modalcolumn-header'>
<h1>{{menuDialogTitle}}</h1>
</div>
<div class='umb-modalcolumn-body'>
</div>
</div>
</div>
</div>
</div>
@@ -1,66 +1,66 @@
<div>
<div id="applications" ng-class="{faded:stickyNavigation}">
<ul class="sections">
<li class="avatar">
<a href="#" ng-click="avatarClick()" hotkey="ctrl+shift+u" title="{{user.name}}" prevent-default>
<umb-avatar
size="xs"
img-src="{{avatar[0].value}}"
img-srcset="{{avatar[1].value}} 2x, {{avatar[2].value}} 3x">
</umb-avatar>
</a>
</li>
<li ng-repeat="section in sections | limitTo: maxSections" ng-class="{current: section.alias == currentSection}">
<a href="#/{{section.alias}}"
ng-dblclick="sectionDblClick(section)"
ng-click="sectionClick($event, section)"
prevent-default>
<section-icon icon="{{section.cssclass}}"></section-icon>
<span>{{section.name}}</span>
</a>
</li>
<li class="expand" ng-class="{ 'open': showTray === true }" ng-show="needTray">
<a href ng-click="trayClick()">
<i class="icon icon-arrow-right"></i>
</a>
</li>
<li class="help">
<a href class="help" hotkey="ctrl+shift+h" ng-click="helpClick()" prevent-default>
<i class="icon-help-alt"></i>
<span><localize key="sections_help">Help</localize></span>
</a>
</li>
</ul>
</div>
<div id="applications-tray" ng-show="showTray" ng-animate="trayAnimation()" style="display: none;">
<ul class="sections sections-tray">
<li ng-repeat="section in sections | limitTo: overflowingSections" ng-class="{current: section.alias == currentSection}">
<a href="#/{{section.alias}}"
ng-dblclick="sectionDblClick(section)"
ng-click="sectionClick($event, section)"
prevent-default>
<section-icon icon="{{section.cssclass}}"></section-icon>
<span>{{section.name}}</span>
</a>
</li>
</ul>
</div>
<umb-overlay
ng-if="helpDialog.show"
model="helpDialog"
view="helpDialog.view"
position="left">
</umb-overlay>
<umb-overlay
ng-if="userDialog.show"
model="userDialog"
view="userDialog.view"
position="left">
</umb-overlay>
</div>
<div>
<div id="applications" ng-class="{faded:stickyNavigation}">
<ul class="sections">
<li class="avatar">
<a href="#" ng-click="avatarClick()" hotkey="ctrl+shift+u" title="{{user.name}}" prevent-default>
<umb-avatar
size="xs"
img-src="{{avatar[0].value}}"
img-srcset="{{avatar[1].value}} 2x, {{avatar[2].value}} 3x">
</umb-avatar>
</a>
</li>
<li ng-repeat="section in sections | limitTo: maxSections" ng-class="{current: section.alias == currentSection}">
<a href="#/{{section.alias}}"
ng-dblclick="sectionDblClick(section)"
ng-click="sectionClick($event, section)"
prevent-default>
<section-icon icon="{{section.cssclass}}"></section-icon>
<span>{{section.name}}</span>
</a>
</li>
<li class="expand" ng-class="{ 'open': showTray === true }" ng-show="needTray">
<a href ng-click="trayClick()">
<i class="icon icon-arrow-right"></i>
</a>
</li>
<li class="help">
<a href class="help" hotkey="ctrl+shift+h" ng-click="helpClick()" prevent-default>
<i class="icon-help-alt"></i>
<span><localize key="sections_help">Help</localize></span>
</a>
</li>
</ul>
</div>
<div id="applications-tray" ng-show="showTray" ng-animate="trayAnimation()" style="display: none;">
<ul class="sections sections-tray">
<li ng-repeat="section in sections | limitTo: overflowingSections" ng-class="{current: section.alias == currentSection}">
<a href="#/{{section.alias}}"
ng-dblclick="sectionDblClick(section)"
ng-click="sectionClick($event, section)"
prevent-default>
<section-icon icon="{{section.cssclass}}"></section-icon>
<span>{{section.name}}</span>
</a>
</li>
</ul>
</div>
<umb-overlay
ng-if="helpDialog.show"
model="helpDialog"
view="helpDialog.view"
position="left">
</umb-overlay>
<umb-overlay
ng-if="userDialog.show"
model="userDialog"
view="userDialog.view"
position="left">
</umb-overlay>
</div>
@@ -1,13 +1,13 @@
<div class="umb-property">
<div class="control-group umb-control-group" ng-class="{error: !formValid(), hidelabel:hideLabel=='true'}">
<div class="umb-el-wrap">
<label ng-if="hideLabel!=='true'" class="control-label" for="{{alias}}">
{{labelstring}}
<small>{{descriptionstring}}</small>
</label>
<div class="controls controls-row" ng-transclude>
</div>
</div>
</div>
<div class="umb-property">
<div class="control-group umb-control-group" ng-class="{error: !formValid(), hidelabel:hideLabel=='true'}">
<div class="umb-el-wrap">
<label ng-if="hideLabel!=='true'" class="control-label" for="{{alias}}">
{{labelstring}}
<small>{{descriptionstring}}</small>
</label>
<div class="controls controls-row" ng-transclude>
</div>
</div>
</div>
</div>
@@ -1,3 +1,3 @@
<div class="umb-pane" ng-transclude>
<div class="umb-pane" ng-transclude>
</div>
@@ -1,3 +1,3 @@
<div class="umb-panel tabbable" ng-transclude>
</div>
<div class="umb-panel tabbable" ng-transclude>
</div>
@@ -1,21 +1,21 @@
<div class="umb-notifications" id="umb-notifications-wrapper" ng-cloak>
<ul class="umb-notifications__notifications">
<li ng-repeat="notification in notifications"
class="alert alert-block alert-{{notification.type}} umb-notifications__notification animated -half-second fadeIn"
ng-class="{'-no-border -extra-padding': notification.type === 'form'}">
<a class='close -align-right' ng-click="removeNotification($index)" prevent-default href>&times;</a>
<div ng-if="notification.view">
<div ng-include="notification.view"></div>
</div>
<div ng-if="notification.headline">
<a ng-href="{{notification.url}}" target="_blank">
<strong>{{notification.headline}}</strong>
<span ng-bind-html="notification.message"></span>
</a>
</div>
</li>
</ul>
</div>
<div class="umb-notifications" id="umb-notifications-wrapper" ng-cloak>
<ul class="umb-notifications__notifications">
<li ng-repeat="notification in notifications"
class="alert alert-block alert-{{notification.type}} umb-notifications__notification animated -half-second fadeIn"
ng-class="{'-no-border -extra-padding': notification.type === 'form'}">
<a class='close -align-right' ng-click="removeNotification($index)" prevent-default href>&times;</a>
<div ng-if="notification.view">
<div ng-include="notification.view"></div>
</div>
<div ng-if="notification.headline">
<a ng-href="{{notification.url}}" target="_blank">
<strong>{{notification.headline}}</strong>
<span ng-bind-html="notification.message"></span>
</a>
</div>
</li>
</ul>
</div>
@@ -1,5 +1,5 @@
<div class='umb-tab-pane tab-pane'>
<div class='umb-tab-pane-inner'>
<div ng-transclude></div>
</div>
</div>
<div class='umb-tab-pane tab-pane'>
<div class='umb-tab-pane-inner'>
<div ng-transclude></div>
</div>
</div>
@@ -1,10 +1,10 @@
<div>
<p ng-hide="!caption" class="umb-abstract">{{caption}}</p>
<div class="umb-pane btn-toolbar umb-btn-toolbar">
<div class="control-group umb-control-group">
<a href class="btn btn-link" ng-click="onCancel()"><localize key="general_cancel">Cancel</localize></a>
<a href class="btn btn-primary" ng-click="onConfirm()"><localize key="general_ok">Ok</localize></a>
</div>
</div>
<div>
<p ng-hide="!caption" class="umb-abstract">{{caption}}</p>
<div class="umb-pane btn-toolbar umb-btn-toolbar">
<div class="control-group umb-control-group">
<a href class="btn btn-link" ng-click="onCancel()"><localize key="general_cancel">Cancel</localize></a>
<a href class="btn btn-primary" ng-click="onConfirm()"><localize key="general_ok">Ok</localize></a>
</div>
</div>
</div>
@@ -12,10 +12,10 @@
<div class="umb-media-grid__image-background" ng-if="item.thumbnail || item.extension == 'svg'"></div>
<!-- Image thumbnail -->
<img class="umb-media-grid__item-image" width="{{item.width}}" height="{{item.height}}" ng-if="item.thumbnail" ng-src="{{item.thumbnail}}" alt="{{item.name}}" draggable="false" />
<img class="umb-media-grid__item-image" width="{{item.width}}" height="{{item.height}}" ng-if="item.thumbnail" ng-src="{{item.thumbnail}}" alt="{{item.name}}" title="{{item.name}}" draggable="false" />
<!-- SVG -->
<img class="umb-media-grid__item-image" width="{{item.width}}" height="{{item.height}}" ng-if="!item.thumbnail && item.extension == 'svg'" ng-src="{{item.file}}" alt="{{item.name}}" draggable="false" />
<img class="umb-media-grid__item-image" width="{{item.width}}" height="{{item.height}}" ng-if="!item.thumbnail && item.extension == 'svg'" ng-src="{{item.file}}" alt="{{item.name}}" title="{{item.name}}" draggable="false" />
<!-- Transparent image - fallback - used to keep image proportions on wrapper-->
<img class="umb-media-grid__item-image-placeholder" ng-if="!item.thumbnail && item.extension != 'svg'" src="assets/img/transparent.png" alt="{{item.name}}" draggable="false" />
@@ -1,60 +1,60 @@
<div>
<div class="umb-table" ng-if="items">
<!-- Listviews head section -->
<div class="umb-table-head">
<div class="umb-table-row">
<div class="umb-table-cell">
<input class="umb-table__input" type="checkbox"
ng-if="allowSelectAll"
ng-click="selectAll($event)"
ng-checked="isSelectedAll()">
</div>
<div class="umb-table-cell umb-table__name">
<a class="umb-table-head__link sortable" href="#" ng-click="sort('Name', true, true)" prevent-default>
<localize key="general_name">Name</localize>
<i class="umb-table-head__icon icon" ng-class="{'icon-navigation-up': isSortDirection('Name', 'asc'), 'icon-navigation-down': isSortDirection('Name', 'desc')}"></i>
</a>
</div>
<div class="umb-table-cell" ng-repeat="column in itemProperties">
<a class="umb-table-head__link" title="Sort by {{ column.header }}" href="#"
ng-click="sort(column.alias, column.allowSorting, column.isSystem)"
ng-class="{'sortable':column.allowSorting}" prevent-default>
<span ng-bind="column.header"></span>
<i class="umb-table-head__icon icon" ng-class="{'icon-navigation-up': isSortDirection(column.alias, 'asc'), 'icon-navigation-down': isSortDirection(column.alias, 'desc')}"></i>
</a>
</div>
</div>
</div>
<!-- Listview body section -->
<div class="umb-table-body">
<div class="umb-table-row"
ng-repeat="item in items"
ng-class="{
'-selected':item.selected,
'-published':item.published,
'-unpublished':!item.published
}"
ng-click="selectItem(item, $index, $event)">
<div class="umb-table-cell" ng-class="{'has-unpublished-version':!item.published && item.hasPublishedVersion}">
<i class="umb-table-body__icon umb-table-body__fileicon {{item.icon}}" ng-class="getIcon(item)"></i>
<i class="umb-table-body__icon umb-table-body__checkicon icon-check"></i>
</div>
<div class="umb-table-cell umb-table__name">
<a title="{{ item.name }}" class="umb-table-body__link" href=""
ng-click="clickItem(item, $event)"
ng-bind="item.name">
</a>
</div>
<div class="umb-table-cell" ng-repeat="column in itemProperties">
<span title="{{column.header}}: {{item[column.alias]}}">{{item[column.alias]}}</span>
</div>
</div>
</div>
</div>
<!-- If list is empty, then display -->
<umb-empty-state ng-if="!items"
position="center">
<localize key="content_listViewNoItems">There are no items show in the list.</localize>
</umb-empty-state>
</div>
<div>
<div class="umb-table" ng-if="items">
<!-- Listviews head section -->
<div class="umb-table-head">
<div class="umb-table-row">
<div class="umb-table-cell">
<input class="umb-table__input" type="checkbox"
ng-if="allowSelectAll"
ng-click="selectAll($event)"
ng-checked="isSelectedAll()">
</div>
<div class="umb-table-cell umb-table__name">
<a class="umb-table-head__link sortable" href="#" ng-click="sort('Name', true, true)" prevent-default>
<localize key="general_name">Name</localize>
<i class="umb-table-head__icon icon" ng-class="{'icon-navigation-up': isSortDirection('Name', 'asc'), 'icon-navigation-down': isSortDirection('Name', 'desc')}"></i>
</a>
</div>
<div class="umb-table-cell" ng-repeat="column in itemProperties">
<a class="umb-table-head__link" title="Sort by {{ column.header }}" href="#"
ng-click="sort(column.alias, column.allowSorting, column.isSystem)"
ng-class="{'sortable':column.allowSorting}" prevent-default>
<span ng-bind="column.header"></span>
<i class="umb-table-head__icon icon" ng-class="{'icon-navigation-up': isSortDirection(column.alias, 'asc'), 'icon-navigation-down': isSortDirection(column.alias, 'desc')}"></i>
</a>
</div>
</div>
</div>
<!-- Listview body section -->
<div class="umb-table-body">
<div class="umb-table-row"
ng-repeat="item in items"
ng-class="{
'-selected':item.selected,
'-published':item.published,
'-unpublished':!item.published
}"
ng-click="selectItem(item, $index, $event)">
<div class="umb-table-cell" ng-class="{'has-unpublished-version':!item.published && item.hasPublishedVersion}">
<i class="umb-table-body__icon umb-table-body__fileicon {{item.icon}}" ng-class="getIcon(item)"></i>
<i class="umb-table-body__icon umb-table-body__checkicon icon-check"></i>
</div>
<div class="umb-table-cell umb-table__name">
<a title="{{ item.name }}" class="umb-table-body__link" href=""
ng-click="clickItem(item, $event)"
ng-bind="item.name">
</a>
</div>
<div class="umb-table-cell" ng-repeat="column in itemProperties">
<span title="{{column.header}}: {{item[column.alias]}}">{{item[column.alias]}}</span>
</div>
</div>
</div>
</div>
<!-- If list is empty, then display -->
<umb-empty-state ng-if="!items"
position="center">
<localize key="content_listViewNoItems">There are no items show in the list.</localize>
</umb-empty-state>
</div>
@@ -98,4 +98,11 @@
</ng-form>
<umb-overlay
ng-if="mediatypepickerOverlay.show"
model="mediatypepickerOverlay"
view="mediatypepickerOverlay.view"
position="right">
</umb-overlay>
</div>

Some files were not shown because too many files have changed in this diff Show More