More MusicStore.Spa changes RE wwwroot, Client source & grunt:

- Got rid of the Client folder
- wwwroot is now checked in and is source of truth for static files
- Moved TypeScript & Angular templates to ~/ng-apps
- Updated grunt config for above changes
This commit is contained in:
DamianEdwards 2014-10-13 11:51:54 -07:00
parent acac2802db
commit 24904bb884
70 changed files with 8349 additions and 42 deletions

2
.gitignore vendored
View File

@ -34,6 +34,6 @@ bower_components
node_modules
*.sln.ide
*/*.Spa/public/*
*/*.Spa/wwwroot/*
*/*.Spa/wwwroot/lib
*.ng.ts
*.sln.ide

View File

@ -1,9 +0,0 @@
/// <reference path="../../bower_components/dt-angular/angular.d.ts" />
/// <reference path="../../bower_components/dt-angular/angular-route.d.ts" />
/// <reference path="../../bower_components/dt-angular-ui-bootstrap/angular-ui-bootstrap.d.ts" />
declare module ng {
export interface ILogProvider {
debugEnabled(enabled: boolean);
}
}

View File

@ -5,7 +5,7 @@ namespace MusicStore.Controllers
{
public class TemplateController : Controller
{
private static readonly string _templateBasePath = "/Client/ng-apps/";
private static readonly string _templateBasePath = "/ng-apps/";
// GET: Template
[Route("ng-apps/{*path}")]

View File

@ -4,7 +4,7 @@
"private": true,
"dependencies": {
"bootstrap": "~3.1.0",
"jquery.validation": "~1.13.0",
"jquery-validation": "~1.13.0",
"jquery": "~2.1.0",
"modernizr": "~2.7.1",
"respond": "~1.4.2",
@ -13,18 +13,18 @@
"angular-bootstrap": "~0.10.0"
},
"devDependencies": {
"dt-angular": "~1.2.15",
"dt-angular": "~1.2.16",
"dt-angular-ui-bootstrap": "*",
"dt-jquery": "~2.0.0"
},
"exportsOverride": {
"bootstrap": {
"js": "dist/**/*.js",
"css": "dist/**/*.css",
"fonts": "**/*.{eot,svg,ttf,woff}"
"js": "dist/js/*.*",
"css": "dist/css/*.*",
"fonts": "dist/fonts/*.*"
},
"jquery": {
"": "dist/*.{js,map}"
"/jquery/": {
"": "dist/*.*"
},
"/angular/": {
"": "*.{js,map}"
@ -33,7 +33,7 @@
"": "modernizr.js"
},
"respond": {
"": "dest/*.{js,map}"
"": "dest/*.*"
},
"dt-*": { }
}

View File

@ -1,5 +1,5 @@
{
"options": { "force": true },
"assets": [ "wwwroot/*", "!wwwroot/bin", "!wwwroot/lib" ],
"tsng": [ "client/**/*.ng.ts" ]
"assets": [ "wwwroot/ng-apps" ],
"tsng": [ "ng-apps/**/*.ng.ts" ]
}

View File

@ -1,19 +1,13 @@
{
"fix": {
"_": "This is to work around an issue with the dt-angular bower package https://github.com/dt-bower/dt-angular/issues/4",
"files": {
"bower_components/jquery/jquery.d.ts": [ "bower_components/dt-jquery/jquery.d.ts" ]
}
},
"assets": {
"files": [
{
"expand": true,
"cwd": "Client/",
"cwd": "ng-apps/",
"src": [
"<%= staticFilePattern %>"
],
"dest": "wwwroot/",
"dest": "wwwroot/ng-apps",
"options": { "force": true }
}
]

View File

@ -4,7 +4,7 @@
"cleancss": false
},
"files": {
"wwwroot/css/site.css": "Client/**/*.less"
"wwwroot/css/site.css": "wwwroot/**/*.less"
}
},
"release": {
@ -12,7 +12,7 @@
"cleancss": true
},
"files": {
"wwwroot/css/site.css": "Client/**/*.less"
"wwwroot/css/site.css": "wwwroot/**/*.less"
}
}
}

View File

@ -53,6 +53,6 @@
}
},
"files": {
"src": [ "Client/**/*.ts", "!**/*.ng.ts" ]
"src": [ "ng-apps/**/*.ts", "!**/*.ng.ts" ]
}
}

View File

@ -5,12 +5,12 @@
"dev": {
"files": [
{
"src": [ "Client/ng-apps/components/**/*.ts", "Client/ng-apps/MusicStore.Store/**/*.ts", "!**/*.ng.ts" ],
"dest": "Client/ng-apps"
"src": [ "ng-apps/components/**/*.ts", "ng-apps/MusicStore.Store/**/*.ts", "!**/*.ng.ts" ],
"dest": "ng-apps"
},
{
"src": ["Client/ng-apps/components/**/*.ts", "Client/ng-apps/MusicStore.Admin/**/*.ts", "!**/*.ng.ts"],
"dest": "Client/ng-apps"
"src": ["ng-apps/components/**/*.ts", "ng-apps/MusicStore.Admin/**/*.ts", "!**/*.ng.ts"],
"dest": "ng-apps"
}
]
}

View File

