From ccb7f5424f05a3290856d2ec5c4ed7c276ce1ff1 Mon Sep 17 00:00:00 2001 From: Alexandre Caron Date: Wed, 22 May 2024 14:12:40 -0400 Subject: [PATCH] WIP --- .gitignore | 6 - src/app/app.component.html | 9 - src/app/app.component.ts | 2 +- src/app/{app.routing.ts => app.routes.ts} | 15 +- .../basic-screen/basic-screen.component.html | 10 - .../basic-screen.component.spec.ts | 23 -- .../basic-screen/basic-screen.component.ts | 28 -- .../map-screen-panel.component.html | 22 -- .../map-screen-panel.component.scss | 0 .../map-screen-panel.component.spec.ts | 23 -- .../map-screen-panel.component.ts | 45 --- .../map-screen/map-screen.component.html | 106 ------ .../map-screen/map-screen.component.scss | 80 ----- .../screen/map-screen/map-screen.component.ts | 310 ------------------ .../map-screen/shared/map-screen.interface.ts | 1 - .../search-results-panel.component.html | 29 -- .../search-results-panel.component.scss | 3 - .../search-results-panel.component.ts | 95 ------ .../search-results-panel.utils.ts | 77 ----- .../sidenav-toggle.component.html | 11 - .../sidenav-toggle.component.scss | 7 - .../sidenav-toggle.component.spec.ts | 23 -- .../sidenav-toggle.component.ts | 47 --- .../about-sub-page.component.html | 7 +- .../about-sub-page.component.ts | 12 +- src/app/pages/about/about.component.html | 6 +- src/app/pages/about/about.component.ts | 3 +- .../{about.routing.ts => about.routes.ts} | 4 +- .../contact-us/contact-us.component.html | 12 + .../contact-us/contact-us.component.scss} | 0 .../contact-us/contact-us.component.spec.ts} | 12 +- .../pages/contact-us/contact-us.component.ts | 20 ++ src/app/pages/home/home.component.html | 6 +- src/app/pages/home/home.component.ts | 10 +- src/app/pages/map/map.component.html | 2 +- src/app/pages/map/map.component.ts | 12 +- src/environments/environment.ts | 12 +- src/environments/environnement.interface.ts | 3 +- src/main.ts | 4 +- src/polyfills.ts | 5 - tsconfig.json | 6 +- 41 files changed, 109 insertions(+), 999 deletions(-) rename src/app/{app.routing.ts => app.routes.ts} (53%) delete mode 100644 src/app/components/screen/basic-screen/basic-screen.component.html delete mode 100644 src/app/components/screen/basic-screen/basic-screen.component.spec.ts delete mode 100644 src/app/components/screen/basic-screen/basic-screen.component.ts delete mode 100644 src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.html delete mode 100644 src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.scss delete mode 100644 src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.spec.ts delete mode 100644 src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.ts delete mode 100644 src/app/components/screen/map-screen/map-screen.component.html delete mode 100644 src/app/components/screen/map-screen/map-screen.component.scss delete mode 100644 src/app/components/screen/map-screen/map-screen.component.ts delete mode 100644 src/app/components/screen/map-screen/shared/map-screen.interface.ts delete mode 100644 src/app/components/search-results/search-results-panel.component.html delete mode 100644 src/app/components/search-results/search-results-panel.component.scss delete mode 100644 src/app/components/search-results/search-results-panel.component.ts delete mode 100644 src/app/components/search-results/search-results-panel.utils.ts delete mode 100644 src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.html delete mode 100644 src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.scss delete mode 100644 src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.spec.ts delete mode 100644 src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.ts rename src/app/pages/about/{about.routing.ts => about.routes.ts} (81%) create mode 100644 src/app/pages/contact-us/contact-us.component.html rename src/app/{components/screen/basic-screen/basic-screen.component.scss => pages/contact-us/contact-us.component.scss} (100%) rename src/app/{components/screen/map-screen/map-screen.component.spec.ts => pages/contact-us/contact-us.component.spec.ts} (53%) create mode 100644 src/app/pages/contact-us/contact-us.component.ts diff --git a/.gitignore b/.gitignore index 69d4c900..411e4249 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,5 @@ # See https://help.github.com/ignore-files/ for more about ignoring files. -# bundled locale for the demo -/src/locale/libs_locale - # compiled output /dist /tmp @@ -39,6 +36,3 @@ testem.log #System Files .DS_Store Thumbs.db - -#Compodoc -/documentation diff --git a/src/app/app.component.html b/src/app/app.component.html index fdbb46bf..cead4573 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -12,14 +12,5 @@ [isHandset]="isHandset()" [options]="config.navigation?.options" > - - - - - diff --git a/src/app/app.component.ts b/src/app/app.component.ts index ae2ce2ab..7ccb5ca7 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -20,7 +20,7 @@ import { DomUtils } from '@igo2/utils'; import { delay, first } from 'rxjs'; import { EnvironmentOptions } from '../environments/environnement.interface'; -import { routes } from './app.routing'; +import { routes } from './app.routes'; import { AppService } from './app.service'; @Component({ diff --git a/src/app/app.routing.ts b/src/app/app.routes.ts similarity index 53% rename from src/app/app.routing.ts rename to src/app/app.routes.ts index ec11314e..7f15b6a6 100644 --- a/src/app/app.routing.ts +++ b/src/app/app.routes.ts @@ -1,6 +1,6 @@ -import { Routes } from '@angular/router'; +import { INavigationRoutes } from '@igo2/sdg'; -export const routes: Routes = [ +export const routes: INavigationRoutes = [ { path: '', redirectTo: '', pathMatch: 'full' }, { path: '', @@ -18,6 +18,15 @@ export const routes: Routes = [ path: 'en-savoir-plus', title: 'En savoir plus', loadChildren: () => - import('./pages/about/about.routing').then((m) => m.routes) + import('./pages/about/about.routes').then((m) => m.routes) + }, + { + path: 'contact-us', + title: 'header.contactUs', + hidden: true, + loadComponent: () => + import('./pages/contact-us/contact-us.component').then( + (m) => m.ContactUsComponent + ) } ]; diff --git a/src/app/components/screen/basic-screen/basic-screen.component.html b/src/app/components/screen/basic-screen/basic-screen.component.html deleted file mode 100644 index 5e4950fb..00000000 --- a/src/app/components/screen/basic-screen/basic-screen.component.html +++ /dev/null @@ -1,10 +0,0 @@ - - -
-
-
-

