diff --git a/src/MusicStore.Spa/Apis/AlbumsApiController.cs b/src/MusicStore.Spa/Apis/AlbumsApiController.cs index 38c4014d23..26b3cdaaec 100644 --- a/src/MusicStore.Spa/Apis/AlbumsApiController.cs +++ b/src/MusicStore.Spa/Apis/AlbumsApiController.cs @@ -16,7 +16,7 @@ namespace MusicStore.Apis _storeContext = storeContext; } - //[Route("api/albums")] + [Route("api/albums")] public async Task Paged(int page = 1, int pageSize = 50, string sortBy = null) { var albums = await _storeContext.Albums @@ -28,7 +28,7 @@ namespace MusicStore.Apis return Json(albums); } - //[Route("api/albums/all")] + [Route("api/albums/all")] public async Task All() { var albums = await _storeContext.Albums @@ -40,7 +40,7 @@ namespace MusicStore.Apis return Json(albums); } - //[Route("api/albums/mostPopular")] + [Route("api/albums/mostPopular")] public async Task MostPopular(int count = 6) { count = count > 0 && count < 20 ? count : 6; @@ -52,7 +52,7 @@ namespace MusicStore.Apis return Json(albums); } - //[Route("api/albums/{albumId:int}")] + [Route("api/albums/{albumId:int}")] public async Task Details(int albumId) { // TODO: Remove this when EF supports related entity loading diff --git a/src/MusicStore.Spa/Apis/ArtistsApiController.cs b/src/MusicStore.Spa/Apis/ArtistsApiController.cs index 53b0abae63..19c28d77b8 100644 --- a/src/MusicStore.Spa/Apis/ArtistsApiController.cs +++ b/src/MusicStore.Spa/Apis/ArtistsApiController.cs @@ -15,7 +15,7 @@ namespace MusicStore.Apis _storeContext = storeContext; } - //[Route("api/artists/lookup")] + [Route("api/artists/lookup")] public async Task Lookup() { var artists = await _storeContext.Artists diff --git a/src/MusicStore.Spa/Apis/GenresApiController.cs b/src/MusicStore.Spa/Apis/GenresApiController.cs index bbd0c20b90..ae8dd571b7 100644 --- a/src/MusicStore.Spa/Apis/GenresApiController.cs +++ b/src/MusicStore.Spa/Apis/GenresApiController.cs @@ -14,7 +14,7 @@ namespace MusicStore.Apis _storeContext = storeContext; } - //[Route("api/genres/lookup")] + [Route("api/genres/lookup")] public async Task Lookup() { var genres = await _storeContext.Genres @@ -24,7 +24,7 @@ namespace MusicStore.Apis return Json(genres); } - //[Route("api/genres/menu")] + [Route("api/genres/menu")] public async Task GenreMenuList(int count = 9) { count = count > 0 && count < 20 ? count : 9; @@ -39,7 +39,7 @@ namespace MusicStore.Apis return Json(genres); } - //[Route("api/genres")] + [Route("api/genres")] public async Task GenreList() { var genres = await _storeContext.Genres @@ -50,7 +50,7 @@ namespace MusicStore.Apis return Json(genres); } - //[Route("api/genres/{genreId:int}/albums")] + [Route("api/genres/{genreId:int}/albums")] public async Task GenreAlbums(int genreId) { var albums = await _storeContext.Albums diff --git a/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumDetails.cshtml b/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumDetails.cshtml index 43060109d1..3d2c960472 100644 --- a/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumDetails.cshtml +++ b/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumDetails.cshtml @@ -1,4 +1,4 @@ -@model MvcMusicStore.Models.Album +@model MusicStore.Models.Album

Album Details

diff --git a/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumEdit.cshtml b/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumEdit.cshtml index f997c2def4..86f5b2c02c 100644 --- a/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumEdit.cshtml +++ b/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumEdit.cshtml @@ -1,4 +1,4 @@ -@model MvcMusicStore.Models.Album +@model MusicStore.Models.Album

Album {{ viewModel.mode | titlecase }}

diff --git a/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumList.cshtml b/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumList.cshtml index 14d945d6d2..441636cc6b 100644 --- a/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumList.cshtml +++ b/src/MusicStore.Spa/Client/ng-apps/MusicStore.Admin/Catalog/AlbumList.cshtml @@ -1,4 +1,4 @@ -@model MvcMusicStore.Models.Album +@model MusicStore.Models.Album

Albums

diff --git a/src/MusicStore.Spa/Controllers/HomeController.cs b/src/MusicStore.Spa/Controllers/HomeController.cs index 307cee8165..47c25ab519 100644 --- a/src/MusicStore.Spa/Controllers/HomeController.cs +++ b/src/MusicStore.Spa/Controllers/HomeController.cs @@ -4,8 +4,6 @@ namespace MusicStore.Controllers { public class HomeController : Controller { - // - // GET: /Home/ public IActionResult Index() { return View(); diff --git a/src/MusicStore.Spa/Controllers/TemplateController.cs b/src/MusicStore.Spa/Controllers/TemplateController.cs index 9cdb96d3cc..07e87133cb 100644 --- a/src/MusicStore.Spa/Controllers/TemplateController.cs +++ b/src/MusicStore.Spa/Controllers/TemplateController.cs @@ -5,16 +5,15 @@ namespace MusicStore.Controllers { public class TemplateController : Controller { - private static readonly string _templateBasePath = "~/Client/ng-apps/"; + private static readonly string _templateBasePath = "/Client/ng-apps/"; // GET: Template - //[Route("ng-apps/{*path}")] + [Route("ng-apps/{*path}")] public ActionResult Index(string path) { if (!IsValidPath(path)) { - // TODO: Change this to NotFoundResult when it's available - return new HttpStatusCodeResult(404); + return new HttpNotFoundResult(); } return View(_templateBasePath + path); diff --git a/src/MusicStore.Spa/Default.html b/src/MusicStore.Spa/Default.html deleted file mode 100644 index 0eb0b7c25a..0000000000 --- a/src/MusicStore.Spa/Default.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Welcome to ASP.NET vNext - - -

Welcome to ASP.NET vNext

- - \ No newline at end of file diff --git a/src/MusicStore.Spa/Gruntfile.js b/src/MusicStore.Spa/Gruntfile.js index 2d6bd2fdbe..759e8173b4 100644 --- a/src/MusicStore.Spa/Gruntfile.js +++ b/src/MusicStore.Spa/Gruntfile.js @@ -1,190 +1,25 @@ /// -/// // node-debug (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) task:target module.exports = function (grunt) { - /// - - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-less'); - grunt.loadNpmTasks('grunt-typescript'); - grunt.loadNpmTasks('grunt-tslint'); - grunt.loadNpmTasks('grunt-tsng'); - //grunt.loadNpmTasks('grunt-contrib-jshint'); - //grunt.loadNpmTasks('grunt-contrib-qunit'); - //grunt.loadNpmTasks('grunt-contrib-concat'); grunt.initConfig({ - staticFilePattern: '**/*.{js,css,map,html,htm,ico,jpg,jpeg,png,gif,eot,svg,ttf,woff}', - pkg: grunt.file.readJSON('package.json'), - uglify: { - options: { - banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' - }, - release: { - files: { - 'wwwroot/app.min.js': ['<%= typescript.dev.dest %>'] - } - } - }, - clean: { - options: { force: true }, - bower: ['wwwroot/*', '!wwwroot/bin'], - assets: ['wwwroot/*', '!wwwroot/bin'], - tsng: ['client/**/*.ng.ts'] - }, - copy: { - // This is to work around an issue with the dt-angular bower package https://github.com/dt-bower/dt-angular/issues/4 - fix: { - files: { - "bower_components/jquery/jquery.d.ts": ["bower_components/dt-jquery/jquery.d.ts"] - } - }, - bower: { - files: [ - { // JavaScript - expand: true, - flatten: true, - cwd: "bower_components/", - src: [ - "modernizr/modernizr.js", - "jquery/dist/*.{js,map}", - "jquery.validation/jquery.validate.js", - "jquery.validation/additional-methods.js", - "bootstrap/dist/**/*.js", - "respond/dest/**/*.js", - "angular/*.{js,.js.map}", - "angular-route/*.{js,.js.map}", - "angular-bootstrap/ui-bootstrap*" - ], - dest: "wwwroot/js/", - options: { force: true } - }, - { // CSS - expand: true, - flatten: true, - cwd: "bower_components/", - src: [ - "bootstrap/dist/**/*.css", - ], - dest: "wwwroot/css/", - options: { force: true } - }, - { // Fonts - expand: true, - flatten: true, - cwd: "bower_components/", - src: [ - "bootstrap/**/*.{woff,svg,eot,ttf}", - ], - dest: "wwwroot/fonts/", - options: { force: true } - } - ] - }, - assets: { - files: [ - { - expand: true, - cwd: "Client/", - src: [ - '<%= staticFilePattern %>' - ], - dest: "wwwroot/", - options: { force: true } - } - ] - } - }, - less: { - dev: { - options: { - cleancss: false - }, - files: { - "wwwroot/css/site.css": "Client/**/*.less" - } - }, - release: { - options: { - cleancss: true - }, - files: { - "wwwroot/css/site.css": "Client/**/*.less" - } - } - }, - tsng: { - options: { - extension: ".ng.ts" - }, - dev: { - files: [ - // TODO: Automate the generation of this config based on convention - { - src: ['Client/ng-apps/components/**/*.ts', 'Client/ng-apps/MusicStore.Store/**/*.ts', "!**/*.ng.ts"], - dest: "Client/ng-apps" // This needs to be the same across all sets so shared components work - }, - { - src: ['Client/ng-apps/components/**/*.ts', 'Client/ng-apps/MusicStore.Admin/**/*.ts', "!**/*.ng.ts"], - dest: "Client/ng-apps" // This needs to be the same across all sets so shared components work - } - ] - } - }, + staticFilePattern: "**/*.{js,css,map,html,htm,ico,jpg,jpeg,png,gif,eot,svg,ttf,woff}", tslint: { options: { - configuration: grunt.file.readJSON("tslint.json") + configuration: grunt.file.readJSON("grunt/tslint-rules.json") }, files: { - src: ['Client/**/*.ts', '!**/*.ng.ts'] - } - }, - typescript: { - options: { - module: 'amd', // or commonjs - target: 'es5', // or es3 - sourcemap: false - }, - dev: { - files: [ - // TODO: Automate the generation of this config based on convention - { - src: ['Client/ng-apps/components/**/*.ng.ts', 'Client/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'], - dest: 'wwwroot/js/MusicStore.Admin.js' - } - ] - }, - release: { - options: { - sourcemap: true - }, - files: '<%= typescript.dev.files %>' - } - }, - watch: { - typescript: { - files: ['Client/**/*.ts', "!**/*.ng.ts"], - tasks: ['ts'] - }, - dev: { - files: ['bower_components/<%= staticFilePattern %>', 'Client/<%= staticFilePattern %>'], - tasks: ['dev'] + src: ["Client/**/*.ts", "!**/*.ng.ts"] } } }); - //grunt.registerTask('test', ['jshint', 'qunit']); - grunt.registerTask('ts', ['tslint', 'tsng', 'typescript:dev']); - grunt.registerTask('dev', ['clean', 'copy', 'less:dev', 'ts']); - grunt.registerTask('release', ['clean', 'copy', 'uglify', 'less:release', 'typescript:release']); - grunt.registerTask('default', ['dev']); + grunt.registerTask("ts", ["tslint", "tsng", "typescript:dev", "clean:tsng"]); + grunt.registerTask("dev", ["clean", "copy", "less:dev", "ts"]); + grunt.registerTask("release", ["clean", "copy", "uglify", "less:release", "typescript:release"]); + grunt.registerTask("default", ["dev"]); + + require("grunt-ide-support")(grunt); }; \ No newline at end of file diff --git a/src/MusicStore.Spa/MusicStore.Spa.kproj b/src/MusicStore.Spa/MusicStore.Spa.kproj index 0f32db022b..971ab71704 100644 --- a/src/MusicStore.Spa/MusicStore.Spa.kproj +++ b/src/MusicStore.Spa/MusicStore.Spa.kproj @@ -18,4 +18,9 @@ 5001 + + + + + \ No newline at end of file diff --git a/src/MusicStore.Spa/Startup.cs b/src/MusicStore.Spa/Startup.cs index 605d509f3f..596abf19ad 100644 --- a/src/MusicStore.Spa/Startup.cs +++ b/src/MusicStore.Spa/Startup.cs @@ -63,17 +63,7 @@ namespace MusicStore.Spa app.UseStaticFiles(); // Add MVC - app.UseMvc(routes => - { - // TODO: Move these back to attribute routes when they're available - routes.MapRoute(null, "api/genres/menu", new { controller = "GenresApi", action = "GenreMenuList" }); - routes.MapRoute(null, "api/genres", new { controller = "GenresApi", action = "GenreList" }); - routes.MapRoute(null, "api/genres/{genreId}/albums", new { controller = "GenresApi", action = "GenreAlbums" }); - routes.MapRoute(null, "api/albums/mostPopular", new { controller = "AlbumsApi", action = "MostPopular" }); - routes.MapRoute(null, "api/albums/all", new { controller = "AlbumsApi", action = "All" }); - routes.MapRoute(null, "api/albums/{albumId}", new { controller = "AlbumsApi", action = "Details" }); - routes.MapRoute(null, "{controller}/{action}/{id?}", new { controller = "Home", action = "Index" }); - }); + app.UseMvc(); } } } diff --git a/src/MusicStore.Spa/grunt/clean.json b/src/MusicStore.Spa/grunt/clean.json new file mode 100644 index 0000000000..f645f3acf6 --- /dev/null +++ b/src/MusicStore.Spa/grunt/clean.json @@ -0,0 +1,6 @@ +{ + "options": { "force": true }, + "bower": ["wwwroot/*", "!wwwroot/bin"], + "assets": ["wwwroot/*", "!wwwroot/bin"], + "tsng": ["client/**/*.ng.ts"] +} \ No newline at end of file diff --git a/src/MusicStore.Spa/grunt/copy.json b/src/MusicStore.Spa/grunt/copy.json new file mode 100644 index 0000000000..aa7a0bb7bc --- /dev/null +++ b/src/MusicStore.Spa/grunt/copy.json @@ -0,0 +1,66 @@ +{ + "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" ] + } + }, + "bower": { + "files": [ + { + "_": "JavaScript", + "expand": true, + "flatten": true, + "cwd": "bower_components/", + "src": [ + "modernizr/modernizr.js", + "jquery/dist/*.{js,map}", + "jquery.validation/jquery.validate.js", + "jquery.validation/additional-methods.js", + "bootstrap/dist/**/*.js", + "respond/dest/**/*.js", + "angular/*.{js,.js.map}", + "angular-route/*.{js,.js.map}", + "angular-bootstrap/ui-bootstrap*" + ], + "dest": "wwwroot/js/", + "options": { "force": true } + }, + { + "_": "CSS", + "expand": true, + "flatten": true, + "cwd": "bower_components/", + "src": [ + "bootstrap/dist/**/*.css" + ], + "dest": "wwwroot/css/", + "options": { "force": true } + }, + { + "_": "Fonts", + "expand": true, + "flatten": true, + "cwd": "bower_components/", + "src": [ + "bootstrap/**/*.{woff,svg,eot,ttf}" + ], + "dest": "wwwroot/fonts/", + "options": { "force": true } + } + ] + }, + "assets": { + "files": [ + { + "expand": true, + "cwd": "Client/", + "src": [ + "<%= staticFilePattern %>" + ], + "dest": "wwwroot/", + "options": { "force": true } + } + ] + } +} \ No newline at end of file diff --git a/src/MusicStore.Spa/grunt/less.json b/src/MusicStore.Spa/grunt/less.json new file mode 100644 index 0000000000..c9a7a142ef --- /dev/null +++ b/src/MusicStore.Spa/grunt/less.json @@ -0,0 +1,18 @@ +{ + "dev": { + "options": { + "cleancss": false + }, + "files": { + "wwwroot/css/site.css": "Client/**/*.less" + } + }, + "release": { + "options": { + "cleancss": true + }, + "files": { + "wwwroot/css/site.css": "Client/**/*.less" + } + } +} \ No newline at end of file diff --git a/src/MusicStore.Spa/tslint.json b/src/MusicStore.Spa/grunt/tslint-rules.json similarity index 100% rename from src/MusicStore.Spa/tslint.json rename to src/MusicStore.Spa/grunt/tslint-rules.json diff --git a/src/MusicStore.Spa/grunt/tsng.json b/src/MusicStore.Spa/grunt/tsng.json new file mode 100644 index 0000000000..18b83af29a --- /dev/null +++ b/src/MusicStore.Spa/grunt/tsng.json @@ -0,0 +1,17 @@ +{ + "options": { + "extension": ".ng.ts" + }, + "dev": { + "files": [ + { + "src": [ "Client/ng-apps/components/**/*.ts", "Client/ng-apps/MusicStore.Store/**/*.ts", "!**/*.ng.ts" ], + "dest": "Client/ng-apps" + }, + { + "src": ["Client/ng-apps/components/**/*.ts", "Client/ng-apps/MusicStore.Admin/**/*.ts", "!**/*.ng.ts"], + "dest": "Client/ng-apps" + } + ] + } +} \ No newline at end of file diff --git a/src/MusicStore.Spa/grunt/typescript.json b/src/MusicStore.Spa/grunt/typescript.json new file mode 100644 index 0000000000..f40f5569b8 --- /dev/null +++ b/src/MusicStore.Spa/grunt/typescript.json @@ -0,0 +1,25 @@ +{ + "options": { + "module": "amd", + "target": "es5", + "sourcemap": false + }, + "dev": { + "files": [ + { + "src": ["Client/ng-apps/components/**/*.ng.ts", "Client/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"], + "dest": "wwwroot/js/MusicStore.Admin.js" + } + ] + }, + "release": { + "options": { + "sourcemap": true + }, + "files": "<%= typescript.dev.files %>" + } +} \ No newline at end of file diff --git a/src/MusicStore.Spa/grunt/uglify.json b/src/MusicStore.Spa/grunt/uglify.json new file mode 100644 index 0000000000..5c6685ee2e --- /dev/null +++ b/src/MusicStore.Spa/grunt/uglify.json @@ -0,0 +1,10 @@ +{ + "options": { + "banner": "/*! <%= pkg.name %> <%= grunt.template.today('dd-mm-yyyy') %> */\n" + }, + "release": { + "files": { + "wwwroot/app.min.js": ["<%= typescript.dev.dest %>"] + } + } +} \ No newline at end of file diff --git a/src/MusicStore.Spa/grunt/watch.json b/src/MusicStore.Spa/grunt/watch.json new file mode 100644 index 0000000000..9106353912 --- /dev/null +++ b/src/MusicStore.Spa/grunt/watch.json @@ -0,0 +1,10 @@ +{ + "typescript": { + "files": ["Client/**/*.ts", "!**/*.ng.ts"], + "tasks": ["ts"] + }, + "dev": { + "files": ["bower_components/<%= staticFilePattern %>", "Client/<%= staticFilePattern %>"], + "tasks": ["dev"] + } +} \ No newline at end of file diff --git a/src/MusicStore.Spa/package.json b/src/MusicStore.Spa/package.json index 87481b1d2d..e14fddfa29 100644 --- a/src/MusicStore.Spa/package.json +++ b/src/MusicStore.Spa/package.json @@ -11,6 +11,7 @@ "grunt-contrib-less": "~0.11.0", "grunt-typescript": "~0.3.6", "grunt-tslint": "~0.4.1", - "grunt-tsng": "~0.1.3" + "grunt-tsng": "~0.1.3", + "grunt-ide-support": "~0.1.7" } } \ No newline at end of file diff --git a/src/MusicStore.Spa/project.json b/src/MusicStore.Spa/project.json index ac9a5c150f..cf65b1b782 100644 --- a/src/MusicStore.Spa/project.json +++ b/src/MusicStore.Spa/project.json @@ -1,5 +1,7 @@ { "webroot": "wwwroot", + "exclude": [ "wwwroot/**/*.*", "bower_components/**/*.*", "node_modules/**/*.*", "grunt/**/*.*" ], + "pack-exclude": [ "bower.json", "package.json", "gruntfile.js", "bower_components/**/*.*", "node_modules/**/*.*", "grunt/**/*.*" ], "authors": [ "Microsoft" ],