@ -7,11 +7,11 @@
"dev": {
"files": [
{
"src": ["Client/ng-apps/components/**/*.ng.ts", "Client/ng-apps/MusicStore.Store/**/*.ng.ts"],
"src": ["ng-apps/components/**/*.ng.ts", "ng-apps/MusicStore.Store/**/*.ng.ts"],
"dest": "wwwroot/js/MusicStore.Store.js"
},
{
"src": ["Client/ng-apps/components/**/*.ng.ts", "Client/ng-apps/MusicStore.Admin/**/*.ng.ts"],
"src": ["ng-apps/components/**/*.ng.ts", "ng-apps/MusicStore.Admin/**/*.ng.ts"],
"dest": "wwwroot/js/MusicStore.Admin.js"
}
]

View File

@ -1,10 +1,10 @@
{
"typescript": {
"files": ["Client/**/*.ts", "!**/*.ng.ts"],
"files": ["ng-apps/**/*.ts", "!**/*.ng.ts"],
"tasks": ["ts"]
},
"dev": {
"files": ["bower_components/<%= staticFilePattern %>", "Client/<%= staticFilePattern %>"],
"tasks": ["dev"]
"bower": {
"files": ["bower_components/**/*.*"],
"tasks": ["bower:install"]
}
}

View File

@ -0,0 +1,9 @@
/// <reference path="../bower_components/dt-angular/angular.d.ts" />
/// <reference path="../bower_components/dt-angular/angular-route.d.ts" />
/// <reference path="../bower_components/dt-angular-ui-bootstrap/angular-ui-bootstrap.d.ts" />
declare module ng {
export interface ILogProvider {
debugEnabled(enabled: boolean);
}
}

View File

@ -25,6 +25,10 @@
"Kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5104",
"run": "run server.urls=http://localhost:5103"
},
"scripts": {
"postrestore": [ "npm install" ],
"prepare": [ "grunt bower:install" ]
},
"frameworks": {
"aspnet50": { },
"aspnetcore50": { }

View File

@ -0,0 +1,88 @@
@import '../../bower_components/bootstrap/less/bootstrap.less';
@font-face {
font-family: 'Glyphicons Halflings';
src: url('../lib/bootstrap/fonts/glyphicons-halflings-regular.eot');
src: url('../lib/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../lib/bootstrap/fonts/glyphicons-halflings-regular.woff') format('woff'), url('../lib/bootstrap/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../lib/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
display: none !important;
}
.nav, .pagination, .carousel, .panel-title a {
cursor: pointer;
}
body {
padding-top: 50px;
padding-bottom: 20px;
}
/* Set padding to keep content from hitting the edges */
.body-content {
padding-left: 15px;
padding-right: 15px;
}
/* Set width on the form input elements since they're 100% wide by default */
input,
select,
textarea {
/*max-width: 280px;*/
}
/* styles for validation helpers */
.field-validation-error {
color: #b94a48;
}
.field-validation-valid {
display: none;
}
input.input-validation-error {
border: 1px solid #b94a48;
}
input[type="checkbox"].input-validation-error {
border: 0 none;
}
.validation-summary-errors {
color: #b94a48;
}
.validation-summary-valid {
display: none;
}
/* Music Store additions */
ul#album-list li {
height: 160px;
}
ul#album-list li img:hover {
box-shadow: 1px 1px 7px #777;
}
ul#album-list li img {
max-width: 100px;
max-height: 100px;
box-shadow: 1px 1px 5px #999;
border: none;
padding: 0;
}
ul#album-list li a, ul#album-details li a {
text-decoration:none;
}
ul#album-list li a:hover {
background: none;
-webkit-text-shadow: 1px 1px 2px #bbb;
text-shadow: 1px 1px 2px #bbb;
color: #363430;
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,303 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="77.981812"
height="38"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="logo.svg"
inkscape:export-filename="C:\Users\Jon\SkyDrive\Projects\Git\MvcMusicStore\MvcMusicStore\Content\Images\logo.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="68.62794"
inkscape:cy="21.563703"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid4175"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-381.25,-434.47363)">
<g
id="g3138"
transform="matrix(0.99433276,0,0,0.99433276,2.6879598,-28.875086)">
<g
transform="matrix(0.95191143,0,0,0.94999997,-13.610187,70.866904)"
id="g4123">
<g
id="g4004"
transform="translate(6.4397225,-81.443549)">
<path
transform="matrix(1.037037,0,0,1.0566038,33.991419,-29.473365)"
d="m 439.46429,517.54077 c 0,7.84047 -6.47589,14.19643 -14.46429,14.19643 -7.9884,0 -14.46429,-6.35596 -14.46429,-14.19643 0,-7.84047 6.47589,-14.19643 14.46429,-14.19643 7.9884,0 14.46429,6.35596 14.46429,14.19643 z"
sodipodi:ry="14.196428"
sodipodi:rx="14.464286"
sodipodi:cy="517.54077"
sodipodi:cx="425"
id="path3007-1"
style="fill:#000000;fill-opacity:1;stroke:none"
sodipodi:type="arc" />
<path
transform="matrix(0.16151528,0,0,0.16456275,406.08815,432.19425)"
d="m 439.46429,517.54077 c 0,7.84047 -6.47589,14.19643 -14.46429,14.19643 -7.9884,0 -14.46429,-6.35596 -14.46429,-14.19643 0,-7.84047 6.47589,-14.19643 14.46429,-14.19643 7.9884,0 14.46429,6.35596 14.46429,14.19643 z"
sodipodi:ry="14.196428"
sodipodi:rx="14.464286"
sodipodi:cy="517.54077"
sodipodi:cx="425"
id="path3007-0-4"
style="fill:#ffffff;fill-opacity:1;stroke:none"
sodipodi:type="arc" />
</g>
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:1.31862605;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-1"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(0.5308556,0,0,0.5308556,229.63162,198.10213)" />
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:0.61952281;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-4-1"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(1.1299019,0,0,1.1299019,-54.220053,-70.262937)" />
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:0.8002516;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-5-5"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(0.83035093,0,0,0.83035093,87.718968,63.932058)" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.87783366px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 481.53079,442.83849 -0.0153,6.77692 c 9.55428,-0.16929 14.45853,-10.06218 12.50577,-19.31642 l -8.12484,3.61854 c 0.006,4.27743 -1.21305,6.01267 -4.23942,6.33245 z"
id="path3916-5-2-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc"
inkscape:transform-center-x="6.427012"
inkscape:transform-center-y="17.713434" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.87783366px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 480.46352,428.30022 0.0153,-6.77692 c -9.55428,0.16929 -14.45853,10.06218 -12.50577,19.31642 l 8.12484,-3.61854 c -0.006,-4.27743 1.21305,-6.01267 4.23942,-6.33245 z"
id="path3916-5-2-7-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc"
inkscape:transform-center-x="-6.4270161"
inkscape:transform-center-y="-17.713434" />
</g>
<g
transform="matrix(0.95191143,0,0,0.94999997,-63.034658,70.866904)"
id="g4123-1">
<g
id="g4004-4"
transform="translate(6.4397225,-81.443549)">
<path
transform="matrix(1.037037,0,0,1.0566038,33.991419,-29.473365)"
d="m 439.46429,517.54077 c 0,7.84047 -6.47589,14.19643 -14.46429,14.19643 -7.9884,0 -14.46429,-6.35596 -14.46429,-14.19643 0,-7.84047 6.47589,-14.19643 14.46429,-14.19643 7.9884,0 14.46429,6.35596 14.46429,14.19643 z"
sodipodi:ry="14.196428"
sodipodi:rx="14.464286"
sodipodi:cy="517.54077"
sodipodi:cx="425"
id="path3007-1-2"
style="fill:#000000;fill-opacity:1;stroke:none"
sodipodi:type="arc" />
<path
transform="matrix(0.16151528,0,0,0.16456275,406.08815,432.19425)"
d="m 439.46429,517.54077 c 0,7.84047 -6.47589,14.19643 -14.46429,14.19643 -7.9884,0 -14.46429,-6.35596 -14.46429,-14.19643 0,-7.84047 6.47589,-14.19643 14.46429,-14.19643 7.9884,0 14.46429,6.35596 14.46429,14.19643 z"
sodipodi:ry="14.196428"
sodipodi:rx="14.464286"
sodipodi:cy="517.54077"
sodipodi:cx="425"
id="path3007-0-4-3"
style="fill:#ffffff;fill-opacity:1;stroke:none"
sodipodi:type="arc" />
</g>
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:1.31862605;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-1-2"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(0.5308556,0,0,0.5308556,229.63162,198.10213)" />
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:0.61952281;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-4-1-2"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(1.1299019,0,0,1.1299019,-54.220053,-70.262937)" />
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:0.8002516;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-5-5-1"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(0.83035093,0,0,0.83035093,87.718968,63.932058)" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.87783366px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 481.53079,442.83849 -0.0153,6.77692 c 9.55428,-0.16929 14.45853,-10.06218 12.50577,-19.31642 l -8.12484,3.61854 c 0.006,4.27743 -1.21305,6.01267 -4.23942,6.33245 z"
id="path3916-5-2-7-68"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc"
inkscape:transform-center-x="6.427012"
inkscape:transform-center-y="17.713434" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.87783366px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 480.46352,428.30022 0.0153,-6.77692 c -9.55428,0.16929 -14.45853,10.06218 -12.50577,19.31642 l 8.12484,-3.61854 c -0.006,-4.27743 1.21305,-6.01267 4.23942,-6.33245 z"
id="path3916-5-2-7-6-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc"
inkscape:transform-center-x="-6.4270161"
inkscape:transform-center-y="-17.713434" />
</g>
<g
transform="matrix(0.95191143,0,0,0.94999997,5.2301333,72.549709)"
id="g4113">
<path
sodipodi:type="arc"
style="fill:#000000;fill-opacity:1;stroke:none"
id="path3007-7-8"
sodipodi:cx="425"
sodipodi:cy="517.54077"
sodipodi:rx="14.464286"
sodipodi:ry="14.196428"
d="m 439.46429,517.54077 c 0,7.84047 -6.47589,14.19643 -14.46429,14.19643 -7.9884,0 -14.46429,-6.35596 -14.46429,-14.19643 0,-7.84047 6.47589,-14.19643 14.46429,-14.19643 7.9884,0 14.46429,6.35596 14.46429,14.19643 z"
transform="matrix(1.382716,0,0,1.4088051,-152.12422,-294.96682)" />
<path
sodipodi:type="arc"
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.23868203;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3007-4-8"
sodipodi:cx="425"
sodipodi:cy="517.54077"
sodipodi:rx="14.464286"
sodipodi:ry="14.196428"
d="m 439.46429,517.54077 c 0,7.84047 -6.47589,14.19643 -14.46429,14.19643 -7.9884,0 -14.46429,-6.35596 -14.46429,-14.19643 0,-7.84047 6.47589,-14.19643 14.46429,-14.19643 7.9884,0 14.46429,6.35596 14.46429,14.19643 z"
transform="matrix(0.57659584,0,0,0.58747505,190.47685,130.10497)" />
<path
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="path3007-0-2"
sodipodi:cx="425"
sodipodi:cy="517.54077"
sodipodi:rx="14.464286"
sodipodi:ry="14.196428"
d="m 439.46429,517.54077 c 0,7.84047 -6.47589,14.19643 -14.46429,14.19643 -7.9884,0 -14.46429,-6.35596 -14.46429,-14.19643 0,-7.84047 6.47589,-14.19643 14.46429,-14.19643 7.9884,0 14.46429,6.35596 14.46429,14.19643 z"
transform="matrix(0.27721059,0,0,0.282441,317.71558,287.97253)" />
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:0.66094333;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(1.0590923,0,0,1.0590923,-66.309468,-40.31252)" />
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:0.44283628;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-4"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(1.5807196,0,0,1.5807196,-313.47698,-273.99486)" />
<path
sodipodi:type="arc"
style="fill:none;stroke:#ffffff;stroke-width:0.53326446;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path3889-5"
sodipodi:cx="473.83929"
sodipodi:cy="447.98718"
sodipodi:rx="10.982142"
sodipodi:ry="10.982142"
d="m 484.82144,447.98718 c 0,6.06527 -4.91688,10.98215 -10.98215,10.98215 -6.06527,0 -10.98214,-4.91688 -10.98214,-10.98215 0,-6.06527 4.91687,-10.98214 10.98214,-10.98214 6.06527,0 10.98215,4.91687 10.98215,10.98214 z"
transform="matrix(1.3126696,0,0,1.3126696,-186.46436,-153.9119)" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.14413512px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 436.31917,443.49132 -0.10217,8.33905 c 12.45268,-0.22064 18.92699,-12.29179 16.38184,-24.35342 l -7.29812,4.63399 c 1.81826,5.98647 -4.04967,10.71674 -8.98155,11.38038 z"
id="path3916-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:transform-center-x="8.3767009"
inkscape:transform-center-y="23.087015" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.14413512px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 434.01553,424.88159 0.48098,-8.21278 c -12.45268,0.22064 -18.92699,12.29179 -16.38184,24.35342 l 8.05573,-3.62383 c -1.81826,-5.98647 2.91325,-11.85317 7.84513,-12.51681 z"
id="path3916-5-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:transform-center-x="-8.3766982"
inkscape:transform-center-y="-23.087015" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="100"
height="100"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="New document 1">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="56.013691"
inkscape:cy="69.593676"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1003"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-277.5,-381.16879)">
<g
id="g3797"
inkscape:export-filename="C:\Users\Jon\SkyDrive\Projects\Git\MvcMusicStore\MvcMusicStore\Content\Images\placeholder.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<rect
y="381.16879"
x="277.5"
height="100"
width="100"
id="rect3017"
style="fill:#ffffff;fill-opacity:1" />
<g
transform="translate(2.0535545,-3.2469826)"
id="g3787">
<rect
style="fill:#edecb3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.15819502px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect2998"
width="78.591805"
height="78.591805"
x="286.15054"
y="395.11987" />
<g
style="font-size:10.29434204px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#90905a;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI"
id="text3000">
<path
inkscape:connector-curvature="0"
d="m 290.05246,405.88284 0,-0.99526 c 0.11393,0.10054 0.25048,0.19101 0.40966,0.27144 0.15917,0.0804 0.32672,0.14828 0.50265,0.20357 0.17593,0.0553 0.35269,0.098 0.5303,0.12818 0.1776,0.0302 0.3418,0.0452 0.4926,0.0452 0.51941,0 0.90729,-0.0963 1.16364,-0.28903 0.25635,-0.19268 0.38453,-0.46998 0.38453,-0.83189 0,-0.19436 -0.0427,-0.36358 -0.12817,-0.50768 -0.0855,-0.14409 -0.20358,-0.27562 -0.35437,-0.39458 -0.1508,-0.11896 -0.32925,-0.2329 -0.53533,-0.34181 -0.20609,-0.1089 -0.4281,-0.22367 -0.66602,-0.34431 -0.25132,-0.12734 -0.4859,-0.25635 -0.70371,-0.38705 -0.21782,-0.13068 -0.40715,-0.27478 -0.568,-0.43228 -0.16085,-0.15749 -0.28735,-0.33593 -0.3795,-0.53533 -0.0922,-0.19938 -0.13823,-0.43311 -0.13823,-0.7012 0,-0.32839 0.072,-0.61407 0.21614,-0.85702 0.14409,-0.24294 0.33342,-0.44317 0.568,-0.60067 0.23457,-0.15749 0.50181,-0.27478 0.80173,-0.35186 0.29991,-0.0771 0.60569,-0.1156 0.91734,-0.11561 0.71042,1e-5 1.22815,0.0855 1.5532,0.25635 l 0,0.95002 c -0.42558,-0.29488 -0.9718,-0.44233 -1.63865,-0.44234 -0.18431,10e-6 -0.36861,0.0193 -0.55292,0.0578 -0.18431,0.0385 -0.34851,0.10137 -0.4926,0.18849 -0.14409,0.0871 -0.26138,0.1994 -0.35186,0.33678 -0.0905,0.1374 -0.13571,0.30495 -0.13571,0.50266 0,0.18431 0.0343,0.34348 0.10304,0.47752 0.0687,0.13404 0.17006,0.25635 0.30411,0.36693 0.13404,0.11059 0.2974,0.21782 0.49008,0.3217 0.19269,0.10389 0.41469,0.21782 0.66602,0.34181 0.25803,0.12734 0.50265,0.26138 0.73387,0.40212 0.23122,0.14074 0.43396,0.29657 0.60821,0.46747 0.17425,0.1709 0.31248,0.36023 0.41469,0.56799 0.10221,0.20777 0.15331,0.44569 0.15331,0.71377 0,0.35521 -0.0695,0.65597 -0.2086,0.90226 -0.13907,0.24631 -0.32673,0.44653 -0.56297,0.60068 -0.23625,0.15414 -0.50852,0.26556 -0.81681,0.33426 -0.3083,0.0687 -0.63335,0.10304 -0.97515,0.10304 -0.11394,0 -0.25468,-0.009 -0.42223,-0.0276 -0.16755,-0.0184 -0.33845,-0.0452 -0.5127,-0.0804 -0.17426,-0.0352 -0.3393,-0.0788 -0.49512,-0.13069 -0.15582,-0.0519 -0.28065,-0.10974 -0.37447,-0.17341 z"
id="path3005" />
<path
inkscape:connector-curvature="0"
d="m 299.43197,406.17438 -0.82435,0 0,-0.80425 -0.0201,0 c -0.35856,0.61659 -0.88635,0.92488 -1.58336,0.92488 -0.51271,0 -0.91399,-0.13571 -1.20385,-0.40715 -0.28987,-0.27143 -0.4348,-0.63166 -0.4348,-1.0807 0,-0.96174 0.56632,-1.52136 1.69897,-1.67886 l 1.54315,-0.21614 c -10e-6,-0.87462 -0.35354,-1.31192 -1.0606,-1.31193 -0.61994,10e-6 -1.17956,0.21112 -1.67886,0.63334 l 0,-0.84445 c 0.506,-0.3217 1.08908,-0.48255 1.74923,-0.48255 1.20971,0 1.81457,0.64005 1.81458,1.92014 z m -0.82435,-2.60375 -1.24156,0.1709 c -0.38202,0.0536 -0.6702,0.14829 -0.86456,0.284 -0.19436,0.13572 -0.29154,0.37616 -0.29154,0.72131 0,0.25133 0.0896,0.45658 0.26892,0.61575 0.17928,0.15918 0.41804,0.23876 0.71628,0.23876 0.40882,0 0.74644,-0.14325 1.01285,-0.42977 0.2664,-0.28651 0.3996,-0.64926 0.39961,-1.08824 z"
id="path3007" />
<path
inkscape:connector-curvature="0"
d="m 308.3038,406.17438 -0.82435,0 0,-2.9556 c -10e-6,-0.56968 -0.088,-0.98185 -0.26389,-1.23653 -0.17594,-0.25468 -0.47167,-0.38201 -0.88719,-0.38202 -0.35186,10e-6 -0.65094,0.16085 -0.89723,0.48255 -0.24631,0.3217 -0.36946,0.70707 -0.36945,1.1561 l 0,2.9355 -0.82436,0 0,-3.05614 c 0,-1.012 -0.39039,-1.518 -1.17118,-1.51801 -0.36191,10e-6 -0.66015,0.15164 -0.89472,0.4549 -0.23457,0.30327 -0.35186,0.69786 -0.35186,1.18375 l 0,2.9355 -0.82435,0 0,-5.14717 0.82435,0 0,0.81429 0.0201,0 c 0.36526,-0.62328 0.89807,-0.93493 1.59844,-0.93493 0.35185,0 0.65847,0.098 0.91985,0.29405 0.26138,0.19604 0.44066,0.45323 0.53784,0.77157 0.38201,-0.71041 0.95169,-1.06562 1.70902,-1.06562 1.13264,0 1.69896,0.69869 1.69897,2.09606 z"
id="path3009" />
<path
inkscape:connector-curvature="0"
d="m 310.70648,405.43045 -0.0201,0 0,3.11143 -0.82435,0 0,-7.51467 0.82435,0 0,0.90477 0.0201,0 c 0.40548,-0.6836 0.99861,-1.02541 1.7794,-1.02541 0.6635,0 1.18123,0.23039 1.5532,0.69115 0.37195,0.46077 0.55794,1.07819 0.55794,1.85228 0,0.86121 -0.20944,1.55068 -0.62831,2.06841 -0.41889,0.51774 -0.99191,0.7766 -1.71908,0.7766 -0.66686,0 -1.18124,-0.28818 -1.54315,-0.86456 z m -0.0201,-2.07596 0,0.7188 c 0,0.42558 0.13823,0.78665 0.41469,1.08321 0.27645,0.29657 0.62747,0.44485 1.05306,0.44485 0.4993,0 0.89053,-0.191 1.17369,-0.57302 0.28316,-0.38202 0.42474,-0.91315 0.42474,-1.59341 0,-0.57303 -0.13237,-1.02206 -0.39709,-1.34711 -0.26474,-0.32505 -0.6233,-0.48757 -1.07568,-0.48758 -0.4792,10e-6 -0.86457,0.16672 -1.1561,0.50014 -0.29154,0.33343 -0.43731,0.75147 -0.43731,1.25412 z"
id="path3011" />
<path
inkscape:connector-curvature="0"
d="m 316.73833,406.17438 -0.82436,0 0,-7.62023 0.82436,0 z"
id="path3013" />
<path
inkscape:connector-curvature="0"
d="m 322.54397,403.80688 -3.63418,0 c 0.0134,0.57303 0.16755,1.01536 0.46244,1.327 0.29489,0.31165 0.70036,0.46747 1.21642,0.46747 0.57972,0 1.11254,-0.191 1.59844,-0.57302 l 0,0.77408 c -0.45239,0.3284 -1.05055,0.4926 -1.79448,0.4926 -0.72717,0 -1.29852,-0.23373 -1.71404,-0.7012 -0.41553,-0.46746 -0.62329,-1.1251 -0.62329,-1.97291 0,-0.80089 0.22703,-1.4535 0.68109,-1.95784 0.45406,-0.50432 1.01787,-0.75649 1.69143,-0.75649 0.67355,0 1.19464,0.21782 1.56325,0.65345 0.36861,0.43564 0.55292,1.0405 0.55292,1.81458 z m -0.84446,-0.69869 c -0.003,-0.47584 -0.11812,-0.84613 -0.34431,-1.11086 -0.2262,-0.26473 -0.54036,-0.39709 -0.94248,-0.3971 -0.38872,10e-6 -0.7188,0.13907 -0.99023,0.4172 -0.27143,0.27814 -0.43898,0.64173 -0.50265,1.09076 z"
id="path3015" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,820 @@
var MusicStore;
(function (MusicStore) {
(function (AlbumApi) {
angular.module("MusicStore.AlbumApi", []);
})(MusicStore.AlbumApi || (MusicStore.AlbumApi = {}));
var AlbumApi = MusicStore.AlbumApi;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (AlbumApi) {
var AlbumApiService = (function () {
function AlbumApiService($cacheFactory, $q, $http, urlResolver) {
this._inlineData = $cacheFactory.get("inlineData");
this._q = $q;
this._http = $http;
this._urlResolver = urlResolver;
}
AlbumApiService.prototype.getAlbums = function (page, pageSize, sortBy) {
var url = this._urlResolver.resolveUrl("~/api/albums"), query = {}, querySeparator = "?", inlineData;
if (page) {
query.page = page;
}
if (pageSize) {
query.pageSize = pageSize;
}
if (sortBy) {
query.sortBy = sortBy;
}
for (var key in query) {
if (query.hasOwnProperty(key)) {
url += querySeparator + key + "=" + encodeURIComponent(query[key]);
if (querySeparator === "?") {
querySeparator = "&";
}
}
}
inlineData = this._inlineData ? this._inlineData.get(url) : null;
if (inlineData) {
return this._q.when(inlineData);
} else {
return this._http.get(url).then(function (result) {
return result.data;
});
}
};
AlbumApiService.prototype.getAlbumDetails = function (albumId) {
var url = this._urlResolver.resolveUrl("~/api/albums/" + albumId);
return this._http.get(url).then(function (result) {
return result.data;
});
};
AlbumApiService.prototype.getMostPopularAlbums = function (count) {
var url = this._urlResolver.resolveUrl("~/api/albums/mostPopular"), inlineData = this._inlineData ? this._inlineData.get(url) : null;
if (inlineData) {
return this._q.when(inlineData);
} else {
if (count && count > 0) {
url += "?count=" + count;
}
return this._http.get(url).then(function (result) {
return result.data;
});
}
};
AlbumApiService.prototype.createAlbum = function (album, config) {
var url = this._urlResolver.resolveUrl("api/albums");
return this._http.post(url, album, config || { timeout: 10000 });
};
AlbumApiService.prototype.updateAlbum = function (album, config) {
var url = this._urlResolver.resolveUrl("api/albums/" + album.AlbumId + "/update");
return this._http.put(url, album, config || { timeout: 10000 });
};
AlbumApiService.prototype.deleteAlbum = function (albumId, config) {
var url = this._urlResolver.resolveUrl("api/albums/" + albumId);
return this._http.delete(url, config || { timeout: 10000 });
};
return AlbumApiService;
})();
angular.module("MusicStore.AlbumApi").service("MusicStore.AlbumApi.IAlbumApiService", [
"$cacheFactory",
"$q",
"$http",
"MusicStore.UrlResolver.IUrlResolverService",
AlbumApiService
]);
})(MusicStore.AlbumApi || (MusicStore.AlbumApi = {}));
var AlbumApi = MusicStore.AlbumApi;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (ArtistApi) {
angular.module("MusicStore.ArtistApi", []);
})(MusicStore.ArtistApi || (MusicStore.ArtistApi = {}));
var ArtistApi = MusicStore.ArtistApi;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (ArtistApi) {
var ArtistsApiService = (function () {
function ArtistsApiService($cacheFactory, $q, $http, urlResolver) {
this._inlineData = $cacheFactory.get("inlineData");
this._q = $q;
this._http = $http;
this._urlResolver = urlResolver;
}
ArtistsApiService.prototype.getArtistsLookup = function () {
var url = this._urlResolver.resolveUrl("~/api/artists/lookup"), inlineData = this._inlineData ? this._inlineData.get(url) : null;
if (inlineData) {
return this._q.when(inlineData);
} else {
return this._http.get(url).then(function (result) {
return result.data;
});
}
};
return ArtistsApiService;
})();
angular.module("MusicStore.ArtistApi").service("MusicStore.ArtistApi.IArtistApiService", [
"$cacheFactory",
"$q",
"$http",
"MusicStore.UrlResolver.IUrlResolverService",
ArtistsApiService
]);
})(MusicStore.ArtistApi || (MusicStore.ArtistApi = {}));
var ArtistApi = MusicStore.ArtistApi;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (GenreApi) {
angular.module("MusicStore.GenreApi", []);
})(MusicStore.GenreApi || (MusicStore.GenreApi = {}));
var GenreApi = MusicStore.GenreApi;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (GenreApi) {
var GenreApiService = (function () {
function GenreApiService($cacheFactory, $q, $http, urlResolver) {
this._inlineData = $cacheFactory.get("inlineData");
this._q = $q;
this._http = $http;
this._urlResolver = urlResolver;
}
GenreApiService.prototype.getGenresLookup = function () {
var url = this._urlResolver.resolveUrl("~/api/genres/lookup"), inlineData = this._inlineData ? this._inlineData.get(url) : null;
if (inlineData) {
return this._q.when(inlineData);
} else {
return this._http.get(url).then(function (result) {
return result.data;
});
}
};
GenreApiService.prototype.getGenresMenu = function () {
var url = this._urlResolver.resolveUrl("~/api/genres/menu"), inlineData = this._inlineData ? this._inlineData.get(url) : null;
if (inlineData) {
return this._q.when(inlineData);
} else {
return this._http.get(url).then(function (result) {
return result.data;
});
}
};
GenreApiService.prototype.getGenresList = function () {
var url = this._urlResolver.resolveUrl("~/api/genres");
return this._http.get(url);
};
GenreApiService.prototype.getGenreAlbums = function (genreId) {
var url = this._urlResolver.resolveUrl("~/api/genres/" + genreId + "/albums");
return this._http.get(url);
};
return GenreApiService;
})();
angular.module("MusicStore.GenreApi").service("MusicStore.GenreApi.IGenreApiService", [
"$cacheFactory",
"$q",
"$http",
"MusicStore.UrlResolver.IUrlResolverService",
GenreApiService
]);
})(MusicStore.GenreApi || (MusicStore.GenreApi = {}));
var GenreApi = MusicStore.GenreApi;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (GenreMenu) {
angular.module("MusicStore.GenreMenu", []);
})(MusicStore.GenreMenu || (MusicStore.GenreMenu = {}));
var GenreMenu = MusicStore.GenreMenu;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (GenreMenu) {
var GenreMenuController = (function () {
function GenreMenuController(genreApi, urlResolver) {
var viewModel = this;
genreApi.getGenresMenu().then(function (genres) {
viewModel.genres = genres;
});
viewModel.urlBase = urlResolver.base;
}
return GenreMenuController;
})();
angular.module("MusicStore.GenreMenu").controller("MusicStore.GenreMenu.GenreMenuController", [
"MusicStore.GenreApi.IGenreApiService",
"MusicStore.UrlResolver.IUrlResolverService",
GenreMenuController
]);
})(MusicStore.GenreMenu || (MusicStore.GenreMenu = {}));
var GenreMenu = MusicStore.GenreMenu;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (GenreMenu) {
var GenreMenuDirective = (function () {
function GenreMenuDirective(urlResolver) {
this.replace = true;
this.restrict = "A";
for (var m in this) {
if (this[m].bind) {
this[m] = this[m].bind(this);
}
}
this.templateUrl = urlResolver.resolveUrl("~/ng-apps/components/GenreMenu/GenreMenu.html");
}
return GenreMenuDirective;
})();
angular.module("MusicStore.GenreMenu").directive("appGenreMenu", [
"MusicStore.UrlResolver.IUrlResolverService",
function (a) {
return new GenreMenuDirective(a);
}
]);
})(MusicStore.GenreMenu || (MusicStore.GenreMenu = {}));
var GenreMenu = MusicStore.GenreMenu;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (InlineData) {
angular.module("MusicStore.InlineData", []);
})(MusicStore.InlineData || (MusicStore.InlineData = {}));
var InlineData = MusicStore.InlineData;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (InlineData) {
var InlineDataDirective = (function () {
function InlineDataDirective($cacheFactory, $log) {
this.restrict = "A";
for (var m in this) {
if (this[m].bind) {
this[m] = this[m].bind(this);
}
}
this._cache = $cacheFactory.get("inlineData") || $cacheFactory("inlineData");
this._log = $log;
}
InlineDataDirective.prototype.link = function (scope, element, attrs) {
var data = attrs.type === "application/json" ? angular.fromJson(element.text()) : element.text();
this._log.info("appInlineData: Inline data element found for " + attrs.for);
this._cache.put(attrs.for, data);
};
return InlineDataDirective;
})();
angular.module("MusicStore.InlineData").directive("appInlineData", [
"$cacheFactory",
"$log",
function (a, b) {
return new InlineDataDirective(a, b);
}
]);
})(MusicStore.InlineData || (MusicStore.InlineData = {}));
var InlineData = MusicStore.InlineData;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (LoginLink) {
angular.module("MusicStore.LoginLink", []);
})(MusicStore.LoginLink || (MusicStore.LoginLink = {}));
var LoginLink = MusicStore.LoginLink;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (LoginLink) {
var LoginLinkDirective = (function () {
function LoginLinkDirective(urlResolver, $window) {
this.restrict = "A";
for (var m in this) {
if (this[m].bind) {
this[m] = this[m].bind(this);
}
}
this._window = $window;
}
LoginLinkDirective.prototype.link = function (scope, element, attrs) {
var _this = this;
if (!element.is("a[href]")) {
return;
}
var loginUrl = attrs.href;
element.click(function (event) {
var currentUrl = _this._window.location.pathname + _this._window.location.search + _this._window.location.hash, newUrl = loginUrl + "?returnUrl=" + encodeURIComponent(currentUrl);
element.prop("href", newUrl);
});
};
return LoginLinkDirective;
})();
angular.module("MusicStore.LoginLink").directive("appLoginLink", [
"MusicStore.UrlResolver.IUrlResolverService",
"$window",
function (a, b) {
return new LoginLinkDirective(a, b);
}
]);
})(MusicStore.LoginLink || (MusicStore.LoginLink = {}));
var LoginLink = MusicStore.LoginLink;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Models) {
var AlertType = (function () {
function AlertType(value) {
this.value = value;
}
AlertType.prototype.toString = function () {
return this.value;
};
AlertType.success = new AlertType("success");
AlertType.info = new AlertType("info");
AlertType.warning = new AlertType("warning");
AlertType.danger = new AlertType("danger");
return AlertType;
})();
Models.AlertType = AlertType;
})(MusicStore.Models || (MusicStore.Models = {}));
var Models = MusicStore.Models;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (PreventSubmit) {
angular.module("MusicStore.PreventSubmit", []);
})(MusicStore.PreventSubmit || (MusicStore.PreventSubmit = {}));
var PreventSubmit = MusicStore.PreventSubmit;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (PreventSubmit) {
var PreventSubmitDirective = (function () {
function PreventSubmitDirective() {
this.restrict = "A";
for (var m in this) {
if (this[m].bind) {
this[m] = this[m].bind(this);
}
}
}
PreventSubmitDirective.prototype.link = function (scope, element, attrs) {
element.submit(function (e) {
if (scope.$eval(attrs.appPreventSubmit)) {
e.preventDefault();
return false;
}
});
};
return PreventSubmitDirective;
})();
angular.module("MusicStore.PreventSubmit").directive("appPreventSubmit", [
function () {
return new PreventSubmitDirective();
}
]);
})(MusicStore.PreventSubmit || (MusicStore.PreventSubmit = {}));
var PreventSubmit = MusicStore.PreventSubmit;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (TitleCase) {
angular.module("MusicStore.TitleCase", []);
})(MusicStore.TitleCase || (MusicStore.TitleCase = {}));
var TitleCase = MusicStore.TitleCase;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (TitleCase) {
function titleCase(input) {
var out = "", lastChar = "";
for (var i = 0; i < input.length; i++) {
out = out + (lastChar === " " || lastChar === "" ? input.charAt(i).toUpperCase() : input.charAt(i));
lastChar = input.charAt(i);
}
return out;
}
angular.module("MusicStore.TitleCase").filter("titlecase", function () {
return titleCase;
});
})(MusicStore.TitleCase || (MusicStore.TitleCase = {}));
var TitleCase = MusicStore.TitleCase;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Truncate) {
angular.module("MusicStore.Truncate", []);
})(MusicStore.Truncate || (MusicStore.Truncate = {}));
var Truncate = MusicStore.Truncate;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Truncate) {
function truncate(input, length) {
if (!input) {
return input;
}
if (input.length <= length) {
return input;
} else {
return input.substr(0, length).trim() + "…";
}
}
angular.module("MusicStore.Truncate").filter("truncate", function () {
return truncate;
});
})(MusicStore.Truncate || (MusicStore.Truncate = {}));
var Truncate = MusicStore.Truncate;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (UrlResolver) {
angular.module("MusicStore.UrlResolver", []);
})(MusicStore.UrlResolver || (MusicStore.UrlResolver = {}));
var UrlResolver = MusicStore.UrlResolver;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (UrlResolver) {
var UrlResolverService = (function () {
function UrlResolverService($rootElement) {
this._base = $rootElement.attr("data-url-base");
if (this._base === "" || this._base.substr(this._base.length - 1) !== "/") {
this._base = this._base + "/";
}
}
Object.defineProperty(UrlResolverService.prototype, "base", {
get: function () {
return this._base;
},
enumerable: true,
configurable: true
});
UrlResolverService.prototype.resolveUrl = function (relativeUrl) {
var firstChar = relativeUrl.substr(0, 1);
if (firstChar === "~") {
relativeUrl = relativeUrl.substr(1);
}
firstChar = relativeUrl.substr(0, 1);
if (firstChar === "/") {
relativeUrl = relativeUrl.substr(1);
}
return this._base + relativeUrl;
};
return UrlResolverService;
})();
angular.module("MusicStore.UrlResolver").service("MusicStore.UrlResolver.IUrlResolverService", [
"$rootElement",
UrlResolverService
]);
})(MusicStore.UrlResolver || (MusicStore.UrlResolver = {}));
var UrlResolver = MusicStore.UrlResolver;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (UserDetails) {
angular.module("MusicStore.UserDetails", []);
})(MusicStore.UserDetails || (MusicStore.UserDetails = {}));
var UserDetails = MusicStore.UserDetails;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (UserDetails) {
var UserDetailsService = (function () {
function UserDetailsService($document) {
this._document = $document;
}
UserDetailsService.prototype.getUserDetails = function (elementId) {
if (typeof elementId === "undefined") { elementId = "userDetails"; }
if (!this._userDetails) {
var el = this._document.find("#" + elementId + "[type='application/json']");
if (el.length) {
this._userDetails = angular.fromJson(el.text());
} else {
this._userDetails = {
isAuthenticated: false,
userId: null,
userName: null,
roles: []
};
}
}
return this._userDetails;
};
return UserDetailsService;
})();
angular.module("MusicStore.UserDetails").service("MusicStore.UserDetails.IUserDetailsService", [
"$document",
UserDetailsService
]);
})(MusicStore.UserDetails || (MusicStore.UserDetails = {}));
var UserDetails = MusicStore.UserDetails;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (ViewAlert) {
angular.module("MusicStore.ViewAlert", []);
})(MusicStore.ViewAlert || (MusicStore.ViewAlert = {}));
var ViewAlert = MusicStore.ViewAlert;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (ViewAlert) {
var ViewAlertService = (function () {
function ViewAlertService() {
}
return ViewAlertService;
})();
angular.module("MusicStore.ViewAlert").service("MusicStore.ViewAlert.IViewAlertService", [
ViewAlertService
]);
})(MusicStore.ViewAlert || (MusicStore.ViewAlert = {}));
var ViewAlert = MusicStore.ViewAlert;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Visited) {
angular.module("MusicStore.Visited", []);
})(MusicStore.Visited || (MusicStore.Visited = {}));
var Visited = MusicStore.Visited;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Visited) {
var VisitedDirective = (function () {
function VisitedDirective($window) {
this.restrict = "E";
this.require = "?ngModel";
for (var m in this) {
if (this[m].bind) {
this[m] = this[m].bind(this);
}
}
this._window = $window;
}
VisitedDirective.prototype.link = function (scope, element, attrs, ctrl) {
if (!ctrl) {
return;
}
element.on("focus", function (event) {
element.addClass("has-focus");
scope.$apply(function () {
return ctrl.focus = true;
});
});
element.on("blur", function (event) {
element.removeClass("has-focus");
element.addClass("has-visited");
scope.$apply(function () {
ctrl.focus = false;
ctrl.visited = true;
});
});
element.closest("form").on("submit", function () {
element.addClass("has-visited");
scope.$apply(function () {
ctrl.focus = false;
ctrl.visited = true;
});
});
};
return VisitedDirective;
})();
angular.module("MusicStore.Visited").directive("input", [
"$window",
function (a) {
return new VisitedDirective(a);
}
]).directive("select", [
"$window",
function (a) {
return new VisitedDirective(a);
}
]);
})(MusicStore.Visited || (MusicStore.Visited = {}));
var Visited = MusicStore.Visited;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Store) {
(function (Catalog) {
angular.module("MusicStore.Store.Catalog", []);
})(Store.Catalog || (Store.Catalog = {}));
var Catalog = Store.Catalog;
})(MusicStore.Store || (MusicStore.Store = {}));
var Store = MusicStore.Store;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Store) {
(function (Catalog) {
var AlbumDetailsController = (function () {
function AlbumDetailsController($routeParams, albumApi) {
var viewModel = this, albumId = $routeParams.albumId;
albumApi.getAlbumDetails(albumId).then(function (album) {
viewModel.album = album;
});
}
return AlbumDetailsController;
})();
angular.module("MusicStore.Store.Catalog").controller("MusicStore.Store.Catalog.AlbumDetailsController", [
"$routeParams",
"MusicStore.AlbumApi.IAlbumApiService",
AlbumDetailsController
]);
})(Store.Catalog || (Store.Catalog = {}));
var Catalog = Store.Catalog;
})(MusicStore.Store || (MusicStore.Store = {}));
var Store = MusicStore.Store;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Store) {
(function (Catalog) {
var GenreDetailsController = (function () {
function GenreDetailsController($routeParams, genreApi) {
var viewModel = this;
genreApi.getGenreAlbums($routeParams.genreId).success(function (result) {
viewModel.albums = result;
});
}
return GenreDetailsController;
})();
angular.module("MusicStore.Store.Catalog").controller("MusicStore.Store.Catalog.GenreDetailsController", [
"$routeParams",
"MusicStore.GenreApi.IGenreApiService",
GenreDetailsController
]);
})(Store.Catalog || (Store.Catalog = {}));
var Catalog = Store.Catalog;
})(MusicStore.Store || (MusicStore.Store = {}));
var Store = MusicStore.Store;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Store) {
(function (Catalog) {
var GenreListController = (function () {
function GenreListController(genreApi) {
var viewModel = this;
genreApi.getGenresList().success(function (genres) {
viewModel.genres = genres;
});
}
return GenreListController;
})();
angular.module("MusicStore.Store.Catalog").controller("MusicStore.Store.Catalog.GenreListController", [
"MusicStore.GenreApi.IGenreApiService",
GenreListController
]);
})(Store.Catalog || (Store.Catalog = {}));
var Catalog = Store.Catalog;
})(MusicStore.Store || (MusicStore.Store = {}));
var Store = MusicStore.Store;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Store) {
(function (Home) {
angular.module("MusicStore.Store.Home", []);
})(Store.Home || (Store.Home = {}));
var Home = Store.Home;
})(MusicStore.Store || (MusicStore.Store = {}));
var Store = MusicStore.Store;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Store) {
(function (Home) {
var HomeController = (function () {
function HomeController(albumApi) {
var viewModel = this;
albumApi.getMostPopularAlbums().then(function (albums) {
viewModel.albums = albums;
});
}
return HomeController;
})();
angular.module("MusicStore.Store.Home").controller("MusicStore.Store.Home.HomeController", [
"MusicStore.AlbumApi.IAlbumApiService",
HomeController
]);
})(Store.Home || (Store.Home = {}));
var Home = Store.Home;
})(MusicStore.Store || (MusicStore.Store = {}));
var Store = MusicStore.Store;
})(MusicStore || (MusicStore = {}));
var MusicStore;
(function (MusicStore) {
(function (Store) {
angular.module("MusicStore.Store", [
"ngRoute",
"MusicStore.InlineData",
"MusicStore.PreventSubmit",
"MusicStore.GenreMenu",
"MusicStore.UrlResolver",
"MusicStore.UserDetails",
"MusicStore.LoginLink",
"MusicStore.GenreApi",
"MusicStore.AlbumApi",
"MusicStore.Visited",
"MusicStore.Store.Home",
"MusicStore.Store.Catalog"
]).config([
"$routeProvider",
"$logProvider",
configuration
]).run([
"$log",
"MusicStore.UserDetails.IUserDetailsService",
run
]);
var dependencies = [
"ngRoute",
MusicStore.InlineData,
MusicStore.PreventSubmit,
MusicStore.GenreMenu,
MusicStore.UrlResolver,
MusicStore.UserDetails,
MusicStore.LoginLink,
MusicStore.GenreApi,
MusicStore.AlbumApi,
MusicStore.Visited,
MusicStore.Store.Home,
MusicStore.Store.Catalog
];
function configuration($routeProvider, $logProvider) {
$logProvider.debugEnabled(true);
$routeProvider.when("/", { templateUrl: "ng-apps/MusicStore.Store/Home/Home.html" }).when("/albums/genres", { templateUrl: "ng-apps/MusicStore.Store/Catalog/GenreList.html" }).when("/albums/genres/:genreId", { templateUrl: "ng-apps/MusicStore.Store/Catalog/GenreDetails.html" }).when("/albums/:albumId", { templateUrl: "ng-apps/MusicStore.Store/Catalog/AlbumDetails.html" }).otherwise({ redirectTo: "/" });
}
function run($log, userDetails) {
$log.log(userDetails.getUserDetails());
}
})(MusicStore.Store || (MusicStore.Store = {}));
var Store = MusicStore.Store;
})(MusicStore || (MusicStore = {}));

