Skip to content
Snippets Groups Projects
Commit 86fc5be9 authored by Zoe Canoen's avatar Zoe Canoen
Browse files

init tp

parents
Branches
No related tags found
No related merge requests found
Showing
with 455 additions and 0 deletions
*node_modules
File added
README.md 0 → 100644
# Ifi
## Auteurs
* Sandro Grébant
* Ahouefa Kpossou
* Zoé Canoen
## Installation d'Angular
Angular fait partie de l'environnement NodeJs et s'installe avec la commande :
npm install -g @angular/cli
cd ifi-tp-angular
npm install
## Génération initiale du projet
**A NE PAS FAIRE POUR LE TP**
Ce projet a été généré par les commandes :
npm install -g @angular/cli
ng new my-app
cd my-app
ng serve --open
Si vous souhaitez travailler chez vous, vous pourrez refaire ces commandes. Ici le projet est déjà généré.
## Serveur de développement
Pour lancer le serveur, faites `npm start`. Aller sur `http://localhost:4200/`. L'application va se recharger automatiquement à chaque sauvegarde de fichier.
## Génération automatique de code
Lancez `ng generate component component-name` pour générer un nouveau composant.
Vous pouvez aussi utiliser `ng generate directive|pipe|service|class|guard|interface|enum|module`.
## Questions
Le but du tp est de créer un site de news.
Pour cela vous aurez à votre disposition des données contenues dans le fichier `src/app/mocks/articles.ts`.
#### Accueil
![GitHub Logo](images/Accueil.PNG)
#### Résumé
![GitHub Logo](images/Abstract.PNG)
#### Détail
![GitHub Logo](images/Detail.PNG)
#### Filtre
![GitHub Logo](images/Filter.PNG)
Angular est un langage front, c'est pourquoi nous allons simuler un back.
Si vous cherchez dans le code, vous trouverez parfois du code qui vous expliquera comment faire si nous avions un back. (ref : src/app/shared/services/articles.service.ts).
### L'accueil
Pour l'accueil, nous allons d'aboard afficher la liste des articles dans le fichier `src\app\components\articles-list\articles-list.component.ts`
Pour cela il faut importer la liste des articles et sauvegarder les articles dans le composant.
Une liste d'article est mise à votre disposition dans `src/app/shared/mocks/articles`.
Dans la page html nous vous demanderons pour commencer d'afficher les noms des articles.
### Les Classes
Pour être sûr que l'on récupère bien une liste d'Article nous allons créer une classe dans `src/app/shared/models/article.model.ts`,
et on type l'attribut du composant articles-list.
### Création d'un composant
Création d'un composant. Faites `ng generate component components/header`.
Cela va créer un dossier `components/header` contenant un fichier html, css, ts et spec.ts (pour les tests).
Note : Un dossier `/styles` se trouve à la racine du projet, vous y trouverez peut être des styles qui vous aiderons à faire la même mise en page que sur le tp.
#### Le header
Une fois le composant header créé, à l'aide de material.angular nous allons créer une Toolbar dans le `header.component.html`.
https://material.angular.io/components/toolbar/overview
Sur Material.angular vous pouvez lire le code source.
![GitHub Logo](images/material-tuto-1.PNG)
Sur Material.angular, vous avez également la possibilité de voir les imports à faire ainsi que des exemples.
![GitHub Logo](images/material-tuto-2.PNG)
Nous allons également créer un filtre dans le header que nous configurerons à la fin.
https://material.angular.io/components/input/overview
#### L'abstract déroulant
Créons un nouveau composant, nous appelerons ce composant `articles-list-abstract`.
Cela sera le résumé de l'article. Nous voulons que ce résumé soit un composant déroulant, quand on clique dessus, le résumé s'affiche sur la page d'accueil.
https://material.angular.io/components/expansion/overview
### Utilisation d'un service
La première question n'était pas très satisfaisante d'un point de vue webService. En effet, si nous avions un vrai projet, il nous faudrait
créer et utiliser des webServices. Les webServices sont exposés grâce au back (que nous n'avons pas), nous allons donc le simuler.
Utilisons donc la classe getArticles qui renvoie un Observables d'article.
Un observable permet de faire appel à des API synchrones ou asynchrones. Il suffit donc de s'abonner à la resource proposée par le service, et se désabonner à la fin.
```
npm install rxjs-compat --save
```
### Utilisation d'un routeur
Nous allons créer un composant article-detail.
Si l'on clique sur le titre de l'article dans l'accueil, cela doit nous rediriger vers une page qui contient le nom de l'article, l'année, le résumé et l'url.
Nous utiliserons pour cela un routeur, avec un passage de paramètre sur l'id de l'article. Ainsi, il restera à rechercher parmis le tableau de TOUS les articles, l'élèment à l'id correspondant.
### Création d'un filter
Le but du filtre est de filtrer la liste des articles affichés en fonction de la valeur d'un input.
Pour cela il faut changer le service d'affichage des articles. En effet, le filtre va s'abonner au changement de l'input et changer la liste d'affichage du service.
Ainsi, tous les composants qui utiliserons la fonction getArticles() du services utiliserons le filtre.
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"ifi": {
"projectType": "application",
"schematics": {},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ifi",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"aot": false,
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
"src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
},
{
"type": "anyComponentStyle",
"maximumWarning": "6kb",
"maximumError": "10kb"
}
]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ifi:build"
},
"configurations": {
"production": {
"browserTarget": "ifi:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "ifi:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
"src/styles.css"
],
"scripts": []
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"tsconfig.app.json",
"tsconfig.spec.json",
"e2e/tsconfig.json"
],
"exclude": [
"**/node_modules/**"
]
}
},
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "ifi:serve"
},
"configurations": {
"production": {
"devServerTarget": "ifi:serve:production"
}
}
}
}
}
},
"defaultProject": "ifi"
}
\ No newline at end of file
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# You can see what browsers were selected by your queries by running:
# npx browserslist
> 0.5%
last 2 versions
Firefox ESR
not dead
not IE 9-11 # For IE 9-11 support, remove 'not'.
\ No newline at end of file
// @ts-check
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
const { SpecReporter } = require('jasmine-spec-reporter');
/**
* @type { import("protractor").Config }
*/
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./src/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
onPrepare() {
require('ts-node').register({
project: require('path').join(__dirname, './tsconfig.json')
});
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
};
\ No newline at end of file
import { AppPage } from './app.po';
import { browser, logging } from 'protractor';
describe('workspace-project App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
it('should display welcome message', () => {
page.navigateTo();
expect(page.getTitleText()).toEqual('ifi app is running!');
});
afterEach(async () => {
// Assert that there are no errors emitted from the browser
const logs = await browser.manage().logs().get(logging.Type.BROWSER);
expect(logs).not.toContain(jasmine.objectContaining({
level: logging.Level.SEVERE,
} as logging.Entry));
});
});
import { browser, by, element } from 'protractor';
export class AppPage {
navigateTo() {
return browser.get(browser.baseUrl) as Promise<any>;
}
getTitleText() {
return element(by.css('app-root .content span')).getText() as Promise<string>;
}
}
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/e2e",
"module": "commonjs",
"target": "es5",
"types": [
"jasmine",
"jasminewd2",
"node"
]
}
}
tp/images/Abstract.PNG