{{ title() }}

- -
-
-
diff --git a/src/app/components/screen/basic-screen/basic-screen.component.spec.ts b/src/app/components/screen/basic-screen/basic-screen.component.spec.ts deleted file mode 100644 index e59e2bb8..00000000 --- a/src/app/components/screen/basic-screen/basic-screen.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BasicScreenComponent } from './basic-screen.component'; - -describe('BasicScreenComponent', () => { - let component: BasicScreenComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [BasicScreenComponent] - }) - .compileComponents(); - - fixture = TestBed.createComponent(BasicScreenComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/components/screen/basic-screen/basic-screen.component.ts b/src/app/components/screen/basic-screen/basic-screen.component.ts deleted file mode 100644 index bc7bc642..00000000 --- a/src/app/components/screen/basic-screen/basic-screen.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Signal, - input -} from '@angular/core'; - -import { BreadcrumbsComponent } from '@igo2/sdg'; - -import { AppService } from '../../../app.service'; - -@Component({ - selector: 'app-basic-screen', - standalone: true, - imports: [BreadcrumbsComponent], - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './basic-screen.component.html', - styleUrl: './basic-screen.component.scss' -}) -export class BasicScreenComponent { - title = input.required(); - - get isHandset(): Signal { - return this.appService.isHandset; - } - - constructor(private appService: AppService) {} -} diff --git a/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.html b/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.html deleted file mode 100644 index 2b9efe49..00000000 --- a/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.html +++ /dev/null @@ -1,22 +0,0 @@ -@switch (type()) { - @case ('filter') { - - } - @case ('legend') { - - } - @case ('query') { - - } - @case ('search') { - - } -} diff --git a/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.scss b/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.spec.ts b/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.spec.ts deleted file mode 100644 index fc7a1672..00000000 --- a/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MapScreenPanelComponent } from './map-screen-panel.component'; - -describe('MapScreenPanelComponent', () => { - let component: MapScreenPanelComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [MapScreenPanelComponent] - }) - .compileComponents(); - - fixture = TestBed.createComponent(MapScreenPanelComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.ts b/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.ts deleted file mode 100644 index 14174382..00000000 --- a/src/app/components/screen/map-screen/map-screen-panel/map-screen-panel.component.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { NgSwitchCase } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - input, - output -} from '@angular/core'; - -import { IgoMap } from '@igo2/geo'; -import { QueryState, SearchState } from '@igo2/integration'; -import { - FilterPanelComponent, - LegendPanelComponent, - MapQueryResultsPanelComponent -} from '@igo2/sdg'; - -import { SearchResultPanelComponent } from '../../../search-results/search-results-panel.component'; -import { PanelType } from '../shared/map-screen.interface'; - -@Component({ - selector: 'app-map-screen-panel', - standalone: true, - imports: [ - NgSwitchCase, - SearchResultPanelComponent, - LegendPanelComponent, - MapQueryResultsPanelComponent, - FilterPanelComponent - ], - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './map-screen-panel.component.html', - styleUrl: './map-screen-panel.component.scss' -}) -export class MapScreenPanelComponent { - type = input.required(); - map = input.required(); - queryState = input.required(); - searchState = input.required(); - - closed = output(); - - onClose(): void { - this.closed.emit(true); - } -} diff --git a/src/app/components/screen/map-screen/map-screen.component.html b/src/app/components/screen/map-screen/map-screen.component.html deleted file mode 100644 index cc02cff4..00000000 --- a/src/app/components/screen/map-screen/map-screen.component.html +++ /dev/null @@ -1,106 +0,0 @@ -@if (isHandset()) { -
- - - - - - - - - - - -
-} @else { -
- - - - - - - -
- - - -
-
-
-
-} - - - - - - - - - @if (showSearchBar) { - - - } - - - - - @if ( - map() && (map().layers$ | async | filterableDataSource: 'ogc').length > 0 - ) { - - } - @if (config.hasLegendButton) { - - } - - diff --git a/src/app/components/screen/map-screen/map-screen.component.scss b/src/app/components/screen/map-screen/map-screen.component.scss deleted file mode 100644 index c8f948f5..00000000 --- a/src/app/components/screen/map-screen/map-screen.component.scss +++ /dev/null @@ -1,80 +0,0 @@ -@use '@angular/material' as mat; - -$panel-padding: 16px; -$sidenav-width: 400px; -$top-spacer: $panel-padding + 40px; // 40 for the search-bar height - -:host { - display: flex; - position: relative; - width: 100%; - height: 100%; -} - -mat-icon.disabled { - color: rgba(0, 0, 0, 0.38); -} - -mat-sidenav-container { - height: 100%; - width: 100%; - background-color: #efefef; -} - -mat-sidenav { - width: $sidenav-width; - - app-map-screen-panel { - display: block; - padding: $panel-padding; - - margin-top: $top-spacer; - height: calc(100% - #{$top-spacer}); - overflow: auto; - } -} - -.portal-desktop-container { - position: relative; - height: 100%; - width: 100%; - - igo-search-bar { - position: absolute; - top: $panel-padding; - left: $panel-padding; - z-index: 2; - width: calc($sidenav-width - $panel-padding * 2); - } -} - -mat-expansion-panel { - max-height: 60%; - - ::ng-deep { - .mat-expansion-panel-content { - overflow-y: scroll !important; - overflow-x: clip; - height: calc(100% - var(--mat-expansion-header-expanded-state-height)); - transition-delay: 225ms; - transition-property: height; - } - - igo-search-bar { - width: 100%; - } - } -} - -igo-spinner { - position: absolute; - top: 50%; - right: 50%; - z-index: 100; -} - -.search-bar-elevation { - box-shadow: - 0 2px 4px rgba(0, 0, 0, 0.2), - 0 -1px 0px rgba(0, 0, 0, 0.02); -} diff --git a/src/app/components/screen/map-screen/map-screen.component.ts b/src/app/components/screen/map-screen/map-screen.component.ts deleted file mode 100644 index 37824c65..00000000 --- a/src/app/components/screen/map-screen/map-screen.component.ts +++ /dev/null @@ -1,310 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, OnInit, Signal, ViewChild, signal } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatIconModule } from '@angular/material/icon'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { ActivatedRoute, Params } from '@angular/router'; - -import { ActionbarComponent } from '@igo2/common/action'; -import { type EntityRecord } from '@igo2/common/entity'; -import { - SpinnerActivityDirective, - SpinnerComponent -} from '@igo2/common/spinner'; -import { ConfigService } from '@igo2/core/config'; -import { IgoLanguageModule, LanguageService } from '@igo2/core/language'; -import { - FEATURE, - FilterableDataSourcePipe, - IgoMap, - IgoSearchModule, - QueryService, - Research, - SearchBarComponent, - SearchResult, - SearchSourceService, - computeOlFeaturesExtent, - provideOptionsApi, - provideSearch, - sourceCanReverseSearch, - sourceCanSearch, - withCadastreSource, - withCoordinatesReverseSource, - withIChercheReverseSource, - withIChercheSource, - withNominatimSource, - withStoredQueriesSource -} from '@igo2/geo'; -import { QueryState, SearchState } from '@igo2/integration'; -import { - FilterButtonComponent, - IMapConfig, - LegendButtonComponent, - MapComponent -} from '@igo2/sdg'; - -import olFormatGeoJSON from 'ol/format/GeoJSON'; - -import { debounceTime, skipWhile, take } from 'rxjs/operators'; - -import { AppService } from '../../../app.service'; -import { SidenavToggleComponent } from '../../sidenav/sidenav-toggle/sidenav-toggle.component'; -import { MapScreenPanelComponent } from './map-screen-panel/map-screen-panel.component'; -import { PanelType } from './shared/map-screen.interface'; - -const DEFAULT_PANEL_TYPE: PanelType = 'search'; - -@Component({ - selector: 'app-map-screen', - standalone: true, - imports: [ - CommonModule, - MatTooltipModule, - MatButtonModule, - MatIconModule, - MatSidenavModule, - MatDialogModule, - MatExpansionModule, - IgoSearchModule, - FilterableDataSourcePipe, - MapComponent, - FilterButtonComponent, - LegendButtonComponent, - ActionbarComponent, - IgoLanguageModule, - SidenavToggleComponent, - SpinnerComponent, - SpinnerActivityDirective, - MapScreenPanelComponent - ], - providers: [ - provideSearch( - [ - withNominatimSource(), - withIChercheSource(), - withIChercheReverseSource(), - withCoordinatesReverseSource(), - withStoredQueriesSource(), - withCadastreSource() - ], - { analytics: true } - ), - provideOptionsApi(), - SearchState - ], - templateUrl: './map-screen.component.html', - styleUrl: './map-screen.component.scss' -}) -export class MapScreenComponent implements OnInit { - public config: IMapConfig; - public hasFooter: boolean; - public showSearchBar: boolean; - - private termDefinedInUrl = false; - private termDefinedInUrlTriggered = false; - - panelOpened = signal(false); - panelType = signal(DEFAULT_PANEL_TYPE); - map = signal(undefined); - hasOgcDatasource = signal(false); - - get isHandset(): Signal { - return this.appService.isHandset; - } - - @ViewChild('searchbar') searchBar: SearchBarComponent; - - constructor( - private route: ActivatedRoute, - public searchState: SearchState, - public queryState: QueryState, - private searchSourceService: SearchSourceService, - private configService: ConfigService, - private languageService: LanguageService, - private queryService: QueryService, - private appService: AppService - ) { - this.handleAppConfigs(); - } - - ngOnInit() { - this.queryService.defaultFeatureCount = 1; - - this.route.queryParams.subscribe((params) => { - this.readLanguageParam(params); - this.readSearchParams(params); - this.readFocusFirst(params); - }); - } - - handleMap(map: IgoMap): void { - this.map.set(map); - } - - private handleAppConfigs() { - const config = this.configService.getConfigs(); - this.config = config; - this.showSearchBar = config.searchBar.showSearchBar ?? true; - this.hasFooter = config.hasFooter ?? true; - } - - openPanel(type: PanelType = DEFAULT_PANEL_TYPE): void { - if (this.panelType() !== type) { - this.panelType.set(type); - } - this.panelOpened.set(true); - } - - closePanel(): void { - this.panelOpened.set(false); - } - - togglePanel(type: PanelType) { - const opened = this.panelOpened(); - const typeChanged = type !== this.panelType(); - - // Si le type de change, on conserve le panneau ouvert - if (typeChanged && opened) { - this.panelType.set(type); - } else { - this.panelType.set(type); - this.panelOpened.update((value) => !value); - } - } - - handleFeaturesQuery(results: SearchResult[]): void { - if (!results.length) { - return; - } - this.openPanel('query'); - } - - onSearchTermChange(term?: string) { - // if (params?.search && term !== params.search) { - // this.searchState.deactivateCustomFilterTermStrategy(); - // } - this.searchState.setSearchTerm(term); - // const termWithoutHashtag = term.replace(/(#[^\s]*)/g, '').trim(); - // if (termWithoutHashtag.length < 2) { - // this.onClearSearch(); - // return; - // } - } - - onSearch(event: { research: Research; results: SearchResult[] }) { - this.openPanel('search'); - - const results = event.results; - - const isReverseSearch = !sourceCanSearch(event.research.source); - - let enabledSources; - if (isReverseSearch) { - enabledSources = this.searchSourceService - .getEnabledSources() - .filter(sourceCanReverseSearch); - } else { - enabledSources = this.searchSourceService - .getEnabledSources() - .filter(sourceCanSearch); - } - - const newResults = this.searchState.store.entities$.value - .filter( - (result: SearchResult) => - result.source !== event.research.source && - enabledSources.includes(result.source) - ) - .concat(results); - this.searchState.store.updateMany(newResults); - } - - clearSearch() { - this.map()?.searchResultsOverlay.clear(); - this.searchState.store.clear(); - this.searchState.setSelectedResult(undefined); - this.searchState.deactivateCustomFilterTermStrategy(); - this.searchState.setSearchTerm(''); - } - - private readLanguageParam(params: Params) { - if (params.lang) { - this.languageService.setLanguage(params.lang); - } - } - - private computeFocusFirst() { - setTimeout(() => { - const resultItem: HTMLElement = document - .getElementsByTagName('igo-search-results-item') - .item(0) as HTMLElement; - if (resultItem) { - resultItem.click(); - } - }, 1); - } - - private readFocusFirst(params: Params) { - if (params['sf'] === '1' && this.termDefinedInUrl) { - const entities$$ = this.searchState.store.stateView - .all$() - .pipe( - skipWhile((entities) => entities.length === 0), - debounceTime(1000), - take(1) - ) - .subscribe((entities) => { - entities$$.unsubscribe(); - if (entities.length && !this.termDefinedInUrlTriggered) { - this.computeFocusFirst(); - this.termDefinedInUrlTriggered = true; - } - }); - } - } - - private readSearchParams(params: Params) { - const map = this.map(); - const searchParam = params['search']; - if (searchParam) { - this.termDefinedInUrl = true; - if (params['exactMatch'] === '1') { - this.searchState.activateCustomFilterTermStrategy(); - } - if (searchParam && !params['zoom'] && params['sf'] !== '1') { - const entities$$ = this.searchState.store.stateView - .all$() - .pipe( - skipWhile((entities) => entities.length === 0), - debounceTime(500), - take(1) - ) - .subscribe((entities) => { - entities$$.unsubscribe(); - const searchResultsOlFeatures = entities - .filter((e) => e.entity.meta.dataType === FEATURE) - .map((entity: EntityRecord) => - new olFormatGeoJSON().readFeature(entity.entity.data, { - dataProjection: entity.entity.data.projection, - featureProjection: map?.projectionCode - }) - ); - if (map) { - const totalExtent = computeOlFeaturesExtent( - searchResultsOlFeatures, - map.viewProjection - ); - map.viewController.zoomToExtent(totalExtent); - } - }); - } - this.searchState.searchTerm$.next(searchParam); - } - if (params['searchGeom'] === '1') { - this.searchState.searchResultsGeometryEnabled$.next(true); - } - } -} diff --git a/src/app/components/screen/map-screen/shared/map-screen.interface.ts b/src/app/components/screen/map-screen/shared/map-screen.interface.ts deleted file mode 100644 index 54e7c531..00000000 --- a/src/app/components/screen/map-screen/shared/map-screen.interface.ts +++ /dev/null @@ -1 +0,0 @@ -export type PanelType = 'query' | 'search' | 'legend' | 'filter'; diff --git a/src/app/components/search-results/search-results-panel.component.html b/src/app/components/search-results/search-results-panel.component.html deleted file mode 100644 index 31fddace..00000000 --- a/src/app/components/search-results/search-results-panel.component.html +++ /dev/null @@ -1,29 +0,0 @@ -@if (searchState().store.empty$ | async) { -
-
-
- {{ 'igo.integration.searchResultsTool.noResults' | translate }} -
-
- {{ 'igo.integration.searchResultsTool.doSearch' | translate }} -
-

