diff --git a/cour01/Angular-Exo01/.gitignore b/cour01/Angular-Exo01/.gitignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/cour01/Angular-Exo01/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/cour01/Angular-Exo01/css/my.css b/cour01/Angular-Exo01/css/my.css
new file mode 100644
index 0000000..2470de6
--- /dev/null
+++ b/cour01/Angular-Exo01/css/my.css
@@ -0,0 +1,3 @@
+p{
+ color: blue;
+}
\ No newline at end of file
diff --git a/cour01/Angular-Exo01/index.html b/cour01/Angular-Exo01/index.html
new file mode 100644
index 0000000..a961865
--- /dev/null
+++ b/cour01/Angular-Exo01/index.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hello Pizza!
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cour01/Angular-Exo01/js/my.js b/cour01/Angular-Exo01/js/my.js
new file mode 100644
index 0000000..0eb2e9d
--- /dev/null
+++ b/cour01/Angular-Exo01/js/my.js
@@ -0,0 +1,28 @@
+var a = 0;
+function alertFood() {
+ var food = [
+ "Pasta",
+ "Pizza",
+ "Salade"
+ ];
+
+ alert(food[a]);
+
+ a++;
+ if (a == 3) {
+ a = 0;
+ }
+}
+
+var plats = [
+ { 'plat': 'pasta', 'prix': 10 },
+ { 'plat': 'pizza', 'prix': 12 },
+ { 'plat': 'salade', 'prix': 8 }
+];
+
+function showPrice(food) {
+ $("#myFood").text(food);
+
+ var index = _.findIndex(plats, function(o) { return o.plat == food; });
+ alert(plats[index].prix);
+}
\ No newline at end of file
diff --git a/cour01/Angular-Exo01/package.json b/cour01/Angular-Exo01/package.json
new file mode 100644
index 0000000..b7b7a86
--- /dev/null
+++ b/cour01/Angular-Exo01/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "test",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "bootstrap": "^4.0.0",
+ "jquery": "^3.3.1",
+ "lodash": "^4.17.4",
+ "popper.js": "^1.12.9"
+ }
+}
diff --git a/cour02/Angular-Exo02/.bowerrc b/cour02/Angular-Exo02/.bowerrc
new file mode 100644
index 0000000..0eed5ab
--- /dev/null
+++ b/cour02/Angular-Exo02/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory" : "bower_components"
+}
diff --git a/cour02/Angular-Exo02/.editorconfig b/cour02/Angular-Exo02/.editorconfig
new file mode 100644
index 0000000..0ea0cc4
--- /dev/null
+++ b/cour02/Angular-Exo02/.editorconfig
@@ -0,0 +1,10 @@
+# http://editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/cour02/Angular-Exo02/.gitignore b/cour02/Angular-Exo02/.gitignore
new file mode 100644
index 0000000..a088b6f
--- /dev/null
+++ b/cour02/Angular-Exo02/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+bower_components
diff --git a/cour02/Angular-Exo02/.jshintrc b/cour02/Angular-Exo02/.jshintrc
new file mode 100644
index 0000000..3b7fe5c
--- /dev/null
+++ b/cour02/Angular-Exo02/.jshintrc
@@ -0,0 +1,31 @@
+{
+ "curly": true,
+ "eqeqeq": true,
+ "immed": true,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "sub": true,
+ "undef": true,
+ "boss": true,
+ "eqnull": true,
+ "browser": true,
+ "smarttabs": true,
+ "globals": {
+ "jQuery": true,
+ "angular": true,
+ "console": true,
+ "$": true,
+ "_": true,
+ "moment": true,
+ "describe": true,
+ "beforeEach": true,
+ "module": true,
+ "inject": true,
+ "it": true,
+ "expect": true,
+ "xdescribe": true,
+ "xit": true,
+ "spyOn": true
+ }
+}
diff --git a/cour02/Angular-Exo02/.npmignore b/cour02/Angular-Exo02/.npmignore
new file mode 100644
index 0000000..1b89ac3
--- /dev/null
+++ b/cour02/Angular-Exo02/.npmignore
@@ -0,0 +1,6 @@
+temp/
+dist/
+node_modules/
+_SpecRunner.html
+.DS_Store
+test-results.xml
\ No newline at end of file
diff --git a/cour02/Angular-Exo02/.yo-rc.json b/cour02/Angular-Exo02/.yo-rc.json
new file mode 100644
index 0000000..4b5a87e
--- /dev/null
+++ b/cour02/Angular-Exo02/.yo-rc.json
@@ -0,0 +1,23 @@
+{
+ "generator-cg-angular": {
+ "uirouter": false,
+ "partialDirectory": "partial/",
+ "modalDirectory": "partial/",
+ "directiveDirectory": "directive/",
+ "filterDirectory": "filter/",
+ "serviceDirectory": "service/",
+ "inject": {
+ "js": {
+ "file": "index.html",
+ "marker": "",
+ "template": ""
+ },
+ "less": {
+ "relativeToModule": true,
+ "file": "<%= module %>.less",
+ "marker": "/* Add Component LESS Above */",
+ "template": "@import \"<%= filename %>\";"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/cour02/Angular-Exo02/Gruntfile.js b/cour02/Angular-Exo02/Gruntfile.js
new file mode 100644
index 0000000..017164a
--- /dev/null
+++ b/cour02/Angular-Exo02/Gruntfile.js
@@ -0,0 +1,244 @@
+/*jslint node: true */
+'use strict';
+
+var pkg = require('./package.json');
+
+//Using exclusion patterns slows down Grunt significantly
+//instead of creating a set of patterns like '**/*.js' and '!**/node_modules/**'
+//this method is used to create a set of inclusive patterns for all subdirectories
+//skipping node_modules, bower_components, dist, and any .dirs
+//This enables users to create any directory structure they desire.
+var createFolderGlobs = function(fileTypePatterns) {
+ fileTypePatterns = Array.isArray(fileTypePatterns) ? fileTypePatterns : [fileTypePatterns];
+ var ignore = ['node_modules','bower_components','dist','temp'];
+ var fs = require('fs');
+ return fs.readdirSync(process.cwd())
+ .map(function(file){
+ if (ignore.indexOf(file) !== -1 ||
+ file.indexOf('.') === 0 ||
+ !fs.lstatSync(file).isDirectory()) {
+ return null;
+ } else {
+ return fileTypePatterns.map(function(pattern) {
+ return file + '/**/' + pattern;
+ });
+ }
+ })
+ .filter(function(patterns){
+ return patterns;
+ })
+ .concat(fileTypePatterns);
+};
+
+module.exports = function (grunt) {
+
+ // load all grunt tasks
+ require('load-grunt-tasks')(grunt);
+
+ // Project configuration.
+ grunt.initConfig({
+ connect: {
+ main: {
+ options: {
+ port: 9001
+ }
+ }
+ },
+ watch: {
+ main: {
+ options: {
+ livereload: true,
+ livereloadOnError: false,
+ spawn: false
+ },
+ files: [createFolderGlobs(['*.js','*.less','*.html']),'!_SpecRunner.html','!.grunt'],
+ tasks: [] //all the tasks are run dynamically during the watch event handler
+ }
+ },
+ jshint: {
+ main: {
+ options: {
+ jshintrc: '.jshintrc',
+ reporterOutput: ''
+ },
+ src: createFolderGlobs('*.js')
+ }
+ },
+ clean: {
+ before:{
+ src:['dist','temp']
+ },
+ after: {
+ src:['temp']
+ }
+ },
+ less: {
+ production: {
+ options: {
+ },
+ files: {
+ 'temp/app.css': 'app.less'
+ }
+ }
+ },
+ ngtemplates: {
+ main: {
+ options: {
+ module: pkg.name,
+ htmlmin:'<%= htmlmin.main.options %>'
+ },
+ src: [createFolderGlobs('*.html'),'!index.html','!_SpecRunner.html'],
+ dest: 'temp/templates.js'
+ }
+ },
+ copy: {
+ main: {
+ files: [
+ {src: ['img/**'], dest: 'dist/'},
+ {src: ['bower_components/font-awesome/fonts/**'], dest: 'dist/',filter:'isFile',expand:true},
+ {src: ['bower_components/bootstrap/fonts/**'], dest: 'dist/',filter:'isFile',expand:true}
+ //{src: ['bower_components/angular-ui-utils/ui-utils-ieshiv.min.js'], dest: 'dist/'},
+ //{src: ['bower_components/select2/*.png','bower_components/select2/*.gif'], dest:'dist/css/',flatten:true,expand:true},
+ //{src: ['bower_components/angular-mocks/angular-mocks.js'], dest: 'dist/'}
+ ]
+ }
+ },
+ dom_munger:{
+ read: {
+ options: {
+ read:[
+ {selector:'script[data-concat!="false"]',attribute:'src',writeto:'appjs'},
+ {selector:'link[rel="stylesheet"][data-concat!="false"]',attribute:'href',writeto:'appcss'}
+ ]
+ },
+ src: 'index.html'
+ },
+ update: {
+ options: {
+ remove: ['script[data-remove!="false"]','link[data-remove!="false"]'],
+ append: [
+ {selector:'body',html:''},
+ {selector:'head',html:''}
+ ]
+ },
+ src:'index.html',
+ dest: 'dist/index.html'
+ }
+ },
+ cssmin: {
+ main: {
+ src:['temp/app.css','<%= dom_munger.data.appcss %>'],
+ dest:'dist/app.full.min.css'
+ }
+ },
+ concat: {
+ main: {
+ src: ['<%= dom_munger.data.appjs %>','<%= ngtemplates.main.dest %>'],
+ dest: 'temp/app.full.js'
+ }
+ },
+ ngAnnotate: {
+ main: {
+ src:'temp/app.full.js',
+ dest: 'temp/app.full.js'
+ }
+ },
+ uglify: {
+ main: {
+ src: 'temp/app.full.js',
+ dest:'dist/app.full.min.js'
+ }
+ },
+ htmlmin: {
+ main: {
+ options: {
+ collapseBooleanAttributes: true,
+ collapseWhitespace: true,
+ removeAttributeQuotes: true,
+ removeComments: true,
+ removeEmptyAttributes: true,
+ removeScriptTypeAttributes: true,
+ removeStyleLinkTypeAttributes: true
+ },
+ files: {
+ 'dist/index.html': 'dist/index.html'
+ }
+ }
+ },
+ //Imagemin has issues on Windows.
+ //To enable imagemin:
+ // - "npm install grunt-contrib-imagemin"
+ // - Comment in this section
+ // - Add the "imagemin" task after the "htmlmin" task in the build task alias
+ // imagemin: {
+ // main:{
+ // files: [{
+ // expand: true, cwd:'dist/',
+ // src:['**/{*.png,*.jpg}'],
+ // dest: 'dist/'
+ // }]
+ // }
+ // },
+ karma: {
+ options: {
+ frameworks: ['jasmine'],
+ files: [ //this files data is also updated in the watch handler, if updated change there too
+ '<%= dom_munger.data.appjs %>',
+ 'bower_components/angular-mocks/angular-mocks.js',
+ createFolderGlobs('*-spec.js')
+ ],
+ logLevel:'ERROR',
+ reporters:['mocha'],
+ autoWatch: false, //watching is handled by grunt-contrib-watch
+ singleRun: true
+ },
+ all_tests: {
+ browsers: ['PhantomJS','Chrome','Firefox']
+ },
+ during_watch: {
+ browsers: ['PhantomJS']
+ },
+ }
+ });
+
+ grunt.registerTask('build',['jshint','clean:before','less','dom_munger','ngtemplates','cssmin','concat','ngAnnotate','uglify','copy','htmlmin','clean:after']);
+ grunt.registerTask('serve', ['dom_munger:read','jshint','connect', 'watch']);
+ grunt.registerTask('test',['dom_munger:read','karma:all_tests']);
+
+ grunt.event.on('watch', function(action, filepath) {
+ //https://github.com/gruntjs/grunt-contrib-watch/issues/156
+
+ var tasksToRun = [];
+
+ if (filepath.lastIndexOf('.js') !== -1 && filepath.lastIndexOf('.js') === filepath.length - 3) {
+
+ //lint the changed js file
+ grunt.config('jshint.main.src', filepath);
+ tasksToRun.push('jshint');
+
+ //find the appropriate unit test for the changed file
+ var spec = filepath;
+ if (filepath.lastIndexOf('-spec.js') === -1 || filepath.lastIndexOf('-spec.js') !== filepath.length - 8) {
+ spec = filepath.substring(0,filepath.length - 3) + '-spec.js';
+ }
+
+ //if the spec exists then lets run it
+ if (grunt.file.exists(spec)) {
+ var files = [].concat(grunt.config('dom_munger.data.appjs'));
+ files.push('bower_components/angular-mocks/angular-mocks.js');
+ files.push(spec);
+ grunt.config('karma.options.files', files);
+ tasksToRun.push('karma:during_watch');
+ }
+ }
+
+ //if index.html changed, we need to reread the
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+