Restructuration majeure du projet: migration de flutt vers app, ajout de l'API et mise à jour du site web
21
CLAUDE.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Build Commands
|
||||
- Flutter: `cd flutt && flutter run` - run the Flutter app
|
||||
- Flutter tests: `cd flutt && flutter test [test_file_path]` - run specific test
|
||||
- Flutter linting: `cd flutt && flutter analyze` - analyze Dart code
|
||||
- Flutter build: `cd flutt && flutter build [platform]` - build for specific platform
|
||||
- Web: `cd web && npm run dev` - run Svelte dev server
|
||||
- Web build: `cd web && npm run build` - build web app for production
|
||||
|
||||
## Code Style Guidelines
|
||||
- Flutter/Dart: Follow Flutter lint rules in analysis_options.yaml
|
||||
- Naming: camelCase for variables/methods, PascalCase for classes/enums
|
||||
- Imports: Group imports by type (dart, flutter, third-party, project)
|
||||
- Error handling: Use try/catch with specific error types
|
||||
- Documentation: Add documentation comments for public APIs
|
||||
- UI/Layout: Use responsive design principles (DashboardLayout widget)
|
||||
- Types: Use strong typing, avoid dynamic when possible
|
||||
- Architecture: Follow repository pattern for data access
|
||||
224
CONTEXT-AI.md
Normal file
@@ -0,0 +1,224 @@
|
||||
# AI_CONTEXT.md - GEOSECTOR
|
||||
|
||||
## Informations Générales
|
||||
|
||||
- **Nom du Projet**: GEOSECTOR
|
||||
- **Type de Projet**: Projet hybride avec un site web en Svelte 5, une application Web et mobile Flutter et une API PHP8.3 avec base de données centrale MariaDB
|
||||
- **Description**: Gestion de la distribution des calendriers pour les amicales de pompiers
|
||||
- **Date de Début**: 01/03/2025
|
||||
- **Statut Actuel**: [En développement]
|
||||
- **Lien GitLab**: [http://51.68.36.203:35788/d6soft/geosector]
|
||||
|
||||
## Structure du Projet
|
||||
|
||||
### Architecture Générale
|
||||
|
||||
- Un dossier /web pour le site web en Svelte 5 + Vite et TailwindCSS sans SvelteKit
|
||||
- Un dossier /app pour l'application Flutter avec Hive pour stocker en local les données de l'utilisateur
|
||||
- Un dossier /api pour l'API PHP 8.3 avec une base de données centrale MariaDB 11
|
||||
|
||||
### Structure des Dossiers
|
||||
|
||||
#### Application Flutter (/app)
|
||||
|
||||
- **/lib/core/data/models/** : Modèles de données avec annotations Hive pour le stockage local
|
||||
- **/lib/core/repositories/** : Gestion des données et communication avec l'API
|
||||
- **/lib/core/services/** : Services d'API, de synchronisation et utilitaires
|
||||
- **/lib/core/constants/** : Constantes de l'application, clés API et endpoints
|
||||
- **/lib/presentation/** : Interface utilisateur, pages et widgets
|
||||
- **/lib/chat/** : Fonctionnalités de messagerie
|
||||
|
||||
#### API PHP (/api)
|
||||
|
||||
- **/src/Controllers/** : Contrôleurs pour les différentes fonctionnalités
|
||||
- **/src/Core/** : Classes de base pour la gestion des requêtes, sessions, etc.
|
||||
- **/src/Services/** : Services pour l'authentification, le chiffrement, etc.
|
||||
|
||||
### Composants Principaux
|
||||
|
||||
#### Gestion des Utilisateurs et Authentification
|
||||
|
||||
- **UserRepository** : Gère les utilisateurs, l'authentification et les sessions
|
||||
- **ApiService** : Communication avec l'API, gestion des tokens de session
|
||||
- **Session** (PHP) : Gestion des sessions côté serveur
|
||||
- **LoginController** (PHP) : Authentification et déconnexion
|
||||
|
||||
#### Stockage Local avec Hive
|
||||
|
||||
- **UserModel** : Modèle utilisateur avec annotations Hive (typeId: 0)
|
||||
- **AmicaleModel** : Modèle pour les amicales (typeId: 11)
|
||||
- **OperationModel**, **SectorModel**, **PassageModel** : Modèles pour les opérations de terrain
|
||||
|
||||
#### Interface Utilisateur
|
||||
|
||||
- **LoginPage** : Page de connexion avec détection du type d'utilisateur
|
||||
- **SplashPage** : Page de démarrage et initialisation
|
||||
|
||||
## Technologies et Frameworks
|
||||
|
||||
### Langages de Programmation
|
||||
|
||||
- **Dart** : Pour l'application Flutter
|
||||
- **PHP 8.3** : Pour l'API backend
|
||||
- **JavaScript/TypeScript** : Pour le site web Svelte
|
||||
|
||||
### Frameworks et Bibliothèques
|
||||
|
||||
- **Flutter** : Framework UI cross-platform
|
||||
- **Hive** : Base de données NoSQL locale pour Flutter
|
||||
- **Dio** : Client HTTP pour les requêtes API
|
||||
- **GoRouter** : Navigation et routage dans Flutter
|
||||
- **Svelte 5** : Framework UI pour le site web
|
||||
|
||||
### Base de Données
|
||||
|
||||
- **Type**: MariaDB
|
||||
- **Version**: 11
|
||||
- **Schéma**: Structure principale dans `docs/geo_app.dump` avec tables pour utilisateurs, opérations, secteurs, passages
|
||||
- **Stockage Local**: Hive pour le stockage local dans l'application Flutter
|
||||
|
||||
### Outils de Développement
|
||||
|
||||
- **Gestionnaire de Paquets**: [Composer]
|
||||
- **Outils de Build**: [Webpack / Vite / Flutter CLI]
|
||||
- **Outils de Test**: [PHPUnit / Jest / Flutter Test]
|
||||
- **Linters/Formatters**: [PHP_CodeSniffer / ESLint / Dart Analyzer]
|
||||
|
||||
## Conventions de Code
|
||||
|
||||
### Style de Code
|
||||
|
||||
- [PSR-12 pour PHP]
|
||||
|
||||
### Conventions de Nommage
|
||||
|
||||
- **Classes**: [PascalCase]
|
||||
- **Méthodes/Fonctions**: [camelCase]
|
||||
- **Variables**: [camelCase]
|
||||
- **Constantes**: [UPPER_SNAKE_CASE]
|
||||
- **Fichiers**: [kebab-case.ext / PascalCase.ext]
|
||||
|
||||
### Pratiques Spécifiques au Projet
|
||||
|
||||
[Toute convention ou pratique spécifique à ce projet]
|
||||
|
||||
## Flux de Travail et Processus de Développement
|
||||
|
||||
### Branches GitLab
|
||||
|
||||
- **main/master**: [Production-ready code]
|
||||
- **develop**: [Integration branch for features]
|
||||
- **feature/[feature-name]**: [Feature development]
|
||||
- **bugfix/[bug-name]**: [Bug fixes]
|
||||
- **release/[version]**: [Release preparation]
|
||||
|
||||
### Processus de Merge Request
|
||||
|
||||
1. [Créer une branche à partir de develop]
|
||||
2. [Développer la fonctionnalité/correction]
|
||||
3. [Soumettre une MR vers develop]
|
||||
4. [Code review]
|
||||
5. [CI/CD validation]
|
||||
6. [Merge]
|
||||
|
||||
### CI/CD Pipeline
|
||||
|
||||
[Description de votre pipeline CI/CD dans GitLab]
|
||||
|
||||
## Intégration avec GitLab
|
||||
|
||||
### Issues et Kanban
|
||||
|
||||
- **Labels**: [Liste des labels principaux et leur signification]
|
||||
- **Milestones**: [Comment les milestones sont utilisées]
|
||||
- **Boards**: [Description des tableaux Kanban]
|
||||
|
||||
### Automatisations
|
||||
|
||||
[Description des automatisations GitLab utilisées]
|
||||
|
||||
## Déploiement
|
||||
|
||||
### Environnements
|
||||
|
||||
- Un environnement DEV dans un container Incus Alpine distant dva-geo
|
||||
- Un environnement RECETTE dans un container Incus Alpine distant rca-geo
|
||||
- Un environnement PROD dans un container Incus Alpine distant pra-geo
|
||||
|
||||
### Processus de Déploiement
|
||||
|
||||
- Un script /web/deploy-web.sh pour déployer le site Web sur l'environnement DEV
|
||||
- Un script /app/deploy-app.sh pour déployer l'application Flutter Web sur l'environnement DEV
|
||||
- Un script /api/deploy-api.sh pour déployer l'API PHP sur l'environnement DEV
|
||||
|
||||
- Un script /web/livre-web.sh $0 $1 pour livrer le site web d'un environnement $0 à l'autre $1
|
||||
- Un script /app/livre-app.sh $0 $1 pour livrer l'application Flutter Web d'un environnement $0 à l'autre $1
|
||||
- Un script /api/livre-api.sh $0 $1 pour livrer l'API PHP d'un environnement $0 à l'autre $1
|
||||
|
||||
## Ressources et Documentation
|
||||
|
||||
### Documentation Interne
|
||||
|
||||
- [Liens vers la documentation interne]
|
||||
|
||||
### API Documentation
|
||||
|
||||
- [Liens vers la documentation API (Swagger/OpenAPI)]
|
||||
|
||||
### Ressources Externes
|
||||
|
||||
- [Liens vers des ressources externes pertinentes]
|
||||
|
||||
## Contacts
|
||||
|
||||
### Équipe Principale
|
||||
|
||||
- **[Nom]**: [Rôle] - [Email/GitLab username]
|
||||
|
||||
### Parties Prenantes
|
||||
|
||||
- **[Nom]**: [Rôle/Organisation] - [Contact]
|
||||
|
||||
## Historique des Versions
|
||||
|
||||
| Version | Date | Description |
|
||||
| ------- | ------ | ------------- |
|
||||
| 1.0.0 | [Date] | [Description] |
|
||||
|
||||
## Processus d'Authentification et Gestion des Sessions
|
||||
|
||||
### Flux de Connexion
|
||||
|
||||
1. L'utilisateur entre ses identifiants dans la page de login (username/password)
|
||||
2. L'application envoie une requête POST à `/api/login` avec les identifiants et le type de connexion (user/admin)
|
||||
3. Le serveur vérifie les identifiants, crée une session PHP et renvoie:
|
||||
- Un `session_id` (utilisé comme token Bearer)
|
||||
- Une date d'expiration de session
|
||||
- Les données de l'utilisateur et les données associées (opérations, secteurs, passages)
|
||||
4. L'application stocke ces données dans des boîtes Hive locales
|
||||
5. Le `session_id` est utilisé pour toutes les requêtes API suivantes
|
||||
|
||||
### Flux de Déconnexion
|
||||
|
||||
1. L'utilisateur demande une déconnexion
|
||||
2. L'application envoie une requête POST à `/api/logout` avec le `session_id` dans l'en-tête
|
||||
3. Le serveur détruit la session PHP avec `session_unset()` et `session_destroy()`
|
||||
4. L'application:
|
||||
- Vide toutes les boîtes Hive sauf la boîte utilisateur
|
||||
- Conserve uniquement le username et le rôle de l'utilisateur pour faciliter la reconnexion
|
||||
- Réinitialise le `session_id` à null
|
||||
|
||||
### Particularités
|
||||
|
||||
- La page de login vérifie le rôle de l'utilisateur avant de pré-remplir le champ username
|
||||
- Le type de connexion (user/admin) détermine les données chargées et les droits d'accès
|
||||
- Les utilisateurs avec rôle=1 sont des utilisateurs standards, ceux avec rôle>1 sont des administrateurs
|
||||
- Les sessions expirent après 24 heures par défaut
|
||||
|
||||
## Notes Spécifiques pour les Assistants IA
|
||||
|
||||
- Toujours vérifier les issues GitLab avant de proposer des solutions
|
||||
- Respecter strictement les conventions de code mentionnées ci-dessus
|
||||
- Lors de modifications des modèles Hive, s'assurer que les typeId sont uniques pour éviter les conflits
|
||||
- Vérifier la compatibilité des modifications avec les trois plateformes (web, iOS, Android)
|
||||
- Pour les modifications de l'API, s'assurer que la réponse reste compatible avec le format attendu par l'application
|
||||
1
api
Submodule
@@ -1,15 +1,15 @@
|
||||
# Paramètres de connexion au host Debian 12
|
||||
HOST_SSH_USER=debian
|
||||
HOST_SSH_HOST=145.239.9.105
|
||||
HOST_SSH_USER=pierre
|
||||
HOST_SSH_HOST=195.154.80.116
|
||||
HOST_SSH_PORT=22
|
||||
HOST_SSH_KEY=/Users/pierre/.ssh/id_rsa_mbpi
|
||||
|
||||
# Paramètres du container Incus
|
||||
INCUS_PROJECT=DEV
|
||||
INCUS_CONTAINER=d-apps
|
||||
INCUS_PROJECT=default
|
||||
INCUS_CONTAINER=dva-geo
|
||||
CONTAINER_USER=root
|
||||
USE_SUDO=true
|
||||
|
||||
# Paramètres de déploiement
|
||||
DEPLOY_TARGET_DIR=/var/www/geosector
|
||||
DEPLOY_TARGET_DIR=/var/www/geosector/app
|
||||
FLUTTER_BUILD_DIR=build/web
|
||||
0
flutt/.gitignore → app/.gitignore
vendored
130
app/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"window.zoomLevel": 1, // Permet de zoomer, pratique si vous faites une présentation
|
||||
// Apparence
|
||||
// -- Editeur
|
||||
"workbench.startupEditor": "none", // On ne veut pas une page d'accueil chargée
|
||||
"editor.minimap.enabled": true, // On veut voir la minimap
|
||||
"editor.minimap.showSlider": "always", // On veut voir la minimap
|
||||
"editor.minimap.size": "fill", // On veut voir la minimap
|
||||
"editor.minimap.scale": 2,
|
||||
"editor.tokenColorCustomizations": {
|
||||
"textMateRules": [
|
||||
{
|
||||
"scope": [
|
||||
"storage.type.function",
|
||||
"storage.type.class"
|
||||
],
|
||||
"settings": {
|
||||
"fontStyle": "bold",
|
||||
"foreground": "#4B9CD3"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"editor.minimap.renderCharacters": true,
|
||||
"editor.minimap.maxColumn": 120,
|
||||
"breadcrumbs.enabled": false,
|
||||
// -- Tabs
|
||||
"workbench.editor.wrapTabs": true, // On veut voir les tabs
|
||||
"workbench.editor.tabSizing": "shrink", // On veut voir les tabs
|
||||
"workbench.editor.pinnedTabSizing": "compact",
|
||||
"workbench.editor.enablePreview": false, // Un clic sur un fichier l'ouvre
|
||||
// -- Sidebar
|
||||
"workbench.tree.indent": 15, // Indente plus pour plus de clarté dans la sidebar
|
||||
"workbench.tree.renderIndentGuides": "always",
|
||||
// -- Code
|
||||
"editor.occurrencesHighlight": "singleFile", // On veut voir les occurences d'une variable
|
||||
"editor.renderWhitespace": "trailing", // On ne veut pas laisser d'espace en fin de ligne
|
||||
"editor.renderControlCharacters": true, // On veut voir les caractères de contrôle
|
||||
// Thème
|
||||
"editor.fontFamily": "'JetBrains Mono', 'Fira Code', 'Operator Mono Lig', monospace",
|
||||
"editor.fontLigatures": false,
|
||||
"editor.fontSize": 13,
|
||||
"editor.lineHeight": 22,
|
||||
"editor.guides.bracketPairs": "active",
|
||||
// Ergonomie
|
||||
"editor.wordWrap": "off",
|
||||
"editor.rulers": [],
|
||||
"editor.suggest.insertMode": "replace", // L'autocomplétion remplace le mot en cours
|
||||
"editor.acceptSuggestionOnCommitCharacter": false, // Evite que l'autocomplétion soit accepté lors d'un . par exemple
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnPaste": true,
|
||||
"editor.linkedEditing": true, // Quand on change un élément HTML, change la balise fermante
|
||||
"editor.tabSize": 2,
|
||||
"editor.unicodeHighlight.nonBasicASCII": false,
|
||||
"[php]": {
|
||||
"editor.defaultFormatter": "bmewburn.vscode-intelephense-client",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnPaste": true
|
||||
},
|
||||
"intelephense.format.braces": "k&r",
|
||||
"intelephense.format.enable": true,
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnPaste": true
|
||||
},
|
||||
"[dart]": {
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnType": true,
|
||||
"editor.rulers": [
|
||||
80
|
||||
],
|
||||
"editor.selectionHighlight": false,
|
||||
"editor.tabCompletion": "onlySnippets",
|
||||
"editor.wordBasedSuggestions": "off"
|
||||
},
|
||||
"prettier.printWidth": 360,
|
||||
"prettier.semi": true,
|
||||
"prettier.singleQuote": true,
|
||||
"prettier.tabWidth": 2,
|
||||
"prettier.trailingComma": "es5",
|
||||
"explorer.autoReveal": false,
|
||||
"explorer.confirmDragAndDrop": false,
|
||||
"emmet.triggerExpansionOnTab": true,
|
||||
// Fichiers
|
||||
"files.defaultLanguage": "markdown",
|
||||
"files.autoSaveWorkspaceFilesOnly": true,
|
||||
"files.exclude": {
|
||||
"**/.idea": true
|
||||
},
|
||||
// Languages
|
||||
"javascript.preferences.importModuleSpecifierEnding": "js",
|
||||
"typescript.preferences.importModuleSpecifierEnding": "js",
|
||||
// Extensions
|
||||
"tailwindCSS.experimental.configFile": "frontend/tailwind.config.js",
|
||||
"editor.quickSuggestions": {
|
||||
"strings": true
|
||||
},
|
||||
"[svelte]": {
|
||||
"editor.defaultFormatter": "svelte.svelte-vscode",
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"prettier.documentSelectors": [
|
||||
"**/*.svelte"
|
||||
],
|
||||
"svelte.plugin.svelte.diagnostics.enable": false,
|
||||
"problems.decorations.enabled": false,
|
||||
"js/ts.implicitProjectConfig.checkJs": false,
|
||||
"svelte.enable-ts-plugin": false,
|
||||
"workbench.colorCustomizations": {
|
||||
"activityBar.activeBackground": "#405978",
|
||||
"activityBar.background": "#405978",
|
||||
"activityBar.foreground": "#e7e7e7",
|
||||
"activityBar.inactiveForeground": "#e7e7e799",
|
||||
"activityBarBadge.background": "#bc829c",
|
||||
"activityBarBadge.foreground": "#15202b",
|
||||
"commandCenter.border": "#e7e7e799",
|
||||
"sash.hoverBorder": "#405978",
|
||||
"statusBar.background": "#2e4057",
|
||||
"statusBar.foreground": "#e7e7e7",
|
||||
"statusBarItem.hoverBackground": "#405978",
|
||||
"statusBarItem.remoteBackground": "#2e4057",
|
||||
"statusBarItem.remoteForeground": "#e7e7e7",
|
||||
"titleBar.activeBackground": "#2e4057",
|
||||
"titleBar.activeForeground": "#e7e7e7",
|
||||
"titleBar.inactiveBackground": "#2e405799",
|
||||
"titleBar.inactiveForeground": "#e7e7e799"
|
||||
},
|
||||
"peacock.color": "#2E4057",
|
||||
}
|
||||
90
app/README-icons.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# Génération des icônes pour GEOSECTOR
|
||||
|
||||
Ce document explique comment générer les icônes pour toutes les plateformes (Android, iOS, Web) à partir du fichier SVG source.
|
||||
|
||||
## Prérequis
|
||||
|
||||
- Flutter SDK installé et configuré
|
||||
- ImageMagick installé (`brew install imagemagick`)
|
||||
- Le fichier SVG source doit être présent dans `assets/images/icon-geosector.svg`
|
||||
|
||||
## Utilisation du script de génération
|
||||
|
||||
Pour générer toutes les icônes, exécutez simplement:
|
||||
|
||||
```bash
|
||||
# Rendre le script exécutable
|
||||
chmod +x generate_icons.sh
|
||||
|
||||
# Exécuter le script
|
||||
./generate_icons.sh
|
||||
```
|
||||
|
||||
Ce script effectuera les actions suivantes:
|
||||
|
||||
1. Vérifier les dépendances nécessaires
|
||||
2. Mettre à jour les dépendances Flutter
|
||||
3. Générer les icônes principales avec `flutter_launcher_icons`
|
||||
4. Générer les icônes supplémentaires pour le web (favicon et iOS) avec ImageMagick
|
||||
5. Copier les icônes vers l'application web Svelte si elle existe
|
||||
|
||||
## Configuration
|
||||
|
||||
La configuration de génération des icônes est définie dans `pubspec.yaml` sous la section `flutter_launcher_icons`:
|
||||
|
||||
```yaml
|
||||
flutter_launcher_icons:
|
||||
android: true
|
||||
ios: true
|
||||
image_path: 'assets/images/icon-geosector.svg'
|
||||
min_sdk_android: 21
|
||||
adaptive_icon_background: '#FFFFFF'
|
||||
adaptive_icon_foreground: 'assets/images/icon-geosector.svg'
|
||||
remove_alpha_ios: true
|
||||
web:
|
||||
generate: true
|
||||
image_path: 'assets/images/icon-geosector.svg'
|
||||
background_color: '#FFFFFF'
|
||||
theme_color: '#4B77BE'
|
||||
windows:
|
||||
generate: true
|
||||
image_path: 'assets/images/icon-geosector.svg'
|
||||
icon_size: 48
|
||||
```
|
||||
|
||||
## Icônes générées
|
||||
|
||||
Le processus génère les fichiers suivants:
|
||||
|
||||
### Android
|
||||
|
||||
- `android/app/src/main/res/mipmap-*` - Icônes adaptatives pour diverses densités d'écran
|
||||
|
||||
### iOS
|
||||
|
||||
- `ios/Runner/Assets.xcassets/AppIcon.appiconset/` - Icônes pour diverses tailles d'appareils
|
||||
|
||||
### Web
|
||||
|
||||
- `web/icons/Icon-*.png` - Icônes PWA pour diverses tailles (192, 512, etc.)
|
||||
- `web/favicon.png` et `web/favicon-*.png` - Favicons pour navigateurs
|
||||
- `web/manifest.json` - Configuration PWA mise à jour
|
||||
|
||||
### Windows (si applicable)
|
||||
|
||||
- `windows/runner/resources/app_icon.ico` - Icône Windows
|
||||
|
||||
## Personnalisation
|
||||
|
||||
Pour personnaliser davantage le processus de génération:
|
||||
|
||||
1. Modifiez `pubspec.yaml` pour changer les couleurs ou paramètres de base
|
||||
2. Modifiez `generate_icons.sh` pour ajouter d'autres tailles ou formats d'icônes
|
||||
|
||||
## Dépannage
|
||||
|
||||
Si vous rencontrez des problèmes:
|
||||
|
||||
1. Vérifiez que le fichier SVG source existe et est valide
|
||||
2. Assurez-vous qu'ImageMagick est correctement installé
|
||||
3. Vérifiez les droits d'accès aux répertoires cibles
|
||||
BIN
app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 303 B |
|
After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
BIN
app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 300 B |
|
After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
BIN
app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 306 B |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
BIN
app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 318 B |
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
BIN
app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 322 B |
|
After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
BIN
app/assets/fonts/Figtree-VariableFont_wght.ttf
Normal file
BIN
app/assets/images/geosector-logo.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
34
app/assets/images/icon-geosector.svg
Normal file
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Calque_2" data-name="Calque 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 63.25 63.25">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #002c66;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #e3170a;
|
||||
}
|
||||
|
||||
.cls-3 {
|
||||
fill: #fff;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Calque_2-2" data-name="Calque 2">
|
||||
<g>
|
||||
<rect class="cls-2" width="63.25" height="63.25" rx="15.51" ry="15.51"/>
|
||||
<g>
|
||||
<path class="cls-3" d="M38.29,52.85h-13.34c-9.49,0-14.5-5.14-14.5-14.85v-12.7c0-9.75,5.01-14.91,14.5-14.91h13.34c9.07,0,13.93,4.38,14.44,13.01.05.87-.26,1.4-.53,1.69-.27.28-.76.62-1.61.62h-5.22c-1.29,0-2.12-.81-2.2-2.16-.28-3.09-1.33-3.94-4.87-3.94h-13.34c-1.27,0-2.17.12-2.84.37-.84.31-1.36.86-1.68,1.77l-1.42-.5c.47-1.34,1.31-2.21,2.57-2.68.84-.32,1.91-.46,3.37-.46h13.34c3.63,0,5.97.89,6.38,5.33.04.65.27.77.7.77h5.22c.14,0,.4-.02.52-.15.09-.1.14-.3.12-.56-.47-7.8-4.7-11.59-12.94-11.59h-13.34c-8.62,0-12.99,4.51-12.99,13.4v12.7c0,8.85,4.37,13.34,12.99,13.34h13.34c8.62,0,12.99-4.49,12.99-13.34v-7.31c0-.51-.18-.7-.7-.7h-16.59c-.51,0-.7.18-.7.7v4.18c0,.51.18.7.7.7h3.5v1.51h-3.5c-1.34,0-2.2-.87-2.2-2.2v-4.18c0-1.34.87-2.2,2.2-2.2h16.59c1.34,0,2.2.87,2.2,2.2v7.31c0,9.71-5.01,14.85-14.5,14.85ZM38.29,45.14h-13.34c-3.97,0-6.44-1.14-6.44-6.84h1.51c0,4.6,1.45,5.34,4.93,5.34h13.34c1.82,0,2.94-.26,3.65-.85l.97,1.16c-1.01.84-2.39,1.2-4.61,1.2Z"/>
|
||||
<g>
|
||||
<circle class="cls-1" cx="43.9" cy="36.68" r="4.47"/>
|
||||
<path class="cls-3" d="M42.96,39.02c-.17,0-.34-.07-.47-.2l-1.62-1.62c-.26-.26-.26-.69,0-.95s.69-.26.95,0l1.14,1.14,2.76-2.76c.26-.26.69-.26.95,0s.26.69,0,.95l-3.23,3.23c-.13.13-.3.2-.47.2Z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="cls-3" d="M24.04,27.75c0,1.03-.26,2.15-.77,3.33-.42.95-.99,1.94-1.71,2.94-.98,1.36-1.98,2.38-2.35,2.74-.37-.36-1.36-1.38-2.35-2.73-.73-1-1.3-2-1.71-2.95-.51-1.18-.77-2.3-.77-3.34,0-1.29.5-2.51,1.42-3.42.91-.92,2.13-1.42,3.42-1.42s2.5.5,3.42,1.42c.91.91,1.42,2.13,1.42,3.42Z"/>
|
||||
<circle class="cls-1" cx="19.21" cy="27.29" r="2"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
BIN
app/assets/images/icons/icon-1024.png
Normal file
|
After Width: | Height: | Size: 230 KiB |
BIN
app/assets/images/logo-geosector-1024.png
Normal file
|
After Width: | Height: | Size: 230 KiB |
47
app/copy-web-images.sh
Executable file
@@ -0,0 +1,47 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script pour copier les images dans le bon dossier pour l'application web
|
||||
echo "🔍 Copying images to correct web directory..."
|
||||
|
||||
# Vérifier si le dossier build/web existe
|
||||
if [ ! -d "build/web" ]; then
|
||||
echo "❌ Error: build/web directory does not exist. Run 'flutter build web' first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Création du dossier assets/images si inexistant
|
||||
mkdir -p build/web/assets/images
|
||||
|
||||
# Copie des images depuis le répertoire source
|
||||
cp -r assets/images/* build/web/assets/images/
|
||||
|
||||
# S'assurer que le logo est disponible avec les deux noms pour la compatibilité
|
||||
echo "🔄 Création d'un lien symbolique pour le logo..."
|
||||
if [ -f "build/web/assets/images/logo-geosector-1024.png" ]; then
|
||||
cp "build/web/assets/images/logo-geosector-1024.png" "build/web/assets/images/geosector-logo.png"
|
||||
echo "✅ Logo copié avec les deux noms pour assurer la compatibilité"
|
||||
fi
|
||||
|
||||
echo "✅ Images copied successfully!"
|
||||
|
||||
# Si besoin de redéployer sans reconstruire l'application
|
||||
if [ "$1" == "--deploy" ]; then
|
||||
# Définition des variables
|
||||
REMOTE_USER="root"
|
||||
REMOTE_HOST="87.98.163.161"
|
||||
SSH_KEY="/Users/pierre/.ssh/id_rsa_mbpi"
|
||||
REMOTE_PATH="/var/www/geosector"
|
||||
|
||||
echo "📤 Deploying fixed assets to server..."
|
||||
rsync -rltz \
|
||||
-e "ssh -i ${SSH_KEY}" \
|
||||
build/web/assets/ \
|
||||
${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/assets/
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ Deployment failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Assets deployed successfully!"
|
||||
fi
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
cd /Users/pierre/dev/geosector/flutt
|
||||
cd /Users/pierre/dev/geosector/app
|
||||
|
||||
# Charger les variables d'environnement
|
||||
if [ ! -f .env-deploy-dev ]; then
|
||||
@@ -32,6 +32,9 @@ dart pub run build_runner build --delete-conflicting-outputs || error_exit "Code
|
||||
echo "🏗️ Building Flutter web application..."
|
||||
flutter build web --release || error_exit "Flutter build failed"
|
||||
|
||||
echo "🖼️ Fixing web assets structure..."
|
||||
./copy-web-images.sh || error_exit "Failed to fix web assets"
|
||||
|
||||
echo "✅ Build completed successfully!"
|
||||
|
||||
# Préparation de la commande SSH pour le host
|
||||
22
app/flutter_launcher_icons.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
flutter_launcher_icons:
|
||||
# Configuration générale
|
||||
image_path: "assets/images/icon-geosector.svg"
|
||||
image_path_android: "assets/images/icon-geosector.svg"
|
||||
image_path_ios: "assets/images/icon-geosector.svg"
|
||||
|
||||
# Configuration Android
|
||||
android: true
|
||||
min_sdk_android: 21
|
||||
adaptive_icon_background: "#FFFFFF"
|
||||
adaptive_icon_foreground: "assets/images/icon-geosector.svg"
|
||||
|
||||
# Configuration iOS
|
||||
ios: true
|
||||
remove_alpha_ios: true
|
||||
|
||||
# Configuration Web
|
||||
web:
|
||||
generate: true
|
||||
image_path: "assets/images/icon-geosector.svg"
|
||||
background_color: "#FFFFFF"
|
||||
theme_color: "#4B77BE"
|
||||
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 8.3 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |