fabrikantencore 2.39.13 → 2.39.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Inject, Optional, Injectable, ViewEncapsulation, Component, Input, signal, Pipe, ViewChild, EventEmitter, Output, ViewContainerRef, HostListener, ApplicationRef, EnvironmentInjector, createComponent, NgModule } from '@angular/core';
2
+ import { InjectionToken, Inject, Optional, Injectable, signal, ViewEncapsulation, Component, Input, Pipe, ViewChild, EventEmitter, Output, ViewContainerRef, HostListener, NgModule } from '@angular/core';
3
3
  import * as i4 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i3 from '@angular/router';
@@ -10,10 +10,8 @@ import * as i6$1 from '@angular/forms';
10
10
  import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
11
11
  import * as i8 from 'ngx-cookie-service';
12
12
  import { CookieService } from 'ngx-cookie-service';
13
- import * as i7$2 from 'ngx-three-engine';
14
- import { ActorComponent, PlayerController, InjectorService, SettingsPanelComponent, SettingsService, VIEWER_GRAPHICS_PRESET_LOCALSTORAGE_KEY, Actor, GraphicsScalabilityConfigsManager, GameModeBase, GameStateBase, OrbitPawn, World, ThreejsEngineComponent } from 'ngx-three-engine';
15
13
  import { mergeMap, catchError } from 'rxjs/operators';
16
- import { throwError, of, Observable, BehaviorSubject, Subject } from 'rxjs';
14
+ import { throwError, of, Observable, BehaviorSubject } from 'rxjs';
17
15
  import * as i7 from '@angular/material/button';
18
16
  import { MatButtonModule } from '@angular/material/button';
19
17
  import * as i5 from '@angular/material/input';
@@ -45,7 +43,7 @@ import * as i16 from '@angular/material/slide-toggle';
45
43
  import { MatSlideToggle } from '@angular/material/slide-toggle';
46
44
  import * as i10$1 from '@angular/material/tabs';
47
45
  import { MatTabsModule } from '@angular/material/tabs';
48
- import * as i9$2 from '@angular/material/sidenav';
46
+ import * as i9$3 from '@angular/material/sidenav';
49
47
  import { MatSidenavModule } from '@angular/material/sidenav';
50
48
  import { MatTreeModule } from '@angular/material/tree';
51
49
  import * as i8$1 from '@angular/material/icon';
@@ -53,7 +51,7 @@ import { MatIconModule } from '@angular/material/icon';
53
51
  import { MatDividerModule } from '@angular/material/divider';
54
52
  import * as i15 from '@angular/material/button-toggle';
55
53
  import { MatButtonToggleModule } from '@angular/material/button-toggle';
56
- import * as i8$2 from '@angular/material/stepper';
54
+ import * as i9$2 from '@angular/material/stepper';
57
55
  import { MatStepperModule } from '@angular/material/stepper';
58
56
  import * as i9$1 from '@angular/cdk/drag-drop';
59
57
  import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
@@ -62,12 +60,6 @@ import { MatRadioModule } from '@angular/material/radio';
62
60
  import * as i11 from '@angular/material/paginator';
63
61
  import { MatPaginatorModule } from '@angular/material/paginator';
64
62
  import { MatFormFieldModule } from '@angular/material/form-field';
65
- import { Matrix4, Group, Box3, TextureLoader, RepeatWrapping, LinearMipMapLinearFilter, LinearFilter, Mesh, BufferGeometry, BufferAttribute, MeshStandardMaterial, SRGBColorSpace, Vector3, PerspectiveCamera, MathUtils, MeshPhysicalMaterial, DirectionalLight, AmbientLight, Color } from 'three';
66
- import { Inspector } from 'three/addons/inspector/Inspector.js';
67
- import { InspectorBase, PMREMGenerator } from 'three/webgpu';
68
- import Stats from 'three/examples/jsm/libs/stats.module.js';
69
- import { RoomEnvironment } from 'three/examples/jsm/environments/RoomEnvironment.js';
70
- import { HDRLoader } from 'three/examples/jsm/loaders/HDRLoader.js';
71
63
  import * as i6$4 from '@kolkov/angular-editor';
72
64
  import { AngularEditorModule } from '@kolkov/angular-editor';
73
65
 