View File

@ -0,0 +1,26 @@
<div ng-controller="MusicStore.Store.Catalog.AlbumDetailsController as viewModel">
<h2>{{ viewModel.album.Title }}</h2>
<p>
<img ng-alt="{{ viewModel.album.Title }}" ng-src="{{ viewModel.album.AlbumArtUrl}}" />
</p>
<div id="album-details">
<p>
<em>Genre:</em>
{{ viewModel.album.Genre.Name }}
</p>
<p>
<em>Artist:</em>
{{ viewModel.album.Artist.Name }}
</p>
<p>
<em>Price:</em>
{{ viewModel.album.Price | currency }}
</p>
<p class="button">
<!-- TODO: Shopping cart functionality -->
Add to cart
</p>
</div>
</div>

View File

@ -0,0 +1,12 @@
<div ng-controller="MusicStore.Store.Catalog.GenreDetailsController as viewModel" class="genre">
<h3><em>{{ viewModel.genre.Name }}</em> Albums</h3>
<ul id="album-list" class="list-unstyled">
<li ng-repeat="album in viewModel.albums" class="col-lg-2 col-md-2 col-sm-2 col-xs-4 container">
<a ng-href="#/albums/{{ album.AlbumId }}">
<img ng-show="album.AlbumArtUrl" ng-alt="{{ album.Title }}" ng-src="{{ album.AlbumArtUrl }}" />
<h5 class="control-label">{{ album.Title }}</h5>
</a>
</li>
</ul>
</div>

