diff --git a/README.md b/README.md index 278dbc7..6ae2ddd 100644 --- a/README.md +++ b/README.md @@ -1,154 +1,2 @@ # DTFlux Titrage Client - Interface Angular pour Unreal Engine -## đŻ Vue d'ensemble - -Interface graphique modulaire Angular 19+ pour crĂ©er et gĂ©rer des fiches de titrage destinĂ©es Ă Unreal Engine avec le plugin Remote Control et Motion Design. - -## â Composants créés et fonctionnalitĂ©s - -### đïž Architecture modulaire respectĂ©e - -#### Services -- â **TitleSheetsService** - Gestion des fiches de titrage (CRUD + localStorage) -- â **UnrealEngineService** - Communication avec Unreal Engine Remote Control API -- â **ConfigService** - Gestion de la configuration de l'application - -#### Composants modulaires -- â **MenuBarComponent** - Barre de menu avec actions de configuration -- â **CuedTitleComponent** - Affichage du titre en cours de lecture -- â **ToolbarComponent** - Barre de recherche + bouton d'ajout -- â **ListHeaderComponent** - En-tĂȘtes de colonnes avec tri -- â **ListComponent** - Liste principale des titres -- â **ListItemComponent** - ĂlĂ©ment de liste avec Ă©dition inline -- â **DetailsPanelComponent** - Panneau de dĂ©tails de l'Ă©lĂ©ment sĂ©lectionnĂ© -- â **TitleDialogComponent** - BoĂźte de dialogue d'ajout/modification -- â **TitleSheetsListComponent** - Composant principal orchestrant la liste - -#### Pages -- â **DTFluxTitleComponent** - Page principale de l'application -- â **SetupComponent** - Page de configuration lĂ©gĂšre - -### đš Design et thĂšme -- â **ThĂšme dark** inspirĂ© de VS Code et Unreal Engine -- â **Design sobre et Ă©purĂ©** comme demandĂ© -- â **Responsive design** adaptatif jusqu'Ă 950px de largeur max -- â **IcĂŽnes FontAwesome** intĂ©grĂ©es -- â **Animations et transitions** modernes - -### ⥠FonctionnalitĂ©s Angular 19+ -- â **Signals** utilisĂ©s partout (input, output, computed, effect) -- â **Directives modernes** (@if, @for, etc.) -- â **Composants standalone** -- â **Reactive Forms** pour la validation -- â **Gestion d'Ă©tat** avec BehaviorSubject et Signals - -### đ§ FonctionnalitĂ©s mĂ©tier -- â **CRUD complet** des fiches de titrage (Nom, PrĂ©nom, Fonction1, Fonction2) -- â **Recherche en temps rĂ©el** avec autocomplĂ©tion -- â **Tri des colonnes** (nom, prĂ©nom, fonctions, date de modification) -- â **Ădition inline** des cellules avec navigation clavier -- â **SĂ©lection et navigation** avec flĂšches clavier -- â **Raccourcis clavier** (Ctrl+I ajouter, Enter play, Space stop, Delete supprimer) -- â **Communication Unreal Engine** via Remote Control API -- â **Gestion des Ă©tats** (stopped, playing, error) -- â **Timer de lecture** avec changement de couleur -- â **Sauvegarde automatique** et configuration persistante - -### đ± ExpĂ©rience utilisateur -- â **Interface adaptative** 950px max comme demandĂ© -- â **Ătats vides** avec messages et actions appropriĂ©es -- â **Messages de feedback** (succĂšs, erreurs) -- â **Loading states** pendant les opĂ©rations -- â **Tooltips et aide** contextuelle -- â **AccessibilitĂ©** (aria-labels, focus management, contraste Ă©levĂ©) - -## đ Comment dĂ©marrer - -1. **Installation des dĂ©pendances** : - ```bash - npm install - ``` - -2. **DĂ©marrage du serveur de dĂ©veloppement** : - ```bash - ng serve - ``` - -3. **AccĂšs Ă l'application** : - - Interface principale : `http://localhost:4200/dtflux-title` - - Configuration : `http://localhost:4200/setup` - -## đ Utilisation - -### Interface principale -1. **Ajouter une fiche** : Bouton "Add" ou Ctrl+I -2. **Modifier une fiche** : Clic sur l'icĂŽne roue crantĂ©e ou double-clic sur une cellule -3. **Supprimer une fiche** : Bouton poubelle ou sĂ©lectionner + Delete -4. **Lancer un rundown** : Bouton play ou sĂ©lectionner + Enter -5. **ArrĂȘter un rundown** : Bouton stop ou Space -6. **Rechercher** : Tapez dans la barre de recherche -7. **Trier** : Cliquez sur les en-tĂȘtes de colonnes - -### Configuration -- **Unreal Engine** : Adresse IP, port, timeout -- **Sauvegarde** : Chemin, auto-sauvegarde, intervalle -- **Test de connexion** : VĂ©rifier la communication avec Unreal - -## đ API Unreal Engine - -L'application communique avec Unreal Engine via l'API Remote Control : -- **Endpoint** : `http://{address}:{port}/remote/object/call` -- **Blueprint cible** : `/Game/MotionDesign/TitleSheet_BP.TitleSheet_BP_C` -- **Fonctions** : `SetTitleProperties`, `StartRundown`, `StopRundown`, `GetStatus` - -## đ ïž Prochaines Ă©tapes possibles - -### FonctionnalitĂ©s avancĂ©es -- [ ] **Import/Export** de fiches en CSV/JSON -- [ ] **Templates** de fiches prĂ©dĂ©finies -- [ ] **Historique** des modifications -- [ ] **Groupes/CatĂ©gories** de fiches -- [ ] **Preview en temps rĂ©el** dans Unreal -- [ ] **Synchronisation** multi-utilisateurs - -### IntĂ©grations -- [ ] **Drag & drop** pour rĂ©organiser -- [ ] **Copier/coller** entre fiches -- [ ] **Undo/redo** des actions -- [ ] **Notifications** push pour les changements d'Ă©tat -- [ ] **Mode hors ligne** avec synchronisation - -### Performance -- [ ] **Virtualisation** de la liste pour de gros volumes -- [ ] **Lazy loading** des donnĂ©es -- [ ] **Cache** intelligent des requĂȘtes -- [ ] **Optimisation bundle** et tree-shaking - -## đïž Architecture technique - -``` -src/app/ -âââ models/ # Interfaces TypeScript -â âââ title-sheet.model.ts -â âââ unreal-status.model.ts -â âââ app-config.model.ts -âââ services/ # Services Angular -â âââ title-sheet.service.ts -â âââ unreal-engine.service.ts -â âââ config.service.ts -âââ view/ - âââ components/ # Composants rĂ©utilisables - â âââ menu-bar/ - â âââ cued-title/ - â âââ toolbar/ - â âââ list-header/ - â âââ list-item/ - â âââ details-panel/ - â âââ title-dialog/ - â âââ title-sheets-list/ - âââ pages/ # Pages de l'application - âââ dtflux-title/ - âââ setup/ -``` - -L'architecture respecte parfaitement le paradigme de modularitĂ© demandĂ© avec des composants indĂ©pendants et rĂ©utilisables. diff --git a/angular.json b/angular.json index d8b9852..5dbb338 100644 --- a/angular.json +++ b/angular.json @@ -63,6 +63,7 @@ }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", + "proxyConfig": "src/proxy.conf.json", "configurations": { "production": { "buildTarget": "DTFluxTitrage-Client:build:production" diff --git a/package-lock.json b/package-lock.json index ad5a7f9..6c8126e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,9 @@ "@angular/platform-browser": "^19.2.0", "@angular/platform-browser-dynamic": "^19.2.0", "@angular/router": "^19.2.0", + "@fortawesome/fontawesome-free": "^6.7.2", + "@types/uuid": "^10.0.0", + "cbor-x": "^1.6.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" @@ -2467,6 +2470,84 @@ "node": ">=6.9.0" } }, + "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2912,6 +2993,15 @@ "node": ">=18" } }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, "node_modules/@inquirer/checkbox": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.9.tgz", @@ -5304,6 +5394,12 @@ "@types/node": "*" } }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -6329,6 +6425,52 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cbor-extract": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.1.1" + }, + "bin": { + "download-cbor-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" + } + }, + "node_modules/cbor-extract/node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/cbor-x": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz", + "integrity": "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==", + "license": "MIT", + "optionalDependencies": { + "cbor-extract": "^2.2.0" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7094,7 +7236,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, "license": "Apache-2.0", "optional": true, "engines": { diff --git a/package.json b/package.json index 19ab6cb..a18333c 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,9 @@ "@angular/platform-browser": "^19.2.0", "@angular/platform-browser-dynamic": "^19.2.0", "@angular/router": "^19.2.0", + "@fortawesome/fontawesome-free": "^6.7.2", + "@types/uuid": "^10.0.0", + "cbor-x": "^1.6.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" diff --git a/src/app/app.component.html b/src/app/app.component.html index 4044025..50072ed 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,3 +1,6 @@