@@ -10196,6 +10188,7 @@ class FabrikantenFilterViewModel {
10196
10188
  required;
10197
10189
  affectsOnlyBestek;
10198
10190
  selectedOption;
10191
+ defaultOption;
10199
10192
  selectedOptions;
10200
10193
  selectedColour;
10201
10194
  selectedColourValue;
@@ -10226,6 +10219,7 @@ class FabrikantenFilterViewModel {
10226
10219
  this.required = _data["required"];
10227
10220
  this.affectsOnlyBestek = _data["affectsOnlyBestek"];
10228
10221
  this.selectedOption = _data["selectedOption"];
10222
+ this.defaultOption = _data["defaultOption"];
10229
10223
  if (Array.isArray(_data["selectedOptions"])) {
10230
10224
  this.selectedOptions = [];
10231
10225
  for (let item of _data["selectedOptions"])
@@ -10268,6 +10262,7 @@ class FabrikantenFilterViewModel {
10268
10262
  data["required"] = this.required;
10269
10263
  data["affectsOnlyBestek"] = this.affectsOnlyBestek;
10270
10264
  data["selectedOption"] = this.selectedOption;
10265
+ data["defaultOption"] = this.defaultOption;
10271
10266
  if (Array.isArray(this.selectedOptions)) {
10272
10267
  data["selectedOptions"] = [];
10273
10268
  for (let item of this.selectedOptions)
@@ -10838,6 +10833,7 @@ class FabrikantenSettingsViewModel {
10838
10833
  hideFilters;
10839
10834
  showInformationBlock;
10840
10835
  showInformationBlockName;
10836
+ informationAddActionMenu;
10841
10837
  startTab;
10842
10838
  tooltipMode;
10843
10839
  alwaysShowVariant;
@@ -10880,6 +10876,8 @@ class FabrikantenSettingsViewModel {
10880
10876
  osfNew;
10881
10877
  onlyShowBestekWhenFilled;
10882
10878
  rekenenParameters;
10879
+ filtersSelectDefault;
10880
+ stepperFoldable;
10883
10881
  downloadForm;
10884
10882
  selectProductForm;
10885
10883
  downloadCategories;
@@ -10903,6 +10901,7 @@ class FabrikantenSettingsViewModel {
10903
10901
  this.hideFilters = _data["hideFilters"];
10904
10902
  this.showInformationBlock = _data["showInformationBlock"];
10905
10903
  this.showInformationBlockName = _data["showInformationBlockName"];
10904
+ this.informationAddActionMenu = _data["informationAddActionMenu"];
10906
10905
  this.startTab = _data["startTab"];
10907
10906
  this.tooltipMode = _data["tooltipMode"];
10908
10907
  this.alwaysShowVariant = _data["alwaysShowVariant"];
@@ -10945,6 +10944,8 @@ class FabrikantenSettingsViewModel {
10945
10944
  this.osfNew = _data["osfNew"];
10946
10945
  this.onlyShowBestekWhenFilled = _data["onlyShowBestekWhenFilled"];
10947
10946
  this.rekenenParameters = _data["rekenenParameters"];
10947
+ this.filtersSelectDefault = _data["filtersSelectDefault"];
10948
+ this.stepperFoldable = _data["stepperFoldable"];
10948
10949
  this.downloadForm = _data["downloadForm"] ? FabrikantenFormViewModel.fromJS(_data["downloadForm"]) : undefined;
10949
10950
  this.selectProductForm = _data["selectProductForm"] ? FabrikantenFormViewModel.fromJS(_data["selectProductForm"]) : undefined;
10950
10951
  if (Array.isArray(_data["downloadCategories"])) {
@@ -10976,6 +10977,7 @@ class FabrikantenSettingsViewModel {
10976
10977
  data["hideFilters"] = this.hideFilters;
10977
10978
  data["showInformationBlock"] = this.showInformationBlock;
10978
10979
  data["showInformationBlockName"] = this.showInformationBlockName;
10980
+ data["informationAddActionMenu"] = this.informationAddActionMenu;
10979
10981
  data["startTab"] = this.startTab;
10980
10982
  data["tooltipMode"] = this.tooltipMode;
10981
10983
  data["alwaysShowVariant"] = this.alwaysShowVariant;
@@ -11018,6 +11020,8 @@ class FabrikantenSettingsViewModel {
11018
11020
  data["osfNew"] = this.osfNew;
11019
11021
  data["onlyShowBestekWhenFilled"] = this.onlyShowBestekWhenFilled;
11020
11022
  data["rekenenParameters"] = this.rekenenParameters;
11023
+ data["filtersSelectDefault"] = this.filtersSelectDefault;
11024
+ data["stepperFoldable"] = this.stepperFoldable;
11021
11025
  data["downloadForm"] = this.downloadForm ? this.downloadForm.toJSON() : undefined;
11022
11026
  data["selectProductForm"] = this.selectProductForm ? this.selectProductForm.toJSON() : undefined;
11023
11027
  if (Array.isArray(this.downloadCategories)) {
@@ -17843,7 +17847,7 @@ class BeheerNavComponent {
17843
17847
  authenticationService;
17844
17848
  router;
17845
17849
  FabrikantenApiClient;
17846
- ResetCacheTitle = "Reset Cache";
17850
+ ResettingCache = signal(false, ...(ngDevMode ? [{ debugName: "ResettingCache" }] : /* istanbul ignore next */ []));
17847
17851
  FabrikantenSettingsViewModel;
17848
17852
  UploadsResponseModel = null;
17849
17853
  constructor(authenticationService, router, FabrikantenApiClient) {
@@ -17855,6 +17859,14 @@ class BeheerNavComponent {
17855
17859
  this.LoadSettings();
17856
17860
  this.LoadUploads();
17857
17861
  }
17862
+ GetResetCacheTitle() {
17863
+ if (this.ResettingCache()) {
17864
+ return "...";
17865
+ }
17866
+ else {
17867
+ return "Reset Cache";
17868
+ }
17869
+ }
17858
17870
  HangfireEnabled() {
17859
17871
  return this.FabrikantenSettingsViewModel?.hangfireEnabled == true;
17860
17872
  }
@@ -17881,9 +17893,9 @@ class BeheerNavComponent {
17881
17893
  return window.location.href.toLowerCase().indexOf(name.toLowerCase()) != -1;
17882
17894
  }
17883
17895
  ResetCache() {
17884
- this.ResetCacheTitle = "...";
17896
+ this.ResettingCache.set(true);
17885
17897
  this.FabrikantenApiClient.resetCache().subscribe(() => {
17886
- this.ResetCacheTitle = "Reset Cache";
17898
+ this.ResettingCache.set(false);
17887
17899
  alert('cache reset success');
17888
17900
  }, (error) => {
17889
17901
  alert('An unexpected error occured');
@@ -17917,11 +17929,11 @@ class BeheerNavComponent {
17917
17929
  });
17918
17930
  }
17919
17931
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: BeheerNavComponent, deps: [{ token: AuthenticationService }, { token: i3.Router }, { token: FabrikantenApiClient }], target: i0.ɵɵFactoryTarget.Component });
17920
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: BeheerNavComponent, isStandalone: false, selector: "app-beheer-nav", ngImport: i0, template: "<div class=\"main-block\">\r\n <div class=\"row\">\r\n <div class=\"cell left-block\" *ngIf=\"authenticationService.DeTweeSnoekenRights()\">\r\n <button mat-raised-button (click)=\"NavigateTo('searchproducts')\" class=\"link\" [disabled]=\"IsActive('/searchproducts')\">\r\n Zoeken\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('importsets')\" class=\"link\" [disabled]=\"IsActive('/importsets')\">\r\n Import\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('products')\" class=\"link\" [disabled]=\"IsActive('/products')\">\r\n Products\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('filters')\" class=\"link\" [disabled]=\"IsActive('/filters')\">\r\n Filters\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('ebokoppel')\" class=\"link\" [disabled]=\"IsActive('/ebokoppel')\">\r\n EBO Koppel\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('categories')\" class=\"link\" [disabled]=\"IsActive('/categories')\">\r\n Categories\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('deeplink')\" class=\"link\" [disabled]=\"IsActive('/deeplink')\">\r\n Deeplink\r\n </button>\r\n </div>\r\n <div class=\"cell right-block\">\r\n <button mat-raised-button (click)=\"Home()\" class=\"link\">\r\n Home\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"ResetCache()\" class=\"link\">\r\n {{ ResetCacheTitle }}\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights()\" mat-raised-button (click)=\"NavigateTo('settings')\" class=\"link\" [disabled]=\"IsActive('/settings')\">\r\n Settings\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && DocumentsEnabled()\" mat-raised-button (click)=\"NavigateTo('documents')\" class=\"link\" [disabled]=\"IsActive('/documents')\">\r\n Documents\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('translate')\" class=\"link\" [disabled]=\"IsActive('/translate')\">\r\n Translate\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && ShowUploads()\" mat-raised-button (click)=\"NavigateTo('uploads')\" class=\"link\" [disabled]=\"IsActive('/uploads')\">\r\n Files\r\n </button>\r\n <button *ngIf=\"authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('configurator')\" class=\"link\" [disabled]=\"IsActive('/configurator')\">\r\n Configurator\r\n </button>\r\n <button *ngIf=\"authenticationService.AdministratorRights()\" mat-raised-button (click)=\"NavigateTo('users')\" class=\"link\" [disabled]=\"IsActive('/users')\">\r\n Users\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights() && HangfireEnabled()\" mat-raised-button (click)=\"NavigateTo('hangfire')\" class=\"link\" [disabled]=\"IsActive('/hangfire')\">\r\n Hangfire\r\n </button>\r\n <button mat-raised-button (click)=\"LogOff()\" class=\"link\">\r\n Uitloggen\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["app-beheer-nav .main-block{width:100%;display:table}app-beheer-nav .main-block .left-block{text-align:left}app-beheer-nav .main-block .right-block{text-align:right}app-beheer-nav .main-block .row{display:table-row}app-beheer-nav .main-block .cell{display:table-cell}app-beheer-nav .main-block .link{margin:5px}body{background:url(/assets/bouwconnect-achtergrond.png) fixed}.full-width{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }], encapsulation: i0.ViewEncapsulation.None });
17932
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: BeheerNavComponent, isStandalone: false, selector: "app-beheer-nav", ngImport: i0, template: "<div class=\"main-block\">\r\n <div class=\"row\">\r\n <div class=\"cell left-block\" *ngIf=\"authenticationService.DeTweeSnoekenRights()\">\r\n <button mat-raised-button (click)=\"NavigateTo('searchproducts')\" class=\"link\" [disabled]=\"IsActive('/searchproducts')\">\r\n Zoeken\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('importsets')\" class=\"link\" [disabled]=\"IsActive('/importsets')\">\r\n Import\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('products')\" class=\"link\" [disabled]=\"IsActive('/products')\">\r\n Products\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('filters')\" class=\"link\" [disabled]=\"IsActive('/filters')\">\r\n Filters\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('ebokoppel')\" class=\"link\" [disabled]=\"IsActive('/ebokoppel')\">\r\n EBO Koppel\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('categories')\" class=\"link\" [disabled]=\"IsActive('/categories')\">\r\n Categories\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('deeplink')\" class=\"link\" [disabled]=\"IsActive('/deeplink')\">\r\n Deeplink\r\n </button>\r\n </div>\r\n <div class=\"cell right-block\">\r\n <button mat-raised-button (click)=\"Home()\" class=\"link\">\r\n Home\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"ResetCache()\" class=\"link\">\r\n {{ GetResetCacheTitle() }}\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights()\" mat-raised-button (click)=\"NavigateTo('settings')\" class=\"link\" [disabled]=\"IsActive('/settings')\">\r\n Settings\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && DocumentsEnabled()\" mat-raised-button (click)=\"NavigateTo('documents')\" class=\"link\" [disabled]=\"IsActive('/documents')\">\r\n Documents\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('translate')\" class=\"link\" [disabled]=\"IsActive('/translate')\">\r\n Translate\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && ShowUploads()\" mat-raised-button (click)=\"NavigateTo('uploads')\" class=\"link\" [disabled]=\"IsActive('/uploads')\">\r\n Files\r\n </button>\r\n <button *ngIf=\"authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('configurator')\" class=\"link\" [disabled]=\"IsActive('/configurator')\">\r\n Configurator\r\n </button>\r\n <button *ngIf=\"authenticationService.AdministratorRights()\" mat-raised-button (click)=\"NavigateTo('users')\" class=\"link\" [disabled]=\"IsActive('/users')\">\r\n Users\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights() && HangfireEnabled()\" mat-raised-button (click)=\"NavigateTo('hangfire')\" class=\"link\" [disabled]=\"IsActive('/hangfire')\">\r\n Hangfire\r\n </button>\r\n <button mat-raised-button (click)=\"LogOff()\" class=\"link\">\r\n Uitloggen\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["app-beheer-nav .main-block{width:100%;display:table}app-beheer-nav .main-block .left-block{text-align:left}app-beheer-nav .main-block .right-block{text-align:right}app-beheer-nav .main-block .row{display:table-row}app-beheer-nav .main-block .cell{display:table-cell}app-beheer-nav .main-block .link{margin:5px}body{background:url(/assets/bouwconnect-achtergrond.png) fixed}.full-width{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }], encapsulation: i0.ViewEncapsulation.None });
17921
17933
  }
17922
17934
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: BeheerNavComponent, decorators: [{
17923
17935
  type: Component,
17924
- args: [{ selector: 'app-beheer-nav', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"main-block\">\r\n <div class=\"row\">\r\n <div class=\"cell left-block\" *ngIf=\"authenticationService.DeTweeSnoekenRights()\">\r\n <button mat-raised-button (click)=\"NavigateTo('searchproducts')\" class=\"link\" [disabled]=\"IsActive('/searchproducts')\">\r\n Zoeken\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('importsets')\" class=\"link\" [disabled]=\"IsActive('/importsets')\">\r\n Import\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('products')\" class=\"link\" [disabled]=\"IsActive('/products')\">\r\n Products\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('filters')\" class=\"link\" [disabled]=\"IsActive('/filters')\">\r\n Filters\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('ebokoppel')\" class=\"link\" [disabled]=\"IsActive('/ebokoppel')\">\r\n EBO Koppel\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('categories')\" class=\"link\" [disabled]=\"IsActive('/categories')\">\r\n Categories\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('deeplink')\" class=\"link\" [disabled]=\"IsActive('/deeplink')\">\r\n Deeplink\r\n </button>\r\n </div>\r\n <div class=\"cell right-block\">\r\n <button mat-raised-button (click)=\"Home()\" class=\"link\">\r\n Home\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"ResetCache()\" class=\"link\">\r\n {{ ResetCacheTitle }}\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights()\" mat-raised-button (click)=\"NavigateTo('settings')\" class=\"link\" [disabled]=\"IsActive('/settings')\">\r\n Settings\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && DocumentsEnabled()\" mat-raised-button (click)=\"NavigateTo('documents')\" class=\"link\" [disabled]=\"IsActive('/documents')\">\r\n Documents\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('translate')\" class=\"link\" [disabled]=\"IsActive('/translate')\">\r\n Translate\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && ShowUploads()\" mat-raised-button (click)=\"NavigateTo('uploads')\" class=\"link\" [disabled]=\"IsActive('/uploads')\">\r\n Files\r\n </button>\r\n <button *ngIf=\"authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('configurator')\" class=\"link\" [disabled]=\"IsActive('/configurator')\">\r\n Configurator\r\n </button>\r\n <button *ngIf=\"authenticationService.AdministratorRights()\" mat-raised-button (click)=\"NavigateTo('users')\" class=\"link\" [disabled]=\"IsActive('/users')\">\r\n Users\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights() && HangfireEnabled()\" mat-raised-button (click)=\"NavigateTo('hangfire')\" class=\"link\" [disabled]=\"IsActive('/hangfire')\">\r\n Hangfire\r\n </button>\r\n <button mat-raised-button (click)=\"LogOff()\" class=\"link\">\r\n Uitloggen\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["app-beheer-nav .main-block{width:100%;display:table}app-beheer-nav .main-block .left-block{text-align:left}app-beheer-nav .main-block .right-block{text-align:right}app-beheer-nav .main-block .row{display:table-row}app-beheer-nav .main-block .cell{display:table-cell}app-beheer-nav .main-block .link{margin:5px}body{background:url(/assets/bouwconnect-achtergrond.png) fixed}.full-width{width:100%}\n"] }]
17936
+ args: [{ selector: 'app-beheer-nav', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"main-block\">\r\n <div class=\"row\">\r\n <div class=\"cell left-block\" *ngIf=\"authenticationService.DeTweeSnoekenRights()\">\r\n <button mat-raised-button (click)=\"NavigateTo('searchproducts')\" class=\"link\" [disabled]=\"IsActive('/searchproducts')\">\r\n Zoeken\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('importsets')\" class=\"link\" [disabled]=\"IsActive('/importsets')\">\r\n Import\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('products')\" class=\"link\" [disabled]=\"IsActive('/products')\">\r\n Products\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('filters')\" class=\"link\" [disabled]=\"IsActive('/filters')\">\r\n Filters\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('ebokoppel')\" class=\"link\" [disabled]=\"IsActive('/ebokoppel')\">\r\n EBO Koppel\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('categories')\" class=\"link\" [disabled]=\"IsActive('/categories')\">\r\n Categories\r\n </button>\r\n <button mat-raised-button (click)=\"NavigateTo('deeplink')\" class=\"link\" [disabled]=\"IsActive('/deeplink')\">\r\n Deeplink\r\n </button>\r\n </div>\r\n <div class=\"cell right-block\">\r\n <button mat-raised-button (click)=\"Home()\" class=\"link\">\r\n Home\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"ResetCache()\" class=\"link\">\r\n {{ GetResetCacheTitle() }}\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights()\" mat-raised-button (click)=\"NavigateTo('settings')\" class=\"link\" [disabled]=\"IsActive('/settings')\">\r\n Settings\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && DocumentsEnabled()\" mat-raised-button (click)=\"NavigateTo('documents')\" class=\"link\" [disabled]=\"IsActive('/documents')\">\r\n Documents\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('translate')\" class=\"link\" [disabled]=\"IsActive('/translate')\">\r\n Translate\r\n </button>\r\n <button *ngIf=\"!authenticationService.ConfiguratorRights() && ShowUploads()\" mat-raised-button (click)=\"NavigateTo('uploads')\" class=\"link\" [disabled]=\"IsActive('/uploads')\">\r\n Files\r\n </button>\r\n <button *ngIf=\"authenticationService.ConfiguratorRights()\" mat-raised-button (click)=\"NavigateTo('configurator')\" class=\"link\" [disabled]=\"IsActive('/configurator')\">\r\n Configurator\r\n </button>\r\n <button *ngIf=\"authenticationService.AdministratorRights()\" mat-raised-button (click)=\"NavigateTo('users')\" class=\"link\" [disabled]=\"IsActive('/users')\">\r\n Users\r\n </button>\r\n <button *ngIf=\"authenticationService.DeTweeSnoekenRights() && HangfireEnabled()\" mat-raised-button (click)=\"NavigateTo('hangfire')\" class=\"link\" [disabled]=\"IsActive('/hangfire')\">\r\n Hangfire\r\n </button>\r\n <button mat-raised-button (click)=\"LogOff()\" class=\"link\">\r\n Uitloggen\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["app-beheer-nav .main-block{width:100%;display:table}app-beheer-nav .main-block .left-block{text-align:left}app-beheer-nav .main-block .right-block{text-align:right}app-beheer-nav .main-block .row{display:table-row}app-beheer-nav .main-block .cell{display:table-cell}app-beheer-nav .main-block .link{margin:5px}body{background:url(/assets/bouwconnect-achtergrond.png) fixed}.full-width{width:100%}\n"] }]
17925
17937
  }], ctorParameters: () => [{ type: AuthenticationService }, { type: i3.Router }, { type: FabrikantenApiClient }] });
17926
17938
 
17927
17939
  class BeheerMainComponent {
@@ -18273,13 +18285,19 @@ class ProductsService {
18273
18285
  ProductsApiClient;
18274
18286
  authenticationService;
18275
18287
  ImportSetsService;
18276
- LoadingProducts = false;
18288
+ LoadingProductsSignal = signal(false, ...(ngDevMode ? [{ debugName: "LoadingProductsSignal" }] : /* istanbul ignore next */ []));
18277
18289
  ProductsViewModel;
18278
18290
  BCBProductViewModel = undefined;
18279
18291
  ProductViewModel = undefined;
18280
18292
  ProductSelected;
18281
18293
  BCBProductSelected;
18282
18294
  CategorySelected = null;
18295
+ get LoadingProducts() {
18296
+ return this.LoadingProductsSignal();
18297
+ }
18298
+ set LoadingProducts(value) {
18299
+ this.LoadingProductsSignal.set(value);
18300
+ }
18283
18301
  constructor(ProductsApiClient, authenticationService, ImportSetsService) {
18284
18302
  this.ProductsApiClient = ProductsApiClient;
18285
18303
  this.authenticationService = authenticationService;
@@ -20003,7 +20021,8 @@ class FabrikantenService {
20003
20021
  Show2D() {
20004
20022
  if (this.FabrikantenViewModel?.selectedProduct?.fabrikantenBCBProductViewModels != null) {
20005
20023
  for (var i = 0; i < this.FabrikantenViewModel.selectedProduct.fabrikantenBCBProductViewModels.length; i++) {
20006
- if (this.FabrikantenViewModel.selectedProduct.fabrikantenBCBProductViewModels[i].snedes != '') {
20024
+ if (this.FabrikantenViewModel.selectedProduct.fabrikantenBCBProductViewModels[i].snedes != '' &&
20025
+ this.FabrikantenViewModel.selectedProduct.fabrikantenBCBProductViewModels[i].snedes != undefined) {
20007
20026
  return true;
20008
20027
  }
20009
20028
  }
@@ -21114,7 +21133,12 @@ class PhotoService {
21114
21133
  return "";
21115
21134
  }
21116
21135
  else {
21117
- return this.FabrikantenService.FabrikantenSettingsViewModel?.bcbWebserviceURLBase + array[this.FabrikantenService.SelectedPhoto].url;
21136
+ if (array[this.FabrikantenService.SelectedPhoto].url?.startsWith("/assets/")) {
21137
+ return array[this.FabrikantenService.SelectedPhoto].url;
21138
+ }
21139
+ else {
21140
+ return this.FabrikantenService.FabrikantenSettingsViewModel?.bcbWebserviceURLBase + array[this.FabrikantenService.SelectedPhoto].url;
21141
+ }
21118
21142
  }
21119
21143
  }
21120
21144
  GetSelectedDescription() {
@@ -21129,6 +21153,9 @@ class PhotoService {
21129
21153
  ShouldDisplayLeft() {
21130
21154
  return this.FabrikantenService.SelectedPhoto != 0;
21131
21155
  }
21156
+ ShouldDisplayActionMenu() {
21157
+ return this.FabrikantenService.FabrikantenSettingsViewModel?.informationAddActionMenu == true;
21158
+ }
21132
21159
  ShouldDisplayRight() {
21133
21160
  var array = this.GetPhotoArray();
21134
21161
  return array.length != (this.FabrikantenService.SelectedPhoto + 1);
@@ -23803,6 +23830,20 @@ class FabFilterComponent {
23803
23830
  this.SelectedOptionId = options[0].id;
23804
23831
  }
23805
23832
  }
23833
+ if (this.SelectedOptionId == 0 && this._filter.defaultOption != undefined) {
23834
+ var set = false;
23835
+ if (this._filter.options != null) {
23836
+ for (var i = 0; i < this._filter.options.length; i++) {
23837
+ if (this._filter.options[i].id == this._filter.defaultOption) {
23838
+ set = true;
23839
+ break;
23840
+ }
23841
+ }
23842
+ }
23843
+ if (set) {
23844
+ this.SelectedOptionId = this._filter.defaultOption;
23845
+ }
23846
+ }
23806
23847
  }
23807
23848
  filterchanged = new EventEmitter();
23808
23849
  selectoption = new EventEmitter();
@@ -23825,6 +23866,7 @@ class FabFilterComponent {
23825
23866
  filterid: this.filter.id,
23826
23867
  filteroptionid: this.SelectedOptionId
23827
23868
  });
23869
+ //alert(this.SelectedOptionId);
23828
23870
  //this.FabrikantenService.SelectOption(this.filter.id, this.SelectedOptionId, this.ChangeDetectorRef, this.ActivatedRoute);
23829
23871
  }
23830
23872
  ResetSelection() {
@@ -23916,11 +23958,11 @@ class FabFilterComponent {
23916
23958
  return result;
23917
23959
  }
23918
23960
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabFilterComponent, deps: [{ token: FabrikantenService }, { token: TranslateService }, { token: i3.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
23919
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabFilterComponent, isStandalone: false, selector: "app-fab-filter", inputs: { filter: "filter" }, outputs: { filterchanged: "filterchanged", selectoption: "selectoption" }, ngImport: i0, template: "<div class=\"row\" *ngIf=\"!filter.hidden\">\r\n <div class=\"select\" (click)=\"Click()\" [ngClass]=\"{'selectoption': filter.selectedOption != 0 }\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width\">\r\n <mat-label class=\"select-mat-label filter-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Filter, TranslationSubCategory.Name, filter.id) }}\r\n <ng-container *ngIf=\"filter.blocksProductSelect || FabrikantenService.IsAProductSelected()\">\r\n <span *ngIf=\"filter.blocksProductSelect || filter.required\">*&nbsp;</span>\r\n <span *ngIf=\"filter.affectsOnlyBestek\"><sup>1</sup></span>\r\n </ng-container>\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedOptionId\" (selectionChange)=\"SelectOption()\" [disabled]=\"IsDisabled()\">\r\n <ng-container *ngFor=\"let option of filter.options\">\r\n <mat-option [value]=\"option.id\" class=\"select-mat-option\" *ngIf=\"!option.hidden\">\r\n <ng-container *ngIf=\"option.colour != null && option.colour != ''\">\r\n <span [ngStyle]=\"{'background-color': option.colour}\" class=\"colour-preview\">\r\n &nbsp;\r\n &nbsp;\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.imagePath != null && option.imagePath != ''\">\r\n <div class=\"filter-option-image-div\">\r\n <img src=\"{{ GetImagePath(option) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n <span class=\"name-span\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </span>\r\n <span *ngIf=\"filter.unit != null\" class=\"name-span unit-span\">\r\n &nbsp;{{ filter.unit }}\r\n </span>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <p *ngIf=\"ShowDescription()\" class=\"description-block\">{{ GetDescription() }}</p>\r\n </div>\r\n <div *ngIf=\"GetSelectedOption() != null && GetSelectedOption().colour != null && GetSelectedOption().colour != ''\">\r\n <div [ngStyle]=\"{'background-color': GetSelectedOption().colour}\" class=\"colour-preview-selected\">\r\n &nbsp;\r\n &nbsp;\r\n </div>\r\n </div>\r\n <div class=\"reset\" *ngIf=\"filter.selectedOption != 0\" (click)=\"ResetSelection()\">\r\n <mat-icon class=\"icon-position clear\" [inline]=\"true\">clear</mat-icon>\r\n </div>\r\n</div>\r\n<div *ngFor=\"let description of filter.descriptions\" class=\"description-block\">\r\n {{ description.description }}\r\n</div>\r\n", styles: ["app-fab-filter .description-block{padding-bottom:15px;font-size:12px}app-fab-filter .selectoption{cursor:pointer!important}app-fab-filter .mat-select-value{cursor:pointer!important}app-fab-filter .row{display:flex}app-fab-filter .full-width{width:100%}app-fab-filter .icon-position{margin-top:14px}app-fab-filter .select{flex:auto}app-fab-filter .reset{cursor:pointer;font-size:26px}app-fab-filter .colour-preview-selected{padding:5px;margin-left:5px;margin-top:8px;border:1px solid #000}.mat-select-min-line:first-letter{text-transform:capitalize}.filter-name:first-letter{text-transform:capitalize}.colour-preview{padding:5px;border:1px solid #000;line-height:20px;margin:10px}.name-span{line-height:52px}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-select-disabled .mat-select-arrow{display:none}.mat-select-panel-wrap{top:15px;position:relative}.mat-select-panel{max-width:100%!important}.filter-option-image{max-width:40px;max-height:40px}.filter-option-image-div{max-height:40px;padding-right:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }], encapsulation: i0.ViewEncapsulation.None });
23961
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabFilterComponent, isStandalone: false, selector: "app-fab-filter", inputs: { filter: "filter" }, outputs: { filterchanged: "filterchanged", selectoption: "selectoption" }, ngImport: i0, template: "<div class=\"row\" *ngIf=\"!filter.hidden\">\r\n <div class=\"select\" (click)=\"Click()\" [ngClass]=\"{'selectoption': filter.selectedOption != 0 }\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width\">\r\n <mat-label class=\"select-mat-label filter-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Filter, TranslationSubCategory.Name, filter.id) }}\r\n <ng-container *ngIf=\"filter.blocksProductSelect || FabrikantenService.IsAProductSelected()\">\r\n <span *ngIf=\"filter.blocksProductSelect || filter.required\">*&nbsp;</span>\r\n <span *ngIf=\"filter.affectsOnlyBestek\"><sup>1</sup></span>\r\n </ng-container>\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedOptionId\" [disabled]=\"IsDisabled()\">\r\n <ng-container *ngFor=\"let option of filter.options\">\r\n <mat-option [value]=\"option.id\" class=\"select-mat-option\" *ngIf=\"!option.hidden\" (click)=\"SelectOption()\">\r\n <ng-container *ngIf=\"option.colour != null && option.colour != ''\">\r\n <span [ngStyle]=\"{'background-color': option.colour}\" class=\"colour-preview\">\r\n &nbsp;\r\n &nbsp;\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.imagePath != null && option.imagePath != ''\">\r\n <div class=\"filter-option-image-div\">\r\n <img src=\"{{ GetImagePath(option) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n <span class=\"name-span\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </span>\r\n <span *ngIf=\"filter.unit != null\" class=\"name-span unit-span\">\r\n &nbsp;{{ filter.unit }}\r\n </span>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <p *ngIf=\"ShowDescription()\" class=\"description-block\">{{ GetDescription() }}</p>\r\n </div>\r\n <div *ngIf=\"GetSelectedOption() != null && GetSelectedOption().colour != null && GetSelectedOption().colour != ''\">\r\n <div [ngStyle]=\"{'background-color': GetSelectedOption().colour}\" class=\"colour-preview-selected\">\r\n &nbsp;\r\n &nbsp;\r\n </div>\r\n </div>\r\n <div class=\"reset\" *ngIf=\"filter.selectedOption != 0\" (click)=\"ResetSelection()\">\r\n <mat-icon class=\"icon-position clear\" [inline]=\"true\">clear</mat-icon>\r\n </div>\r\n</div>\r\n<div *ngFor=\"let description of filter.descriptions\" class=\"description-block\">\r\n {{ description.description }}\r\n</div>\r\n", styles: ["app-fab-filter .description-block{padding-bottom:15px;font-size:12px}app-fab-filter .selectoption{cursor:pointer!important}app-fab-filter .mat-select-value{cursor:pointer!important}app-fab-filter .row{display:flex}app-fab-filter .full-width{width:100%}app-fab-filter .icon-position{margin-top:14px}app-fab-filter .select{flex:auto}app-fab-filter .reset{cursor:pointer;font-size:26px}app-fab-filter .colour-preview-selected{padding:5px;margin-left:5px;margin-top:8px;border:1px solid #000}.mat-select-min-line:first-letter{text-transform:capitalize}.filter-name:first-letter{text-transform:capitalize}.colour-preview{padding:5px;border:1px solid #000;line-height:20px;margin:10px}.name-span{line-height:52px}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-select-disabled .mat-select-arrow{display:none}.mat-select-panel-wrap{top:15px;position:relative}.mat-select-panel{max-width:100%!important}.filter-option-image{max-width:40px;max-height:40px}.filter-option-image-div{max-height:40px;padding-right:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }], encapsulation: i0.ViewEncapsulation.None });
23920
23962
  }
23921
23963
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabFilterComponent, decorators: [{
23922
23964
  type: Component,
23923
- args: [{ selector: 'app-fab-filter', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"row\" *ngIf=\"!filter.hidden\">\r\n <div class=\"select\" (click)=\"Click()\" [ngClass]=\"{'selectoption': filter.selectedOption != 0 }\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width\">\r\n <mat-label class=\"select-mat-label filter-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Filter, TranslationSubCategory.Name, filter.id) }}\r\n <ng-container *ngIf=\"filter.blocksProductSelect || FabrikantenService.IsAProductSelected()\">\r\n <span *ngIf=\"filter.blocksProductSelect || filter.required\">*&nbsp;</span>\r\n <span *ngIf=\"filter.affectsOnlyBestek\"><sup>1</sup></span>\r\n </ng-container>\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedOptionId\" (selectionChange)=\"SelectOption()\" [disabled]=\"IsDisabled()\">\r\n <ng-container *ngFor=\"let option of filter.options\">\r\n <mat-option [value]=\"option.id\" class=\"select-mat-option\" *ngIf=\"!option.hidden\">\r\n <ng-container *ngIf=\"option.colour != null && option.colour != ''\">\r\n <span [ngStyle]=\"{'background-color': option.colour}\" class=\"colour-preview\">\r\n &nbsp;\r\n &nbsp;\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.imagePath != null && option.imagePath != ''\">\r\n <div class=\"filter-option-image-div\">\r\n <img src=\"{{ GetImagePath(option) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n <span class=\"name-span\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </span>\r\n <span *ngIf=\"filter.unit != null\" class=\"name-span unit-span\">\r\n &nbsp;{{ filter.unit }}\r\n </span>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <p *ngIf=\"ShowDescription()\" class=\"description-block\">{{ GetDescription() }}</p>\r\n </div>\r\n <div *ngIf=\"GetSelectedOption() != null && GetSelectedOption().colour != null && GetSelectedOption().colour != ''\">\r\n <div [ngStyle]=\"{'background-color': GetSelectedOption().colour}\" class=\"colour-preview-selected\">\r\n &nbsp;\r\n &nbsp;\r\n </div>\r\n </div>\r\n <div class=\"reset\" *ngIf=\"filter.selectedOption != 0\" (click)=\"ResetSelection()\">\r\n <mat-icon class=\"icon-position clear\" [inline]=\"true\">clear</mat-icon>\r\n </div>\r\n</div>\r\n<div *ngFor=\"let description of filter.descriptions\" class=\"description-block\">\r\n {{ description.description }}\r\n</div>\r\n", styles: ["app-fab-filter .description-block{padding-bottom:15px;font-size:12px}app-fab-filter .selectoption{cursor:pointer!important}app-fab-filter .mat-select-value{cursor:pointer!important}app-fab-filter .row{display:flex}app-fab-filter .full-width{width:100%}app-fab-filter .icon-position{margin-top:14px}app-fab-filter .select{flex:auto}app-fab-filter .reset{cursor:pointer;font-size:26px}app-fab-filter .colour-preview-selected{padding:5px;margin-left:5px;margin-top:8px;border:1px solid #000}.mat-select-min-line:first-letter{text-transform:capitalize}.filter-name:first-letter{text-transform:capitalize}.colour-preview{padding:5px;border:1px solid #000;line-height:20px;margin:10px}.name-span{line-height:52px}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-select-disabled .mat-select-arrow{display:none}.mat-select-panel-wrap{top:15px;position:relative}.mat-select-panel{max-width:100%!important}.filter-option-image{max-width:40px;max-height:40px}.filter-option-image-div{max-height:40px;padding-right:4px}\n"] }]
23965
+ args: [{ selector: 'app-fab-filter', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"row\" *ngIf=\"!filter.hidden\">\r\n <div class=\"select\" (click)=\"Click()\" [ngClass]=\"{'selectoption': filter.selectedOption != 0 }\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width\">\r\n <mat-label class=\"select-mat-label filter-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Filter, TranslationSubCategory.Name, filter.id) }}\r\n <ng-container *ngIf=\"filter.blocksProductSelect || FabrikantenService.IsAProductSelected()\">\r\n <span *ngIf=\"filter.blocksProductSelect || filter.required\">*&nbsp;</span>\r\n <span *ngIf=\"filter.affectsOnlyBestek\"><sup>1</sup></span>\r\n </ng-container>\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedOptionId\" [disabled]=\"IsDisabled()\">\r\n <ng-container *ngFor=\"let option of filter.options\">\r\n <mat-option [value]=\"option.id\" class=\"select-mat-option\" *ngIf=\"!option.hidden\" (click)=\"SelectOption()\">\r\n <ng-container *ngIf=\"option.colour != null && option.colour != ''\">\r\n <span [ngStyle]=\"{'background-color': option.colour}\" class=\"colour-preview\">\r\n &nbsp;\r\n &nbsp;\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.imagePath != null && option.imagePath != ''\">\r\n <div class=\"filter-option-image-div\">\r\n <img src=\"{{ GetImagePath(option) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n <span class=\"name-span\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </span>\r\n <span *ngIf=\"filter.unit != null\" class=\"name-span unit-span\">\r\n &nbsp;{{ filter.unit }}\r\n </span>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <p *ngIf=\"ShowDescription()\" class=\"description-block\">{{ GetDescription() }}</p>\r\n </div>\r\n <div *ngIf=\"GetSelectedOption() != null && GetSelectedOption().colour != null && GetSelectedOption().colour != ''\">\r\n <div [ngStyle]=\"{'background-color': GetSelectedOption().colour}\" class=\"colour-preview-selected\">\r\n &nbsp;\r\n &nbsp;\r\n </div>\r\n </div>\r\n <div class=\"reset\" *ngIf=\"filter.selectedOption != 0\" (click)=\"ResetSelection()\">\r\n <mat-icon class=\"icon-position clear\" [inline]=\"true\">clear</mat-icon>\r\n </div>\r\n</div>\r\n<div *ngFor=\"let description of filter.descriptions\" class=\"description-block\">\r\n {{ description.description }}\r\n</div>\r\n", styles: ["app-fab-filter .description-block{padding-bottom:15px;font-size:12px}app-fab-filter .selectoption{cursor:pointer!important}app-fab-filter .mat-select-value{cursor:pointer!important}app-fab-filter .row{display:flex}app-fab-filter .full-width{width:100%}app-fab-filter .icon-position{margin-top:14px}app-fab-filter .select{flex:auto}app-fab-filter .reset{cursor:pointer;font-size:26px}app-fab-filter .colour-preview-selected{padding:5px;margin-left:5px;margin-top:8px;border:1px solid #000}.mat-select-min-line:first-letter{text-transform:capitalize}.filter-name:first-letter{text-transform:capitalize}.colour-preview{padding:5px;border:1px solid #000;line-height:20px;margin:10px}.name-span{line-height:52px}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-select-disabled .mat-select-arrow{display:none}.mat-select-panel-wrap{top:15px;position:relative}.mat-select-panel{max-width:100%!important}.filter-option-image{max-width:40px;max-height:40px}.filter-option-image-div{max-height:40px;padding-right:4px}\n"] }]
23924
23966
  }], ctorParameters: () => [{ type: FabrikantenService }, { type: TranslateService }, { type: i3.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { filter: [{
23925
23967
  type: Input
23926
23968
  }], filterchanged: [{
@@ -24109,11 +24151,11 @@ class FabFormComponent {
24109
24151
  return false;
24110
24152
  }
24111
24153
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabFormComponent, deps: [{ token: i6$1.FormBuilder }, { token: FabrikantenApiClient }, { token: FabrikantenService }, { token: TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
24112
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabFormComponent, isStandalone: false, selector: "app-fab-form", inputs: { form: "form", instanceid: "instanceid" }, outputs: { completed: "completed" }, ngImport: i0, template: "<form [formGroup]=\"FormGroup\">\n <ng-container *ngFor=\"let cat of form.formCategories\">\n <div class=\"form-cat-name\" [ngClass]=\"'cat-' + cat.id\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Category, cat.id) }}\n </div>\n <ng-container *ngFor=\"let row of cat.rows\">\n <div class=\"form-cat-inputs displayflex\">\n <div class=\"form-cat-input\" *ngFor=\"let input of row.inputs\">\n <ng-container *ngIf=\"input.formInputType == 1 || input.formInputType == 6\">\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-input\">\n <mat-label>\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\n </mat-label>\n <input matInput type=\"text\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\n <mat-error></mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 2\">\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-select\">\n <mat-label class=\"select-mat-label filter-name\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\n </mat-label>\n <mat-select formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\n <ng-container *ngFor=\"let option of input.options\">\n <mat-option [value]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id)\" class=\"select-mat-option\">\n <span class=\"name-span\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id) }}\n </span>\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 3 || input.formInputType == 7\">\n <mat-checkbox class=\"form-cat-input-checkbox\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.checked\">\n <span [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\n </mat-checkbox>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 8\">\n <span class=\"form-input-text\" [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 5\">\n <mat-form-field class=\"full-width form-cat-input-textarea\">\n <mat-label>\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\n </mat-label>\n <textarea matInput formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\" style=\"height: 100px;\"></textarea>\n </mat-form-field>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <div class=\"form-button-row\">\n <div class=\"mandatory-text\" *ngIf=\"ShowMandatoryText()\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.RequiredField) }}\n </div>\n <button mat-raised-button (click)=\"Close()\" class=\"form-cat-close form-button-row-button\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Close) }}\n </button>\n <ng-container *ngIf=\"AllowSkip()\">\n <button mat-raised-button (click)=\"Skip()\" class=\"form-cat-close form-button-row-button\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Skip) }}\n </button>\n </ng-container>\n <button mat-raised-button (click)=\"OnSubmit()\" class=\"form-cat-submit form-button-row-button\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Send) }}\n </button>\n </div>\n</form>\n", styles: ["app-fab-form .mat-form-field-wrapper{padding-bottom:0}app-fab-form .mat-form-field-underline{bottom:0}app-fab-form .displayflex{display:flex}app-fab-form .form-cat-name{border-bottom:1px solid #000;font-size:20px;padding:5px}app-fab-form .form-cat-input{padding:3px;width:100%}app-fab-form .form-button-row{text-align:right}app-fab-form .form-button-row-button{margin:5px}app-fab-form .full-width{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], encapsulation: i0.ViewEncapsulation.None });
24154
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabFormComponent, isStandalone: false, selector: "app-fab-form", inputs: { form: "form", instanceid: "instanceid" }, outputs: { completed: "completed" }, ngImport: i0, template: "<form [formGroup]=\"FormGroup\">\r\n <ng-container *ngFor=\"let cat of form.formCategories\">\r\n <div class=\"form-cat-name\" [ngClass]=\"'cat-' + cat.id\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Category, cat.id) }}\r\n </div>\r\n <ng-container *ngFor=\"let row of cat.rows\">\r\n <div class=\"form-cat-inputs displayflex\">\r\n <div class=\"form-cat-input\" *ngFor=\"let input of row.inputs\">\r\n <ng-container *ngIf=\"input.formInputType == 1 || input.formInputType == 6\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\r\n </mat-label>\r\n <input matInput type=\"text\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\r\n <mat-error></mat-error>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 2\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-select\">\r\n <mat-label class=\"select-mat-label filter-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\r\n </mat-label>\r\n <mat-select formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\r\n <ng-container *ngFor=\"let option of input.options\">\r\n <mat-option [value]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id)\" class=\"select-mat-option\">\r\n <span class=\"name-span\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id) }}\r\n </span>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 3 || input.formInputType == 7\">\r\n <mat-checkbox class=\"form-cat-input-checkbox\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.checked\">\r\n <span [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\r\n </mat-checkbox>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 8\">\r\n <span class=\"form-input-text\" [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 5\">\r\n <mat-form-field class=\"full-width form-cat-input-textarea\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\r\n </mat-label>\r\n <textarea matInput formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\" style=\"height: 100px;\"></textarea>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <div class=\"form-button-row\">\r\n <div class=\"mandatory-text\" *ngIf=\"ShowMandatoryText()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.RequiredField) }}\r\n </div>\r\n <button mat-raised-button (click)=\"Close()\" class=\"form-cat-close form-button-row-button\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Close) }}\r\n </button>\r\n <ng-container *ngIf=\"AllowSkip()\">\r\n <button mat-raised-button (click)=\"Skip()\" class=\"form-cat-close form-button-row-button\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Skip) }}\r\n </button>\r\n </ng-container>\r\n <button mat-raised-button (click)=\"OnSubmit()\" class=\"form-cat-submit form-button-row-button\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Send) }}\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["app-fab-form .mat-form-field-wrapper{padding-bottom:0}app-fab-form .mat-form-field-underline{bottom:0}app-fab-form .displayflex{display:flex}app-fab-form .form-cat-name{border-bottom:1px solid #000;font-size:20px;padding:5px}app-fab-form .form-cat-input{padding:3px;width:100%}app-fab-form .form-button-row{text-align:right}app-fab-form .form-button-row-button{margin:5px}app-fab-form .full-width{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], encapsulation: i0.ViewEncapsulation.None });
24113
24155
  }
24114
24156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabFormComponent, decorators: [{
24115
24157
  type: Component,
24116
- args: [{ selector: 'app-fab-form', standalone: false, encapsulation: ViewEncapsulation.None, template: "<form [formGroup]=\"FormGroup\">\n <ng-container *ngFor=\"let cat of form.formCategories\">\n <div class=\"form-cat-name\" [ngClass]=\"'cat-' + cat.id\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Category, cat.id) }}\n </div>\n <ng-container *ngFor=\"let row of cat.rows\">\n <div class=\"form-cat-inputs displayflex\">\n <div class=\"form-cat-input\" *ngFor=\"let input of row.inputs\">\n <ng-container *ngIf=\"input.formInputType == 1 || input.formInputType == 6\">\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-input\">\n <mat-label>\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\n </mat-label>\n <input matInput type=\"text\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\n <mat-error></mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 2\">\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-select\">\n <mat-label class=\"select-mat-label filter-name\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\n </mat-label>\n <mat-select formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\n <ng-container *ngFor=\"let option of input.options\">\n <mat-option [value]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id)\" class=\"select-mat-option\">\n <span class=\"name-span\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id) }}\n </span>\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 3 || input.formInputType == 7\">\n <mat-checkbox class=\"form-cat-input-checkbox\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.checked\">\n <span [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\n </mat-checkbox>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 8\">\n <span class=\"form-input-text\" [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\n </ng-container>\n\n <ng-container *ngIf=\"input.formInputType == 5\">\n <mat-form-field class=\"full-width form-cat-input-textarea\">\n <mat-label>\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\n </mat-label>\n <textarea matInput formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\" style=\"height: 100px;\"></textarea>\n </mat-form-field>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <div class=\"form-button-row\">\n <div class=\"mandatory-text\" *ngIf=\"ShowMandatoryText()\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.RequiredField) }}\n </div>\n <button mat-raised-button (click)=\"Close()\" class=\"form-cat-close form-button-row-button\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Close) }}\n </button>\n <ng-container *ngIf=\"AllowSkip()\">\n <button mat-raised-button (click)=\"Skip()\" class=\"form-cat-close form-button-row-button\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Skip) }}\n </button>\n </ng-container>\n <button mat-raised-button (click)=\"OnSubmit()\" class=\"form-cat-submit form-button-row-button\">\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Send) }}\n </button>\n </div>\n</form>\n", styles: ["app-fab-form .mat-form-field-wrapper{padding-bottom:0}app-fab-form .mat-form-field-underline{bottom:0}app-fab-form .displayflex{display:flex}app-fab-form .form-cat-name{border-bottom:1px solid #000;font-size:20px;padding:5px}app-fab-form .form-cat-input{padding:3px;width:100%}app-fab-form .form-button-row{text-align:right}app-fab-form .form-button-row-button{margin:5px}app-fab-form .full-width{width:100%}\n"] }]
24158
+ args: [{ selector: 'app-fab-form', standalone: false, encapsulation: ViewEncapsulation.None, template: "<form [formGroup]=\"FormGroup\">\r\n <ng-container *ngFor=\"let cat of form.formCategories\">\r\n <div class=\"form-cat-name\" [ngClass]=\"'cat-' + cat.id\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Category, cat.id) }}\r\n </div>\r\n <ng-container *ngFor=\"let row of cat.rows\">\r\n <div class=\"form-cat-inputs displayflex\">\r\n <div class=\"form-cat-input\" *ngFor=\"let input of row.inputs\">\r\n <ng-container *ngIf=\"input.formInputType == 1 || input.formInputType == 6\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\r\n </mat-label>\r\n <input matInput type=\"text\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\r\n <mat-error></mat-error>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 2\">\r\n <mat-form-field appearance=\"fill\" class=\"full-width form-cat-input-select\">\r\n <mat-label class=\"select-mat-label filter-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\r\n </mat-label>\r\n <mat-select formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\">\r\n <ng-container *ngFor=\"let option of input.options\">\r\n <mat-option [value]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id)\" class=\"select-mat-option\">\r\n <span class=\"name-span\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Option, option.id) }}\r\n </span>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 3 || input.formInputType == 7\">\r\n <mat-checkbox class=\"form-cat-input-checkbox\" formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.checked\">\r\n <span [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\r\n </mat-checkbox>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 8\">\r\n <span class=\"form-input-text\" [innerHTML]=\"TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id)\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"input.formInputType == 5\">\r\n <mat-form-field class=\"full-width form-cat-input-textarea\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Forms, TranslationSubCategory.Input, input.id) }}\r\n </mat-label>\r\n <textarea matInput formControlName=\"{{ input.name }}\" [(ngModel)]=\"input.value\" style=\"height: 100px;\"></textarea>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <div class=\"form-button-row\">\r\n <div class=\"mandatory-text\" *ngIf=\"ShowMandatoryText()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.RequiredField) }}\r\n </div>\r\n <button mat-raised-button (click)=\"Close()\" class=\"form-cat-close form-button-row-button\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Close) }}\r\n </button>\r\n <ng-container *ngIf=\"AllowSkip()\">\r\n <button mat-raised-button (click)=\"Skip()\" class=\"form-cat-close form-button-row-button\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Skip) }}\r\n </button>\r\n </ng-container>\r\n <button mat-raised-button (click)=\"OnSubmit()\" class=\"form-cat-submit form-button-row-button\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Send) }}\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["app-fab-form .mat-form-field-wrapper{padding-bottom:0}app-fab-form .mat-form-field-underline{bottom:0}app-fab-form .displayflex{display:flex}app-fab-form .form-cat-name{border-bottom:1px solid #000;font-size:20px;padding:5px}app-fab-form .form-cat-input{padding:3px;width:100%}app-fab-form .form-button-row{text-align:right}app-fab-form .form-button-row-button{margin:5px}app-fab-form .full-width{width:100%}\n"] }]
24117
24159
  }], ctorParameters: () => [{ type: i6$1.FormBuilder }, { type: FabrikantenApiClient }, { type: FabrikantenService }, { type: TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { form: [{
24118
24160
  type: Input
24119
24161
  }], instanceid: [{
@@ -28783,6 +28825,9 @@ class FabFiltersInputComponent {
28783
28825
  }
28784
28826
  return false;
28785
28827
  }
28828
+ ShowAccordion() {
28829
+ return this.FabrikantenService.FabrikantenSettingsViewModel?.stepperFoldable == true;
28830
+ }
28786
28831
  ShowAffectsOnlyBestek() {
28787
28832
  if (this.FabrikantenService.FabrikantenViewModel?.selectedProduct != null) {
28788
28833
  if (this.FabrikantenService.FabrikantenViewModel?.inputs != null) {
@@ -28829,11 +28874,11 @@ class FabFiltersInputComponent {
28829
28874
  return "disabled_af";
28830
28875
  }
28831
28876
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabFiltersInputComponent, deps: [{ token: i3.Router }, { token: FabrikantenService }, { token: TranslateService }, { token: FabrikantenApiClient }, { token: ConfiguratorApiClient }, { token: AuthenticationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
28832
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabFiltersInputComponent, isStandalone: false, selector: "fab-filters-input", inputs: { displayExtra: "displayExtra" }, ngImport: i0, template: "<div class=\"filter-view-margin\">\r\n <div class=\"filter-view-header\">\r\n <ng-container *ngIf=\"ShowInputCode()\">\r\n <div>\r\n <div class=\"filter-view-header-h1\">\r\n <h1 class=\"h1-auto\">{{ GetHeaderName() }}</h1>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </div>\r\n <div>\r\n <app-fab-input-code></app-fab-input-code>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ShowInputCode()\">\r\n <div class=\"filter-view-header-h1\">\r\n <h1>{{ GetHeaderName() }}</h1>\r\n </div>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!ShowCategories()\">\r\n <div class=\"inputs-container\" [ngClass]=\"{'two-columns': ShowTwoColumns() }\">\r\n <ng-container *ngFor=\"let inputviewmodel of FabrikantenService.FabrikantenViewModel.inputs; index as i\">\r\n <ng-container *ngIf=\"!inputviewmodel.extra || displayExtra\">\r\n <app-fab-input [input]=\"inputviewmodel\" [ngClass]=\"{'col1': i % 2 == 0, 'col2': i % 2 == 1 }\"></app-fab-input>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"ShowAffectsOnlyBestek()\">\r\n <div class=\"affects-only-bestek\">\r\n <span><sup>1</sup></span>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AffectsOnlyBestek) }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"ShowCategories()\">\r\n <mat-stepper orientation=\"vertical\" [linear]=\"true\" #stepper>\r\n <ng-template matStepperIcon=\"edit\" let-index=\"index\">\r\n {{ index + 1 }}\r\n </ng-template>\r\n\r\n <mat-step *ngFor=\"let cat of FabrikantenService.FabrikantenViewModel.filterCategories\" state=\"{{ cat.id }}\" [completed]=\"cat.completed\" [aria-labelledby]=\"GetHeaderAriaLabel(cat)\" [class.completed-step]=\"cat.completed\">\r\n <ng-template matStepLabel>\r\n <div class=\"step-name-div\">\r\n <div class=\"step-name-completed\" *ngIf=\"cat.completed\">\r\n <mat-icon class=\"step-name-completed-icon\">done</mat-icon>\r\n </div>\r\n <div class=\"step-name-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterCategory, TranslationSubCategory.Name, cat.id) }}\r\n </div>\r\n <div class=\"step-name-icon\" *ngIf=\"cat.icon != null\">\r\n <span class=\"helper\"></span>\r\n <img [src]=\"cat.icon\" class=\"filter-category-icon\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngFor=\"let inputviewmodel of cat.inputs\">\r\n <app-fab-input [input]=\"inputviewmodel\"></app-fab-input>\r\n </ng-container>\r\n </mat-step>\r\n </mat-stepper>\r\n </div>\r\n</div>\r\n", styles: ["fab-filters-input .mat-step-header{cursor:pointer!important}fab-filters-input .filter-view-header-h1{display:flex}fab-filters-input .h1-auto{flex:auto}fab-filters-input .two-columns{display:flex;flex-wrap:wrap}fab-filters-input .mat-step-header[aria-labelledby=disabled_af]{cursor:not-allowed!important;opacity:.6}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon{background-color:#000}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon-selected{background-color:#3f51b5}fab-filters-input .filter-view-header{display:flex}fab-filters-input .filter-view-header-h1{flex:auto;text-transform:capitalize}fab-filters-input .step-name-icon{height:54px;white-space:nowrap;text-align:center;margin:auto 0}fab-filters-input .step-name-completed{height:54px;display:flex;align-items:center}fab-filters-input .step-name-div{width:100%}fab-filters-input .filter-category-icon{height:48px;vertical-align:middle}fab-filters-input .mat-step-text-label{width:100%}fab-filters-input .mat-step-label{width:100%}fab-filters-input .step-name-name{line-height:56px}fab-filters-input .helper{display:inline-block;height:100%;vertical-align:middle}fab-filters-input .filter-view-margin{padding:10px}fab-filters-input .filter-view-header-reset{cursor:pointer}fab-filters-input .mat-vertical-content-container{padding-top:10px}fab-filters-input .mat-vertical-content{padding:0}fab-filters-input .step-name-div{display:flex}fab-filters-input .step-name-name{flex:auto}fab-filters-input .save-conf-div{padding:15px}fab-filters-input .save-conf-div mat-spinner{margin:auto}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8$2.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i8$2.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i8$2.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i8$2.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "component", type: FabInputCodeComponent, selector: "app-fab-input-code" }, { kind: "component", type: FabInputComponent, selector: "app-fab-input", inputs: ["input"] }], encapsulation: i0.ViewEncapsulation.None });
28877
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: FabFiltersInputComponent, isStandalone: false, selector: "fab-filters-input", inputs: { displayExtra: "displayExtra" }, ngImport: i0, template: "<div class=\"filter-view-margin\">\r\n <div class=\"filter-view-header\">\r\n <ng-container *ngIf=\"ShowInputCode()\">\r\n <div>\r\n <div class=\"filter-view-header-h1\">\r\n <h1 class=\"h1-auto\">{{ GetHeaderName() }}</h1>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </div>\r\n <div>\r\n <app-fab-input-code></app-fab-input-code>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ShowInputCode()\">\r\n <div class=\"filter-view-header-h1\">\r\n <h1>{{ GetHeaderName() }}</h1>\r\n </div>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!ShowCategories()\">\r\n <div class=\"inputs-container\" [ngClass]=\"{'two-columns': ShowTwoColumns() }\">\r\n <ng-container *ngFor=\"let inputviewmodel of FabrikantenService.FabrikantenViewModel.inputs; index as i\">\r\n <ng-container *ngIf=\"!inputviewmodel.extra || displayExtra\">\r\n <app-fab-input [input]=\"inputviewmodel\" [ngClass]=\"{'col1': i % 2 == 0, 'col2': i % 2 == 1 }\"></app-fab-input>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"ShowAffectsOnlyBestek()\">\r\n <div class=\"affects-only-bestek\">\r\n <span><sup>1</sup></span>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AffectsOnlyBestek) }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"ShowCategories()\">\r\n @if (ShowAccordion()) {\r\n <mat-accordion [multi]=\"false\">\r\n <mat-expansion-panel *ngFor=\"let cat of FabrikantenService.FabrikantenViewModel.filterCategories; let index = index\"\r\n [expanded]=\"index === 0\"\r\n [class.completed-step]=\"cat.completed\">\r\n <mat-expansion-panel-header [attr.aria-label]=\"GetHeaderAriaLabel(cat)\">\r\n <mat-panel-title>\r\n <div class=\"step-name-div\">\r\n <div class=\"accordion-step-number\">\r\n {{ index + 1 }}\r\n </div>\r\n\r\n <div class=\"step-name-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterCategory, TranslationSubCategory.Name, cat.id) }}\r\n </div>\r\n\r\n <div class=\"step-name-icon\"\r\n *ngIf=\"cat.icon != null\">\r\n <span class=\"helper\"></span>\r\n\r\n <img [src]=\"cat.icon\"\r\n class=\"filter-category-icon\"\r\n alt=\"\" />\r\n </div>\r\n </div>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container *ngFor=\"let inputviewmodel of cat.inputs\">\r\n <app-fab-input [input]=\"inputviewmodel\"></app-fab-input>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n } @else {\r\n <mat-stepper orientation=\"vertical\" [linear]=\"true\" #stepper>\r\n <ng-template matStepperIcon=\"edit\" let-index=\"index\">\r\n {{ index + 1 }}\r\n </ng-template>\r\n\r\n <mat-step *ngFor=\"let cat of FabrikantenService.FabrikantenViewModel.filterCategories\" state=\"{{ cat.id }}\" [completed]=\"cat.completed\" [aria-labelledby]=\"GetHeaderAriaLabel(cat)\" [class.completed-step]=\"cat.completed\">\r\n <ng-template matStepLabel>\r\n <div class=\"step-name-div\">\r\n <div class=\"step-name-completed\" *ngIf=\"cat.completed\">\r\n <mat-icon class=\"step-name-completed-icon\">done</mat-icon>\r\n </div>\r\n <div class=\"step-name-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterCategory, TranslationSubCategory.Name, cat.id) }}\r\n </div>\r\n <div class=\"step-name-icon\" *ngIf=\"cat.icon != null\">\r\n <span class=\"helper\"></span>\r\n <img [src]=\"cat.icon\" class=\"filter-category-icon\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngFor=\"let inputviewmodel of cat.inputs\">\r\n <app-fab-input [input]=\"inputviewmodel\"></app-fab-input>\r\n </ng-container>\r\n </mat-step>\r\n </mat-stepper>\r\n }\r\n </div>\r\n</div>\r\n", styles: ["fab-filters-input .mat-step-header{cursor:pointer!important}fab-filters-input .filter-view-header-h1{display:flex}fab-filters-input .h1-auto{flex:auto}fab-filters-input .two-columns{display:flex;flex-wrap:wrap}fab-filters-input .mat-step-header[aria-labelledby=disabled_af]{cursor:not-allowed!important;opacity:.6}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon{background-color:#000}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon-selected{background-color:#3f51b5}fab-filters-input .filter-view-header{display:flex}fab-filters-input .filter-view-header-h1{flex:auto;text-transform:capitalize}fab-filters-input .step-name-icon{height:54px;white-space:nowrap;text-align:center;margin:auto 0}fab-filters-input .step-name-completed{height:54px;display:flex;align-items:center}fab-filters-input .step-name-div{width:100%}fab-filters-input .filter-category-icon{height:48px;vertical-align:middle}fab-filters-input .mat-step-text-label{width:100%}fab-filters-input .mat-step-label{width:100%}fab-filters-input .step-name-name{line-height:56px}fab-filters-input .helper{display:inline-block;height:100%;vertical-align:middle}fab-filters-input .filter-view-margin{padding:10px}fab-filters-input .filter-view-header-reset{cursor:pointer}fab-filters-input .mat-vertical-content-container{padding-top:10px}fab-filters-input .mat-vertical-content{padding:0}fab-filters-input .step-name-div{display:flex}fab-filters-input .step-name-name{flex:auto}fab-filters-input .save-conf-div{padding:15px}fab-filters-input .save-conf-div mat-spinner{margin:auto}fab-filters-input .accordion-step-number{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex-shrink:0;border-radius:50%;background:var(--mat-sys-primary);color:var(--mat-sys-on-primary);font-weight:500;line-height:56px;height:56px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i3$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i3$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i3$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9$2.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i9$2.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i9$2.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i9$2.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "component", type: FabInputCodeComponent, selector: "app-fab-input-code" }, { kind: "component", type: FabInputComponent, selector: "app-fab-input", inputs: ["input"] }], encapsulation: i0.ViewEncapsulation.None });
28833
28878
  }
28834
28879
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabFiltersInputComponent, decorators: [{
28835
28880
  type: Component,
28836
- args: [{ selector: 'fab-filters-input', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"filter-view-margin\">\r\n <div class=\"filter-view-header\">\r\n <ng-container *ngIf=\"ShowInputCode()\">\r\n <div>\r\n <div class=\"filter-view-header-h1\">\r\n <h1 class=\"h1-auto\">{{ GetHeaderName() }}</h1>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </div>\r\n <div>\r\n <app-fab-input-code></app-fab-input-code>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ShowInputCode()\">\r\n <div class=\"filter-view-header-h1\">\r\n <h1>{{ GetHeaderName() }}</h1>\r\n </div>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!ShowCategories()\">\r\n <div class=\"inputs-container\" [ngClass]=\"{'two-columns': ShowTwoColumns() }\">\r\n <ng-container *ngFor=\"let inputviewmodel of FabrikantenService.FabrikantenViewModel.inputs; index as i\">\r\n <ng-container *ngIf=\"!inputviewmodel.extra || displayExtra\">\r\n <app-fab-input [input]=\"inputviewmodel\" [ngClass]=\"{'col1': i % 2 == 0, 'col2': i % 2 == 1 }\"></app-fab-input>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"ShowAffectsOnlyBestek()\">\r\n <div class=\"affects-only-bestek\">\r\n <span><sup>1</sup></span>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AffectsOnlyBestek) }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"ShowCategories()\">\r\n <mat-stepper orientation=\"vertical\" [linear]=\"true\" #stepper>\r\n <ng-template matStepperIcon=\"edit\" let-index=\"index\">\r\n {{ index + 1 }}\r\n </ng-template>\r\n\r\n <mat-step *ngFor=\"let cat of FabrikantenService.FabrikantenViewModel.filterCategories\" state=\"{{ cat.id }}\" [completed]=\"cat.completed\" [aria-labelledby]=\"GetHeaderAriaLabel(cat)\" [class.completed-step]=\"cat.completed\">\r\n <ng-template matStepLabel>\r\n <div class=\"step-name-div\">\r\n <div class=\"step-name-completed\" *ngIf=\"cat.completed\">\r\n <mat-icon class=\"step-name-completed-icon\">done</mat-icon>\r\n </div>\r\n <div class=\"step-name-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterCategory, TranslationSubCategory.Name, cat.id) }}\r\n </div>\r\n <div class=\"step-name-icon\" *ngIf=\"cat.icon != null\">\r\n <span class=\"helper\"></span>\r\n <img [src]=\"cat.icon\" class=\"filter-category-icon\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngFor=\"let inputviewmodel of cat.inputs\">\r\n <app-fab-input [input]=\"inputviewmodel\"></app-fab-input>\r\n </ng-container>\r\n </mat-step>\r\n </mat-stepper>\r\n </div>\r\n</div>\r\n", styles: ["fab-filters-input .mat-step-header{cursor:pointer!important}fab-filters-input .filter-view-header-h1{display:flex}fab-filters-input .h1-auto{flex:auto}fab-filters-input .two-columns{display:flex;flex-wrap:wrap}fab-filters-input .mat-step-header[aria-labelledby=disabled_af]{cursor:not-allowed!important;opacity:.6}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon{background-color:#000}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon-selected{background-color:#3f51b5}fab-filters-input .filter-view-header{display:flex}fab-filters-input .filter-view-header-h1{flex:auto;text-transform:capitalize}fab-filters-input .step-name-icon{height:54px;white-space:nowrap;text-align:center;margin:auto 0}fab-filters-input .step-name-completed{height:54px;display:flex;align-items:center}fab-filters-input .step-name-div{width:100%}fab-filters-input .filter-category-icon{height:48px;vertical-align:middle}fab-filters-input .mat-step-text-label{width:100%}fab-filters-input .mat-step-label{width:100%}fab-filters-input .step-name-name{line-height:56px}fab-filters-input .helper{display:inline-block;height:100%;vertical-align:middle}fab-filters-input .filter-view-margin{padding:10px}fab-filters-input .filter-view-header-reset{cursor:pointer}fab-filters-input .mat-vertical-content-container{padding-top:10px}fab-filters-input .mat-vertical-content{padding:0}fab-filters-input .step-name-div{display:flex}fab-filters-input .step-name-name{flex:auto}fab-filters-input .save-conf-div{padding:15px}fab-filters-input .save-conf-div mat-spinner{margin:auto}\n"] }]
28881
+ args: [{ selector: 'fab-filters-input', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"filter-view-margin\">\r\n <div class=\"filter-view-header\">\r\n <ng-container *ngIf=\"ShowInputCode()\">\r\n <div>\r\n <div class=\"filter-view-header-h1\">\r\n <h1 class=\"h1-auto\">{{ GetHeaderName() }}</h1>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </div>\r\n <div>\r\n <app-fab-input-code></app-fab-input-code>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ShowInputCode()\">\r\n <div class=\"filter-view-header-h1\">\r\n <h1>{{ GetHeaderName() }}</h1>\r\n </div>\r\n <div class=\"filter-view-header-reset\" (click)=\"ResetAllFilters()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ResetFilters) }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!ShowCategories()\">\r\n <div class=\"inputs-container\" [ngClass]=\"{'two-columns': ShowTwoColumns() }\">\r\n <ng-container *ngFor=\"let inputviewmodel of FabrikantenService.FabrikantenViewModel.inputs; index as i\">\r\n <ng-container *ngIf=\"!inputviewmodel.extra || displayExtra\">\r\n <app-fab-input [input]=\"inputviewmodel\" [ngClass]=\"{'col1': i % 2 == 0, 'col2': i % 2 == 1 }\"></app-fab-input>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"ShowAffectsOnlyBestek()\">\r\n <div class=\"affects-only-bestek\">\r\n <span><sup>1</sup></span>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AffectsOnlyBestek) }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"ShowCategories()\">\r\n @if (ShowAccordion()) {\r\n <mat-accordion [multi]=\"false\">\r\n <mat-expansion-panel *ngFor=\"let cat of FabrikantenService.FabrikantenViewModel.filterCategories; let index = index\"\r\n [expanded]=\"index === 0\"\r\n [class.completed-step]=\"cat.completed\">\r\n <mat-expansion-panel-header [attr.aria-label]=\"GetHeaderAriaLabel(cat)\">\r\n <mat-panel-title>\r\n <div class=\"step-name-div\">\r\n <div class=\"accordion-step-number\">\r\n {{ index + 1 }}\r\n </div>\r\n\r\n <div class=\"step-name-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterCategory, TranslationSubCategory.Name, cat.id) }}\r\n </div>\r\n\r\n <div class=\"step-name-icon\"\r\n *ngIf=\"cat.icon != null\">\r\n <span class=\"helper\"></span>\r\n\r\n <img [src]=\"cat.icon\"\r\n class=\"filter-category-icon\"\r\n alt=\"\" />\r\n </div>\r\n </div>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container *ngFor=\"let inputviewmodel of cat.inputs\">\r\n <app-fab-input [input]=\"inputviewmodel\"></app-fab-input>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n } @else {\r\n <mat-stepper orientation=\"vertical\" [linear]=\"true\" #stepper>\r\n <ng-template matStepperIcon=\"edit\" let-index=\"index\">\r\n {{ index + 1 }}\r\n </ng-template>\r\n\r\n <mat-step *ngFor=\"let cat of FabrikantenService.FabrikantenViewModel.filterCategories\" state=\"{{ cat.id }}\" [completed]=\"cat.completed\" [aria-labelledby]=\"GetHeaderAriaLabel(cat)\" [class.completed-step]=\"cat.completed\">\r\n <ng-template matStepLabel>\r\n <div class=\"step-name-div\">\r\n <div class=\"step-name-completed\" *ngIf=\"cat.completed\">\r\n <mat-icon class=\"step-name-completed-icon\">done</mat-icon>\r\n </div>\r\n <div class=\"step-name-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterCategory, TranslationSubCategory.Name, cat.id) }}\r\n </div>\r\n <div class=\"step-name-icon\" *ngIf=\"cat.icon != null\">\r\n <span class=\"helper\"></span>\r\n <img [src]=\"cat.icon\" class=\"filter-category-icon\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-container *ngFor=\"let inputviewmodel of cat.inputs\">\r\n <app-fab-input [input]=\"inputviewmodel\"></app-fab-input>\r\n </ng-container>\r\n </mat-step>\r\n </mat-stepper>\r\n }\r\n </div>\r\n</div>\r\n", styles: ["fab-filters-input .mat-step-header{cursor:pointer!important}fab-filters-input .filter-view-header-h1{display:flex}fab-filters-input .h1-auto{flex:auto}fab-filters-input .two-columns{display:flex;flex-wrap:wrap}fab-filters-input .mat-step-header[aria-labelledby=disabled_af]{cursor:not-allowed!important;opacity:.6}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon{background-color:#000}fab-filters-input .mat-step-header[aria-labelledby=enabled] .mat-step-icon-selected{background-color:#3f51b5}fab-filters-input .filter-view-header{display:flex}fab-filters-input .filter-view-header-h1{flex:auto;text-transform:capitalize}fab-filters-input .step-name-icon{height:54px;white-space:nowrap;text-align:center;margin:auto 0}fab-filters-input .step-name-completed{height:54px;display:flex;align-items:center}fab-filters-input .step-name-div{width:100%}fab-filters-input .filter-category-icon{height:48px;vertical-align:middle}fab-filters-input .mat-step-text-label{width:100%}fab-filters-input .mat-step-label{width:100%}fab-filters-input .step-name-name{line-height:56px}fab-filters-input .helper{display:inline-block;height:100%;vertical-align:middle}fab-filters-input .filter-view-margin{padding:10px}fab-filters-input .filter-view-header-reset{cursor:pointer}fab-filters-input .mat-vertical-content-container{padding-top:10px}fab-filters-input .mat-vertical-content{padding:0}fab-filters-input .step-name-div{display:flex}fab-filters-input .step-name-name{flex:auto}fab-filters-input .save-conf-div{padding:15px}fab-filters-input .save-conf-div mat-spinner{margin:auto}fab-filters-input .accordion-step-number{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex-shrink:0;border-radius:50%;background:var(--mat-sys-primary);color:var(--mat-sys-on-primary);font-weight:500;line-height:56px;height:56px}\n"] }]
28837
28882
  }], ctorParameters: () => [{ type: i3.Router }, { type: FabrikantenService }, { type: TranslateService }, { type: FabrikantenApiClient }, { type: ConfiguratorApiClient }, { type: AuthenticationService }, { type: i0.ChangeDetectorRef }], propDecorators: { displayExtra: [{
28838
28883
  type: Input
28839
28884
  }] } });
@@ -29212,11 +29257,11 @@ class FabProductInfoPhotoComponent {
29212
29257
  var dialogRef = this.dialog.open(FabProductInfoPhotoDialogComponent, mdc);
29213
29258
  }
29214
29259
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabProductInfoPhotoComponent, deps: [{ token: MobileService }, { token: PhotoService }, { token: i1$1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
29215
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabProductInfoPhotoComponent, isStandalone: false, selector: "app-fab-product-info-photo", ngImport: i0, template: "<div class=\"image-container\" [ngClass]=\"{'tinybutton': this.MobileService.MobileInterfaceTiny}\">\n <div class=\"image-toolbar\">\n <div *ngIf=\"PhotoService.ShouldDisplayLeft()\" (click)=\"PhotoService.Left()\" class=\"arrow\">\n <mat-icon class=\"arrow_back\">arrow_back</mat-icon>\n </div>\n <div class=\"filler\">\n {{ PhotoService.GetSelectedDescription() }}\n </div>\n <div *ngIf=\"PhotoService.ShouldDisplayRight()\" (click)=\"PhotoService.Right()\" class=\"arrow\">\n <mat-icon class=\"arrow_forward\">arrow_forward</mat-icon>\n </div>\n </div>\n\n <img class=\"image\" src=\"{{ PhotoService.GetSelectedPhoto() }}\" (click)=\"Open()\" />\n</div>\n", styles: [".image-container{width:300px;margin:auto}.image{width:100%;cursor:pointer}.tinybutton{width:100%!important}.image-toolbar{display:flex}.filler{flex:auto;text-align:center;line-height:24px;font-size:13px}.arrow{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
29260
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: FabProductInfoPhotoComponent, isStandalone: false, selector: "app-fab-product-info-photo", ngImport: i0, template: "<div class=\"image-container\" [ngClass]=\"{'tinybutton': this.MobileService.MobileInterfaceTiny}\">\n <div class=\"image-toolbar\">\n <div *ngIf=\"PhotoService.ShouldDisplayLeft()\" (click)=\"PhotoService.Left()\" class=\"arrow\">\n <mat-icon class=\"arrow_back\">arrow_back</mat-icon>\n </div>\n <div class=\"filler\">\n {{ PhotoService.GetSelectedDescription() }}\n </div>\n <div *ngIf=\"PhotoService.ShouldDisplayRight()\" (click)=\"PhotoService.Right()\" class=\"arrow\">\n <mat-icon class=\"arrow_forward\">arrow_forward</mat-icon>\n </div>\n </div>\n\n <img class=\"image\" src=\"{{ PhotoService.GetSelectedPhoto() }}\" (click)=\"Open()\" />\n</div>\n\n@if (PhotoService.ShouldDisplayActionMenu()) {\n<app-fab-actionmenu [display]=\"'None'\"></app-fab-actionmenu>\n}\n", styles: [".image-container{width:300px;margin:auto}.image{width:100%;cursor:pointer}.tinybutton{width:100%!important}.image-toolbar{display:flex}.filler{flex:auto;text-align:center;line-height:24px;font-size:13px}.arrow{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: FabActionmenuComponent, selector: "app-fab-actionmenu", inputs: ["display"] }] });
29216
29261
  }
29217
29262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabProductInfoPhotoComponent, decorators: [{
29218
29263
  type: Component,
29219
- args: [{ selector: 'app-fab-product-info-photo', standalone: false, template: "<div class=\"image-container\" [ngClass]=\"{'tinybutton': this.MobileService.MobileInterfaceTiny}\">\n <div class=\"image-toolbar\">\n <div *ngIf=\"PhotoService.ShouldDisplayLeft()\" (click)=\"PhotoService.Left()\" class=\"arrow\">\n <mat-icon class=\"arrow_back\">arrow_back</mat-icon>\n </div>\n <div class=\"filler\">\n {{ PhotoService.GetSelectedDescription() }}\n </div>\n <div *ngIf=\"PhotoService.ShouldDisplayRight()\" (click)=\"PhotoService.Right()\" class=\"arrow\">\n <mat-icon class=\"arrow_forward\">arrow_forward</mat-icon>\n </div>\n </div>\n\n <img class=\"image\" src=\"{{ PhotoService.GetSelectedPhoto() }}\" (click)=\"Open()\" />\n</div>\n", styles: [".image-container{width:300px;margin:auto}.image{width:100%;cursor:pointer}.tinybutton{width:100%!important}.image-toolbar{display:flex}.filler{flex:auto;text-align:center;line-height:24px;font-size:13px}.arrow{cursor:pointer}\n"] }]
29264
+ args: [{ selector: 'app-fab-product-info-photo', standalone: false, template: "<div class=\"image-container\" [ngClass]=\"{'tinybutton': this.MobileService.MobileInterfaceTiny}\">\n <div class=\"image-toolbar\">\n <div *ngIf=\"PhotoService.ShouldDisplayLeft()\" (click)=\"PhotoService.Left()\" class=\"arrow\">\n <mat-icon class=\"arrow_back\">arrow_back</mat-icon>\n </div>\n <div class=\"filler\">\n {{ PhotoService.GetSelectedDescription() }}\n </div>\n <div *ngIf=\"PhotoService.ShouldDisplayRight()\" (click)=\"PhotoService.Right()\" class=\"arrow\">\n <mat-icon class=\"arrow_forward\">arrow_forward</mat-icon>\n </div>\n </div>\n\n <img class=\"image\" src=\"{{ PhotoService.GetSelectedPhoto() }}\" (click)=\"Open()\" />\n</div>\n\n@if (PhotoService.ShouldDisplayActionMenu()) {\n<app-fab-actionmenu [display]=\"'None'\"></app-fab-actionmenu>\n}\n", styles: [".image-container{width:300px;margin:auto}.image{width:100%;cursor:pointer}.tinybutton{width:100%!important}.image-toolbar{display:flex}.filler{flex:auto;text-align:center;line-height:24px;font-size:13px}.arrow{cursor:pointer}\n"] }]
29220
29265
  }], ctorParameters: () => [{ type: MobileService }, { type: PhotoService }, { type: i1$1.MatDialog }] });
29221
29266
 
29222
29267
  class FabProductInfoComponent {
@@ -29252,8 +29297,8 @@ class FabProductInfoComponent {
29252
29297
  var bcbproducts = this.FabrikantenService.FabrikantenViewModel?.selectedProduct?.fabrikantenBCBProductViewModels;
29253
29298
  if (bcbproducts != null) {
29254
29299
  for (var i = 0; i < bcbproducts.length; i++) {
29255
- if (bcbproducts[i].description != null)
29256
- return this.TranslateService.GetActiveValue(TranslationCategory.BCBProduct, TranslationSubCategory.Description, bcbproducts[i].id);
29300
+ //if (bcbproducts[i].description != null)
29301
+ return this.TranslateService.GetActiveValue(TranslationCategory.BCBProduct, TranslationSubCategory.Description, bcbproducts[i].id);
29257
29302
  }
29258
29303
  }
29259
29304
  return "";
@@ -29490,965 +29535,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
29490
29535
  args: ['viewercontainertoebehoren']
29491
29536
  }] } });
29492
29537
 
29493
- /**
29494
- * three.js renderer inspector (scene graph / render debugging), toggled from the
29495
- * settings panel. Adapted from the digihuis threejs-viewer InspectorComponent.
29496
- */
29497
- class InspectorComponent extends ActorComponent {
29498
- enabled = false;
29499
- inspector;
29500
- constructor(owner, autoActivate = true) {
29501
- super(owner, autoActivate);
29502
- }
29503
- toggle() {
29504
- const renderer = this.getWorld().getRenderer();
29505
- if (this.enabled) {
29506
- this.inspector.domElement.remove();
29507
- renderer.inspector = new InspectorBase();
29508
- this.inspector = undefined;
29509
- this.enabled = false;
29510
- }
29511
- else {
29512
- this.inspector = new Inspector();
29513
- renderer.inspector = this.inspector;
29514
- this.inspector.init();
29515
- this.enabled = true;
29516
- }
29517
- }
29518
- destroyComponent() {
29519
- if (this.enabled) {
29520
- this.toggle();
29521
- }
29522
- super.destroyComponent();
29523
- }
29524
- }
29525
-
29526
- /**
29527
- * Performance stats overlay (FPS panel), toggled from the settings panel.
29528
- * Adapted from the digihuis threejs-viewer StatsComponent.
29529
- */
29530
- class StatsComponent extends ActorComponent {
29531
- stats;
29532
- visible = false;
29533
- onPreRenderSubscription;
29534
- onPostRenderSubscription;
29535
- f2Handler;
29536
- constructor(owner, autoActivate = true, useF2Toggle = false) {
29537
- super(owner, autoActivate);
29538
- this.createStatsComponent();
29539
- this.onPreRenderSubscription = this.getWorld().onPreRenderObservable.subscribe(() => {
29540
- this.stats.begin();
29541
- });
29542
- this.onPostRenderSubscription = this.getWorld().onPostRenderObservable.subscribe(() => {
29543
- this.stats.end();
29544
- });
29545
- if (useF2Toggle) {
29546
- this.f2Handler = (e) => {
29547
- if (e.code === 'F2') {
29548
- e.preventDefault();
29549
- this.toggleVisiblity();
29550
- }
29551
- };
29552
- window.addEventListener('keydown', this.f2Handler);
29553
- }
29554
- }
29555
- toggleVisiblity() {
29556
- this.visible = !this.visible;
29557
- this.stats.dom.style.display = this.visible ? 'block' : 'none';
29558
- }
29559
- createStatsComponent() {
29560
- this.stats = new Stats();
29561
- this.stats.showPanel(0); // 0 = fps, 1 = ms, 2 = memory
29562
- this.stats.dom.style.position = 'absolute';
29563
- this.stats.dom.style.top = '10px';
29564
- this.stats.dom.style.left = '10px';
29565
- this.stats.dom.style.zIndex = '1000';
29566
- this.stats.dom.style.display = 'none';
29567
- this.getWorld().getEngineWrapper().appendChild(this.stats.dom);
29568
- }
29569
- destroyComponent() {
29570
- this.stats.dom.parentElement?.removeChild(this.stats.dom);
29571
- this.onPreRenderSubscription?.unsubscribe();
29572
- this.onPostRenderSubscription?.unsubscribe();
29573
- if (this.f2Handler) {
29574
- window.removeEventListener('keydown', this.f2Handler);
29575
- this.f2Handler = undefined;
29576
- }
29577
- super.destroyComponent();
29578
- }
29579
- }
29580
-
29581
- /**
29582
- * Player controller for the Fabrikanten 3D product viewer.
29583
- *
29584
- * Adds the engine's settings panel (top-right) with: graphics quality presets,
29585
- * a performance stats toggle and a renderer inspector toggle. Adapted from the
29586
- * digihuis ViewerController, without storeys dropdown, XR toolbar and input actions.
29587
- */
29588
- class FabThreeViewerController extends PlayerController {
29589
- settingsPanelComponentRef;
29590
- constructor() {
29591
- super();
29592
- this.name = 'Fab Viewer Controller';
29593
- }
29594
- start() {
29595
- super.start();
29596
- this.addSettingsPanel();
29597
- this.addGraphicPresetsSetting();
29598
- this.addStatsSetting();
29599
- this.addInspectorSetting();
29600
- }
29601
- addSettingsPanel() {
29602
- const appRef = InjectorService.get(ApplicationRef);
29603
- const environmentInjector = InjectorService.get(EnvironmentInjector);
29604
- const compRef = createComponent(SettingsPanelComponent, {
29605
- environmentInjector: appRef.injector,
29606
- elementInjector: environmentInjector,
29607
- bindings: []
29608
- });
29609
- this.settingsPanelComponentRef = compRef;
29610
- const host = compRef.location.nativeElement;
29611
- host.style.position = 'absolute';
29612
- host.style.top = '10px';
29613
- host.style.right = '10px';
29614
- this.getWorld().getEngineWrapper().appendChild(host);
29615
- appRef.attachView(compRef.hostView);
29616
- compRef.changeDetectorRef.detectChanges();
29617
- }
29618
- addGraphicPresetsSetting() {
29619
- const settingsService = InjectorService.get(SettingsService);
29620
- const graphicPresetsSetting = {
29621
- displayName: 'Grafische kwaliteit',
29622
- category: undefined,
29623
- settingType: {
29624
- selectedOptionValue: localStorage.getItem(VIEWER_GRAPHICS_PRESET_LOCALSTORAGE_KEY),
29625
- optionChanged: (option) => {
29626
- localStorage.setItem(VIEWER_GRAPHICS_PRESET_LOCALSTORAGE_KEY, option.value);
29627
- void this.getWorld().restart();
29628
- },
29629
- options: [
29630
- {
29631
- displayName: 'Laag',
29632
- value: 'low'
29633
- },
29634
- {
29635
- displayName: 'Middel',
29636
- value: 'mid'
29637
- },
29638
- {
29639
- displayName: 'Hoog',
29640
- value: 'high'
29641
- }
29642
- ]
29643
- }
29644
- };
29645
- settingsService.addSetting(graphicPresetsSetting);
29646
- }
29647
- addStatsSetting() {
29648
- const statsComponent = new StatsComponent(this, true, false);
29649
- const settingsService = InjectorService.get(SettingsService);
29650
- const fpsSetting = {
29651
- displayName: 'Toon prestatiespaneel',
29652
- category: undefined,
29653
- settingType: {
29654
- checked: false,
29655
- checkedChanged: (checked) => {
29656
- fpsSetting.settingType.checked = checked;
29657
- statsComponent.toggleVisiblity();
29658
- }
29659
- }
29660
- };
29661
- settingsService.addSetting(fpsSetting);
29662
- }
29663
- addInspectorSetting() {
29664
- const inspectorComponent = new InspectorComponent(this);
29665
- const settingsService = InjectorService.get(SettingsService);
29666
- const inspectorSetting = {
29667
- displayName: 'Toon inspector',
29668
- category: undefined,
29669
- settingType: {
29670
- checked: false,
29671
- checkedChanged: (checked) => {
29672
- inspectorSetting.settingType.checked = checked;
29673
- inspectorComponent.toggle();
29674
- }
29675
- }
29676
- };
29677
- settingsService.addSetting(inspectorSetting);
29678
- }
29679
- destroy() {
29680
- if (this.settingsPanelComponentRef) {
29681
- const host = this.settingsPanelComponentRef.location.nativeElement;
29682
- host.parentElement?.removeChild(host);
29683
- this.settingsPanelComponentRef.destroy();
29684
- this.settingsPanelComponentRef = undefined;
29685
- }
29686
- super.destroy();
29687
- }
29688
- }
29689
-
29690
- /**
29691
- * Type definitions for the legacy HDH WebGL JSON format, as produced by the server
29692
- * in Fabrikanten3DViewModel.webGLJSON.
29693
- *
29694
- * Adapted from the digihuis/WoonConnect threejs-viewer module
29695
- * (src/app/modules/threejs/include/LegacyFragment.ts).
29696
- */
29697
- /** Number of floats per vertex for each vertex data layout. */
29698
- var LegacyVertexDataLayout;
29699
- (function (LegacyVertexDataLayout) {
29700
- LegacyVertexDataLayout[LegacyVertexDataLayout["Position"] = 3] = "Position";
29701
- LegacyVertexDataLayout[LegacyVertexDataLayout["PositionUv"] = 5] = "PositionUv";
29702
- LegacyVertexDataLayout[LegacyVertexDataLayout["PositionNormal"] = 6] = "PositionNormal";
29703
- LegacyVertexDataLayout[LegacyVertexDataLayout["PositionNormalUv"] = 8] = "PositionNormalUv";
29704
- LegacyVertexDataLayout[LegacyVertexDataLayout["PositionNormalUvTangent"] = 11] = "PositionNormalUvTangent";
29705
- })(LegacyVertexDataLayout || (LegacyVertexDataLayout = {}));
29706
-
29707
- /**
29708
- * Converts the legacy HDH WebGL JSON (Fabrikanten3DViewModel.webGLJSON) into a three.js
29709
- * scene graph. View-only: builds geometry, materials and textures; no selection logic.
29710
- *
29711
- * Conversion logic is adapted from the digihuis/WoonConnect HdhToThreejsConverter
29712
- * (threejs-viewer/hdhToThree), with the server fragment-fetch pipeline removed:
29713
- * FabrikantenCore already has the complete model as a single JSON string.
29714
- */
29715
- class FabWebglJsonConverter extends Actor {
29716
- /**
29717
- * HDH (Z-up) to three.js (Y-up) axis conversion (column-major):
29718
- * threeX = hdhX, threeY = hdhZ, threeZ = -hdhY.
29719
- */
29720
- hdhToThree = new Matrix4().fromArray([
29721
- 1, 0, 0, 0, // column 0
29722
- 0, 0, -1, 0, // column 1 (hdh Y -> -three Z)
29723
- 0, 1, 0, 0, // column 2 (hdh Z -> three Y)
29724
- 0, 0, 0, 1
29725
- ]);
29726
- /** Shared glass material, provided by the world (see FabThreeViewerWorld). */
29727
- glassMaterial = null;
29728
- modelRoot;
29729
- /** Texture cache, keyed by texture path. Kept across model rebuilds. */
29730
- textures = new Map();
29731
- /** Texture paths that failed to load; do not retry, fall back to flat colors. */
29732
- failedTextures = new Set();
29733
- /** Material cache for the currently loaded model. Disposed on rebuild. */
29734
- materialCache = new Map();
29735
- pendingJson;
29736
- inflightJson;
29737
- lastLoadedJson;
29738
- isActorStarted = false;
29739
- /** Incremented on every load; async loads abort when a newer one started. */
29740
- loadGeneration = 0;
29741
- onModelLoadedSubject = new Subject();
29742
- /** Emits the world-space bounding box of the model after each (re)build. */
29743
- onModelLoaded$ = this.onModelLoadedSubject.asObservable();
29744
- constructor() {
29745
- super();
29746
- this.name = 'Fab WebGL JSON converter';
29747
- this.matrixAutoUpdate = false;
29748
- }
29749
- start() {
29750
- super.start();
29751
- this.isActorStarted = true;
29752
- void this.processPending();
29753
- }
29754
- /** Sets the shared glass material used for transparent items. */
29755
- setGlassMaterial(material) {
29756
- this.glassMaterial = material;
29757
- }
29758
- /**
29759
- * Queues a webGLJSON model for loading. Safe to call repeatedly: identical JSON is
29760
- * ignored, and a newer call supersedes any load still in progress.
29761
- */
29762
- queueModel(webGLJSON) {
29763
- if (webGLJSON === this.lastLoadedJson && this.modelRoot !== undefined && this.pendingJson === undefined) {
29764
- return;
29765
- }
29766
- // The same model is already being built: don't restart the build.
29767
- if (webGLJSON === this.inflightJson) {
29768
- return;
29769
- }
29770
- this.pendingJson = webGLJSON;
29771
- void this.processPending();
29772
- }
29773
- async processPending() {
29774
- if (!this.isActorStarted || !this.hasWorld() || this.pendingJson === undefined) {
29775
- return;
29776
- }
29777
- const json = this.pendingJson;
29778
- this.pendingJson = undefined;
29779
- const generation = ++this.loadGeneration;
29780
- this.inflightJson = json;
29781
- try {
29782
- await this.buildModel(json, generation);
29783
- }
29784
- catch (error) {
29785
- console.error('FabWebglJsonConverter: failed to build model from webGLJSON.', error);
29786
- }
29787
- finally {
29788
- if (this.inflightJson === json) {
29789
- this.inflightJson = undefined;
29790
- }
29791
- }
29792
- }
29793
- async buildModel(json, generation) {
29794
- const parsed = JSON.parse(json);
29795
- // Defensive: accept both a single fragment object and an array of fragments.
29796
- const fragments = (Array.isArray(parsed) ? parsed : [parsed]);
29797
- // Load all referenced textures up front (cached across rebuilds).
29798
- const textureNames = new Set();
29799
- for (const fragment of fragments) {
29800
- fragment?.texNamen?.forEach((name) => textureNames.add(name));
29801
- }
29802
- await this.loadTextures([...textureNames]);
29803
- // A newer load superseded this one while textures were loading.
29804
- if (generation !== this.loadGeneration) {
29805
- return;
29806
- }
29807
- this.removeModel();
29808
- const root = new Group();
29809
- root.name = 'FabWebglModel';
29810
- root.matrixAutoUpdate = false;
29811
- for (const fragment of fragments) {
29812
- if (fragment == null || fragment.itemsOpaak == null) {
29813
- console.warn('FabWebglJsonConverter: skipping fragment without itemsOpaak.', fragment);
29814
- continue;
29815
- }
29816
- this.addLegacyFragment(root, fragment);
29817
- }
29818
- this.modelRoot = root;
29819
- this.add(root);
29820
- this.lastLoadedJson = json;
29821
- root.updateMatrixWorld(true);
29822
- const boundingBox = new Box3().setFromObject(root);
29823
- this.getWorld().onSceneChanged.next();
29824
- this.onModelLoadedSubject.next(boundingBox);
29825
- }
29826
- async loadTextures(textureNames) {
29827
- const loader = new TextureLoader();
29828
- const toLoad = textureNames.filter(name => !this.textures.has(name) && !this.failedTextures.has(name));
29829
- await Promise.all(toLoad.map(async (name) => {
29830
- try {
29831
- // The legacy viewer assigns the texture path directly to Image.src,
29832
- // so relative paths resolve against the document base. TextureLoader does the same.
29833
- const texture = await loader.loadAsync(name);
29834
- texture.wrapS = RepeatWrapping;
29835
- texture.wrapT = RepeatWrapping;
29836
- texture.minFilter = LinearMipMapLinearFilter;
29837
- texture.magFilter = LinearFilter;
29838
- texture.anisotropy = GraphicsScalabilityConfigsManager.activeGraphicsScalabilityConfig.textureAnisotropy;
29839
- this.textures.set(name, texture);
29840
- }
29841
- catch (error) {
29842
- this.failedTextures.add(name);
29843
- console.warn(`FabWebglJsonConverter: failed to load texture "${name}", falling back to flat color.`, error);
29844
- }
29845
- }));
29846
- }
29847
- addLegacyFragment(root, fragment) {
29848
- const instanceMatrices = this.fragmentTransformations(fragment);
29849
- const texturePaths = fragment.texNamen ?? [];
29850
- instanceMatrices.forEach((instanceMatrix) => {
29851
- const fragmentGroup = new Group();
29852
- fragmentGroup.name = `Fragment ${fragment.ID}`;
29853
- fragmentGroup.matrixAutoUpdate = false;
29854
- fragmentGroup.matrix.copy(instanceMatrix);
29855
- fragment.itemsOpaak?.forEach((item) => {
29856
- this.addLegacyFragmentItem(fragment, item, texturePaths, false, fragmentGroup);
29857
- });
29858
- fragment.itemsTransparant?.forEach((item) => {
29859
- this.addLegacyFragmentItem(fragment, item, texturePaths, true, fragmentGroup);
29860
- });
29861
- root.add(fragmentGroup);
29862
- });
29863
- }
29864
- /** Returns the instance matrices for a fragment, converted from HDH to three.js space. */
29865
- fragmentTransformations(fragment) {
29866
- const matrices = [];
29867
- if (fragment.transLijst && fragment.transLijst.aantal > 0 && fragment.transLijst.transMats?.length) {
29868
- for (const raw of fragment.transLijst.transMats) {
29869
- const parsed = this.parseHdhMatrix(raw);
29870
- matrices.push(new Matrix4().multiplyMatrices(this.hdhToThree, parsed));
29871
- }
29872
- }
29873
- else {
29874
- // No transformation list: apply only the axis conversion; geometry is scaled on the mesh.
29875
- matrices.push(new Matrix4().copy(this.hdhToThree));
29876
- }
29877
- return matrices;
29878
- }
29879
- /** Parses an HDH 4x4 matrix (detects row-major layout) and converts translation mm -> m. */
29880
- parseHdhMatrix(raw) {
29881
- const arr = raw.slice();
29882
- const looksRowMajor = (Math.abs(arr[3]) > 1e-6 || Math.abs(arr[7]) > 1e-6 || Math.abs(arr[11]) > 1e-6) &&
29883
- arr[12] === 0 && arr[13] === 0 && arr[14] === 0;
29884
- const matrix = new Matrix4().fromArray(arr);
29885
- if (looksRowMajor) {
29886
- matrix.transpose();
29887
- }
29888
- // mm -> m: only the translation; the geometry itself is scaled on the mesh.
29889
- matrix.elements[12] /= 1000;
29890
- matrix.elements[13] /= 1000;
29891
- matrix.elements[14] /= 1000;
29892
- return matrix;
29893
- }
29894
- itemLayout(item) {
29895
- if (item.type === 2) {
29896
- return (item.tableau != null || item.bumpmap != null)
29897
- ? LegacyVertexDataLayout.PositionUv
29898
- : LegacyVertexDataLayout.Position;
29899
- }
29900
- if (item.type === 3) {
29901
- if (item.bumpmap != null) {
29902
- return LegacyVertexDataLayout.PositionNormalUvTangent;
29903
- }
29904
- return (item.tableau != null)
29905
- ? LegacyVertexDataLayout.PositionNormalUv
29906
- : LegacyVertexDataLayout.PositionNormal;
29907
- }
29908
- return undefined;
29909
- }
29910
- addLegacyFragmentItem(fragment, item, texturePaths, isTransparent, parent) {
29911
- // Points (0) and lines (1) are not rendered in 3D.
29912
- if (item.type === 0 || item.type === 1) {
29913
- return;
29914
- }
29915
- const layout = this.itemLayout(item);
29916
- if (layout === undefined || item.vertexData == null || item.vertexData.length === 0) {
29917
- return;
29918
- }
29919
- const material = this.resolveMaterial(fragment, item, texturePaths, isTransparent);
29920
- if (material === null) {
29921
- // Opacity-0 "air" items (e.g. cavities) are present in the geometry but irrelevant for rendering.
29922
- return;
29923
- }
29924
- const geometry = this.buildGeometry(item, layout);
29925
- if (geometry === null) {
29926
- return;
29927
- }
29928
- const mesh = new Mesh(geometry, material);
29929
- if (material === this.glassMaterial) {
29930
- // Glass neither casts nor receives shadows.
29931
- mesh.castShadow = false;
29932
- mesh.receiveShadow = false;
29933
- }
29934
- else {
29935
- mesh.castShadow = GraphicsScalabilityConfigsManager.activeGraphicsScalabilityConfig.enableCastShadows;
29936
- mesh.receiveShadow = GraphicsScalabilityConfigsManager.activeGraphicsScalabilityConfig.enableReceiveShadows;
29937
- }
29938
- // Geometry coordinates are in mm; the instance matrix translation is already in m.
29939
- mesh.scale.multiplyScalar(0.001);
29940
- mesh.matrixAutoUpdate = false;
29941
- mesh.updateMatrix();
29942
- parent.add(mesh);
29943
- }
29944
- buildGeometry(item, layout) {
29945
- const vertexData = item.vertexData;
29946
- const stride = layout;
29947
- const sourceVertexCount = Math.floor(vertexData.length / stride);
29948
- if (sourceVertexCount === 0) {
29949
- return null;
29950
- }
29951
- // Layouts without per-vertex normals are single-sided planes: generate backfaces.
29952
- const createBackfaces = layout === LegacyVertexDataLayout.Position || layout === LegacyVertexDataLayout.PositionUv;
29953
- const vertexCount = createBackfaces ? sourceVertexCount * 2 : sourceVertexCount;
29954
- const positions = new Float32Array(vertexCount * 3);
29955
- const normals = new Float32Array(vertexCount * 3);
29956
- const uvs = new Float32Array(vertexCount * 2);
29957
- // Per-item plane normal for layouts without per-vertex normals.
29958
- const planeNormal = item.normaal ?? [0, 0, 1];
29959
- const hasIndices = item.vertexIndices != null && item.vertexIndices.length > 0;
29960
- let offset = 0;
29961
- let vertexIndex = 0;
29962
- while (offset + stride <= vertexData.length) {
29963
- positions[3 * vertexIndex + 0] = vertexData[offset + 0];
29964
- positions[3 * vertexIndex + 1] = vertexData[offset + 1];
29965
- positions[3 * vertexIndex + 2] = vertexData[offset + 2];
29966
- if (createBackfaces) {
29967
- // Backface vertex index: with indexed geometry vertices are duplicated 1:1 (winding is
29968
- // reversed in the index buffer); with triangle soup the order within each triangle is reversed.
29969
- const backfaceIndex = hasIndices
29970
- ? vertexIndex + sourceVertexCount
29971
- : vertexIndex + sourceVertexCount + 2 * (1 - (vertexIndex % 3));
29972
- positions[3 * backfaceIndex + 0] = vertexData[offset + 0];
29973
- positions[3 * backfaceIndex + 1] = vertexData[offset + 1];
29974
- positions[3 * backfaceIndex + 2] = vertexData[offset + 2];
29975
- normals[3 * vertexIndex + 0] = planeNormal[0];
29976
- normals[3 * vertexIndex + 1] = planeNormal[1];
29977
- normals[3 * vertexIndex + 2] = planeNormal[2];
29978
- normals[3 * backfaceIndex + 0] = -planeNormal[0];
29979
- normals[3 * backfaceIndex + 1] = -planeNormal[1];
29980
- normals[3 * backfaceIndex + 2] = -planeNormal[2];
29981
- if (layout === LegacyVertexDataLayout.PositionUv) {
29982
- uvs[2 * vertexIndex + 0] = vertexData[offset + 3];
29983
- uvs[2 * vertexIndex + 1] = vertexData[offset + 4];
29984
- uvs[2 * backfaceIndex + 0] = vertexData[offset + 3];
29985
- uvs[2 * backfaceIndex + 1] = vertexData[offset + 4];
29986
- }
29987
- }
29988
- else {
29989
- normals[3 * vertexIndex + 0] = vertexData[offset + 3];
29990
- normals[3 * vertexIndex + 1] = vertexData[offset + 4];
29991
- normals[3 * vertexIndex + 2] = vertexData[offset + 5];
29992
- if (layout !== LegacyVertexDataLayout.PositionNormal) {
29993
- uvs[2 * vertexIndex + 0] = vertexData[offset + 6];
29994
- uvs[2 * vertexIndex + 1] = vertexData[offset + 7];
29995
- }
29996
- }
29997
- vertexIndex++;
29998
- offset += stride;
29999
- }
30000
- const geometry = new BufferGeometry();
30001
- geometry.setAttribute('position', new BufferAttribute(positions, 3));
30002
- geometry.setAttribute('normal', new BufferAttribute(normals, 3));
30003
- geometry.setAttribute('uv', new BufferAttribute(uvs, 2));
30004
- if (hasIndices) {
30005
- const indices = item.vertexIndices;
30006
- if (createBackfaces) {
30007
- // Front faces keep the original indices; backfaces reference the duplicated
30008
- // vertices with reversed winding order.
30009
- const extended = new Array(indices.length * 2);
30010
- for (let i = 0; i < indices.length; i += 3) {
30011
- extended[i + 0] = indices[i + 0];
30012
- extended[i + 1] = indices[i + 1];
30013
- extended[i + 2] = indices[i + 2];
30014
- extended[indices.length + i + 0] = indices[i + 2] + sourceVertexCount;
30015
- extended[indices.length + i + 1] = indices[i + 1] + sourceVertexCount;
30016
- extended[indices.length + i + 2] = indices[i + 0] + sourceVertexCount;
30017
- }
30018
- geometry.setIndex(extended);
30019
- }
30020
- else {
30021
- geometry.setIndex(indices);
30022
- }
30023
- }
30024
- return geometry;
30025
- }
30026
- /**
30027
- * Resolves the material for an item. Returns null when the item should be skipped
30028
- * (fully transparent "air" geometry).
30029
- */
30030
- resolveMaterial(fragment, item, texturePaths, isTransparent) {
30031
- const color = fragment.kleurBronnen?.[item.kleur];
30032
- const opacity = color != null ? color[3] / 255 : 1;
30033
- if (isTransparent) {
30034
- if (opacity === 0) {
30035
- // Air / gas elements (e.g. the cavity in a cavity wall): skip entirely.
30036
- return null;
30037
- }
30038
- /* The only transparent elements with non-zero opacity in practice are glass.
30039
- A shared physical glass material (with env reflections) looks much better
30040
- than a plain transparent color material. */
30041
- if (this.glassMaterial !== null) {
30042
- return this.glassMaterial;
30043
- }
30044
- }
30045
- const albedoPath = item.tableau != null ? texturePaths[item.tableau] : undefined;
30046
- const bumpPath = item.bumpmap != null ? texturePaths[item.bumpmap] : undefined;
30047
- const cacheKey = `${fragment.ID}|k${item.kleur}|t${albedoPath ?? ''}|b${bumpPath ?? ''}` +
30048
- `|s${item.schitteringMat ?? ''}|m${item.metaalachtigheid ?? ''}|tr${isTransparent ? 1 : 0}`;
30049
- const cached = this.materialCache.get(cacheKey);
30050
- if (cached !== undefined) {
30051
- return cached;
30052
- }
30053
- const material = new MeshStandardMaterial();
30054
- const albedoTexture = albedoPath !== undefined ? this.textures.get(albedoPath) : undefined;
30055
- if (albedoTexture !== undefined) {
30056
- albedoTexture.colorSpace = SRGBColorSpace;
30057
- material.map = albedoTexture;
30058
- material.color.set(0xffffff);
30059
- // Legacy viewer convention: texture names containing "transparant" carry an alpha channel.
30060
- if (albedoPath.toLowerCase().includes('transparant')) {
30061
- material.transparent = true;
30062
- }
30063
- material.alphaTest = 0.5;
30064
- }
30065
- else if (color != null) {
30066
- material.color.setRGB(color[0] / 255, color[1] / 255, color[2] / 255, SRGBColorSpace);
30067
- material.opacity = opacity;
30068
- if (isTransparent && opacity < 1) {
30069
- // Fallback when no glass material is available (engine still booting).
30070
- material.transparent = true;
30071
- }
30072
- }
30073
- const bumpTexture = bumpPath !== undefined ? this.textures.get(bumpPath) : undefined;
30074
- if (bumpTexture !== undefined) {
30075
- // Files named "*bumpmap*" are grayscale height maps; everything else is a normal map.
30076
- if (bumpPath.toLowerCase().includes('bumpmap')) {
30077
- material.bumpMap = bumpTexture;
30078
- }
30079
- else {
30080
- material.normalMap = bumpTexture;
30081
- }
30082
- }
30083
- if (isTransparent) {
30084
- // As little blur as possible behind regular glass.
30085
- material.roughness = 0;
30086
- }
30087
- else if (item.schitteringMat !== undefined) {
30088
- /* Real-world materials are never perfectly smooth: a minimum roughness
30089
- avoids overly bright specular reflections. */
30090
- const minimumRoughness = 0.45;
30091
- material.roughness = Math.max(minimumRoughness, 1 - item.schitteringMat);
30092
- }
30093
- material.metalness = item.metaalachtigheid ?? 0;
30094
- this.materialCache.set(cacheKey, material);
30095
- return material;
30096
- }
30097
- /** Removes the current model and disposes its geometries and per-model materials. */
30098
- removeModel() {
30099
- if (this.modelRoot === undefined) {
30100
- return;
30101
- }
30102
- const root = this.modelRoot;
30103
- this.modelRoot = undefined;
30104
- this.lastLoadedJson = undefined;
30105
- root.traverse((object) => {
30106
- const mesh = object;
30107
- if (mesh.isMesh === true) {
30108
- mesh.geometry?.dispose();
30109
- }
30110
- });
30111
- // Cached materials are per-model; textures are kept (cached across rebuilds).
30112
- this.materialCache.forEach(material => material.dispose());
30113
- this.materialCache.clear();
30114
- this.remove(root);
30115
- root.clear();
30116
- if (this.hasWorld()) {
30117
- this.getWorld().onSceneChanged.next();
30118
- }
30119
- }
30120
- destroy() {
30121
- // Invalidate any in-flight load.
30122
- this.loadGeneration++;
30123
- this.pendingJson = undefined;
30124
- this.removeModel();
30125
- this.textures.forEach(texture => texture.dispose());
30126
- this.textures.clear();
30127
- this.failedTextures.clear();
30128
- this.onModelLoadedSubject.complete();
30129
- super.destroy();
30130
- }
30131
- }
30132
-
30133
- /**
30134
- * View-only game mode for the Fabrikanten 3D product viewer.
30135
- *
30136
- * OrbitPawn: orbit, pan and zoom only — no input actions, no selection. The
30137
- * FabThreeViewerController adds the settings panel (graphics presets, stats,
30138
- * inspector). Creates the JSON converter and frames the camera around the
30139
- * model whenever it (re)loads.
30140
- */
30141
- class FabThreeViewerMode extends GameModeBase {
30142
- /**
30143
- * Default view direction towards the model, matching the legacy viewer's
30144
- * "kijkrichting" [0.500, 0.744, -0.442] (HDH Z-up), converted to three.js Y-up.
30145
- */
30146
- static CAMERA_OFFSET_DIRECTION = new Vector3(-0.5002, 0.4424, 0.7444).normalize();
30147
- converter;
30148
- modelLoadedSubscription;
30149
- constructor() {
30150
- super(GameStateBase, FabThreeViewerController, OrbitPawn);
30151
- this.name = 'Fab Viewer Mode';
30152
- }
30153
- init() {
30154
- super.init();
30155
- const world = this.getWorld();
30156
- // Sensible default pose until the model bounding box is known.
30157
- this.pawn.setCameraPositionAndLookAt(new Vector3(-3, 2.5, 4.5), new Vector3(0, 0, 0));
30158
- const converter = new FabWebglJsonConverter();
30159
- this.converter = converter;
30160
- world.addActor(converter);
30161
- this.modelLoadedSubscription?.unsubscribe();
30162
- this.modelLoadedSubscription = converter.onModelLoaded$.subscribe((box) => {
30163
- this.frameModel(box);
30164
- });
30165
- // Registers the glass material on the converter and re-queues the last model.
30166
- world.registerConverter(converter);
30167
- }
30168
- /**
30169
- * Positions the orbit camera so the whole model is in view (the equivalent of the
30170
- * legacy viewer's "zetZoomGeheel"), and adapts near/far planes and zoom limits
30171
- * to the model size.
30172
- */
30173
- frameModel(box) {
30174
- if (box.isEmpty()) {
30175
- return;
30176
- }
30177
- const pawn = this.pawn;
30178
- const camera = pawn.getCamera();
30179
- if (!(camera instanceof PerspectiveCamera)) {
30180
- return;
30181
- }
30182
- const center = box.getCenter(new Vector3());
30183
- const radius = Math.max(box.getSize(new Vector3()).length() / 2, 0.05);
30184
- // Fit the bounding sphere in both the vertical and horizontal field of view.
30185
- const verticalFov = MathUtils.degToRad(camera.fov);
30186
- const horizontalFov = 2 * Math.atan(Math.tan(verticalFov / 2) * camera.aspect);
30187
- const fitFov = Math.min(verticalFov, horizontalFov);
30188
- const distance = (radius / Math.sin(fitFov / 2)) * 1.05;
30189
- const position = center.clone().addScaledVector(FabThreeViewerMode.CAMERA_OFFSET_DIRECTION, distance);
30190
- camera.near = Math.max(radius / 100, 0.001);
30191
- camera.far = Math.max(distance + radius * 20, 100);
30192
- camera.updateProjectionMatrix();
30193
- pawn.setCameraPositionAndLookAt(position, center);
30194
- const orbitControls = pawn.getOrbitControls();
30195
- if (orbitControls) {
30196
- orbitControls.minDistance = radius * 0.05;
30197
- orbitControls.maxDistance = radius * 20;
30198
- orbitControls.update();
30199
- }
30200
- this.getWorld().dispatchOnCameraMatrixChanged();
30201
- }
30202
- destroy() {
30203
- this.modelLoadedSubscription?.unsubscribe();
30204
- this.modelLoadedSubscription = undefined;
30205
- this.converter = undefined;
30206
- super.destroy();
30207
- }
30208
- }
30209
-
30210
- /**
30211
- * View-only world for the Fabrikanten 3D product viewer.
30212
- *
30213
- * Sets up sun + ambient lighting with shadows and a generated PBR room environment
30214
- * (reflections for glass/metal). Lighting adapted from the digihuis ViewerWorld,
30215
- * without skybox, day/night cycle, settings panel, selection and demo actors.
30216
- */
30217
- class FabThreeViewerWorld extends World {
30218
- /** Normalized sun direction (from the model towards the sun). */
30219
- static SUN_DIRECTION = new Vector3(-5, 20, 5).normalize();
30220
- /** Served from src/assets (see angular.json); relative so it respects the base href. */
30221
- static GLASS_HDRI_URL = 'assets/hdri/urban_courtyard_1k.hdr';
30222
- sun;
30223
- ambient;
30224
- environmentRenderTarget;
30225
- glassEnvironmentRenderTarget;
30226
- converter;
30227
- lastJson;
30228
- lastModelBox;
30229
- sceneChangedSubscription;
30230
- modelLoadedSubscription;
30231
- /** Shared glass material for transparent items (env map assigned once generated). */
30232
- glassMaterial = new MeshPhysicalMaterial({
30233
- color: 0xffffff,
30234
- metalness: 0.1,
30235
- roughness: 0,
30236
- transmission: 1.0,
30237
- transparent: true,
30238
- opacity: 1.0,
30239
- ior: 1,
30240
- thickness: 0,
30241
- specularIntensity: 0.02,
30242
- attenuationDistance: 0.0001,
30243
- attenuationColor: 0xffffff
30244
- });
30245
- init(engineWrapper, rendererCanvas, renderPipeline, renderer, onWindowResize, onPreRender, onPostRender, useWebGlFallback) {
30246
- super.init(engineWrapper, rendererCanvas, renderPipeline, renderer, onWindowResize, onPreRender, onPostRender, useWebGlFallback);
30247
- // View-only: no object selection.
30248
- this.objectSelector?.deactivate();
30249
- // Static scene: shadows are only re-rendered when the scene actually changes.
30250
- this.sceneChangedSubscription?.unsubscribe();
30251
- this.sceneChangedSubscription = this.onSceneChangedObservable.subscribe(() => {
30252
- if (this.sun) {
30253
- this.sun.shadow.needsUpdate = true;
30254
- }
30255
- });
30256
- this.setupLighting();
30257
- void this.setupEnvironment();
30258
- }
30259
- /** Shared glass material for transparent (glass) items. */
30260
- getGlassMaterial() {
30261
- return this.glassMaterial;
30262
- }
30263
- /**
30264
- * Registers the converter created by the game mode. Re-queues the last model so the
30265
- * scene survives engine restarts (the game mode is re-initialized on restart).
30266
- */
30267
- registerConverter(converter) {
30268
- this.converter = converter;
30269
- converter.setGlassMaterial(this.glassMaterial);
30270
- this.modelLoadedSubscription?.unsubscribe();
30271
- this.modelLoadedSubscription = converter.onModelLoaded$.subscribe((box) => {
30272
- this.lastModelBox = box;
30273
- this.fitLightingToBox(box);
30274
- });
30275
- if (this.lastJson !== undefined) {
30276
- converter.queueModel(this.lastJson);
30277
- }
30278
- }
30279
- /**
30280
- * Loads (or replaces) the product model from a webGLJSON string.
30281
- * Can be called before the engine has booted; the model is queued until ready.
30282
- */
30283
- loadModel(webGLJSON) {
30284
- this.lastJson = webGLJSON;
30285
- this.converter?.queueModel(webGLJSON);
30286
- }
30287
- setupLighting() {
30288
- this.teardownLighting();
30289
- const config = GraphicsScalabilityConfigsManager.activeGraphicsScalabilityConfig;
30290
- // Sunlight
30291
- const sun = new DirectionalLight(0xf7efe1, 2.0);
30292
- sun.position.copy(FabThreeViewerWorld.SUN_DIRECTION).multiplyScalar(20);
30293
- sun.castShadow = config.enableCastShadows;
30294
- sun.shadow.mapSize.width = config.sunShadowMapSize;
30295
- sun.shadow.mapSize.height = config.sunShadowMapSize;
30296
- sun.shadow.camera.left = -15;
30297
- sun.shadow.camera.right = 15;
30298
- sun.shadow.camera.top = 15;
30299
- sun.shadow.camera.bottom = -15;
30300
- sun.shadow.camera.near = 1;
30301
- sun.shadow.camera.far = config.shadowRenderDistance;
30302
- sun.shadow.bias = -0.0005;
30303
- sun.shadow.normalBias = 0.02;
30304
- sun.name = 'Sun';
30305
- sun.matrixAutoUpdate = false;
30306
- sun.updateMatrix();
30307
- // Static scene: prevent automatic shadow re-rendering every frame.
30308
- sun.shadow.autoUpdate = false;
30309
- this._scene.add(sun);
30310
- this._scene.add(sun.target);
30311
- this.sun = sun;
30312
- // Ambient light
30313
- const ambient = new AmbientLight(0xe9eff5, 1.25);
30314
- ambient.name = 'Ambient';
30315
- ambient.matrixAutoUpdate = false;
30316
- ambient.updateMatrix();
30317
- this._scene.add(ambient);
30318
- this.ambient = ambient;
30319
- // Neutral background, matching the legacy viewer's white canvas. The intensity
30320
- // compensates for ACES filmic tone mapping, which would otherwise render
30321
- // a 1.0 white as visibly gray.
30322
- this._scene.background = new Color(0xffffff);
30323
- this._scene.backgroundIntensity = 5;
30324
- // Re-fit when lighting is rebuilt after an engine restart.
30325
- if (this.lastModelBox) {
30326
- this.fitLightingToBox(this.lastModelBox);
30327
- }
30328
- this.onSceneChanged.next();
30329
- }
30330
- teardownLighting() {
30331
- if (this.sun) {
30332
- this.sun.shadow?.map?.dispose();
30333
- this.sun.target.removeFromParent();
30334
- this.sun.removeFromParent();
30335
- this.sun = undefined;
30336
- }
30337
- if (this.ambient) {
30338
- this.ambient.removeFromParent();
30339
- this.ambient = undefined;
30340
- }
30341
- }
30342
- /**
30343
- * Positions the sun relative to the model and fits the shadow camera around it,
30344
- * so shadows stay crisp regardless of model size and position.
30345
- */
30346
- fitLightingToBox(box) {
30347
- if (!this.sun || box.isEmpty()) {
30348
- return;
30349
- }
30350
- const center = box.getCenter(new Vector3());
30351
- const radius = Math.max(box.getSize(new Vector3()).length() / 2, 0.1);
30352
- const sun = this.sun;
30353
- sun.position.copy(center).addScaledVector(FabThreeViewerWorld.SUN_DIRECTION, radius * 3);
30354
- sun.target.position.copy(center);
30355
- sun.updateMatrix();
30356
- sun.target.updateMatrixWorld(true);
30357
- const extent = radius * 1.25;
30358
- sun.shadow.camera.left = -extent;
30359
- sun.shadow.camera.right = extent;
30360
- sun.shadow.camera.top = extent;
30361
- sun.shadow.camera.bottom = -extent;
30362
- sun.shadow.camera.near = radius * 0.5;
30363
- sun.shadow.camera.far = radius * 6;
30364
- sun.shadow.camera.updateProjectionMatrix();
30365
- sun.shadow.needsUpdate = true;
30366
- }
30367
- /**
30368
- * Sets up image-based lighting. Skipped on low graphics presets.
30369
- *
30370
- * - Scene-wide: a generated PBR room environment (subtle reflections on all materials).
30371
- * - Glass: the urban courtyard HDRI (same as the digihuis viewer), which gives glass
30372
- * far more convincing reflections than the synthetic room.
30373
- */
30374
- async setupEnvironment() {
30375
- if (!GraphicsScalabilityConfigsManager.activeGraphicsScalabilityConfig.enableEnvReflections) {
30376
- return;
30377
- }
30378
- const renderer = this.getRenderer();
30379
- // The WebGPU backend initializes asynchronously; PMREM requires it to be ready.
30380
- await renderer.init();
30381
- try {
30382
- const pmremGenerator = new PMREMGenerator(renderer);
30383
- const roomEnvironment = new RoomEnvironment();
30384
- const renderTarget = pmremGenerator.fromScene(roomEnvironment, 0.04);
30385
- pmremGenerator.dispose();
30386
- roomEnvironment.dispose();
30387
- this.environmentRenderTarget?.dispose();
30388
- this.environmentRenderTarget = renderTarget;
30389
- const scene = this.getScene();
30390
- scene.environment = renderTarget.texture;
30391
- // Subtle image-based lighting: the sun + ambient remain the dominant lights.
30392
- scene.environmentIntensity = 0.4;
30393
- // Until the HDRI is loaded (or when it fails), glass falls back to the room environment.
30394
- this.setGlassEnvMap(renderTarget.texture);
30395
- this.onSceneChanged.next();
30396
- }
30397
- catch (error) {
30398
- console.warn('FabThreeViewerWorld: environment map generation failed; continuing without reflections.', error);
30399
- }
30400
- try {
30401
- const hdrTexture = await new HDRLoader().loadAsync(FabThreeViewerWorld.GLASS_HDRI_URL);
30402
- const pmremGenerator = new PMREMGenerator(renderer);
30403
- const renderTarget = pmremGenerator.fromEquirectangular(hdrTexture);
30404
- pmremGenerator.dispose();
30405
- hdrTexture.dispose();
30406
- this.glassEnvironmentRenderTarget?.dispose();
30407
- this.glassEnvironmentRenderTarget = renderTarget;
30408
- this.setGlassEnvMap(renderTarget.texture);
30409
- this.onSceneChanged.next();
30410
- }
30411
- catch (error) {
30412
- console.warn('FabThreeViewerWorld: failed to load glass HDRI; glass keeps the room environment.', error);
30413
- }
30414
- }
30415
- setGlassEnvMap(texture) {
30416
- this.glassMaterial.envMap = texture;
30417
- this.glassMaterial.envMapIntensity = 4;
30418
- this.glassMaterial.needsUpdate = true;
30419
- }
30420
- stop() {
30421
- this.sceneChangedSubscription?.unsubscribe();
30422
- this.sceneChangedSubscription = undefined;
30423
- this.modelLoadedSubscription?.unsubscribe();
30424
- this.modelLoadedSubscription = undefined;
30425
- this.converter = undefined;
30426
- this.teardownLighting();
30427
- this.environmentRenderTarget?.dispose();
30428
- this.environmentRenderTarget = undefined;
30429
- this.glassEnvironmentRenderTarget?.dispose();
30430
- this.glassEnvironmentRenderTarget = undefined;
30431
- super.stop();
30432
- }
30433
- }
30434
-
30435
29538
  class FabWebglViewerComponent {
30436
29539
  FabrikantenService;
30437
29540
  WebGLService;
30438
29541
  TranslateService;
30439
29542
  MobileService;
30440
29543
  ChangeDetectorRef;
30441
- /**
30442
- * The three-engine world rendered by <threejs-engine>. Created lazily once the
30443
- * 3D model data is available; reused (model reloaded in place) afterwards.
30444
- */
30445
- ViewerWorld = null;
29544
+ Height = "calc(100% - 0px)";
30446
29545
  _viewercontainer;
30447
29546
  set viewercontainer(value) {
30448
29547
  this._viewercontainer = value;
30449
29548
  if (value) {
30450
- // The container just appeared (e.g. after variant selection): ensure the viewer is up to date.
30451
29549
  queueMicrotask(() => {
29550
+ this.RefreshViewerSize();
30452
29551
  this.RefreshViewer();
30453
29552
  });
30454
29553
  }
@@ -30470,10 +29569,17 @@ class FabWebglViewerComponent {
30470
29569
  this.ChangeDetectorRef = ChangeDetectorRef;
30471
29570
  this.WebGLService.FabWebglViewerComponent = this;
30472
29571
  }
29572
+ ngOnInit() {
29573
+ this.RefreshViewerSize();
29574
+ }
30473
29575
  ngAfterViewInit() {
29576
+ this.RefreshViewerSize();
30474
29577
  this.RefreshViewer();
30475
29578
  this.ChangeDetectorRef.detectChanges();
30476
29579
  }
29580
+ ngDoCheck() {
29581
+ this.RefreshViewerSize();
29582
+ }
30477
29583
  ShowWebGL() {
30478
29584
  if (!this.FabrikantenService.ShowVariants()) {
30479
29585
  if (this.WebGLService.Fabrikanten3DViewModel != undefined) {
@@ -30482,30 +29588,103 @@ class FabWebglViewerComponent {
30482
29588
  }
30483
29589
  return false;
30484
29590
  }
30485
- /**
30486
- * Creates the three-engine world on first call and (re)loads the current
30487
- * webGLJSON model. Safe to call repeatedly: identical models are ignored.
30488
- */
30489
29591
  RefreshViewer() {
30490
- if (this.WebGLService.Loading || this.WebGLService.Fabrikanten3DViewModel == null) {
29592
+ if (!this.WebGLService.Loading && this.WebGLService.Fabrikanten3DViewModel != null) {
29593
+ var viewer = ModuleViewer3DLight.get("viewerCanvas");
29594
+ if (viewer != null) {
29595
+ //var belichting = viewer.belichting;
29596
+ //belichting.toonSlagschaduw = true;
29597
+ //belichting.slagschaduwVerzadiging = 0.5;
29598
+ //belichting.lichtbronSterkte = 3;
29599
+ //belichting.lichtSchittering = 0.333;
29600
+ //belichting.omgevinglichtSterkte = 0.8;
29601
+ //belichting.isCameraLicht = true;
29602
+ //if (belichting.isCameraLicht == true) {
29603
+ // belichting.lichtval = [0, 1, 0];
29604
+ //} else {
29605
+ // belichting.lichtval = [-1.0, 0.5, -1.2];
29606
+ //}
29607
+ //viewer.orthografischeProjectie = false;
29608
+ //viewer.kijkrichting = [0.56777614549287847, 0.69328989820855813, -0.44382357491599833];
29609
+ //belichting.lichtbronSterkte = 0.8;
29610
+ //belichting.lichtSchittering = 0.333;
29611
+ //belichting.omgevinglichtSterkte = 0.4;
29612
+ //belichting.lichtval = [-1.0, 0.5, -1.2];
29613
+ var lichtbronSterkte = 1;
29614
+ var omgevinglichtSterkte = 0.6;
29615
+ var lichtvalX = 1;
29616
+ var lichtvalY = 2;
29617
+ var lichtvalZ = -2;
29618
+ var toonSlagshaduw = true;
29619
+ try {
29620
+ if (this.FabrikantenService.FabrikantenSettingsViewModel.lichtbronSterkte != undefined) {
29621
+ lichtbronSterkte = parseFloat(this.FabrikantenService.FabrikantenSettingsViewModel.lichtbronSterkte);
29622
+ }
29623
+ if (this.FabrikantenService.FabrikantenSettingsViewModel.omgevinglichtSterkte != undefined) {
29624
+ omgevinglichtSterkte = parseFloat(this.FabrikantenService.FabrikantenSettingsViewModel.omgevinglichtSterkte);
29625
+ }
29626
+ if (this.FabrikantenService.FabrikantenSettingsViewModel.lichtvalX != undefined) {
29627
+ lichtvalX = parseFloat(this.FabrikantenService.FabrikantenSettingsViewModel.lichtvalX);
29628
+ }
29629
+ if (this.FabrikantenService.FabrikantenSettingsViewModel.lichtvalY != undefined) {
29630
+ lichtvalY = parseFloat(this.FabrikantenService.FabrikantenSettingsViewModel.lichtvalY);
29631
+ }
29632
+ if (this.FabrikantenService.FabrikantenSettingsViewModel.lichtvalZ != undefined) {
29633
+ lichtvalZ = parseFloat(this.FabrikantenService.FabrikantenSettingsViewModel.lichtvalZ);
29634
+ }
29635
+ if (this.FabrikantenService.FabrikantenSettingsViewModel.lichtvalZ != undefined) {
29636
+ toonSlagshaduw = this.FabrikantenService.FabrikantenSettingsViewModel.toonSlagshaduw;
29637
+ }
29638
+ }
29639
+ catch (ex) {
29640
+ lichtbronSterkte = 1;
29641
+ omgevinglichtSterkte = 0.6;
29642
+ lichtvalX = 1;
29643
+ lichtvalY = 2;
29644
+ lichtvalZ = -2;
29645
+ toonSlagshaduw = true;
29646
+ }
29647
+ var belichting = viewer.belichting;
29648
+ belichting.toonSlagschaduw = toonSlagshaduw;
29649
+ belichting.slagschaduwVerzadiging = 0.5;
29650
+ belichting.lichtbronSterkte = lichtbronSterkte;
29651
+ belichting.lichtSchittering = 0.333;
29652
+ belichting.isCameraLicht = false;
29653
+ belichting.omgevinglichtSterkte = omgevinglichtSterkte;
29654
+ belichting.lichtval = [1, 2, -2];
29655
+ viewer.orthografischeProjectie = false;
29656
+ viewer.kijkrichting = [0.50023241910093, 0.7443600526604934, -0.4423749980318723];
29657
+ viewer.clear();
29658
+ viewer.add(this.WebGLService.Fabrikanten3DViewModel.webGLJSON, function () {
29659
+ viewer.zetZoomGeheel();
29660
+ viewer.toonModel();
29661
+ });
29662
+ }
29663
+ }
29664
+ }
29665
+ RefreshViewerSize() {
29666
+ if (!this.viewercontainer) {
30491
29667
  return;
30492
29668
  }
30493
- const webGLJSON = this.WebGLService.Fabrikanten3DViewModel.webGLJSON;
30494
- if (!webGLJSON) {
29669
+ const nativeElement = this.viewercontainer.nativeElement;
29670
+ const width = nativeElement.offsetWidth - 6;
29671
+ const height = nativeElement.offsetHeight - 6;
29672
+ if (width <= 0 || height <= 0) {
30495
29673
  return;
30496
29674
  }
30497
- if (this.ViewerWorld == null) {
30498
- this.ViewerWorld = new FabThreeViewerWorld(new FabThreeViewerMode());
29675
+ if (this.WebGLService.ViewerWidth !== width || this.WebGLService.ViewerHeight !== height) {
29676
+ this.WebGLService.ViewerWidth = width;
29677
+ this.WebGLService.ViewerHeight = height;
30499
29678
  this.ChangeDetectorRef.detectChanges();
29679
+ this.RefreshViewer();
30500
29680
  }
30501
- this.ViewerWorld.loadModel(webGLJSON);
30502
29681
  }
30503
29682
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabWebglViewerComponent, deps: [{ token: FabrikantenService }, { token: WebGLService }, { token: TranslateService }, { token: MobileService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
30504
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabWebglViewerComponent, isStandalone: false, selector: "app-fab-webgl-viewer", viewQueries: [{ propertyName: "viewercontainer", first: true, predicate: ["viewercontainer"], descendants: true }], ngImport: i0, template: "<div class=\"loader\" *ngIf=\"WebGLService.Loading\">\r\n <app-fab-loader [text]=\"TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductLoading)\"></app-fab-loader>\r\n</div>\r\n\r\n<div class=\"webgl-viewer-main-window\">\r\n <div *ngIf=\"FabrikantenService.ShowVariants()\" class=\"multiplevariants\">\r\n <app-fab-select-bcbproduct></app-fab-select-bcbproduct>\r\n </div>\r\n <div *ngIf=\"ShowWebGL()\" class=\"main-window flex-col\">\r\n <div #viewercontainer class=\"viewer-container\">\r\n <threejs-engine *ngIf=\"ViewerWorld\" [world]=\"ViewerWorld\"></threejs-engine>\r\n </div>\r\n\r\n <div class=\"webgl-settings\" *ngIf=\"MobileService.ShowActionMenu()\">\r\n <mat-card>\r\n <mat-card-content>\r\n <app-fab-actionmenu [display]=\"'3D'\"></app-fab-actionmenu>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n", styles: [".webgl-viewer-main-window{height:calc(100vH - 124px)}.main-window{height:100%}.row{display:flex;line-height:37px}.flex-col{display:flex;flex-direction:column}.multiplevariants{padding:20px}.loader{position:absolute;width:100%;height:100%;justify-content:center}.column{display:flex;flex-direction:column}.webgl-settings{position:absolute;top:10px;right:10px;display:flex}.icon{margin-right:3px}.viewer-container{display:flex;overflow:hidden;height:100%;background-color:#fff;cursor:grab}.viewer-container:active{cursor:grabbing}.row-icon{align-items:center;display:flex}.row-title{flex:auto}.viewer-canvas{background-color:#fff;cursor:grab}button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.toolbar-button{margin-top:3px}.button{margin:5px;width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i7$2.ThreejsEngineComponent, selector: "threejs-engine", inputs: ["world"] }, { kind: "component", type: FabActionmenuComponent, selector: "app-fab-actionmenu", inputs: ["display"] }, { kind: "component", type: FabLoaderComponent, selector: "app-fab-loader", inputs: ["text"] }, { kind: "component", type: FabSelectBcbproductComponent, selector: "app-fab-select-bcbproduct" }] });
29683
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabWebglViewerComponent, isStandalone: false, selector: "app-fab-webgl-viewer", viewQueries: [{ propertyName: "viewercontainer", first: true, predicate: ["viewercontainer"], descendants: true }], ngImport: i0, template: "<div class=\"loader\" *ngIf=\"WebGLService.Loading\">\r\n <app-fab-loader [text]=\"TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductLoading)\"></app-fab-loader>\r\n</div>\r\n\r\n<div class=\"webgl-viewer-main-window\">\r\n <div *ngIf=\"FabrikantenService.ShowVariants()\" class=\"multiplevariants\">\r\n <app-fab-select-bcbproduct></app-fab-select-bcbproduct>\r\n </div>\r\n <div *ngIf=\"ShowWebGL()\" class=\"main-window flex-col\">\r\n <div #viewercontainer class=\"viewer-container\">\r\n <canvas id=\"viewerCanvas\" class=\"viewer-canvas\" [attr.width]=\"WebGLService.ViewerWidth\" [attr.height]=\"WebGLService.ViewerHeight\"></canvas>\r\n </div>\r\n\r\n <div class=\"webgl-settings\" *ngIf=\"MobileService.ShowActionMenu()\">\r\n <mat-card>\r\n <mat-card-content>\r\n <app-fab-actionmenu [display]=\"'3D'\"></app-fab-actionmenu>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n", styles: [".webgl-viewer-main-window{height:calc(100vH - 124px)}.main-window{height:100%}.row{display:flex;line-height:37px}.flex-col{display:flex;flex-direction:column}.multiplevariants{padding:20px}.loader{position:absolute;width:100%;height:100%;justify-content:center}.column{display:flex;flex-direction:column}.webgl-settings{position:absolute;top:10px;right:10px;display:flex}.icon{margin-right:3px}.viewer-container{overflow:auto;height:100%}.row-icon{align-items:center;display:flex}.row-title{flex:auto}.viewer-canvas{background-color:#fff;cursor:grab}button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.toolbar-button{margin-top:3px}.button{margin:5px;width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: FabActionmenuComponent, selector: "app-fab-actionmenu", inputs: ["display"] }, { kind: "component", type: FabLoaderComponent, selector: "app-fab-loader", inputs: ["text"] }, { kind: "component", type: FabSelectBcbproductComponent, selector: "app-fab-select-bcbproduct" }] });
30505
29684
  }
30506
29685
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabWebglViewerComponent, decorators: [{
30507
29686
  type: Component,
30508
- args: [{ selector: 'app-fab-webgl-viewer', standalone: false, template: "<div class=\"loader\" *ngIf=\"WebGLService.Loading\">\r\n <app-fab-loader [text]=\"TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductLoading)\"></app-fab-loader>\r\n</div>\r\n\r\n<div class=\"webgl-viewer-main-window\">\r\n <div *ngIf=\"FabrikantenService.ShowVariants()\" class=\"multiplevariants\">\r\n <app-fab-select-bcbproduct></app-fab-select-bcbproduct>\r\n </div>\r\n <div *ngIf=\"ShowWebGL()\" class=\"main-window flex-col\">\r\n <div #viewercontainer class=\"viewer-container\">\r\n <threejs-engine *ngIf=\"ViewerWorld\" [world]=\"ViewerWorld\"></threejs-engine>\r\n </div>\r\n\r\n <div class=\"webgl-settings\" *ngIf=\"MobileService.ShowActionMenu()\">\r\n <mat-card>\r\n <mat-card-content>\r\n <app-fab-actionmenu [display]=\"'3D'\"></app-fab-actionmenu>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n", styles: [".webgl-viewer-main-window{height:calc(100vH - 124px)}.main-window{height:100%}.row{display:flex;line-height:37px}.flex-col{display:flex;flex-direction:column}.multiplevariants{padding:20px}.loader{position:absolute;width:100%;height:100%;justify-content:center}.column{display:flex;flex-direction:column}.webgl-settings{position:absolute;top:10px;right:10px;display:flex}.icon{margin-right:3px}.viewer-container{display:flex;overflow:hidden;height:100%;background-color:#fff;cursor:grab}.viewer-container:active{cursor:grabbing}.row-icon{align-items:center;display:flex}.row-title{flex:auto}.viewer-canvas{background-color:#fff;cursor:grab}button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.toolbar-button{margin-top:3px}.button{margin:5px;width:100%}\n"] }]
29687
+ args: [{ selector: 'app-fab-webgl-viewer', standalone: false, template: "<div class=\"loader\" *ngIf=\"WebGLService.Loading\">\r\n <app-fab-loader [text]=\"TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductLoading)\"></app-fab-loader>\r\n</div>\r\n\r\n<div class=\"webgl-viewer-main-window\">\r\n <div *ngIf=\"FabrikantenService.ShowVariants()\" class=\"multiplevariants\">\r\n <app-fab-select-bcbproduct></app-fab-select-bcbproduct>\r\n </div>\r\n <div *ngIf=\"ShowWebGL()\" class=\"main-window flex-col\">\r\n <div #viewercontainer class=\"viewer-container\">\r\n <canvas id=\"viewerCanvas\" class=\"viewer-canvas\" [attr.width]=\"WebGLService.ViewerWidth\" [attr.height]=\"WebGLService.ViewerHeight\"></canvas>\r\n </div>\r\n\r\n <div class=\"webgl-settings\" *ngIf=\"MobileService.ShowActionMenu()\">\r\n <mat-card>\r\n <mat-card-content>\r\n <app-fab-actionmenu [display]=\"'3D'\"></app-fab-actionmenu>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n", styles: [".webgl-viewer-main-window{height:calc(100vH - 124px)}.main-window{height:100%}.row{display:flex;line-height:37px}.flex-col{display:flex;flex-direction:column}.multiplevariants{padding:20px}.loader{position:absolute;width:100%;height:100%;justify-content:center}.column{display:flex;flex-direction:column}.webgl-settings{position:absolute;top:10px;right:10px;display:flex}.icon{margin-right:3px}.viewer-container{overflow:auto;height:100%}.row-icon{align-items:center;display:flex}.row-title{flex:auto}.viewer-canvas{background-color:#fff;cursor:grab}button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.toolbar-button{margin-top:3px}.button{margin:5px;width:100%}\n"] }]
30509
29688
  }], ctorParameters: () => [{ type: FabrikantenService }, { type: WebGLService }, { type: TranslateService }, { type: MobileService }, { type: i0.ChangeDetectorRef }], propDecorators: { viewercontainer: [{
30510
29689
  type: ViewChild,
30511
29690
  args: ['viewercontainer']
@@ -30649,7 +29828,7 @@ class FabProductComponent {
30649
29828
  return this.MobileService.NavMode;
30650
29829
  }
30651
29830
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabProductComponent, deps: [{ token: MobileService }, { token: FabrikantenService }, { token: BestekService }, { token: TranslateService }, { token: WebGLService }, { token: i3.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
30652
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabProductComponent, isStandalone: false, selector: "app-fab-product", viewQueries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"FabrikantenService.IsLoadingSmall()\" [ngClass]=\"HasParameter() ? GetParameterClass() : ''\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<mat-drawer-container class=\"view-container\" [ngClass]=\"HasParameter() ? GetParameterClass() : ''\" *ngIf=\"FabrikantenService.Loaded\">\r\n <mat-drawer #drawer [mode]=\"GetNavMode()\" [(opened)]=\"MobileService.NavOpened\" *ngIf=\"FabrikantenService.FabrikantenViewModel != null\">\r\n <div class=\"filter-view\">\r\n <fab-filters-input></fab-filters-input>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer mode=\"over\" position=\"end\" [(opened)]=\"MobileService.ActionOpened\">\r\n <div class=\"actionwrapper\">\r\n <app-fab-actionmenu [display]=\"FabrikantenService.SelectedTab\"></app-fab-actionmenu>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer-content class=\"view-content\">\r\n <div #header *ngIf=\"ShowBreadcrumb()\">\r\n <app-fab-header [showfiltermenubutton]=\"true\"></app-fab-header>\r\n\r\n <ng-container *ngIf=\"ShowInformationBlock()\">\r\n <app-fab-product-info></app-fab-product-info>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"FabrikantenService.ShowRequired()\">\r\n <div class=\"required-div\">{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.NotAllRequiredFilled) }}</div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"FabrikantenService.ShowNoParameters() && !FabrikantenService.IsLoading()\">\r\n <div class=\"no-parameters-div\">\r\n No product request send to BCB due to invalid or missing parameters\r\n </div>\r\n <div class=\"required-div\">\r\n <ng-container *ngIf=\"FabrikantenService.FabrikantenViewModel?.customInfoParameters != undefined\">\r\n <ng-container *ngFor=\"let customparameter of FabrikantenService.FabrikantenViewModel.customInfoParameters\">\r\n <div class=\"display-value-item\">\r\n {{ customparameter.name }}: {{ customparameter.value }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!FabrikantenService.ShowRequired() && !FabrikantenService.ShowNoParameters()\">\r\n <div [style.height]=\"Height\" *ngIf=\"FabrikantenService.FabrikantenViewModel != null\">\r\n <mat-tab-group class=\"view-container\" [selectedIndex]=\"FabrikantenService.SelectedTabIndex\" (selectedTabChange)=\"SelectedTabChange($event)\">\r\n <mat-tab label=\"Informatie\" *ngIf=\"ShowInformation()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TabInformation) }}</span>\r\n </ng-template>\r\n <app-fab-product-info></app-fab-product-info>\r\n </mat-tab>\r\n <mat-tab label=\"3D\" *ngIf=\"Show3D()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Tab3D) }}</span>\r\n </ng-template>\r\n <app-fab-webgl-viewer></app-fab-webgl-viewer>\r\n </mat-tab>\r\n <mat-tab label=\"2D\" *ngIf=\"Show2D()\" style=\"height: 100%;\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Tab2D) }}</span>\r\n </ng-template>\r\n <app-fab-svg-viewer></app-fab-svg-viewer>\r\n </mat-tab>\r\n <mat-tab label=\"Bestek\" *ngIf=\"ShowSpecification()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TabSpecification) }}</span>\r\n </ng-template>\r\n <app-fab-product-bestek *ngIf=\"TranslateService.ShowSpecification()\"></app-fab-product-bestek>\r\n <app-fab-product-auto-specification *ngIf=\"TranslateService.ShowAutoSpecification()\"></app-fab-product-auto-specification>\r\n <app-fab-product-lastenboek *ngIf=\"TranslateService.ShowLastenboek()\"></app-fab-product-lastenboek>\r\n </mat-tab>\r\n <mat-tab label=\"Texture\" *ngIf=\"FabrikantenService.ShowTexture()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Texture) }}</span>\r\n </ng-template>\r\n <app-fab-texture></app-fab-texture>\r\n </mat-tab>\r\n <mat-tab label=\"Toebehoren\" *ngIf=\"FabrikantenService.ShowToebehoren()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Toebehoren) }}</span>\r\n </ng-template>\r\n <app-fab-toebehoren></app-fab-toebehoren>\r\n </mat-tab>\r\n </mat-tab-group>\r\n </div>\r\n </ng-container>\r\n </mat-drawer-content>\r\n</mat-drawer-container>\r\n\r\n\r\n", styles: ["app-fab-product .tabs{height:100%}app-fab-product .no-parameters-div{padding:5px}app-fab-product .required-div{padding:40px}app-fab-product .row{display:flex}app-fab-product .loader-card{margin:auto;width:300px}app-fab-product .loader-subtitle{text-align:center;padding-top:20px;padding-bottom:10px}app-fab-product .actionwrapper{width:250px;padding:20px}app-fab-product .loader-spinner{margin:auto}app-fab-product .view-container{height:100%}app-fab-product .view-content{background-color:#fff}app-fab-product .loader{position:fixed;display:flex;width:100%;height:100%;align-items:center;z-index:20;background-color:#ffffffb3;top:0;left:0}app-fab-product .filter-view{height:100%;width:300px;min-width:300px;background-color:#fafafa}app-fab-product .product-view{flex:auto}app-fab-product .mat-drawer-inner-container{overflow-y:scroll}.mat-tab-body-wrapper{height:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6$2.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i9$2.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i9$2.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i9$2.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "directive", type: i10$1.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i10$1.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i10$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: FabActionmenuComponent, selector: "app-fab-actionmenu", inputs: ["display"] }, { kind: "component", type: FabFiltersInputComponent, selector: "fab-filters-input", inputs: ["displayExtra"] }, { kind: "component", type: FabHeaderComponent, selector: "app-fab-header", inputs: ["showfiltermenubutton"] }, { kind: "component", type: FabProductAutoSpecificationComponent, selector: "app-fab-product-auto-specification" }, { kind: "component", type: FabProductBestekComponent, selector: "app-fab-product-bestek" }, { kind: "component", type: FabProductInfoComponent, selector: "app-fab-product-info" }, { kind: "component", type: FabProductLastenboekComponent, selector: "app-fab-product-lastenboek" }, { kind: "component", type: FabSvgViewerComponent, selector: "app-fab-svg-viewer" }, { kind: "component", type: FabTextureComponent, selector: "app-fab-texture" }, { kind: "component", type: FabToebehorenComponent, selector: "app-fab-toebehoren" }, { kind: "component", type: FabWebglViewerComponent, selector: "app-fab-webgl-viewer" }], encapsulation: i0.ViewEncapsulation.None });
29831
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabProductComponent, isStandalone: false, selector: "app-fab-product", viewQueries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"FabrikantenService.IsLoadingSmall()\" [ngClass]=\"HasParameter() ? GetParameterClass() : ''\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<mat-drawer-container class=\"view-container\" [ngClass]=\"HasParameter() ? GetParameterClass() : ''\" *ngIf=\"FabrikantenService.Loaded\">\r\n <mat-drawer #drawer [mode]=\"GetNavMode()\" [(opened)]=\"MobileService.NavOpened\" *ngIf=\"FabrikantenService.FabrikantenViewModel != null\">\r\n <div class=\"filter-view\">\r\n <fab-filters-input></fab-filters-input>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer mode=\"over\" position=\"end\" [(opened)]=\"MobileService.ActionOpened\">\r\n <div class=\"actionwrapper\">\r\n <app-fab-actionmenu [display]=\"FabrikantenService.SelectedTab\"></app-fab-actionmenu>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer-content class=\"view-content\">\r\n <div #header *ngIf=\"ShowBreadcrumb()\">\r\n <app-fab-header [showfiltermenubutton]=\"true\"></app-fab-header>\r\n\r\n <ng-container *ngIf=\"ShowInformationBlock()\">\r\n <app-fab-product-info></app-fab-product-info>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"FabrikantenService.ShowRequired()\">\r\n <div class=\"required-div\">{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.NotAllRequiredFilled) }}</div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"FabrikantenService.ShowNoParameters() && !FabrikantenService.IsLoading()\">\r\n <div class=\"no-parameters-div\">\r\n No product request send to BCB due to invalid or missing parameters\r\n </div>\r\n <div class=\"required-div\">\r\n <ng-container *ngIf=\"FabrikantenService.FabrikantenViewModel?.customInfoParameters != undefined\">\r\n <ng-container *ngFor=\"let customparameter of FabrikantenService.FabrikantenViewModel.customInfoParameters\">\r\n <div class=\"display-value-item\">\r\n {{ customparameter.name }}: {{ customparameter.value }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!FabrikantenService.ShowRequired() && !FabrikantenService.ShowNoParameters()\">\r\n <div [style.height]=\"Height\" *ngIf=\"FabrikantenService.FabrikantenViewModel != null\">\r\n <mat-tab-group class=\"view-container\" [selectedIndex]=\"FabrikantenService.SelectedTabIndex\" (selectedTabChange)=\"SelectedTabChange($event)\">\r\n <mat-tab label=\"Informatie\" *ngIf=\"ShowInformation()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TabInformation) }}</span>\r\n </ng-template>\r\n <app-fab-product-info></app-fab-product-info>\r\n </mat-tab>\r\n <mat-tab label=\"3D\" *ngIf=\"Show3D()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Tab3D) }}</span>\r\n </ng-template>\r\n <app-fab-webgl-viewer></app-fab-webgl-viewer>\r\n </mat-tab>\r\n <mat-tab label=\"2D\" *ngIf=\"Show2D()\" style=\"height: 100%;\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Tab2D) }}</span>\r\n </ng-template>\r\n <app-fab-svg-viewer></app-fab-svg-viewer>\r\n </mat-tab>\r\n <mat-tab label=\"Bestek\" *ngIf=\"ShowSpecification()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TabSpecification) }}</span>\r\n </ng-template>\r\n <app-fab-product-bestek *ngIf=\"TranslateService.ShowSpecification()\"></app-fab-product-bestek>\r\n <app-fab-product-auto-specification *ngIf=\"TranslateService.ShowAutoSpecification()\"></app-fab-product-auto-specification>\r\n <app-fab-product-lastenboek *ngIf=\"TranslateService.ShowLastenboek()\"></app-fab-product-lastenboek>\r\n </mat-tab>\r\n <mat-tab label=\"Texture\" *ngIf=\"FabrikantenService.ShowTexture()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Texture) }}</span>\r\n </ng-template>\r\n <app-fab-texture></app-fab-texture>\r\n </mat-tab>\r\n <mat-tab label=\"Toebehoren\" *ngIf=\"FabrikantenService.ShowToebehoren()\">\r\n <ng-template mat-tab-label>\r\n <span>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Toebehoren) }}</span>\r\n </ng-template>\r\n <app-fab-toebehoren></app-fab-toebehoren>\r\n </mat-tab>\r\n </mat-tab-group>\r\n </div>\r\n </ng-container>\r\n </mat-drawer-content>\r\n</mat-drawer-container>\r\n\r\n\r\n", styles: ["app-fab-product .tabs{height:100%}app-fab-product .no-parameters-div{padding:5px}app-fab-product .required-div{padding:40px}app-fab-product .row{display:flex}app-fab-product .loader-card{margin:auto;width:300px}app-fab-product .loader-subtitle{text-align:center;padding-top:20px;padding-bottom:10px}app-fab-product .actionwrapper{width:250px;padding:20px}app-fab-product .loader-spinner{margin:auto}app-fab-product .view-container{height:100%}app-fab-product .view-content{background-color:#fff}app-fab-product .loader{position:fixed;display:flex;width:100%;height:100%;align-items:center;z-index:20;background-color:#ffffffb3;top:0;left:0}app-fab-product .filter-view{height:100%;width:300px;min-width:300px;background-color:#fafafa}app-fab-product .product-view{flex:auto}app-fab-product .mat-drawer-inner-container{overflow-y:scroll}.mat-tab-body-wrapper{height:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6$2.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i9$3.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i9$3.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i9$3.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "directive", type: i10$1.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i10$1.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i10$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: FabActionmenuComponent, selector: "app-fab-actionmenu", inputs: ["display"] }, { kind: "component", type: FabFiltersInputComponent, selector: "fab-filters-input", inputs: ["displayExtra"] }, { kind: "component", type: FabHeaderComponent, selector: "app-fab-header", inputs: ["showfiltermenubutton"] }, { kind: "component", type: FabProductAutoSpecificationComponent, selector: "app-fab-product-auto-specification" }, { kind: "component", type: FabProductBestekComponent, selector: "app-fab-product-bestek" }, { kind: "component", type: FabProductInfoComponent, selector: "app-fab-product-info" }, { kind: "component", type: FabProductLastenboekComponent, selector: "app-fab-product-lastenboek" }, { kind: "component", type: FabSvgViewerComponent, selector: "app-fab-svg-viewer" }, { kind: "component", type: FabTextureComponent, selector: "app-fab-texture" }, { kind: "component", type: FabToebehorenComponent, selector: "app-fab-toebehoren" }, { kind: "component", type: FabWebglViewerComponent, selector: "app-fab-webgl-viewer" }], encapsulation: i0.ViewEncapsulation.None });
30653
29832
  }
30654
29833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabProductComponent, decorators: [{
30655
29834
  type: Component,
@@ -30842,7 +30021,7 @@ class FabProductSelectComponent {
30842
30021
  return products;
30843
30022
  }
30844
30023
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabProductSelectComponent, deps: [{ token: MobileService }, { token: FabrikantenService }, { token: BestekService }, { token: TranslateService }, { token: i3.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
30845
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabProductSelectComponent, isStandalone: false, selector: "app-fab-product-select", viewQueries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "info", first: true, predicate: ["info"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"FabrikantenService.IsLoadingSmall()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<mat-drawer-container class=\"view-container\" *ngIf=\"FabrikantenService.FabrikantenViewModel != null\">\r\n <mat-drawer #drawer [mode]=\"MobileService.NavMode\" [(opened)]=\"MobileService.NavOpened\">\r\n <div class=\"filter-view\">\r\n <fab-filters-input></fab-filters-input>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer-content class=\"view-content\">\r\n <div #header>\r\n <app-fab-header [showfiltermenubutton]=\"true\"></app-fab-header>\r\n </div>\r\n\r\n <div #info class=\"header\">\r\n <div class=\"title\">\r\n <h1>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductSelection) }}</h1>\r\n </div>\r\n <div class=\"subtitle\" *ngIf=\"!FabrikantenService.FabrikantenViewModel.productSelectBlockedByFilters\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductSelectionInfo) }}\r\n </div>\r\n <div class=\"subtitle\" *ngIf=\"FabrikantenService.FabrikantenViewModel.productSelectBlockedByFilters\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductSelectionBlocked) }}\r\n </div>\r\n </div>\r\n\r\n <div [style.height]=\"Height\" *ngIf=\"!FabrikantenService.FabrikantenViewModel.productSelectBlockedByFilters\">\r\n <ng-container *ngIf=\"IsGrouped()\">\r\n <ng-container *ngFor=\"let group of GetGroups()\">\r\n <div class=\"group-header\">\r\n {{ group }}\r\n </div>\r\n <div class=\"main-window group-collection\">\r\n <app-fab-product-tile *ngFor=\"let product of GetProducts(group)\" [product]=\"product\"></app-fab-product-tile>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!IsGrouped()\">\r\n <div class=\"main-window\">\r\n <app-fab-product-tile *ngFor=\"let product of FabrikantenService.FabrikantenViewModel.products\" [product]=\"product\"></app-fab-product-tile>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </mat-drawer-content>\r\n</mat-drawer-container>\r\n\r\n\r\n", styles: ["app-fab-product-select .main-window{display:flex;flex-flow:row wrap;overflow:auto}app-fab-product-select .group-header{border-bottom:1px solid #000;margin:10px;font-size:16px}app-fab-product-select .group-collection{margin:10px}app-fab-product-select .subtitle{margin-bottom:10px}app-fab-product-select .subtitle:first-letter{text-transform:uppercase}app-fab-product-select .title:first-letter{text-transform:uppercase}app-fab-product-select .header{padding:4px}app-fab-product-select .row{display:flex}app-fab-product-select .loader-card{margin:auto;width:300px}app-fab-product-select .loader-subtitle{text-align:center;padding-top:20px;padding-bottom:10px}app-fab-product-select .loader-spinner{margin:auto}app-fab-product-select .view-container{height:100%}app-fab-product-select .view-content{background-color:#fff}app-fab-product-select .loader{position:fixed;width:100%;height:100%;display:flex;align-items:center;z-index:20;background-color:#ffffffb3;top:0;left:0}app-fab-product-select .filter-view{width:300px;min-width:300px;background-color:#fafafa;height:100%}app-fab-product-select .product-view{flex:auto}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6$2.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i9$2.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i9$2.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i9$2.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: FabFiltersInputComponent, selector: "fab-filters-input", inputs: ["displayExtra"] }, { kind: "component", type: FabHeaderComponent, selector: "app-fab-header", inputs: ["showfiltermenubutton"] }, { kind: "component", type: FabProductTileComponent, selector: "app-fab-product-tile", inputs: ["product"] }], encapsulation: i0.ViewEncapsulation.None });
30024
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.13", type: FabProductSelectComponent, isStandalone: false, selector: "app-fab-product-select", viewQueries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "info", first: true, predicate: ["info"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"FabrikantenService.IsLoadingSmall()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<mat-drawer-container class=\"view-container\" *ngIf=\"FabrikantenService.FabrikantenViewModel != null\">\r\n <mat-drawer #drawer [mode]=\"MobileService.NavMode\" [(opened)]=\"MobileService.NavOpened\">\r\n <div class=\"filter-view\">\r\n <fab-filters-input></fab-filters-input>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer-content class=\"view-content\">\r\n <div #header>\r\n <app-fab-header [showfiltermenubutton]=\"true\"></app-fab-header>\r\n </div>\r\n\r\n <div #info class=\"header\">\r\n <div class=\"title\">\r\n <h1>{{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductSelection) }}</h1>\r\n </div>\r\n <div class=\"subtitle\" *ngIf=\"!FabrikantenService.FabrikantenViewModel.productSelectBlockedByFilters\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductSelectionInfo) }}\r\n </div>\r\n <div class=\"subtitle\" *ngIf=\"FabrikantenService.FabrikantenViewModel.productSelectBlockedByFilters\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductSelectionBlocked) }}\r\n </div>\r\n </div>\r\n\r\n <div [style.height]=\"Height\" *ngIf=\"!FabrikantenService.FabrikantenViewModel.productSelectBlockedByFilters\">\r\n <ng-container *ngIf=\"IsGrouped()\">\r\n <ng-container *ngFor=\"let group of GetGroups()\">\r\n <div class=\"group-header\">\r\n {{ group }}\r\n </div>\r\n <div class=\"main-window group-collection\">\r\n <app-fab-product-tile *ngFor=\"let product of GetProducts(group)\" [product]=\"product\"></app-fab-product-tile>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!IsGrouped()\">\r\n <div class=\"main-window\">\r\n <app-fab-product-tile *ngFor=\"let product of FabrikantenService.FabrikantenViewModel.products\" [product]=\"product\"></app-fab-product-tile>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </mat-drawer-content>\r\n</mat-drawer-container>\r\n\r\n\r\n", styles: ["app-fab-product-select .main-window{display:flex;flex-flow:row wrap;overflow:auto}app-fab-product-select .group-header{border-bottom:1px solid #000;margin:10px;font-size:16px}app-fab-product-select .group-collection{margin:10px}app-fab-product-select .subtitle{margin-bottom:10px}app-fab-product-select .subtitle:first-letter{text-transform:uppercase}app-fab-product-select .title:first-letter{text-transform:uppercase}app-fab-product-select .header{padding:4px}app-fab-product-select .row{display:flex}app-fab-product-select .loader-card{margin:auto;width:300px}app-fab-product-select .loader-subtitle{text-align:center;padding-top:20px;padding-bottom:10px}app-fab-product-select .loader-spinner{margin:auto}app-fab-product-select .view-container{height:100%}app-fab-product-select .view-content{background-color:#fff}app-fab-product-select .loader{position:fixed;width:100%;height:100%;display:flex;align-items:center;z-index:20;background-color:#ffffffb3;top:0;left:0}app-fab-product-select .filter-view{width:300px;min-width:300px;background-color:#fafafa;height:100%}app-fab-product-select .product-view{flex:auto}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6$2.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6$2.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i9$3.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i9$3.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i9$3.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: FabFiltersInputComponent, selector: "fab-filters-input", inputs: ["displayExtra"] }, { kind: "component", type: FabHeaderComponent, selector: "app-fab-header", inputs: ["showfiltermenubutton"] }, { kind: "component", type: FabProductTileComponent, selector: "app-fab-product-tile", inputs: ["product"] }], encapsulation: i0.ViewEncapsulation.None });
30846
30025
  }
30847
30026
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: FabProductSelectComponent, decorators: [{
30848
30027
  type: Component,
@@ -33430,8 +32609,7 @@ class FabrikantenCoreModule {
33430
32609
  MatFormFieldModule,
33431
32610
  MatSnackBarModule,
33432
32611
  ReactiveFormsModule,
33433
- SafehtmlPipe,
33434
- ThreejsEngineComponent, i3.RouterModule], exports: [FabActionmenuComponent,
32612
+ SafehtmlPipe, i3.RouterModule], exports: [FabActionmenuComponent,
33435
32613
  FabCategoryNavigatorComponent,
33436
32614
  FabFilterColourDialogComponent,
33437
32615
  FabFilterComponent,
@@ -33512,7 +32690,6 @@ class FabrikantenCoreModule {
33512
32690
  MatFormFieldModule,
33513
32691
  MatSnackBarModule,
33514
32692
  ReactiveFormsModule,
33515
- ThreejsEngineComponent,
33516
32693
  RouterModule.forRoot(routes, {
33517
32694
  scrollPositionRestoration: 'enabled',
33518
32695
  anchorScrolling: 'enabled',
@@ -33554,7 +32731,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
33554
32731
  MatSnackBarModule,
33555
32732
  ReactiveFormsModule,
33556
32733
  SafehtmlPipe,
33557
- ThreejsEngineComponent,
33558
32734
  RouterModule.forRoot(routes, {
33559
32735
  scrollPositionRestoration: 'enabled',
33560
32736
  anchorScrolling: 'enabled',