View File

@ -0,0 +1,12 @@
<div ng-controller="MusicStore.Store.Catalog.GenreListController as viewModel">
<h3>Browse Genres</h3>
<p>
Select from {{ viewModel.genres.length }} genres:
</p>
<ul class="list-group">
<li ng-repeat="genre in viewModel.genres" class="list-group-item">
<a ng-href="#/albums/genres/{{ genre.GenreId }}">{{ genre.Name }}</a>
</li>
</ul>
</div>

View File

@ -0,0 +1,15 @@
<div class="jumbotron">
<h1>MVC Music Store</h1>
<img src="Images/home-showcase.png" />
</div>
<div ng-controller="MusicStore.Store.Home.HomeController as viewModel">
<ul class="row list-unstyled" id="album-list">
<li ng-repeat="album in viewModel.albums" class="col-lg-2 col-md-2 col-sm-2 col-xs-4 container">
<a ng-href="#/albums/{{ album.AlbumId }}">
<img ng-alt="{{ album.Title }}" ng-src="{{ album.AlbumArtUrl }}" />
<h4>{{ album.Title }}</h4>
</a>
</li>
</ul>
</div>

View File

@ -0,0 +1,12 @@
<li class="dropdown" ng-controller="MusicStore.GenreMenu.GenreMenuController as viewModel">
<a class="dropdown-toggle" data-toggle="dropdown">Store <b class="caret"></b></a>
<ul class="dropdown-menu">
<li ng-repeat="genre in viewModel.genres">
<a ng-href="{{ viewModel.urlBase }}#/albums/genres/{{ genre.GenreId }}" title="{{ genre.Description }}">{{ genre.Name }}</a>
</li>
<li class="divider"></li>
<li>
<a href="{{ viewModel.urlBase }}#/albums/genres">More…</a>
</li>
</ul>
</li>