-
-
-} @else { - - -} diff --git a/src/app/components/search-results/search-results-panel.component.scss b/src/app/components/search-results/search-results-panel.component.scss deleted file mode 100644 index 5d4e87f3..00000000 --- a/src/app/components/search-results/search-results-panel.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/src/app/components/search-results/search-results-panel.component.ts b/src/app/components/search-results/search-results-panel.component.ts deleted file mode 100644 index d370e523..00000000 --- a/src/app/components/search-results/search-results-panel.component.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AsyncPipe } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - input, - output -} from '@angular/core'; -import { MatIconButton } from '@angular/material/button'; -import { MatIcon } from '@angular/material/icon'; -import { MatTooltip } from '@angular/material/tooltip'; - -import { IgoLanguageModule } from '@igo2/core/language'; -import { - FeatureMotion, - IgoMap, - Research, - SearchResult, - SearchResultsComponent -} from '@igo2/geo'; -import { SearchState } from '@igo2/integration'; - -import { - onResultFocus, - onResultSelect, - onResultUnfocus -} from './search-results-panel.utils'; - -enum SearchResultAction { - Focus = 'focus', - Select = 'select', - Unfocus = 'unfocus' -} - -@Component({ - selector: 'app-search-results-panel', - templateUrl: './search-results-panel.component.html', - styleUrls: ['./search-results-panel.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [ - MatTooltip, - MatIconButton, - MatIcon, - IgoLanguageModule, - SearchResultsComponent, - AsyncPipe - ] -}) -export class SearchResultPanelComponent { - map = input.required(); - searchState = input.required(); - - closed = output(); - - public searchResultActionEnum = SearchResultAction; - - constructor() {} - - onResult(searchResultAction: SearchResultAction, searchResult: SearchResult) { - const searchState = this.searchState(); - const map = this.map(); - switch (searchResultAction) { - case SearchResultAction.Focus: - onResultFocus(searchResult, map, searchState, { - featureMotion: FeatureMotion.None - }); - break; - case SearchResultAction.Select: - map.searchResultsOverlay.clear(); - onResultSelect(searchResult, map, searchState); - this.close(); - break; - case SearchResultAction.Unfocus: - onResultUnfocus(searchResult, map); - break; - } - } - - onMoreResults(event: { research: Research; results: SearchResult[] }) { - const searchState = this.searchState(); - const results = event.results; - searchState.store.state.updateAll({ - focused: false, - selected: false - }); - const newResults = searchState.store.entities$.value - .filter((result: SearchResult) => result.source !== event.research.source) - .concat(results); - searchState.store.updateMany(newResults); - } - - private close(): void { - this.closed.emit(true); - } -} diff --git a/src/app/components/search-results/search-results-panel.utils.ts b/src/app/components/search-results/search-results-panel.utils.ts deleted file mode 100644 index f8c9629d..00000000 --- a/src/app/components/search-results/search-results-panel.utils.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { - CommonVectorStyleOptions, - FEATURE, - Feature, - FeatureMotion, - IgoMap, - SearchResult, - getCommonVectorSelectedStyle -} from '@igo2/geo'; -import { SearchState } from '@igo2/integration'; - -export function onResultFocus( - result: SearchResult, - map: IgoMap, - searchState: SearchState, - options?: { featureMotion?: FeatureMotion } -) { - onResultSelectOrFocus(result, map, searchState, 'focus', options); -} - -export function onResultSelect( - result: SearchResult, - map: IgoMap, - searchState: SearchState, - options?: { featureMotion?: FeatureMotion } -) { - onResultSelectOrFocus(result, map, searchState, 'select', options); -} - -function onResultSelectOrFocus( - result: SearchResult, - map: IgoMap, - searchState: SearchState, - type: 'select' | 'focus', - options?: { featureMotion?: FeatureMotion } -) { - if (result.meta.dataType !== FEATURE) { - return undefined; - } - const feature = (result as SearchResult).data; - - // Somethimes features have no geometry. It happens with some GetFeatureInfo - if (!feature.geometry) { - return; - } - - let searchOverlayStyle: CommonVectorStyleOptions = - searchState.searchOverlayStyle; - let resultStyle: CommonVectorStyleOptions = result.style?.base - ? result.style.base - : {}; - switch (type) { - case 'focus': - searchOverlayStyle = searchState.searchOverlayStyleFocus; - resultStyle = result.style?.focus ? result.style.focus : {}; - break; - case 'select': - searchOverlayStyle = searchState.searchOverlayStyleSelection; - resultStyle = result.style?.selection ? result.style.selection : {}; - break; - } - - feature.meta.style = getCommonVectorSelectedStyle( - Object.assign({}, { feature }, searchOverlayStyle, resultStyle) - ); - - map.searchResultsOverlay.addFeature(feature, options?.featureMotion); -} - -export function onResultUnfocus(result: SearchResult, map: IgoMap) { - const feature = map.searchResultsOverlay.dataSource.ol.getFeatureById( - result.meta.id - ); - if (feature) { - map.searchResultsOverlay.removeFeature(result.data as Feature); - } -} diff --git a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.html b/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.html deleted file mode 100644 index cf0150fd..00000000 --- a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.scss b/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.scss deleted file mode 100644 index dcb85fec..00000000 --- a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -:host { - position: absolute; - top: 50%; - left: 0; - z-index: 1; - transition: left 300ms; -} diff --git a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.spec.ts b/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.spec.ts deleted file mode 100644 index 94fa52d0..00000000 --- a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SidenavToggleComponent } from './sidenav-toggle.component'; - -describe('SidenavToggleComponent', () => { - let component: SidenavToggleComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [SidenavToggleComponent] - }) - .compileComponents(); - - fixture = TestBed.createComponent(SidenavToggleComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.ts b/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.ts deleted file mode 100644 index af7a8aa6..00000000 --- a/src/app/components/sidenav/sidenav-toggle/sidenav-toggle.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - HostBinding, - effect, - input, - model -} from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { DomSanitizer, SafeStyle } from '@angular/platform-browser'; - -import { IgoLanguageModule } from '@igo2/core/language'; - -@Component({ - selector: 'app-sidenav-toggle', - standalone: true, - imports: [ - MatButtonModule, - MatIconModule, - MatTooltipModule, - IgoLanguageModule - ], - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './sidenav-toggle.component.html', - styleUrl: './sidenav-toggle.component.scss' -}) -export class SidenavToggleComponent { - opened = model.required(); - sidenavWidth = input.required(); - - @HostBinding('style') _style: SafeStyle; - set style(width: number) { - this._style = this.sanitizer.bypassSecurityTrustStyle(`left: ${width}px`); - } - - constructor(private sanitizer: DomSanitizer) { - effect(() => { - this.style = this.opened() ? 400 : 0; - }); - } - - toggle(): void { - this.opened.update((value) => !value); - } -} diff --git a/src/app/pages/about/about-sub-page/about-sub-page.component.html b/src/app/pages/about/about-sub-page/about-sub-page.component.html index 945b5a3a..dadcaa1f 100644 --- a/src/app/pages/about/about-sub-page/about-sub-page.component.html +++ b/src/app/pages/about/about-sub-page/about-sub-page.component.html @@ -1,4 +1,7 @@ - +

Exemple de navigation secondaire

Fil d'ariane dynamique

@@ -83,4 +86,4 @@

Fil d'ariane dynamique

Confecta res esset.
Cupiditates non Epicuri divisione finiebat, sed sua satietate.
-
+ diff --git a/src/app/pages/about/about-sub-page/about-sub-page.component.ts b/src/app/pages/about/about-sub-page/about-sub-page.component.ts index a7111319..7385d1e0 100644 --- a/src/app/pages/about/about-sub-page/about-sub-page.component.ts +++ b/src/app/pages/about/about-sub-page/about-sub-page.component.ts @@ -1,6 +1,8 @@ import { Component } from '@angular/core'; -import { BasicScreenComponent } from '../../../components/screen/basic-screen/basic-screen.component'; +import { BasicScreenComponent } from '@igo2/sdg'; + +import { AppService } from '../../../app.service'; @Component({ selector: 'app-about-sub-page', @@ -9,4 +11,10 @@ import { BasicScreenComponent } from '../../../components/screen/basic-screen/ba templateUrl: './about-sub-page.component.html', styleUrl: './about-sub-page.component.scss' }) -export class AboutSubPageComponent {} +export class AboutSubPageComponent { + get isHandset() { + return this.appService.isHandset; + } + + constructor(private appService: AppService) {} +} diff --git a/src/app/pages/about/about.component.html b/src/app/pages/about/about.component.html index 9878cf24..357ea11d 100644 --- a/src/app/pages/about/about.component.html +++ b/src/app/pages/about/about.component.html @@ -1,4 +1,4 @@ - +

Notre Mission

Mission 1

@@ -87,4 +87,6 @@

Mission 1

Naviguer à une sous page -
+ +
+ diff --git a/src/app/pages/about/about.component.ts b/src/app/pages/about/about.component.ts index 18b42282..198acef2 100644 --- a/src/app/pages/about/about.component.ts +++ b/src/app/pages/about/about.component.ts @@ -2,8 +2,9 @@ import { Component, Signal } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { RouterLink } from '@angular/router'; +import { BasicScreenComponent } from '@igo2/sdg'; + import { AppService } from '../../../app/app.service'; -import { BasicScreenComponent } from '../../components/screen/basic-screen/basic-screen.component'; @Component({ selector: 'app-about-page', diff --git a/src/app/pages/about/about.routing.ts b/src/app/pages/about/about.routes.ts similarity index 81% rename from src/app/pages/about/about.routing.ts rename to src/app/pages/about/about.routes.ts index cfaf8d98..24fd2956 100644 --- a/src/app/pages/about/about.routing.ts +++ b/src/app/pages/about/about.routes.ts @@ -1,6 +1,6 @@ -import { Routes } from '@angular/router'; +import { INavigationRoutes } from '@igo2/sdg'; -export const routes: Routes = [ +export const routes: INavigationRoutes = [ { path: '', redirectTo: '', pathMatch: 'full' }, { path: '', diff --git a/src/app/pages/contact-us/contact-us.component.html b/src/app/pages/contact-us/contact-us.component.html new file mode 100644 index 00000000..8e4cec9c --- /dev/null +++ b/src/app/pages/contact-us/contact-us.component.html @@ -0,0 +1,12 @@ + +

+ Paragraphe : Lorem ipsum dolor sit amet, consectetur adipiscing elit. Tu + enim ista lenius, hic Stoicorum more nos vexat. Quo studio Aristophanem + putamus aetatem in litteris duxisse? Honesta oratio, Socratica, Platonis + etiam. Vitiosum est enim in dividendo partem in genere numerare. + Non est igitur voluptas bonum. Duo Reges: constructio interrete. Non + autem hoc: igitur ne illud quidem. Magna laus. + Quis istum dolorem timet? Quod autem satis est, eo quicquid accessit, + nimium est; Sed ille, ut dixi, vitiose. +

+
diff --git a/src/app/components/screen/basic-screen/basic-screen.component.scss b/src/app/pages/contact-us/contact-us.component.scss similarity index 100% rename from src/app/components/screen/basic-screen/basic-screen.component.scss rename to src/app/pages/contact-us/contact-us.component.scss diff --git a/src/app/components/screen/map-screen/map-screen.component.spec.ts b/src/app/pages/contact-us/contact-us.component.spec.ts similarity index 53% rename from src/app/components/screen/map-screen/map-screen.component.spec.ts rename to src/app/pages/contact-us/contact-us.component.spec.ts index 9382533b..4f2b7f9b 100644 --- a/src/app/components/screen/map-screen/map-screen.component.spec.ts +++ b/src/app/pages/contact-us/contact-us.component.spec.ts @@ -1,18 +1,18 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MapScreenComponent } from './map-screen.component'; +import { ContactUsComponent } from './contact-us.component'; -describe('MapScreenComponent', () => { - let component: MapScreenComponent; - let fixture: ComponentFixture; +describe('ContactUsComponent', () => { + let component: ContactUsComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MapScreenComponent] + imports: [ContactUsComponent] }) .compileComponents(); - fixture = TestBed.createComponent(MapScreenComponent); + fixture = TestBed.createComponent(ContactUsComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/pages/contact-us/contact-us.component.ts b/src/app/pages/contact-us/contact-us.component.ts new file mode 100644 index 00000000..28849fba --- /dev/null +++ b/src/app/pages/contact-us/contact-us.component.ts @@ -0,0 +1,20 @@ +import { Component } from '@angular/core'; + +import { BasicScreenComponent } from '@igo2/sdg'; + +import { AppService } from '../../app.service'; + +@Component({ + selector: 'app-contact-us', + standalone: true, + imports: [BasicScreenComponent], + templateUrl: './contact-us.component.html', + styleUrl: './contact-us.component.scss' +}) +export class ContactUsComponent { + get isHandset() { + return this.appService.isHandset; + } + + constructor(private appService: AppService) {} +} diff --git a/src/app/pages/home/home.component.html b/src/app/pages/home/home.component.html index 1770f278..f8782310 100644 --- a/src/app/pages/home/home.component.html +++ b/src/app/pages/home/home.component.html @@ -1,11 +1,9 @@ - +

Infrastructure géomatique ouverte 2.0 (IGO2) / Open GIS Infrastructure 2.0

Qu'est-ce qu'IGO?

- -

IGO2 est une solution Web gratuite en géomatique basée sur Angular - Material, OpenLayers et IGO2lib. IGO2 permet de tirer profit d’une multitude @@ -27,4 +25,4 @@

Qu'est-ce qu'IGO?

>https://github.com/infra-geo-ouverte/igo2

-
+ diff --git a/src/app/pages/home/home.component.ts b/src/app/pages/home/home.component.ts index 5415e1d2..ce32c195 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -1,7 +1,9 @@ import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { BasicScreenComponent } from '../../components/screen/basic-screen/basic-screen.component'; +import { BasicScreenComponent } from '@igo2/sdg'; + +import { AppService } from '../../app.service'; @Component({ selector: 'app-home-page', @@ -10,5 +12,9 @@ import { BasicScreenComponent } from '../../components/screen/basic-screen/basic imports: [BasicScreenComponent, MatButtonModule] }) export class HomeComponent { - constructor() {} + get isHandset() { + return this.appService.isHandset; + } + + constructor(private appService: AppService) {} } diff --git a/src/app/pages/map/map.component.html b/src/app/pages/map/map.component.html index 06680319..942a1969 100644 --- a/src/app/pages/map/map.component.html +++ b/src/app/pages/map/map.component.html @@ -1 +1 @@ - + diff --git a/src/app/pages/map/map.component.ts b/src/app/pages/map/map.component.ts index c9561a19..59036ff1 100644 --- a/src/app/pages/map/map.component.ts +++ b/src/app/pages/map/map.component.ts @@ -1,6 +1,8 @@ import { Component } from '@angular/core'; -import { MapScreenComponent } from '../../components/screen/map-screen/map-screen.component'; +import { MapScreenComponent } from '@igo2/sdg/geo'; + +import { AppService } from '../../app.service'; @Component({ selector: 'app-map-page', @@ -9,4 +11,10 @@ import { MapScreenComponent } from '../../components/screen/map-screen/map-scree standalone: true, imports: [MapScreenComponent] }) -export class MapComponent {} +export class MapComponent { + get isHandset() { + return this.appService.isHandset; + } + + constructor(private appService: AppService) {} +} diff --git a/src/environments/environment.ts b/src/environments/environment.ts index a563d41e..271e9b44 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -34,11 +34,9 @@ export const environment: EnvironmentOptions = { }, navigation: { options: { - htmlDocument: { - title: { - suffix: 'IGO', - separator: '·' - } + title: { + suffix: 'IGO', + separator: '·' } } }, @@ -87,10 +85,8 @@ export const environment: EnvironmentOptions = { order: 2, params: { limit: '5' - }, - settings: [] + } }, - coordinatesreverse: {}, icherchereverse: { searchUrl: '/apis/terrapi', order: 3, diff --git a/src/environments/environnement.interface.ts b/src/environments/environnement.interface.ts index 510e30df..125062a4 100644 --- a/src/environments/environnement.interface.ts +++ b/src/environments/environnement.interface.ts @@ -1,5 +1,6 @@ import { AllEnvironmentOptions } from '@igo2/integration'; -import { IHeaderConfig, INavigationConfig, MapOverlay } from '@igo2/sdg'; +import type { IHeaderConfig, INavigationConfig } from '@igo2/sdg'; +import type { MapOverlay } from '@igo2/sdg/geo'; export interface EnvironmentOptions extends AllEnvironmentOptions { production: boolean; diff --git a/src/main.ts b/src/main.ts index 45aeab03..af53ecb6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -13,9 +13,10 @@ import { provideIcon } from '@igo2/common/icon'; import { IgoCoreModule } from '@igo2/core'; import { provideConfig } from '@igo2/core/config'; import { provideTranslation } from '@igo2/core/language'; +import { provideNavigationTitle } from '@igo2/sdg'; import { AppComponent } from './app/app.component'; -import { routes } from './app/app.routing'; +import { routes } from './app/app.routes'; import { environment } from './environments/environment'; if (environment.production) { @@ -40,6 +41,7 @@ bootstrapApplication(AppComponent, { path: './config/config.json' }), provideTranslation(), + provideNavigationTitle(), provideIcon() ] }).catch((err) => console.log(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts index 955c454a..84991457 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -2,16 +2,11 @@ * BROWSER POLYFILLS * -/** Evergreen browsers require these. **/ -import 'core-js/es/reflect'; - /*************************************************************************************************** * Zone JS is required by Angular itself. */ import 'zone.js'; -// Included with Angular CLI. - /*************************************************************************************************** * APPLICATION IMPORTS */ diff --git a/tsconfig.json b/tsconfig.json index bbb1ae34..d69f8808 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,11 @@ "paths": { "@igo2/sdg": [ "node_modules/@igo2/sdg", - "../../packages/sdg/src/public-api" + "../../packages/sdg/src/public-api", + ], + "@igo2/sdg/*": [ + "node_modules/@igo2/sdg", + "../../packages/sdg/geo/src/public-api", ] } },