82.3 KiB

tp/images/Accueil.PNG

50.4 KiB

tp/images/Detail.PNG

87.5 KiB

tp/images/Filter.PNG

20.9 KiB

tp/images/material-tuto-1.PNG

6.25 KiB

tp/images/material-tuto-2.PNG

11.5 KiB

// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, './coverage/ifi'),
reports: ['html', 'lcovonly', 'text-summary'],
fixWebpackSourcePaths: true
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false,
restartOnFileChange: true
});
};
This diff is collapsed.
{
"name": "ifi",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "~8.2.9",
"@angular/cdk": "~8.2.2",
"@angular/common": "~8.2.9",
"@angular/compiler": "~8.2.9",
"@angular/core": "~8.2.9",
"@angular/forms": "~8.2.9",
"@angular/http": "^2.1.2",
"@angular/material": "^8.2.2",
"@angular/platform-browser": "~8.2.9",
"@angular/platform-browser-dynamic": "~8.2.9",
"@angular/router": "~8.2.9",
"hammerjs": "^2.0.8",
"rxjs": "~6.4.0",
"rxjs-compat": "^6.5.3",
"tslib": "^1.10.0",
"zone.js": "~0.9.1"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.803.8",
"@angular/cli": "~8.3.8",
"@angular/compiler-cli": "~8.2.9",
"@angular/language-service": "~8.2.9",
"@types/node": "~8.9.4",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"codelyzer": "^5.0.0",
"jasmine-core": "~3.4.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~4.1.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.0",
"protractor": "~5.4.0",
"ts-node": "~7.0.0",
"tslint": "~5.15.0",
"typescript": "~3.5.3"
}
}
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
body{
padding-bottom: 30px;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment