From e4fa2e14b793047715788e9534c02c383f640bb3 Mon Sep 17 00:00:00 2001 From: DOOMED2WIN Date: Thu, 22 Feb 2024 14:03:20 +0100 Subject: [PATCH 1/7] navigator portal structure --- src/app/core/api/generated/schema.ts | 194 ++++++++++++++++++ src/app/core/constants/feature.constants.ts | 1 + .../contest-portal-details-landing.module.ts | 1 - .../navigation-admin-form.component.html | 21 ++ .../navigation-admin-form.component.scss | 29 +++ .../navigation-admin-form.component.ts | 68 ++++++ .../navigation-admin-form.constants.ts | 1 + .../navigation-admin-form-routing.module.ts | 16 ++ .../form/navigation-admin-form.module.ts | 74 +++++++ .../state/navigation-admin-form.actions.ts | 20 ++ .../state/navigation-portal-form.effects.ts | 63 ++++++ .../state/navigation-portal-form.reducer.ts | 23 +++ .../state/navigation-portal-form.selectors.ts | 15 ++ .../admin/navigation-admin-routing.module.ts | 60 ++++++ .../deal-admin-overview.component.html | 17 ++ .../deal-admin-overview.component.scss | 5 + .../deal-admin-overview.component.ts | 87 ++++++++ .../deal-admin-overview.constants.ts | 1 + .../deal-admin-overview-routing.module.ts | 16 ++ .../overview/deal-admin-overview.module.ts | 56 +++++ .../state/deal-admin-overview.actions.ts | 18 ++ .../state/deal-portal-overview.effects.ts | 110 ++++++++++ .../state/deal-portal-overview.reducer.ts | 24 +++ .../state/deal-portal-overview.selectors.ts | 15 ++ .../features/navigator/api/codegen/codegen.ts | 32 +++ .../delete-navigator-node.mutation.graphql | 3 + .../get-navigator-details.query.graphql | 26 +++ ...elete-navigator-node.mutation.generated.ts | 29 +++ .../get-navigator-details.query.generated.ts | 50 +++++ .../constants/navigator-details.constant.ts | 0 ...ator-portal-details-landing.component.html | 6 + ...ator-portal-details-landing.component.scss | 0 ...igator-portal-details-landing.component.ts | 46 +++++ .../navigator-details-landing.constant.ts | 2 + ...r-portal-details-landing-routing.module.ts | 16 ++ ...navigator-portal-details-landing.module.ts | 75 +++++++ ...avigator-portal-details-landing.actions.ts | 13 ++ ...avigator-portal-details-landing.effects.ts | 50 +++++ ...avigator-portal-details-landing.reducer.ts | 20 ++ ...igator-portal-details-landing.selectors.ts | 15 ++ ...navigator-portal-details-routing.module.ts | 17 ++ .../navigator-portal-details.module.ts | 10 + .../portal/navigator-portal-routing.module.ts | 23 +++ src/app/portal/portal.module.ts | 2 + 44 files changed, 1369 insertions(+), 1 deletion(-) create mode 100644 src/app/features/navigator/admin/form/component/navigation-admin-form.component.html create mode 100644 src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss create mode 100644 src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts create mode 100644 src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts create mode 100644 src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts create mode 100644 src/app/features/navigator/admin/form/navigation-admin-form.module.ts create mode 100644 src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts create mode 100644 src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts create mode 100644 src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts create mode 100644 src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts create mode 100644 src/app/features/navigator/admin/navigation-admin-routing.module.ts create mode 100644 src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html create mode 100644 src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss create mode 100644 src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts create mode 100644 src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts create mode 100644 src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts create mode 100644 src/app/features/navigator/admin/overview/deal-admin-overview.module.ts create mode 100644 src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts create mode 100644 src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts create mode 100644 src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts create mode 100644 src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts create mode 100644 src/app/features/navigator/api/codegen/codegen.ts create mode 100644 src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql create mode 100644 src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql create mode 100644 src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts create mode 100644 src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts create mode 100644 src/app/features/navigator/portal/details/constants/navigator-details.constant.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html create mode 100644 src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.scss create mode 100644 src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts create mode 100644 src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts create mode 100644 src/app/features/navigator/portal/details/navigator-portal-details.module.ts create mode 100644 src/app/features/navigator/portal/navigator-portal-routing.module.ts diff --git a/src/app/core/api/generated/schema.ts b/src/app/core/api/generated/schema.ts index 3e063b3de..12d04e9d2 100644 --- a/src/app/core/api/generated/schema.ts +++ b/src/app/core/api/generated/schema.ts @@ -1820,6 +1820,10 @@ export type Mutation = { deleteMilestoneMedia?: Maybe; deleteMilestoneMedium?: Maybe; deleteMilestones?: Maybe; + deleteNavigatorNode?: Maybe; + deleteNavigatorNodes?: Maybe; + deleteNavigatorResultPage?: Maybe; + deleteNavigatorResultPages?: Maybe; deleteNotification?: Maybe; deleteNotifications?: Maybe; deleteOrganisation?: Maybe; @@ -1971,6 +1975,10 @@ export type Mutation = { saveMilestoneMedia?: Maybe>>; saveMilestoneMedium?: Maybe; saveMilestones?: Maybe>>; + saveNavigatorNode?: Maybe; + saveNavigatorNodes?: Maybe>>; + saveNavigatorResultPage?: Maybe; + saveNavigatorResultPages?: Maybe>>; saveNotification?: Maybe; saveNotifications?: Maybe>>; saveOrganisation?: Maybe; @@ -2617,6 +2625,30 @@ export type MutationDeleteMilestonesArgs = { }; +/** Mutation root */ +export type MutationDeleteNavigatorNodeArgs = { + id?: InputMaybe; +}; + + +/** Mutation root */ +export type MutationDeleteNavigatorNodesArgs = { + ids?: InputMaybe>>; +}; + + +/** Mutation root */ +export type MutationDeleteNavigatorResultPageArgs = { + id?: InputMaybe; +}; + + +/** Mutation root */ +export type MutationDeleteNavigatorResultPagesArgs = { + ids?: InputMaybe>>; +}; + + /** Mutation root */ export type MutationDeleteNotificationArgs = { id?: InputMaybe; @@ -3524,6 +3556,30 @@ export type MutationSaveMilestonesArgs = { }; +/** Mutation root */ +export type MutationSaveNavigatorNodeArgs = { + entity?: InputMaybe; +}; + + +/** Mutation root */ +export type MutationSaveNavigatorNodesArgs = { + entities?: InputMaybe>>; +}; + + +/** Mutation root */ +export type MutationSaveNavigatorResultPageArgs = { + entity?: InputMaybe; +}; + + +/** Mutation root */ +export type MutationSaveNavigatorResultPagesArgs = { + entities?: InputMaybe>>; +}; + + /** Mutation root */ export type MutationSaveNotificationArgs = { entity?: InputMaybe; @@ -3973,6 +4029,104 @@ export type MutationVerifyAddressArgs = { entity?: InputMaybe; }; +export type NavigatorConnectionEntity = { + __typename?: 'NavigatorConnectionEntity'; + child?: Maybe; + created?: Maybe; + id?: Maybe; + modified?: Maybe; + order?: Maybe; + parent?: Maybe; +}; + +export type NavigatorConnectionEntityInput = { + child?: InputMaybe; + created?: InputMaybe; + id?: InputMaybe; + modified?: InputMaybe; + order?: InputMaybe; + parent?: InputMaybe; +}; + +export type NavigatorNodeEntity = { + __typename?: 'NavigatorNodeEntity'; + additionalInformation?: Maybe; + children?: Maybe>>; + content?: Maybe; + created?: Maybe; + id?: Maybe; + modified?: Maybe; + name?: Maybe; + parents?: Maybe>>; + possibleChildNodes?: Maybe>>; + resultPage?: Maybe; + slug?: Maybe; + title?: Maybe; + translatables?: Maybe>>; +}; + +export type NavigatorNodeEntityInput = { + additionalInformation?: InputMaybe; + children?: InputMaybe>>; + content?: InputMaybe; + created?: InputMaybe; + id?: InputMaybe; + modified?: InputMaybe; + name?: InputMaybe; + parents?: InputMaybe>>; + resultPage?: InputMaybe; + slug?: InputMaybe; + title?: InputMaybe; + translatables?: InputMaybe>>; +}; + +export type NavigatorNodeTranslatableEntity = { + __typename?: 'NavigatorNodeTranslatableEntity'; + additionalInformation?: Maybe; + content?: Maybe; + created?: Maybe; + id?: Maybe; + language?: Maybe; + modified?: Maybe; + name?: Maybe; + title?: Maybe; +}; + +export type NavigatorNodeTranslatableEntityInput = { + additionalInformation?: InputMaybe; + content?: InputMaybe; + created?: InputMaybe; + id?: InputMaybe; + modified?: InputMaybe; + name?: InputMaybe; + title?: InputMaybe; +}; + +export type NavigatorResultPageEntity = { + __typename?: 'NavigatorResultPageEntity'; + content?: Maybe; + created?: Maybe; + id?: Maybe; + modified?: Maybe; + navigatorNode?: Maybe>>; + slug?: Maybe; + title?: Maybe; + translatables?: Maybe>>; + url?: Maybe; +}; + +export type NavigatorResultPageEntityInput = { + content?: InputMaybe; + created?: InputMaybe; + id?: InputMaybe; + modified?: InputMaybe; + navigatorNode?: InputMaybe>>; + slug?: InputMaybe; + title?: InputMaybe; + translatables?: InputMaybe>>; + url?: InputMaybe; +}; + export type NotificationEntity = { __typename?: 'NotificationEntity'; created?: Maybe; @@ -4687,6 +4841,18 @@ export type PageableList_MilestoneMediaEntity = { total: Scalars['Long']['output']; }; +export type PageableList_NavigatorNodeEntity = { + __typename?: 'PageableList_NavigatorNodeEntity'; + result?: Maybe>>; + total: Scalars['Long']['output']; +}; + +export type PageableList_NavigatorResultPageEntity = { + __typename?: 'PageableList_NavigatorResultPageEntity'; + result?: Maybe>>; + total: Scalars['Long']['output']; +}; + export type PageableList_NotificationEntity = { __typename?: 'PageableList_NotificationEntity'; result?: Maybe>>; @@ -5065,6 +5231,10 @@ export type Query = { getMilestoneMedia?: Maybe; getMilestoneMedium?: Maybe; getMilestones?: Maybe; + getNavigatorNode?: Maybe; + getNavigatorNodes?: Maybe; + getNavigatorResultPage?: Maybe; + getNavigatorResultPages?: Maybe; getNotification?: Maybe; getNotifications?: Maybe; getOrganisation?: Maybe; @@ -5615,6 +5785,30 @@ export type QueryGetMilestonesArgs = { }; +/** Query root */ +export type QueryGetNavigatorNodeArgs = { + entity?: InputMaybe; +}; + + +/** Query root */ +export type QueryGetNavigatorNodesArgs = { + params?: InputMaybe; +}; + + +/** Query root */ +export type QueryGetNavigatorResultPageArgs = { + entity?: InputMaybe; +}; + + +/** Query root */ +export type QueryGetNavigatorResultPagesArgs = { + params?: InputMaybe; +}; + + /** Query root */ export type QueryGetNotificationArgs = { entity?: InputMaybe; diff --git a/src/app/core/constants/feature.constants.ts b/src/app/core/constants/feature.constants.ts index 86c3261c1..2b1269372 100644 --- a/src/app/core/constants/feature.constants.ts +++ b/src/app/core/constants/feature.constants.ts @@ -11,6 +11,7 @@ export const formsFeatureKey = 'forms'; export const guestArticlesFeatureKey = 'guestarticle'; export const mapFeatureKey = 'map'; export const mediaFeatureKey = 'media'; +export const navigatorFeatureKey = 'navigator'; export const organisationsFeatureKey = 'organisations'; export const reportsFeatureKey = 'reports'; export const surveysFeatureKey = 'surveys'; diff --git a/src/app/features/contest/portal/details/modules/landing/contest-portal-details-landing.module.ts b/src/app/features/contest/portal/details/modules/landing/contest-portal-details-landing.module.ts index f2ef91578..26592bed1 100644 --- a/src/app/features/contest/portal/details/modules/landing/contest-portal-details-landing.module.ts +++ b/src/app/features/contest/portal/details/modules/landing/contest-portal-details-landing.module.ts @@ -39,7 +39,6 @@ const components = [ ContestPortalDetailsCommentComponent, ContestPortalDetailsSummaryComponent, PortalContestDetailsMediaComponent - ]; const framework = [ diff --git a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.html b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.html new file mode 100644 index 000000000..9ec29e2d9 --- /dev/null +++ b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss new file mode 100644 index 000000000..20b2c4a2a --- /dev/null +++ b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss @@ -0,0 +1,29 @@ +:host { + display: flex; + flex-flow: column; + gap: 1rem; +} + +button { + align-self: flex-start; +} + +div { + display: flex; + gap: 1rem; + align-items: center; +} + +:host ::ng-deep { + + .mat-mdc-form-field-subscript-wrapper { + display: none; + } + +} + +mat-radio-group { + display: flex; + flex-wrap: wrap; + gap: 1rem +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts new file mode 100644 index 000000000..c6a494ff6 --- /dev/null +++ b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts @@ -0,0 +1,68 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { Subject, filter, switchMap, takeUntil, tap } from 'rxjs'; +import { Maybe, NavigationNodeEntity } from 'src/app/core/api/generated/schema'; +import { slug } from 'src/app/core/constants/queryparam.constants'; +import { DealAdminFormActions } from '../state/navigation-admin-form.actions'; +import { selectDeal } from '../state/navigation-portal-form.selectors'; + + +@Component({ + selector: 'app-navigation-admin-form', + templateUrl: './navigation-admin-form.component.html', + styleUrls: ['./navigation-admin-form.component.scss'] +}) +export class NavigationAdminFormComponent implements OnInit, OnDestroy { + + public contentForm = this.fb.group({ + id: [undefined as Maybe], + name: [undefined as Maybe, [Validators.required]], + content: [undefined as Maybe, [Validators.required]], + }); + + public connectionForm = this.fb.group({ + conenctions: [[] as Maybe[]], + }); + + private destroy = new Subject(); + + constructor( + private activatedRoute: ActivatedRoute, + private fb: FormBuilder, + private store: Store, + ) {} + +public ngOnInit(): void { + + this.activatedRoute?.parent?.params.pipe( + filter(params => !!params[slug]), + tap(params => this.store.dispatch(DealAdminFormActions.getDeal(params[slug]))), + switchMap(() => this.store.select(selectDeal)), + filter(deal => !!deal?.id), + takeUntil(this.destroy) + ).subscribe(deal => { + + this.contentForm.patchValue({ + id: deal?.id, + name: deal?.name, + content: deal?.content, + }); + + }); + } + + public cancelled(): void { + this.store.dispatch(DealAdminFormActions.cancelled()); + } + + public saved(): void { + } + + public ngOnDestroy(): void { + this.destroy.next(); + this.destroy.complete(); + } + +} diff --git a/src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts b/src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts new file mode 100644 index 000000000..ca1b09b02 --- /dev/null +++ b/src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts @@ -0,0 +1 @@ +export const dealAdminFormStateKey = 'dealAdminFormState'; diff --git a/src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts b/src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts new file mode 100644 index 000000000..eb55ce7f8 --- /dev/null +++ b/src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { DealAdminFormComponent } from './component/navigation-admin-form.component'; + +const routes: Routes = [ + { + path: '', + component: DealAdminFormComponent, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class DealAdminFormRoutingModule { } diff --git a/src/app/features/navigator/admin/form/navigation-admin-form.module.ts b/src/app/features/navigator/admin/form/navigation-admin-form.module.ts new file mode 100644 index 000000000..20a7f2d74 --- /dev/null +++ b/src/app/features/navigator/admin/form/navigation-admin-form.module.ts @@ -0,0 +1,74 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { RichtextEditorFormComponent } from 'ngx-cinlib/forms/richtext'; +import { FormStepComponent, FormStepperComponent } from 'ngx-cinlib/forms/stepper'; +import { I18nDirective, TranslatablePipe } from 'ngx-cinlib/i18n'; +import { GridColumnDirective, GridRowComponent } from 'ngx-cinlib/layouts/grid-layout'; +import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; +import { MediaFormComponent } from 'ngx-cinlib/media/forms'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigationAdminRoutingModule } from '../navigation-admin-routing.module'; +import { NavigationAdminFormComponent } from './component/navigation-admin-form.component'; +import { dealAdminFormStateKey } from './constants/navigation-admin-form.constants'; +import { DealAdminFormEffects } from './state/navigation-portal-form.effects'; +import { dealAdminFormReducer } from './state/navigation-portal-form.reducer'; + +const components = [ + NavigationAdminFormComponent +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatFormFieldModule, + MatInputModule, + MatSlideToggleModule, + MatSelectModule, + FormsModule, + MatRadioModule, + ReactiveFormsModule, +]; + +const modules = [ + CoreModule, + NavigationAdminRoutingModule, +]; + +const libs = [ + StoreModule.forFeature(dealAdminFormStateKey, dealAdminFormReducer), + EffectsModule.forFeature([DealAdminFormEffects]), + + FormStepComponent, + FormStepperComponent, + GridColumnDirective, + GridRowComponent, + I18nDirective, + MediaFormComponent, + PageTitleComponent, + RichtextEditorFormComponent, + TranslatablePipe, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class DealAdminFormModule { } diff --git a/src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts b/src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts new file mode 100644 index 000000000..31251fb4a --- /dev/null +++ b/src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts @@ -0,0 +1,20 @@ +import { createActionGroup, emptyProps } from '@ngrx/store'; +import { DealCategoryEntity, DealEntity, DealEntityInput, Maybe } from 'src/app/core/api/generated/schema'; + +export const DealAdminFormActions = createActionGroup({ + source: 'Deal Admin Form', + events: { + + 'get deal': (slug: Maybe) => ({ slug }), + 'set deal': (deal: Maybe) => ({ deal }), + + 'get categories': emptyProps(), + 'set categories': (categories: Maybe) => ({ categories }), + + 'cancelled': emptyProps(), + + 'save': (deal: DealEntityInput) => ({ deal }), + 'saved': emptyProps(), + + } +}); diff --git a/src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts b/src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts new file mode 100644 index 000000000..14ad840ed --- /dev/null +++ b/src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { FeedbackType } from 'ngx-cinlib/modals/feedback'; +import { map, switchMap, tap } from 'rxjs'; +import { DealCategoryEntity, DealEntity } from 'src/app/core/api/generated/schema'; +import { dealsFeatureKey } from 'src/app/core/constants/feature.constants'; +import { adminUrl } from 'src/app/core/constants/module.constants'; +import { CoreActions } from 'src/app/core/state/actions/core.actions'; +import { GetDealCategoriesGQL } from '../../../api/generated/get-deal-categories.query.generated'; +import { GetDealGQL } from '../../../api/generated/get-deal.query.generated'; + +import { SaveDealGQL } from '../../../api/generated/save-deal.mutation.generated'; +import { DealAdminFormActions } from './navigation-admin-form.actions'; + +@Injectable() +export class DealAdminFormEffects { + + getDeal = createEffect(() => this.actions.pipe( + ofType(DealAdminFormActions.getDeal), + switchMap(action => this.getDealService.watch({ + entity: { slug: action.slug } + }).valueChanges), + map(response => DealAdminFormActions.setDeal(response.data.getDeal as DealEntity)) + )); + + getCategories = createEffect(() => this.actions.pipe( + ofType(DealAdminFormActions.getCategories), + switchMap(() => this.getDealCategoriesService.watch().valueChanges), + map(response => DealAdminFormActions.setCategories(response.data.getDealCategories?.result as DealCategoryEntity[])) + )); + + cancelled = createEffect(() => this.actions.pipe( + ofType(DealAdminFormActions.cancelled), + tap(() => this.router.navigate([adminUrl, dealsFeatureKey])), + ), { dispatch: false }); + +save = createEffect(() => this.actions.pipe( + ofType(DealAdminFormActions.save), + switchMap(action => this.saveDealService.mutate({ + entity: action.deal + })), + map(() => DealAdminFormActions.saved()) +)); + + + saved = createEffect(() => this.actions.pipe( + ofType(DealAdminFormActions.saved), + tap(() => this.router.navigate([adminUrl, dealsFeatureKey])), + map(() => CoreActions.setFeedback({ + type: FeedbackType.Success, + labelMessage: 'savedSuccessfully' + })) + )); + + constructor( + private actions: Actions, + private getDealService: GetDealGQL, + private getDealCategoriesService: GetDealCategoriesGQL, + private router: Router, + private saveDealService: SaveDealGQL + ) {} +} diff --git a/src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts b/src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts new file mode 100644 index 000000000..dc17d2269 --- /dev/null +++ b/src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts @@ -0,0 +1,23 @@ +import { createReducer, on } from '@ngrx/store'; +import { DealCategoryEntity, DealEntity, Maybe } from 'src/app/core/api/generated/schema'; +import { DealAdminFormActions } from './navigation-admin-form.actions'; + +export interface DealAdminFormState { + event?: Maybe, + categories?: Maybe, +} + +export const initialState: DealAdminFormState = { }; + +export const dealAdminFormReducer = createReducer( + initialState, + + on(DealAdminFormActions.setDeal, (state, action): DealAdminFormState => ( + { ...state, event: action.deal } + )), + + on(DealAdminFormActions.setCategories, (state, action): DealAdminFormState => ( + { ...state, categories: action.categories } + )), + +); diff --git a/src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts b/src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts new file mode 100644 index 000000000..7965c2120 --- /dev/null +++ b/src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts @@ -0,0 +1,15 @@ +import { createFeatureSelector, createSelector } from '@ngrx/store'; +import { dealAdminFormStateKey } from '../constants/navigation-admin-form.constants'; +import { DealAdminFormState } from './navigation-portal-form.reducer'; + +export const selectDealAdminFormState = createFeatureSelector(dealAdminFormStateKey); + +export const selectDeal = createSelector( + selectDealAdminFormState, + state => state.event +); + +export const selectCategories = createSelector( + selectDealAdminFormState, + state => state.categories +); \ No newline at end of file diff --git a/src/app/features/navigator/admin/navigation-admin-routing.module.ts b/src/app/features/navigator/admin/navigation-admin-routing.module.ts new file mode 100644 index 000000000..34cc48b70 --- /dev/null +++ b/src/app/features/navigator/admin/navigation-admin-routing.module.ts @@ -0,0 +1,60 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { AdminActions } from 'src/app/admin/state/admin.actions'; +import { AdminFeatureRoute } from 'src/app/admin/typings/menu'; +import { dealsFeatureKey } from 'src/app/core/constants/feature.constants'; +import { slug } from 'src/app/core/constants/queryparam.constants'; +import { requireAnyPrivilege } from 'src/app/core/utils/privilege.utils'; + +const menuRoutes: AdminFeatureRoute[] = [ + // { + // path: `${dealsFeatureKey}/dashboard`, + // loadChildren: () => import('src/app/features/deal/portal/details/portal-deal-details.module') + // .then((imported) => imported.PortalDealDetailsModule), + // data: { label: 'dashboard' }, + // }, + { + path: `${dealsFeatureKey}`, + loadChildren: () => import('src/app/features/deal/admin/overview/deal-admin-overview.module') + .then((imported) => imported.DealAdminOverviewModule), + data: { + label: 'overview', + privileges: ['deals_admin', 'deals_manage'] + }, + canActivate: [requireAnyPrivilege('deals_admin', 'deals_manage')] + }, +]; + +const routes: Routes = [ + { + path: `${dealsFeatureKey}/form`, + loadChildren: () => import('src/app/features/deal/admin/form/deal-admin-form.module') + .then((imported) => imported.DealAdminFormModule), + canActivate: [requireAnyPrivilege('deals_admin', 'deals_manage')] + }, + { + path: `${dealsFeatureKey}/:${slug}/form`, + loadChildren: () => import('src/app/features/deal/admin/form/deal-admin-form.module') + .then((imported) => imported.DealAdminFormModule), + }, +] + +@NgModule({ + imports: [RouterModule.forChild([ + ...menuRoutes, + ...routes, + ])], + exports: [RouterModule] +}) +export class NavigationAdminRoutingModule { + + constructor( + public store: Store + ) { + this.store.dispatch(AdminActions.addMainRoutes({ + code: dealsFeatureKey, + routes: menuRoutes, + })); + } +} diff --git a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html new file mode 100644 index 000000000..c5c4c12e2 --- /dev/null +++ b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss new file mode 100644 index 000000000..7e653640e --- /dev/null +++ b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss @@ -0,0 +1,5 @@ +:host { + display: flex; + flex-flow: column; + gap: 1rem; +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts new file mode 100644 index 000000000..5ae8754d7 --- /dev/null +++ b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts @@ -0,0 +1,87 @@ +import { Component } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { TranslationService } from 'ngx-cinlib/i18n'; +import { Column, RowAction } from 'ngx-cinlib/tables'; +import { DealEntity, FilterSortPaginateInput, Maybe } from 'src/app/core/api/generated/schema'; +import { shareAction } from 'src/app/core/utils/table.utils'; +import { DealAdminOverviewActions } from '../state/deal-admin-overview.actions'; +import { selectOverviewData } from '../state/deal-portal-overview.selectors'; + +@Component({ + selector: 'app-deal-admin-overview', + templateUrl: './deal-admin-overview.component.html', + styleUrls: ['./deal-admin-overview.component.scss'] +}) +export class DealAdminOverviewComponent { + + public deals = this.store.select(selectOverviewData); + + public actions: RowAction[] = [ + { + icon: 'pen-to-square', + callback: row => + this.router.navigate([row?.slug, 'form'], { relativeTo: this.activatedRoute }), + tooltipLabel: 'edit' + }, + { + icon: 'bullhorn', + callback: row => + this.store.dispatch(DealAdminOverviewActions.sponsorDeal(row)), + tooltipLabel: 'highlightInPortal', + privileges: ['deals_admin'] + }, + { + icon: 'trash', + callback: deal => + this.store.dispatch(DealAdminOverviewActions.deleteDeal(deal)), + tooltipLabel: 'delete' + }, + + shareAction('DealEntity'), + ]; + + public columns: Column[] = [ + { + field: 'translatables.name', + label: 'deals', + value: row => this.translationService.translatable(row.translatables, 'name') + }, + { + field: 'creator.user.email', + label: 'creator', + }, + { + field: 'category', + label: 'category', + type: 'CATEGORY', + }, + { + field: 'modified', + label: 'lastModified', + type: 'DATETIME', + sort: true, + }, + { + field: 'sponsored', + label: 'sponsored', + type: 'BOOLEAN', + sort: true, + }, + ]; + + constructor( + private activatedRoute: ActivatedRoute, + private router: Router, + private store: Store, + private translationService: TranslationService + ) { } + + public updateParams(params: FilterSortPaginateInput) { + this.store.dispatch(DealAdminOverviewActions.updateParams(params)); + } + + public rowClicked(deal: Maybe): void { + this.router.navigate([deal?.slug], { relativeTo: this.activatedRoute }) + } +} diff --git a/src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts b/src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts new file mode 100644 index 000000000..7a335fbc5 --- /dev/null +++ b/src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts @@ -0,0 +1 @@ +export const dealAdminOverviewStateKey = 'dealAdminOverviewState'; diff --git a/src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts b/src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts new file mode 100644 index 000000000..8868e6881 --- /dev/null +++ b/src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { DealAdminOverviewComponent } from './component/deal-admin-overview.component'; + +const routes: Routes = [ + { + path: '', + component: DealAdminOverviewComponent, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class DealAdminOverviewRoutingModule { } diff --git a/src/app/features/navigator/admin/overview/deal-admin-overview.module.ts b/src/app/features/navigator/admin/overview/deal-admin-overview.module.ts new file mode 100644 index 000000000..b86cfb719 --- /dev/null +++ b/src/app/features/navigator/admin/overview/deal-admin-overview.module.ts @@ -0,0 +1,56 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { I18nDirective } from 'ngx-cinlib/i18n'; +import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { DealFilterModule } from 'src/app/shared/filter/deal/deal-filter.module'; +import { DealAdminOverviewComponent } from './component/deal-admin-overview.component'; +import { dealAdminOverviewStateKey } from './constants/deal-admin-overview.constants'; +import { DealAdminOverviewRoutingModule } from './deal-admin-overview-routing.module'; +import { DealAdminOverviewEffects } from './state/deal-portal-overview.effects'; +import { dealAdminOverviewReducer } from './state/deal-portal-overview.reducer'; + +const components = [ + DealAdminOverviewComponent +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, +]; + +const modules = [ + CoreModule, + DealFilterModule, + DealAdminOverviewRoutingModule, +]; + +const libs = [ + StoreModule.forFeature(dealAdminOverviewStateKey, dealAdminOverviewReducer), + EffectsModule.forFeature([DealAdminOverviewEffects]), + + I18nDirective, + PageTitleComponent, + TableComponent +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class DealAdminOverviewModule { } diff --git a/src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts b/src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts new file mode 100644 index 000000000..98f38ccc1 --- /dev/null +++ b/src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts @@ -0,0 +1,18 @@ +import { createActionGroup, emptyProps } from '@ngrx/store'; +import { DealEntity, FilterSortPaginateInput, Maybe, PageableList_DealEntity } from 'src/app/core/api/generated/schema'; + +export const DealAdminOverviewActions = createActionGroup({ + source: 'Deal Admin Overview', + events: { + + 'set overview data': (deals: PageableList_DealEntity) => ({ deals }), + + 'update params': (params: FilterSortPaginateInput) => ({ params }), + + 'delete deal': (deal?: Maybe) => ({ deal }), + 'deal deleted': emptyProps(), + + 'sponsor deal': (deal?: Maybe) => ({ deal }), + 'deal sponsored': emptyProps(), + } +}); diff --git a/src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts b/src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts new file mode 100644 index 000000000..ab131aac6 --- /dev/null +++ b/src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts @@ -0,0 +1,110 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { Store } from '@ngrx/store'; +import { ConfirmService, ConfirmType } from 'ngx-cinlib/modals/confirm'; +import { FeedbackType } from 'ngx-cinlib/modals/feedback'; +import { AuthService } from 'ngx-cinlib/security'; +import { EMPTY, map, of, switchMap, withLatestFrom } from 'rxjs'; +import { PageableList_DealEntity, QueryOperator } from 'src/app/core/api/generated/schema'; +import { CoreActions } from 'src/app/core/state/actions/core.actions'; +import { selectCurrentUser } from 'src/app/core/state/selectors/user.selectors'; +import { Privilege } from 'src/app/core/typings/privilege'; +import { DeleteDealGQL } from '../../../api/generated/delete-deal.mutation.generated'; +import { GetDealsGQL } from '../../../api/generated/get-deals.query.generated'; +import { SponsorDealGQL } from '../../../api/generated/sponsor-deal.mutation.generated'; +import { DealAdminOverviewActions } from './deal-admin-overview.actions'; +import { selectParams } from './deal-portal-overview.selectors'; + +@Injectable() +export class DealAdminOverviewEffects { + + updateParams = createEffect(() => this.actions.pipe( + ofType( + DealAdminOverviewActions.updateParams, + DealAdminOverviewActions.dealDeleted, + DealAdminOverviewActions.dealSponsored + ), + withLatestFrom( + this.store.select(selectParams), + this.store.select(selectCurrentUser), + ), + map(([, params, user]) => this.authService.hasAnyPrivileges(['deals_admin']) + ? params + : { + ...params, + expression: { + conjunction: { + operands: [ + { + entity: { + path: 'creator.id', + operator: QueryOperator.Equal, + value: user?.id as string + } + } + ] + } + } + }), + switchMap(params => this.getDealsService.watch({ params }).valueChanges), + map(response => DealAdminOverviewActions.setOverviewData(response.data.getDeals as PageableList_DealEntity)) + )); + + sponsorDeal = createEffect(() => this.actions.pipe( + ofType(DealAdminOverviewActions.sponsorDeal), + switchMap(action => this.confirmService + .confirm({ type: ConfirmType.Delete, context: 'thisWillSponsor' }).pipe( + switchMap(confirmed => confirmed + ? of(action.deal) + : EMPTY + ) + ) + ), + switchMap(deal => this.sponsorDealService.mutate({ + dealId: deal?.id, + })), + map(() => DealAdminOverviewActions.dealSponsored()) + )); + + dealSponsored = createEffect(() => this.actions.pipe( + ofType(DealAdminOverviewActions.dealSponsored), + map(() => CoreActions.setFeedback({ + type: FeedbackType.Success, + labelMessage: 'changedSuccessfully' + })) + )); + + deleteDeal = createEffect(() => this.actions.pipe( + ofType(DealAdminOverviewActions.deleteDeal), + switchMap(action => this.confirmService + .confirm({ type: ConfirmType.Delete, context: action.deal?.name }).pipe( + switchMap(confirmed => confirmed + ? of(action.deal) + : EMPTY + ) + ) + ), + switchMap(deal => this.deleteDealService.mutate({ + id: deal?.id + })), + map(() => DealAdminOverviewActions.dealDeleted()) + )); + + dealDeleted = createEffect(() => this.actions.pipe( + ofType(DealAdminOverviewActions.dealDeleted), + map(() => CoreActions.setFeedback({ + type: FeedbackType.Success, + labelMessage: 'deletedSuccessfully' + })) + )); + + constructor( + private actions: Actions, + private authService: AuthService, + private confirmService: ConfirmService, + private deleteDealService: DeleteDealGQL, + private getDealsService: GetDealsGQL, + private sponsorDealService: SponsorDealGQL, + private store: Store, + ) {} +} diff --git a/src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts b/src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts new file mode 100644 index 000000000..a170a3c02 --- /dev/null +++ b/src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts @@ -0,0 +1,24 @@ +import { createReducer, on } from '@ngrx/store'; +import { FilterSortPaginateInput, PageableList_DealEntity } from 'src/app/core/api/generated/schema'; +import { DealAdminOverviewActions } from './deal-admin-overview.actions'; + +export interface DealAdminOverviewState { + overviewData?: PageableList_DealEntity, + params: FilterSortPaginateInput +} + +export const initialState: DealAdminOverviewState = { + params: {} +}; + +export const dealAdminOverviewReducer = createReducer( + initialState, + + on(DealAdminOverviewActions.updateParams, (state, action): DealAdminOverviewState => ( + { ...state, params: Object.assign({ ...state.params } || {}, action.params) } + )), + + on(DealAdminOverviewActions.setOverviewData, (state, action): DealAdminOverviewState => ( + { ...state, overviewData: action.deals } + )), +); diff --git a/src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts b/src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts new file mode 100644 index 000000000..521ca7401 --- /dev/null +++ b/src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts @@ -0,0 +1,15 @@ +import { createFeatureSelector, createSelector } from '@ngrx/store'; +import { dealAdminOverviewStateKey } from '../constants/deal-admin-overview.constants'; +import { DealAdminOverviewState } from './deal-portal-overview.reducer'; + +export const selectDealAdminOverviewState = createFeatureSelector(dealAdminOverviewStateKey); + +export const selectOverviewData = createSelector( + selectDealAdminOverviewState, + state => state.overviewData +); + +export const selectParams = createSelector( + selectDealAdminOverviewState, + state => state.params +); diff --git a/src/app/features/navigator/api/codegen/codegen.ts b/src/app/features/navigator/api/codegen/codegen.ts new file mode 100644 index 000000000..ca5629f16 --- /dev/null +++ b/src/app/features/navigator/api/codegen/codegen.ts @@ -0,0 +1,32 @@ +import type { CodegenConfig } from '@graphql-codegen/cli'; +import { graphqlGenerationApi } from '../../../../core/api/codegen/constants'; + +const config: CodegenConfig = { + schema: graphqlGenerationApi, + documents: [ + 'src/app/core/api/documents/fragments/**/*.graphql', + 'src/app/features/navigator/api/documents/**/*.graphql', + ], + generates: { + 'src/app/core/api/generated': { + preset: 'near-operation-file-preset', + presetConfig: { + baseTypesPath: 'schema.ts', + folder: '../../generated' + }, + plugins: [ + 'typescript-operations', + 'typescript-apollo-angular', + { + 'add': { + content: '/* eslint-disable */' + } + } + ], + config: { + addExplicitOverride: true, + }, + }, + }, +}; +export default config; \ No newline at end of file diff --git a/src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql b/src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql new file mode 100644 index 000000000..bee46d7c2 --- /dev/null +++ b/src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql @@ -0,0 +1,3 @@ +mutation deleteNavigatorNode($id: String) { + deleteNavigatorNode(id: $id) +} \ No newline at end of file diff --git a/src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql b/src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql new file mode 100644 index 000000000..cc06c53c8 --- /dev/null +++ b/src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql @@ -0,0 +1,26 @@ +query getNavigatorNodeDetails($entity: NavigatorNodeEntityInput) { + getNavigatorNode(entity: $entity) { + id + modified + created + slug + title + content + additionalInformation + name + + translatables { + id + name + content + additionalInformation + title + language { + id + locale + name + } + } + + } +} \ No newline at end of file diff --git a/src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts b/src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts new file mode 100644 index 000000000..a1aa1fb6a --- /dev/null +++ b/src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts @@ -0,0 +1,29 @@ +/* eslint-disable */ +import * as Types from '../../../../core/api/generated/schema'; + +import { gql } from 'apollo-angular'; +import { Injectable } from '@angular/core'; +import * as Apollo from 'apollo-angular'; +export type DeleteNavigatorNodeMutationVariables = Types.Exact<{ + id?: Types.InputMaybe; +}>; + + +export type DeleteNavigatorNodeMutation = { __typename?: 'Mutation', deleteNavigatorNode?: boolean | null }; + +export const DeleteNavigatorNodeDocument = gql` + mutation deleteNavigatorNode($id: String) { + deleteNavigatorNode(id: $id) +} + `; + + @Injectable({ + providedIn: 'root' + }) + export class DeleteNavigatorNodeGQL extends Apollo.Mutation { + override document = DeleteNavigatorNodeDocument; + + constructor(apollo: Apollo.Apollo) { + super(apollo); + } + } \ No newline at end of file diff --git a/src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts b/src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts new file mode 100644 index 000000000..33747ef51 --- /dev/null +++ b/src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts @@ -0,0 +1,50 @@ +/* eslint-disable */ +import * as Types from '../../../../core/api/generated/schema'; + +import { gql } from 'apollo-angular'; +import { Injectable } from '@angular/core'; +import * as Apollo from 'apollo-angular'; +export type GetNavigatorNodeDetailsQueryVariables = Types.Exact<{ + entity?: Types.InputMaybe; +}>; + + +export type GetNavigatorNodeDetailsQuery = { __typename?: 'Query', getNavigatorNode?: { __typename?: 'NavigatorNodeEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, content?: string | null, additionalInformation?: string | null, name?: string | null, translatables?: Array<{ __typename?: 'NavigatorNodeTranslatableEntity', id?: string | null, name?: string | null, content?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null }; + +export const GetNavigatorNodeDetailsDocument = gql` + query getNavigatorNodeDetails($entity: NavigatorNodeEntityInput) { + getNavigatorNode(entity: $entity) { + id + modified + created + slug + title + content + additionalInformation + name + translatables { + id + name + content + additionalInformation + title + language { + id + locale + name + } + } + } +} + `; + + @Injectable({ + providedIn: 'root' + }) + export class GetNavigatorNodeDetailsGQL extends Apollo.Query { + override document = GetNavigatorNodeDetailsDocument; + + constructor(apollo: Apollo.Apollo) { + super(apollo); + } + } \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/constants/navigator-details.constant.ts b/src/app/features/navigator/portal/details/constants/navigator-details.constant.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html new file mode 100644 index 000000000..9878b8912 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html @@ -0,0 +1,6 @@ +
+

hallo

+ + + +
diff --git a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.scss b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts new file mode 100644 index 000000000..da4ed9e88 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts @@ -0,0 +1,46 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { Subject, switchMap, takeUntil, tap } from 'rxjs'; +import { + Maybe, NavigatorNodeEntity +} from 'src/app/core/api/generated/schema'; +import { slug } from 'src/app/core/constants/queryparam.constants'; +import { NavigatorPortalDetailsLandingActions } from '../state/navigator-portal-details-landing.actions'; +import { selectNavigatorNodeDetails } from '../state/navigator-portal-details-landing.selectors'; + +@Component({ + selector: 'app-navigator-portal-details-landing', + templateUrl: './navigator-portal-details-landing.component.html', + styleUrls: ['./navigator-portal-details-landing.component.scss'], +}) +export class NavigatorPortalDetailsLandingComponent implements OnInit, OnDestroy { + + public navigatorStartNode?: Maybe; + + private destroy = new Subject(); + + constructor( + private activatedRoute: ActivatedRoute, + private store: Store, + ) {} + + public ngOnInit(): void { + + this.activatedRoute.params + .pipe( + tap((params) => {this.store.dispatch(NavigatorPortalDetailsLandingActions.getDetails(params[slug] || '')), + console.log(params[slug])}), + switchMap(() => this.store.select(selectNavigatorNodeDetails)), + takeUntil(this.destroy) + ) + .subscribe((navigatorNode) => { + this.navigatorStartNode = navigatorNode; + }); + } + + public ngOnDestroy(): void { + this.destroy.next(); + this.destroy.complete(); + } +} diff --git a/src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts b/src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts new file mode 100644 index 000000000..b71c72687 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts @@ -0,0 +1,2 @@ +export const navigatorPortalDetailsLandingStateKey = 'navigatorPortalDetailsLandingState'; + diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts new file mode 100644 index 000000000..48ba1dc85 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { NavigatorPortalDetailsLandingComponent } from './components/navigator-portal-details-landing.component'; + +const routes: Routes = [ + { + path: '', + component: NavigatorPortalDetailsLandingComponent, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class NavigatorPortalDetailsLandingRoutingModule { } diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts new file mode 100644 index 000000000..13892482d --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts @@ -0,0 +1,75 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { DatePieceComponent } from 'ngx-cinlib/date/piece'; +import { I18nDirective, TranslatablePipe } from 'ngx-cinlib/i18n'; +import { MailPieceComponent } from 'ngx-cinlib/layouts/mail'; +import { PhonePieceComponent } from 'ngx-cinlib/layouts/phone'; +import { WebsitePieceComponent } from 'ngx-cinlib/layouts/website'; +import { MediaGalleryComponent, MediaSliderComponent, MediaTitleComponent } from 'ngx-cinlib/media/elements'; +import { ShareButtonComponent } from 'ngx-cinlib/share'; +import { CoreModule } from 'src/app/core/core.module'; +import { CommentModule } from 'src/app/shared/form/comment/comment.module'; +import { navigatorPortalDetailsLandingStateKey } from './constants/navigator-details-landing.constant'; + +import { CardModule } from 'src/app/shared/widgets/card/card.module'; +import { FavoriteComponent } from 'src/app/shared/widgets/favorite/favorite.component'; +import { MapModule } from 'src/app/shared/widgets/map/map.module'; +import { RatingModule } from 'src/app/shared/widgets/rating/rating.module'; +import { NavigatorPortalDetailsLandingComponent } from './components/navigator-portal-details-landing.component'; +import { NavigatorPortalDetailsLandingRoutingModule } from './navigator-portal-details-landing-routing.module'; +import { NavigatorPortalDetailsLandingEffects } from './state/navigator-portal-details-landing.effects'; +import { navigatorPortalDetailsReducer } from './state/navigator-portal-details-landing.reducer'; + +const components = [ + NavigatorPortalDetailsLandingComponent, + +]; + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, +]; + +const modules = [ + CardModule, + CommentModule, + NavigatorPortalDetailsLandingRoutingModule, + CoreModule, + FavoriteComponent, + MapModule, + RatingModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorPortalDetailsLandingStateKey, navigatorPortalDetailsReducer), + EffectsModule.forFeature([NavigatorPortalDetailsLandingEffects]), + + DatePieceComponent, + I18nDirective, + MailPieceComponent, + MediaGalleryComponent, + MediaSliderComponent, + MediaTitleComponent, + PhonePieceComponent, + ShareButtonComponent, + TranslatablePipe, + WebsitePieceComponent, +] + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...materials, + ...modules, + ...libs, + ], + exports: [...components], +}) +export class NavigatorPortalDetailsLandingModule { } diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts new file mode 100644 index 000000000..090495204 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts @@ -0,0 +1,13 @@ +import { createActionGroup } from '@ngrx/store'; +import { Maybe } from 'ngx-cinlib/core'; +import { NavigatorNodeEntity } from 'src/app/core/api/generated/schema'; + +export const NavigatorPortalDetailsLandingActions = createActionGroup({ + source: 'Navigator Portal Details Landing', + events: { + 'get details': (slug: Maybe) => ({ slug }), + 'set details': (details: Maybe) => ({ details }), + // 'update details': (Navigator: Maybe) => ({ details }), + // 'details updated': (Navigator: Maybe) => ({ details }), + } +}); \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts new file mode 100644 index 000000000..1660054dc --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts @@ -0,0 +1,50 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { map, switchMap } from 'rxjs'; +import { NavigatorNodeEntity } from 'src/app/core/api/generated/schema'; +import { GetNavigatorNodeDetailsGQL } from 'src/app/features/navigator/api/generated/get-navigator-details.query.generated'; +import { PortalActions } from 'src/app/portal/state/portal.actions'; +import { NavigatorPortalDetailsLandingActions } from './navigator-portal-details-landing.actions'; + + +@Injectable() +export class NavigatorPortalDetailsLandingEffects { + + getDetails = createEffect(() => this.actions.pipe( + ofType(NavigatorPortalDetailsLandingActions.getDetails), + switchMap(() => this.getNavigatorNodeService.watch({ + entity: { + parents: null + } + }).valueChanges), + map(response => response.data.getNavigatorNode?.id + ? NavigatorPortalDetailsLandingActions.setDetails(response.data.getNavigatorNode as NavigatorNodeEntity) + : PortalActions.notFound()) + )); + + // updateDetails = createEffect(() => this.actions.pipe( + // ofType( + // NavigatorPortalDetailsLandingActions.NavigatorCommentSaved, + // ), + // withLatestFrom(this.store.select(selectNavigatorDetails)), + // switchMap(([, NavigatorDetails]) => this.getNavigatorNodeService.watch({ + // entity: { + // slug: NavigatorDetails?.slug + // } + // }).valueChanges), + // map(response => response.data.getNavigator?.id + // ? NavigatorPortalDetailsLandingActions.detailsUpdated(response.data.getNavigator as NavigatorEntity) + // : PortalActions.notFound()) + // )); + + // detailsUpdated = createEffect(() => this.actions.pipe( + // ofType(NavigatorPortalDetailsLandingActions.detailsUpdated), + // map(() => CoreUserActions.updateUser()) + // )); + + constructor( + private actions: Actions, + private getNavigatorNodeService: GetNavigatorNodeDetailsGQL + + ) { } +} diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts new file mode 100644 index 000000000..08988e87b --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts @@ -0,0 +1,20 @@ +import { createReducer, on } from '@ngrx/store'; +import { Maybe, NavigatorNodeEntity } from 'src/app/core/api/generated/schema'; +import { NavigatorPortalDetailsLandingActions } from './navigator-portal-details-landing.actions'; + +export interface NavigatorPortalDetailsLandingState { + details?: Maybe, +} + +export const initialState: NavigatorPortalDetailsLandingState = { +}; + +export const navigatorPortalDetailsReducer = createReducer( + initialState, + + on( + NavigatorPortalDetailsLandingActions.setDetails, + (state, action): NavigatorPortalDetailsLandingState => + ({ ...state, details: action.details }) + ), +); \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts new file mode 100644 index 000000000..e16b5dd2a --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts @@ -0,0 +1,15 @@ +import { createFeatureSelector, createSelector } from '@ngrx/store'; +import { navigatorPortalDetailsLandingStateKey } from '../constants/navigator-details-landing.constant'; +import { NavigatorPortalDetailsLandingState } from './navigator-portal-details-landing.reducer'; + +export const selectNavigatorPortalDetailsLandingState = + createFeatureSelector( + navigatorPortalDetailsLandingStateKey + ); + +export const selectNavigatorNodeDetails = createSelector( + selectNavigatorPortalDetailsLandingState, + (state) => state.details +); + + diff --git a/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts b/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts new file mode 100644 index 000000000..72d4961bf --- /dev/null +++ b/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts @@ -0,0 +1,17 @@ + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = [ + { + path: '', + loadChildren: () => import('./modules/landing/navigator-portal-details-landing.module') + .then((imported) => imported.NavigatorPortalDetailsLandingModule), + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class NavigatorPortalDetailsRoutingModule { } diff --git a/src/app/features/navigator/portal/details/navigator-portal-details.module.ts b/src/app/features/navigator/portal/details/navigator-portal-details.module.ts new file mode 100644 index 000000000..606273425 --- /dev/null +++ b/src/app/features/navigator/portal/details/navigator-portal-details.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { NavigatorPortalDetailsRoutingModule } from './navigator-portal-details-routing.module'; + +const modules = [NavigatorPortalDetailsRoutingModule]; + +@NgModule({ + imports: [...modules], + exports: [], +}) +export class NavigatorPortalDetailsModule {} diff --git a/src/app/features/navigator/portal/navigator-portal-routing.module.ts b/src/app/features/navigator/portal/navigator-portal-routing.module.ts new file mode 100644 index 000000000..54dca5d71 --- /dev/null +++ b/src/app/features/navigator/portal/navigator-portal-routing.module.ts @@ -0,0 +1,23 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { navigatorFeatureKey } from 'src/app/core/constants/feature.constants'; +import { slug } from 'src/app/core/constants/queryparam.constants'; + +const routes: Routes = [ + // { + // path: navigatorFeatureKey, + // loadChildren: () => import('src/app/features/navigator/portal/details/navigator-portal-details.module') + // .then((imported) => imported.NavigatorPortalDetailsModule), + // }, + { + path: `${navigatorFeatureKey}/:${slug}`, + loadChildren: () => import('src/app/features/navigator/portal/details/navigator-portal-details.module') + .then((imported) => imported.NavigatorPortalDetailsModule), + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class NavigatorPortalRoutingModule { } diff --git a/src/app/portal/portal.module.ts b/src/app/portal/portal.module.ts index b60a4a5f4..b3523dd49 100644 --- a/src/app/portal/portal.module.ts +++ b/src/app/portal/portal.module.ts @@ -14,6 +14,7 @@ import { EventPortalRoutingModule } from '../features/event/portal/event-portal- import { GuestArticlePortalRoutingModule } from '../features/guest-article/portal/guest-article-portal-routing.module'; import { MapPortalRoutingModule } from '../features/map/portal/map-portal-routing.module'; import { MediaPortalRoutingModule } from '../features/media/portal/media-portal-routing.module'; +import { NavigatorPortalRoutingModule } from '../features/navigator/portal/navigator-portal-routing.module'; import { OrganisationPortalRoutingModule } from '../features/organisation/portal/organisation-portal-routing.module'; import { ReportPortalRoutingModule } from '../features/report/portal/report-portal-routing.module'; import { SurveyPortalRoutingModule } from '../features/survey/portal/survey-portal-routing.module'; @@ -41,6 +42,7 @@ const routes = [ GuestArticlePortalRoutingModule, MapPortalRoutingModule, MediaPortalRoutingModule, + NavigatorPortalRoutingModule, OrganisationPortalRoutingModule, ReportPortalRoutingModule, SurveyPortalRoutingModule, From e3a8aad2aaa383727ccfde98b208dab4973713c1 Mon Sep 17 00:00:00 2001 From: DOOMED2WIN Date: Mon, 4 Mar 2024 08:00:57 +0100 Subject: [PATCH 2/7] navigator logic finished --- src/app/core/api/generated/schema.ts | 189 +++++++++++++----- .../article-admin-details-routing.module.ts | 2 +- .../delete-navigator-node.mutation.graphql | 4 +- .../get-navigator-details.query.graphql | 26 --- .../queries/get-navigator-page.query.graphql | 60 ++++++ .../get-navigator-start-page.query.graphql | 45 +++++ ...elete-navigator-node.mutation.generated.ts | 14 +- .../get-navigator-details.query.generated.ts | 50 ----- .../get-navigator-page.query.generated.ts | 81 ++++++++ ...et-navigator-start-page.query.generated.ts | 66 ++++++ ...ator-portal-details-landing.component.html | 6 - ...ator-portal-details-landing.component.scss | 0 ...igator-portal-details-landing.component.ts | 46 ----- .../navigator-details-landing.constant.ts | 2 - ...r-portal-details-landing-routing.module.ts | 16 -- ...ator-portal-details-landing.component.html | 3 + ...ator-portal-details-landing.component.scss | 19 ++ ...igator-portal-details-landing.component.ts | 11 + ...navigator-portal-details-landing.module.ts | 54 ++--- ...avigator-portal-details-landing.actions.ts | 13 -- ...avigator-portal-details-landing.effects.ts | 50 ----- ...avigator-portal-details-landing.reducer.ts | 20 -- ...igator-portal-details-landing.selectors.ts | 15 -- ...ortal-details-layout-choice.component.html | 19 ++ ...ortal-details-layout-choice.component.scss | 29 +++ ...-portal-details-layout-choice.component.ts | 51 +++++ ...gator-portal-details-layout.component.html | 7 + ...gator-portal-details-layout.component.scss | 10 + ...vigator-portal-details-layout.component.ts | 101 ++++++++++ ...-portal-details-layout-page.component.html | 14 ++ ...-portal-details-layout-page.component.scss | 22 ++ ...or-portal-details-layout-page.component.ts | 17 ++ ...vigator-portal-details-layout.constants.ts | 1 + .../page-refresh-guard.service.ts | 26 +++ .../navigator-portal-details-layout.module.ts | 63 ++++++ ...navigator-portal-details-layout.actions.ts | 16 ++ ...navigator-portal-details-layout.effects.ts | 38 ++++ ...navigator-portal-details-layout.reducer.ts | 50 +++++ ...vigator-portal-details-layout.selectors.ts | 20 ++ ...navigator-portal-details-routing.module.ts | 18 ++ .../portal/navigator-portal-routing.module.ts | 3 +- src/assets/in-progress.svg | 1 + 42 files changed, 948 insertions(+), 350 deletions(-) delete mode 100644 src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql create mode 100644 src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql create mode 100644 src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql delete mode 100644 src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts create mode 100644 src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts create mode 100644 src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts delete mode 100644 src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html delete mode 100644 src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.scss delete mode 100644 src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts delete mode 100644 src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts delete mode 100644 src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts create mode 100644 src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html create mode 100644 src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss create mode 100644 src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts delete mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts delete mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts delete mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts delete mode 100644 src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss create mode 100644 src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/constants/navigator-portal-details-layout.constants.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.actions.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.effects.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.reducer.ts create mode 100644 src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.selectors.ts create mode 100644 src/assets/in-progress.svg diff --git a/src/app/core/api/generated/schema.ts b/src/app/core/api/generated/schema.ts index 12d04e9d2..2f9f610a6 100644 --- a/src/app/core/api/generated/schema.ts +++ b/src/app/core/api/generated/schema.ts @@ -1820,8 +1820,10 @@ export type Mutation = { deleteMilestoneMedia?: Maybe; deleteMilestoneMedium?: Maybe; deleteMilestones?: Maybe; - deleteNavigatorNode?: Maybe; - deleteNavigatorNodes?: Maybe; + deleteNavigatorChoice?: Maybe; + deleteNavigatorChoices?: Maybe; + deleteNavigatorPage?: Maybe; + deleteNavigatorPages?: Maybe; deleteNavigatorResultPage?: Maybe; deleteNavigatorResultPages?: Maybe; deleteNotification?: Maybe; @@ -1975,8 +1977,10 @@ export type Mutation = { saveMilestoneMedia?: Maybe>>; saveMilestoneMedium?: Maybe; saveMilestones?: Maybe>>; - saveNavigatorNode?: Maybe; - saveNavigatorNodes?: Maybe>>; + saveNavigatorChoice?: Maybe; + saveNavigatorChoices?: Maybe>>; + saveNavigatorPage?: Maybe; + saveNavigatorPages?: Maybe>>; saveNavigatorResultPage?: Maybe; saveNavigatorResultPages?: Maybe>>; saveNotification?: Maybe; @@ -2626,13 +2630,25 @@ export type MutationDeleteMilestonesArgs = { /** Mutation root */ -export type MutationDeleteNavigatorNodeArgs = { +export type MutationDeleteNavigatorChoiceArgs = { id?: InputMaybe; }; /** Mutation root */ -export type MutationDeleteNavigatorNodesArgs = { +export type MutationDeleteNavigatorChoicesArgs = { + ids?: InputMaybe>>; +}; + + +/** Mutation root */ +export type MutationDeleteNavigatorPageArgs = { + id?: InputMaybe; +}; + + +/** Mutation root */ +export type MutationDeleteNavigatorPagesArgs = { ids?: InputMaybe>>; }; @@ -3557,14 +3573,26 @@ export type MutationSaveMilestonesArgs = { /** Mutation root */ -export type MutationSaveNavigatorNodeArgs = { - entity?: InputMaybe; +export type MutationSaveNavigatorChoiceArgs = { + entity?: InputMaybe; }; /** Mutation root */ -export type MutationSaveNavigatorNodesArgs = { - entities?: InputMaybe>>; +export type MutationSaveNavigatorChoicesArgs = { + entities?: InputMaybe>>; +}; + + +/** Mutation root */ +export type MutationSaveNavigatorPageArgs = { + entity?: InputMaybe; +}; + + +/** Mutation root */ +export type MutationSaveNavigatorPagesArgs = { + entities?: InputMaybe>>; }; @@ -4029,76 +4057,91 @@ export type MutationVerifyAddressArgs = { entity?: InputMaybe; }; -export type NavigatorConnectionEntity = { - __typename?: 'NavigatorConnectionEntity'; - child?: Maybe; +export type NavigatorChoiceEntity = { + __typename?: 'NavigatorChoiceEntity'; created?: Maybe; + description?: Maybe; id?: Maybe; modified?: Maybe; - order?: Maybe; - parent?: Maybe; + name?: Maybe; + nextPage?: Maybe; + parent?: Maybe; + resultPage?: Maybe; + slug?: Maybe; + translatables?: Maybe>>; }; -export type NavigatorConnectionEntityInput = { - child?: InputMaybe; +export type NavigatorChoiceEntityInput = { created?: InputMaybe; + description?: InputMaybe; id?: InputMaybe; modified?: InputMaybe; - order?: InputMaybe; - parent?: InputMaybe; + name?: InputMaybe; + nextPage?: InputMaybe; + parent?: InputMaybe; + resultPage?: InputMaybe; + slug?: InputMaybe; + translatables?: InputMaybe>>; }; -export type NavigatorNodeEntity = { - __typename?: 'NavigatorNodeEntity'; - additionalInformation?: Maybe; - children?: Maybe>>; - content?: Maybe; +export type NavigatorChoiceTranslatableEntity = { + __typename?: 'NavigatorChoiceTranslatableEntity'; created?: Maybe; + description?: Maybe; id?: Maybe; + language?: Maybe; modified?: Maybe; name?: Maybe; - parents?: Maybe>>; - possibleChildNodes?: Maybe>>; - resultPage?: Maybe; +}; + +export type NavigatorChoiceTranslatableEntityInput = { + created?: InputMaybe; + description?: InputMaybe; + id?: InputMaybe; + modified?: InputMaybe; + name?: InputMaybe; +}; + +export type NavigatorPageEntity = { + __typename?: 'NavigatorPageEntity'; + additionalInformation?: Maybe; + choices?: Maybe>>; + created?: Maybe; + id?: Maybe; + modified?: Maybe; + parentChoices?: Maybe>>; slug?: Maybe; title?: Maybe; - translatables?: Maybe>>; + translatables?: Maybe>>; }; -export type NavigatorNodeEntityInput = { +export type NavigatorPageEntityInput = { additionalInformation?: InputMaybe; - children?: InputMaybe>>; - content?: InputMaybe; + choices?: InputMaybe>>; created?: InputMaybe; id?: InputMaybe; modified?: InputMaybe; - name?: InputMaybe; - parents?: InputMaybe>>; - resultPage?: InputMaybe; + parentChoices?: InputMaybe>>; slug?: InputMaybe; title?: InputMaybe; - translatables?: InputMaybe>>; + translatables?: InputMaybe>>; }; -export type NavigatorNodeTranslatableEntity = { - __typename?: 'NavigatorNodeTranslatableEntity'; +export type NavigatorPageTranslatableEntity = { + __typename?: 'NavigatorPageTranslatableEntity'; additionalInformation?: Maybe; - content?: Maybe; created?: Maybe; id?: Maybe; language?: Maybe; modified?: Maybe; - name?: Maybe; title?: Maybe; }; -export type NavigatorNodeTranslatableEntityInput = { +export type NavigatorPageTranslatableEntityInput = { additionalInformation?: InputMaybe; - content?: InputMaybe; created?: InputMaybe; id?: InputMaybe; modified?: InputMaybe; - name?: InputMaybe; title?: InputMaybe; }; @@ -4108,10 +4151,10 @@ export type NavigatorResultPageEntity = { created?: Maybe; id?: Maybe; modified?: Maybe; - navigatorNode?: Maybe>>; + parents?: Maybe>>; slug?: Maybe; title?: Maybe; - translatables?: Maybe>>; + translatables?: Maybe>>; url?: Maybe; }; @@ -4120,13 +4163,31 @@ export type NavigatorResultPageEntityInput = { created?: InputMaybe; id?: InputMaybe; modified?: InputMaybe; - navigatorNode?: InputMaybe>>; + parents?: InputMaybe>>; slug?: InputMaybe; title?: InputMaybe; - translatables?: InputMaybe>>; + translatables?: InputMaybe>>; url?: InputMaybe; }; +export type NavigatorResultPageTranslatableEntity = { + __typename?: 'NavigatorResultPageTranslatableEntity'; + content?: Maybe; + created?: Maybe; + id?: Maybe; + language?: Maybe; + modified?: Maybe; + title?: Maybe; +}; + +export type NavigatorResultPageTranslatableEntityInput = { + content?: InputMaybe; + created?: InputMaybe; + id?: InputMaybe; + modified?: InputMaybe; + title?: InputMaybe; +}; + export type NotificationEntity = { __typename?: 'NotificationEntity'; created?: Maybe; @@ -4841,9 +4902,15 @@ export type PageableList_MilestoneMediaEntity = { total: Scalars['Long']['output']; }; -export type PageableList_NavigatorNodeEntity = { - __typename?: 'PageableList_NavigatorNodeEntity'; - result?: Maybe>>; +export type PageableList_NavigatorChoiceEntity = { + __typename?: 'PageableList_NavigatorChoiceEntity'; + result?: Maybe>>; + total: Scalars['Long']['output']; +}; + +export type PageableList_NavigatorPageEntity = { + __typename?: 'PageableList_NavigatorPageEntity'; + result?: Maybe>>; total: Scalars['Long']['output']; }; @@ -5231,8 +5298,10 @@ export type Query = { getMilestoneMedia?: Maybe; getMilestoneMedium?: Maybe; getMilestones?: Maybe; - getNavigatorNode?: Maybe; - getNavigatorNodes?: Maybe; + getNavigatorChoice?: Maybe; + getNavigatorChoices?: Maybe; + getNavigatorPage?: Maybe; + getNavigatorPages?: Maybe; getNavigatorResultPage?: Maybe; getNavigatorResultPages?: Maybe; getNotification?: Maybe; @@ -5786,13 +5855,25 @@ export type QueryGetMilestonesArgs = { /** Query root */ -export type QueryGetNavigatorNodeArgs = { - entity?: InputMaybe; +export type QueryGetNavigatorChoiceArgs = { + entity?: InputMaybe; +}; + + +/** Query root */ +export type QueryGetNavigatorChoicesArgs = { + params?: InputMaybe; +}; + + +/** Query root */ +export type QueryGetNavigatorPageArgs = { + entity?: InputMaybe; }; /** Query root */ -export type QueryGetNavigatorNodesArgs = { +export type QueryGetNavigatorPagesArgs = { params?: InputMaybe; }; diff --git a/src/app/features/article/admin/details/article-admin-details-routing.module.ts b/src/app/features/article/admin/details/article-admin-details-routing.module.ts index 7ce2bc380..02c1fea16 100644 --- a/src/app/features/article/admin/details/article-admin-details-routing.module.ts +++ b/src/app/features/article/admin/details/article-admin-details-routing.module.ts @@ -15,7 +15,7 @@ const routes: Routes = [ .then((imported) => imported.ArticleAdminDetailsLandingModule), component: ArticleAdminDetailsLandingComponent }, - { + { path: searchRoute, loadChildren: () => import('./modules/search/article-admin-details-search.module') .then((imported) => imported.ArticleAdminDetailsSearchModule), diff --git a/src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql b/src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql index bee46d7c2..cb3abee76 100644 --- a/src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql +++ b/src/app/features/navigator/api/documents/mutation/delete-navigator-node.mutation.graphql @@ -1,3 +1,3 @@ -mutation deleteNavigatorNode($id: String) { - deleteNavigatorNode(id: $id) +mutation deleteNavigatorPage($id: String) { + deleteNavigatorPage(id: $id) } \ No newline at end of file diff --git a/src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql b/src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql deleted file mode 100644 index cc06c53c8..000000000 --- a/src/app/features/navigator/api/documents/queries/get-navigator-details.query.graphql +++ /dev/null @@ -1,26 +0,0 @@ -query getNavigatorNodeDetails($entity: NavigatorNodeEntityInput) { - getNavigatorNode(entity: $entity) { - id - modified - created - slug - title - content - additionalInformation - name - - translatables { - id - name - content - additionalInformation - title - language { - id - locale - name - } - } - - } -} \ No newline at end of file diff --git a/src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql b/src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql new file mode 100644 index 000000000..a6c7d64cc --- /dev/null +++ b/src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql @@ -0,0 +1,60 @@ +query getNavigatorPage($entity: NavigatorPageEntityInput) { + getNavigatorPage(entity: $entity) { + id + modified + created + slug + title + additionalInformation + + choices { + id + description + name + parent { + id + slug + } + nextPage { + id + slug + } + translatables { + id + name + description + language { + id + locale + name + } + } + } + + parentChoices { + id + translatables { + id + name + language { + id + locale + name + } + } + + } + + translatables { + id + additionalInformation + title + language { + id + locale + name + } + } + + } +} \ No newline at end of file diff --git a/src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql b/src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql new file mode 100644 index 000000000..251ba4d64 --- /dev/null +++ b/src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql @@ -0,0 +1,45 @@ +query getNavigatorStartPage { + getNavigatorStartPage { + id + modified + created + slug + title + additionalInformation + + choices { + id + description + name + nextPage { + id + slug + } + translatables { + id + name + description + language { + id + locale + name + } + } + } + + parentChoices { + id + } + + translatables { + id + additionalInformation + title + language { + id + locale + name + } + } + } +} \ No newline at end of file diff --git a/src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts b/src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts index a1aa1fb6a..79eb982c6 100644 --- a/src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts +++ b/src/app/features/navigator/api/generated/delete-navigator-node.mutation.generated.ts @@ -4,24 +4,24 @@ import * as Types from '../../../../core/api/generated/schema'; import { gql } from 'apollo-angular'; import { Injectable } from '@angular/core'; import * as Apollo from 'apollo-angular'; -export type DeleteNavigatorNodeMutationVariables = Types.Exact<{ +export type DeleteNavigatorPageMutationVariables = Types.Exact<{ id?: Types.InputMaybe; }>; -export type DeleteNavigatorNodeMutation = { __typename?: 'Mutation', deleteNavigatorNode?: boolean | null }; +export type DeleteNavigatorPageMutation = { __typename?: 'Mutation', deleteNavigatorPage?: boolean | null }; -export const DeleteNavigatorNodeDocument = gql` - mutation deleteNavigatorNode($id: String) { - deleteNavigatorNode(id: $id) +export const DeleteNavigatorPageDocument = gql` + mutation deleteNavigatorPage($id: String) { + deleteNavigatorPage(id: $id) } `; @Injectable({ providedIn: 'root' }) - export class DeleteNavigatorNodeGQL extends Apollo.Mutation { - override document = DeleteNavigatorNodeDocument; + export class DeleteNavigatorPageGQL extends Apollo.Mutation { + override document = DeleteNavigatorPageDocument; constructor(apollo: Apollo.Apollo) { super(apollo); diff --git a/src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts b/src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts deleted file mode 100644 index 33747ef51..000000000 --- a/src/app/features/navigator/api/generated/get-navigator-details.query.generated.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* eslint-disable */ -import * as Types from '../../../../core/api/generated/schema'; - -import { gql } from 'apollo-angular'; -import { Injectable } from '@angular/core'; -import * as Apollo from 'apollo-angular'; -export type GetNavigatorNodeDetailsQueryVariables = Types.Exact<{ - entity?: Types.InputMaybe; -}>; - - -export type GetNavigatorNodeDetailsQuery = { __typename?: 'Query', getNavigatorNode?: { __typename?: 'NavigatorNodeEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, content?: string | null, additionalInformation?: string | null, name?: string | null, translatables?: Array<{ __typename?: 'NavigatorNodeTranslatableEntity', id?: string | null, name?: string | null, content?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null }; - -export const GetNavigatorNodeDetailsDocument = gql` - query getNavigatorNodeDetails($entity: NavigatorNodeEntityInput) { - getNavigatorNode(entity: $entity) { - id - modified - created - slug - title - content - additionalInformation - name - translatables { - id - name - content - additionalInformation - title - language { - id - locale - name - } - } - } -} - `; - - @Injectable({ - providedIn: 'root' - }) - export class GetNavigatorNodeDetailsGQL extends Apollo.Query { - override document = GetNavigatorNodeDetailsDocument; - - constructor(apollo: Apollo.Apollo) { - super(apollo); - } - } \ No newline at end of file diff --git a/src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts b/src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts new file mode 100644 index 000000000..11c972300 --- /dev/null +++ b/src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts @@ -0,0 +1,81 @@ +/* eslint-disable */ +import * as Types from '../../../../core/api/generated/schema'; + +import { gql } from 'apollo-angular'; +import { Injectable } from '@angular/core'; +import * as Apollo from 'apollo-angular'; +export type GetNavigatorPageQueryVariables = Types.Exact<{ + entity?: Types.InputMaybe; +}>; + + +export type GetNavigatorPageQuery = { __typename?: 'Query', getNavigatorPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, additionalInformation?: string | null, choices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, description?: string | null, name?: string | null, parent?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, nextPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, parentChoices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, translatables?: Array<{ __typename?: 'NavigatorPageTranslatableEntity', id?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null }; + +export const GetNavigatorPageDocument = gql` + query getNavigatorPage($entity: NavigatorPageEntityInput) { + getNavigatorPage(entity: $entity) { + id + modified + created + slug + title + additionalInformation + choices { + id + description + name + parent { + id + slug + } + nextPage { + id + slug + } + translatables { + id + name + description + language { + id + locale + name + } + } + } + parentChoices { + id + translatables { + id + name + language { + id + locale + name + } + } + } + translatables { + id + additionalInformation + title + language { + id + locale + name + } + } + } +} + `; + + @Injectable({ + providedIn: 'root' + }) + export class GetNavigatorPageGQL extends Apollo.Query { + override document = GetNavigatorPageDocument; + + constructor(apollo: Apollo.Apollo) { + super(apollo); + } + } \ No newline at end of file diff --git a/src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts b/src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts new file mode 100644 index 000000000..010b02b03 --- /dev/null +++ b/src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts @@ -0,0 +1,66 @@ +/* eslint-disable */ +import * as Types from '../../../../core/api/generated/schema'; + +import { gql } from 'apollo-angular'; +import { Injectable } from '@angular/core'; +import * as Apollo from 'apollo-angular'; +export type GetNavigatorStartPageQueryVariables = Types.Exact<{ [key: string]: never; }>; + + +export type GetNavigatorStartPageQuery = { __typename?: 'Query', getNavigatorStartPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, additionalInformation?: string | null, choices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, description?: string | null, name?: string | null, nextPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, parentChoices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null } | null> | null, translatables?: Array<{ __typename?: 'NavigatorPageTranslatableEntity', id?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null }; + +export const GetNavigatorStartPageDocument = gql` + query getNavigatorStartPage { + getNavigatorStartPage { + id + modified + created + slug + title + additionalInformation + choices { + id + description + name + nextPage { + id + slug + } + translatables { + id + name + description + language { + id + locale + name + } + } + } + parentChoices { + id + } + translatables { + id + additionalInformation + title + language { + id + locale + name + } + } + } +} + `; + + @Injectable({ + providedIn: 'root' + }) + export class GetNavigatorStartPageGQL extends Apollo.Query { + override document = GetNavigatorStartPageDocument; + + constructor(apollo: Apollo.Apollo) { + super(apollo); + } + } \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html deleted file mode 100644 index 9878b8912..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.html +++ /dev/null @@ -1,6 +0,0 @@ -
-

hallo

- - - -
diff --git a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.scss b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts b/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts deleted file mode 100644 index da4ed9e88..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/components/navigator-portal-details-landing.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Subject, switchMap, takeUntil, tap } from 'rxjs'; -import { - Maybe, NavigatorNodeEntity -} from 'src/app/core/api/generated/schema'; -import { slug } from 'src/app/core/constants/queryparam.constants'; -import { NavigatorPortalDetailsLandingActions } from '../state/navigator-portal-details-landing.actions'; -import { selectNavigatorNodeDetails } from '../state/navigator-portal-details-landing.selectors'; - -@Component({ - selector: 'app-navigator-portal-details-landing', - templateUrl: './navigator-portal-details-landing.component.html', - styleUrls: ['./navigator-portal-details-landing.component.scss'], -}) -export class NavigatorPortalDetailsLandingComponent implements OnInit, OnDestroy { - - public navigatorStartNode?: Maybe; - - private destroy = new Subject(); - - constructor( - private activatedRoute: ActivatedRoute, - private store: Store, - ) {} - - public ngOnInit(): void { - - this.activatedRoute.params - .pipe( - tap((params) => {this.store.dispatch(NavigatorPortalDetailsLandingActions.getDetails(params[slug] || '')), - console.log(params[slug])}), - switchMap(() => this.store.select(selectNavigatorNodeDetails)), - takeUntil(this.destroy) - ) - .subscribe((navigatorNode) => { - this.navigatorStartNode = navigatorNode; - }); - } - - public ngOnDestroy(): void { - this.destroy.next(); - this.destroy.complete(); - } -} diff --git a/src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts b/src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts deleted file mode 100644 index b71c72687..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/constants/navigator-details-landing.constant.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const navigatorPortalDetailsLandingStateKey = 'navigatorPortalDetailsLandingState'; - diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts deleted file mode 100644 index 48ba1dc85..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { NavigatorPortalDetailsLandingComponent } from './components/navigator-portal-details-landing.component'; - -const routes: Routes = [ - { - path: '', - component: NavigatorPortalDetailsLandingComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class NavigatorPortalDetailsLandingRoutingModule { } diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html new file mode 100644 index 000000000..5b9271965 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html @@ -0,0 +1,3 @@ + + + diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss new file mode 100644 index 000000000..13008bfa6 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss @@ -0,0 +1,19 @@ +// a { +// padding: 1.75rem; +// width: fit-content; +// color: var(--color-primary-contrast-900); +// background-image: linear-gradient(45deg, +// var(--color-primary-900), +// var(--color-primary-700), +// var(--color-primary-500), +// var(--color-accent-500), +// var(--color-accent-700), +// var(--color-accent-900)); +// background-size: 300%; +// background-position: left; +// transition: background-position .5s; +// } + +// a:hover { +// background-position: right; +// } diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts new file mode 100644 index 000000000..2e6b6cfb4 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-navigator-portal-details-landing', + templateUrl: './navigator-portal-details-landing.component.html', + styleUrls: ['./navigator-portal-details-landing.component.scss'] +}) +export class NavigatorPortalDetailsLandingComponent { + + +} \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts index 13892482d..16e9040d5 100644 --- a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts @@ -1,74 +1,48 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreModule } from '@ngrx/store'; -import { DatePieceComponent } from 'ngx-cinlib/date/piece'; +import { MatCardModule } from '@angular/material/card'; +import { RouterModule } from '@angular/router'; +import { RadioCardGroupComponent } from 'ngx-cinlib/forms/radio-card'; import { I18nDirective, TranslatablePipe } from 'ngx-cinlib/i18n'; -import { MailPieceComponent } from 'ngx-cinlib/layouts/mail'; -import { PhonePieceComponent } from 'ngx-cinlib/layouts/phone'; -import { WebsitePieceComponent } from 'ngx-cinlib/layouts/website'; -import { MediaGalleryComponent, MediaSliderComponent, MediaTitleComponent } from 'ngx-cinlib/media/elements'; -import { ShareButtonComponent } from 'ngx-cinlib/share'; +import { IconComponent } from 'ngx-cinlib/icons'; +import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; import { CoreModule } from 'src/app/core/core.module'; -import { CommentModule } from 'src/app/shared/form/comment/comment.module'; -import { navigatorPortalDetailsLandingStateKey } from './constants/navigator-details-landing.constant'; - -import { CardModule } from 'src/app/shared/widgets/card/card.module'; -import { FavoriteComponent } from 'src/app/shared/widgets/favorite/favorite.component'; -import { MapModule } from 'src/app/shared/widgets/map/map.module'; -import { RatingModule } from 'src/app/shared/widgets/rating/rating.module'; -import { NavigatorPortalDetailsLandingComponent } from './components/navigator-portal-details-landing.component'; -import { NavigatorPortalDetailsLandingRoutingModule } from './navigator-portal-details-landing-routing.module'; -import { NavigatorPortalDetailsLandingEffects } from './state/navigator-portal-details-landing.effects'; -import { navigatorPortalDetailsReducer } from './state/navigator-portal-details-landing.reducer'; +import { NavigatorPortalDetailsLandingComponent } from './navigator-portal-details-landing.component'; const components = [ NavigatorPortalDetailsLandingComponent, - -]; +] const framework = [ CommonModule, + RouterModule, ]; const materials = [ MatButtonModule, + MatCardModule, ]; const modules = [ - CardModule, - CommentModule, - NavigatorPortalDetailsLandingRoutingModule, CoreModule, - FavoriteComponent, - MapModule, - RatingModule, ]; const libs = [ - StoreModule.forFeature(navigatorPortalDetailsLandingStateKey, navigatorPortalDetailsReducer), - EffectsModule.forFeature([NavigatorPortalDetailsLandingEffects]), - - DatePieceComponent, + IconComponent, I18nDirective, - MailPieceComponent, - MediaGalleryComponent, - MediaSliderComponent, - MediaTitleComponent, - PhonePieceComponent, - ShareButtonComponent, + PageTitleComponent, + RadioCardGroupComponent, TranslatablePipe, - WebsitePieceComponent, -] +]; @NgModule({ declarations: [...components], imports: [ ...framework, + ...libs, ...materials, ...modules, - ...libs, ], exports: [...components], }) diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts deleted file mode 100644 index 090495204..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.actions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createActionGroup } from '@ngrx/store'; -import { Maybe } from 'ngx-cinlib/core'; -import { NavigatorNodeEntity } from 'src/app/core/api/generated/schema'; - -export const NavigatorPortalDetailsLandingActions = createActionGroup({ - source: 'Navigator Portal Details Landing', - events: { - 'get details': (slug: Maybe) => ({ slug }), - 'set details': (details: Maybe) => ({ details }), - // 'update details': (Navigator: Maybe) => ({ details }), - // 'details updated': (Navigator: Maybe) => ({ details }), - } -}); \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts deleted file mode 100644 index 1660054dc..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.effects.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Actions, createEffect, ofType } from '@ngrx/effects'; -import { map, switchMap } from 'rxjs'; -import { NavigatorNodeEntity } from 'src/app/core/api/generated/schema'; -import { GetNavigatorNodeDetailsGQL } from 'src/app/features/navigator/api/generated/get-navigator-details.query.generated'; -import { PortalActions } from 'src/app/portal/state/portal.actions'; -import { NavigatorPortalDetailsLandingActions } from './navigator-portal-details-landing.actions'; - - -@Injectable() -export class NavigatorPortalDetailsLandingEffects { - - getDetails = createEffect(() => this.actions.pipe( - ofType(NavigatorPortalDetailsLandingActions.getDetails), - switchMap(() => this.getNavigatorNodeService.watch({ - entity: { - parents: null - } - }).valueChanges), - map(response => response.data.getNavigatorNode?.id - ? NavigatorPortalDetailsLandingActions.setDetails(response.data.getNavigatorNode as NavigatorNodeEntity) - : PortalActions.notFound()) - )); - - // updateDetails = createEffect(() => this.actions.pipe( - // ofType( - // NavigatorPortalDetailsLandingActions.NavigatorCommentSaved, - // ), - // withLatestFrom(this.store.select(selectNavigatorDetails)), - // switchMap(([, NavigatorDetails]) => this.getNavigatorNodeService.watch({ - // entity: { - // slug: NavigatorDetails?.slug - // } - // }).valueChanges), - // map(response => response.data.getNavigator?.id - // ? NavigatorPortalDetailsLandingActions.detailsUpdated(response.data.getNavigator as NavigatorEntity) - // : PortalActions.notFound()) - // )); - - // detailsUpdated = createEffect(() => this.actions.pipe( - // ofType(NavigatorPortalDetailsLandingActions.detailsUpdated), - // map(() => CoreUserActions.updateUser()) - // )); - - constructor( - private actions: Actions, - private getNavigatorNodeService: GetNavigatorNodeDetailsGQL - - ) { } -} diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts deleted file mode 100644 index 08988e87b..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.reducer.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createReducer, on } from '@ngrx/store'; -import { Maybe, NavigatorNodeEntity } from 'src/app/core/api/generated/schema'; -import { NavigatorPortalDetailsLandingActions } from './navigator-portal-details-landing.actions'; - -export interface NavigatorPortalDetailsLandingState { - details?: Maybe, -} - -export const initialState: NavigatorPortalDetailsLandingState = { -}; - -export const navigatorPortalDetailsReducer = createReducer( - initialState, - - on( - NavigatorPortalDetailsLandingActions.setDetails, - (state, action): NavigatorPortalDetailsLandingState => - ({ ...state, details: action.details }) - ), -); \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts b/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts deleted file mode 100644 index e16b5dd2a..000000000 --- a/src/app/features/navigator/portal/details/modules/landing/state/navigator-portal-details-landing.selectors.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { navigatorPortalDetailsLandingStateKey } from '../constants/navigator-details-landing.constant'; -import { NavigatorPortalDetailsLandingState } from './navigator-portal-details-landing.reducer'; - -export const selectNavigatorPortalDetailsLandingState = - createFeatureSelector( - navigatorPortalDetailsLandingStateKey - ); - -export const selectNavigatorNodeDetails = createSelector( - selectNavigatorPortalDetailsLandingState, - (state) => state.details -); - - diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html new file mode 100644 index 000000000..976e8f447 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html @@ -0,0 +1,19 @@ + + } + + + + {{ choice | translatable : "description" | async}} + + + + + + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss new file mode 100644 index 000000000..16f07fddb --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss @@ -0,0 +1,29 @@ +// :host { +// display: flex; +// flex-direction: column; +// align-items: center; +// justify-content: center; + +// #choice { +// background-color: #ffbe98; +// width: max-content; +// height: fit-content; +// min-height: 2rem; +// div { +// width: 30rem; +// display: flex; +// align-items: start; +// justify-content: space-between; +// } +// } +// } + +// #description { +// width: 30rem; +// padding: var(--gap); +// background-color: #fff8f4; +// border-radius: 0 0 var(--mdc-shape-small) var(--mdc-shape-small); +// border: 1px solid var(--color-border); +// box-shadow: 0px 2px 8px 0px var(--color-box-shadow); +// } + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts new file mode 100644 index 000000000..e94863412 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts @@ -0,0 +1,51 @@ +import { Component, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { collapse } from 'ngx-cinlib/core'; +import { RadioCardInput } from 'ngx-cinlib/forms/radio-card'; +import { TranslationService } from 'ngx-cinlib/i18n'; +import { Maybe, NavigatorChoiceEntity } from 'src/app/core/api/generated/schema'; +import { portalUrl } from 'src/app/core/constants/module.constants'; +import { NavigatorPortalDetailsLayoutActions } from '../../state/navigator-portal-details-layout.actions'; +import { selectNavigatorStateInputs } from '../../state/navigator-portal-details-layout.selectors'; + +@Component({ + selector: 'app-navigator-portal-details-layout-choice', + templateUrl: './navigator-portal-details-layout-choice.component.html', + styleUrls: ['./navigator-portal-details-layout-choice.component.scss'], + animations: [collapse()] +}) +export class NavigatorPortalDetailsLayoutChoiceComponent { + + @Input() + public choice?: Maybe; + + private inputs: RadioCardInput[] = []; + + public showDescription = false; + + constructor( + private router: Router, + private store: Store, + private translationService: TranslationService) { } + + public toNewPage(choice: Maybe){ + var choiceName: Maybe; + this.translationService.translatable(choice?.translatables, 'name').subscribe(name => choiceName = name); + + this.store.select(selectNavigatorStateInputs).subscribe(inputs => { + this.inputs = inputs.slice(0, (inputs.findIndex(input => input.value == (choice?.parent?.slug ?? '')) + 1)); + }); + + this.inputs = [...this.inputs, { + display: (this.inputs.length + 1).toString(), + label: choiceName!, + value: choice?.nextPage?.slug, + }]; + + this.store.dispatch(NavigatorPortalDetailsLayoutActions + .setNavigatorState(this.inputs, this.inputs.length)); + + this.router.navigate([portalUrl, 'navigator', 'start', choice?.nextPage?.slug]); + } +} \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html new file mode 100644 index 000000000..a2024524c --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html @@ -0,0 +1,7 @@ + + + + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss new file mode 100644 index 000000000..06680636f --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss @@ -0,0 +1,10 @@ +:host { + display: flex; + flex-direction: column; + gap: 1rem; + justify-content: center; + align-items: center; + margin: var(--gap) auto; +} + + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts new file mode 100644 index 000000000..76d8bec1e --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts @@ -0,0 +1,101 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { RadioCardInput } from 'ngx-cinlib/forms/radio-card'; +import { TranslationService } from 'ngx-cinlib/i18n'; +import { Subject, filter, switchMap } from 'rxjs'; +import { Maybe, NavigatorChoiceEntity, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { portalUrl } from 'src/app/core/constants/module.constants'; +import { slug } from 'src/app/core/constants/queryparam.constants'; +import { NavigatorPortalDetailsLayoutActions } from '../state/navigator-portal-details-layout.actions'; +import { selectCurrentPage, selectNavigatorStateInputs } from '../state/navigator-portal-details-layout.selectors'; + +@Component({ + selector: 'app-navigator-portal-details-layout', + templateUrl: './navigator-portal-details-layout.component.html', + styleUrls: ['./navigator-portal-details-layout.component.scss'], +}) +export class NavigatorPortalDetailsLayoutComponent implements OnInit, OnDestroy { + + public currentPage?: Maybe; + + private destroy = new Subject(); + + public inputs: RadioCardInput[] = []; + + public initValue = ''; + + private currentIndex = 0; + + public showDescription: number | null = null; + + toggleDescription(index: number) { + this.showDescription = this.showDescription === index ? null : index; + } + + constructor( + private activatedRoute: ActivatedRoute, + private router: Router, + private store: Store, + private translationService: TranslationService) { + + } + + public ngOnInit(): void { + + this.activatedRoute?.params.pipe( + switchMap(params => { + const action = params[slug] + ? NavigatorPortalDetailsLayoutActions.getPage(params[slug]) + : NavigatorPortalDetailsLayoutActions.getStartPage(); + this.store.dispatch(action); + return this.store.select(selectCurrentPage); + }), + filter(page => !!page), + ).subscribe(page => { + // var choiceName: Maybe; + // this.translationService.translatable(page?.parentChoices?.[0]?.translatables, 'name') + // .subscribe(name => choiceName = name); + // this.inputs.push({ + // display: (this.inputs.length + 1).toString(), + // label: choiceName ? choiceName : "Start", + // value: page?.slug, + // }); + // this.store.select(selectNavigatorStateIndex).subscribe(index => this.currentIndex = index); + + // console.log("be4Slice", this.inputs); + // console.log("index", this.currentIndex); + // this.currentIndex = this.currentIndex + 1; + // this.inputs = this.inputs.slice(0, this.currentIndex); + // console.log("sliced", this.inputs); + // this.inputs = this.inputs.slice(0, (this.inputs.findIndex(input => input.value == page?.slug) +1)); + + this.currentPage = page; + this.initValue = page?.slug!}); + this.store.select(selectNavigatorStateInputs).subscribe(inputs => this.inputs = inputs); + } + + public route(route: string | null): void { + this.router.navigate([portalUrl, 'navigator', 'start', route]); + } + + public toNewPage(choice: Maybe){ + var choiceName: Maybe; + this.translationService.translatable(choice?.translatables, 'name').subscribe(name => choiceName = name); + + this.inputs = [...this.inputs, { + display: (this.inputs.length + 1).toString(), + label: choiceName!, + value: choice?.nextPage?.slug, + }]; + + this.store.dispatch(NavigatorPortalDetailsLayoutActions.setNavigatorState(this.inputs, this.inputs.length)); + + this.router.navigate([portalUrl, 'navigator', 'start', choice?.nextPage?.slug]); + } + + public ngOnDestroy(): void { + this.destroy.next(); + this.destroy.complete(); + } +} \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html new file mode 100644 index 000000000..fe4d9fa88 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html @@ -0,0 +1,14 @@ + + + +
+ @for (choice of page?.choices; track choice; let index = $index) { + + } + + + Die Desmane, auch Bisamspitz­mäuse genannt, sind eine Gattungs­gruppe der Maul­würfe (Talpidae). Sie umfasst mit dem Rus­sischen Desman und dem Pyrenäen-Desman zwei rezente Arten. Die Tiere sind von allen Maul­würfen am besten ans Wasser­leben angepasst. Anzei­chen dafür finden sich unter anderem in dem gedrun­genen Körper­bau mit langer Schnauze und ver­schließ­baren Nasen­löchern, dem langen und teilweise oder voll­ständig abge­platte­ten Schwanz, den gegenüber den Vorder­füßen sehr großen Hinter­füßen und den Schwimm­häuten zwischen den Zehen. + +
+ + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss new file mode 100644 index 000000000..fa3026b5c --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss @@ -0,0 +1,22 @@ +:host{ + display: flex; + gap: var(--gap); + flex-direction: column; + align-items: center; + justify-content: center; +} + +.container { + display: flex; + gap: 1rem; + flex-direction: column; + align-items: center; + justify-content: center; +} + + +.border-box { + background-color: #4c4d4f; + color: white; + width: 30rem; +} diff --git a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.ts b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.ts new file mode 100644 index 000000000..c6b4f6ab4 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.ts @@ -0,0 +1,17 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; + +@Component({ + selector: 'app-navigator-portal-details-layout-page', + templateUrl: './navigator-portal-details-layout-page.component.html', + styleUrls: ['./navigator-portal-details-layout-page.component.scss'], +}) +export class NavigatorPortalDetailsLayoutPageComponent implements OnInit { + + @Input() + public page?: Maybe; + + constructor() { } + ngOnInit(): void { + } +} \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/constants/navigator-portal-details-layout.constants.ts b/src/app/features/navigator/portal/details/modules/layout/constants/navigator-portal-details-layout.constants.ts new file mode 100644 index 000000000..066033273 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/constants/navigator-portal-details-layout.constants.ts @@ -0,0 +1 @@ +export const navigatorPortalDetailsLayoutStateKey = 'navigatorPortalDetailsLayoutState'; \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts b/src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts new file mode 100644 index 000000000..7bc5aeca7 --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { Observable, map, tap } from 'rxjs'; +import { portalUrl } from 'src/app/core/constants/module.constants'; +import { selectNavigatorStateInputs } from '../state/navigator-portal-details-layout.selectors'; + +//TODO: replace with function isAuthenticated in privileges.utils.ts +@Injectable({ + providedIn: 'root' +}) +export class NavigatorRefreshGuard { + + constructor(private store: Store, private router: Router) {} + + canActivate(): Observable { + return this.store.select(selectNavigatorStateInputs).pipe( + map(inputs => inputs.length > 1), + tap(canActivate => { + if (!canActivate) { + this.router.navigate([portalUrl, 'navigator', 'start']); + } + }) + ); + } +} \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts b/src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts new file mode 100644 index 000000000..f7890ecef --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts @@ -0,0 +1,63 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { RouterModule } from '@angular/router'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { RadioCardGroupComponent } from 'ngx-cinlib/forms/radio-card'; +import { I18nDirective, TranslatablePipe } from 'ngx-cinlib/i18n'; +import { IconComponent } from 'ngx-cinlib/icons'; +import { DetailsTitleComponent } from 'ngx-cinlib/layouts/title'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorPortalDetailsLayoutChoiceComponent } from './components/choice/navigator-portal-details-layout-choice.component'; +import { NavigatorPortalDetailsLayoutComponent } from './components/navigator-portal-details-layout.component'; +import { NavigatorPortalDetailsLayoutPageComponent } from './components/page/navigator-portal-details-layout-page.component'; +import { navigatorPortalDetailsLayoutStateKey } from './constants/navigator-portal-details-layout.constants'; +import { NavigatorPortalDetailsLayoutEffects } from './state/navigator-portal-details-layout.effects'; +import { navigatorAdminDetailsLayoutReducer } from './state/navigator-portal-details-layout.reducer'; + +const components = [ + NavigatorPortalDetailsLayoutComponent, + NavigatorPortalDetailsLayoutPageComponent, + NavigatorPortalDetailsLayoutChoiceComponent, +] + +const framework = [ + CommonModule, + RouterModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, + MatExpansionModule +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorPortalDetailsLayoutStateKey, navigatorAdminDetailsLayoutReducer), + EffectsModule.forFeature([NavigatorPortalDetailsLayoutEffects]), + + IconComponent, + I18nDirective, + DetailsTitleComponent, + RadioCardGroupComponent, + TranslatablePipe, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorPortalDetailsLayoutModule { } diff --git a/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.actions.ts b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.actions.ts new file mode 100644 index 000000000..9fda3d73b --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.actions.ts @@ -0,0 +1,16 @@ +import { createActionGroup, emptyProps } from '@ngrx/store'; +import { RadioCardInput } from 'ngx-cinlib/forms/radio-card'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; + +export const NavigatorPortalDetailsLayoutActions = createActionGroup({ + source: 'Navigator Portal Details Layout', + events: { + 'get start page': emptyProps(), + 'set start page': (startPage: Maybe) => ({ startPage }), + + 'get page': (slug: Maybe) => ({ slug }), + 'set page': (page: Maybe) => ({ page }), + + 'set navigator state': (inputs: RadioCardInput[], currentIndex: number) => ({ inputs, currentIndex }) + } +}); diff --git a/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.effects.ts b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.effects.ts new file mode 100644 index 000000000..26f12a0ad --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.effects.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { filter, map, switchMap } from 'rxjs'; +import { AdminActions } from 'src/app/admin/state/admin.actions'; +import { NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { GetNavigatorPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-page.query.generated'; +import { GetNavigatorStartPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-start-page.query.generated'; +import { NavigatorPortalDetailsLayoutActions } from './navigator-portal-details-layout.actions'; + +@Injectable() +export class NavigatorPortalDetailsLayoutEffects { + + getStartPage = createEffect(() => this.actions.pipe( + ofType(NavigatorPortalDetailsLayoutActions.getStartPage), + switchMap( () => this.getNavigatorStartPageService.watch().valueChanges), + filter(response => !!response.data.getNavigatorStartPage?.id), + map(response => NavigatorPortalDetailsLayoutActions.setStartPage(response.data.getNavigatorStartPage as NavigatorPageEntity)) + )); + + getPage = createEffect(() => this.actions.pipe( + ofType(NavigatorPortalDetailsLayoutActions.getPage), + switchMap((action) => this.getNavigatorPageService.watch({ + entity: { + slug: action.slug + } + }).valueChanges), + map(response => response.data.getNavigatorPage?.id + ? NavigatorPortalDetailsLayoutActions.setPage(response.data.getNavigatorPage as NavigatorPageEntity) + : AdminActions.notFound()) + )); + + constructor( + private actions: Actions, + private getNavigatorStartPageService: GetNavigatorStartPageGQL, + private getNavigatorPageService: GetNavigatorPageGQL + + ) {} +} diff --git a/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.reducer.ts b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.reducer.ts new file mode 100644 index 000000000..5f99db12c --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.reducer.ts @@ -0,0 +1,50 @@ +import { createReducer, on } from '@ngrx/store'; + +import { RadioCardInput } from 'ngx-cinlib/forms/radio-card'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { NavigatorPortalDetailsLayoutActions } from './navigator-portal-details-layout.actions'; + +export interface NavigatorPortalDetailsLayoutState { + currentPage?: Maybe; + inputs: RadioCardInput[]; + currentIndex: number; +} + +export const initialState: NavigatorPortalDetailsLayoutState = { + inputs: [ + { + display: '1', + label: 'Start', + value: '' + } + ], + currentIndex: 0 +}; + +export const navigatorAdminDetailsLayoutReducer = createReducer( + initialState, + + on( + NavigatorPortalDetailsLayoutActions.setStartPage, + (state, action): NavigatorPortalDetailsLayoutState => ({ + ...state, currentPage: action.startPage + })), + + on( + NavigatorPortalDetailsLayoutActions.setPage, + (state, action): NavigatorPortalDetailsLayoutState => ({ + ...state, currentPage: action.page + })), + + on( + NavigatorPortalDetailsLayoutActions.setNavigatorState, + (state, action): NavigatorPortalDetailsLayoutState => ({ + ...state, inputs: action.inputs + })), + + on( + NavigatorPortalDetailsLayoutActions.setNavigatorState, + (state, action): NavigatorPortalDetailsLayoutState => ({ + ...state, currentIndex: action.currentIndex + })), +); diff --git a/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.selectors.ts b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.selectors.ts new file mode 100644 index 000000000..a6e09457b --- /dev/null +++ b/src/app/features/navigator/portal/details/modules/layout/state/navigator-portal-details-layout.selectors.ts @@ -0,0 +1,20 @@ +import { createFeatureSelector, createSelector } from '@ngrx/store'; +import { navigatorPortalDetailsLayoutStateKey } from '../constants/navigator-portal-details-layout.constants'; +import { NavigatorPortalDetailsLayoutState } from './navigator-portal-details-layout.reducer'; + +export const selectNavigatorPortalDetailsLayoutState = createFeatureSelector(navigatorPortalDetailsLayoutStateKey); + +export const selectCurrentPage = createSelector( + selectNavigatorPortalDetailsLayoutState, + state => state.currentPage +); + +export const selectNavigatorStateInputs = createSelector( + selectNavigatorPortalDetailsLayoutState, + state => state.inputs +); + +export const selectNavigatorStateIndex = createSelector( + selectNavigatorPortalDetailsLayoutState, + state => state.currentIndex +); \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts b/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts index 72d4961bf..b6c15951d 100644 --- a/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts +++ b/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts @@ -1,12 +1,30 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { slug } from 'src/app/core/constants/queryparam.constants'; +import { NavigatorRefreshGuard } from 'src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service'; +import { NavigatorPortalDetailsLandingComponent } from './modules/landing/navigator-portal-details-landing.component'; +import { NavigatorPortalDetailsLayoutComponent } from './modules/layout/components/navigator-portal-details-layout.component'; const routes: Routes = [ { path: '', loadChildren: () => import('./modules/landing/navigator-portal-details-landing.module') .then((imported) => imported.NavigatorPortalDetailsLandingModule), + component: NavigatorPortalDetailsLandingComponent + }, + { + path: 'start', + loadChildren: () => import('./modules/layout/navigator-portal-details-layout.module') + .then((imported) => imported.NavigatorPortalDetailsLayoutModule), + component: NavigatorPortalDetailsLayoutComponent + }, + { + path: `start/:${slug}`, + loadChildren: () => import('./modules/layout/navigator-portal-details-layout.module') + .then((imported) => imported.NavigatorPortalDetailsLayoutModule), + component: NavigatorPortalDetailsLayoutComponent, + canActivate: [NavigatorRefreshGuard] }, ]; diff --git a/src/app/features/navigator/portal/navigator-portal-routing.module.ts b/src/app/features/navigator/portal/navigator-portal-routing.module.ts index 54dca5d71..929c6642c 100644 --- a/src/app/features/navigator/portal/navigator-portal-routing.module.ts +++ b/src/app/features/navigator/portal/navigator-portal-routing.module.ts @@ -1,7 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { navigatorFeatureKey } from 'src/app/core/constants/feature.constants'; -import { slug } from 'src/app/core/constants/queryparam.constants'; const routes: Routes = [ // { @@ -10,7 +9,7 @@ const routes: Routes = [ // .then((imported) => imported.NavigatorPortalDetailsModule), // }, { - path: `${navigatorFeatureKey}/:${slug}`, + path: navigatorFeatureKey, loadChildren: () => import('src/app/features/navigator/portal/details/navigator-portal-details.module') .then((imported) => imported.NavigatorPortalDetailsModule), }, diff --git a/src/assets/in-progress.svg b/src/assets/in-progress.svg new file mode 100644 index 000000000..10ad4e81b --- /dev/null +++ b/src/assets/in-progress.svg @@ -0,0 +1 @@ + \ No newline at end of file From 6eae8a1ef64fad2261708649f37006835fc3fbd1 Mon Sep 17 00:00:00 2001 From: DOOMED2WIN Date: Mon, 4 Mar 2024 17:21:45 +0100 Subject: [PATCH 3/7] navigator open issue --- src/app/core/api/generated/schema.ts | 63 ++++++++-------- .../queries/get-navigator-page.query.graphql | 33 ++++++--- .../get-navigator-start-page.query.graphql | 1 + .../get-navigator-page.query.generated.ts | 26 +++++-- ...et-navigator-start-page.query.generated.ts | 3 +- .../constants/navigator-details.constant.ts | 2 + ...ortal-details-layout-choice.component.html | 16 ++--- ...ortal-details-layout-choice.component.scss | 71 ++++++++++++------- ...-portal-details-layout-choice.component.ts | 21 +++++- ...gator-portal-details-layout.component.html | 3 + ...gator-portal-details-layout.component.scss | 20 +++++- ...vigator-portal-details-layout.component.ts | 51 ++----------- ...-portal-details-layout-page.component.html | 30 +++++--- ...-portal-details-layout-page.component.scss | 33 +++++---- .../page-refresh-guard.service.ts | 4 +- ...navigator-portal-details-routing.module.ts | 12 +++- 16 files changed, 232 insertions(+), 157 deletions(-) diff --git a/src/app/core/api/generated/schema.ts b/src/app/core/api/generated/schema.ts index 2f9f610a6..f86385a8f 100644 --- a/src/app/core/api/generated/schema.ts +++ b/src/app/core/api/generated/schema.ts @@ -1981,8 +1981,8 @@ export type Mutation = { saveNavigatorChoices?: Maybe>>; saveNavigatorPage?: Maybe; saveNavigatorPages?: Maybe>>; - saveNavigatorResultPage?: Maybe; - saveNavigatorResultPages?: Maybe>>; + saveNavigatorResultPage?: Maybe; + saveNavigatorResultPages?: Maybe>>; saveNotification?: Maybe; saveNotifications?: Maybe>>; saveOrganisation?: Maybe; @@ -3598,13 +3598,13 @@ export type MutationSaveNavigatorPagesArgs = { /** Mutation root */ export type MutationSaveNavigatorResultPageArgs = { - entity?: InputMaybe; + entity?: InputMaybe; }; /** Mutation root */ export type MutationSaveNavigatorResultPagesArgs = { - entities?: InputMaybe>>; + entities?: InputMaybe>>; }; @@ -4066,7 +4066,7 @@ export type NavigatorChoiceEntity = { name?: Maybe; nextPage?: Maybe; parent?: Maybe; - resultPage?: Maybe; + resultPage?: Maybe; slug?: Maybe; translatables?: Maybe>>; }; @@ -4079,7 +4079,7 @@ export type NavigatorChoiceEntityInput = { name?: InputMaybe; nextPage?: InputMaybe; parent?: InputMaybe; - resultPage?: InputMaybe; + resultPage?: InputMaybe; slug?: InputMaybe; translatables?: InputMaybe>>; }; @@ -4108,6 +4108,8 @@ export type NavigatorPageEntity = { choices?: Maybe>>; created?: Maybe; id?: Maybe; + isResultPage?: Maybe; + links?: Maybe>>; modified?: Maybe; parentChoices?: Maybe>>; slug?: Maybe; @@ -4120,6 +4122,8 @@ export type NavigatorPageEntityInput = { choices?: InputMaybe>>; created?: InputMaybe; id?: InputMaybe; + isResultPage?: InputMaybe; + links?: InputMaybe>>; modified?: InputMaybe; parentChoices?: InputMaybe>>; slug?: InputMaybe; @@ -4145,47 +4149,41 @@ export type NavigatorPageTranslatableEntityInput = { title?: InputMaybe; }; -export type NavigatorResultPageEntity = { - __typename?: 'NavigatorResultPageEntity'; - content?: Maybe; +export type NavigatorResultLinkEntity = { + __typename?: 'NavigatorResultLinkEntity'; created?: Maybe; id?: Maybe; modified?: Maybe; - parents?: Maybe>>; - slug?: Maybe; - title?: Maybe; - translatables?: Maybe>>; + name?: Maybe; + parent?: Maybe; + translatables?: Maybe>>; url?: Maybe; }; -export type NavigatorResultPageEntityInput = { - content?: InputMaybe; +export type NavigatorResultLinkEntityInput = { created?: InputMaybe; id?: InputMaybe; modified?: InputMaybe; - parents?: InputMaybe>>; - slug?: InputMaybe; - title?: InputMaybe; - translatables?: InputMaybe>>; + name?: InputMaybe; + parent?: InputMaybe; + translatables?: InputMaybe>>; url?: InputMaybe; }; -export type NavigatorResultPageTranslatableEntity = { - __typename?: 'NavigatorResultPageTranslatableEntity'; - content?: Maybe; +export type NavigatorResultLinkTranslatableEntity = { + __typename?: 'NavigatorResultLinkTranslatableEntity'; created?: Maybe; id?: Maybe; language?: Maybe; modified?: Maybe; - title?: Maybe; + name?: Maybe; }; -export type NavigatorResultPageTranslatableEntityInput = { - content?: InputMaybe; +export type NavigatorResultLinkTranslatableEntityInput = { created?: InputMaybe; id?: InputMaybe; modified?: InputMaybe; - title?: InputMaybe; + name?: InputMaybe; }; export type NotificationEntity = { @@ -4914,9 +4912,9 @@ export type PageableList_NavigatorPageEntity = { total: Scalars['Long']['output']; }; -export type PageableList_NavigatorResultPageEntity = { - __typename?: 'PageableList_NavigatorResultPageEntity'; - result?: Maybe>>; +export type PageableList_NavigatorResultLinkEntity = { + __typename?: 'PageableList_NavigatorResultLinkEntity'; + result?: Maybe>>; total: Scalars['Long']['output']; }; @@ -5302,8 +5300,9 @@ export type Query = { getNavigatorChoices?: Maybe; getNavigatorPage?: Maybe; getNavigatorPages?: Maybe; - getNavigatorResultPage?: Maybe; - getNavigatorResultPages?: Maybe; + getNavigatorResultPage?: Maybe; + getNavigatorResultPages?: Maybe; + getNavigatorStartPage?: Maybe; getNotification?: Maybe; getNotifications?: Maybe; getOrganisation?: Maybe; @@ -5880,7 +5879,7 @@ export type QueryGetNavigatorPagesArgs = { /** Query root */ export type QueryGetNavigatorResultPageArgs = { - entity?: InputMaybe; + entity?: InputMaybe; }; diff --git a/src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql b/src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql index a6c7d64cc..0d065acc8 100644 --- a/src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql +++ b/src/app/features/navigator/api/documents/queries/get-navigator-page.query.graphql @@ -7,6 +7,17 @@ query getNavigatorPage($entity: NavigatorPageEntityInput) { title additionalInformation + translatables { + id + additionalInformation + title + language { + id + locale + name + } + } + choices { id description @@ -41,20 +52,22 @@ query getNavigatorPage($entity: NavigatorPageEntityInput) { locale name } - } - - } - - translatables { + } + } + + links { id - additionalInformation - title - language { + name + url + translatables { id - locale name + language { + id + locale + name + } } } - } } \ No newline at end of file diff --git a/src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql b/src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql index 251ba4d64..97a45e01f 100644 --- a/src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql +++ b/src/app/features/navigator/api/documents/queries/get-navigator-start-page.query.graphql @@ -6,6 +6,7 @@ query getNavigatorStartPage { slug title additionalInformation + isResultPage choices { id diff --git a/src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts b/src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts index 11c972300..7c1e27a8e 100644 --- a/src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts +++ b/src/app/features/navigator/api/generated/get-navigator-page.query.generated.ts @@ -9,7 +9,7 @@ export type GetNavigatorPageQueryVariables = Types.Exact<{ }>; -export type GetNavigatorPageQuery = { __typename?: 'Query', getNavigatorPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, additionalInformation?: string | null, choices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, description?: string | null, name?: string | null, parent?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, nextPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, parentChoices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, translatables?: Array<{ __typename?: 'NavigatorPageTranslatableEntity', id?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null }; +export type GetNavigatorPageQuery = { __typename?: 'Query', getNavigatorPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, additionalInformation?: string | null, translatables?: Array<{ __typename?: 'NavigatorPageTranslatableEntity', id?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null, choices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, description?: string | null, name?: string | null, parent?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, nextPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, parentChoices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, links?: Array<{ __typename?: 'NavigatorResultLinkEntity', id?: string | null, name?: string | null, url?: string | null, translatables?: Array<{ __typename?: 'NavigatorResultLinkTranslatableEntity', id?: string | null, name?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null } | null }; export const GetNavigatorPageDocument = gql` query getNavigatorPage($entity: NavigatorPageEntityInput) { @@ -20,6 +20,16 @@ export const GetNavigatorPageDocument = gql` slug title additionalInformation + translatables { + id + additionalInformation + title + language { + id + locale + name + } + } choices { id description @@ -55,14 +65,18 @@ export const GetNavigatorPageDocument = gql` } } } - translatables { + links { id - additionalInformation - title - language { + name + url + translatables { id - locale name + language { + id + locale + name + } } } } diff --git a/src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts b/src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts index 010b02b03..3ed457362 100644 --- a/src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts +++ b/src/app/features/navigator/api/generated/get-navigator-start-page.query.generated.ts @@ -7,7 +7,7 @@ import * as Apollo from 'apollo-angular'; export type GetNavigatorStartPageQueryVariables = Types.Exact<{ [key: string]: never; }>; -export type GetNavigatorStartPageQuery = { __typename?: 'Query', getNavigatorStartPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, additionalInformation?: string | null, choices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, description?: string | null, name?: string | null, nextPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, parentChoices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null } | null> | null, translatables?: Array<{ __typename?: 'NavigatorPageTranslatableEntity', id?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null }; +export type GetNavigatorStartPageQuery = { __typename?: 'Query', getNavigatorStartPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, modified?: any | null, created?: any | null, slug?: string | null, title?: string | null, additionalInformation?: string | null, isResultPage?: boolean | null, choices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, description?: string | null, name?: string | null, nextPage?: { __typename?: 'NavigatorPageEntity', id?: string | null, slug?: string | null } | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, parentChoices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null } | null> | null, translatables?: Array<{ __typename?: 'NavigatorPageTranslatableEntity', id?: string | null, additionalInformation?: string | null, title?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null }; export const GetNavigatorStartPageDocument = gql` query getNavigatorStartPage { @@ -18,6 +18,7 @@ export const GetNavigatorStartPageDocument = gql` slug title additionalInformation + isResultPage choices { id description diff --git a/src/app/features/navigator/portal/details/constants/navigator-details.constant.ts b/src/app/features/navigator/portal/details/constants/navigator-details.constant.ts index e69de29bb..7e445eec4 100644 --- a/src/app/features/navigator/portal/details/constants/navigator-details.constant.ts +++ b/src/app/features/navigator/portal/details/constants/navigator-details.constant.ts @@ -0,0 +1,2 @@ +export const navigatorStartRoute = 'start'; +export const navigatorResultRoute = 'result'; \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html index 976e8f447..7076b9376 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html @@ -1,18 +1,18 @@ - } - - - {{ choice | translatable : "description" | async}} - - + +

+ {{ choice | translatable : "description" | async}} +

diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss index 16f07fddb..7dfbe8f69 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss @@ -1,29 +1,48 @@ -// :host { -// display: flex; -// flex-direction: column; -// align-items: center; -// justify-content: center; +a { + width: 100%; + display: flex; + justify-content: space-between; + height: max-content; + background-color: var(--color-primary-200) !important; -// #choice { -// background-color: #ffbe98; -// width: max-content; -// height: fit-content; -// min-height: 2rem; -// div { -// width: 30rem; -// display: flex; -// align-items: start; -// justify-content: space-between; -// } -// } -// } + div { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + } +} -// #description { -// width: 30rem; -// padding: var(--gap); -// background-color: #fff8f4; -// border-radius: 0 0 var(--mdc-shape-small) var(--mdc-shape-small); -// border: 1px solid var(--color-border); -// box-shadow: 0px 2px 8px 0px var(--color-box-shadow); -// } +button { + background-color: transparent; + cursor: pointer; + border: none; + border-radius: 5rem; + padding: .5rem; +} +button:hover { + background-color: lightgray; +} + +cin-icon{ + color: unset; +} + +p { + display: flex; + width: auto; + background-color: var(--color-primary-50); + border-radius: 0 0 var(--mdc-shape-small) var(--mdc-shape-small); + box-shadow: 0px 2px 8px 0px var(--color-box-shadow); +} + +:host ::ng-deep { + .mdc-button__label { + width: 100%; + margin: .75rem; + :first-child{ + text-align: start; + } + } +} diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts index e94863412..12e2e1e13 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts @@ -1,11 +1,13 @@ +import { animate, state, style, transition, trigger } from '@angular/animations'; import { Component, Input } from '@angular/core'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; -import { collapse } from 'ngx-cinlib/core'; import { RadioCardInput } from 'ngx-cinlib/forms/radio-card'; import { TranslationService } from 'ngx-cinlib/i18n'; import { Maybe, NavigatorChoiceEntity } from 'src/app/core/api/generated/schema'; +import { navigatorFeatureKey } from 'src/app/core/constants/feature.constants'; import { portalUrl } from 'src/app/core/constants/module.constants'; +import { navigatorStartRoute } from '../../../../constants/navigator-details.constant'; import { NavigatorPortalDetailsLayoutActions } from '../../state/navigator-portal-details-layout.actions'; import { selectNavigatorStateInputs } from '../../state/navigator-portal-details-layout.selectors'; @@ -13,7 +15,20 @@ import { selectNavigatorStateInputs } from '../../state/navigator-portal-details selector: 'app-navigator-portal-details-layout-choice', templateUrl: './navigator-portal-details-layout-choice.component.html', styleUrls: ['./navigator-portal-details-layout-choice.component.scss'], - animations: [collapse()] + animations: [ + trigger('collapse', [ + state('false', style({ + height: '0', + padding: '0', + overflow: 'hidden' + })), + state('true', style({ + height: '*', + padding: '2rem' + })), + transition('true <=> false', animate('300ms ease')) + ]) + ] }) export class NavigatorPortalDetailsLayoutChoiceComponent { @@ -46,6 +61,6 @@ export class NavigatorPortalDetailsLayoutChoiceComponent { this.store.dispatch(NavigatorPortalDetailsLayoutActions .setNavigatorState(this.inputs, this.inputs.length)); - this.router.navigate([portalUrl, 'navigator', 'start', choice?.nextPage?.slug]); + this.router.navigate([portalUrl, navigatorFeatureKey, navigatorStartRoute, choice?.nextPage?.slug]); } } \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html index a2024524c..8affeddd7 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html @@ -1,3 +1,4 @@ + + + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss index 06680636f..464223d47 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss @@ -1,10 +1,24 @@ :host { display: flex; flex-direction: column; - gap: 1rem; - justify-content: center; + gap: 3rem; align-items: center; - margin: var(--gap) auto; + justify-content: center; + overflow-x: hidden; + // margin: var(--gap) auto; } +.container { + // width: 60rem; + // max-width: calc(100% - var(--gap)); +} + +cin-radio-card-group{ + margin: 0 auto; + overflow-x: scroll; +} +app-navigator-portal-details-layout-page{ + width: 40rem; + max-width: calc(100% - var(--gap)); +} \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts index 76d8bec1e..611af5789 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.ts @@ -2,11 +2,12 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { RadioCardInput } from 'ngx-cinlib/forms/radio-card'; -import { TranslationService } from 'ngx-cinlib/i18n'; import { Subject, filter, switchMap } from 'rxjs'; -import { Maybe, NavigatorChoiceEntity, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { navigatorFeatureKey } from 'src/app/core/constants/feature.constants'; import { portalUrl } from 'src/app/core/constants/module.constants'; import { slug } from 'src/app/core/constants/queryparam.constants'; +import { navigatorStartRoute } from '../../../constants/navigator-details.constant'; import { NavigatorPortalDetailsLayoutActions } from '../state/navigator-portal-details-layout.actions'; import { selectCurrentPage, selectNavigatorStateInputs } from '../state/navigator-portal-details-layout.selectors'; @@ -25,8 +26,6 @@ export class NavigatorPortalDetailsLayoutComponent implements OnInit, OnDestroy public initValue = ''; - private currentIndex = 0; - public showDescription: number | null = null; toggleDescription(index: number) { @@ -36,13 +35,9 @@ export class NavigatorPortalDetailsLayoutComponent implements OnInit, OnDestroy constructor( private activatedRoute: ActivatedRoute, private router: Router, - private store: Store, - private translationService: TranslationService) { - - } + private store: Store) {} public ngOnInit(): void { - this.activatedRoute?.params.pipe( switchMap(params => { const action = params[slug] @@ -53,47 +48,15 @@ export class NavigatorPortalDetailsLayoutComponent implements OnInit, OnDestroy }), filter(page => !!page), ).subscribe(page => { - // var choiceName: Maybe; - // this.translationService.translatable(page?.parentChoices?.[0]?.translatables, 'name') - // .subscribe(name => choiceName = name); - // this.inputs.push({ - // display: (this.inputs.length + 1).toString(), - // label: choiceName ? choiceName : "Start", - // value: page?.slug, - // }); - // this.store.select(selectNavigatorStateIndex).subscribe(index => this.currentIndex = index); - - // console.log("be4Slice", this.inputs); - // console.log("index", this.currentIndex); - // this.currentIndex = this.currentIndex + 1; - // this.inputs = this.inputs.slice(0, this.currentIndex); - // console.log("sliced", this.inputs); - // this.inputs = this.inputs.slice(0, (this.inputs.findIndex(input => input.value == page?.slug) +1)); - this.currentPage = page; - this.initValue = page?.slug!}); + this.initValue = (page?.parentChoices?.length ?? 0) > 0 ? page?.slug! : ''}); this.store.select(selectNavigatorStateInputs).subscribe(inputs => this.inputs = inputs); } public route(route: string | null): void { - this.router.navigate([portalUrl, 'navigator', 'start', route]); - } - - public toNewPage(choice: Maybe){ - var choiceName: Maybe; - this.translationService.translatable(choice?.translatables, 'name').subscribe(name => choiceName = name); - - this.inputs = [...this.inputs, { - display: (this.inputs.length + 1).toString(), - label: choiceName!, - value: choice?.nextPage?.slug, - }]; - - this.store.dispatch(NavigatorPortalDetailsLayoutActions.setNavigatorState(this.inputs, this.inputs.length)); - - this.router.navigate([portalUrl, 'navigator', 'start', choice?.nextPage?.slug]); + this.router.navigate([portalUrl, navigatorFeatureKey, navigatorStartRoute, route]); } - + public ngOnDestroy(): void { this.destroy.next(); this.destroy.complete(); diff --git a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html index fe4d9fa88..62f00b78c 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html +++ b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html @@ -1,14 +1,28 @@ - + -
- @for (choice of page?.choices; track choice; let index = $index) { - +@if (page?.choices){ +
+ @for (choice of page?.choices; track choice; let index = $index) { + + + } +
+} + +@if (page?.links){ + @for (link of page?.links; track link) { + + {{ link | translatable : 'name' | async}} + } +} - - Die Desmane, auch Bisamspitz­mäuse genannt, sind eine Gattungs­gruppe der Maul­würfe (Talpidae). Sie umfasst mit dem Rus­sischen Desman und dem Pyrenäen-Desman zwei rezente Arten. Die Tiere sind von allen Maul­würfen am besten ans Wasser­leben angepasst. Anzei­chen dafür finden sich unter anderem in dem gedrun­genen Körper­bau mit langer Schnauze und ver­schließ­baren Nasen­löchern, dem langen und teilweise oder voll­ständig abge­platte­ten Schwanz, den gegenüber den Vorder­füßen sehr großen Hinter­füßen und den Schwimm­häuten zwischen den Zehen. - -
+@if (page | translatable: 'additionalInformation' | async) { +
+ {{ (page | translatable: 'additionalInformation' | async) }} +
+} diff --git a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss index fa3026b5c..d2848bbd9 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss +++ b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.scss @@ -1,22 +1,29 @@ :host{ display: flex; - gap: var(--gap); + gap: 3rem; flex-direction: column; align-items: center; justify-content: center; -} + width: 100%; -.container { - display: flex; - gap: 1rem; - flex-direction: column; - align-items: center; - justify-content: center; -} + section { + display: flex; + gap: 1rem; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + span{ + width: 100% !important; + } + app-navigator-portal-details-layout-choice { + width: 100%; + } + } -.border-box { - background-color: #4c4d4f; - color: white; - width: 30rem; + a { + background-color: var(--color-primary-200); + } } + diff --git a/src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts b/src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts index 7bc5aeca7..0321b6a0f 100644 --- a/src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts +++ b/src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service.ts @@ -2,7 +2,9 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { Observable, map, tap } from 'rxjs'; +import { navigatorFeatureKey } from 'src/app/core/constants/feature.constants'; import { portalUrl } from 'src/app/core/constants/module.constants'; +import { navigatorStartRoute } from '../../../constants/navigator-details.constant'; import { selectNavigatorStateInputs } from '../state/navigator-portal-details-layout.selectors'; //TODO: replace with function isAuthenticated in privileges.utils.ts @@ -18,7 +20,7 @@ export class NavigatorRefreshGuard { map(inputs => inputs.length > 1), tap(canActivate => { if (!canActivate) { - this.router.navigate([portalUrl, 'navigator', 'start']); + this.router.navigate([portalUrl, navigatorFeatureKey, navigatorStartRoute]); } }) ); diff --git a/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts b/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts index b6c15951d..56c2c6aa8 100644 --- a/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts +++ b/src/app/features/navigator/portal/details/navigator-portal-details-routing.module.ts @@ -3,6 +3,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { slug } from 'src/app/core/constants/queryparam.constants'; import { NavigatorRefreshGuard } from 'src/app/features/navigator/portal/details/modules/layout/navigator-guard/page-refresh-guard.service'; +import { navigatorResultRoute, navigatorStartRoute } from './constants/navigator-details.constant'; import { NavigatorPortalDetailsLandingComponent } from './modules/landing/navigator-portal-details-landing.component'; import { NavigatorPortalDetailsLayoutComponent } from './modules/layout/components/navigator-portal-details-layout.component'; @@ -14,13 +15,20 @@ const routes: Routes = [ component: NavigatorPortalDetailsLandingComponent }, { - path: 'start', + path: navigatorStartRoute, loadChildren: () => import('./modules/layout/navigator-portal-details-layout.module') .then((imported) => imported.NavigatorPortalDetailsLayoutModule), component: NavigatorPortalDetailsLayoutComponent }, { - path: `start/:${slug}`, + path: `${navigatorStartRoute}/:${slug}`, + loadChildren: () => import('./modules/layout/navigator-portal-details-layout.module') + .then((imported) => imported.NavigatorPortalDetailsLayoutModule), + component: NavigatorPortalDetailsLayoutComponent, + canActivate: [NavigatorRefreshGuard] + }, + { + path: `${navigatorResultRoute}/:${slug}`, loadChildren: () => import('./modules/layout/navigator-portal-details-layout.module') .then((imported) => imported.NavigatorPortalDetailsLayoutModule), component: NavigatorPortalDetailsLayoutComponent, From 1f90d73598765881403e7357e7b6e15f41be9f8b Mon Sep 17 00:00:00 2001 From: DOOMED2WIN Date: Wed, 6 Mar 2024 10:34:08 +0100 Subject: [PATCH 4/7] admin structure, portal done --- src/app/admin/admin.module.ts | 2 + src/app/core/typings/privilege.ts | 3 +- .../navigation-admin-form.component.html | 21 ---- .../navigation-admin-form.component.scss | 29 ----- .../navigation-admin-form.component.ts | 68 ----------- .../event-admin-details.constants.ts | 3 + .../navigation-admin-form.constants.ts | 1 - ...navigator-admin-form-choice.component.scss | 0 .../navigator-admin-form-choice.component.ts | 9 ++ .../navigator-admin-form-page.component.html | 0 .../navigator-admin-form-choice.constants.ts | 1 + .../navigator-admin-form-choice.module.ts | 48 ++++++++ .../navigator-admin-form-choice.actions.ts | 6 + .../navigator-admin-form-choice.effects.ts | 7 ++ .../navigator-admin-form-choice.reducer.ts | 14 +++ .../navigator-admin-form-choice.selectors.ts | 7 ++ ...navigator-admin-form-layout.component.html | 1 + ...navigator-admin-form-layout.component.scss | 0 .../navigator-admin-form-layout.component.ts | 9 ++ .../navigator-admin-form-layout.constants.ts | 1 + .../navigator-admin-form-layout.module.ts | 48 ++++++++ .../navigator-admin-form-layout.actions.ts | 10 ++ .../navigator-admin-form-layout.effects.ts | 11 ++ .../navigator-admin-form-layout.reducer.ts | 14 +++ .../navigator-admin-form-layout.selectors.ts | 7 ++ .../navigator-admin-form-page.component.html | 0 .../navigator-admin-form-page.component.scss | 0 .../navigator-admin-form-page.component.ts | 9 ++ ...navigator-admin-form-overview.constants.ts | 1 + .../navigator-admin-form-page.module.ts | 48 ++++++++ .../navigator-admin-form-page.actions.ts | 8 ++ .../navigator-admin-form-page.effects.ts | 11 ++ .../navigator-admin-form-page.reducer.ts | 14 +++ .../navigator-admin-form-page.selectors.ts | 7 ++ .../navigator-admin-form-page.component.html | 0 .../navigator-admin-form-page.component.scss | 0 .../navigator-admin-form-page.component.ts | 9 ++ .../navigator-admin-form-page.constants.ts | 1 + .../page/navigator-admin-form-page.module.ts | 48 ++++++++ .../navigator-admin-form-page.actions.ts | 10 ++ .../navigator-admin-form-page.effects.ts | 11 ++ .../navigator-admin-form-page.reducer.ts | 14 +++ .../navigator-admin-form-page.selectors.ts | 7 ++ .../navigation-admin-form-routing.module.ts | 16 --- .../form/navigation-admin-form.module.ts | 74 ------------ .../navigator-admin-form-routing.module.ts | 25 ++++ .../admin/form/navigator-admin-form.module.ts | 16 +++ .../state/navigation-admin-form.actions.ts | 20 ---- .../state/navigation-portal-form.effects.ts | 63 ---------- .../state/navigation-portal-form.reducer.ts | 23 ---- .../state/navigation-portal-form.selectors.ts | 15 --- .../admin/navigation-admin-routing.module.ts | 60 ---------- .../admin/navigator-admin-routing.module.ts | 42 +++++++ .../deal-admin-overview.component.html | 17 --- .../deal-admin-overview.component.scss | 5 - .../deal-admin-overview.component.ts | 87 -------------- .../deal-admin-overview.constants.ts | 1 - .../deal-admin-overview-routing.module.ts | 16 --- .../overview/deal-admin-overview.module.ts | 56 --------- .../state/deal-admin-overview.actions.ts | 18 --- .../state/deal-portal-overview.effects.ts | 110 ------------------ .../state/deal-portal-overview.reducer.ts | 24 ---- .../state/deal-portal-overview.selectors.ts | 15 --- ...ator-portal-details-landing.component.html | 16 ++- ...ator-portal-details-landing.component.scss | 70 ++++++++--- ...igator-portal-details-landing.component.ts | 2 - ...navigator-portal-details-landing.module.ts | 5 +- ...ortal-details-layout-choice.component.html | 21 +--- ...ortal-details-layout-choice.component.scss | 46 +------- ...-portal-details-layout-choice.component.ts | 17 +-- ...gator-portal-details-layout.component.html | 4 +- ...gator-portal-details-layout.component.scss | 20 ++-- ...-portal-details-layout-page.component.html | 8 +- .../navigator-portal-details-layout.module.ts | 2 + .../portal-page-embedding-hero.component.html | 12 +- .../portal-page-embedding-hero.component.scss | 18 +-- .../embedding/portal-page-embedding.module.ts | 2 + .../gradient-button.component.html | 32 +++++ .../gradient-button.component.scss | 56 +++++++++ .../gradient-button.component.ts | 43 +++++++ src/assets/navigator-choose.svg | 1 + 81 files changed, 717 insertions(+), 879 deletions(-) delete mode 100644 src/app/features/navigator/admin/form/component/navigation-admin-form.component.html delete mode 100644 src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss delete mode 100644 src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts create mode 100644 src/app/features/navigator/admin/form/constants/event-admin-details.constants.ts delete mode 100644 src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-page.component.html create mode 100644 src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts create mode 100644 src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html create mode 100644 src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.ts create mode 100644 src/app/features/navigator/admin/form/modules/layout/constants/navigator-admin-form-layout.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts create mode 100644 src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.reducer.ts create mode 100644 src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.selectors.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.html create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-page.module.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.selectors.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html create mode 100644 src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts delete mode 100644 src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts delete mode 100644 src/app/features/navigator/admin/form/navigation-admin-form.module.ts create mode 100644 src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts create mode 100644 src/app/features/navigator/admin/form/navigator-admin-form.module.ts delete mode 100644 src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts delete mode 100644 src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts delete mode 100644 src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts delete mode 100644 src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts delete mode 100644 src/app/features/navigator/admin/navigation-admin-routing.module.ts create mode 100644 src/app/features/navigator/admin/navigator-admin-routing.module.ts delete mode 100644 src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html delete mode 100644 src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss delete mode 100644 src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts delete mode 100644 src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts delete mode 100644 src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts delete mode 100644 src/app/features/navigator/admin/overview/deal-admin-overview.module.ts delete mode 100644 src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts delete mode 100644 src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts delete mode 100644 src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts delete mode 100644 src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts create mode 100644 src/app/shared/widgets/gradient-button/gradient-button.component.html create mode 100644 src/app/shared/widgets/gradient-button/gradient-button.component.scss create mode 100644 src/app/shared/widgets/gradient-button/gradient-button.component.ts create mode 100644 src/assets/navigator-choose.svg diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index 6e23be86f..529cf149a 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -10,6 +10,7 @@ import { DealAdminRoutingModule } from '../features/deal/admin/deal-admin-routin import { EventAdminRoutingModule } from '../features/event/admin/event-admin-routing.module'; import { GuestArticleAdminRoutingModule } from '../features/guest-article/admin/guest-article-admin-routing.module'; import { MediaAdminRoutingModule } from '../features/media/admin/media-admin-routing.module'; +import { NavigatorAdminRoutingModule } from '../features/navigator/admin/navigator-admin-routing.module'; import { OrganisationAdminRoutingModule } from '../features/organisation/admin/organisation-admin-routing.module'; import { ReportAdminRoutingModule } from '../features/report/admin/report-admin-routing.module'; import { SurveyAdminRoutingModule } from '../features/survey/admin/survey-admin-routing.module'; @@ -35,6 +36,7 @@ const routes = [ ReportAdminRoutingModule, GuestArticleAdminRoutingModule, AuthorAdminRoutingModule, + NavigatorAdminRoutingModule, AdminRoutingModule, //TODO: always last entry duet to order and redirect to 404, Remove 404 and put in AppRouter ]; diff --git a/src/app/core/typings/privilege.ts b/src/app/core/typings/privilege.ts index 894d4a43d..22e34a0f1 100644 --- a/src/app/core/typings/privilege.ts +++ b/src/app/core/typings/privilege.ts @@ -20,4 +20,5 @@ export type Privilege = 'addresses_admin' | 'surveys_admin' | 'surveys_manage' | 'translator_admin' - | 'user_admin'; \ No newline at end of file + | 'user_admin' + | 'navigator_admin'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.html b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.html deleted file mode 100644 index 9ec29e2d9..000000000 --- a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss deleted file mode 100644 index 20b2c4a2a..000000000 --- a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.scss +++ /dev/null @@ -1,29 +0,0 @@ -:host { - display: flex; - flex-flow: column; - gap: 1rem; -} - -button { - align-self: flex-start; -} - -div { - display: flex; - gap: 1rem; - align-items: center; -} - -:host ::ng-deep { - - .mat-mdc-form-field-subscript-wrapper { - display: none; - } - -} - -mat-radio-group { - display: flex; - flex-wrap: wrap; - gap: 1rem -} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts b/src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts deleted file mode 100644 index c6a494ff6..000000000 --- a/src/app/features/navigator/admin/form/component/navigation-admin-form.component.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { FormBuilder, Validators } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Subject, filter, switchMap, takeUntil, tap } from 'rxjs'; -import { Maybe, NavigationNodeEntity } from 'src/app/core/api/generated/schema'; -import { slug } from 'src/app/core/constants/queryparam.constants'; -import { DealAdminFormActions } from '../state/navigation-admin-form.actions'; -import { selectDeal } from '../state/navigation-portal-form.selectors'; - - -@Component({ - selector: 'app-navigation-admin-form', - templateUrl: './navigation-admin-form.component.html', - styleUrls: ['./navigation-admin-form.component.scss'] -}) -export class NavigationAdminFormComponent implements OnInit, OnDestroy { - - public contentForm = this.fb.group({ - id: [undefined as Maybe], - name: [undefined as Maybe, [Validators.required]], - content: [undefined as Maybe, [Validators.required]], - }); - - public connectionForm = this.fb.group({ - conenctions: [[] as Maybe[]], - }); - - private destroy = new Subject(); - - constructor( - private activatedRoute: ActivatedRoute, - private fb: FormBuilder, - private store: Store, - ) {} - -public ngOnInit(): void { - - this.activatedRoute?.parent?.params.pipe( - filter(params => !!params[slug]), - tap(params => this.store.dispatch(DealAdminFormActions.getDeal(params[slug]))), - switchMap(() => this.store.select(selectDeal)), - filter(deal => !!deal?.id), - takeUntil(this.destroy) - ).subscribe(deal => { - - this.contentForm.patchValue({ - id: deal?.id, - name: deal?.name, - content: deal?.content, - }); - - }); - } - - public cancelled(): void { - this.store.dispatch(DealAdminFormActions.cancelled()); - } - - public saved(): void { - } - - public ngOnDestroy(): void { - this.destroy.next(); - this.destroy.complete(); - } - -} diff --git a/src/app/features/navigator/admin/form/constants/event-admin-details.constants.ts b/src/app/features/navigator/admin/form/constants/event-admin-details.constants.ts new file mode 100644 index 000000000..4a8b2d55f --- /dev/null +++ b/src/app/features/navigator/admin/form/constants/event-admin-details.constants.ts @@ -0,0 +1,3 @@ +export const pageRoute = 'page'; +export const choiceRoute = 'choice'; +export const overviewRoute = 'overview'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts b/src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts deleted file mode 100644 index ca1b09b02..000000000 --- a/src/app/features/navigator/admin/form/constants/navigation-admin-form.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const dealAdminFormStateKey = 'dealAdminFormState'; diff --git a/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.scss b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts new file mode 100644 index 000000000..f7f2164eb --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-navigator-admin-form-choice', + templateUrl: './navigator-admin-form-choice.component.html', + styleUrls: ['./navigator-admin-form-choice.component.scss'] +}) +export class NavigatorAdminFormChoiceComponent { +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-page.component.html b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-page.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts b/src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts new file mode 100644 index 000000000..5a52f9114 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts @@ -0,0 +1 @@ +export const navigatorAdminFormChoiceStateKey = 'navigatorAdminFormChoiceState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts b/src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts new file mode 100644 index 000000000..6a63382ab --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts @@ -0,0 +1,48 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormChoiceComponent } from './components/navigator-admin-form-choice.component'; +import { navigatorAdminFormChoiceStateKey } from './constants/navigator-admin-form-choice.constants'; +import { NavigatorAdminFormChoiceEffects } from './state/navigator-admin-form-choice.effects'; +import { navigatorAdminFormChoiceReducer } from './state/navigator-admin-form-choice.reducer'; + +const components = [ + NavigatorAdminFormChoiceComponent, +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorAdminFormChoiceStateKey, navigatorAdminFormChoiceReducer), + EffectsModule.forFeature([NavigatorAdminFormChoiceEffects]), + + TableComponent, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorAdminFormChoiceModule { } diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts new file mode 100644 index 000000000..d0a1dfa40 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts @@ -0,0 +1,6 @@ +import { createActionGroup } from '@ngrx/store'; + +export const NavigatorAdminFormChoiceActions = createActionGroup({ + source: 'Navigator Admin Form choice', + events: {} +}); diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts new file mode 100644 index 000000000..b48bb1f51 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts @@ -0,0 +1,7 @@ +import { Injectable } from '@angular/core'; + + +@Injectable() +export class NavigatorAdminFormChoiceEffects { + constructor() { } +} diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts new file mode 100644 index 000000000..ae82df72d --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts @@ -0,0 +1,14 @@ +import { createReducer } from '@ngrx/store'; + + + +export interface NavigatorAdminFormChoiceState { + +} + +export const initialState: NavigatorAdminFormChoiceState = { +}; + +export const navigatorAdminFormChoiceReducer = createReducer( + initialState, +); diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts new file mode 100644 index 000000000..e27e7e6f0 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts @@ -0,0 +1,7 @@ +import { createFeatureSelector } from '@ngrx/store'; +import { navigatorAdminFormChoiceStateKey } from '../constants/navigator-admin-form-choice.constants'; +import { NavigatorAdminFormChoiceState } from './navigator-admin-form-choice.reducer'; + + +export const selectNavigatorAdminFormChoiceState = createFeatureSelector(navigatorAdminFormChoiceStateKey); + diff --git a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html new file mode 100644 index 000000000..1cad712cd --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html @@ -0,0 +1 @@ +

ha

\ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.scss b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.ts b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.ts new file mode 100644 index 000000000..56f55213d --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-navigator-admin-form-layout', + templateUrl: './navigator-admin-form-layout.component.html', + styleUrls: ['./navigator-admin-form-layout.component.scss'] +}) +export class NavigatorAdminFormLayoutComponent { +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/layout/constants/navigator-admin-form-layout.constants.ts b/src/app/features/navigator/admin/form/modules/layout/constants/navigator-admin-form-layout.constants.ts new file mode 100644 index 000000000..ebcdc47ed --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/constants/navigator-admin-form-layout.constants.ts @@ -0,0 +1 @@ +export const navigatorAdminFormLayoutStateKey = 'navigatorAdminFormLayoutState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts b/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts new file mode 100644 index 000000000..193587d9a --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts @@ -0,0 +1,48 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormLayoutComponent } from './components/navigator-admin-form-layout.component'; +import { navigatorAdminFormLayoutStateKey } from './constants/navigator-admin-form-layout.constants'; +import { NavigatorAdminFormLayoutEffects } from './state/navigator-admin-form-layout.effects'; +import { navigatorAdminFormLayoutReducer } from './state/navigator-admin-form-layout.reducer'; + +const components = [ + NavigatorAdminFormLayoutComponent, +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorAdminFormLayoutStateKey, navigatorAdminFormLayoutReducer), + EffectsModule.forFeature([NavigatorAdminFormLayoutEffects]), + + TableComponent, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorAdminFormLayoutModule { } diff --git a/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.actions.ts b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.actions.ts new file mode 100644 index 000000000..d00c1dd49 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.actions.ts @@ -0,0 +1,10 @@ +import { createActionGroup } from '@ngrx/store'; + + + +export const NavigatorAdminFormLayoutActions = createActionGroup({ + source: 'Navigator Admin Form page', + events: { + + } +}); diff --git a/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.effects.ts b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.effects.ts new file mode 100644 index 000000000..70ba833c1 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.effects.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; + + +@Injectable() +export class NavigatorAdminFormLayoutEffects { + + + + constructor( + ) { } +} diff --git a/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.reducer.ts b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.reducer.ts new file mode 100644 index 000000000..f99763514 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.reducer.ts @@ -0,0 +1,14 @@ +import { createReducer } from '@ngrx/store'; + + + +export interface NavigatorAdminFormLayoutState { + +} + +export const initialState: NavigatorAdminFormLayoutState = { +}; + +export const navigatorAdminFormLayoutReducer = createReducer( + initialState, +); diff --git a/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.selectors.ts b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.selectors.ts new file mode 100644 index 000000000..7d07c6a88 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/layout/state/navigator-admin-form-layout.selectors.ts @@ -0,0 +1,7 @@ +import { createFeatureSelector } from '@ngrx/store'; +import { navigatorAdminFormLayoutStateKey } from '../constants/navigator-admin-form-layout.constants'; +import { NavigatorAdminFormLayoutState } from './navigator-admin-form-layout.reducer'; + + +export const selectNavigatorAdminFormLayoutState = createFeatureSelector(navigatorAdminFormLayoutStateKey); + diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.html b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.scss b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts new file mode 100644 index 000000000..4dfcc52e7 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-navigator-admin-form-page', + templateUrl: './navigator-admin-form-page.component.html', + styleUrls: ['./navigator-admin-form-page.component.scss'] +}) +export class NavigatorAdminFormOverviewComponent { +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts b/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts new file mode 100644 index 000000000..bb8bd63e3 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts @@ -0,0 +1 @@ +export const navigatorAdminFormOverviewStateKey = 'navigatorAdminFormOverviewState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-page.module.ts b/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-page.module.ts new file mode 100644 index 000000000..f76026e57 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-page.module.ts @@ -0,0 +1,48 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormOverviewComponent } from './components/navigator-admin-form-page.component'; +import { navigatorAdminFormOverviewStateKey } from './constants/navigator-admin-form-overview.constants'; +import { NavigatorAdminFormOverviewEffects } from './state/navigator-admin-form-page.effects'; +import { navigatorAdminFormOverviewReducer } from './state/navigator-admin-form-page.reducer'; + +const components = [ + NavigatorAdminFormOverviewComponent, +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorAdminFormOverviewStateKey, navigatorAdminFormOverviewReducer), + EffectsModule.forFeature([NavigatorAdminFormOverviewEffects]), + + TableComponent, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorAdminFormOverviewModule { } diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts new file mode 100644 index 000000000..f33ef2afb --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts @@ -0,0 +1,8 @@ +import { createActionGroup } from '@ngrx/store'; + +export const NavigatorAdminFormOverviewActions = createActionGroup({ + source: 'Navigator Admin Form overview', + events: { + + } +}); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts new file mode 100644 index 000000000..f15a4c590 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; + + +@Injectable() +export class NavigatorAdminFormOverviewEffects { + + + + constructor( + ) { } +} diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts new file mode 100644 index 000000000..59a413364 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts @@ -0,0 +1,14 @@ +import { createReducer } from '@ngrx/store'; + + + +export interface NavigatorAdminFormOverviewState { + +} + +export const initialState: NavigatorAdminFormOverviewState = { +}; + +export const navigatorAdminFormOverviewReducer = createReducer( + initialState, +); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.selectors.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.selectors.ts new file mode 100644 index 000000000..4c8e9bc07 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.selectors.ts @@ -0,0 +1,7 @@ +import { createFeatureSelector } from '@ngrx/store'; +import { navigatorAdminFormOverviewStateKey } from '../constants/navigator-admin-form-overview.constants'; +import { NavigatorAdminFormOverviewState } from './navigator-admin-form-page.reducer'; + + +export const selectNavigatorAdminFormOverviewState = createFeatureSelector(navigatorAdminFormOverviewStateKey); + diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts new file mode 100644 index 000000000..af5a5fd70 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-navigator-admin-form-page', + templateUrl: './navigator-admin-form-page.component.html', + styleUrls: ['./navigator-admin-form-page.component.scss'] +}) +export class NavigatorAdminFormPageComponent { +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts b/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts new file mode 100644 index 000000000..5564a3100 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts @@ -0,0 +1 @@ +export const navigatorAdminFormPageStateKey = 'navigatorAdminFormPageState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts b/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts new file mode 100644 index 000000000..ceba788a1 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts @@ -0,0 +1,48 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormPageComponent } from './components/navigator-admin-form-page.component'; +import { navigatorAdminFormPageStateKey } from './constants/navigator-admin-form-page.constants'; +import { NavigatorAdminFormPageEffects } from './state/navigator-admin-form-page.effects'; +import { navigatorAdminFormPageReducer } from './state/navigator-admin-form-page.reducer'; + +const components = [ + NavigatorAdminFormPageComponent, +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorAdminFormPageStateKey, navigatorAdminFormPageReducer), + EffectsModule.forFeature([NavigatorAdminFormPageEffects]), + + TableComponent, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorAdminFormPageModule { } diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts new file mode 100644 index 000000000..cc7c2b3b4 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts @@ -0,0 +1,10 @@ +import { createActionGroup } from '@ngrx/store'; + + + +export const NavigatorAdminFormPageActions = createActionGroup({ + source: 'Navigator Admin Form page', + events: { + + } +}); diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts new file mode 100644 index 000000000..1ec0068b6 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; + + +@Injectable() +export class NavigatorAdminFormPageEffects { + + + + constructor( + ) { } +} diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts new file mode 100644 index 000000000..e05d40d97 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts @@ -0,0 +1,14 @@ +import { createReducer } from '@ngrx/store'; + + + +export interface NavigatorAdminFormPageState { + +} + +export const initialState: NavigatorAdminFormPageState = { +}; + +export const navigatorAdminFormPageReducer = createReducer( + initialState, +); diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts new file mode 100644 index 000000000..6af580d43 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts @@ -0,0 +1,7 @@ +import { createFeatureSelector } from '@ngrx/store'; +import { navigatorAdminFormPageStateKey } from '../constants/navigator-admin-form-page.constants'; +import { NavigatorAdminFormPageState } from './navigator-admin-form-page.reducer'; + + +export const selectNavigatorAdminFormPageState = createFeatureSelector(navigatorAdminFormPageStateKey); + diff --git a/src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts b/src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts deleted file mode 100644 index eb55ce7f8..000000000 --- a/src/app/features/navigator/admin/form/navigation-admin-form-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { DealAdminFormComponent } from './component/navigation-admin-form.component'; - -const routes: Routes = [ - { - path: '', - component: DealAdminFormComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class DealAdminFormRoutingModule { } diff --git a/src/app/features/navigator/admin/form/navigation-admin-form.module.ts b/src/app/features/navigator/admin/form/navigation-admin-form.module.ts deleted file mode 100644 index 20a7f2d74..000000000 --- a/src/app/features/navigator/admin/form/navigation-admin-form.module.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreModule } from '@ngrx/store'; -import { RichtextEditorFormComponent } from 'ngx-cinlib/forms/richtext'; -import { FormStepComponent, FormStepperComponent } from 'ngx-cinlib/forms/stepper'; -import { I18nDirective, TranslatablePipe } from 'ngx-cinlib/i18n'; -import { GridColumnDirective, GridRowComponent } from 'ngx-cinlib/layouts/grid-layout'; -import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; -import { MediaFormComponent } from 'ngx-cinlib/media/forms'; -import { CoreModule } from 'src/app/core/core.module'; -import { NavigationAdminRoutingModule } from '../navigation-admin-routing.module'; -import { NavigationAdminFormComponent } from './component/navigation-admin-form.component'; -import { dealAdminFormStateKey } from './constants/navigation-admin-form.constants'; -import { DealAdminFormEffects } from './state/navigation-portal-form.effects'; -import { dealAdminFormReducer } from './state/navigation-portal-form.reducer'; - -const components = [ - NavigationAdminFormComponent -] - -const framework = [ - CommonModule, -]; - -const materials = [ - MatButtonModule, - MatFormFieldModule, - MatInputModule, - MatSlideToggleModule, - MatSelectModule, - FormsModule, - MatRadioModule, - ReactiveFormsModule, -]; - -const modules = [ - CoreModule, - NavigationAdminRoutingModule, -]; - -const libs = [ - StoreModule.forFeature(dealAdminFormStateKey, dealAdminFormReducer), - EffectsModule.forFeature([DealAdminFormEffects]), - - FormStepComponent, - FormStepperComponent, - GridColumnDirective, - GridRowComponent, - I18nDirective, - MediaFormComponent, - PageTitleComponent, - RichtextEditorFormComponent, - TranslatablePipe, -]; - -@NgModule({ - declarations: [...components], - imports: [ - ...framework, - ...libs, - ...materials, - ...modules, - ], - exports: [...components], -}) -export class DealAdminFormModule { } diff --git a/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts b/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts new file mode 100644 index 000000000..f77b588f8 --- /dev/null +++ b/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { NavigatorAdminFormLayoutComponent } from './modules/layout/components/navigator-admin-form-layout.component'; + +const routes: Routes = [ + { + path: '', + loadChildren: () => import('./modules/layout/navigator-admin-form-layout.module') + .then((imported) => imported.NavigatorAdminFormLayoutModule), + component: NavigatorAdminFormLayoutComponent + }, + // { + // path: visitorsRoute, + // loadChildren: () => import('./modules/visitors/event-admin-details-visitors.module') + // .then((imported) => imported.NavigatorAdminDetailsVisitorsModule), + // component: NavigatorAdminDetailsVisitorsComponent + // }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class NavigatorAdminFormRoutingModule { } + diff --git a/src/app/features/navigator/admin/form/navigator-admin-form.module.ts b/src/app/features/navigator/admin/form/navigator-admin-form.module.ts new file mode 100644 index 000000000..d571219a6 --- /dev/null +++ b/src/app/features/navigator/admin/form/navigator-admin-form.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { NavigatorAdminFormLayoutModule } from './modules/layout/navigator-admin-form-layout.module'; +import { NavigatorAdminFormRoutingModule } from './navigator-admin-form-routing.module'; + +const modules = [ + NavigatorAdminFormLayoutModule, + NavigatorAdminFormRoutingModule, +]; + +@NgModule({ + imports: [ + ...modules, + ], + exports: [], +}) +export class NavigatorAdminFormModule { } diff --git a/src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts b/src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts deleted file mode 100644 index 31251fb4a..000000000 --- a/src/app/features/navigator/admin/form/state/navigation-admin-form.actions.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createActionGroup, emptyProps } from '@ngrx/store'; -import { DealCategoryEntity, DealEntity, DealEntityInput, Maybe } from 'src/app/core/api/generated/schema'; - -export const DealAdminFormActions = createActionGroup({ - source: 'Deal Admin Form', - events: { - - 'get deal': (slug: Maybe) => ({ slug }), - 'set deal': (deal: Maybe) => ({ deal }), - - 'get categories': emptyProps(), - 'set categories': (categories: Maybe) => ({ categories }), - - 'cancelled': emptyProps(), - - 'save': (deal: DealEntityInput) => ({ deal }), - 'saved': emptyProps(), - - } -}); diff --git a/src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts b/src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts deleted file mode 100644 index 14ad840ed..000000000 --- a/src/app/features/navigator/admin/form/state/navigation-portal-form.effects.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Actions, createEffect, ofType } from '@ngrx/effects'; -import { FeedbackType } from 'ngx-cinlib/modals/feedback'; -import { map, switchMap, tap } from 'rxjs'; -import { DealCategoryEntity, DealEntity } from 'src/app/core/api/generated/schema'; -import { dealsFeatureKey } from 'src/app/core/constants/feature.constants'; -import { adminUrl } from 'src/app/core/constants/module.constants'; -import { CoreActions } from 'src/app/core/state/actions/core.actions'; -import { GetDealCategoriesGQL } from '../../../api/generated/get-deal-categories.query.generated'; -import { GetDealGQL } from '../../../api/generated/get-deal.query.generated'; - -import { SaveDealGQL } from '../../../api/generated/save-deal.mutation.generated'; -import { DealAdminFormActions } from './navigation-admin-form.actions'; - -@Injectable() -export class DealAdminFormEffects { - - getDeal = createEffect(() => this.actions.pipe( - ofType(DealAdminFormActions.getDeal), - switchMap(action => this.getDealService.watch({ - entity: { slug: action.slug } - }).valueChanges), - map(response => DealAdminFormActions.setDeal(response.data.getDeal as DealEntity)) - )); - - getCategories = createEffect(() => this.actions.pipe( - ofType(DealAdminFormActions.getCategories), - switchMap(() => this.getDealCategoriesService.watch().valueChanges), - map(response => DealAdminFormActions.setCategories(response.data.getDealCategories?.result as DealCategoryEntity[])) - )); - - cancelled = createEffect(() => this.actions.pipe( - ofType(DealAdminFormActions.cancelled), - tap(() => this.router.navigate([adminUrl, dealsFeatureKey])), - ), { dispatch: false }); - -save = createEffect(() => this.actions.pipe( - ofType(DealAdminFormActions.save), - switchMap(action => this.saveDealService.mutate({ - entity: action.deal - })), - map(() => DealAdminFormActions.saved()) -)); - - - saved = createEffect(() => this.actions.pipe( - ofType(DealAdminFormActions.saved), - tap(() => this.router.navigate([adminUrl, dealsFeatureKey])), - map(() => CoreActions.setFeedback({ - type: FeedbackType.Success, - labelMessage: 'savedSuccessfully' - })) - )); - - constructor( - private actions: Actions, - private getDealService: GetDealGQL, - private getDealCategoriesService: GetDealCategoriesGQL, - private router: Router, - private saveDealService: SaveDealGQL - ) {} -} diff --git a/src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts b/src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts deleted file mode 100644 index dc17d2269..000000000 --- a/src/app/features/navigator/admin/form/state/navigation-portal-form.reducer.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { createReducer, on } from '@ngrx/store'; -import { DealCategoryEntity, DealEntity, Maybe } from 'src/app/core/api/generated/schema'; -import { DealAdminFormActions } from './navigation-admin-form.actions'; - -export interface DealAdminFormState { - event?: Maybe, - categories?: Maybe, -} - -export const initialState: DealAdminFormState = { }; - -export const dealAdminFormReducer = createReducer( - initialState, - - on(DealAdminFormActions.setDeal, (state, action): DealAdminFormState => ( - { ...state, event: action.deal } - )), - - on(DealAdminFormActions.setCategories, (state, action): DealAdminFormState => ( - { ...state, categories: action.categories } - )), - -); diff --git a/src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts b/src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts deleted file mode 100644 index 7965c2120..000000000 --- a/src/app/features/navigator/admin/form/state/navigation-portal-form.selectors.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { dealAdminFormStateKey } from '../constants/navigation-admin-form.constants'; -import { DealAdminFormState } from './navigation-portal-form.reducer'; - -export const selectDealAdminFormState = createFeatureSelector(dealAdminFormStateKey); - -export const selectDeal = createSelector( - selectDealAdminFormState, - state => state.event -); - -export const selectCategories = createSelector( - selectDealAdminFormState, - state => state.categories -); \ No newline at end of file diff --git a/src/app/features/navigator/admin/navigation-admin-routing.module.ts b/src/app/features/navigator/admin/navigation-admin-routing.module.ts deleted file mode 100644 index 34cc48b70..000000000 --- a/src/app/features/navigator/admin/navigation-admin-routing.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { AdminActions } from 'src/app/admin/state/admin.actions'; -import { AdminFeatureRoute } from 'src/app/admin/typings/menu'; -import { dealsFeatureKey } from 'src/app/core/constants/feature.constants'; -import { slug } from 'src/app/core/constants/queryparam.constants'; -import { requireAnyPrivilege } from 'src/app/core/utils/privilege.utils'; - -const menuRoutes: AdminFeatureRoute[] = [ - // { - // path: `${dealsFeatureKey}/dashboard`, - // loadChildren: () => import('src/app/features/deal/portal/details/portal-deal-details.module') - // .then((imported) => imported.PortalDealDetailsModule), - // data: { label: 'dashboard' }, - // }, - { - path: `${dealsFeatureKey}`, - loadChildren: () => import('src/app/features/deal/admin/overview/deal-admin-overview.module') - .then((imported) => imported.DealAdminOverviewModule), - data: { - label: 'overview', - privileges: ['deals_admin', 'deals_manage'] - }, - canActivate: [requireAnyPrivilege('deals_admin', 'deals_manage')] - }, -]; - -const routes: Routes = [ - { - path: `${dealsFeatureKey}/form`, - loadChildren: () => import('src/app/features/deal/admin/form/deal-admin-form.module') - .then((imported) => imported.DealAdminFormModule), - canActivate: [requireAnyPrivilege('deals_admin', 'deals_manage')] - }, - { - path: `${dealsFeatureKey}/:${slug}/form`, - loadChildren: () => import('src/app/features/deal/admin/form/deal-admin-form.module') - .then((imported) => imported.DealAdminFormModule), - }, -] - -@NgModule({ - imports: [RouterModule.forChild([ - ...menuRoutes, - ...routes, - ])], - exports: [RouterModule] -}) -export class NavigationAdminRoutingModule { - - constructor( - public store: Store - ) { - this.store.dispatch(AdminActions.addMainRoutes({ - code: dealsFeatureKey, - routes: menuRoutes, - })); - } -} diff --git a/src/app/features/navigator/admin/navigator-admin-routing.module.ts b/src/app/features/navigator/admin/navigator-admin-routing.module.ts new file mode 100644 index 000000000..81e05389d --- /dev/null +++ b/src/app/features/navigator/admin/navigator-admin-routing.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { AdminActions } from 'src/app/admin/state/admin.actions'; +import { AdminFeatureRoute } from 'src/app/admin/typings/menu'; +import { navigatorFeatureKey } from 'src/app/core/constants/feature.constants'; +import { requireAnyPrivilege } from 'src/app/core/utils/privilege.utils'; + +const menuRoutes: AdminFeatureRoute[] = [ + { + path: navigatorFeatureKey, + loadChildren: () => import('src/app/features/navigator/admin/form/navigator-admin-form.module') + .then((imported) => imported.NavigatorAdminFormModule), + data: { + label: 'create/edit', + privileges: ['navigator_admin'], + }, + canActivate: [requireAnyPrivilege('navigator_admin')] + }, +]; + +const routes: Routes = [ +] + +@NgModule({ + imports: [RouterModule.forChild([ + ...menuRoutes, + ...routes, + ])], + exports: [RouterModule] +}) +export class NavigatorAdminRoutingModule { + + constructor( + public store: Store + ) { + this.store.dispatch(AdminActions.addMainRoutes({ + code: navigatorFeatureKey, + routes: menuRoutes, + })); + } +} diff --git a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html deleted file mode 100644 index c5c4c12e2..000000000 --- a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - diff --git a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss deleted file mode 100644 index 7e653640e..000000000 --- a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -:host { - display: flex; - flex-flow: column; - gap: 1rem; -} \ No newline at end of file diff --git a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts b/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts deleted file mode 100644 index 5ae8754d7..000000000 --- a/src/app/features/navigator/admin/overview/component/deal-admin-overview.component.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { TranslationService } from 'ngx-cinlib/i18n'; -import { Column, RowAction } from 'ngx-cinlib/tables'; -import { DealEntity, FilterSortPaginateInput, Maybe } from 'src/app/core/api/generated/schema'; -import { shareAction } from 'src/app/core/utils/table.utils'; -import { DealAdminOverviewActions } from '../state/deal-admin-overview.actions'; -import { selectOverviewData } from '../state/deal-portal-overview.selectors'; - -@Component({ - selector: 'app-deal-admin-overview', - templateUrl: './deal-admin-overview.component.html', - styleUrls: ['./deal-admin-overview.component.scss'] -}) -export class DealAdminOverviewComponent { - - public deals = this.store.select(selectOverviewData); - - public actions: RowAction[] = [ - { - icon: 'pen-to-square', - callback: row => - this.router.navigate([row?.slug, 'form'], { relativeTo: this.activatedRoute }), - tooltipLabel: 'edit' - }, - { - icon: 'bullhorn', - callback: row => - this.store.dispatch(DealAdminOverviewActions.sponsorDeal(row)), - tooltipLabel: 'highlightInPortal', - privileges: ['deals_admin'] - }, - { - icon: 'trash', - callback: deal => - this.store.dispatch(DealAdminOverviewActions.deleteDeal(deal)), - tooltipLabel: 'delete' - }, - - shareAction('DealEntity'), - ]; - - public columns: Column[] = [ - { - field: 'translatables.name', - label: 'deals', - value: row => this.translationService.translatable(row.translatables, 'name') - }, - { - field: 'creator.user.email', - label: 'creator', - }, - { - field: 'category', - label: 'category', - type: 'CATEGORY', - }, - { - field: 'modified', - label: 'lastModified', - type: 'DATETIME', - sort: true, - }, - { - field: 'sponsored', - label: 'sponsored', - type: 'BOOLEAN', - sort: true, - }, - ]; - - constructor( - private activatedRoute: ActivatedRoute, - private router: Router, - private store: Store, - private translationService: TranslationService - ) { } - - public updateParams(params: FilterSortPaginateInput) { - this.store.dispatch(DealAdminOverviewActions.updateParams(params)); - } - - public rowClicked(deal: Maybe): void { - this.router.navigate([deal?.slug], { relativeTo: this.activatedRoute }) - } -} diff --git a/src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts b/src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts deleted file mode 100644 index 7a335fbc5..000000000 --- a/src/app/features/navigator/admin/overview/constants/deal-admin-overview.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const dealAdminOverviewStateKey = 'dealAdminOverviewState'; diff --git a/src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts b/src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts deleted file mode 100644 index 8868e6881..000000000 --- a/src/app/features/navigator/admin/overview/deal-admin-overview-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { DealAdminOverviewComponent } from './component/deal-admin-overview.component'; - -const routes: Routes = [ - { - path: '', - component: DealAdminOverviewComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class DealAdminOverviewRoutingModule { } diff --git a/src/app/features/navigator/admin/overview/deal-admin-overview.module.ts b/src/app/features/navigator/admin/overview/deal-admin-overview.module.ts deleted file mode 100644 index b86cfb719..000000000 --- a/src/app/features/navigator/admin/overview/deal-admin-overview.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreModule } from '@ngrx/store'; -import { I18nDirective } from 'ngx-cinlib/i18n'; -import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; -import { TableComponent } from 'ngx-cinlib/tables'; -import { CoreModule } from 'src/app/core/core.module'; -import { DealFilterModule } from 'src/app/shared/filter/deal/deal-filter.module'; -import { DealAdminOverviewComponent } from './component/deal-admin-overview.component'; -import { dealAdminOverviewStateKey } from './constants/deal-admin-overview.constants'; -import { DealAdminOverviewRoutingModule } from './deal-admin-overview-routing.module'; -import { DealAdminOverviewEffects } from './state/deal-portal-overview.effects'; -import { dealAdminOverviewReducer } from './state/deal-portal-overview.reducer'; - -const components = [ - DealAdminOverviewComponent -] - -const framework = [ - CommonModule, -]; - -const materials = [ - MatButtonModule, - MatCardModule, -]; - -const modules = [ - CoreModule, - DealFilterModule, - DealAdminOverviewRoutingModule, -]; - -const libs = [ - StoreModule.forFeature(dealAdminOverviewStateKey, dealAdminOverviewReducer), - EffectsModule.forFeature([DealAdminOverviewEffects]), - - I18nDirective, - PageTitleComponent, - TableComponent -]; - -@NgModule({ - declarations: [...components], - imports: [ - ...framework, - ...libs, - ...materials, - ...modules, - ], - exports: [...components], -}) -export class DealAdminOverviewModule { } diff --git a/src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts b/src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts deleted file mode 100644 index 98f38ccc1..000000000 --- a/src/app/features/navigator/admin/overview/state/deal-admin-overview.actions.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createActionGroup, emptyProps } from '@ngrx/store'; -import { DealEntity, FilterSortPaginateInput, Maybe, PageableList_DealEntity } from 'src/app/core/api/generated/schema'; - -export const DealAdminOverviewActions = createActionGroup({ - source: 'Deal Admin Overview', - events: { - - 'set overview data': (deals: PageableList_DealEntity) => ({ deals }), - - 'update params': (params: FilterSortPaginateInput) => ({ params }), - - 'delete deal': (deal?: Maybe) => ({ deal }), - 'deal deleted': emptyProps(), - - 'sponsor deal': (deal?: Maybe) => ({ deal }), - 'deal sponsored': emptyProps(), - } -}); diff --git a/src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts b/src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts deleted file mode 100644 index ab131aac6..000000000 --- a/src/app/features/navigator/admin/overview/state/deal-portal-overview.effects.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Actions, createEffect, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { ConfirmService, ConfirmType } from 'ngx-cinlib/modals/confirm'; -import { FeedbackType } from 'ngx-cinlib/modals/feedback'; -import { AuthService } from 'ngx-cinlib/security'; -import { EMPTY, map, of, switchMap, withLatestFrom } from 'rxjs'; -import { PageableList_DealEntity, QueryOperator } from 'src/app/core/api/generated/schema'; -import { CoreActions } from 'src/app/core/state/actions/core.actions'; -import { selectCurrentUser } from 'src/app/core/state/selectors/user.selectors'; -import { Privilege } from 'src/app/core/typings/privilege'; -import { DeleteDealGQL } from '../../../api/generated/delete-deal.mutation.generated'; -import { GetDealsGQL } from '../../../api/generated/get-deals.query.generated'; -import { SponsorDealGQL } from '../../../api/generated/sponsor-deal.mutation.generated'; -import { DealAdminOverviewActions } from './deal-admin-overview.actions'; -import { selectParams } from './deal-portal-overview.selectors'; - -@Injectable() -export class DealAdminOverviewEffects { - - updateParams = createEffect(() => this.actions.pipe( - ofType( - DealAdminOverviewActions.updateParams, - DealAdminOverviewActions.dealDeleted, - DealAdminOverviewActions.dealSponsored - ), - withLatestFrom( - this.store.select(selectParams), - this.store.select(selectCurrentUser), - ), - map(([, params, user]) => this.authService.hasAnyPrivileges(['deals_admin']) - ? params - : { - ...params, - expression: { - conjunction: { - operands: [ - { - entity: { - path: 'creator.id', - operator: QueryOperator.Equal, - value: user?.id as string - } - } - ] - } - } - }), - switchMap(params => this.getDealsService.watch({ params }).valueChanges), - map(response => DealAdminOverviewActions.setOverviewData(response.data.getDeals as PageableList_DealEntity)) - )); - - sponsorDeal = createEffect(() => this.actions.pipe( - ofType(DealAdminOverviewActions.sponsorDeal), - switchMap(action => this.confirmService - .confirm({ type: ConfirmType.Delete, context: 'thisWillSponsor' }).pipe( - switchMap(confirmed => confirmed - ? of(action.deal) - : EMPTY - ) - ) - ), - switchMap(deal => this.sponsorDealService.mutate({ - dealId: deal?.id, - })), - map(() => DealAdminOverviewActions.dealSponsored()) - )); - - dealSponsored = createEffect(() => this.actions.pipe( - ofType(DealAdminOverviewActions.dealSponsored), - map(() => CoreActions.setFeedback({ - type: FeedbackType.Success, - labelMessage: 'changedSuccessfully' - })) - )); - - deleteDeal = createEffect(() => this.actions.pipe( - ofType(DealAdminOverviewActions.deleteDeal), - switchMap(action => this.confirmService - .confirm({ type: ConfirmType.Delete, context: action.deal?.name }).pipe( - switchMap(confirmed => confirmed - ? of(action.deal) - : EMPTY - ) - ) - ), - switchMap(deal => this.deleteDealService.mutate({ - id: deal?.id - })), - map(() => DealAdminOverviewActions.dealDeleted()) - )); - - dealDeleted = createEffect(() => this.actions.pipe( - ofType(DealAdminOverviewActions.dealDeleted), - map(() => CoreActions.setFeedback({ - type: FeedbackType.Success, - labelMessage: 'deletedSuccessfully' - })) - )); - - constructor( - private actions: Actions, - private authService: AuthService, - private confirmService: ConfirmService, - private deleteDealService: DeleteDealGQL, - private getDealsService: GetDealsGQL, - private sponsorDealService: SponsorDealGQL, - private store: Store, - ) {} -} diff --git a/src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts b/src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts deleted file mode 100644 index a170a3c02..000000000 --- a/src/app/features/navigator/admin/overview/state/deal-portal-overview.reducer.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createReducer, on } from '@ngrx/store'; -import { FilterSortPaginateInput, PageableList_DealEntity } from 'src/app/core/api/generated/schema'; -import { DealAdminOverviewActions } from './deal-admin-overview.actions'; - -export interface DealAdminOverviewState { - overviewData?: PageableList_DealEntity, - params: FilterSortPaginateInput -} - -export const initialState: DealAdminOverviewState = { - params: {} -}; - -export const dealAdminOverviewReducer = createReducer( - initialState, - - on(DealAdminOverviewActions.updateParams, (state, action): DealAdminOverviewState => ( - { ...state, params: Object.assign({ ...state.params } || {}, action.params) } - )), - - on(DealAdminOverviewActions.setOverviewData, (state, action): DealAdminOverviewState => ( - { ...state, overviewData: action.deals } - )), -); diff --git a/src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts b/src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts deleted file mode 100644 index 521ca7401..000000000 --- a/src/app/features/navigator/admin/overview/state/deal-portal-overview.selectors.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { dealAdminOverviewStateKey } from '../constants/deal-admin-overview.constants'; -import { DealAdminOverviewState } from './deal-portal-overview.reducer'; - -export const selectDealAdminOverviewState = createFeatureSelector(dealAdminOverviewStateKey); - -export const selectOverviewData = createSelector( - selectDealAdminOverviewState, - state => state.overviewData -); - -export const selectParams = createSelector( - selectDealAdminOverviewState, - state => state.params -); diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html index 5b9271965..22c7e76a0 100644 --- a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.html @@ -1,3 +1,15 @@ - - +
+ hero-section +
+
+ +

+ + + +
+
+
\ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss index 13008bfa6..1d9eb1072 100644 --- a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.scss @@ -1,19 +1,51 @@ -// a { -// padding: 1.75rem; -// width: fit-content; -// color: var(--color-primary-contrast-900); -// background-image: linear-gradient(45deg, -// var(--color-primary-900), -// var(--color-primary-700), -// var(--color-primary-500), -// var(--color-accent-500), -// var(--color-accent-700), -// var(--color-accent-900)); -// background-size: 300%; -// background-position: left; -// transition: background-position .5s; -// } - -// a:hover { -// background-position: right; -// } +@import 'ngx-cinlib/styles/mobile-mixins.scss'; + +header { + display: flex; + justify-content: center; + min-height: 80vh; + gap: 5rem; + flex-flow: row-reverse; + + img { + max-width: 40%; + @include responsive(phone) { + display: none; + } + } + + cin-page-title{ + width: min-content; + } + + section { + display: flex; + align-self: center; + justify-content: center; + + div { + display: flex; + flex-direction: column; + gap: var(--gap); + } + + app-gradient-button { + width: fit-content; + } + + p { + color: var(--color-dark-gray); + font-size: 1.25rem; + font-weight: 500; + line-height: 1.5; + max-width: 35vw; + overflow-wrap: break-word; + hyphens: auto; + -webkit-hyphens: auto; + + @include responsive(phone) { + max-width: 90vw; + } + } + } +} diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts index 2e6b6cfb4..3ec1fbad3 100644 --- a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.component.ts @@ -6,6 +6,4 @@ import { Component } from '@angular/core'; styleUrls: ['./navigator-portal-details-landing.component.scss'] }) export class NavigatorPortalDetailsLandingComponent { - - } \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts index 16e9040d5..ee6ff45dc 100644 --- a/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts +++ b/src/app/features/navigator/portal/details/modules/landing/navigator-portal-details-landing.module.ts @@ -6,8 +6,9 @@ import { RouterModule } from '@angular/router'; import { RadioCardGroupComponent } from 'ngx-cinlib/forms/radio-card'; import { I18nDirective, TranslatablePipe } from 'ngx-cinlib/i18n'; import { IconComponent } from 'ngx-cinlib/icons'; -import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; +import { PageTitleComponent, SubTitleComponent } from 'ngx-cinlib/layouts/title'; import { CoreModule } from 'src/app/core/core.module'; +import { GradientButtonComponent } from 'src/app/shared/widgets/gradient-button/gradient-button.component'; import { NavigatorPortalDetailsLandingComponent } from './navigator-portal-details-landing.component'; const components = [ @@ -29,9 +30,11 @@ const modules = [ ]; const libs = [ + GradientButtonComponent, IconComponent, I18nDirective, PageTitleComponent, + SubTitleComponent, RadioCardGroupComponent, TranslatablePipe, ]; diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html index 7076b9376..b8ea9c1af 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.html @@ -1,18 +1,9 @@ - -
- {{ choice | translatable : "name" | async}} - @if((choice | translatable : "description" | async) !== null){ - - } -
-
-

- {{ choice | translatable : "description" | async}} -

+ + + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss index 7dfbe8f69..bb53f5a2c 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.scss @@ -1,48 +1,4 @@ -a { +app-gradient-button { width: 100%; - display: flex; - justify-content: space-between; - height: max-content; - background-color: var(--color-primary-200) !important; - - div { - width: 100%; - display: flex; - justify-content: space-between; - align-items: center; - } -} - -button { - background-color: transparent; - cursor: pointer; - border: none; - border-radius: 5rem; - padding: .5rem; -} - -button:hover { - background-color: lightgray; } -cin-icon{ - color: unset; -} - -p { - display: flex; - width: auto; - background-color: var(--color-primary-50); - border-radius: 0 0 var(--mdc-shape-small) var(--mdc-shape-small); - box-shadow: 0px 2px 8px 0px var(--color-box-shadow); -} - -:host ::ng-deep { - .mdc-button__label { - width: 100%; - margin: .75rem; - :first-child{ - text-align: start; - } - } -} diff --git a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts index 12e2e1e13..474e939bb 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts +++ b/src/app/features/navigator/portal/details/modules/layout/components/choice/navigator-portal-details-layout-choice.component.ts @@ -1,4 +1,3 @@ -import { animate, state, style, transition, trigger } from '@angular/animations'; import { Component, Input } from '@angular/core'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; @@ -15,20 +14,6 @@ import { selectNavigatorStateInputs } from '../../state/navigator-portal-details selector: 'app-navigator-portal-details-layout-choice', templateUrl: './navigator-portal-details-layout-choice.component.html', styleUrls: ['./navigator-portal-details-layout-choice.component.scss'], - animations: [ - trigger('collapse', [ - state('false', style({ - height: '0', - padding: '0', - overflow: 'hidden' - })), - state('true', style({ - height: '*', - padding: '2rem' - })), - transition('true <=> false', animate('300ms ease')) - ]) - ] }) export class NavigatorPortalDetailsLayoutChoiceComponent { @@ -54,7 +39,7 @@ export class NavigatorPortalDetailsLayoutChoiceComponent { this.inputs = [...this.inputs, { display: (this.inputs.length + 1).toString(), - label: choiceName!, + label: choiceName ?? '', value: choice?.nextPage?.slug, }]; diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html index 8affeddd7..1bd020e9f 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.html @@ -1,10 +1,10 @@ - - + + diff --git a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss index 464223d47..fb1d5aede 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss +++ b/src/app/features/navigator/portal/details/modules/layout/components/navigator-portal-details-layout.component.scss @@ -1,24 +1,22 @@ :host { display: flex; flex-direction: column; - gap: 3rem; + gap: 1rem; align-items: center; - justify-content: center; - overflow-x: hidden; - // margin: var(--gap) auto; + margin: var(--gap) auto; } -.container { - // width: 60rem; - // max-width: calc(100% - var(--gap)); +cin-radio-card-group { + max-width: calc(100% - var(--gap)); + margin: var(--gap) auto; } -cin-radio-card-group{ - margin: 0 auto; - overflow-x: scroll; +::ng-deep cin-radio-card-group cin-radio-card { + margin: auto; } -app-navigator-portal-details-layout-page{ + +app-navigator-portal-details-layout-page { width: 40rem; max-width: calc(100% - var(--gap)); } \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html index 62f00b78c..1ea1b0dd0 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html +++ b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html @@ -13,9 +13,11 @@ @if (page?.links){ @for (link of page?.links; track link) { - - {{ link | translatable : 'name' | async}} - + + } } diff --git a/src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts b/src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts index f7890ecef..9f3bee351 100644 --- a/src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts +++ b/src/app/features/navigator/portal/details/modules/layout/navigator-portal-details-layout.module.ts @@ -11,6 +11,7 @@ import { I18nDirective, TranslatablePipe } from 'ngx-cinlib/i18n'; import { IconComponent } from 'ngx-cinlib/icons'; import { DetailsTitleComponent } from 'ngx-cinlib/layouts/title'; import { CoreModule } from 'src/app/core/core.module'; +import { GradientButtonComponent } from 'src/app/shared/widgets/gradient-button/gradient-button.component'; import { NavigatorPortalDetailsLayoutChoiceComponent } from './components/choice/navigator-portal-details-layout-choice.component'; import { NavigatorPortalDetailsLayoutComponent } from './components/navigator-portal-details-layout.component'; import { NavigatorPortalDetailsLayoutPageComponent } from './components/page/navigator-portal-details-layout-page.component'; @@ -43,6 +44,7 @@ const libs = [ StoreModule.forFeature(navigatorPortalDetailsLayoutStateKey, navigatorAdminDetailsLayoutReducer), EffectsModule.forFeature([NavigatorPortalDetailsLayoutEffects]), + GradientButtonComponent, IconComponent, I18nDirective, DetailsTitleComponent, diff --git a/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.html b/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.html index 6fe6a2989..93cfea9f0 100644 --- a/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.html +++ b/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.html @@ -11,12 +11,12 @@

@if (element?.url) { - - + + } diff --git a/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.scss b/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.scss index beb42e42b..2a28935b1 100644 --- a/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.scss +++ b/src/app/portal/modules/embedding/components/hero/portal-page-embedding-hero.component.scss @@ -42,24 +42,8 @@ header { gap: var(--gap); } - a { - padding: 1.75rem; + app-gradient-button { width: fit-content; - color: var(--color-primary-contrast-900); - background-image: linear-gradient(45deg, - var(--color-primary-900), - var(--color-primary-700), - var(--color-primary-500), - var(--color-accent-500), - var(--color-accent-700), - var(--color-accent-900)); - background-size: 300%; - background-position: left; - transition: background-position .5s; - } - - a:hover { - background-position: right; } p { diff --git a/src/app/portal/modules/embedding/portal-page-embedding.module.ts b/src/app/portal/modules/embedding/portal-page-embedding.module.ts index 4c5f10fe1..3606bbdf6 100644 --- a/src/app/portal/modules/embedding/portal-page-embedding.module.ts +++ b/src/app/portal/modules/embedding/portal-page-embedding.module.ts @@ -18,6 +18,7 @@ import { MediaEmbeddingModule } from 'src/app/features/media/embedding/media-emb import { OrganisationEmbeddingModule } from 'src/app/features/organisation/embedding/organisation-embedding.module'; import { ReportEmbeddingModule } from 'src/app/features/report/embedding/report-embedding.module'; import { SurveyEmbeddingModule } from 'src/app/features/survey/embedding/survey-embedding.module'; +import { GradientButtonComponent } from 'src/app/shared/widgets/gradient-button/gradient-button.component'; import { PortalPageEmbeddingBannerComponent } from './components/banner/portal-page-embedding-banner.component'; import { PortalPageEmbeddingBoxComponent } from './components/box/portal-page-embedding-box.component'; import { PortalPageEmbeddingExpansionComponent } from './components/expansion/portal-page-embedding-expansion.component'; @@ -44,6 +45,7 @@ const framework = [ ]; const libs = [ + GradientButtonComponent, I18nDirective, MediaElementComponent, MediaSliderComponent, diff --git a/src/app/shared/widgets/gradient-button/gradient-button.component.html b/src/app/shared/widgets/gradient-button/gradient-button.component.html new file mode 100644 index 000000000..87c57995d --- /dev/null +++ b/src/app/shared/widgets/gradient-button/gradient-button.component.html @@ -0,0 +1,32 @@ +@if (url) { + + {{ name }} + @if(description){ + + } + @if(icon) { } + +
+

{{ description }}

+
+} + +@if (!url) { + + {{ name }} + @if(description){ + + } + @if(icon) { } + + +
+

{{ description }}

+
+} diff --git a/src/app/shared/widgets/gradient-button/gradient-button.component.scss b/src/app/shared/widgets/gradient-button/gradient-button.component.scss new file mode 100644 index 000000000..ee0afeff8 --- /dev/null +++ b/src/app/shared/widgets/gradient-button/gradient-button.component.scss @@ -0,0 +1,56 @@ +a { + display: flex; + justify-content: space-between; + width: 100%; + padding: 1.75rem; + color: var(--color-primary-contrast-900); + background-image: linear-gradient(45deg, + var(--color-primary-900), + var(--color-primary-700), + var(--color-primary-500), + var(--color-accent-500), + var(--color-accent-700), + var(--color-accent-900)); + background-size: 300%; + background-position: left; + transition: background-position .5s; +} + +a:hover { + background-position: right; +} + +button { + background-color: transparent; + cursor: pointer; + border: none; + border-radius: 5rem; + padding: .75rem; +} + +button:hover { + background-color: var(--color-primary-500); +} + +cin-icon{ + color: unset; +} + +:host ::ng-deep { + .mdc-button__label { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + gap: .5rem; + } +} + +p { + padding: 1rem; + display: flex; + width: auto; + background-color: var(--color-primary-50); + border-radius: 0 0 var(--mdc-shape-small) var(--mdc-shape-small); + box-shadow: 0px 2px 8px 0px var(--color-box-shadow); +} \ No newline at end of file diff --git a/src/app/shared/widgets/gradient-button/gradient-button.component.ts b/src/app/shared/widgets/gradient-button/gradient-button.component.ts new file mode 100644 index 000000000..1c8cea88c --- /dev/null +++ b/src/app/shared/widgets/gradient-button/gradient-button.component.ts @@ -0,0 +1,43 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { Maybe, collapse } from 'ngx-cinlib/core'; +import { I18nDirective } from 'ngx-cinlib/i18n'; +import { IconComponent, RegularIcon, SolidIcon } from 'ngx-cinlib/icons'; +import { CoreModule } from 'src/app/core/core.module'; +@Component({ + selector: 'app-gradient-button', + templateUrl: './gradient-button.component.html', + styleUrls: ['./gradient-button.component.scss'], + standalone: true, + imports: [ + CommonModule, + CoreModule, + I18nDirective, + MatButtonModule, + IconComponent + ], + animations:[ + collapse() + ] +}) +export class GradientButtonComponent { + + @Input() + public url?: Maybe; + + @Input() + public label?: Maybe; + + @Input() + public name?: Maybe; + + @Input() + public description?: Maybe; + + @Input() + public icon?: SolidIcon | RegularIcon; + + public showDescription = false; + +} \ No newline at end of file diff --git a/src/assets/navigator-choose.svg b/src/assets/navigator-choose.svg new file mode 100644 index 000000000..aef3a8b60 --- /dev/null +++ b/src/assets/navigator-choose.svg @@ -0,0 +1 @@ + \ No newline at end of file From b9eeee99366d78a9738b86fe8667eace485ca64b Mon Sep 17 00:00:00 2001 From: DOOMED2WIN Date: Thu, 7 Mar 2024 12:24:59 +0100 Subject: [PATCH 5/7] work in progress --- ...avigator-admin-form-choice.component.html} | 0 ...navigator-admin-form-layout.component.html | 4 +- .../navigator-admin-form-layout.module.ts | 4 + ...vigator-admin-form-overview.component.html | 25 ++++++ ...vigator-admin-form-overview.component.scss | 10 +++ ...navigator-admin-form-overview.component.ts | 82 +++++++++++++++++++ .../navigator-admin-form-page.component.html | 0 .../navigator-admin-form-page.component.scss | 0 .../navigator-admin-form-page.component.ts | 9 -- ...> navigator-admin-form-overview.module.ts} | 15 +++- .../navigator-admin-form-overview.actions.ts | 13 +++ .../navigator-admin-form-overview.effects.ts | 39 +++++++++ .../navigator-admin-form-overview.reducer.ts | 22 +++++ ...avigator-admin-form-overview.selectors.ts} | 8 +- .../navigator-admin-form-page.actions.ts | 8 -- .../navigator-admin-form-page.effects.ts | 11 --- .../navigator-admin-form-page.reducer.ts | 14 ---- .../generated/get-articles.query.generated.ts | 74 +++++++++++++++++ ...-portal-details-layout-page.component.html | 3 +- .../gradient-button.component.html | 2 +- .../gradient-button.component.scss | 6 +- .../gradient-button.component.ts | 3 + 22 files changed, 298 insertions(+), 54 deletions(-) rename src/app/features/navigator/admin/form/modules/choice/components/{navigator-admin-form-page.component.html => navigator-admin-form-choice.component.html} (100%) create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts delete mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.html delete mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.scss delete mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts rename src/app/features/navigator/admin/form/modules/overview/{navigator-admin-form-page.module.ts => navigator-admin-form-overview.module.ts} (76%) create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts rename src/app/features/navigator/admin/form/modules/overview/state/{navigator-admin-form-page.selectors.ts => navigator-admin-form-overview.selectors.ts} (59%) delete mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts delete mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts delete mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts create mode 100644 src/app/features/navigator/api/generated/get-articles.query.generated.ts diff --git a/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-page.component.html b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.html similarity index 100% rename from src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-page.component.html rename to src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.html diff --git a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html index 1cad712cd..393434d2f 100644 --- a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html +++ b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html @@ -1 +1,3 @@ -

ha

\ No newline at end of file + + + diff --git a/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts b/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts index 193587d9a..8cd42e7c8 100644 --- a/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts +++ b/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts @@ -4,8 +4,10 @@ import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { EffectsModule } from '@ngrx/effects'; import { StoreModule } from '@ngrx/store'; +import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; import { TableComponent } from 'ngx-cinlib/tables'; import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormOverviewModule } from '../overview/navigator-admin-form-overview.module'; import { NavigatorAdminFormLayoutComponent } from './components/navigator-admin-form-layout.component'; import { navigatorAdminFormLayoutStateKey } from './constants/navigator-admin-form-layout.constants'; import { NavigatorAdminFormLayoutEffects } from './state/navigator-admin-form-layout.effects'; @@ -26,6 +28,7 @@ const materials = [ const modules = [ CoreModule, + NavigatorAdminFormOverviewModule, ]; const libs = [ @@ -33,6 +36,7 @@ const libs = [ EffectsModule.forFeature([NavigatorAdminFormLayoutEffects]), TableComponent, + PageTitleComponent, ]; @NgModule({ diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html new file mode 100644 index 000000000..cf396b59e --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html @@ -0,0 +1,25 @@ + + + + + {{ (node.item | translatable: 'title' | async) ?? + (node.item | translatable: 'name' | async) }} + + + + + {{ (node.item | translatable: 'title' | async) ?? + (node.item | translatable: 'name' | async) }} + + + diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss new file mode 100644 index 000000000..c7ebfde37 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss @@ -0,0 +1,10 @@ +span { + cursor: pointer; + border-radius: 5rem; + padding-left: .5rem; + padding-right: .5rem; +} + +span:hover{ + background-color: var(--color-light); +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts new file mode 100644 index 000000000..d4967a713 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts @@ -0,0 +1,82 @@ +import { FlatTreeControl } from '@angular/cdk/tree'; +import { Component, OnInit } from '@angular/core'; +import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; +import { Store } from '@ngrx/store'; +import { TranslationService } from 'ngx-cinlib/i18n'; +import { NavigatorChoiceEntity, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { NavigatorAdminFormOverviewActions } from '../state/navigator-admin-form-overview.actions'; +import { selectStartPage } from '../state/navigator-admin-form-overview.selectors'; + +interface TreeNode { + item: NavigatorPageEntity | NavigatorChoiceEntity, + children?: TreeNode[], +} + +interface FlatNode { + expandable: boolean, + item: NavigatorPageEntity | NavigatorChoiceEntity, + level: number, +} + +const TREE_DATA: TreeNode[] = []; + +@Component({ + selector: 'app-navigator-admin-form-overview', + templateUrl: './navigator-admin-form-overview.component.html', + styleUrls: ['./navigator-admin-form-overview.component.scss'] +}) +export class NavigatorAdminFormOverviewComponent implements OnInit { + +getNextPage() { + +} + +pageDetails() { +throw new Error('Method not implemented.'); +} + + constructor(private store: Store, private translationService: TranslationService) { + this.dataSource.data = TREE_DATA; + } + + ngOnInit(): void { + this.store.dispatch(NavigatorAdminFormOverviewActions.getStartPage()); + this.store.select(selectStartPage).subscribe(page => { + if (page) { + const children = page.choices?.map((choice) => ({ + item: choice!, + children: choice?.nextPage ? [{item: choice?.nextPage!}] : undefined + })) ?? []; + const treeNode: TreeNode = { + item: page!, + children: children + }; + this.dataSource.data = [...this.dataSource.data, treeNode]; + } + }); + } + + treeControl = new FlatTreeControl( + node => node.level, + node => node.expandable, + ); + + private transformer = (node: TreeNode, level: number) => { + return { + expandable: !!node.children && node.children.length > 0, + item: node.item, + level: level + } + } + + private treeFlattener = new MatTreeFlattener( + this.transformer, + node => node.level, + node => node.expandable, + node => node.children + ); + + dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); + + hasChild = (_: number, node: FlatNode) => node.expandable; +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.html b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.scss b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts deleted file mode 100644 index 4dfcc52e7..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-navigator-admin-form-page', - templateUrl: './navigator-admin-form-page.component.html', - styleUrls: ['./navigator-admin-form-page.component.scss'] -}) -export class NavigatorAdminFormOverviewComponent { -} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-page.module.ts b/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts similarity index 76% rename from src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-page.module.ts rename to src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts index f76026e57..321e23a1b 100644 --- a/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-page.module.ts +++ b/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts @@ -2,14 +2,18 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; +import { MatProgressBar } from '@angular/material/progress-bar'; +import { MatTreeModule } from '@angular/material/tree'; import { EffectsModule } from '@ngrx/effects'; import { StoreModule } from '@ngrx/store'; +import { TranslatablePipe } from 'ngx-cinlib/i18n'; +import { IconComponent } from 'ngx-cinlib/icons'; import { TableComponent } from 'ngx-cinlib/tables'; import { CoreModule } from 'src/app/core/core.module'; -import { NavigatorAdminFormOverviewComponent } from './components/navigator-admin-form-page.component'; +import { NavigatorAdminFormOverviewComponent } from './components/navigator-admin-form-overview.component'; import { navigatorAdminFormOverviewStateKey } from './constants/navigator-admin-form-overview.constants'; -import { NavigatorAdminFormOverviewEffects } from './state/navigator-admin-form-page.effects'; -import { navigatorAdminFormOverviewReducer } from './state/navigator-admin-form-page.reducer'; +import { NavigatorAdminFormOverviewEffects } from './state/navigator-admin-form-overview.effects'; +import { navigatorAdminFormOverviewReducer } from './state/navigator-admin-form-overview.reducer'; const components = [ NavigatorAdminFormOverviewComponent, @@ -22,6 +26,8 @@ const framework = [ const materials = [ MatButtonModule, MatCardModule, + MatTreeModule, + MatProgressBar ]; const modules = [ @@ -31,8 +37,9 @@ const modules = [ const libs = [ StoreModule.forFeature(navigatorAdminFormOverviewStateKey, navigatorAdminFormOverviewReducer), EffectsModule.forFeature([NavigatorAdminFormOverviewEffects]), - + IconComponent, TableComponent, + TranslatablePipe, ]; @NgModule({ diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts new file mode 100644 index 000000000..ebf35f28f --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts @@ -0,0 +1,13 @@ +import { createActionGroup, emptyProps } from '@ngrx/store'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; + +export const NavigatorAdminFormOverviewActions = createActionGroup({ + source: 'Navigator Admin Form overview', + events: { + 'get start page': emptyProps(), + 'set start page': (startPage: Maybe) => ({ startPage }), + + 'get page': (slug: Maybe) => ({ slug }), + 'set page': (page: Maybe) => ({ page }), + } +}); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts new file mode 100644 index 000000000..21afabcfd --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { filter, map, switchMap } from 'rxjs'; +import { AdminActions } from 'src/app/admin/state/admin.actions'; +import { NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { GetNavigatorPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-page.query.generated'; +import { GetNavigatorStartPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-start-page.query.generated'; +import { NavigatorAdminFormOverviewActions } from './navigator-admin-form-overview.actions'; + + +@Injectable() +export class NavigatorAdminFormOverviewEffects { + + getStartPage = createEffect(() => this.actions.pipe( + ofType(NavigatorAdminFormOverviewActions.getStartPage), + switchMap( () => this.getNavigatorStartPageService.watch().valueChanges), + filter(response => !!response.data.getNavigatorStartPage?.id), + map(response => NavigatorAdminFormOverviewActions.setStartPage(response.data.getNavigatorStartPage as NavigatorPageEntity)) + )); + + getPage = createEffect(() => this.actions.pipe( + ofType(NavigatorAdminFormOverviewActions.getPage), + switchMap((action) => this.getNavigatorPageService.watch({ + entity: { + slug: action.slug + } + }).valueChanges), + map(response => response.data.getNavigatorPage?.id + ? NavigatorAdminFormOverviewActions.setPage(response.data.getNavigatorPage as NavigatorPageEntity) + : AdminActions.notFound()) + )); + + constructor( + private actions: Actions, + private getNavigatorStartPageService: GetNavigatorStartPageGQL, + private getNavigatorPageService: GetNavigatorPageGQL + + ) {} +} diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts new file mode 100644 index 000000000..bf9955031 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts @@ -0,0 +1,22 @@ +import { createReducer, on } from '@ngrx/store'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { NavigatorAdminFormOverviewActions } from './navigator-admin-form-overview.actions'; + + + +export interface NavigatorAdminFormOverviewState { + startPage?: Maybe; +} + +export const initialState: NavigatorAdminFormOverviewState = { +}; + +export const navigatorAdminFormOverviewReducer = createReducer( + initialState, + + on( + NavigatorAdminFormOverviewActions.setStartPage, + (state, action): NavigatorAdminFormOverviewState => ({ + ...state, startPage: action.startPage + })), +); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.selectors.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts similarity index 59% rename from src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.selectors.ts rename to src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts index 4c8e9bc07..59154b5f3 100644 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.selectors.ts +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts @@ -1,7 +1,11 @@ -import { createFeatureSelector } from '@ngrx/store'; +import { createFeatureSelector, createSelector } from '@ngrx/store'; import { navigatorAdminFormOverviewStateKey } from '../constants/navigator-admin-form-overview.constants'; -import { NavigatorAdminFormOverviewState } from './navigator-admin-form-page.reducer'; +import { NavigatorAdminFormOverviewState } from './navigator-admin-form-overview.reducer'; export const selectNavigatorAdminFormOverviewState = createFeatureSelector(navigatorAdminFormOverviewStateKey); +export const selectStartPage = createSelector( + selectNavigatorAdminFormOverviewState, + state => state.startPage +); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts deleted file mode 100644 index f33ef2afb..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.actions.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createActionGroup } from '@ngrx/store'; - -export const NavigatorAdminFormOverviewActions = createActionGroup({ - source: 'Navigator Admin Form overview', - events: { - - } -}); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts deleted file mode 100644 index f15a4c590..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.effects.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; - - -@Injectable() -export class NavigatorAdminFormOverviewEffects { - - - - constructor( - ) { } -} diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts deleted file mode 100644 index 59a413364..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-page.reducer.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { createReducer } from '@ngrx/store'; - - - -export interface NavigatorAdminFormOverviewState { - -} - -export const initialState: NavigatorAdminFormOverviewState = { -}; - -export const navigatorAdminFormOverviewReducer = createReducer( - initialState, -); diff --git a/src/app/features/navigator/api/generated/get-articles.query.generated.ts b/src/app/features/navigator/api/generated/get-articles.query.generated.ts new file mode 100644 index 000000000..5cfce10e9 --- /dev/null +++ b/src/app/features/navigator/api/generated/get-articles.query.generated.ts @@ -0,0 +1,74 @@ +/* eslint-disable */ +import * as Types from '../../../../core/api/generated/schema'; + +import { gql } from 'apollo-angular'; +import { LanguageFragmentDoc } from '../../../../core/api/generated/language.fragment.generated'; +import { Injectable } from '@angular/core'; +import * as Apollo from 'apollo-angular'; +export type GetNavigatorPagesQueryVariables = Types.Exact<{ + params?: Types.InputMaybe; +}>; + + +export type GetNavigatorPagesQuery = { __typename?: 'Query', getNavigatorPages?: { __typename?: 'PageableList_NavigatorPageEntity', total: any, result?: Array<{ __typename?: 'NavigatorPageEntity', id?: string | null, created?: any | null, modified?: any | null, slug?: string | null, title?: string | null, additionalInformation?: string | null, isResultPage?: boolean | null, translatables?: Array<{ __typename?: 'NavigatorPageTranslatableEntity', id?: string | null, title?: string | null, additionalInformation?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null, parentChoices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null, choices?: Array<{ __typename?: 'NavigatorChoiceEntity', id?: string | null, nextPage?: { __typename?: 'NavigatorPageEntity', id?: string | null } | null, translatables?: Array<{ __typename?: 'NavigatorChoiceTranslatableEntity', id?: string | null, name?: string | null, description?: string | null, language?: { __typename?: 'LanguageEntity', id?: string | null, locale?: string | null, name?: string | null } | null } | null> | null } | null> | null } | null> | null } | null }; + +export const GetNavigatorPagesDocument = gql` + query getNavigatorPages($params: FilterSortPaginateInput) { + getNavigatorPages(params: $params) { + result { + id + created + modified + slug + title + additionalInformation + isResultPage + translatables { + id + title + additionalInformation + language { + ...Language + } + } + parentChoices { + id + translatables { + id + name + description + language { + ...Language + } + } + } + choices { + id + nextPage { + id + } + translatables { + id + name + description + language { + ...Language + } + } + } + } + total + } +} + ${LanguageFragmentDoc}`; + + @Injectable({ + providedIn: 'root' + }) + export class GetNavigatorPagesGQL extends Apollo.Query { + override document = GetNavigatorPagesDocument; + + constructor(apollo: Apollo.Apollo) { + super(apollo); + } + } \ No newline at end of file diff --git a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html index 1ea1b0dd0..312d827de 100644 --- a/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html +++ b/src/app/features/navigator/portal/details/modules/layout/components/page/navigator-portal-details-layout-page.component.html @@ -16,7 +16,8 @@ + [icon]="['fas', 'arrow-right']" + [openNewTab]="true"> } } diff --git a/src/app/shared/widgets/gradient-button/gradient-button.component.html b/src/app/shared/widgets/gradient-button/gradient-button.component.html index 87c57995d..1c31e3eff 100644 --- a/src/app/shared/widgets/gradient-button/gradient-button.component.html +++ b/src/app/shared/widgets/gradient-button/gradient-button.component.html @@ -1,5 +1,5 @@ @if (url) { - + {{ name }} @if(description){ - {{ (node.item | translatable: 'title' | async) ?? - (node.item | translatable: 'name' | async) }} - - - - - {{ (node.item | translatable: 'title' | async) ?? - (node.item | translatable: 'name' | async) }} - - - diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss deleted file mode 100644 index c7ebfde37..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss +++ /dev/null @@ -1,10 +0,0 @@ -span { - cursor: pointer; - border-radius: 5rem; - padding-left: .5rem; - padding-right: .5rem; -} - -span:hover{ - background-color: var(--color-light); -} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts deleted file mode 100644 index d4967a713..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { FlatTreeControl } from '@angular/cdk/tree'; -import { Component, OnInit } from '@angular/core'; -import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; -import { Store } from '@ngrx/store'; -import { TranslationService } from 'ngx-cinlib/i18n'; -import { NavigatorChoiceEntity, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; -import { NavigatorAdminFormOverviewActions } from '../state/navigator-admin-form-overview.actions'; -import { selectStartPage } from '../state/navigator-admin-form-overview.selectors'; - -interface TreeNode { - item: NavigatorPageEntity | NavigatorChoiceEntity, - children?: TreeNode[], -} - -interface FlatNode { - expandable: boolean, - item: NavigatorPageEntity | NavigatorChoiceEntity, - level: number, -} - -const TREE_DATA: TreeNode[] = []; - -@Component({ - selector: 'app-navigator-admin-form-overview', - templateUrl: './navigator-admin-form-overview.component.html', - styleUrls: ['./navigator-admin-form-overview.component.scss'] -}) -export class NavigatorAdminFormOverviewComponent implements OnInit { - -getNextPage() { - -} - -pageDetails() { -throw new Error('Method not implemented.'); -} - - constructor(private store: Store, private translationService: TranslationService) { - this.dataSource.data = TREE_DATA; - } - - ngOnInit(): void { - this.store.dispatch(NavigatorAdminFormOverviewActions.getStartPage()); - this.store.select(selectStartPage).subscribe(page => { - if (page) { - const children = page.choices?.map((choice) => ({ - item: choice!, - children: choice?.nextPage ? [{item: choice?.nextPage!}] : undefined - })) ?? []; - const treeNode: TreeNode = { - item: page!, - children: children - }; - this.dataSource.data = [...this.dataSource.data, treeNode]; - } - }); - } - - treeControl = new FlatTreeControl( - node => node.level, - node => node.expandable, - ); - - private transformer = (node: TreeNode, level: number) => { - return { - expandable: !!node.children && node.children.length > 0, - item: node.item, - level: level - } - } - - private treeFlattener = new MatTreeFlattener( - this.transformer, - node => node.level, - node => node.expandable, - node => node.children - ); - - dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); - - hasChild = (_: number, node: FlatNode) => node.expandable; -} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts b/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts deleted file mode 100644 index bb8bd63e3..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const navigatorAdminFormOverviewStateKey = 'navigatorAdminFormOverviewState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts b/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts deleted file mode 100644 index 321e23a1b..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatProgressBar } from '@angular/material/progress-bar'; -import { MatTreeModule } from '@angular/material/tree'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreModule } from '@ngrx/store'; -import { TranslatablePipe } from 'ngx-cinlib/i18n'; -import { IconComponent } from 'ngx-cinlib/icons'; -import { TableComponent } from 'ngx-cinlib/tables'; -import { CoreModule } from 'src/app/core/core.module'; -import { NavigatorAdminFormOverviewComponent } from './components/navigator-admin-form-overview.component'; -import { navigatorAdminFormOverviewStateKey } from './constants/navigator-admin-form-overview.constants'; -import { NavigatorAdminFormOverviewEffects } from './state/navigator-admin-form-overview.effects'; -import { navigatorAdminFormOverviewReducer } from './state/navigator-admin-form-overview.reducer'; - -const components = [ - NavigatorAdminFormOverviewComponent, -] - -const framework = [ - CommonModule, -]; - -const materials = [ - MatButtonModule, - MatCardModule, - MatTreeModule, - MatProgressBar -]; - -const modules = [ - CoreModule, -]; - -const libs = [ - StoreModule.forFeature(navigatorAdminFormOverviewStateKey, navigatorAdminFormOverviewReducer), - EffectsModule.forFeature([NavigatorAdminFormOverviewEffects]), - IconComponent, - TableComponent, - TranslatablePipe, -]; - -@NgModule({ - declarations: [...components], - imports: [ - ...framework, - ...libs, - ...materials, - ...modules, - ], - exports: [...components], -}) -export class NavigatorAdminFormOverviewModule { } diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts deleted file mode 100644 index ebf35f28f..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createActionGroup, emptyProps } from '@ngrx/store'; -import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; - -export const NavigatorAdminFormOverviewActions = createActionGroup({ - source: 'Navigator Admin Form overview', - events: { - 'get start page': emptyProps(), - 'set start page': (startPage: Maybe) => ({ startPage }), - - 'get page': (slug: Maybe) => ({ slug }), - 'set page': (page: Maybe) => ({ page }), - } -}); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts deleted file mode 100644 index 21afabcfd..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Actions, createEffect, ofType } from '@ngrx/effects'; -import { filter, map, switchMap } from 'rxjs'; -import { AdminActions } from 'src/app/admin/state/admin.actions'; -import { NavigatorPageEntity } from 'src/app/core/api/generated/schema'; -import { GetNavigatorPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-page.query.generated'; -import { GetNavigatorStartPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-start-page.query.generated'; -import { NavigatorAdminFormOverviewActions } from './navigator-admin-form-overview.actions'; - - -@Injectable() -export class NavigatorAdminFormOverviewEffects { - - getStartPage = createEffect(() => this.actions.pipe( - ofType(NavigatorAdminFormOverviewActions.getStartPage), - switchMap( () => this.getNavigatorStartPageService.watch().valueChanges), - filter(response => !!response.data.getNavigatorStartPage?.id), - map(response => NavigatorAdminFormOverviewActions.setStartPage(response.data.getNavigatorStartPage as NavigatorPageEntity)) - )); - - getPage = createEffect(() => this.actions.pipe( - ofType(NavigatorAdminFormOverviewActions.getPage), - switchMap((action) => this.getNavigatorPageService.watch({ - entity: { - slug: action.slug - } - }).valueChanges), - map(response => response.data.getNavigatorPage?.id - ? NavigatorAdminFormOverviewActions.setPage(response.data.getNavigatorPage as NavigatorPageEntity) - : AdminActions.notFound()) - )); - - constructor( - private actions: Actions, - private getNavigatorStartPageService: GetNavigatorStartPageGQL, - private getNavigatorPageService: GetNavigatorPageGQL - - ) {} -} diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts deleted file mode 100644 index bf9955031..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createReducer, on } from '@ngrx/store'; -import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; -import { NavigatorAdminFormOverviewActions } from './navigator-admin-form-overview.actions'; - - - -export interface NavigatorAdminFormOverviewState { - startPage?: Maybe; -} - -export const initialState: NavigatorAdminFormOverviewState = { -}; - -export const navigatorAdminFormOverviewReducer = createReducer( - initialState, - - on( - NavigatorAdminFormOverviewActions.setStartPage, - (state, action): NavigatorAdminFormOverviewState => ({ - ...state, startPage: action.startPage - })), -); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts deleted file mode 100644 index 59154b5f3..000000000 --- a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { navigatorAdminFormOverviewStateKey } from '../constants/navigator-admin-form-overview.constants'; -import { NavigatorAdminFormOverviewState } from './navigator-admin-form-overview.reducer'; - - -export const selectNavigatorAdminFormOverviewState = createFeatureSelector(navigatorAdminFormOverviewStateKey); - -export const selectStartPage = createSelector( - selectNavigatorAdminFormOverviewState, - state => state.startPage -); diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts deleted file mode 100644 index af5a5fd70..000000000 --- a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-navigator-admin-form-page', - templateUrl: './navigator-admin-form-page.component.html', - styleUrls: ['./navigator-admin-form-page.component.scss'] -}) -export class NavigatorAdminFormPageComponent { -} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts b/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts deleted file mode 100644 index 5564a3100..000000000 --- a/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const navigatorAdminFormPageStateKey = 'navigatorAdminFormPageState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts b/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts deleted file mode 100644 index ceba788a1..000000000 --- a/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreModule } from '@ngrx/store'; -import { TableComponent } from 'ngx-cinlib/tables'; -import { CoreModule } from 'src/app/core/core.module'; -import { NavigatorAdminFormPageComponent } from './components/navigator-admin-form-page.component'; -import { navigatorAdminFormPageStateKey } from './constants/navigator-admin-form-page.constants'; -import { NavigatorAdminFormPageEffects } from './state/navigator-admin-form-page.effects'; -import { navigatorAdminFormPageReducer } from './state/navigator-admin-form-page.reducer'; - -const components = [ - NavigatorAdminFormPageComponent, -] - -const framework = [ - CommonModule, -]; - -const materials = [ - MatButtonModule, - MatCardModule, -]; - -const modules = [ - CoreModule, -]; - -const libs = [ - StoreModule.forFeature(navigatorAdminFormPageStateKey, navigatorAdminFormPageReducer), - EffectsModule.forFeature([NavigatorAdminFormPageEffects]), - - TableComponent, -]; - -@NgModule({ - declarations: [...components], - imports: [ - ...framework, - ...libs, - ...materials, - ...modules, - ], - exports: [...components], -}) -export class NavigatorAdminFormPageModule { } diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts deleted file mode 100644 index cc7c2b3b4..000000000 --- a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createActionGroup } from '@ngrx/store'; - - - -export const NavigatorAdminFormPageActions = createActionGroup({ - source: 'Navigator Admin Form page', - events: { - - } -}); diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts deleted file mode 100644 index 1ec0068b6..000000000 --- a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; - - -@Injectable() -export class NavigatorAdminFormPageEffects { - - - - constructor( - ) { } -} diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts deleted file mode 100644 index e05d40d97..000000000 --- a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { createReducer } from '@ngrx/store'; - - - -export interface NavigatorAdminFormPageState { - -} - -export const initialState: NavigatorAdminFormPageState = { -}; - -export const navigatorAdminFormPageReducer = createReducer( - initialState, -); diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts deleted file mode 100644 index 6af580d43..000000000 --- a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createFeatureSelector } from '@ngrx/store'; -import { navigatorAdminFormPageStateKey } from '../constants/navigator-admin-form-page.constants'; -import { NavigatorAdminFormPageState } from './navigator-admin-form-page.reducer'; - - -export const selectNavigatorAdminFormPageState = createFeatureSelector(navigatorAdminFormPageStateKey); - diff --git a/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts b/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts index f77b588f8..2b7faa0e9 100644 --- a/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts +++ b/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts @@ -9,12 +9,7 @@ const routes: Routes = [ .then((imported) => imported.NavigatorAdminFormLayoutModule), component: NavigatorAdminFormLayoutComponent }, - // { - // path: visitorsRoute, - // loadChildren: () => import('./modules/visitors/event-admin-details-visitors.module') - // .then((imported) => imported.NavigatorAdminDetailsVisitorsModule), - // component: NavigatorAdminDetailsVisitorsComponent - // }, + ]; @NgModule({ From 78609b8225454b501a5299fc430e8687f550283f Mon Sep 17 00:00:00 2001 From: DOOMED2WIN Date: Thu, 7 Mar 2024 13:04:16 +0100 Subject: [PATCH 7/7] navigator: admin work in progress --- ...navigator-admin-form-choice.component.html | 0 ...navigator-admin-form-choice.component.scss | 0 .../navigator-admin-form-choice.component.ts | 9 ++ .../navigator-admin-form-choice.constants.ts | 1 + .../navigator-admin-form-choice.module.ts | 48 +++++++++++ .../navigator-admin-form-choice.actions.ts | 6 ++ .../navigator-admin-form-choice.effects.ts | 7 ++ .../navigator-admin-form-choice.reducer.ts | 14 ++++ .../navigator-admin-form-choice.selectors.ts | 7 ++ ...navigator-admin-form-layout.component.html | 4 +- ...navigator-admin-form-layout.component.scss | 9 -- .../navigator-admin-form-layout.module.ts | 2 + ...vigator-admin-form-overview.component.html | 25 ++++++ ...vigator-admin-form-overview.component.scss | 10 +++ ...navigator-admin-form-overview.component.ts | 82 +++++++++++++++++++ ...navigator-admin-form-overview.constants.ts | 1 + .../navigator-admin-form-overview.module.ts | 55 +++++++++++++ .../navigator-admin-form-overview.actions.ts | 13 +++ .../navigator-admin-form-overview.effects.ts | 39 +++++++++ .../navigator-admin-form-overview.reducer.ts | 22 +++++ ...navigator-admin-form-overview.selectors.ts | 11 +++ .../navigator-admin-form-page.component.html | 0 .../navigator-admin-form-page.component.scss | 0 .../navigator-admin-form-page.component.ts | 9 ++ .../navigator-admin-form-page.constants.ts | 1 + .../page/navigator-admin-form-page.module.ts | 48 +++++++++++ .../navigator-admin-form-page.actions.ts | 10 +++ .../navigator-admin-form-page.effects.ts | 11 +++ .../navigator-admin-form-page.reducer.ts | 14 ++++ .../navigator-admin-form-page.selectors.ts | 7 ++ .../navigator-admin-form-routing.module.ts | 7 +- 31 files changed, 461 insertions(+), 11 deletions(-) create mode 100644 src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.html create mode 100644 src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts create mode 100644 src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts create mode 100644 src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html create mode 100644 src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss create mode 100644 src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts create mode 100644 src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts diff --git a/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.html b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.scss b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts new file mode 100644 index 000000000..f7f2164eb --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/components/navigator-admin-form-choice.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-navigator-admin-form-choice', + templateUrl: './navigator-admin-form-choice.component.html', + styleUrls: ['./navigator-admin-form-choice.component.scss'] +}) +export class NavigatorAdminFormChoiceComponent { +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts b/src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts new file mode 100644 index 000000000..5a52f9114 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/constants/navigator-admin-form-choice.constants.ts @@ -0,0 +1 @@ +export const navigatorAdminFormChoiceStateKey = 'navigatorAdminFormChoiceState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts b/src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts new file mode 100644 index 000000000..6a63382ab --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/navigator-admin-form-choice.module.ts @@ -0,0 +1,48 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormChoiceComponent } from './components/navigator-admin-form-choice.component'; +import { navigatorAdminFormChoiceStateKey } from './constants/navigator-admin-form-choice.constants'; +import { NavigatorAdminFormChoiceEffects } from './state/navigator-admin-form-choice.effects'; +import { navigatorAdminFormChoiceReducer } from './state/navigator-admin-form-choice.reducer'; + +const components = [ + NavigatorAdminFormChoiceComponent, +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorAdminFormChoiceStateKey, navigatorAdminFormChoiceReducer), + EffectsModule.forFeature([NavigatorAdminFormChoiceEffects]), + + TableComponent, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorAdminFormChoiceModule { } diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts new file mode 100644 index 000000000..d0a1dfa40 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.actions.ts @@ -0,0 +1,6 @@ +import { createActionGroup } from '@ngrx/store'; + +export const NavigatorAdminFormChoiceActions = createActionGroup({ + source: 'Navigator Admin Form choice', + events: {} +}); diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts new file mode 100644 index 000000000..b48bb1f51 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.effects.ts @@ -0,0 +1,7 @@ +import { Injectable } from '@angular/core'; + + +@Injectable() +export class NavigatorAdminFormChoiceEffects { + constructor() { } +} diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts new file mode 100644 index 000000000..ae82df72d --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.reducer.ts @@ -0,0 +1,14 @@ +import { createReducer } from '@ngrx/store'; + + + +export interface NavigatorAdminFormChoiceState { + +} + +export const initialState: NavigatorAdminFormChoiceState = { +}; + +export const navigatorAdminFormChoiceReducer = createReducer( + initialState, +); diff --git a/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts new file mode 100644 index 000000000..e27e7e6f0 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/choice/state/navigator-admin-form-choice.selectors.ts @@ -0,0 +1,7 @@ +import { createFeatureSelector } from '@ngrx/store'; +import { navigatorAdminFormChoiceStateKey } from '../constants/navigator-admin-form-choice.constants'; +import { NavigatorAdminFormChoiceState } from './navigator-admin-form-choice.reducer'; + + +export const selectNavigatorAdminFormChoiceState = createFeatureSelector(navigatorAdminFormChoiceStateKey); + diff --git a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html index 9bfe5f385..393434d2f 100644 --- a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html +++ b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.html @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.scss b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.scss index 689220a34..e69de29bb 100644 --- a/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.scss +++ b/src/app/features/navigator/admin/form/modules/layout/components/navigator-admin-form-layout.component.scss @@ -1,9 +0,0 @@ -:host{ - display: flex; - justify-content: center; - align-items: center; -} - -img{ - width: 70%; -} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts b/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts index f39326e02..8cd42e7c8 100644 --- a/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts +++ b/src/app/features/navigator/admin/form/modules/layout/navigator-admin-form-layout.module.ts @@ -7,6 +7,7 @@ import { StoreModule } from '@ngrx/store'; import { PageTitleComponent } from 'ngx-cinlib/layouts/title'; import { TableComponent } from 'ngx-cinlib/tables'; import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormOverviewModule } from '../overview/navigator-admin-form-overview.module'; import { NavigatorAdminFormLayoutComponent } from './components/navigator-admin-form-layout.component'; import { navigatorAdminFormLayoutStateKey } from './constants/navigator-admin-form-layout.constants'; import { NavigatorAdminFormLayoutEffects } from './state/navigator-admin-form-layout.effects'; @@ -27,6 +28,7 @@ const materials = [ const modules = [ CoreModule, + NavigatorAdminFormOverviewModule, ]; const libs = [ diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html new file mode 100644 index 000000000..cf396b59e --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.html @@ -0,0 +1,25 @@ + + + + + {{ (node.item | translatable: 'title' | async) ?? + (node.item | translatable: 'name' | async) }} + + + + + {{ (node.item | translatable: 'title' | async) ?? + (node.item | translatable: 'name' | async) }} + + + diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss new file mode 100644 index 000000000..c7ebfde37 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.scss @@ -0,0 +1,10 @@ +span { + cursor: pointer; + border-radius: 5rem; + padding-left: .5rem; + padding-right: .5rem; +} + +span:hover{ + background-color: var(--color-light); +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts new file mode 100644 index 000000000..d4967a713 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/components/navigator-admin-form-overview.component.ts @@ -0,0 +1,82 @@ +import { FlatTreeControl } from '@angular/cdk/tree'; +import { Component, OnInit } from '@angular/core'; +import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; +import { Store } from '@ngrx/store'; +import { TranslationService } from 'ngx-cinlib/i18n'; +import { NavigatorChoiceEntity, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { NavigatorAdminFormOverviewActions } from '../state/navigator-admin-form-overview.actions'; +import { selectStartPage } from '../state/navigator-admin-form-overview.selectors'; + +interface TreeNode { + item: NavigatorPageEntity | NavigatorChoiceEntity, + children?: TreeNode[], +} + +interface FlatNode { + expandable: boolean, + item: NavigatorPageEntity | NavigatorChoiceEntity, + level: number, +} + +const TREE_DATA: TreeNode[] = []; + +@Component({ + selector: 'app-navigator-admin-form-overview', + templateUrl: './navigator-admin-form-overview.component.html', + styleUrls: ['./navigator-admin-form-overview.component.scss'] +}) +export class NavigatorAdminFormOverviewComponent implements OnInit { + +getNextPage() { + +} + +pageDetails() { +throw new Error('Method not implemented.'); +} + + constructor(private store: Store, private translationService: TranslationService) { + this.dataSource.data = TREE_DATA; + } + + ngOnInit(): void { + this.store.dispatch(NavigatorAdminFormOverviewActions.getStartPage()); + this.store.select(selectStartPage).subscribe(page => { + if (page) { + const children = page.choices?.map((choice) => ({ + item: choice!, + children: choice?.nextPage ? [{item: choice?.nextPage!}] : undefined + })) ?? []; + const treeNode: TreeNode = { + item: page!, + children: children + }; + this.dataSource.data = [...this.dataSource.data, treeNode]; + } + }); + } + + treeControl = new FlatTreeControl( + node => node.level, + node => node.expandable, + ); + + private transformer = (node: TreeNode, level: number) => { + return { + expandable: !!node.children && node.children.length > 0, + item: node.item, + level: level + } + } + + private treeFlattener = new MatTreeFlattener( + this.transformer, + node => node.level, + node => node.expandable, + node => node.children + ); + + dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); + + hasChild = (_: number, node: FlatNode) => node.expandable; +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts b/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts new file mode 100644 index 000000000..bb8bd63e3 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/constants/navigator-admin-form-overview.constants.ts @@ -0,0 +1 @@ +export const navigatorAdminFormOverviewStateKey = 'navigatorAdminFormOverviewState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts b/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts new file mode 100644 index 000000000..321e23a1b --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/navigator-admin-form-overview.module.ts @@ -0,0 +1,55 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatProgressBar } from '@angular/material/progress-bar'; +import { MatTreeModule } from '@angular/material/tree'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { TranslatablePipe } from 'ngx-cinlib/i18n'; +import { IconComponent } from 'ngx-cinlib/icons'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormOverviewComponent } from './components/navigator-admin-form-overview.component'; +import { navigatorAdminFormOverviewStateKey } from './constants/navigator-admin-form-overview.constants'; +import { NavigatorAdminFormOverviewEffects } from './state/navigator-admin-form-overview.effects'; +import { navigatorAdminFormOverviewReducer } from './state/navigator-admin-form-overview.reducer'; + +const components = [ + NavigatorAdminFormOverviewComponent, +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, + MatTreeModule, + MatProgressBar +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorAdminFormOverviewStateKey, navigatorAdminFormOverviewReducer), + EffectsModule.forFeature([NavigatorAdminFormOverviewEffects]), + IconComponent, + TableComponent, + TranslatablePipe, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorAdminFormOverviewModule { } diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts new file mode 100644 index 000000000..ebf35f28f --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.actions.ts @@ -0,0 +1,13 @@ +import { createActionGroup, emptyProps } from '@ngrx/store'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; + +export const NavigatorAdminFormOverviewActions = createActionGroup({ + source: 'Navigator Admin Form overview', + events: { + 'get start page': emptyProps(), + 'set start page': (startPage: Maybe) => ({ startPage }), + + 'get page': (slug: Maybe) => ({ slug }), + 'set page': (page: Maybe) => ({ page }), + } +}); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts new file mode 100644 index 000000000..21afabcfd --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.effects.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { filter, map, switchMap } from 'rxjs'; +import { AdminActions } from 'src/app/admin/state/admin.actions'; +import { NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { GetNavigatorPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-page.query.generated'; +import { GetNavigatorStartPageGQL } from 'src/app/features/navigator/api/generated/get-navigator-start-page.query.generated'; +import { NavigatorAdminFormOverviewActions } from './navigator-admin-form-overview.actions'; + + +@Injectable() +export class NavigatorAdminFormOverviewEffects { + + getStartPage = createEffect(() => this.actions.pipe( + ofType(NavigatorAdminFormOverviewActions.getStartPage), + switchMap( () => this.getNavigatorStartPageService.watch().valueChanges), + filter(response => !!response.data.getNavigatorStartPage?.id), + map(response => NavigatorAdminFormOverviewActions.setStartPage(response.data.getNavigatorStartPage as NavigatorPageEntity)) + )); + + getPage = createEffect(() => this.actions.pipe( + ofType(NavigatorAdminFormOverviewActions.getPage), + switchMap((action) => this.getNavigatorPageService.watch({ + entity: { + slug: action.slug + } + }).valueChanges), + map(response => response.data.getNavigatorPage?.id + ? NavigatorAdminFormOverviewActions.setPage(response.data.getNavigatorPage as NavigatorPageEntity) + : AdminActions.notFound()) + )); + + constructor( + private actions: Actions, + private getNavigatorStartPageService: GetNavigatorStartPageGQL, + private getNavigatorPageService: GetNavigatorPageGQL + + ) {} +} diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts new file mode 100644 index 000000000..bf9955031 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.reducer.ts @@ -0,0 +1,22 @@ +import { createReducer, on } from '@ngrx/store'; +import { Maybe, NavigatorPageEntity } from 'src/app/core/api/generated/schema'; +import { NavigatorAdminFormOverviewActions } from './navigator-admin-form-overview.actions'; + + + +export interface NavigatorAdminFormOverviewState { + startPage?: Maybe; +} + +export const initialState: NavigatorAdminFormOverviewState = { +}; + +export const navigatorAdminFormOverviewReducer = createReducer( + initialState, + + on( + NavigatorAdminFormOverviewActions.setStartPage, + (state, action): NavigatorAdminFormOverviewState => ({ + ...state, startPage: action.startPage + })), +); diff --git a/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts new file mode 100644 index 000000000..59154b5f3 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/overview/state/navigator-admin-form-overview.selectors.ts @@ -0,0 +1,11 @@ +import { createFeatureSelector, createSelector } from '@ngrx/store'; +import { navigatorAdminFormOverviewStateKey } from '../constants/navigator-admin-form-overview.constants'; +import { NavigatorAdminFormOverviewState } from './navigator-admin-form-overview.reducer'; + + +export const selectNavigatorAdminFormOverviewState = createFeatureSelector(navigatorAdminFormOverviewStateKey); + +export const selectStartPage = createSelector( + selectNavigatorAdminFormOverviewState, + state => state.startPage +); diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts new file mode 100644 index 000000000..af5a5fd70 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/components/navigator-admin-form-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-navigator-admin-form-page', + templateUrl: './navigator-admin-form-page.component.html', + styleUrls: ['./navigator-admin-form-page.component.scss'] +}) +export class NavigatorAdminFormPageComponent { +} \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts b/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts new file mode 100644 index 000000000..5564a3100 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/constants/navigator-admin-form-page.constants.ts @@ -0,0 +1 @@ +export const navigatorAdminFormPageStateKey = 'navigatorAdminFormPageState'; \ No newline at end of file diff --git a/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts b/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts new file mode 100644 index 000000000..ceba788a1 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/navigator-admin-form-page.module.ts @@ -0,0 +1,48 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreModule } from '@ngrx/store'; +import { TableComponent } from 'ngx-cinlib/tables'; +import { CoreModule } from 'src/app/core/core.module'; +import { NavigatorAdminFormPageComponent } from './components/navigator-admin-form-page.component'; +import { navigatorAdminFormPageStateKey } from './constants/navigator-admin-form-page.constants'; +import { NavigatorAdminFormPageEffects } from './state/navigator-admin-form-page.effects'; +import { navigatorAdminFormPageReducer } from './state/navigator-admin-form-page.reducer'; + +const components = [ + NavigatorAdminFormPageComponent, +] + +const framework = [ + CommonModule, +]; + +const materials = [ + MatButtonModule, + MatCardModule, +]; + +const modules = [ + CoreModule, +]; + +const libs = [ + StoreModule.forFeature(navigatorAdminFormPageStateKey, navigatorAdminFormPageReducer), + EffectsModule.forFeature([NavigatorAdminFormPageEffects]), + + TableComponent, +]; + +@NgModule({ + declarations: [...components], + imports: [ + ...framework, + ...libs, + ...materials, + ...modules, + ], + exports: [...components], +}) +export class NavigatorAdminFormPageModule { } diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts new file mode 100644 index 000000000..cc7c2b3b4 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.actions.ts @@ -0,0 +1,10 @@ +import { createActionGroup } from '@ngrx/store'; + + + +export const NavigatorAdminFormPageActions = createActionGroup({ + source: 'Navigator Admin Form page', + events: { + + } +}); diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts new file mode 100644 index 000000000..1ec0068b6 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.effects.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; + + +@Injectable() +export class NavigatorAdminFormPageEffects { + + + + constructor( + ) { } +} diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts new file mode 100644 index 000000000..e05d40d97 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.reducer.ts @@ -0,0 +1,14 @@ +import { createReducer } from '@ngrx/store'; + + + +export interface NavigatorAdminFormPageState { + +} + +export const initialState: NavigatorAdminFormPageState = { +}; + +export const navigatorAdminFormPageReducer = createReducer( + initialState, +); diff --git a/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts new file mode 100644 index 000000000..6af580d43 --- /dev/null +++ b/src/app/features/navigator/admin/form/modules/page/state/navigator-admin-form-page.selectors.ts @@ -0,0 +1,7 @@ +import { createFeatureSelector } from '@ngrx/store'; +import { navigatorAdminFormPageStateKey } from '../constants/navigator-admin-form-page.constants'; +import { NavigatorAdminFormPageState } from './navigator-admin-form-page.reducer'; + + +export const selectNavigatorAdminFormPageState = createFeatureSelector(navigatorAdminFormPageStateKey); + diff --git a/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts b/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts index 2b7faa0e9..f77b588f8 100644 --- a/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts +++ b/src/app/features/navigator/admin/form/navigator-admin-form-routing.module.ts @@ -9,7 +9,12 @@ const routes: Routes = [ .then((imported) => imported.NavigatorAdminFormLayoutModule), component: NavigatorAdminFormLayoutComponent }, - + // { + // path: visitorsRoute, + // loadChildren: () => import('./modules/visitors/event-admin-details-visitors.module') + // .then((imported) => imported.NavigatorAdminDetailsVisitorsModule), + // component: NavigatorAdminDetailsVisitorsComponent + // }, ]; @NgModule({