Académique Documents
Professionnel Documents
Culture Documents
Session 2021/2022
DOSSIER DE PROJET 1
Sommaire
Introduction
1.Environnement de stage
1.1 Présentation de l’entreprise PLANAR SAS
1.2 Présentation du Pole recherche et développement
1.3 Environnement et méthodologie de travail
2.Réalisation interne
2.1 Cahier des charges
2.1.1 Contexte et genèse du projet
2.1.2 Spéci cations fonctionnelle
2.1.3 Spéci cations technique
2.2 Présentation de l’application
2.2.1 Maquette de l’application
2.2.2 Organisation dans la construction de l’application
2.2.3 Gestion de projet
2.2.4 Base de données
2.3 Développement
2.3.1 Mise en place de l’environnement de développement
2.3.2 Initialisation du projet et création de l’application
3 Conception et développement
3.1 Le routage
3.2 Page de connexion
3.3 Page principale : Af chage des Tables sous forme de liste et tableaux
3.4 Page secondaire : Af chage des Tables sous forme graphique
3.5 Options
4 Les différents composants
Electron.js
Conclusion
Lexique
Bibliographie
Extrait du site Anglophone
Annexes
Annexe 1 : Suite de présentation des maquettes
Annexe 2 : Rendu nal de l’application
DOSSIER DE PROJET 2
fi
fi
fi
fi
fi
Introduction
Au cours de ce stage de 2 mois, j’ai accompli ma mission qui était de créer une
application interne pour améliorer et simpli er la lecture des tables dans les bases de données
des serveurs. Cette application permet à son utilisateur (interne) de voir la liste des tables sur
le serveur choisi en se connectant.
Il se connecte avec l’adresse IP[1] du serveur choisi ainsi qu’un login et un mot de
passe. Il peut aussi af cher les liens entre les tables elles-mêmes et modi er, entrer des valeurs
à l’intérieur de celle-ci.
Nous n’avons pas choisi de sécurité avancée pour notre application car c’est une
application qui va rester dans leurs locaux en interne et qu’il y’a pas de données
compromettantes à récupérer.
Dans ce rapport, je vais présenter dans un premier temps, l’environnement de travail
de la société ainsi que les méthodologie utilisés. Ensuite, je détaillerai la conception et de le
développement de l’application interne réalisée.
DOSSIER DE PROJET 3
fi
fi
fi
fi
fi
fi
1.Environnement de stage
1.1 Présentation de l’entreprise
J’ai effectué mon stage dans l’entreprise PLANAR SAS, liale de la
société Américaine PLANAR SYSTEM Inc, située à Beaverton, dans
l'Orégon.
L’activité principale de l’entreprise est la production et la distribution
d'écrans LCD de grande taille et de murs d'images LCD et LED.
A l'origine, il y avait une entreprise Française, fondée en 1995 par Gil Souviron et
jean-Claude Belle, à Saint-Sernin-sur-rance (Aveyron), nommée SYNELEC, dont l'activité
était la production et la vente de murs d'images.
Longtemps, SYNELEC servit de porte-étendard à tout ceux qui croyaient que l’on pouvait
concilier développement d’entreprise de nouvelles technologies en milieu rural. SYNELEC
partit à la conquête du monde avec ses écrans géants a été rattrapé, par la folle course du
monde . Après une première mise en redressement en 2004, SYNELEC avait été repris par
l’entreprise américaine CLARITY Visual Systems.
Cette dernière avait été, elle rachetée par la société américaine PLANAR SAS le 12
septembre 2006.
PLANAR est une entreprise américaine qui comporte plus de 400 salariés, elle
fait partie du groupe chinois LEYARD.
DOSSIER DE PROJET 4
fi
fi
L’équipe de PLANAR SAS en France est constitué de 19 personnes : 10 salariés à la R&D, 1
RAF, 2 commerciaux (basés sur Paris), 1 assistante commerciale, 1 ingénieur avant-vente, 2
responsables de projets clients, 1 SAV/Hotline, 1 installateur.
DOSSIER DE PROJET 5
Organigramme de mon équipe de travail en France
fi
fi
L‘entreprise fonctionne en méthode AGILE[2] plus particulièrement la méthode SCRUM[3]:
chaque Mardi soir nous avons une réunion avec les équipes Américaine pour faire la revue du
SPRINT[4] en cours.
Puis le jeudi nous avons une réunion avec l’équipe R&D au complet pour voir l’avancement
de chacun : chacun son tour nous présentons les taches en cours depuis la semaine dernière,
les dif cultés que nous pouvons rencontrer, etc…
Nous faisons ça aussi tout les mercredi à 11h avec l’équipe PLANAR France.
DOSSIER DE PROJET 6
fi
fi
2. Réalisation interne
2.1 Cahier des charges
2.1.1 Contexte et genèse du projet
Le projet à réaliser au cours de mon stage constituait à réaliser une application Web
permettant aux développeur de la R&D d'af cher ‘et éventuellement de modi er’ les tables
(attributs et relations) de la base de données d'un système donné.
Après une conversation avec mon tuteur, j'ai débuté mon stage par une présentation
de la société faite par le directeur de la R1D France. Ensuite, mon tuteur m'a présenté
l'architecture interne de leurs systèmes et le fonctionnement de l'application Web de gestion
des murs d'image qu'ils développent à la R&D et ses interactions avec le back-end.
Ensuite, il m'a fourni les spéci cations de l'application à développer pendant le stage.
Cette application devant, suite à une étape de connexion sécurisée à un système, af cher la
liste des Tables de la base de donnée du système et sur sélection d'une table, la liste des
enregistrements de cette Table, sous forme de tableau, en montrant les relations et les attributs
d'un enregistrement. Un af chage graphique des Tables et de leurs relations était aussi
potentiellement prévu.
Mon tuteur m'a indiqué, que le développement ce cette application devrait être fait en
utilisant les technologies déjà utilisées à la R&D pour les autres projets, à savoir, méthode
Agile, TypeScript avec le Framework Angular[9], gestion de con guration avec Git...
DOSSIER DE PROJET 7
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
2.1.3 Spéci cations techniques
Liste des choix techniques pour la réalisations de l’application :
Développer l’application à partir du Framework[6] Angular
Bibliothèque Javascript
Node.js pour créer une application Angular
Visual studio code comme IDE
npm (node package manager) version 8.13.2
GitKraken
GitHub
Angular CLI[8]
DOSSIER DE PROJET 8
fi
2.2 Présentation de l’application
Lorsque PLANAR vend un mur d'image à ses clients, il est généralement fourni avec
l'électronique d'acquisition, de découpage et de gestion de l'af chage du contenu sur le mur.
Cette électronique est conçue et développée à Albi par l'équipe française et est distribuée sous
forme d'éléments rackables. La partie logicielle est développée en collaboration entre la
France et les USA. Ces logiciels, embarqués, tournent sur une CPU intégrée à l'électronique,
autour d'un noyau micro-linux et sont écrits en divers langages: C, C+
+, python, pour la gestion de l'électronique et du back-end et
javascript+Angular pour la partie front-end.
L'ensemble des données internes est géré via une base de donnée SQL-
lite.
L'objectif de l'application développée au cours de mon stage est de Ceci est un wall director
Le matériel utilisé ?
Nous avons utilisé différents ordinateur avec différents système d’exploitation,
puis nous avons surtout travaillé avec Angular sur Visual studio code.
La gestion de con guration de l'application développée au cours du stage a été
fait avec Git et gérée via le serveur Gitlab de PLANAR.
A n de faciliter la gestion des branches de développement et des commits, j'ai
utilisé le logiciel Gitkraken.
Pour la présentation des documents of ciel comme celui-ci j’ai utilisé pages sur
Macos, puis keynote pour le powerpoint.
Pour la maquette de l’application nous avons utilisé l’application sur MacOs
qui s'appelle Origami Studio.
Pour qui ?
J’ai conçu cette application pour facilité la lecture des tables aux développeurs de l’entreprise
et voir visuellement les liens qu’il y a entre les tables elles-même.
La sécurité de l'application ?
Nous avons pas vraiment besoin de sécurité dans cette application car c’est une application
qui reste en local, qui restera dans les bureau pour les développeurs de l’entreprise.
DOSSIER DE PROJET 9
fi
fi
fi
fi
2.2.1 Maquette de l’application
Pourquoi faire une maquette ?
La création d’une maquette vous permet de gagner du temps. Certaines personnes le voient
comme une perte de temps car cela ajoute une étape lors de la création de leur site ou
application web. Ils pensent à tort qu’il est plus rapide de créer directement son site internet.
Or, le temps que vous passez à travailler votre maquette est nettement inférieur à celui que
vous allez passer à créer votre site au « feeling ». Sans compter le temps que vous allez
prendre à repasser derrière votre création que vous avez réalisé sans plan prédé ni.
La création d’une esquisse pour votre site internet vous permet d’entrevoir le résultat nal de
votre projet web. Vous pouvez alors imaginer, créer, rendre vivant ce que vous avez en tête.
Cette étape du processus de création vous permet de concevoir un site à l’image de votre
entreprise. Vous avez alors la possibilité de faire tous les changements que vous souhaitez a n
que le projet soit en adéquation totale avec votre image.
• Page de connexion
Le but de l’application étant de permettre l’af chage des tables de la base de donnée d’un
système donné, la première chose devant être faite est la connexion à ce système. De ce fait, la
première chose que l’application doit montrer est une page de connexion dans laquelle
l’utilisateur fournira l’URL du système à explorer, l’identi ant et le mot de passe utilisateur.
Un composant Angular devra être créé pour effectuer cette première étape.
DOSSIER DE PROJET 10
fi
fi
fi
fi
fi
fi
• Page principale
Une fois l'étape de login passée, l'application devra af cher la page principale qui contiendra
une ligne d'en-tête, af chant des boutons et des informations, une ligne de pied de page,
af chant le logo de la société et quelques informations et la partie centrale devra af cher la
liste des tables (à gauche) et la ou les tables sélectionnées sur le reste de la page.
Le passage de la page de login à la page principale devra être fait grâce à un changement de
route au sein de l'application. De ce fait un composant doit être créé pour la page principale
et j'ai choisi de découper l'af chage des différentes parties de cette page, énoncées ci-dessus,
en plusieurs composants:
- un composant pour l'en-tête,
- un composant pour le pied de page,
- un composant pour la partie centrale,
- des composants pour les divers éléments à af cher dans cette partie.
• Vue graphique
La vue graphique, doit montrer l'ensemble des Tables sous forme d'un rectangle contenant le
nom de la table et les relations entre les tables sous forme de lignes joignant ces rectangles.
L'utilisation du Canvas HTML sera la solution pour cela.
Un composant devra aussi être créé pour cette page, et le passage entre la vue des tables et la
vue graphique se fera aussi grâce à un changement de route.
DOSSIER DE PROJET 11
fi
fi
fi
fi
fi
fi
2.2.2 Organisation dans la construction de
l'application
Diagramme de gantt
DOSSIER DE PROJET 12
fi
fi
fi
J’ai choisis de déployer tous ces outils après une grande ré exion et des concertations
avec mon tuteur dès le début de mon projet pour pouvoir rapidement obtenir de la
productivité et de la qualité.
DOSSIER DE PROJET 13
fi
fi
fl
Tables avec leur attributs
La base de donnée est entièrement gérée dans le backend par un programme python qui
s'appuie sur le modèle de la base.
2.3. Développement
2.3.1 Mise en place de l’environnement de développement
Tout d’abord pour pouvoir développer une application avec le Framework Angular, il
nous faut installer Node.js.
Node.js est un environnement d’exécution JavaScript construit sur le moteur
JavaScript V8 de Chrome. Il est ainsi le point central qui va permettre d'exécuter des
programmes écrits en javascript côté serveur. Node.js utilise un outil npm (Node Package
Manager), il simpli e la vie du développeur en permettant de publier et de partager des
librairies Node.js.
Il permet notamment de simpli er l'installation, la mise à jour ou la désinstallation de
ces librairies. Donc par la suite j’ai installé Node.js en version 16.16 puis npm en version
8.13.2.
Une fois l'installation effectuée on peut véri er que Node.js est correctement installé sur notre
poste de travail.
# Vérification de la version de Node.js et de npm (méthode 1)
node --version
npm --version
DOSSIER DE PROJET 14
fi
fi
fi
# Mise à jour de npm
npm install npm -g
Maintenant place à l’installation de notre IDE Visual Studio Code. J’ai utilisé la dernière
version de Visual studio code qui est la version 1.69.0.
Ensuite nous allons télécharger Angular CLI , c’est une Command Line Interface (interface
en ligne de commande, en français) développée par les équipes d'Angular même. Cette CLI
permet de créer des projets dans lesquels la CLI pourra ajouter des chiers et plus exactement
des entités Angular. J’ai donc télécharger la dernière version qui est la version 14.1.1.
Angular CLI est une librairie (ou package), je l’ai donc installé avec npm le gestionnaire de
node.js
Maintenant que tout mon environnement est installé, je vais donc passer à l’initialisation du
projet et la création de mon application.
DOSSIER DE PROJET 15
fi
fi
2.3.2 Initialisation du projet et création de l’application
Angular CLI est un outil pour initialiser, développer et maintenir des applications
Angular, il nous offre un certain nombre de commandes. Ces commandes
m’évitent d'effectuer des tâches répétitives.
J’ai choisit le nom de mon application Mad-model-ui (déja dé nis par mon tuteur).
J’ai tapé la commande ng new avec les paramètres correspondants
- J’ai générée le projet (cette partie prend quelques minutes)
• Répondus oui pour le routing
• Choisis le type CSS[12]
Je me suis positionné dans le projet puis je l’ai exécuté.
ng new Mad-model-ui
? Would you like to add Angular routing? Yes
? Which stylesheet format would you like to use? SCSS [ https://sass-lang.com/
documentation/syntax#scss ]
CREATE mad-model-ui/angular.json (3243 bytes)
CREATE mad-model-ui/package.json (1075 bytes)
CREATE mad-model-ui/README.md (1064 bytes)
CREATE mad-model-ui/tscon g.json (863 bytes)
CREATE mad-model-ui/.editorcon g (274 bytes)
CREATE mad-model-ui/.gitignore (548 bytes)
CREATE mad-model-ui/.browserslistrc (600 bytes)
CREATE mad-model-ui/karma.conf.js (1429 bytes)
CREATE mad-model-ui/tscon g.app.json (287 bytes)
CREATE mad-model-ui/tscon g.spec.json (333 bytes)
CREATE mad-model-ui/.vscode/extensions.json (130 bytes)
CREATE mad-model-ui/.vscode/launch.json (474 bytes)
CREATE mad-model-ui/.vscode/tasks.json (938 bytes)
CREATE mad-model-ui/src/favicon.ico (948 bytes)
CREATE mad-model-ui/src/index.html (296 bytes)
CREATE mad-model-ui/src/main.ts (372 bytes)
CREATE mad-model-ui/src/poly lls.ts (2338 bytes)
CREATE mad-model-ui/src/styles.scss (80 bytes)
CREATE mad-model-ui/src/test.ts (745 bytes)
CREATE mad-model-ui/src/assets/.gitkeep (0 bytes)
CREATE mad-model-ui/src/environments/environment.prod.ts (51 bytes)
DOSSIER DE PROJET 16
fi
fi
fi
fi
fi
fi
fi
CREATE mad-model-ui/src/environments/environment.ts (658 bytes)
CREATE mad-model-ui/src/app/app-routing.module.ts (245 bytes)
CREATE mad-model-ui/src/app/app.module.ts (393 bytes)
CREATE mad-model-ui/src/app/app.component.html (23364 bytes)
CREATE mad-model-ui/src/app/app.component.spec.ts (1091 bytes)
CREATE mad-model-ui/src/app/app.component.ts (217 bytes)
CREATE mad-model-ui/src/app/app.component.scss (0 bytes)
✔ Packages installed successfully.
Successfully initialized git.
Au cours de cette étape, Angular-cli a créé les répertoires et chiers de base pour l'application,
a initialisé le dépôt Git et téléchargé tous les modules Node nécessaires au développement de
l'application. Ci-dessous, la vue de l'arborescence de l'application, après la création:
# Exécuter
ng serve
DOSSIER DE PROJET 17
fi
fi
fi
fi
Par exemple pour utiliser le port 4201 le script serait le suivant "start": "ng serve --port 4201 »
"scripts": {
"ng": "ng",
"start": "ng serve --port 4200",
"build": "ng build",
"watch": "ng build --watch --configuration development",
"test": "ng test"
},
DOSSIER DE PROJET 18
3.Conception et
développements
3.1 Le routage
Une application Web Angular est constituée de composants, de templates, de services et hérite
de la collection de librairies fournies par Angular.
Notre application est une application de type monopage (single page App) qui doit permettre
de montrer différentes pages.
La meilleure manière d'appréhender ce problème est d'utiliser le Router d'Angular
permettant d'af cher telle ou telle page en fonction de l'url de la page. Ce router offre en plus
des outils de navigation permettant de changer l'url à partir du code TypeScript.
Comme lors de la création du projet, j'ai validé l'utilisation du routage, le chier app-
routing.module.ts a été créé. C'est dans ce chier que l'on fait l'association des routes et des
composants.
Comme décrit dans la phase de maquettage, notre application a besoin de deux routes
principales: le login et la page principale. Cette dernière devant af cher 2 vues différentes,
cela sera aussi géré via le routage en dé nissant des routes secondaires. La page de
déconnexion, sera aussi gérée comme une route secondaire.
Voici, ci-dessous le contenu de ce chier app-routing.module.ts
DOSSIER DE PROJET 19
fi
fi
fi
fi
fi
fi
},
{
path: 'option',
component: OptionComponent,
outlet: 'tab'
},
{
path: 'deco',
component: DecoComponent,
outlet: 'tab'
}
]
},
{
component: LoginComponent,
path: '',
pathMatch: 'full',
redirectTo: '',
},
{
component: LoginComponent,
path: '**',
pathMatch: 'full',
redirectTo: '',
}
]
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
Chaque route est décrite par son url (path:) et le composant associé (component:).
Pour les routes secondaire, il convient de rajouter à la route principale, un nouvel élément
(children:) contenant la liste des routes secondaires. le nom donné sur la ligne 'outlet:' servira à
indiquer la route secondaire dans le template.
Lors de la création du projet, le composant 'app' a été créé par angular-cli. Ce composant est
le composant de base de l'application, directement chargé depuis le point d'entrée de
l'application, le chier 'index.html'.
Le template de ce composant contiendra uniquement l'information de routage de la page à
af cher en fonction de l'url indiquée dans le navigateur
<router-outlet></router-outlet>
Le but de l'application a développer est de visualiser (voir de modi er) les tables constituants
la base de données du système sur lequel elle sera connectée.
Chaque système contient un serveur Web (qui est le point d'entrée entre l'application front-
end (notre application) et le backend. Le backend est constituée d'un serveur écrit en python,
qui gère les accès à la base de donnée et l'ensemble des mécanismes pour envoyer des
DOSSIER DE PROJET 20
fi
fi
fi
commandes et gérer les noti cations du hardware (ceci au travers d'autres modules écrits en
C++, python, ...) et de l'application front-end.
La communication entre notre application front-end et le back-end doit être sécurisée. Pour
cela au cours de l'étape de login, faite via le protocole https, un 'token' est généré par le
backend et il doit être intercepté par l'application qui devra s'en servir par la suite pour
chaque message envoyé au backend, via un protocole de WebSockets[11].
La première chose que l'application à developper doit faire est l'af chage d'une page dans
laquelle l'utilisateur pourra choisir le système sur lequel il veut se connecter en donnant, l'url
de ce système, le login de l'utilisateur et le mot de passe a n d'établir la connexion vers le
backend du système.
Pour cela, comme indiqué dans le maquettage, un composant doit être créé pour gérer cette
page.
Pour se faire, j'utilise la commande angular-cli
ng generate component components/login
Cette commande a pour effet de créer le component LoginComponent dans le répertoire
'components', à la racine du répertoire 'app'. Un sous-répertoire 'login' est créé dans
DOSSIER DE PROJET 21
fi
fi
fi
'components', contenant 4 chiers: un chier de script (.ts), un chier de template (.html), un
chier pour la feuille de style (.scss) et un chier de tests (.specs.ts)
La première partie du travail à réaliser dans ce composant est la création du template HTML
et des sélecteurs de classe CSS qui donneront le visuel de la page.
La saisie des champs URL, login et password seront fait par l'utilisation d'un formulaire
(<form></form>).
Pour cela, il convient de rajouter une fonction dans le chier de script, ainsi que des variables
pour chacun des champs....
D'autres éléments doivent être aussi utilisés, pour gérer la communication avec le backend, au
travers des protocoles https et WebSockets.
Pour cela, j'ai dû utiliser des services Angular déjà développés et testés par l'équipe soft de
PLANAR.
J'ai donc importé ces services pour les rajouter à mon application. A n d'avoir une structure
cohérente des chiers, ces services ont été ajouté dans un répertoire nommé 'services'.
DOSSIER DE PROJET 22
fi
fi
fi
fi
fi
fi
fi
fi
Ces services sont:
- HttpService,
- JwtInterceptor (en charge de la gestion du token)
- WsBackendService
- UserService
Le service UserService étant le service de haut niveau, s'appuyant sur HttpService et
JwtInterceptor, pour la gestion du login et du token.
authenticate(): void {
window.localStorage.setItem('base_url',
JSON.stringify(this.loginForm.value.baseUrl));
this.authenticationFailed = false;
this.userService.authenticate({ login:
this.loginForm.value.login, password:
this.loginForm.value.password }).subscribe(
() => this.router.navigate(['/home']),
() => (this.authenticationFailed = true)
);
}
La fonction ci-dessus est appelée lorsque l'utilisateur cliques sur le bouton 'Log me in' et
permet d'effectuer la phase d'authenti cation (via le service UserService) qui sera validée ou
rejetée en fonction des données fournies dans les champs de Login et Password.
Si cette étape est rejetée, les champs sont effacées et l'application reste sur cette page. Dans le
cas contraire, le Router d'Angular permet à l'application de naviguer vers la page principale,
gérée par le composant 'HomeComponent' (route ‘/home')
ngOnInit(): void {
this.tableRead = false;
this.wsbackendService.connect();
this.updateReadyState(this.wsbackendService.wsService.getReady
State());
}
DOSSIER DE PROJET 23
fi
send(payload: string): number {
const stringifiedIdToken =
window.localStorage.getItem('auth_token');
let data: any;
const id = WsbackendService.uniqueId++;
if (stringifiedIdToken) {
const authToken = JSON.parse(stringifiedIdToken);
data = { id, auth_token: authToken, payload };
} else {
data = { id, payload };
}
constructor(
private httpService: HttpService,
public wsService: MadWebsocketService
)
DOSSIER DE PROJET 24
3.3 Page principale : Affichage des Tables
sous forme de liste et tableaux
Voici la première partie de l’application, elle permet de réaliser l’objectif principal qui
est d’af cher les tables présentes puis ensuite de voir les relations entre elles et leurs attributs.
Dès que nous cliquons sur une des relations une nouvelle fenêtre s’ouvre avec ainsi les
attributs et les relations de la table sélectionné.
Avec l’application nous pouvons aussi modi er la valeur des attributs.
DOSSIER DE PROJET 25
fi
fi
onTableSelected(table: string, event: MouseEvent) {
if ( event && event.ctrlKey &&
this.selectedTablesName.length > 0 && !
this.selectedTablesName.includes(table) ) {
// get selected table rows to backend
this.selectedTables.splice(1);
this.selectedTablesName.splice(1);
this.selectedTablesName.push( table );
this.selectedTablesKey.splice(1);
this.selectedTablesKey.push( -1 );
this.secondSelectedTableName = table;
const request = table + '.* get';
this.wsbackendService.send(request);
} else if ( table !== this.selectedTablesName[0] ) {
this.selectedTables.splice(0);
this.selectedTablesName.splice(0);
this.selectedTablesKey.splice(0);
DOSSIER DE PROJET 26
<div class="view-table-area">
<div class="view-table-internal">
<div class="view-table-element"
*ngIf="selectedTables.length > 0">
<app-table-data *ngFor="let tableName of
selectedTablesName; let i =
index" [tableList]="selectedTables[i]" [selectedKey]="selected
TablesKey[i]" (closing)="onClosingTableData(i)" (selectedRelat
ion)="onSelectedRelation(i,
$event)" (editAttribute)="onEditAttribute($event)"></app-
table-data>
</div>
</div>
</div>
onClosingTableData(index: number) {
if ( index === 0 || this.selectedTablesName[index] ===
this.secondSelectedTableName ) {
this.secondSelectedTableName = '';
}
this.selectedTables.splice(index);
this.selectedTablesName.splice(index);
this.selectedTablesKey.splice(index);
if ( index > 0 && this.tableDataComponentList ) {
this.tableDataComponentList.forEach((tableDataComponent:
TableDataComponent, i) => {
if ( i === index - 1 ) {
tableDataComponent.unselectRelation();
}
});
}
}
Ceci est le code qui permet de fermer la fenêtre et ainsi on fait juste que supprimer les
éléments des 2 tableaux (selectedTablesName et selectedTables) à partir de l’indice passé à la
fonction.
Grâce au *ngFor, les instances données des composants TableData sont automatiquement
supprimées de la vue.
DOSSIER DE PROJET 27
fi
fi
3.4 Page secondaire : Affichage des Tables
sous forme graphique
Le développement de la vue des tables sous forme graphique ne faisait pas partie du travail
qui m'était con é, aussi c'est mon tuteur qui s'en est chargé?
Le développement de cette vue a été fait avec l'élément HTML <canvas> et de la librairie
javascript fabric.js (déjà utilisée en interne pour les éléments graphiques des autres
applications Web).
DOSSIER DE PROJET 28
fi
Cette librairie fournit une liste d'objets qui permettent de gérer le canvas HTML. Pour
l'utiliser, il faut rajouter 'fabric' à la liste des dépendances du chier package.json et de
l'installer via yarn.
Une fois installé, il suf t d'insérer une ligne dans le template du composant qui doit gérer le
canvas :
DOSSIER DE PROJET 29
fi
fi
fi
fi
fi
const rect = new fabric.Rect({
originX: 'left',
originY: 'top',
left: 0,
top: 0,
width: this.rectWidth,
height: this.rectHeight,
fill: '#ffffff',
borderColor: '#515151',
evented: false,
hasControls: false,
selectable: false,
stroke: '#515151',
strokeWidth: 2,
});
DOSSIER DE PROJET 30
Les rectangles des tables pouvant être déplacés à la souris, quelques événements ont été
interceptés pour gérer le re-dessin des lignes
3.5 Options
L'en-tête de l'application dispose d'un bouton 'OPTIONS' qui lorsqu'il est cliqué par
l'utilisateur permet d'af cher une boite de dialogue modale pour la gestion des options de
l'application.
Dans ce dialogue, seules 2 options sont gérées pour le moment et ces options correspondant à
des variables de type booléen, nous avons utilisé des checkbox (voir le screenshot).
DOSSIER DE PROJET 31
fi
Le template du composant Option est construit à l'intérieur du sélecteur <BusyBg> qui
permet l'af chage de l'arrière plan rayé, positionné au premier plan (a n de donner au
dialogue Options son aspect modal)
<busy-bg mode="light">
<div id="optionDlg" class="box-content">
<div class="header">
<div class="header-text">{{title}}</div>
</div>
<div class="center-area">
<input class="allow-edit" type="checkbox"
id="allowEditting"name="allowEditting" [(ngModel)]="allowEditt
ing" (click)="onAllowEditting()">
<label for="allowEditting"> Allow Attributes Edition</
label><br>
<div class="graph-section">
<div class="graph-title">Graph view</div>
<input type="checkbox" id="alignToGrid"
name="alignToGrid" [(ngModel)]="alignTablesToGrid" (click)="on
AlignTablesToGrid()">
<label for="alignToGrid"> Align Tables to a grid</
label><br>
</div>
</div>
<div class="footer">
<button (click)="onClose()">Close</button>
</div>
</div>
</busy-bg>
Si on regarde le template du composant BusyBg, on peut voir qu'il est très simple
Seulement une <div> dont le contenu est géré par la feuille de style du composant, de façon à
ce que cette <div> occupe toute la page, soit au premier plan et avec un arrière plan rayé
DOSSIER DE PROJET 32
fi
fi
.mad-sb-bg-dark, .mad-sb-bg-light {
top: 0px;
position: fixed;
left: 0px;
bottom: 0px;
right: 0px;
width: 100%;
height: 100%;
background-image: url(/assets/images/dotted-background.png);
/* Next line to have the background div on top */
z-index: 1000;
}
L'accès à cette variable du composant 'BusyBg' est géré dans le code typescript du composant
Option.
Angular permet d'accéder aux composants utilisés dans le composant courant, grâce au
décorateur @ViewChild et fournit une variable sur la classe de ces composants.
DOSSIER DE PROJET 33
fi
fi
show() {
this.busyBgComponent.show();
}
Ensuite j’ai mis en place une option graphique qui permet d’aligner tout les tables dans la
partie Graph.
<div class="graph-section">
<div class="graph-title">Graph view</div>
<input type="checkbox" id="alignToGrid"
name="alignToGrid" [(ngModel)]="alignTablesToGrid" (click)="on
AlignTablesToGrid()">
<label for="alignToGrid"> Align Tables to a grid</
label><br>
</div>
Et pour nir, j’ai mis en place un bouton close qui permet de fermer la fenêtre et de continuer
sur l’application.
<div class="footer">
DOSSIER DE PROJET 34
fi
<button (click)="onClose()">Close</button>
</div>
Je rappelle encore le composant BusyBg qui permet d’enlever le « gel » mis en place ainsi que
le fond quadrillé.
onClose() {
this.busyBgComponent.hide();
}
}
Graph :
Login : Permet de se connecter avec l’adresse IP, un identi ant et un mot de passe
DOSSIER DE PROJET 35
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
Modal-dialog : composant qui af che d'une boite de dialogue modale d'information. Ce
composant est constitué d'une ligne de titre, une ligne pour un texte d'information et une
ligne contenant un bouton pour sa fermeture. Il permet d'af cher des messages d'information
ou d'alerte pour l'utilisateur.
Option : Permet d’af cher une fenêtre qui nous offre la possibilité de modi er des option sur
la partie graphique
Table-data : composant qui gère l'af chage d'une Table. Il contient une ligne de titre, dans
lequel est af ché le nom de la Table et le nombre d'enregistrements.
En dessous du titre, la vue est séparée en une liste contenant la clé de tous les enregistrements
de la Table, à gauche et la liste des relations et des attributs de l'enregistrement sélectionné
dans la liste de gauche.
Tables : composant principale de la vue 'TABLES'. Il permet d'af cher la liste des tables sur
la partie gauche et une ou plusieurs instances du composant TableData sur la partie droite
DOSSIER DE PROJET 36
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
Electron.js
A la demande du directeur Américain, qui souhaitait pouvoir transformer cette application,
ainsi que d'autres application Web gérées par la R&D, en 'Application Desktop', nous avons
testé le framework ‘Electron'.
Electron est une librairie open source développée par la fondation OpenJS et une
communauté active de contributeurs, sous licence MIT pour créer des applications desktop
cross-platform avec HTML, CSS et JavaScript.
DOSSIER DE PROJET 37
fi
fi
fi
fi
et les compléter en suivant les préconisations du site electronjs.org.
Modi er à nouveau le chier package.json, pour indiquer le chier app.js comme point
d'entrée de l'application
"main": "app.js"
et y ajouter une ligne pour l'exécution de l'application avec électron
"start-electron": "ng build --base-href ./ && electron .",
A cet instant, l'application peut être compilée pour être exécutée dans une fenêtre
indépendante, hors navigateur
DOSSIER DE PROJET 38
fi
fi
fi
Conclusion
Je suis très satisfait d’avoir pu réaliser une application complète, modulable et rentable
pour mon entreprise. Produit de façon autonome avec l’aide parfois de toute l’équipe de
Recherche et Développement mais surtout de mon tuteur de stage, mon outil permet de
facilité la lecture des relations dans tout les serveurs de mon entreprise.
Ce stage m’a permis de réaliser bien plus que les objectifs de la certi cation en
prenant par au monde de l’entreprise et en collaborant avec de nombreux corps de métiers
complémentaire avec celui de développeur. De l’ingénieur Hardware au testeur de qualité
tout cet univers est extrêmement relié. Ajoutons à cela la gestion de projet et le travail en
équipe. Ce stage fut une expérience merveilleuse pour con rmer ma passion pour le métier
de développeur web.
DOSSIER DE PROJET 39
fi
fi
Lexique
1-Adresse IP : L'adresse IP (Internet Protocol) désigne un numéro unique attribué de
manière provisoire ou durable à un ordinateur connecté à un réseau informatique qui utilise
l'internet protocole. Cette suite de chiffres joue une rôle d'identi cation du branchement et
permet l'acheminement (c'est-à-dire le routage) des paquets de données sur Internet.
3-SCRUM : Scrum est la méthode agile la plus utilisée. A l'instar des autres méthodes agiles,
Scrum est une démarche de gestion de projet qui fait du client (ou utilisateur) le principal
pilote de l'équipe en charge des développements.
7-Kanban : La méthode Kanban fonctionne à partir d'un système de cartes. Elle a d'ailleurs
été baptisée en référence à ce procédé. Kanban signi e étiquettes en langue japonaise. Les
DOSSIER DE PROJET 40
fi
fi
fi
fi
cartes ou étiquettes vont représenter les tâches à accomplir en vue de répondre à la
commande d'un client.
8-CLI : CLI est l'acronyme utilisé pour Command Line Interface, des interfaces
classiques.Une interface de ligne de commande (CLI) permet aux utilisateurs d'écrire des
commandes dans un terminal ou une fenêtre de console pour communiquer avec un système
d'exploitation.
9-Angular : Angular est un framework côté client, open source, basé sur TypeScript, et
codirigé par l'équipe du projet « Angular » à Google et par une communauté de particuliers
et de sociétés.
12-CSS : CSS (Cascading Style Sheets) permet de créer des pages web à l'apparence soignée. Cet
article vous propose de lever le voile en expliquant ce qu'est CSS ; un exemple simple en
présentera la syntaxe, puis quelques termes clés du langage seront introduits.
Input : Entrée des données en vue d'un traitement; ensemble des informations destinées à
être traitées; action d'introduire des données. L'input est généralement un terminal,
quelquefois au double usage (input et output) de la saisie des données et de l'édition des
résultats
DOSSIER DE PROJET 41
Bibliographie
https://angular.io/
https://www.planar.com/products/lcd-video-walls/clarity-matrix-lcd/
https://www.planar.com/
http://redmine.planar.net/projects/planar-eng/wiki/Getting_Started_With_Electron
https://www.smashingmagazine.com/2018/11/a-complete-guide-to-routing-in-angular
DOSSIER DE PROJET 42
Extrait du site Anglophone
Extrait du site: https://www.smashingmagazine.com/2018/11/a-complete-guide-to-
routing-in-angular/
Partie originale
A Complete Guide To Routing In Angular
Angular Router is a powerful JavaScript router built and maintained by the Angular core
team that can be installed from the @angular/router package. It provides a complete routing
library with the possibility to have multiple router outlets, different path matching strategies,
easy access to route parameters and route guards to protect components from unauthorized
access.
The Angular router is a core part of the Angular platform. It enables developers to build
Single Page Applications with multiple views and allow navigation between these views.
Let’s now see the essential Router concepts in more details.
THE ROUTER-OUTLET #
The Router-Outlet is a directive that’s available from the router library where the Router
inserts the component that gets matched based on the current browser’s URL. You can add
multiple outlets in your Angular application which enables you to implement advanced
routing scenarios.
<router-outlet></router-outlet>
Any component that gets matched by the Router will render it as a sibling of the Router
outlet.
ROUTES AND PATHS #
Routes are definitions (objects) comprised from at least a path and a component (or
a redirectTo path) attributes. The path refers to the part of the URL that determines a unique
DOSSIER DE PROJET 43
view that should be displayed, and component refers to the Angular component that needs to
be associated with a path. Based on a route definition that we provide (via a
static RouterModule.forRoot(routes) method), the Router is able to navigate the user to a
specific view.
Each Route maps a URL path to a component.
The path can be empty which denotes the default path of an application and it’s usually the
start of the application.
The path can take a wildcard string (**). The router will select this route if the requested
URL doesn’t match any paths for the defined routes. This can be used for displaying a “Not
Found” view or redirecting to a specific view if no match is found.
This is an example of a route:
{ path: 'contacts', component: ContactListComponent}
If this route definition is provided to the Router configuration, the router will
render ContactListComponent when the browser URL for the web application becomes /
contacts.
Traduction
Un guide complet du routage en Angular
Présentation d'Angular Router
Angular Router est un puissant routeur JavaScript construit et maintenu par l'équipe centrale
d'Angular qui peut être installé à partir du paquet @angular/router. Il fournit une
bibliothèque de routage complète avec la possibilité d'avoir plusieurs sorties de routeur,
différentes stratégies de correspondance de chemin, un accès facile aux paramètres de route et
des gardes de route pour protéger les composants contre les accès non autorisés.
Le routeur Angular est un élément central de la plateforme Angular. Il permet aux
développeurs de construire des applications monopages avec plusieurs vues et de permettre la
navigation entre ces vues.
Voyons maintenant plus en détail les concepts essentiels du routeur.
LE ROUTER-OUTLET
Le Router-Outlet est une directive disponible dans la bibliothèque de routeurs où le routeur
insère le composant qui correspond à l'URL du navigateur actuel. Vous pouvez ajouter
plusieurs outlets dans votre application Angular, ce qui vous permet de mettre en œuvre des
scénarios de routage avancés.
<router-outlet></router-outlet>
Tout composant mis en correspondance par le routeur sera rendu en tant que frère ou sœur
de l'outlet du routeur.
DOSSIER DE PROJET 44
ROUTES ET CHEMINS
Les routes sont des dé nitions (objets) composées d'au moins un chemin et d'un composant
(ou d'un chemin redirectTo). Le chemin fait référence à la partie de l'URL qui détermine une
vue unique à af cher, et le composant fait référence au composant Angular qui doit être
associé à un chemin. Sur la base d'une dé nition de route que nous fournissons (via une
méthode statique RouterModule.forRoot(routes)), le routeur est capable de diriger l'utilisateur
vers une vue spéci que.
Chaque route fait correspondre un chemin URL à un composant.
Le chemin d'accès peut être vide, ce qui indique le chemin d'accès par défaut d'une
application et correspond généralement au début de l'application.
Le chemin peut prendre une chaîne de caractères génériques (**). Le routeur sélectionnera
cette route si l'URL demandée ne correspond à aucun chemin des routes dé nies. Cela peut
être utilisé pour af cher une vue "Not Found" ou pour rediriger vers une vue spéci que si
aucune correspondance n'est trouvée.
Voici un exemple de route :
{ path : 'contacts', component : ContactListComponent}
Si cette dé nition de route est fournie à la con guration du routeur, le routeur rendra le
composant ContactListComponent lorsque l'URL du navigateur de l'application Web
deviendra /contacts.
DOSSIER DE PROJET 45
fi
fi
fi
fi
fi
fi
fi
fi
fi
Annexe
DOSSIER DE PROJET 46
Annexe 1 : Suite des maquettes
DOSSIER DE PROJET 47
Annexe 2 : Rendu final de l’application
DOSSIER DE PROJET 48
`
DOSSIER DE PROJET 49
DOSSIER DE PROJET 50