diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000000000000000000000000000000000000..69fad358018d530235f8e43c483d3ce960616a32 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "bower_components" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..c2cdfb8ada2cf8c11eb951291e5a03b6fbbe3b52 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# Change these settings to your own preference +indent_style = space +indent_size = 2 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..2125666142eb661091cc5f32af2ed2f3fc65571d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..dc5576cce3b868a1614247ac508b4d8e0342c689 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/dist +/.tmp +/.sass-cache +/bower_components diff --git a/.jscsrc b/.jscsrc new file mode 100644 index 0000000000000000000000000000000000000000..f8bf9ba270343a217a3246b255b090eb84402f17 --- /dev/null +++ b/.jscsrc @@ -0,0 +1,6 @@ +{ + "requireCamelCaseOrUpperCaseIdentifiers": true, + "requireCapitalizedConstructors": true, + "requireParenthesesAroundIIFE": true, + "validateQuoteMarks": "'" +} diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000000000000000000000000000000000000..4572e5d384a33e366ce8132be01b7c7c0261dc41 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,16 @@ +{ + "bitwise": true, + "browser": true, + "curly": true, + "eqeqeq": true, + "esnext": true, + "latedef": true, + "noarg": true, + "node": true, + "strict": true, + "undef": true, + "unused": true, + "globals": { + "angular": false + } +} diff --git a/.yo-rc.json b/.yo-rc.json new file mode 100644 index 0000000000000000000000000000000000000000..6589676f260a21dac4c0c48f504b53745131bea7 --- /dev/null +++ b/.yo-rc.json @@ -0,0 +1,11 @@ +{ + "generator-karma": { + "base-path": "../", + "frameworks": "jasmine", + "browsers": "PhantomJS", + "app-files": "app/scripts/**/*.js", + "files-comments": "bower:js,endbower", + "bower-components-path": "bower_components", + "test-files": "test/mock/**/*.js,test/spec/**/*.js" + } +} \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000000000000000000000000000000000000..d97c760bfc8e72af53ed504c07dc4331ad1bee62 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,516 @@ +// Generated on 2016-10-13 using generator-angular 0.15.1 +'use strict'; + +// # Globbing +// for performance reasons we're only matching one level down: +// 'test/spec/{,*/}*.js' +// use this if you want to recursively match all subfolders: +// 'test/spec/**/*.js' + +module.exports = function (grunt) { + + // Time how long tasks take. Can help when optimizing build times + require('time-grunt')(grunt); + + // Automatically load required Grunt tasks + require('jit-grunt')(grunt, { + useminPrepare: 'grunt-usemin', + ngtemplates: 'grunt-angular-templates', + cdnify: 'grunt-google-cdn' + }); + + // Configurable paths for the application + var appConfig = { + app: require('./bower.json').appPath || 'app', + dist: 'dist' + }; + + // Define the configuration for all the tasks + grunt.initConfig({ + + // Project settings + yeoman: appConfig, + + // Watches files for changes and runs tasks based on the changed files + watch: { + bower: { + files: ['bower.json'], + tasks: ['wiredep'] + }, + js: { + files: ['<%= yeoman.app %>/scripts/{,*/}*.js'], + tasks: ['newer:jshint:all', 'newer:jscs:all'], + options: { + livereload: '<%= connect.options.livereload %>' + } + }, + jsTest: { + files: ['test/spec/{,*/}*.js'], + tasks: ['newer:jshint:test', 'newer:jscs:test', 'karma'] + }, + compass: { + files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'], + tasks: ['compass:server', 'postcss:server'] + }, + gruntfile: { + files: ['Gruntfile.js'] + }, + livereload: { + options: { + livereload: '<%= connect.options.livereload %>' + }, + files: [ + '<%= yeoman.app %>/{,*/}*.html', + '.tmp/styles/{,*/}*.css', + '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}' + ] + } + }, + + // The actual grunt server settings + connect: { + options: { + port: 9000, + // Change this to '0.0.0.0' to access the server from outside. + hostname: 'localhost', + livereload: 35729 + }, + livereload: { + options: { + open: true, + middleware: function (connect) { + return [ + connect.static('.tmp'), + connect().use( + '/bower_components', + connect.static('./bower_components') + ), + connect().use( + '/app/styles', + connect.static('./app/styles') + ), + connect.static(appConfig.app) + ]; + } + } + }, + test: { + options: { + port: 9001, + middleware: function (connect) { + return [ + connect.static('.tmp'), + connect.static('test'), + connect().use( + '/bower_components', + connect.static('./bower_components') + ), + connect.static(appConfig.app) + ]; + } + } + }, + dist: { + options: { + open: true, + base: '<%= yeoman.dist %>' + } + } + }, + + // Make sure there are no obvious mistakes + jshint: { + options: { + jshintrc: '.jshintrc', + reporter: require('jshint-stylish') + }, + all: { + src: [ + 'Gruntfile.js', + '<%= yeoman.app %>/scripts/{,*/}*.js' + ] + }, + test: { + options: { + jshintrc: 'test/.jshintrc' + }, + src: ['test/spec/{,*/}*.js'] + } + }, + + // Make sure code styles are up to par + jscs: { + options: { + config: '.jscsrc', + verbose: true + }, + all: { + src: [ + 'Gruntfile.js', + '<%= yeoman.app %>/scripts/{,*/}*.js' + ] + }, + test: { + src: ['test/spec/{,*/}*.js'] + } + }, + + // Empties folders to start fresh + clean: { + dist: { + files: [{ + dot: true, + src: [ + '.tmp', + '<%= yeoman.dist %>/{,*/}*', + '!<%= yeoman.dist %>/.git{,*/}*' + ] + }] + }, + server: '.tmp' + }, + + // Add vendor prefixed styles + postcss: { + options: { + processors: [ + require('autoprefixer-core')({browsers: ['last 1 version']}) + ] + }, + server: { + options: { + map: true + }, + files: [{ + expand: true, + cwd: '.tmp/styles/', + src: '{,*/}*.css', + dest: '.tmp/styles/' + }] + }, + dist: { + files: [{ + expand: true, + cwd: '.tmp/styles/', + src: '{,*/}*.css', + dest: '.tmp/styles/' + }] + } + }, + + // Automatically inject Bower components into the app + wiredep: { + app: { + src: ['<%= yeoman.app %>/index.html'], + ignorePath: /\.\.\// + }, + test: { + devDependencies: true, + src: '<%= karma.unit.configFile %>', + ignorePath: /\.\.\//, + fileTypes:{ + js: { + block: /(([\s\t]*)\/{2}\s*?bower:\s*?(\S*))(\n|\r|.)*?(\/{2}\s*endbower)/gi, + detect: { + js: /'(.*\.js)'/gi + }, + replace: { + js: '\'{{filePath}}\',' + } + } + } + }, + sass: { + src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'], + ignorePath: /(\.\.\/){1,2}bower_components\// + } + }, + + // Compiles Sass to CSS and generates necessary files if requested + compass: { + options: { + sassDir: '<%= yeoman.app %>/styles', + cssDir: '.tmp/styles', + generatedImagesDir: '.tmp/images/generated', + imagesDir: '<%= yeoman.app %>/images', + javascriptsDir: '<%= yeoman.app %>/scripts', + fontsDir: '<%= yeoman.app %>/styles/fonts', + importPath: './bower_components', + httpImagesPath: '/images', + httpGeneratedImagesPath: '/images/generated', + httpFontsPath: '/styles/fonts', + relativeAssets: false, + assetCacheBuster: false, + raw: 'Sass::Script::Number.precision = 10\n' + }, + dist: { + options: { + generatedImagesDir: '<%= yeoman.dist %>/images/generated' + } + }, + server: { + options: { + sourcemap: true + } + } + }, + + // Renames files for browser caching purposes + filerev: { + dist: { + src: [ + '<%= yeoman.dist %>/scripts/{,*/}*.js', + '<%= yeoman.dist %>/styles/{,*/}*.css', + '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', + '<%= yeoman.dist %>/styles/fonts/*' + ] + } + }, + + // Reads HTML for usemin blocks to enable smart builds that automatically + // concat, minify and revision files. Creates configurations in memory so + // additional tasks can operate on them + useminPrepare: { + html: '<%= yeoman.app %>/index.html', + options: { + dest: '<%= yeoman.dist %>', + flow: { + html: { + steps: { + js: ['concat', 'uglifyjs'], + css: ['cssmin'] + }, + post: {} + } + } + } + }, + + // Performs rewrites based on filerev and the useminPrepare configuration + usemin: { + html: ['<%= yeoman.dist %>/{,*/}*.html'], + css: ['<%= yeoman.dist %>/styles/{,*/}*.css'], + js: ['<%= yeoman.dist %>/scripts/{,*/}*.js'], + options: { + assetsDirs: [ + '<%= yeoman.dist %>', + '<%= yeoman.dist %>/images', + '<%= yeoman.dist %>/styles' + ], + patterns: { + js: [[/(images\/[^''""]*\.(png|jpg|jpeg|gif|webp|svg))/g, 'Replacing references to images']] + } + } + }, + + // The following *-min tasks will produce minified files in the dist folder + // By default, your `index.html`'s will take care of + // minification. These next options are pre-configured if you do not wish + // to use the Usemin blocks. + // cssmin: { + // dist: { + // files: { + // '<%= yeoman.dist %>/styles/main.css': [ + // '.tmp/styles/{,*/}*.css' + // ] + // } + // } + // }, + // uglify: { + // dist: { + // files: { + // '<%= yeoman.dist %>/scripts/scripts.js': [ + // '<%= yeoman.dist %>/scripts/scripts.js' + // ] + // } + // } + // }, + // concat: { + // dist: {} + // }, + + imagemin: { + dist: { + files: [{ + expand: true, + cwd: '<%= yeoman.app %>/images', + src: '{,*/}*.{png,jpg,jpeg,gif}', + dest: '<%= yeoman.dist %>/images' + }] + } + }, + + svgmin: { + dist: { + files: [{ + expand: true, + cwd: '<%= yeoman.app %>/images', + src: '{,*/}*.svg', + dest: '<%= yeoman.dist %>/images' + }] + } + }, + + htmlmin: { + dist: { + options: { + collapseWhitespace: true, + conservativeCollapse: true, + collapseBooleanAttributes: true, + removeCommentsFromCDATA: true + }, + files: [{ + expand: true, + cwd: '<%= yeoman.dist %>', + src: ['*.html'], + dest: '<%= yeoman.dist %>' + }] + } + }, + + ngtemplates: { + dist: { + options: { + module: 'codeApp', + htmlmin: '<%= htmlmin.dist.options %>', + usemin: 'scripts/scripts.js' + }, + cwd: '<%= yeoman.app %>', + src: 'views/{,*/}*.html', + dest: '.tmp/templateCache.js' + } + }, + + // ng-annotate tries to make the code safe for minification automatically + // by using the Angular long form for dependency injection. + ngAnnotate: { + dist: { + files: [{ + expand: true, + cwd: '.tmp/concat/scripts', + src: '*.js', + dest: '.tmp/concat/scripts' + }] + } + }, + + // Replace Google CDN references + cdnify: { + dist: { + html: ['<%= yeoman.dist %>/*.html'] + } + }, + + // Copies remaining files to places other tasks can use + copy: { + dist: { + files: [{ + expand: true, + dot: true, + cwd: '<%= yeoman.app %>', + dest: '<%= yeoman.dist %>', + src: [ + '*.{ico,png,txt}', + '*.html', + 'images/{,*/}*.{webp}', + 'styles/fonts/{,*/}*.*' + ] + }, { + expand: true, + cwd: '.tmp/images', + dest: '<%= yeoman.dist %>/images', + src: ['generated/*'] + }, { + expand: true, + cwd: '.', + src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*', + dest: '<%= yeoman.dist %>' + }] + }, + styles: { + expand: true, + cwd: '<%= yeoman.app %>/styles', + dest: '.tmp/styles/', + src: '{,*/}*.css' + } + }, + + // Run some tasks in parallel to speed up the build process + concurrent: { + server: [ + 'compass:server' + ], + test: [ + 'compass' + ], + dist: [ + 'compass:dist', + 'imagemin', + 'svgmin' + ] + }, + + // Test settings + karma: { + unit: { + configFile: 'test/karma.conf.js', + singleRun: true + } + } + }); + + + grunt.registerTask('serve', 'Compile then start a connect web server', function (target) { + if (target === 'dist') { + return grunt.task.run(['build', 'connect:dist:keepalive']); + } + + grunt.task.run([ + 'clean:server', + 'wiredep', + 'concurrent:server', + 'postcss:server', + 'connect:livereload', + 'watch' + ]); + }); + + grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) { + grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); + grunt.task.run(['serve:' + target]); + }); + + grunt.registerTask('test', [ + 'clean:server', + 'wiredep', + 'concurrent:test', + 'postcss', + 'connect:test', + 'karma' + ]); + + grunt.registerTask('build', [ + 'clean:dist', + 'wiredep', + 'useminPrepare', + 'concurrent:dist', + 'postcss', + 'ngtemplates', + 'concat', + 'ngAnnotate', + 'copy:dist', + 'cdnify', + 'cssmin', + 'uglify', + 'filerev', + 'usemin', + 'htmlmin' + ]); + + grunt.registerTask('default', [ + 'newer:jshint', + 'newer:jscs', + 'test', + 'build' + ]); +}; diff --git a/app/404.html b/app/404.html new file mode 100644 index 0000000000000000000000000000000000000000..899828a3c27aee4d57c463792ee2d13bd7caf974 --- /dev/null +++ b/app/404.html @@ -0,0 +1,152 @@ + + + + + Page Not Found :( + + + +
+

Not found :(

+

Sorry, but the page you were trying to view does not exist.

+

It looks like this was the result of either:

+ + + +
+ + diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6527905307f19ba00762f9241f7eb535fa84a2f9 Binary files /dev/null and b/app/favicon.ico differ diff --git a/app/images/yeoman.png b/app/images/yeoman.png new file mode 100644 index 0000000000000000000000000000000000000000..92497addf96c5c009ac24007f55eb989f3bf74c6 Binary files /dev/null and b/app/images/yeoman.png differ diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000000000000000000000000000000000000..805d05f2d10f0cb0c9762224624991bae59250c6 --- /dev/null +++ b/app/index.html @@ -0,0 +1,32 @@ + + + + + Movie Search + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + diff --git a/app/robots.txt b/app/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..4d521f952625bfae6d3e769c30e45275d351df11 --- /dev/null +++ b/app/robots.txt @@ -0,0 +1,4 @@ +# robotstxt.org + +User-agent: * +Disallow: diff --git a/app/scripts/app.js b/app/scripts/app.js new file mode 100644 index 0000000000000000000000000000000000000000..9e8422dc20d1da7f5409c7d5a281758d9daba7a8 --- /dev/null +++ b/app/scripts/app.js @@ -0,0 +1,22 @@ +'use strict'; + +angular.module('movieSearch', [ + 'ngCookies', + 'ngResource', + 'ngRoute', + ]) + + .config(function ($routeProvider) { + $routeProvider + .when('/', { + templateUrl: 'views/all.html', + controller: 'searchCtrl' + }) + .when('/detail/:idMovie', { + templateUrl: 'views/detail.html', + controller: 'detailCtrl' + }) + .otherwise({ + redirectTo: '/' + }); + }); diff --git a/app/scripts/controllers.js b/app/scripts/controllers.js new file mode 100644 index 0000000000000000000000000000000000000000..66aba5a15ebb96e06fd248965eece8afe676701d --- /dev/null +++ b/app/scripts/controllers.js @@ -0,0 +1,24 @@ +angular.module('movieSearch') + +.controller('searchCtrl', function searchCtrl($scope, searchFactory) { + $scope.items = searchFactory.allMoviesResource.get(successFn, errorFn); + + function successFn() { + $scope.items = $scope.items["Search"] + console.log($scope.items) + } + function errorFn() { + console.error("Erreur dans la lecture de l'API") + } +}) + +.controller('detailCtrl', function searchCtrl($scope, $routeParams, searchFactory) { + $scope.movie = searchFactory.detailMovieResource.get({idMovie: $routeParams.idMovie}); + + function successFn() { + console.log($scope.movie) + } + function errorFn() { + console.error("Erreur dans la lecture de l'API") + } +}); diff --git a/app/scripts/filter.js b/app/scripts/filter.js new file mode 100644 index 0000000000000000000000000000000000000000..1e3a62a91d06b7cba1b69dbb741c5ae867153d90 --- /dev/null +++ b/app/scripts/filter.js @@ -0,0 +1,26 @@ +angular.module('movieSearch') + +.filter('searchFor', function(){ + return function(arr, searchString){ + + if(!searchString){ + return arr; + } + + var result = []; + console.log(searchString) + searchString = searchString.toLowerCase(); + + // Using the forEach helper method to loop through the array + angular.forEach(arr, function(item){ + + if(item.Title.toLowerCase().indexOf(searchString) !== -1){ + result.push(item); + } + + }); + + return result; + }; + +}); diff --git a/app/scripts/services.js b/app/scripts/services.js new file mode 100644 index 0000000000000000000000000000000000000000..47f56a5cbd0b33633424e5f3589b9bb406a2419f --- /dev/null +++ b/app/scripts/services.js @@ -0,0 +1,13 @@ +angular.module('movieSearch') + +.factory('searchFactory', function($resource) { + + var allMoviesResource = $resource('http://www.omdbapi.com/?s=la&y=&plot=short&r=json&page=1'); + var detailMovieResource = $resource('http://www.omdbapi.com/?i=:idMovie&plot=short&r=json', + {idMovie:'@idMovie'} + ); + return { + allMoviesResource: allMoviesResource, + detailMovieResource: detailMovieResource + }; +}); diff --git a/app/styles/main.css b/app/styles/main.css new file mode 100644 index 0000000000000000000000000000000000000000..0f0655668459b8aad530c2852190e8772f14856d --- /dev/null +++ b/app/styles/main.css @@ -0,0 +1,89 @@ +*{ + margin:0; + padding:0; +} + +body{ + font:15px/1.3 'Open Sans', sans-serif; + color: #5e5b64; + text-align:center; +} + +a, a:visited { + outline:none; + color:#389dc1; +} + +a:hover{ + text-decoration:none; +} + +section, footer, header, aside, nav{ + display: block; +} + +/*------------------------- + The search input +--------------------------*/ + +.bar{ + background-color:#5c9bb7; + + background-image:-webkit-linear-gradient(top, #5c9bb7, #5392ad); + background-image:-moz-linear-gradient(top, #5c9bb7, #5392ad); + background-image:linear-gradient(top, #5c9bb7, #5392ad); + + box-shadow: 0 1px 1px #ccc; + border-radius: 2px; + width: 400px; + padding: 14px; + margin: 45px auto 20px; + position:relative; +} + +.bar input{ + background:#fff no-repeat 13px 13px; + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU5NEY0RTlFMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU5NEY0RTlGMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTk0RjRFOUMxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTk0RjRFOUQxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4DjA/RAAABK0lEQVR42pTSQUdEURjG8dOY0TqmPkGmRcqYD9CmzZAWJRHVRIa0iFYtM6uofYaiEW2SRJtEi9YxIklp07ZkWswu0v/wnByve7vm5ee8M+85zz1jbt9Os+WiGkYdYxjCOx5wgFeXUHmtBSzpcCGa+5BJTCjEP+0nKWAT8xqe4ArPGEEVC1hHEbs2oBwdXkM7mj/JLZrad437sCGHOfUtcziutuYu2v8XUFF/4f6vMK/YgAH1HxkBYV60AR31gxkBYd6xAeF3VzMCwvzOBpypX8V4yuFRzX2d2gD/l5yjH4fYQEnzkj4fae5rJulF2sMXVrAsaTWttRFu4Osb+1jEDT71/ZveyhouTch2fINQL9hKefKjuYFfuznXWzXMTabyrvfyIV3M4vhXgAEAUMs7K0J9UJAAAAAASUVORK5CYII=); + + border: none; + width: 100%; + line-height: 19px; + padding: 11px 0; + + border-radius: 2px; + box-shadow: 0 2px 8px #c4c4c4 inset; + text-align: left; + font-size: 14px; + font-family: inherit; + color: #738289; + font-weight: bold; + outline: none; + text-indent: 40px; +} + +ul{ + list-style: none; + width: 428px; + margin: 0 auto; + text-align: left; +} + +ul li{ + border-bottom: 1px solid #ddd; + padding: 10px; + overflow: hidden; +} + +ul li img{ + width:60px; + height:60px; + float:left; + border:none; +} + +ul li p{ + margin-left: 75px; + font-weight: bold; + padding-top: 12px; + color:#6e7a7f; +} diff --git a/app/views/all.html b/app/views/all.html new file mode 100644 index 0000000000000000000000000000000000000000..19aa3e431f01f2215c32d7e8a482258455eec604 --- /dev/null +++ b/app/views/all.html @@ -0,0 +1,9 @@ +
+ +
+ diff --git a/app/views/detail.html b/app/views/detail.html new file mode 100644 index 0000000000000000000000000000000000000000..624925921f72339878d8ba0c1666cae40f74e965 --- /dev/null +++ b/app/views/detail.html @@ -0,0 +1,7 @@ + diff --git a/bower.json b/bower.json new file mode 100644 index 0000000000000000000000000000000000000000..f25631f48c8c9d78e4f0f4ce4f0d54c2f25117d3 --- /dev/null +++ b/bower.json @@ -0,0 +1,28 @@ +{ + "name": "code", + "version": "0.0.0", + "dependencies": { + "angular": "^1.4.0", + "bootstrap-sass-official": "^3.2.0", + "angular-animate": "^1.4.0", + "angular-cookies": "^1.4.0", + "angular-resource": "^1.4.0", + "angular-route": "^1.4.0", + "angular-sanitize": "^1.4.0", + "angular-touch": "^1.4.0" + }, + "devDependencies": { + "angular-mocks": "^1.4.0" + }, + "appPath": "app", + "moduleName": "codeApp", + "overrides": { + "bootstrap": { + "main": [ + "less/bootstrap.less", + "dist/css/bootstrap.css", + "dist/js/bootstrap.js" + ] + } + } +} diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 0000000000000000000000000000000000000000..1cc8a8ea35f86a65cfddc8559f201f0d62479332 --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,99 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/usr/bin/node', +1 verbose cli '/usr/local/bin/npm', +1 verbose cli 'install', +1 verbose cli 'fsevents', +1 verbose cli '--save-devs' ] +2 info using npm@3.10.5 +3 info using node@v5.2.0 +4 silly loadCurrentTree Starting +5 silly install loadCurrentTree +6 silly install readLocalPackageData +7 silly fetchPackageMetaData fsevents +8 silly fetchNamedPackageData fsevents +9 silly mapToRegistry name fsevents +10 silly mapToRegistry using default registry +11 silly mapToRegistry registry https://registry.npmjs.org/ +12 silly mapToRegistry data Result { +12 silly mapToRegistry raw: 'fsevents', +12 silly mapToRegistry scope: null, +12 silly mapToRegistry escapedName: 'fsevents', +12 silly mapToRegistry name: 'fsevents', +12 silly mapToRegistry rawSpec: '', +12 silly mapToRegistry spec: 'latest', +12 silly mapToRegistry type: 'tag' } +13 silly mapToRegistry uri https://registry.npmjs.org/fsevents +14 verbose request uri https://registry.npmjs.org/fsevents +15 verbose request no auth needed +16 info attempt registry request try #1 at 16:44:08 +17 verbose request id e089d9cde2968d17 +18 verbose etag "J1WMJADQEUBTKGSOYI5A2X04" +19 http request GET https://registry.npmjs.org/fsevents +20 http 304 https://registry.npmjs.org/fsevents +21 verbose headers { date: 'Thu, 13 Oct 2016 14:44:08 GMT', +21 verbose headers via: '1.1 varnish', +21 verbose headers 'cache-control': 'max-age=300', +21 verbose headers etag: '"J1WMJADQEUBTKGSOYI5A2X04"', +21 verbose headers age: '174', +21 verbose headers connection: 'keep-alive', +21 verbose headers 'x-served-by': 'cache-cdg8733-CDG', +21 verbose headers 'x-cache': 'HIT', +21 verbose headers 'x-cache-hits': '8', +21 verbose headers 'x-timer': 'S1476369848.391218,VS0,VE0', +21 verbose headers vary: 'Accept-Encoding' } +22 silly get cb [ 304, +22 silly get { date: 'Thu, 13 Oct 2016 14:44:08 GMT', +22 silly get via: '1.1 varnish', +22 silly get 'cache-control': 'max-age=300', +22 silly get etag: '"J1WMJADQEUBTKGSOYI5A2X04"', +22 silly get age: '174', +22 silly get connection: 'keep-alive', +22 silly get 'x-served-by': 'cache-cdg8733-CDG', +22 silly get 'x-cache': 'HIT', +22 silly get 'x-cache-hits': '8', +22 silly get 'x-timer': 'S1476369848.391218,VS0,VE0', +22 silly get vary: 'Accept-Encoding' } ] +23 verbose etag https://registry.npmjs.org/fsevents from cache +24 verbose get saving fsevents to /home/artix41/.npm/registry.npmjs.org/fsevents/.cache.json +25 verbose correctMkdir /home/artix41/.npm correctMkdir not in flight; initializing +26 silly install normalizeTree +27 silly loadCurrentTree Finishing +28 silly loadIdealTree Starting +29 silly install loadIdealTree +30 silly cloneCurrentTree Starting +31 silly install cloneCurrentTreeToIdealTree +32 silly cloneCurrentTree Finishing +33 silly loadShrinkwrap Starting +34 silly install loadShrinkwrap +35 silly loadShrinkwrap Finishing +36 silly loadAllDepsIntoIdealTree Starting +37 silly install loadAllDepsIntoIdealTree +38 silly rollbackFailedOptional Starting +39 silly rollbackFailedOptional Finishing +40 silly runTopLevelLifecycles Starting +41 silly runTopLevelLifecycles Finishing +42 silly install printInstalled +43 verbose stack Error: Unsupported platform for fsevents@1.0.14: wanted {"name":"fsevents","version":"1.0.14","description":"Native Access to Mac OS-X FSEvents","main":"fsevents.js","dependencies":{"nan":"^2.3.0","node-pre-gyp":"^0.6.29"},"os":["darwin"],"engines":{"node":">=0.8.0"},"scripts":{"install":"node-pre-gyp install --fallback-to-build","prepublish":"if [ $(npm -v | head -c 1) -lt 3 ]; then exit 1; fi && npm dedupe","test":"tap ./test"},"binary":{"module_name":"fse","module_path":"./lib/binding/{configuration}/{node_abi}-{platform}-{arch}/","remote_path":"./v{version}/","package_name":"{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz","host":"https://fsevents-binaries.s3-us-west-2.amazonaws.com"},"repository":{"type":"git","url":"git+https://github.com/strongloop/fsevents.git"},"keywords":["fsevents","mac"],"author":{"name":"Philipp Dunkel","email":"pip@pipobscure.com"},"license":"MIT","bugs":{"url":"https://github.com/strongloop/fsevents/issues"},"homepage":"https://github.com/strongloop/fsevents","devDependencies":{"tap":"~0.4.8"},"gitHead":"fe059ea77fae15ed289271eecc881a2b7fb54edd","bundleDependencies":["node-pre-gyp"],"_id":"fsevents@1.0.14","_shasum":"558e8cc38643d8ef40fe45158486d0d25758eee4","_from":"fsevents","_npmVersion":"3.6.0","_nodeVersion":"5.6.0","_npmUser":{"name":"es128","email":"elan.shanker+npm@gmail.com"},"dist":{"shasum":"558e8cc38643d8ef40fe45158486d0d25758eee4","tarball":"https://registry.npmjs.org/fsevents/-/fsevents-1.0.14.tgz"},"maintainers":[{"name":"bajtos","email":"miro.bajtos@gmail.com"},{"name":"bnoordhuis","email":"info@bnoordhuis.nl"},{"name":"es128","email":"elan.shanker+npm@gmail.com"},{"name":"pipobscure","email":"pip@pipobscure.com"},{"name":"strongloop","email":"callback@strongloop.com"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/fsevents-1.0.14.tgz_1468846610948_0.4684492303058505"},"directories":{},"_resolved":"https://registry.npmjs.org/fsevents/-/fsevents-1.0.14.tgz","_requested":{"raw":"fsevents","scope":null,"escapedName":"fsevents","name":"fsevents","rawSpec":"","spec":"latest","type":"tag"},"_spec":"fsevents","_where":"/home/artix41/ENSTA/DaTA/Formations/AngularJS/Code","_args":[[{"raw":"fsevents","scope":null,"escapedName":"fsevents","name":"fsevents","rawSpec":"","spec":"latest","type":"tag"},"/home/artix41/ENSTA/DaTA/Formations/AngularJS/Code"]],"readme":"ERROR: No README data found!"} (current: {"os":"linux","cpu":"x64"}) +43 verbose stack at checkPlatform (/usr/local/lib/node_modules/npm/node_modules/npm-install-checks/index.js:45:14) +43 verbose stack at thenWarnEngineIssues (/usr/local/lib/node_modules/npm/lib/install/validate-args.js:41:5) +43 verbose stack at /usr/local/lib/node_modules/npm/node_modules/iferr/index.js:13:50 +43 verbose stack at checkEngine (/usr/local/lib/node_modules/npm/node_modules/npm-install-checks/index.js:24:10) +43 verbose stack at module.exports.isInstallable (/usr/local/lib/node_modules/npm/lib/install/validate-args.js:38:3) +43 verbose stack at Array. (/usr/local/lib/node_modules/npm/node_modules/slide/lib/bind-actor.js:15:8) +43 verbose stack at LOOP (/usr/local/lib/node_modules/npm/node_modules/slide/lib/chain.js:15:14) +43 verbose stack at /usr/local/lib/node_modules/npm/node_modules/slide/lib/chain.js:18:7 +43 verbose stack at checkSelf (/usr/local/lib/node_modules/npm/lib/install/validate-args.js:46:72) +43 verbose stack at Array. (/usr/local/lib/node_modules/npm/node_modules/slide/lib/bind-actor.js:15:8) +44 verbose pkgid fsevents@1.0.14 +45 verbose cwd /home/artix41/ENSTA/DaTA/Formations/AngularJS/Code +46 error Linux 3.16.0-67-generic +47 error argv "/usr/bin/node" "/usr/local/bin/npm" "install" "fsevents" "--save-devs" +48 error node v5.2.0 +49 error npm v3.10.5 +50 error code EBADPLATFORM +51 error notsup Not compatible with your operating system or architecture: fsevents@1.0.14 +52 error notsup Valid OS: darwin +52 error notsup Valid Arch: any +52 error notsup Actual OS: linux +52 error notsup Actual Arch: x64 +53 verbose exit [ 1, true ] diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..128132478ffc2900abb2b753f50ac9264b3ade28 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "code", + "private": true, + "devDependencies": { + "autoprefixer-core": "^5.2.1", + "grunt": "^0.4.5", + "grunt-angular-templates": "^0.5.7", + "grunt-concurrent": "^1.0.0", + "grunt-contrib-clean": "^0.6.0", + "grunt-contrib-compass": "^1.1.1", + "grunt-contrib-concat": "^0.5.0", + "grunt-contrib-connect": "^0.9.0", + "grunt-contrib-copy": "^0.7.0", + "grunt-contrib-cssmin": "^0.12.0", + "grunt-contrib-htmlmin": "^0.4.0", + "grunt-contrib-imagemin": "^1.0.0", + "grunt-contrib-jshint": "^0.11.0", + "grunt-contrib-uglify": "^0.7.0", + "grunt-contrib-watch": "^0.6.1", + "grunt-filerev": "^2.1.2", + "grunt-google-cdn": "^0.4.3", + "grunt-jscs": "^1.8.0", + "grunt-newer": "^1.1.0", + "grunt-ng-annotate": "^0.9.2", + "grunt-postcss": "^0.5.5", + "grunt-svgmin": "^2.0.0", + "grunt-usemin": "^3.0.0", + "grunt-wiredep": "^2.0.0", + "jit-grunt": "^0.9.1", + "jshint-stylish": "^1.0.0", + "time-grunt": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "karma start test/karma.conf.js" + } +} diff --git a/test/.jshintrc b/test/.jshintrc new file mode 100644 index 0000000000000000000000000000000000000000..b2ce4eff44a0af0767198b91be08a67fe21b0b09 --- /dev/null +++ b/test/.jshintrc @@ -0,0 +1,18 @@ +{ + "bitwise": true, + "browser": true, + "curly": true, + "eqeqeq": true, + "esnext": true, + "jasmine": true, + "latedef": true, + "noarg": true, + "node": true, + "strict": true, + "undef": true, + "unused": true, + "globals": { + "angular": false, + "inject": false + } +} diff --git a/test/karma.conf.js b/test/karma.conf.js new file mode 100644 index 0000000000000000000000000000000000000000..f25494739b0f7b95b5cfb6128b2d08587c718a50 --- /dev/null +++ b/test/karma.conf.js @@ -0,0 +1,81 @@ +// Karma configuration +// Generated on 2016-10-13 + +module.exports = function(config) { + 'use strict'; + + config.set({ + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + // base path, that will be used to resolve files and exclude + basePath: '../', + + // testing framework to use (jasmine/mocha/qunit/...) + // as well as any additional frameworks (requirejs/chai/sinon/...) + frameworks: [ + 'jasmine' + ], + + // list of files / patterns to load in the browser + files: [ + // bower:js + 'bower_components/jquery/dist/jquery.js', + 'bower_components/angular/angular.js', + 'bower_components/bootstrap-sass-official/assets/javascripts/bootstrap.js', + 'bower_components/angular-animate/angular-animate.js', + 'bower_components/angular-cookies/angular-cookies.js', + 'bower_components/angular-resource/angular-resource.js', + 'bower_components/angular-route/angular-route.js', + 'bower_components/angular-sanitize/angular-sanitize.js', + 'bower_components/angular-touch/angular-touch.js', + 'bower_components/angular-mocks/angular-mocks.js', + // endbower + 'app/scripts/**/*.js', + 'test/mock/**/*.js', + 'test/spec/**/*.js' + ], + + // list of files / patterns to exclude + exclude: [ + ], + + // web server port + port: 8080, + + // Start these browsers, currently available: + // - Chrome + // - ChromeCanary + // - Firefox + // - Opera + // - Safari (only Mac) + // - PhantomJS + // - IE (only Windows) + browsers: [ + 'PhantomJS' + ], + + // Which plugins to enable + plugins: [ + 'karma-phantomjs-launcher', + 'karma-jasmine' + ], + + // Continuous Integration mode + // if true, it capture browsers, run tests and exit + singleRun: false, + + colors: true, + + // level of logging + // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG + logLevel: config.LOG_INFO, + + // Uncomment the following lines if you are using grunt's server to run the tests + // proxies: { + // '/': 'http://localhost:9000/' + // }, + // URL root prevent conflicts with the site root + // urlRoot: '_karma_' + }); +}; diff --git a/test/spec/controllers/about.js b/test/spec/controllers/about.js new file mode 100644 index 0000000000000000000000000000000000000000..6a176ebe7e899fae305dbc1654b662eaf0068135 --- /dev/null +++ b/test/spec/controllers/about.js @@ -0,0 +1,23 @@ +'use strict'; + +describe('Controller: AboutCtrl', function () { + + // load the controller's module + beforeEach(module('codeApp')); + + var AboutCtrl, + scope; + + // Initialize the controller and a mock scope + beforeEach(inject(function ($controller, $rootScope) { + scope = $rootScope.$new(); + AboutCtrl = $controller('AboutCtrl', { + $scope: scope + // place here mocked dependencies + }); + })); + + it('should attach a list of awesomeThings to the scope', function () { + expect(AboutCtrl.awesomeThings.length).toBe(3); + }); +}); diff --git a/test/spec/controllers/main.js b/test/spec/controllers/main.js new file mode 100644 index 0000000000000000000000000000000000000000..1f3cbf47c17067bad15c7eb56d82575c284455ae --- /dev/null +++ b/test/spec/controllers/main.js @@ -0,0 +1,23 @@ +'use strict'; + +describe('Controller: MainCtrl', function () { + + // load the controller's module + beforeEach(module('codeApp')); + + var MainCtrl, + scope; + + // Initialize the controller and a mock scope + beforeEach(inject(function ($controller, $rootScope) { + scope = $rootScope.$new(); + MainCtrl = $controller('MainCtrl', { + $scope: scope + // place here mocked dependencies + }); + })); + + it('should attach a list of awesomeThings to the scope', function () { + expect(MainCtrl.awesomeThings.length).toBe(3); + }); +});