@rtsee/ngx 0.0.90 → 0.0.93

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,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, Input, Component, ViewChild, Directive, DOCUMENT, HostListener, Inject, EventEmitter, Output, output, CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
3
3
  import * as i2$1 from '@angular/common';
4
- import { NgClass, NgIf, NgForOf, SlicePipe, NgStyle, NgOptimizedImage, CommonModule } from '@angular/common';
4
+ import { NgClass, NgIf, NgForOf, SlicePipe, NgStyle, DatePipe, NgOptimizedImage, CommonModule } from '@angular/common';
5
5
  import * as i1 from '@angular/forms';
6
6
  import { FormsModule, FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
7
7
  import { Select } from 'primeng/select';
@@ -37,26 +37,25 @@ import * as i1$2 from 'primeng/api';
37
37
  import { MessageService } from 'primeng/api';
38
38
  import Swiper from 'swiper';
39
39
  import { EffectCards, Manipulation } from 'swiper/modules';
40
+ import { OrderList } from 'primeng/orderlist';
41
+ import { Checkbox } from 'primeng/checkbox';
40
42
  import { InputNumber } from 'primeng/inputnumber';
41
43
  import * as i1$3 from 'primeng/autocomplete';
42
44
  import { AutoCompleteModule } from 'primeng/autocomplete';
43
- import { OrderList } from 'primeng/orderlist';
44
- import { ToggleSwitch } from 'primeng/toggleswitch';
45
45
  import { Tabs, TabList, Tab, TabPanels, TabPanel } from 'primeng/tabs';
46
46
  import { ColorPicker } from 'primeng/colorpicker';
47
47
  import { Slider } from 'primeng/slider';
48
48
  import { Fieldset } from 'primeng/fieldset';
49
49
  import { Tag } from 'primeng/tag';
50
50
  import { Listbox } from 'primeng/listbox';
51
+ import { RTSeeRater, RecursiveSelect } from '@rtsee/utilities-ui';
51
52
  import { RTSeeRoutesList } from '@rtsee/factory';
52
53
  import { Avatar } from 'primeng/avatar';
53
54
  import { Image } from 'primeng/image';
54
55
  import { Tooltip } from 'primeng/tooltip';
55
56
  import { PanelMenu } from 'primeng/panelmenu';
56
- import { RecursiveSelect } from '@rtsee/utilities-ui';
57
57
  import { Menu } from 'primeng/menu';
58
58
  import { Password } from 'primeng/password';
59
- import { Checkbox } from 'primeng/checkbox';
60
59
  import { AutosizeModule } from 'ngx-autosize';
61
60
  import { debounceTime } from 'rxjs/operators';
62
61
  import shave from 'shave';
@@ -90,9 +89,7 @@ class RTSeeControlsComponent {
90
89
  }
91
90
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RTSeeControlsComponent, decorators: [{
92
91
  type: Component,
93
- args: [{ selector: 'ngx-rtsee-controls', imports: [
94
- NgClass
95
- ], standalone: true, template: "<div class=\"rtsee-controls\" [ngClass]=\"{'rtsee-full-screen-controls' : fullScreenMode }\">\n <div class=\"rtsee-bottom-panel\">\n <div class=\"mic rtsee-buttons-container\">\n @if (rtsee.microphone) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"this.rtsee.disableMicrophone()\"\n >\n <span class=\"material-icons-outlined\">mic_none</span>\n </button>\n }\n @if (!rtsee.microphone) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\" (click)=\"this.rtsee.enableMicrophone()\"\n >\n <span class=\"material-icons-outlined\">mic_off</span>\n </button>\n }\n </div>\n\n <div class=\"video-camera rtsee-buttons-container\">\n @if (rtsee.camera) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"rtsee.disableCamera()\"\n >\n <span class=\"material-icons-outlined\">videocam</span>\n </button>\n }\n @if (!rtsee.camera) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"rtsee.enableCamera()\"\n >\n <span class=\"material-icons-outlined\">videocam_off</span>\n </button>\n }\n </div>\n <div class=\"present rtsee-buttons-container\"\n [ngClass]=\"{'rtsee-present-button-container': rtsee.isPresenter}\"\n >\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"onPresentClicked()\"\n >\n <span class=\"material-icons-outlined\">present_to_all</span>\n </button>\n </div>\n <div class=\"call-end rtsee-buttons-container\">\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"rtsee.end()\"\n >\n <span class=\"material-icons-outlined\">call_end</span>\n </button>\n </div>\n </div>\n</div>\n", styles: [".rtsee-controls{display:inline-block;height:100%}.rtsee-controls .rtsee-buttons-container{height:45px;width:45px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 9px;cursor:pointer;background-color:#fff}.rtsee-controls .rtsee-buttons-container .rtsee-ripple-button{border:none;outline:none;background-color:transparent;cursor:pointer}.rtsee-controls .rtsee-buttons-container:last-child{margin-right:0}.rtsee-controls .rtsee-buttons-container:first-child{margin-left:0}.rtsee-controls .rtsee-buttons-container .mdc-icon-button{background-color:#333;color:#fff}.rtsee-controls .rtsee-buttons-container.call-end{background-color:#ff3232}.rtsee-controls .rtsee-buttons-container.rtsee-present-button-container .mdc-icon-button{background-color:#090}.rtsee-controls .full-screen{align-self:flex-end;padding:12px;cursor:pointer}.rtsee-controls .rtsee-bottom-panel{padding:12px;display:flex;justify-content:center;align-items:center;border-radius:45px;background-color:#000000b3}.rtsee-controls.rtsee-full-screen-controls .rtsee-buttons-container{height:60px;width:60px}\n"] }]
92
+ args: [{ selector: 'ngx-rtsee-controls', imports: [NgClass], standalone: true, template: "<div class=\"rtsee-controls\" [ngClass]=\"{'rtsee-full-screen-controls' : fullScreenMode }\">\n <div class=\"rtsee-bottom-panel\">\n <div class=\"mic rtsee-buttons-container\">\n @if (rtsee.microphone) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"this.rtsee.disableMicrophone()\"\n >\n <span class=\"material-icons-outlined\">mic_none</span>\n </button>\n }\n @if (!rtsee.microphone) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\" (click)=\"this.rtsee.enableMicrophone()\"\n >\n <span class=\"material-icons-outlined\">mic_off</span>\n </button>\n }\n </div>\n\n <div class=\"video-camera rtsee-buttons-container\">\n @if (rtsee.camera) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"rtsee.disableCamera()\"\n >\n <span class=\"material-icons-outlined\">videocam</span>\n </button>\n }\n @if (!rtsee.camera) {\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"rtsee.enableCamera()\"\n >\n <span class=\"material-icons-outlined\">videocam_off</span>\n </button>\n }\n </div>\n <div class=\"present rtsee-buttons-container\"\n [ngClass]=\"{'rtsee-present-button-container': rtsee.isPresenter}\"\n >\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"onPresentClicked()\"\n >\n <span class=\"material-icons-outlined\">present_to_all</span>\n </button>\n </div>\n <div class=\"call-end rtsee-buttons-container\">\n <button class=\"rtsee-ripple-button\"\n type=\"button\"\n (click)=\"rtsee.end()\"\n >\n <span class=\"material-icons-outlined\">call_end</span>\n </button>\n </div>\n </div>\n</div>\n", styles: [".rtsee-controls{display:inline-block;height:100%}.rtsee-controls .rtsee-buttons-container{height:45px;width:45px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 9px;cursor:pointer;background-color:#fff}.rtsee-controls .rtsee-buttons-container .rtsee-ripple-button{border:none;outline:none;background-color:transparent;cursor:pointer}.rtsee-controls .rtsee-buttons-container:last-child{margin-right:0}.rtsee-controls .rtsee-buttons-container:first-child{margin-left:0}.rtsee-controls .rtsee-buttons-container .mdc-icon-button{background-color:#333;color:#fff}.rtsee-controls .rtsee-buttons-container.call-end{background-color:#ff3232}.rtsee-controls .rtsee-buttons-container.rtsee-present-button-container .mdc-icon-button{background-color:#090}.rtsee-controls .full-screen{align-self:flex-end;padding:12px;cursor:pointer}.rtsee-controls .rtsee-bottom-panel{padding:12px;display:flex;justify-content:center;align-items:center;border-radius:45px;background-color:#000000b3}.rtsee-controls.rtsee-full-screen-controls .rtsee-buttons-container{height:60px;width:60px}\n"] }]
96
93
  }], propDecorators: { rtsee: [{
97
94
  type: Input
98
95
  }], fullScreenMode: [{
@@ -121,13 +118,7 @@ class RtseeSettingsComponent {
121
118
  }
122
119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeSettingsComponent, decorators: [{
123
120
  type: Component,
124
- args: [{ selector: 'ngx-rtsee-settings', imports: [
125
- NgClass,
126
- FormsModule,
127
- Select,
128
- FloatLabel,
129
- Button
130
- ], standalone: true, template: "<div class=\"rtsee-settings\" [ngClass]=\"{'rtsee-full-screen-settings' : fullScreenMode}\">\n <div class=\"rtsee-devices rtsee-form-container\">\n <div class=\"rtsee-device-select-wrapper rtsee-form-field-container\">\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"rtSee.audioInputDevices\"\n [(ngModel)]=\"rtSee.audioInputDeviceId\"\n (ngModelChange)=\"audioInputChanged()\"\n inputId=\"mic_input\"\n optionLabel=\"label\"\n optionValue=\"deviceId\"\n class=\"rtsee-device-select-field\" />\n <label for=\"mic_input\">Microphone</label>\n </p-floatlabel>\n </div>\n <div class=\"rtsee-device-select-wrapper rtsee-form-field-container\">\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"rtSee.audioOutputDevices\"\n [(ngModel)]=\"rtSee.audioOutputDeviceId\"\n (ngModelChange)=\"audioOutputChanged()\"\n inputId=\"audio_output\"\n optionLabel=\"label\"\n optionValue=\"deviceId\"\n class=\"rtsee-device-select-field\" />\n <label for=\"audio_output\">Speaker</label>\n </p-floatlabel>\n </div>\n <div class=\"rtsee-device-select-wrapper rtsee-form-field-container\">\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"rtSee.videoInputDevices\"\n [(ngModel)]=\"rtSee.videoInputDeviceId\"\n (ngModelChange)=\"videoInputChanged()\"\n inputId=\"video_input\"\n optionLabel=\"label\"\n optionValue=\"deviceId\"\n class=\"rtsee-device-select-field\" />\n <label for=\"video_input\">Camera</label>\n </p-floatlabel>\n </div>\n </div>\n\n <div class=\"rtsee-settings-footer\">\n <p-button label=\"Close\"\n (click)=\"rtSee.toggleSettings()\"\n ></p-button>\n </div>\n</div>\n", styles: [".rtsee-settings{position:fixed;height:100%;width:100%;inset:0;overflow:auto;box-sizing:border-box;background-color:#404040;border-bottom:1px solid;padding:16px 8px;z-index:4}.rtsee-settings .rtsee-settings-footer{padding-top:16px}.rtsee-settings .rtsee-form-field-container:last-child{padding-bottom:0}.rtsee-settings .rtsee-form-field-container{padding-bottom:16px}.rtsee-settings .rtsee-device-select-field{width:100%}.rtsee-settings .rtsee-device-select-field.p-component.p-overlay{max-height:100%}.rtsee-settings.rtsee-full-screen-settings{max-height:unset;overflow:unset}\n"] }]
121
+ args: [{ selector: 'ngx-rtsee-settings', imports: [NgClass, FormsModule, Select, FloatLabel, Button], standalone: true, template: "<div class=\"rtsee-settings\" [ngClass]=\"{'rtsee-full-screen-settings' : fullScreenMode}\">\n <div class=\"rtsee-devices rtsee-form-container\">\n <div class=\"rtsee-device-select-wrapper rtsee-form-field-container\">\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"rtSee.audioInputDevices\"\n [(ngModel)]=\"rtSee.audioInputDeviceId\"\n (ngModelChange)=\"audioInputChanged()\"\n inputId=\"mic_input\"\n optionLabel=\"label\"\n optionValue=\"deviceId\"\n class=\"rtsee-device-select-field\" />\n <label for=\"mic_input\">Microphone</label>\n </p-floatlabel>\n </div>\n <div class=\"rtsee-device-select-wrapper rtsee-form-field-container\">\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"rtSee.audioOutputDevices\"\n [(ngModel)]=\"rtSee.audioOutputDeviceId\"\n (ngModelChange)=\"audioOutputChanged()\"\n inputId=\"audio_output\"\n optionLabel=\"label\"\n optionValue=\"deviceId\"\n class=\"rtsee-device-select-field\" />\n <label for=\"audio_output\">Speaker</label>\n </p-floatlabel>\n </div>\n <div class=\"rtsee-device-select-wrapper rtsee-form-field-container\">\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"rtSee.videoInputDevices\"\n [(ngModel)]=\"rtSee.videoInputDeviceId\"\n (ngModelChange)=\"videoInputChanged()\"\n inputId=\"video_input\"\n optionLabel=\"label\"\n optionValue=\"deviceId\"\n class=\"rtsee-device-select-field\" />\n <label for=\"video_input\">Camera</label>\n </p-floatlabel>\n </div>\n </div>\n\n <div class=\"rtsee-settings-footer\">\n <p-button label=\"Close\"\n (click)=\"rtSee.toggleSettings()\"\n ></p-button>\n </div>\n</div>\n", styles: [".rtsee-settings{position:fixed;height:100%;width:100%;inset:0;overflow:auto;box-sizing:border-box;background-color:#404040;border-bottom:1px solid;padding:16px 8px;z-index:4}.rtsee-settings .rtsee-settings-footer{padding-top:16px}.rtsee-settings .rtsee-form-field-container:last-child{padding-bottom:0}.rtsee-settings .rtsee-form-field-container{padding-bottom:16px}.rtsee-settings .rtsee-device-select-field{width:100%}.rtsee-settings .rtsee-device-select-field.p-component.p-overlay{max-height:100%}.rtsee-settings.rtsee-full-screen-settings{max-height:unset;overflow:unset}\n"] }]
131
122
  }], ctorParameters: () => [], propDecorators: { rtSee: [{
132
123
  type: Input
133
124
  }], fullScreenMode: [{
@@ -200,11 +191,7 @@ class RtseePeerComponent {
200
191
  }
201
192
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseePeerComponent, decorators: [{
202
193
  type: Component,
203
- args: [{ selector: 'ngx-rtsee-peer', imports: [
204
- NgClass,
205
- NgIf,
206
- RtseeSoundbarComponent
207
- ], standalone: true, template: "<div class=\"rtsee-peer\" [ngClass]=\"{\n'rtsee-peer-video-disabled': !peer.remoteVideoStream || !peer.camera\n}\">\n <div class=\"rtsee-peer-content\">\n <div class=\"rtsee-peer-photo\" *ngIf=\"!peer.camera\">\n <div class=\"rtsee-peer-photo-wrapper\">\n <div *ngIf=\"peer.imageUrl\"\n [style.background-image]=\"'url(' + peer.imageUrl + ')'\"\n class=\"rtsee-peer-photo-image\"\n ></div>\n <img *ngIf=\"!peer.imageUrl\" [src]=\"\" alt=\"peer_photo\" class=\"rtsee-peer-photo-image\">\n </div>\n <div class=\"rtsee-peer-info\">\n <p class=\"rtsee-peer-name\" *ngIf=\"peer.name\">{{peer.name}}</p>\n </div>\n </div>\n <video #videoOutput\n class=\"rtsee-peer-video\"\n [autoplay]=\"true\"\n [srcObject]=\"peer.remoteVideoStream\"\n playsinline=\"true\"\n >\n </video>\n <div class=\"rtsee-peer-soundbar\">\n <ngx-rtsee-soundbar [peer]=\"peer\"></ngx-rtsee-soundbar>\n </div>\n </div>\n</div>\n" }]
194
+ args: [{ selector: 'ngx-rtsee-peer', imports: [NgClass, NgIf, RtseeSoundbarComponent], standalone: true, template: "<div class=\"rtsee-peer\" [ngClass]=\"{\n'rtsee-peer-video-disabled': !peer.remoteVideoStream || !peer.camera\n}\">\n <div class=\"rtsee-peer-content\">\n <div class=\"rtsee-peer-photo\" *ngIf=\"!peer.camera\">\n <div class=\"rtsee-peer-photo-wrapper\">\n <div *ngIf=\"peer.imageUrl\"\n [style.background-image]=\"'url(' + peer.imageUrl + ')'\"\n class=\"rtsee-peer-photo-image\"\n ></div>\n <img *ngIf=\"!peer.imageUrl\" [src]=\"\" alt=\"peer_photo\" class=\"rtsee-peer-photo-image\">\n </div>\n <div class=\"rtsee-peer-info\">\n <p class=\"rtsee-peer-name\" *ngIf=\"peer.name\">{{peer.name}}</p>\n </div>\n </div>\n <video #videoOutput\n class=\"rtsee-peer-video\"\n [autoplay]=\"true\"\n [srcObject]=\"peer.remoteVideoStream\"\n playsinline=\"true\"\n >\n </video>\n <div class=\"rtsee-peer-soundbar\">\n <ngx-rtsee-soundbar [peer]=\"peer\"></ngx-rtsee-soundbar>\n </div>\n </div>\n</div>\n" }]
208
195
  }], ctorParameters: () => [], propDecorators: { audioOutput: [{
209
196
  type: ViewChild,
210
197
  args: ['audioOutput']
@@ -234,7 +221,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
234
221
  NgClass,
235
222
  RtseeSettingsComponent,
236
223
  RtseePeerComponent,
237
- RTSeeControlsComponent
224
+ RTSeeControlsComponent,
238
225
  ], standalone: true, template: "<div class=\"rtsee-conference-shell\" [ngClass]=\"{\n'rtsee-conference-shell-expanded': rtSee.uiControls.isExpanded,\n'rtsee-conference-shell-no-companions': !rtSee.rtcPeerConnections.connections?.length\n}\">\n @if (rtSee.localStream && rtSee.camera) {\n <div class=\"rtsee-local-peer\">\n <video class=\"rtsee-local-video\"\n [autoplay]=\"true\"\n [muted]=\"true\"\n [srcObject]=\"rtSee.localStream\"\n playsinline=\"true\"\n ></video>\n </div>\n }\n <div class=\"rtsee-window-controls\">\n <button type=\"button\"\n (click)=\"rtSee.toggleSettings()\"\n class=\"rtsee-window-controls-button rtsee-ripple-button\"\n >\n <span class=\"material-icons-outlined\">settings</span>\n </button>\n </div>\n @if (rtSee.settingsOpened) {\n <ngx-rtsee-settings [rtSee]=\"rtSee\" [fullScreenMode]=\"rtSee.uiControls.isExpanded\"></ngx-rtsee-settings>\n }\n @if (rtSee.screenSharePeer) {\n <div class=\"rtsee-screen-share\">\n <video [autoplay]=\"true\"\n [muted]=\"'true'\"\n [srcObject]=\"rtSee.screenSharePeer.remoteVideoStream\"\n playsinline=\"true\"\n class=\"rtsee-screen-share-video\"\n ></video>\n </div>\n }\n <div class=\"rtsee-peers\" [ngClass]=\"{\n 'rtsee-peers-alone': !rtSee.rtcPeerConnections.connections?.length,\n 'rtsee-peers-one': rtSee.rtcPeerConnections.connections?.length === 1,\n 'rtsee-peers-three-grid': rtSee.rtcPeerConnections.connections?.length\n && rtSee.rtcPeerConnections.connections.length > 1\n && rtSee.rtcPeerConnections.connections.length < 4,\n 'rtsee-peers-six-grid': rtSee.rtcPeerConnections.connections?.length\n && rtSee.rtcPeerConnections.connections.length > 3\n && rtSee.rtcPeerConnections.connections.length < 7,\n 'rtsee-peers-nine-grid': rtSee.rtcPeerConnections.connections?.length\n && rtSee.rtcPeerConnections.connections.length >= 7\n }\">\n @for (peer of rtSee.rtcPeerConnections.connections; track peer.clientId) {\n <div class=\"rtsee-peer-wrapper\">\n <ngx-rtsee-peer [peer]=\"peer\"></ngx-rtsee-peer>\n </div>\n }\n </div>\n <div class=\"rtsee-peers-list\"></div>\n <div class=\"rtsee-controls-wrapper\">\n <ngx-rtsee-controls [rtsee]=\"rtSee\" [fullScreenMode]=\"rtSee.uiControls.isExpanded\"></ngx-rtsee-controls>\n </div>\n</div>\n\n" }]
239
226
  }], ctorParameters: () => [], propDecorators: { rtSee: [{
240
227
  type: Input
@@ -257,16 +244,13 @@ class RTSeeAuthService {
257
244
  .pipe(tap((res) => this.rtseeAuth.authenticate(res)));
258
245
  }
259
246
  signUp(credentials) {
260
- return this.http
261
- .post(this.authConfiguration.getEndpointPathByEndpointName(AuthEndpointsKeys.SIGN_UP), credentials);
247
+ return this.http.post(this.authConfiguration.getEndpointPathByEndpointName(AuthEndpointsKeys.SIGN_UP), credentials);
262
248
  }
263
249
  forgotPassword(credentials) {
264
- return this.http
265
- .post(this.authConfiguration.getEndpointPathByEndpointName(AuthEndpointsKeys.FORGOT_PASSWORD), credentials);
250
+ return this.http.post(this.authConfiguration.getEndpointPathByEndpointName(AuthEndpointsKeys.FORGOT_PASSWORD), credentials);
266
251
  }
267
252
  resetPassword(credentials) {
268
- return this.http
269
- .post(this.authConfiguration.getEndpointPathByEndpointName(AuthEndpointsKeys.RESET_PASSWORD), credentials);
253
+ return this.http.post(this.authConfiguration.getEndpointPathByEndpointName(AuthEndpointsKeys.RESET_PASSWORD), credentials);
270
254
  }
271
255
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RTSeeAuthService, deps: [{ token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
272
256
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RTSeeAuthService, providedIn: 'root' }); }
@@ -274,7 +258,7 @@ class RTSeeAuthService {
274
258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RTSeeAuthService, decorators: [{
275
259
  type: Injectable,
276
260
  args: [{
277
- providedIn: 'root'
261
+ providedIn: 'root',
278
262
  }]
279
263
  }], ctorParameters: () => [{ type: i1$1.HttpClient }] });
280
264
 
@@ -314,14 +298,7 @@ class ProfileComponent {
314
298
  }
315
299
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ProfileComponent, decorators: [{
316
300
  type: Component,
317
- args: [{ selector: 'rtsee-profile', imports: [
318
- Button,
319
- Message,
320
- RouterLink,
321
- Select,
322
- FormsModule,
323
- Divider
324
- ], standalone: true, template: "<div class=\"rtsee-messenger-profile\">\n @if (!messenger.ownProfileOpened) {\n <ul class=\"rtsee-messenger-profile-actions\">\n <li class=\"rtsee-messenger-profile-actions-item\">\n <p-button\n (click)=\"call()\"\n size=\"large\"\n severity=\"secondary\"\n icon=\"pi pi-phone\"\n />\n </li>\n <li class=\"rtsee-messenger-profile-actions-item\">\n <p-button\n (click)=\"videoCall()\"\n size=\"large\"\n severity=\"secondary\"\n icon=\"pi pi-video\"\n />\n </li>\n </ul>\n }\n\n @if (messenger.ownProfileOpened && messenger.myPeer && !messenger.myPeer.isAnonymous) {\n <div class=\"rtsee-messenger-profile-info\">\n <p class=\"rtsee-messenger-profile-info-name\">{{messenger.myPeer.name}}</p>\n <div class=\"rtsee-messenger-profile-info-language\">\n <p class=\"rtsee-messenger-profile-info-language-label\">Language:</p>\n <p-select [options]=\"messenger.languageOptions\"\n [(ngModel)]=\"messenger.currentLanguage\"\n (ngModelChange)=\"setLanguage()\"\n optionLabel=\"key\"\n optionValue=\"key\"\n [placeholder]=\"messenger.labels[RTSeeTextLabelKeys.MESSANGER_LANGUAGE_PLACEHOLDER]\"\n class=\"rtsee-messenger-profile-info-language-select\"\n />\n </div>\n <div class=\"rtsee-messenger-profile-edit\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.MESSENGER_EDIT_PROFILE_BTN_LABEL]\"\n (click)=\"messenger.openManageProfile()\"\n ></p-button>\n </div>\n <p-divider></p-divider>\n @if (messenger.myPeer.plan) {\n <p-message severity=\"success\">\n <span>{{messenger.myPeer.plan.productName}}</span>\n </p-message>\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.MANAGE_PLAN]\"\n (click)=\"messenger.openManagePlanPage()\"\n ></p-button>\n } @else {\n <div class=\"rtsee-subscribe-button\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.SUBSCRIBE_LABEL]\"\n (click)=\"messenger.openPaymentPage()\"\n ></p-button>\n </div>\n }\n <p-divider></p-divider>\n </div>\n }\n\n @if (messenger.ownProfileOpened && messenger.myPeer?.isAnonymous) {\n <div class=\"rtsee-messenger-profile-auth\">\n <div class=\"rtsee-messenger-profile-anon-message\">\n @if (!messenger.currentLanguage || messenger.currentLanguage === 'eng') {\n <p-message severity=\"warn\">\n <span>This is an anonymous identity we've generated for you.</span>\n <span>&nbsp;</span>\n <span>You can use it to play around.</span>\n <span>&nbsp;</span>\n <span>But we are guilty of erasing these time after time.</span>\n <span>&nbsp;</span>\n <span>So please Sign Up if you're looking for something more stable :)</span>\n </p-message>\n } @else if (messenger.currentLanguage === 'ua') {\n <p-message severity=\"warn\">\n <span>\u041C\u0438 \u0437\u0433\u0435\u043D\u0435\u0440\u0443\u0432\u0430\u043B\u0438 \u0434\u043B\u044F \u0432\u0430\u0441 \u0430\u043D\u043E\u043D\u0456\u043C\u043D\u0443 \u043E\u0441\u043E\u0431\u0438\u0441\u0442\u0456\u0441\u0442\u044C.</span>\n <span>&nbsp;</span>\n <span>\u0421\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435\u0441\u044F \u043D\u0435\u044E \u0434\u043B\u044F \u043E\u0437\u043D\u0430\u0439\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0437 \u0441\u0430\u0439\u0442\u043E\u043C.</span>\n <span>&nbsp;</span>\n <span>\u0422\u0430, \u0447\u0430\u0441-\u0432\u0456\u0434-\u0447\u0430\u0441\u0443, \u043C\u0438 \u0457\u0445 \u0432\u0438\u0434\u0430\u043B\u044F\u0454\u043C\u043E.</span>\n <span>&nbsp;</span>\n <span>\u0422\u043E\u0436 \u043A\u0440\u0430\u0449\u0435 \u0437\u0430\u0440\u0435\u0454\u0441\u0442\u0440\u0443\u0442\u0435\u0441\u044F, \u0430\u0431\u0438 \u043D\u0435 \u0432\u0442\u0440\u0430\u0442\u0438\u0442\u0438 \u0434\u0430\u043D\u0456 :)</span>\n </p-message>\n }\n </div>\n\n <div class=\"rtsee-messenger-profile-auth-buttons\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.SIGN_UP_BUTTON]\"\n severity=\"primary\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.SIGN_UP)\"\n class=\"rtsee-messenger-profile-auth-button\"\n ></p-button>\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.SIGN_IN_BUTTON]\"\n severity=\"secondary\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.SIGN_IN)\"\n class=\"rtsee-messenger-profile-auth-button\"\n ></p-button>\n </div>\n </div>\n } @else if (messenger.ownProfileOpened && !messenger.myPeer?.isAnonymous) {\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.LOGOUT_BUTTON]\"\n severity=\"danger\"\n (click)=\"logOut()\"\n class=\"rtsee-messenger-profile-auth-button\"\n ></p-button>\n }\n</div>\n" }]
301
+ args: [{ selector: 'rtsee-profile', imports: [Button, Message, RouterLink, Select, FormsModule, Divider], standalone: true, template: "<div class=\"rtsee-messenger-profile\">\n @if (!messenger.ownProfileOpened) {\n <ul class=\"rtsee-messenger-profile-actions\">\n <li class=\"rtsee-messenger-profile-actions-item\">\n <p-button\n (click)=\"call()\"\n size=\"large\"\n severity=\"secondary\"\n icon=\"pi pi-phone\"\n />\n </li>\n <li class=\"rtsee-messenger-profile-actions-item\">\n <p-button\n (click)=\"videoCall()\"\n size=\"large\"\n severity=\"secondary\"\n icon=\"pi pi-video\"\n />\n </li>\n </ul>\n }\n\n @if (messenger.ownProfileOpened && messenger.myPeer && !messenger.myPeer.isAnonymous) {\n <div class=\"rtsee-messenger-profile-info\">\n <p class=\"rtsee-messenger-profile-info-name\">{{messenger.myPeer.name}}</p>\n <div class=\"rtsee-messenger-profile-info-language\">\n <p class=\"rtsee-messenger-profile-info-language-label\">Language:</p>\n <p-select [options]=\"messenger.languageOptions\"\n [(ngModel)]=\"messenger.currentLanguage\"\n (ngModelChange)=\"setLanguage()\"\n optionLabel=\"key\"\n optionValue=\"key\"\n [placeholder]=\"messenger.labels[RTSeeTextLabelKeys.MESSANGER_LANGUAGE_PLACEHOLDER]\"\n class=\"rtsee-messenger-profile-info-language-select\"\n />\n </div>\n <div class=\"rtsee-messenger-profile-edit\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.MESSENGER_EDIT_PROFILE_BTN_LABEL]\"\n (click)=\"messenger.openManageProfile()\"\n ></p-button>\n </div>\n <p-divider></p-divider>\n @if (messenger.myPeer.plan) {\n <p-message severity=\"success\">\n <span>{{messenger.myPeer.plan.productName}}</span>\n </p-message>\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.MANAGE_PLAN]\"\n (click)=\"messenger.openManagePlanPage()\"\n ></p-button>\n } @else {\n <div class=\"rtsee-subscribe-button\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.SUBSCRIBE_LABEL]\"\n (click)=\"messenger.openPaymentPage()\"\n ></p-button>\n </div>\n }\n <p-divider></p-divider>\n </div>\n }\n\n @if (messenger.ownProfileOpened && messenger.myPeer?.isAnonymous) {\n <div class=\"rtsee-messenger-profile-auth\">\n <div class=\"rtsee-messenger-profile-anon-message\">\n @if (!messenger.currentLanguage || messenger.currentLanguage === 'eng') {\n <p-message severity=\"warn\">\n <span>This is an anonymous identity we've generated for you.</span>\n <span>&nbsp;</span>\n <span>You can use it to play around.</span>\n <span>&nbsp;</span>\n <span>But we are guilty of erasing these time after time.</span>\n <span>&nbsp;</span>\n <span>So please Sign Up if you're looking for something more stable :)</span>\n </p-message>\n } @else if (messenger.currentLanguage === 'ua') {\n <p-message severity=\"warn\">\n <span>\u041C\u0438 \u0437\u0433\u0435\u043D\u0435\u0440\u0443\u0432\u0430\u043B\u0438 \u0434\u043B\u044F \u0432\u0430\u0441 \u0430\u043D\u043E\u043D\u0456\u043C\u043D\u0443 \u043E\u0441\u043E\u0431\u0438\u0441\u0442\u0456\u0441\u0442\u044C.</span>\n <span>&nbsp;</span>\n <span>\u0421\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435\u0441\u044F \u043D\u0435\u044E \u0434\u043B\u044F \u043E\u0437\u043D\u0430\u0439\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u0437 \u0441\u0430\u0439\u0442\u043E\u043C.</span>\n <span>&nbsp;</span>\n <span>\u0422\u0430, \u0447\u0430\u0441-\u0432\u0456\u0434-\u0447\u0430\u0441\u0443, \u043C\u0438 \u0457\u0445 \u0432\u0438\u0434\u0430\u043B\u044F\u0454\u043C\u043E.</span>\n <span>&nbsp;</span>\n <span>\u0422\u043E\u0436 \u043A\u0440\u0430\u0449\u0435 \u0437\u0430\u0440\u0435\u0454\u0441\u0442\u0440\u0443\u0442\u0435\u0441\u044F, \u0430\u0431\u0438 \u043D\u0435 \u0432\u0442\u0440\u0430\u0442\u0438\u0442\u0438 \u0434\u0430\u043D\u0456 :)</span>\n </p-message>\n }\n </div>\n\n <div class=\"rtsee-messenger-profile-auth-buttons\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.SIGN_UP_BUTTON]\"\n severity=\"primary\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.SIGN_UP)\"\n class=\"rtsee-messenger-profile-auth-button\"\n ></p-button>\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.SIGN_IN_BUTTON]\"\n severity=\"secondary\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.SIGN_IN)\"\n class=\"rtsee-messenger-profile-auth-button\"\n ></p-button>\n </div>\n </div>\n } @else if (messenger.ownProfileOpened && !messenger.myPeer?.isAnonymous) {\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.LOGOUT_BUTTON]\"\n severity=\"danger\"\n (click)=\"logOut()\"\n class=\"rtsee-messenger-profile-auth-button\"\n ></p-button>\n }\n</div>\n" }]
325
302
  }], ctorParameters: () => [{ type: RTSeeAuthService }, { type: i2.Router }], propDecorators: { messenger: [{
326
303
  type: Input
327
304
  }], peer: [{
@@ -358,10 +335,7 @@ class MessengerHeaderComponent {
358
335
  }
359
336
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MessengerHeaderComponent, decorators: [{
360
337
  type: Component,
361
- args: [{ selector: 'rtsee-messenger-header', imports: [
362
- NgClass,
363
- ProfileComponent
364
- ], standalone: true, template: "<div class=\"rtsee-messenger-header\"\n [ngClass]=\"{\n 'rtsee-messenger-header-chat-opened': messenger.openedChat,\n 'rtsee-chat-header-unread': messenger.openedChat && !messenger.unreadMessagesCount,\n 'rtsee-messenger-header-expanded': messenger.openedProfile || messenger.openedChatDetails,\n 'rtsee-messenger-header-my-profile-mode': messenger.ownProfileOpened,\n 'rtsee-messenger-header-chat-info-mode': (messenger.openedProfile || messenger.openedChatDetails) && !messenger.ownProfileOpened\n }\"\n>\n <span class=\"rtsee-messenger-header-collapse-button\"\n (click)=\"messenger.collapseInfo()\"\n >\n <span class=\"pi pi-arrow-left\"></span>\n </span>\n <div class=\"rtsee-messenger-header-left\">\n @if (!messenger.openedChat && messenger.myPeer) {\n <div class=\"rtsee-messenger-header-avatar\"\n (click)=\"openProfile(messenger.myPeer.clientId)\"\n >\n <div [style.background-image]=\"'url(' + messenger.myPeer.imageUrl || defaultImagesService.PROFILE + ')'\"\n class=\"rtsee-messenger-header-avatar-image\">\n </div>\n </div>\n } @else if (messenger.openedChat) {\n <button class=\"rtsee-messenger-close-chat\"\n (click)=\"messenger.closeChat()\"\n >\n <span class=\"material-icons-outlined\">arrow_back</span>\n @if (messenger.unreadMessagesCount) {\n <span class=\"unread-count\">{{messenger.unreadMessagesCount}}</span>\n }\n </button>\n }\n </div>\n <div class=\"rtsee-messenger-header-right\">\n @if (messenger.openedChat) {\n <div class=\"rtsee-messenger-chat-image-container rtsee-messenger-header-avatar\"\n (click)=\"messenger.openChatInfo()\"\n >\n <div class=\"rtsee-messenger-chat-image rtsee-messenger-header-avatar-image\"\n [style.background-image]=\"'url(' + messenger.openedChat.imageUrl || defaultImagesService.PROFILE + ')'\"\n ></div>\n </div>\n }\n </div>\n <div class=\"rtsee-messenger-header-center\">\n @if (messenger.openedChat) {\n <div [ngClass]=\"{'rtsee-messenger-header-opened-chat-info-expanded': messenger.openedProfile || messenger.openedChatDetails}\"\n class=\"rtsee-messenger-header-opened-chat-info\">\n <div class=\"rtsee-messenger-profile-header-placeholder\">\n <p class=\"rtsee-messenger-header-chat-title\"\n >{{ messenger.openedChat.name }}</p>\n </div>\n\n <div class=\"rtsee-messenger-profile-data-container\">\n @if (messenger.openedChatDetails) {\n <rtsee-profile [messenger]=\"messenger\"\n ></rtsee-profile>\n }\n </div>\n </div>\n } @else if (!messenger.openedChat) {\n <p class=\"rtsee-messenger-header-title\"\n >{{messenger.labels[RTSeeTextLabelKeys.MESSANGER_TITLE]}}</p>\n <rtsee-profile [messenger]=\"messenger\"\n [peer]=\"messenger.myPeer\"\n ></rtsee-profile>\n }\n </div>\n</div>\n" }]
338
+ args: [{ selector: 'rtsee-messenger-header', imports: [NgClass, ProfileComponent], standalone: true, template: "<div class=\"rtsee-messenger-header\"\n [ngClass]=\"{\n 'rtsee-messenger-header-chat-opened': messenger.openedChat,\n 'rtsee-chat-header-unread': messenger.openedChat && !messenger.unreadMessagesCount,\n 'rtsee-messenger-header-expanded': messenger.openedProfile || messenger.openedChatDetails,\n 'rtsee-messenger-header-my-profile-mode': messenger.ownProfileOpened,\n 'rtsee-messenger-header-chat-info-mode': (messenger.openedProfile || messenger.openedChatDetails) && !messenger.ownProfileOpened\n }\"\n>\n <span class=\"rtsee-messenger-header-collapse-button\"\n (click)=\"messenger.collapseInfo()\"\n >\n <span class=\"pi pi-arrow-left\"></span>\n </span>\n <div class=\"rtsee-messenger-header-left\">\n @if (!messenger.openedChat && messenger.myPeer) {\n <div class=\"rtsee-messenger-header-avatar\"\n (click)=\"openProfile(messenger.myPeer.clientId)\"\n >\n <div [style.background-image]=\"'url(' + messenger.myPeer.imageUrl || defaultImagesService.PROFILE + ')'\"\n class=\"rtsee-messenger-header-avatar-image\">\n </div>\n </div>\n } @else if (messenger.openedChat) {\n <button class=\"rtsee-messenger-close-chat\"\n (click)=\"messenger.closeChat()\"\n >\n <span class=\"material-icons-outlined\">arrow_back</span>\n @if (messenger.unreadMessagesCount) {\n <span class=\"unread-count\">{{messenger.unreadMessagesCount}}</span>\n }\n </button>\n }\n </div>\n <div class=\"rtsee-messenger-header-right\">\n @if (messenger.openedChat) {\n <div class=\"rtsee-messenger-chat-image-container rtsee-messenger-header-avatar\"\n (click)=\"messenger.openChatInfo()\"\n >\n <div class=\"rtsee-messenger-chat-image rtsee-messenger-header-avatar-image\"\n [style.background-image]=\"'url(' + messenger.openedChat.imageUrl || defaultImagesService.PROFILE + ')'\"\n ></div>\n </div>\n }\n </div>\n <div class=\"rtsee-messenger-header-center\">\n @if (messenger.openedChat) {\n <div [ngClass]=\"{'rtsee-messenger-header-opened-chat-info-expanded': messenger.openedProfile || messenger.openedChatDetails}\"\n class=\"rtsee-messenger-header-opened-chat-info\">\n <div class=\"rtsee-messenger-profile-header-placeholder\">\n <p class=\"rtsee-messenger-header-chat-title\"\n >{{ messenger.openedChat.name }}</p>\n </div>\n\n <div class=\"rtsee-messenger-profile-data-container\">\n @if (messenger.openedChatDetails) {\n <rtsee-profile [messenger]=\"messenger\"\n ></rtsee-profile>\n }\n </div>\n </div>\n } @else if (!messenger.openedChat) {\n <p class=\"rtsee-messenger-header-title\"\n >{{messenger.labels[RTSeeTextLabelKeys.MESSANGER_TITLE]}}</p>\n <rtsee-profile [messenger]=\"messenger\"\n [peer]=\"messenger.myPeer\"\n ></rtsee-profile>\n }\n </div>\n</div>\n" }]
365
339
  }], ctorParameters: () => [{ type: DefaultImagesService }], propDecorators: { messenger: [{
366
340
  type: Input
367
341
  }] } });
@@ -492,11 +466,7 @@ class MessageTimeAndStatusComponent {
492
466
  }
493
467
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MessageTimeAndStatusComponent, decorators: [{
494
468
  type: Component,
495
- args: [{ selector: 'rtsee-message-time-and-status', imports: [
496
- NgIf,
497
- NgClass,
498
- PreloaderComponent
499
- ], standalone: true, template: "<div class=\"rtsee-messenger-message-time-and-status\">\n <span class=\"rtsee-messenger-message-status\" *ngIf=\"!hideStatus\" [ngClass]=\"{'showing-status-inside-chat': inChat }\">\n <span *ngIf=\"message.status === 'pending'\"><rtsee-preloader [diameter]=\"5\"></rtsee-preloader></span>\n <span *ngIf=\"message.status === 'sent'\" class=\"material-icons-outlined rtsee-message-sent-status\">check</span>\n <span *ngIf=\"message.status === 'delivered'\" class=\"material-icons-outlined rtsee-message-delivered-status\">check</span>\n <span *ngIf=\"message.status === 'seen'\" class=\"material-icons-outlined rtsee-message-seen-status\">done_all</span>\n </span>\n <span class=\"rtsee-messenger-message-time\">{{timeFormatService.formatTimeOrDate(message.createdAt)}}</span>\n</div>\n" }]
469
+ args: [{ selector: 'rtsee-message-time-and-status', imports: [NgIf, NgClass, PreloaderComponent], standalone: true, template: "<div class=\"rtsee-messenger-message-time-and-status\">\n <span class=\"rtsee-messenger-message-status\" *ngIf=\"!hideStatus\" [ngClass]=\"{'showing-status-inside-chat': inChat }\">\n <span *ngIf=\"message.status === 'pending'\"><rtsee-preloader [diameter]=\"5\"></rtsee-preloader></span>\n <span *ngIf=\"message.status === 'sent'\" class=\"material-icons-outlined rtsee-message-sent-status\">check</span>\n <span *ngIf=\"message.status === 'delivered'\" class=\"material-icons-outlined rtsee-message-delivered-status\">check</span>\n <span *ngIf=\"message.status === 'seen'\" class=\"material-icons-outlined rtsee-message-seen-status\">done_all</span>\n </span>\n <span class=\"rtsee-messenger-message-time\">{{timeFormatService.formatTimeOrDate(message.createdAt)}}</span>\n</div>\n" }]
500
470
  }], ctorParameters: () => [{ type: TimeFormatHelperService }], propDecorators: { message: [{
501
471
  type: Input
502
472
  }], hideStatus: [{
@@ -513,7 +483,7 @@ const COMMON_CONSTANTS = {
513
483
  customDateFormatDaysJs: 'DD/MM/YYYY',
514
484
  customDateTimeFormat: 'dd/MM/YYYY HH:mm',
515
485
  defaultProfileImgUrl: 'https://werf.co/assets/images/default-profile.png',
516
- mobileBreakpoint: 800
486
+ mobileBreakpoint: 800,
517
487
  };
518
488
 
519
489
  class ChatThumbnailComponent {
@@ -527,11 +497,7 @@ class ChatThumbnailComponent {
527
497
  }
528
498
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChatThumbnailComponent, decorators: [{
529
499
  type: Component,
530
- args: [{ selector: 'rtsee-chat-thumbnail', imports: [
531
- MessageTimeAndStatusComponent,
532
- NgClass,
533
- NgIf
534
- ], standalone: true, template: "<div class=\"rtsee-chat-thumbnail\" (click)=\"messenger.openChatById(chat.chatId)\">\n <div class=\"rtsee-chat-thumbnail-image\">\n <img [src]=\"chat.chatImageUrl || COMMON_CONSTANTS.defaultProfileImgUrl\" alt=\"chat-img\">\n </div>\n <div class=\"rtsee-chat-thumbnail-left\">\n <div class=\"rtsee-chat-thumbnail-name\">\n <span>{{ chat.chatName }}</span>\n <div class=\"rtsee-chat-thumbnail-status\">\n <rtsee-message-time-and-status [message]=\"chat\"\n [hideStatus]=\"chat && !!(chat.unreadMessagesCount)\">\n </rtsee-message-time-and-status>\n </div>\n </div>\n <div class=\"rtsee-chat-thumbnail-last-message\"\n [ngClass]=\"{'rtsee-has-unread': chat.unreadMessagesCount}\"\n rtseeShave>\n <span class=\"rtsee-chat-thumbnail-last-message-sender\"\n *ngIf=\"chat.chatType !== RTSeeChatTypes.INDIVIDUAL && chat.senderName\"\n >{{chat.senderName}}</span>\n <span class=\"rtsee-chat-thumbnail-last-message-text\"\n *ngIf=\"chat.text\"\n >{{chat.text}}</span>\n <div class=\"rtsee-messenger-thumbnail-unread\" *ngIf=\"chat.unreadMessagesCount\">\n <span class=\"rtsee-messenger-thumbnail-unread-count\">{{chat.unreadMessagesCount}}</span>\n </div>\n </div>\n </div>\n</div>\n" }]
500
+ args: [{ selector: 'rtsee-chat-thumbnail', imports: [MessageTimeAndStatusComponent, NgClass, NgIf], standalone: true, template: "<div class=\"rtsee-chat-thumbnail\" (click)=\"messenger.openChatById(chat.chatId)\">\n <div class=\"rtsee-chat-thumbnail-image\">\n <img [src]=\"chat.chatImageUrl || COMMON_CONSTANTS.defaultProfileImgUrl\" alt=\"chat-img\">\n </div>\n <div class=\"rtsee-chat-thumbnail-left\">\n <div class=\"rtsee-chat-thumbnail-name\">\n <span>{{ chat.chatName }}</span>\n <div class=\"rtsee-chat-thumbnail-status\">\n <rtsee-message-time-and-status [message]=\"chat\"\n [hideStatus]=\"chat && !!(chat.unreadMessagesCount)\">\n </rtsee-message-time-and-status>\n </div>\n </div>\n <div class=\"rtsee-chat-thumbnail-last-message\"\n [ngClass]=\"{'rtsee-has-unread': chat.unreadMessagesCount}\"\n rtseeShave>\n <span class=\"rtsee-chat-thumbnail-last-message-sender\"\n *ngIf=\"chat.chatType !== RTSeeChatTypes.INDIVIDUAL && chat.senderName\"\n >{{chat.senderName}}</span>\n <span class=\"rtsee-chat-thumbnail-last-message-text\"\n *ngIf=\"chat.text\"\n >{{chat.text}}</span>\n <div class=\"rtsee-messenger-thumbnail-unread\" *ngIf=\"chat.unreadMessagesCount\">\n <span class=\"rtsee-messenger-thumbnail-unread-count\">{{chat.unreadMessagesCount}}</span>\n </div>\n </div>\n </div>\n</div>\n" }]
535
501
  }], ctorParameters: () => [{ type: TimeFormatHelperService }], propDecorators: { chat: [{
536
502
  type: Input
537
503
  }], messenger: [{
@@ -547,10 +513,7 @@ class ChatsListComponent {
547
513
  }
548
514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChatsListComponent, decorators: [{
549
515
  type: Component,
550
- args: [{ selector: 'rtsee-chats-list', imports: [
551
- NgForOf,
552
- ChatThumbnailComponent
553
- ], standalone: true, template: "<div class=\"rtsee-chats-list\">\n <div class=\"rtsee-chat-thumbnail-container\" *ngFor=\"let chat of chats; let last = last;\">\n <rtsee-chat-thumbnail [chat]=\"chat.thumbnail\" [messenger]=\"messenger\"></rtsee-chat-thumbnail>\n<!-- <div class=\"rtsee-chat-thumbnail-separator\" *ngIf=\"!last\"></div>-->\n </div>\n</div>\n" }]
516
+ args: [{ selector: 'rtsee-chats-list', imports: [NgForOf, ChatThumbnailComponent], standalone: true, template: "<div class=\"rtsee-chats-list\">\n <div class=\"rtsee-chat-thumbnail-container\" *ngFor=\"let chat of chats; let last = last;\">\n <rtsee-chat-thumbnail [chat]=\"chat.thumbnail\" [messenger]=\"messenger\"></rtsee-chat-thumbnail>\n<!-- <div class=\"rtsee-chat-thumbnail-separator\" *ngIf=\"!last\"></div>-->\n </div>\n</div>\n" }]
554
517
  }], propDecorators: { messenger: [{
555
518
  type: Input
556
519
  }], chats: [{
@@ -568,15 +531,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
568
531
  type: Directive,
569
532
  args: [{
570
533
  selector: '[widgetHost]',
571
- standalone: true
534
+ standalone: true,
572
535
  }]
573
536
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }] });
574
537
 
538
+ class RatingComponent {
539
+ constructor() {
540
+ this.stars = [];
541
+ this.mutable = false;
542
+ this.rateValue = 0;
543
+ }
544
+ ngOnInit() {
545
+ this.init();
546
+ }
547
+ init() {
548
+ if (this.rate) {
549
+ this.initStars(this.rate.value, this.rate.maxValue);
550
+ this.rateValue = this.rate.value;
551
+ }
552
+ else if (this.config) {
553
+ this.mutable = true;
554
+ this.initStars(this.config.rate?.value || 0, this.config.maxRateValue);
555
+ this.rateValue = this.config.rate?.value || 0;
556
+ }
557
+ else {
558
+ throw new Error(`Neither rate nor vote config provided!`);
559
+ }
560
+ }
561
+ initStars(value, maxValue) {
562
+ const stars = [];
563
+ const full = Math.floor(value);
564
+ const hasHalf = value - full >= 0.25;
565
+ for (let i = 0; i < full; i++) {
566
+ stars.push('full');
567
+ }
568
+ if (hasHalf) {
569
+ stars.push('half');
570
+ }
571
+ while (stars.length < maxValue) {
572
+ stars.push('empty');
573
+ }
574
+ this.stars = stars;
575
+ }
576
+ onStarClicked(index) {
577
+ if (!this.config || !this.config.rate) {
578
+ return;
579
+ }
580
+ this.config.rate.value = index + 1;
581
+ this.init();
582
+ }
583
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
584
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RatingComponent, isStandalone: true, selector: "rtsee-rating", inputs: { config: "config", rate: "rate" }, ngImport: i0, template: "<div class=\"rtsee-rating\">\n @for (star of stars; track $index) {\n <span class=\"rtsee-rating-star\"\n [ngClass]=\"{\n 'rtsee-rating-star-full': star === 'full',\n 'rtsee-rating-star-half': star === 'half',\n 'rtsee-rating-star-empty': star === 'empty',\n 'rtsee-rating-star-clickable': mutable\n }\"\n (click)=\"onStarClicked($index)\"\n >\u2605</span>\n }\n @if (rateValue) {\n <span class=\"rtsee-rating-number\">{{ rateValue }}</span>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
585
+ }
586
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingComponent, decorators: [{
587
+ type: Component,
588
+ args: [{ selector: 'rtsee-rating', imports: [NgClass], template: "<div class=\"rtsee-rating\">\n @for (star of stars; track $index) {\n <span class=\"rtsee-rating-star\"\n [ngClass]=\"{\n 'rtsee-rating-star-full': star === 'full',\n 'rtsee-rating-star-half': star === 'half',\n 'rtsee-rating-star-empty': star === 'empty',\n 'rtsee-rating-star-clickable': mutable\n }\"\n (click)=\"onStarClicked($index)\"\n >\u2605</span>\n }\n @if (rateValue) {\n <span class=\"rtsee-rating-number\">{{ rateValue }}</span>\n }\n</div>\n" }]
589
+ }], propDecorators: { config: [{
590
+ type: Input
591
+ }], rate: [{
592
+ type: Input
593
+ }] } });
594
+
575
595
  class CallWidgetComponent {
576
596
  ngOnInit() { }
577
597
  joinCall() {
578
598
  console.log('message data: ', this.message.data);
579
- if (!this.messenger || (!this.message.data?.roomId && !this.chat.conferenceRoom)) {
599
+ if (!this.messenger ||
600
+ (!this.message.data?.roomId && !this.chat.conferenceRoom)) {
580
601
  console.log('No Room Id specified or no messenger!');
581
602
  return;
582
603
  }
@@ -592,9 +613,7 @@ class CallWidgetComponent {
592
613
  }
593
614
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: CallWidgetComponent, decorators: [{
594
615
  type: Component,
595
- args: [{ selector: 'ngx-call-widget', imports: [
596
- NgClass
597
- ], standalone: true, template: "<div class=\"rtsee-call-widget\">\n <p> The call has started</p>\n <button class=\"rtsee-join-call-btn\"\n (click)=\"joinCall()\">\n Join Call\n </button>\n</div>\n" }]
616
+ args: [{ selector: 'ngx-call-widget', imports: [NgClass], standalone: true, template: "<div class=\"rtsee-call-widget\">\n <p> The call has started</p>\n <button class=\"rtsee-join-call-btn\"\n (click)=\"joinCall()\">\n Join Call\n </button>\n</div>\n" }]
598
617
  }], propDecorators: { message: [{
599
618
  type: Input
600
619
  }], messenger: [{
@@ -634,6 +653,7 @@ class MessageComponent {
634
653
  this.componentFactoryResolver = componentFactoryResolver;
635
654
  this.timeFormatService = timeFormatService;
636
655
  }
656
+ ngOnInit() { }
637
657
  ngAfterViewInit() {
638
658
  /* eslint-disable */
639
659
  if (this.message.widget) {
@@ -660,7 +680,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
660
680
  args: [{ selector: 'rtsee-message', imports: [
661
681
  NgClass,
662
682
  MessageTimeAndStatusComponent,
663
- WidgetDirective
683
+ WidgetDirective,
684
+ RatingComponent,
664
685
  ], standalone: true, template: "<div class=\"rtsee-messenger-message-container\" #rtsMessageContainer\n [ngClass]=\"{'rtsee-message-from-me': message.from.id === messenger.clientId}\"\n>\n <div class=\"rtsee-messenger-message\">\n @if (message.widget) {\n <ng-template widgetHost></ng-template>\n }\n @if (!message.widget) {\n <p class=\"rtsee-messenger-message-text\"\n >{{ message.text }}</p>\n }\n <div class=\"rtsee-messenger-message-info\" #rtsMessageInfo>\n <rtsee-message-time-and-status [message]=\"message\"\n [inChat]=\"true\"\n [hideStatus]=\"message.from.id !== messenger.clientId\"\n ></rtsee-message-time-and-status>\n </div>\n </div>\n</div>\n" }]
665
686
  }], ctorParameters: () => [{ type: MessageWidgetsService }, { type: i0.ComponentFactoryResolver }, { type: TimeFormatHelperService }], propDecorators: { chat: [{
666
687
  type: Input
@@ -689,20 +710,17 @@ class MessagesListComponent {
689
710
  }
690
711
  onWindowScroll(event) {
691
712
  // Get the vertical scroll position
692
- const verticalOffset = window.pageYOffset || this.document.documentElement.scrollTop || this.document.body.scrollTop || 0;
713
+ const verticalOffset = window.pageYOffset ||
714
+ this.document.documentElement.scrollTop ||
715
+ this.document.body.scrollTop ||
716
+ 0;
693
717
  if (window.innerWidth >= COMMON_CONSTANTS.mobileBreakpoint) {
694
718
  return;
695
719
  }
696
720
  // You can add logic here, e.g., show a 'scroll to top' button
697
721
  if (verticalOffset < 300) {
698
- // Logic to show button
699
- console.log('scrolled to top');
700
722
  this.onScrolledToTop();
701
723
  }
702
- else {
703
- console.log('scrolled to bottom');
704
- // Logic to hide button
705
- }
706
724
  }
707
725
  ngOnInit() {
708
726
  this.chat.on(RTSeeChatEvents.MESSAGES_LIST_CHANGED, this.bindedGroupFunction);
@@ -730,10 +748,6 @@ class MessagesListComponent {
730
748
  this.chat.loadRemoteMessages('back');
731
749
  }
732
750
  onScroll() {
733
- // if (this.scrollContainer.nativeElement.scrollTop < 1) {
734
- // this.scrollContainer.nativeElement.scrollTop = 1;
735
- // }
736
- console.log('scroll down');
737
751
  if (this.chat.messagesLoadInProgress) {
738
752
  return;
739
753
  }
@@ -749,7 +763,6 @@ class MessagesListComponent {
749
763
  this.scroller.scrollToPosition([0, document.body.scrollHeight]);
750
764
  }
751
765
  if (!this.scrollContainer?.nativeElement?.scrollHeight) {
752
- console.log('scrollToBottom early return');
753
766
  return;
754
767
  }
755
768
  try {
@@ -801,14 +814,14 @@ class MessagesListComponent {
801
814
  throw new Error('Either m.id or m.temporary id is required');
802
815
  }
803
816
  const isFromMe = message.from.id === this.messenger.clientId;
804
- const isSenderVisible = (this.chat.type !== RTSeeChatTypes.INDIVIDUAL && !isFromMe)
805
- || this.chat.type === RTSeeChatTypes.COMMENTS
806
- || this.chat.type === RTSeeChatTypes.RATINGS;
817
+ const isSenderVisible = (this.chat.type !== RTSeeChatTypes.INDIVIDUAL && !isFromMe) ||
818
+ this.chat.type === RTSeeChatTypes.COMMENTS ||
819
+ this.chat.type === RTSeeChatTypes.RATINGS;
807
820
  currentGroup = {
808
821
  id: message.id || message.temporaryId,
809
822
  sender: message.from,
810
823
  senderVisible: isSenderVisible,
811
- messages: [message]
824
+ messages: [message],
812
825
  };
813
826
  }
814
827
  }
@@ -880,18 +893,17 @@ class MessagesListComponent {
880
893
  if (!this.chat.messages.length) {
881
894
  return null;
882
895
  }
883
- return [this.chat.messages[0], this.chat.messages[this.chat.messages.length - 1]];
896
+ return [
897
+ this.chat.messages[0],
898
+ this.chat.messages[this.chat.messages.length - 1],
899
+ ];
884
900
  }
885
901
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MessagesListComponent, deps: [{ token: TimeFormatHelperService }, { token: i2$1.ViewportScroller }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
886
902
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: MessagesListComponent, isStandalone: true, selector: "rtsee-messages-list", inputs: { chat: "chat", messenger: "messenger" }, host: { listeners: { "window:scroll": "onWindowScroll($event)" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollBlock"], descendants: true }], ngImport: i0, template: "<div class=\"rtsee-messenger-messages-list\"\n #scrollBlock\n infiniteScroll\n [infiniteScrollUpDistance]=\"2\"\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolledUp)=\"onScrolledToTop()\"\n (scroll)=\"onScroll()\"\n [style.padding-bottom]=\"messenger.chatInputHeight + 'px'\"\n>\n @for (messageGroup of messagesGroups; track messageGroup.id) {\n <div class=\"rtsee-messenger-message-wrapper\" [ngClass]=\"{\n 'rtsee-messenger-message-wrapper-with-sender': messageGroup.senderVisible\n }\">\n <div class=\"rtsee-messenger-message-inset\">\n <img [src]=\"messageGroup.sender.imageUrl\"\n class=\"rtsee-messenger-message-sender-image\"\n >\n </div>\n\n <div class=\"rtsee-messenger-message-sender-name\">\n <p>{{messageGroup.sender.name}}</p>\n </div>\n\n @for (message of messageGroup.messages; track message.id) {\n <rtsee-message [message]=\"message\"\n [messenger]=\"messenger\"\n [chat]=\"chat\"\n ></rtsee-message>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: MessageComponent, selector: "rtsee-message", inputs: ["chat", "message", "member", "messenger"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
887
903
  }
888
904
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MessagesListComponent, decorators: [{
889
905
  type: Component,
890
- args: [{ selector: 'rtsee-messages-list', imports: [
891
- InfiniteScrollDirective,
892
- MessageComponent,
893
- NgClass
894
- ], standalone: true, template: "<div class=\"rtsee-messenger-messages-list\"\n #scrollBlock\n infiniteScroll\n [infiniteScrollUpDistance]=\"2\"\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolledUp)=\"onScrolledToTop()\"\n (scroll)=\"onScroll()\"\n [style.padding-bottom]=\"messenger.chatInputHeight + 'px'\"\n>\n @for (messageGroup of messagesGroups; track messageGroup.id) {\n <div class=\"rtsee-messenger-message-wrapper\" [ngClass]=\"{\n 'rtsee-messenger-message-wrapper-with-sender': messageGroup.senderVisible\n }\">\n <div class=\"rtsee-messenger-message-inset\">\n <img [src]=\"messageGroup.sender.imageUrl\"\n class=\"rtsee-messenger-message-sender-image\"\n >\n </div>\n\n <div class=\"rtsee-messenger-message-sender-name\">\n <p>{{messageGroup.sender.name}}</p>\n </div>\n\n @for (message of messageGroup.messages; track message.id) {\n <rtsee-message [message]=\"message\"\n [messenger]=\"messenger\"\n [chat]=\"chat\"\n ></rtsee-message>\n }\n </div>\n }\n</div>\n" }]
906
+ args: [{ selector: 'rtsee-messages-list', imports: [InfiniteScrollDirective, MessageComponent, NgClass], standalone: true, template: "<div class=\"rtsee-messenger-messages-list\"\n #scrollBlock\n infiniteScroll\n [infiniteScrollUpDistance]=\"2\"\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolledUp)=\"onScrolledToTop()\"\n (scroll)=\"onScroll()\"\n [style.padding-bottom]=\"messenger.chatInputHeight + 'px'\"\n>\n @for (messageGroup of messagesGroups; track messageGroup.id) {\n <div class=\"rtsee-messenger-message-wrapper\" [ngClass]=\"{\n 'rtsee-messenger-message-wrapper-with-sender': messageGroup.senderVisible\n }\">\n <div class=\"rtsee-messenger-message-inset\">\n <img [src]=\"messageGroup.sender.imageUrl\"\n class=\"rtsee-messenger-message-sender-image\"\n >\n </div>\n\n <div class=\"rtsee-messenger-message-sender-name\">\n <p>{{messageGroup.sender.name}}</p>\n </div>\n\n @for (message of messageGroup.messages; track message.id) {\n <rtsee-message [message]=\"message\"\n [messenger]=\"messenger\"\n [chat]=\"chat\"\n ></rtsee-message>\n }\n </div>\n }\n</div>\n" }]
895
907
  }], ctorParameters: () => [{ type: TimeFormatHelperService }, { type: i2$1.ViewportScroller }, { type: Document, decorators: [{
896
908
  type: Inject,
897
909
  args: [DOCUMENT]
@@ -941,10 +953,7 @@ class ChatInputComponent {
941
953
  }
942
954
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChatInputComponent, decorators: [{
943
955
  type: Component,
944
- args: [{ selector: 'rtsee-chat-input', imports: [
945
- ReactiveFormsModule,
946
- Textarea
947
- ], standalone: true, template: "<div #chatInput\n class=\"rtsee-chat-input\"\n xmlns=\"http://www.w3.org/1999/html\"\n>\n <div class=\"rtsee-send-message\">\n <form [formGroup]=\"sendMessageForm\" class=\"rtsee-chat-input-form\">\n <textarea [invalid]=\"false\"\n [autoResize]=\"true\"\n (keyup)=\"onKeyUp($event)\"\n formControlName=\"message\"\n pTextarea\n placeholder=\"Type a message...\"\n class=\"rtsee-chat-input-field\"\n rows=\"1\"\n cols=\"30\"\n ></textarea>\n </form>\n </div>\n <button (click)=\"sendMessage()\"\n class=\"rtsee-send-message-button\"\n type=\"submit\"\n >\n <span class=\"pi pi-send\"></span>\n </button>\n</div>\n" }]
956
+ args: [{ selector: 'rtsee-chat-input', imports: [ReactiveFormsModule, Textarea], standalone: true, template: "<div #chatInput\n class=\"rtsee-chat-input\"\n xmlns=\"http://www.w3.org/1999/html\"\n>\n <div class=\"rtsee-send-message\">\n <form [formGroup]=\"sendMessageForm\" class=\"rtsee-chat-input-form\">\n <textarea [invalid]=\"false\"\n [autoResize]=\"true\"\n (keyup)=\"onKeyUp($event)\"\n formControlName=\"message\"\n pTextarea\n placeholder=\"Type a message...\"\n class=\"rtsee-chat-input-field\"\n rows=\"1\"\n cols=\"30\"\n ></textarea>\n </form>\n </div>\n <button (click)=\"sendMessage()\"\n class=\"rtsee-send-message-button\"\n type=\"submit\"\n >\n <span class=\"pi pi-send\"></span>\n </button>\n</div>\n" }]
948
957
  }], propDecorators: { messenger: [{
949
958
  type: Input
950
959
  }], chat: [{
@@ -965,10 +974,10 @@ class ViewportObserverDirective {
965
974
  const options = {
966
975
  root: null, // observing relative to the document's viewport
967
976
  rootMargin: '0px',
968
- threshold: 0
977
+ threshold: 0,
969
978
  };
970
979
  this.observer = new IntersectionObserver((entries) => {
971
- entries.forEach(entry => {
980
+ entries.forEach((entry) => {
972
981
  // entry.isIntersecting is true if the element is in the viewport
973
982
  this.inViewport.emit(entry.isIntersecting);
974
983
  });
@@ -987,7 +996,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
987
996
  type: Directive,
988
997
  args: [{
989
998
  selector: '[rtseeViewportObserver]',
990
- standalone: true // Use `standalone: true` in modern Angular
999
+ standalone: true, // Use `standalone: true` in modern Angular
991
1000
  }]
992
1001
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { inViewport: [{
993
1002
  type: Output
@@ -1003,7 +1012,10 @@ class ChatComponent {
1003
1012
  console.log(`Either chat ot chatData is required!`);
1004
1013
  }
1005
1014
  if (!this.chat && this.chatData) {
1006
- this.chat = this.messenger.addStandaloneChat(this.chatData);
1015
+ this.chat = this.messenger.addStandaloneChat({
1016
+ ...this.chatData,
1017
+ utilitiesSignalingClient: this.entity?.signalingClient,
1018
+ });
1007
1019
  this.chat.loadRemoteMessages('back');
1008
1020
  }
1009
1021
  }
@@ -1013,7 +1025,7 @@ class ChatComponent {
1013
1025
  }
1014
1026
  }
1015
1027
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1016
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: ChatComponent, isStandalone: true, selector: "rtsee-chat", inputs: { chat: "chat", chatData: "chatData", messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-chat\"\n [ngClass]=\"{\n 'rtsee-chat-standalone': chat.isStandalone,\n 'rtsee-chat-in-viewport': chat.isInViewPort\n }\"\n rtseeViewportObserver\n (inViewport)=\"onInViewPortChange($event)\"\n>\n <div class=\"rtsee-chat-footer-container\">\n <div class=\"rtsee-chat-footer-container-inner\">\n <rtsee-chat-input [messenger]=\"messenger\" [chat]=\"chat\"></rtsee-chat-input>\n </div>\n </div>\n <div class=\"rtsee-chat-body-container\">\n <rtsee-messages-list [messenger]=\"messenger\" [chat]=\"chat\"></rtsee-messages-list>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: MessagesListComponent, selector: "rtsee-messages-list", inputs: ["chat", "messenger"] }, { kind: "component", type: ChatInputComponent, selector: "rtsee-chat-input", inputs: ["messenger", "chat"] }, { kind: "directive", type: ViewportObserverDirective, selector: "[rtseeViewportObserver]", outputs: ["inViewport"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1028
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: ChatComponent, isStandalone: true, selector: "rtsee-chat", inputs: { chat: "chat", chatData: "chatData", entity: "entity", messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-chat\"\n [ngClass]=\"{\n 'rtsee-chat-standalone': chat.isStandalone,\n 'rtsee-chat-in-viewport': chat.isInViewPort\n }\"\n rtseeViewportObserver\n (inViewport)=\"onInViewPortChange($event)\"\n>\n <div class=\"rtsee-chat-footer-container\">\n <div class=\"rtsee-chat-footer-container-inner\">\n <rtsee-chat-input [messenger]=\"messenger\" [chat]=\"chat\"></rtsee-chat-input>\n </div>\n </div>\n <div class=\"rtsee-chat-body-container\">\n <rtsee-messages-list [messenger]=\"messenger\" [chat]=\"chat\"></rtsee-messages-list>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: MessagesListComponent, selector: "rtsee-messages-list", inputs: ["chat", "messenger"] }, { kind: "component", type: ChatInputComponent, selector: "rtsee-chat-input", inputs: ["messenger", "chat"] }, { kind: "directive", type: ViewportObserverDirective, selector: "[rtseeViewportObserver]", outputs: ["inViewport"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1017
1029
  }
1018
1030
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChatComponent, decorators: [{
1019
1031
  type: Component,
@@ -1021,12 +1033,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1021
1033
  MessagesListComponent,
1022
1034
  ChatInputComponent,
1023
1035
  ViewportObserverDirective,
1024
- NgClass
1036
+ NgClass,
1025
1037
  ], standalone: true, template: "<div class=\"rtsee-chat\"\n [ngClass]=\"{\n 'rtsee-chat-standalone': chat.isStandalone,\n 'rtsee-chat-in-viewport': chat.isInViewPort\n }\"\n rtseeViewportObserver\n (inViewport)=\"onInViewPortChange($event)\"\n>\n <div class=\"rtsee-chat-footer-container\">\n <div class=\"rtsee-chat-footer-container-inner\">\n <rtsee-chat-input [messenger]=\"messenger\" [chat]=\"chat\"></rtsee-chat-input>\n </div>\n </div>\n <div class=\"rtsee-chat-body-container\">\n <rtsee-messages-list [messenger]=\"messenger\" [chat]=\"chat\"></rtsee-messages-list>\n </div>\n</div>\n" }]
1026
1038
  }], propDecorators: { chat: [{
1027
1039
  type: Input
1028
1040
  }], chatData: [{
1029
1041
  type: Input
1042
+ }], entity: [{
1043
+ type: Input
1030
1044
  }], messenger: [{
1031
1045
  type: Input
1032
1046
  }] } });
@@ -1036,8 +1050,7 @@ class RTSeeCropperComponent {
1036
1050
  this.loadInProgress = true;
1037
1051
  this.nextClicked = new EventEmitter();
1038
1052
  }
1039
- ngOnInit() {
1040
- }
1053
+ ngOnInit() { }
1041
1054
  onCropperReady() {
1042
1055
  this.loadInProgress = false;
1043
1056
  this.cropper.setCropperElem(this.imageCropper);
@@ -1059,7 +1072,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1059
1072
  NgClass,
1060
1073
  RadioButton,
1061
1074
  PreloaderComponent,
1062
- Button
1075
+ Button,
1063
1076
  ], standalone: true, template: "<div class=\"rtsee-image-cropper-container\"\n [ngClass]=\"{'rtsee-image-cropper-loading': loadInProgress}\"\n>\n @if (cropper.activeImage) {\n <div class=\"rtsee-image-cropper-container-inner\">\n <image-cropper style=\"visibility: hidden\"\n [imageFile]=\"cropper.activeImage.file\"\n [maintainAspectRatio]=\"true\"\n [aspectRatio]=\"cropper.aspectRatio\"\n [resizeToWidth]=\"cropper.resizeToWidth\"\n [autoCrop]=\"false\"\n (imageCropped)=\"onImageCropped($event)\"\n (cropperReady)=\"onCropperReady()\"\n [imageQuality]=\"70\"\n format='jpeg'\n ></image-cropper>\n </div>\n }\n @if (cropper.aspectRatioConfigurable) {\n <div class=\"rtsee-select-aspect-ratio-container\">\n <span class=\"radio-btn title-text\">Aspect Ratio:</span>\n\n <p-radio-button name=\"pizza\" value=\"Cheese\" inputId=\"ingredient1\" />\n <label for=\"ingredient1\" class=\"ml-2\">Cheese</label>\n </div>\n }\n\n @if (!loadInProgress) {\n <div class=\"image-cropper-actions\">\n <p-button label=\"Next\"\n severity=\"primary\"\n (click)=\"cropper.onNextButtonClicked()\"\n ></p-button>\n </div>\n }\n\n <rtsee-preloader [diameter]=\"5\"></rtsee-preloader>\n</div>\n" }]
1064
1077
  }], ctorParameters: () => [], propDecorators: { cropper: [{
1065
1078
  type: Input
@@ -1102,11 +1115,7 @@ class RTSeeImageUploaderComponent {
1102
1115
  }
1103
1116
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RTSeeImageUploaderComponent, decorators: [{
1104
1117
  type: Component,
1105
- args: [{ selector: 'rtsee-image-uploader', imports: [
1106
- RTSeeUploaderComponent,
1107
- RTSeeCropperComponent,
1108
- Button
1109
- ], template: "<div class=\"rtsee-image-uploader\">\n @if (!imageUploader.awaitsUploadOrCrop) {\n <div class=\"rtsee-image-uploader-image\"\n (click)=\"imageUploader.init()\"\n >\n @if (imageUploader.uploadedPhotoPreview) {\n <img [src]=\"imageUploader.uploadedPhotoPreview\"\n class=\"rtsee-image-uploader-preview-image\"\n alt=\"uploaded_photo\"\n >\n }\n @if (!imageUploader.uploadedPhotoPreview) {\n <div class=\"rtsee-preloader-image-placeholder\"></div>\n }\n <div class=\"rtsee-image-uploader-image-change-btn\">\n <p-button icon=\"pi pi-pencil\" severity=\"info\"></p-button>\n </div>\n </div>\n }\n\n @if (imageUploader.awaitsUploadOrCrop) {\n <rtsee-uploader [uploader]=\"imageUploader.uploader\"\n [hidden]=\"imageUploader.cropper?.activeImage\"\n ></rtsee-uploader>\n\n @if (imageUploader.cropper?.activeImage) {\n <rtsee-cropper [cropper]=\"imageUploader.cropper\"\n (nextClicked)=\"onNextButtonClicked()\"\n ></rtsee-cropper>\n }\n }\n</div>\n" }]
1118
+ args: [{ selector: 'rtsee-image-uploader', imports: [RTSeeUploaderComponent, RTSeeCropperComponent, Button], template: "<div class=\"rtsee-image-uploader\">\n @if (!imageUploader.awaitsUploadOrCrop) {\n <div class=\"rtsee-image-uploader-image\"\n (click)=\"imageUploader.init()\"\n >\n @if (imageUploader.uploadedPhotoPreview) {\n <img [src]=\"imageUploader.uploadedPhotoPreview\"\n class=\"rtsee-image-uploader-preview-image\"\n alt=\"uploaded_photo\"\n >\n }\n @if (!imageUploader.uploadedPhotoPreview) {\n <div class=\"rtsee-preloader-image-placeholder\"></div>\n }\n <div class=\"rtsee-image-uploader-image-change-btn\">\n <p-button icon=\"pi pi-pencil\" severity=\"info\"></p-button>\n </div>\n </div>\n }\n\n @if (imageUploader.awaitsUploadOrCrop) {\n <rtsee-uploader [uploader]=\"imageUploader.uploader\"\n [hidden]=\"imageUploader.cropper?.activeImage\"\n ></rtsee-uploader>\n\n @if (imageUploader.cropper?.activeImage) {\n <rtsee-cropper [cropper]=\"imageUploader.cropper\"\n (nextClicked)=\"onNextButtonClicked()\"\n ></rtsee-cropper>\n }\n }\n</div>\n" }]
1110
1119
  }], propDecorators: { cropperComponent: [{
1111
1120
  type: ViewChild,
1112
1121
  args: [RTSeeCropperComponent]
@@ -1122,16 +1131,16 @@ class ManageProfileComponent {
1122
1131
  validators: [
1123
1132
  Validators.required,
1124
1133
  Validators.minLength(3),
1125
- Validators.maxLength(141)
1126
- ]
1134
+ Validators.maxLength(141),
1135
+ ],
1127
1136
  }),
1128
1137
  lastName: this.formBuilder.control('', {
1129
1138
  validators: [
1130
1139
  Validators.required,
1131
1140
  Validators.minLength(3),
1132
- Validators.maxLength(141)
1133
- ]
1134
- })
1141
+ Validators.maxLength(141),
1142
+ ],
1143
+ }),
1135
1144
  });
1136
1145
  }
1137
1146
  ngOnInit() {
@@ -1150,7 +1159,7 @@ class ManageProfileComponent {
1150
1159
  }
1151
1160
  await this.manageProfile.save({
1152
1161
  firstName: this.firstNameField.getRawValue(),
1153
- lastName: this.lastNameField.getRawValue()
1162
+ lastName: this.lastNameField.getRawValue(),
1154
1163
  });
1155
1164
  }
1156
1165
  get firstNameField() {
@@ -1171,7 +1180,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1171
1180
  Message,
1172
1181
  RTSeeImageUploaderComponent,
1173
1182
  ReactiveFormsModule,
1174
- InputText
1183
+ InputText,
1175
1184
  ], template: "<div class=\"rtsee-messenger-manage-profile\">\n <div class=\"rtsee-messenger-manage-profile-info rtsee-form-container\">\n <div class=\"rtsee-messenger-manage-profile-image\">\n <rtsee-image-uploader [imageUploader]=\"manageProfile.imageUploader\"\n ></rtsee-image-uploader>\n </div>\n\n <form class=\"rtsee-manage-profile-form rtsee-form\"\n [formGroup]=\"profileForm\"\n (ngSubmit)=\"submit()\"\n >\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"firstNameField\"\n [class.p-invalid]=\"firstNameField.invalid && firstNameField.touched\"\n />\n <label for=\"sign-up-email\">First Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (firstNameField.hasError('required') && firstNameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >First Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"lastNameField\"\n [class.p-invalid]=\"lastNameField.invalid && lastNameField.touched\"\n />\n <label for=\"sign-up-email\">Last Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (lastNameField.hasError('required') && lastNameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Last Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-manage-profile-buttons\">\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageProfile.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageProfile.cancel()\"\n [disabled]=\"manageProfile.saveInProgress\"\n />\n </div>\n </form>\n </div>\n</div>\n" }]
1176
1185
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { messenger: [{
1177
1186
  type: Input
@@ -1191,10 +1200,7 @@ class PaymentProductSnippetComponent {
1191
1200
  }
1192
1201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PaymentProductSnippetComponent, decorators: [{
1193
1202
  type: Component,
1194
- args: [{ selector: 'rtsee-payment-product-snippet', imports: [
1195
- Card,
1196
- Button
1197
- ], template: "<div class=\"rtsee-payment-product-snippet\">\n <p-card [header]=\"product.name\">\n <p class=\"rtsee-payment-product-snippet-description\">{{product.description}}</p>\n <div class=\"rtsee-payment-product-prices\">\n @for (price of product.prices; track price.id) {\n <div class=\"rtsee-payment-product-price\">\n <p-card [header]=\"price.label\" >\n <p>{{price.description}}</p>\n <p-button label=\"Select Plan\"\n (click)=\"selectPrice(price)\"\n ></p-button>\n </p-card>\n </div>\n }\n </div>\n </p-card>\n</div>\n" }]
1203
+ args: [{ selector: 'rtsee-payment-product-snippet', imports: [Card, Button], template: "<div class=\"rtsee-payment-product-snippet\">\n <p-card [header]=\"product.name\">\n <p class=\"rtsee-payment-product-snippet-description\">{{product.description}}</p>\n <div class=\"rtsee-payment-product-prices\">\n @for (price of product.prices; track price.id) {\n <div class=\"rtsee-payment-product-price\">\n <p-card [header]=\"price.label\" >\n <p>{{price.description}}</p>\n <p-button label=\"Select Plan\"\n (click)=\"selectPrice(price)\"\n ></p-button>\n </p-card>\n </div>\n }\n </div>\n </p-card>\n</div>\n" }]
1198
1204
  }], propDecorators: { product: [{
1199
1205
  type: Input
1200
1206
  }], priceSelected: [{
@@ -1213,17 +1219,16 @@ class PaymentsService {
1213
1219
  }
1214
1220
  createSession(options) {
1215
1221
  if (!this.paymentsConfig) {
1216
- throw new Error("Payments not configured");
1222
+ throw new Error('Payments not configured');
1217
1223
  }
1218
- return this.http
1219
- .post(this.paymentsConfig.createSessionEndpoint, options);
1224
+ return this.http.post(this.paymentsConfig.createSessionEndpoint, options);
1220
1225
  }
1221
1226
  getSession() {
1222
1227
  if (!this.paymentsConfig) {
1223
- throw new Error("Payments not configured");
1228
+ throw new Error('Payments not configured');
1224
1229
  }
1225
1230
  if (!this.paymentsConfig.sessionId) {
1226
- throw new Error("No SessionId provided");
1231
+ throw new Error('No SessionId provided');
1227
1232
  }
1228
1233
  return this.http
1229
1234
  .get(`${this.paymentsConfig.getSessionEndpoint}/?sessionId=${this.paymentsConfig.sessionId}`)
@@ -1234,7 +1239,7 @@ class PaymentsService {
1234
1239
  }
1235
1240
  getProducts() {
1236
1241
  if (!this.paymentsConfig || !this.paymentsConfig.appId) {
1237
- throw new Error("Payments Config not initialized!");
1242
+ throw new Error('Payments Config not initialized!');
1238
1243
  }
1239
1244
  this.paymentsConfig.setProductsLoadInProgress(true);
1240
1245
  return this.http
@@ -1243,11 +1248,10 @@ class PaymentsService {
1243
1248
  }
1244
1249
  unsubscribe(subscriptionId) {
1245
1250
  if (!this.paymentsConfig || !this.paymentsConfig.appId) {
1246
- throw new Error("Payments Config not initialized!");
1251
+ throw new Error('Payments Config not initialized!');
1247
1252
  }
1248
- return this.http
1249
- .post(`${this.paymentsConfig?.unsubscribeEndpoint}`, {
1250
- subscriptionId
1253
+ return this.http.post(`${this.paymentsConfig?.unsubscribeEndpoint}`, {
1254
+ subscriptionId,
1251
1255
  });
1252
1256
  }
1253
1257
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PaymentsService, deps: [{ token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -1256,7 +1260,7 @@ class PaymentsService {
1256
1260
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PaymentsService, decorators: [{
1257
1261
  type: Injectable,
1258
1262
  args: [{
1259
- providedIn: 'root'
1263
+ providedIn: 'root',
1260
1264
  }]
1261
1265
  }], ctorParameters: () => [{ type: i1$1.HttpClient }] });
1262
1266
 
@@ -1271,7 +1275,9 @@ class PaymentPageComponent {
1271
1275
  if (!this.paymentsService.paymentsConfig?.publicKey) {
1272
1276
  return;
1273
1277
  }
1274
- this.stripe = await loadStripe(this.paymentsService.paymentsConfig.publicKey) || undefined;
1278
+ this.stripe =
1279
+ (await loadStripe(this.paymentsService.paymentsConfig.publicKey)) ||
1280
+ undefined;
1275
1281
  this.getProducts();
1276
1282
  }
1277
1283
  getProducts() {
@@ -1279,7 +1285,8 @@ class PaymentPageComponent {
1279
1285
  }
1280
1286
  selectPlan(price) {
1281
1287
  const priceId = price.priceId;
1282
- if (!this.messenger.payments || !this.messenger.payments.createSessionEndpoint) {
1288
+ if (!this.messenger.payments ||
1289
+ !this.messenger.payments.createSessionEndpoint) {
1283
1290
  console.log('No payments config.');
1284
1291
  return;
1285
1292
  }
@@ -1289,12 +1296,14 @@ class PaymentPageComponent {
1289
1296
  }
1290
1297
  this.planSelected = true;
1291
1298
  this.loadInProgress = true;
1292
- this.paymentsService.createSession({
1299
+ this.paymentsService
1300
+ .createSession({
1293
1301
  priceId: priceId,
1294
1302
  userId: this.messenger.myPeer.clientId,
1295
1303
  route: `/profile/${this.messenger.myPeer.clientId}`,
1296
- applicationId: this.messenger.myPeer.rtseeAppId
1297
- }).subscribe((response) => {
1304
+ applicationId: this.messenger.myPeer.rtseeAppId,
1305
+ })
1306
+ .subscribe((response) => {
1298
1307
  void this.initCheckout(response.clientSecret);
1299
1308
  });
1300
1309
  }
@@ -1304,7 +1313,7 @@ class PaymentPageComponent {
1304
1313
  return;
1305
1314
  }
1306
1315
  const checkout = await this.stripe.initEmbeddedCheckout({
1307
- clientSecret: secret
1316
+ clientSecret: secret,
1308
1317
  });
1309
1318
  if (!checkout) {
1310
1319
  return;
@@ -1327,7 +1336,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1327
1336
  ReactiveFormsModule,
1328
1337
  ProgressSpinner,
1329
1338
  PaymentProductSnippetComponent,
1330
- Button
1339
+ Button,
1331
1340
  ], template: "<div class=\"rtsee-payment-page rtsee-form-container\">\n @if (messenger.payments && !planSelected) {\n @if (messenger.payments.products) {\n <div class=\"rtsee-payment-page-products\">\n @for (product of messenger.payments.products ; track product.id) {\n <rtsee-payment-product-snippet [product]=\"product\"\n (priceSelected)=\"selectPlan($event)\"\n ></rtsee-payment-product-snippet>\n }\n </div>\n } @else {\n <p-progress-spinner strokeWidth=\"8\"></p-progress-spinner>\n }\n }\n @if (loadInProgress) {\n <p-progress-spinner strokeWidth=\"8\"></p-progress-spinner>\n }\n <div #checkoutContainer class=\"stripe-checkout-container\"></div>\n <div class=\"rtsee-payment-page-footer\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.CANCEL_LABEL]\"\n (click)=\"messenger.closePaymentPage()\"\n severity=\"warn\"\n ></p-button>\n </div>\n</div>\n" }]
1332
1341
  }], ctorParameters: () => [{ type: PaymentsService }], propDecorators: { messenger: [{
1333
1342
  type: Input
@@ -1346,7 +1355,9 @@ class PaymentValidationPageComponent {
1346
1355
  if (!this.paymentsService.paymentsConfig?.publicKey) {
1347
1356
  return;
1348
1357
  }
1349
- this.stripe = await loadStripe(this.paymentsService.paymentsConfig.publicKey) || undefined;
1358
+ this.stripe =
1359
+ (await loadStripe(this.paymentsService.paymentsConfig.publicKey)) ||
1360
+ undefined;
1350
1361
  this.validatePayment();
1351
1362
  }
1352
1363
  validatePayment() {
@@ -1365,11 +1376,7 @@ class PaymentValidationPageComponent {
1365
1376
  }
1366
1377
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PaymentValidationPageComponent, decorators: [{
1367
1378
  type: Component,
1368
- args: [{ selector: 'rtsee-payment-validation-page', imports: [
1369
- ReactiveFormsModule,
1370
- ProgressSpinner,
1371
- Button
1372
- ], template: "<div class=\"rtsee-payment-page rtsee-form-container\">\n @if (messenger.payments?.validationInProgress) {\n <p-progress-spinner strokeWidth=\"8\"></p-progress-spinner>\n }\n <div class=\"rtsee-payment-page-footer\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.CANCEL_LABEL]\"\n (click)=\"messenger.closePaymentPage()\"\n severity=\"warn\"\n ></p-button>\n </div>\n</div>\n" }]
1379
+ args: [{ selector: 'rtsee-payment-validation-page', imports: [ReactiveFormsModule, ProgressSpinner, Button], template: "<div class=\"rtsee-payment-page rtsee-form-container\">\n @if (messenger.payments?.validationInProgress) {\n <p-progress-spinner strokeWidth=\"8\"></p-progress-spinner>\n }\n <div class=\"rtsee-payment-page-footer\">\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.CANCEL_LABEL]\"\n (click)=\"messenger.closePaymentPage()\"\n severity=\"warn\"\n ></p-button>\n </div>\n</div>\n" }]
1373
1380
  }], ctorParameters: () => [{ type: PaymentsService }], propDecorators: { messenger: [{
1374
1381
  type: Input
1375
1382
  }], checkoutContainer: [{
@@ -1400,11 +1407,7 @@ class ManagePlanComponent {
1400
1407
  }
1401
1408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManagePlanComponent, decorators: [{
1402
1409
  type: Component,
1403
- args: [{ selector: 'rtsee-manage-plan', imports: [
1404
- Card,
1405
- Divider,
1406
- Button
1407
- ], template: "<div class=\"rtsee-manage-plan\">\n <h2>{{messenger.labels[RTSeeTextLabelKeys.MANAGE_PLAN]}}</h2>\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.BACK_LABEL]\"\n severity=\"secondary\"\n (click)=\"messenger.closeManagePlanPage()\"\n ></p-button>\n @if (plan) {\n <p-card [header]=\"plan.productName\">\n <p>{{plan.productDescription}}</p>\n <p-divider></p-divider>\n <div class=\"rtsee-manage-plan-info\">\n <p>Active From: {{activeFromFormated}}</p>\n <p>Active To: {{activeToFormated}}</p>\n </div>\n <p-button [label]=\"'Unsubscribe'\"\n (click)=\"onUnsubscribeClicked()\"\n ></p-button>\n </p-card>\n }\n</div>\n" }]
1410
+ args: [{ selector: 'rtsee-manage-plan', imports: [Card, Divider, Button], template: "<div class=\"rtsee-manage-plan\">\n <h2>{{messenger.labels[RTSeeTextLabelKeys.MANAGE_PLAN]}}</h2>\n <p-button [label]=\"messenger.labels[RTSeeTextLabelKeys.BACK_LABEL]\"\n severity=\"secondary\"\n (click)=\"messenger.closeManagePlanPage()\"\n ></p-button>\n @if (plan) {\n <p-card [header]=\"plan.productName\">\n <p>{{plan.productDescription}}</p>\n <p-divider></p-divider>\n <div class=\"rtsee-manage-plan-info\">\n <p>Active From: {{activeFromFormated}}</p>\n <p>Active To: {{activeToFormated}}</p>\n </div>\n <p-button [label]=\"'Unsubscribe'\"\n (click)=\"onUnsubscribeClicked()\"\n ></p-button>\n </p-card>\n }\n</div>\n" }]
1408
1411
  }], ctorParameters: () => [{ type: PaymentsService }], propDecorators: { messenger: [{
1409
1412
  type: Input
1410
1413
  }] } });
@@ -1414,7 +1417,7 @@ class MessengerComponent {
1414
1417
  this.messenger.loadChats();
1415
1418
  }
1416
1419
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MessengerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1417
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: MessengerComponent, isStandalone: true, selector: "rtsee-messenger", inputs: { messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-messenger\" [ngClass]=\"{\n 'rtsee-messenger-header-expanded': messenger.openedProfile || messenger.openedChatDetails,\n 'rtsee-messenger-folded': messenger.folded,\n 'rtsee-messenger-overlay-window': messenger.isOverlayPageOpened\n}\">\n @if (messenger.manageProfile) {\n <div class=\"rtsee-manage-profile\">\n <rtsee-manage-profile [manageProfile]=\"messenger.manageProfile\"\n [messenger]=\"messenger\"\n ></rtsee-manage-profile>\n </div>\n }\n\n @if (messenger.isPaymentPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-payment-page [messenger]=\"messenger\"></rtsee-payment-page>\n </div>\n }\n\n @if (messenger.isPaymentValidationPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-payment-validation-page [messenger]=\"messenger\"></rtsee-payment-validation-page>\n </div>\n }\n\n @if (messenger.isManagePlanPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-manage-plan [messenger]=\"messenger\"></rtsee-manage-plan>\n </div>\n }\n\n <div class=\"rtsee-messenger-header-container\">\n <rtsee-messenger-header [messenger]=\"messenger\"\n ></rtsee-messenger-header>\n </div>\n <div class=\"rtsee-messenger-body-container\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolled)=\"onScroll()\"\n >\n @if (messenger.openedChat) {\n <rtsee-chat [messenger]=\"messenger\" [chat]=\"messenger.openedChat\"></rtsee-chat>\n } @else if (!messenger.openedChat) {\n <rtsee-chats-list [chats]=\"messenger.chats\" [messenger]=\"messenger\"></rtsee-chats-list>\n } @else if (messenger.openedProfile) {\n <rtsee-profile></rtsee-profile>\n }\n @if (messenger.loadingChatsInProgress) {\n <rtsee-preloader [diameter]=\"50\" ></rtsee-preloader>\n }\n </div>\n</div>\n\n\n", dependencies: [{ kind: "component", type: MessengerHeaderComponent, selector: "rtsee-messenger-header", inputs: ["messenger"] }, { kind: "directive", type: InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ChatsListComponent, selector: "rtsee-chats-list", inputs: ["messenger", "chats"] }, { kind: "component", type: ChatComponent, selector: "rtsee-chat", inputs: ["chat", "chatData", "messenger"] }, { kind: "component", type: PreloaderComponent, selector: "rtsee-preloader", inputs: ["diameter", "color"] }, { kind: "component", type: ProfileComponent, selector: "rtsee-profile", inputs: ["messenger", "peer"] }, { kind: "component", type: ManageProfileComponent, selector: "rtsee-manage-profile", inputs: ["messenger", "manageProfile"] }, { kind: "component", type: PaymentPageComponent, selector: "rtsee-payment-page", inputs: ["messenger"] }, { kind: "component", type: PaymentValidationPageComponent, selector: "rtsee-payment-validation-page", inputs: ["messenger"] }, { kind: "component", type: ManagePlanComponent, selector: "rtsee-manage-plan", inputs: ["messenger"] }] }); }
1420
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: MessengerComponent, isStandalone: true, selector: "rtsee-messenger", inputs: { messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-messenger\" [ngClass]=\"{\n 'rtsee-messenger-header-expanded': messenger.openedProfile || messenger.openedChatDetails,\n 'rtsee-messenger-folded': messenger.folded,\n 'rtsee-messenger-overlay-window': messenger.isOverlayPageOpened\n}\">\n @if (messenger.manageProfile) {\n <div class=\"rtsee-manage-profile\">\n <rtsee-manage-profile [manageProfile]=\"messenger.manageProfile\"\n [messenger]=\"messenger\"\n ></rtsee-manage-profile>\n </div>\n }\n\n @if (messenger.isPaymentPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-payment-page [messenger]=\"messenger\"></rtsee-payment-page>\n </div>\n }\n\n @if (messenger.isPaymentValidationPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-payment-validation-page [messenger]=\"messenger\"></rtsee-payment-validation-page>\n </div>\n }\n\n @if (messenger.isManagePlanPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-manage-plan [messenger]=\"messenger\"></rtsee-manage-plan>\n </div>\n }\n\n <div class=\"rtsee-messenger-header-container\">\n <rtsee-messenger-header [messenger]=\"messenger\"\n ></rtsee-messenger-header>\n </div>\n <div class=\"rtsee-messenger-body-container\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolled)=\"onScroll()\"\n >\n @if (messenger.openedChat) {\n <rtsee-chat [messenger]=\"messenger\" [chat]=\"messenger.openedChat\"></rtsee-chat>\n } @else if (!messenger.openedChat) {\n <rtsee-chats-list [chats]=\"messenger.chats\" [messenger]=\"messenger\"></rtsee-chats-list>\n } @else if (messenger.openedProfile) {\n <rtsee-profile></rtsee-profile>\n }\n @if (messenger.loadingChatsInProgress) {\n <rtsee-preloader [diameter]=\"50\" ></rtsee-preloader>\n }\n </div>\n</div>\n\n\n", dependencies: [{ kind: "component", type: MessengerHeaderComponent, selector: "rtsee-messenger-header", inputs: ["messenger"] }, { kind: "directive", type: InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ChatsListComponent, selector: "rtsee-chats-list", inputs: ["messenger", "chats"] }, { kind: "component", type: ChatComponent, selector: "rtsee-chat", inputs: ["chat", "chatData", "entity", "messenger"] }, { kind: "component", type: PreloaderComponent, selector: "rtsee-preloader", inputs: ["diameter", "color"] }, { kind: "component", type: ProfileComponent, selector: "rtsee-profile", inputs: ["messenger", "peer"] }, { kind: "component", type: ManageProfileComponent, selector: "rtsee-manage-profile", inputs: ["messenger", "manageProfile"] }, { kind: "component", type: PaymentPageComponent, selector: "rtsee-payment-page", inputs: ["messenger"] }, { kind: "component", type: PaymentValidationPageComponent, selector: "rtsee-payment-validation-page", inputs: ["messenger"] }, { kind: "component", type: ManagePlanComponent, selector: "rtsee-manage-plan", inputs: ["messenger"] }] }); }
1418
1421
  }
1419
1422
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MessengerComponent, decorators: [{
1420
1423
  type: Component,
@@ -1429,7 +1432,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1429
1432
  ManageProfileComponent,
1430
1433
  PaymentPageComponent,
1431
1434
  PaymentValidationPageComponent,
1432
- ManagePlanComponent
1435
+ ManagePlanComponent,
1433
1436
  ], standalone: true, template: "<div class=\"rtsee-messenger\" [ngClass]=\"{\n 'rtsee-messenger-header-expanded': messenger.openedProfile || messenger.openedChatDetails,\n 'rtsee-messenger-folded': messenger.folded,\n 'rtsee-messenger-overlay-window': messenger.isOverlayPageOpened\n}\">\n @if (messenger.manageProfile) {\n <div class=\"rtsee-manage-profile\">\n <rtsee-manage-profile [manageProfile]=\"messenger.manageProfile\"\n [messenger]=\"messenger\"\n ></rtsee-manage-profile>\n </div>\n }\n\n @if (messenger.isPaymentPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-payment-page [messenger]=\"messenger\"></rtsee-payment-page>\n </div>\n }\n\n @if (messenger.isPaymentValidationPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-payment-validation-page [messenger]=\"messenger\"></rtsee-payment-validation-page>\n </div>\n }\n\n @if (messenger.isManagePlanPageOpened) {\n <div class=\"rtsee-payment-page-container\">\n <rtsee-manage-plan [messenger]=\"messenger\"></rtsee-manage-plan>\n </div>\n }\n\n <div class=\"rtsee-messenger-header-container\">\n <rtsee-messenger-header [messenger]=\"messenger\"\n ></rtsee-messenger-header>\n </div>\n <div class=\"rtsee-messenger-body-container\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolled)=\"onScroll()\"\n >\n @if (messenger.openedChat) {\n <rtsee-chat [messenger]=\"messenger\" [chat]=\"messenger.openedChat\"></rtsee-chat>\n } @else if (!messenger.openedChat) {\n <rtsee-chats-list [chats]=\"messenger.chats\" [messenger]=\"messenger\"></rtsee-chats-list>\n } @else if (messenger.openedProfile) {\n <rtsee-profile></rtsee-profile>\n }\n @if (messenger.loadingChatsInProgress) {\n <rtsee-preloader [diameter]=\"50\" ></rtsee-preloader>\n }\n </div>\n</div>\n\n\n" }]
1434
1437
  }], propDecorators: { messenger: [{
1435
1438
  type: Input
@@ -1520,10 +1523,7 @@ class EventThumbnailComponent {
1520
1523
  }
1521
1524
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: EventThumbnailComponent, decorators: [{
1522
1525
  type: Component,
1523
- args: [{ selector: 'rtsee-event-thumbnail', imports: [
1524
- WidgetDirective,
1525
- NgClass
1526
- ], standalone: true, template: "<div class=\"rtsee-events-dashboard-event-thumbnail\">\n @if (event.widget) {\n <ng-template widgetHost></ng-template>\n } @else if (!event.widget) {\n <div class=\"rtsee-events-dashboard-default-event-thumbnail\"\n [ngClass]=\"{'rtsee-events-dashboard-default-event-thumbnail-with-data': event.data}\"\n >\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-name\">{{event.name}}</div>\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-info\">\n @if (event.data) {\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-details\"\n [title]=\"tooltip\"\n >\n <span class=\"rtsee-events-dashboard-default-event-thumbnail-details-icon material-icons-outlined\"\n >info</span>\n </div>\n }\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-time\">\n <span>{{ timeInAgoFormat }}</span>\n </div>\n </div>\n </div>\n }\n</div>\n" }]
1526
+ args: [{ selector: 'rtsee-event-thumbnail', imports: [WidgetDirective, NgClass], standalone: true, template: "<div class=\"rtsee-events-dashboard-event-thumbnail\">\n @if (event.widget) {\n <ng-template widgetHost></ng-template>\n } @else if (!event.widget) {\n <div class=\"rtsee-events-dashboard-default-event-thumbnail\"\n [ngClass]=\"{'rtsee-events-dashboard-default-event-thumbnail-with-data': event.data}\"\n >\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-name\">{{event.name}}</div>\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-info\">\n @if (event.data) {\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-details\"\n [title]=\"tooltip\"\n >\n <span class=\"rtsee-events-dashboard-default-event-thumbnail-details-icon material-icons-outlined\"\n >info</span>\n </div>\n }\n <div class=\"rtsee-events-dashboard-default-event-thumbnail-time\">\n <span>{{ timeInAgoFormat }}</span>\n </div>\n </div>\n </div>\n }\n</div>\n" }]
1527
1527
  }], ctorParameters: () => [{ type: EventsWidgetsService }, { type: i0.ComponentFactoryResolver }, { type: TimeFormatHelperService }, { type: i0.ChangeDetectorRef }], propDecorators: { event: [{
1528
1528
  type: Input
1529
1529
  }], widgetHost: [{
@@ -1540,11 +1540,7 @@ class RtseeEventsDashboardSessionComponent {
1540
1540
  }
1541
1541
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEventsDashboardSessionComponent, decorators: [{
1542
1542
  type: Component,
1543
- args: [{ selector: 'rtsee-rtsee-events-dashboard-session', imports: [
1544
- NgIf,
1545
- EventThumbnailComponent,
1546
- SlicePipe
1547
- ], standalone: true, template: "<div class=\"rtsee-events-dashboard-session\">\n <div class=\"rtsee-events-dashboard-session-header\" *ngIf=\"session.info\">\n <p class=\"rtsee-events-dashboard-session-client-info\">{{session.info.clientThumbnail}}</p>\n <p class=\"rtsee-events-dashboard-session-os-info\">{{session.info.osThumbnail}}</p>\n <div class=\"rtsee-events-dashboard-session-device-info\" [title]=\"session.info.deviceThumbnail\">\n <span *ngIf=\"session.info.deviceType === 'smartphone' && !session.info.botName\"\n class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n >phone_iphone</span>\n <span class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n *ngIf=\"session.info.deviceType === 'tablet' && !session.info.botName\"\n >tablet_mac</span>\n <span class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n *ngIf=\"session.info.deviceType === 'desktop' && !session.info.botName\"\n >computer</span>\n <span class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n *ngIf=\"session.info.botName\"\n >smart_toy</span>\n </div>\n </div>\n <ul *ngIf=\"session.events && session.events.length\"\n class=\"rtsee-events-dashboard-session-events-list\"\n >\n @for (event of session.events | slice:0:5; track event.id) {\n <li class=\"rtsee-events-dashboard-session-event\">\n <rtsee-event-thumbnail [event]=\"event\"></rtsee-event-thumbnail>\n </li>\n }\n </ul>\n <div class=\"rtsee-events-dashboard-session-footer\">\n <button *ngIf=\"session.events.length > 5\">{{session.events.length - 5}} more</button>\n </div>\n</div>\n" }]
1543
+ args: [{ selector: 'rtsee-rtsee-events-dashboard-session', imports: [NgIf, EventThumbnailComponent, SlicePipe], standalone: true, template: "<div class=\"rtsee-events-dashboard-session\">\n <div class=\"rtsee-events-dashboard-session-header\" *ngIf=\"session.info\">\n <p class=\"rtsee-events-dashboard-session-client-info\">{{session.info.clientThumbnail}}</p>\n <p class=\"rtsee-events-dashboard-session-os-info\">{{session.info.osThumbnail}}</p>\n <div class=\"rtsee-events-dashboard-session-device-info\" [title]=\"session.info.deviceThumbnail\">\n <span *ngIf=\"session.info.deviceType === 'smartphone' && !session.info.botName\"\n class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n >phone_iphone</span>\n <span class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n *ngIf=\"session.info.deviceType === 'tablet' && !session.info.botName\"\n >tablet_mac</span>\n <span class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n *ngIf=\"session.info.deviceType === 'desktop' && !session.info.botName\"\n >computer</span>\n <span class=\"material-icons-outlined rtsee-events-dashboard-session-device-info-icon\"\n *ngIf=\"session.info.botName\"\n >smart_toy</span>\n </div>\n </div>\n <ul *ngIf=\"session.events && session.events.length\"\n class=\"rtsee-events-dashboard-session-events-list\"\n >\n @for (event of session.events | slice:0:5; track event.id) {\n <li class=\"rtsee-events-dashboard-session-event\">\n <rtsee-event-thumbnail [event]=\"event\"></rtsee-event-thumbnail>\n </li>\n }\n </ul>\n <div class=\"rtsee-events-dashboard-session-footer\">\n <button *ngIf=\"session.events.length > 5\">{{session.events.length - 5}} more</button>\n </div>\n</div>\n" }]
1548
1544
  }], ctorParameters: () => [{ type: TimeFormatHelperService }], propDecorators: { session: [{
1549
1545
  type: Input
1550
1546
  }] } });
@@ -1563,9 +1559,7 @@ class RtseeEventsDashboardClientThumbnailComponent {
1563
1559
  }
1564
1560
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEventsDashboardClientThumbnailComponent, decorators: [{
1565
1561
  type: Component,
1566
- args: [{ selector: 'ngx-rtsee-events-dashboard-client-thumbnail', imports: [
1567
- RtseeEventsDashboardSessionComponent
1568
- ], standalone: true, template: "<div class=\"rtsee-dashboard-client-thumbnail\">\n <div class=\"rtsee-dashboard-client-header\">\n <div class=\"rtsee-dashboard-client-header-photo\">\n <div class=\"rtsee-dashboard-client-header-image\"\n [style.background-image]=\"'url(' + client.imageUrl || defaultImagesService.PROFILE + ')'\"\n ></div>\n @if (client.isConnected) {\n <div class=\"rtsee-dashboard-client-live-indicator\"></div>\n }\n </div>\n <p class=\"rtsee-dashboard-client-name\">\n <span class=\"rtsee-dashboard-client-name-text\">{{ client.name || client.id }}</span>\n <button (click)=\"openChat()\" class=\"rtsee-dashboard-client-engage\">\n <span class=\"rtsee-dashboard-client-engage-icon material-icons-outlined\">chat_bubble</span>\n </button>\n </p>\n </div>\n <div class=\"rtsee-dashboard-sessions\">\n @for(session of client.sessions; track session.id) {\n <div class=\"rtsee-dashboard-sessions-container\">\n <rtsee-rtsee-events-dashboard-session [session]=\"session\"></rtsee-rtsee-events-dashboard-session>\n </div>\n }\n </div>\n</div>\n" }]
1562
+ args: [{ selector: 'ngx-rtsee-events-dashboard-client-thumbnail', imports: [RtseeEventsDashboardSessionComponent], standalone: true, template: "<div class=\"rtsee-dashboard-client-thumbnail\">\n <div class=\"rtsee-dashboard-client-header\">\n <div class=\"rtsee-dashboard-client-header-photo\">\n <div class=\"rtsee-dashboard-client-header-image\"\n [style.background-image]=\"'url(' + client.imageUrl || defaultImagesService.PROFILE + ')'\"\n ></div>\n @if (client.isConnected) {\n <div class=\"rtsee-dashboard-client-live-indicator\"></div>\n }\n </div>\n <p class=\"rtsee-dashboard-client-name\">\n <span class=\"rtsee-dashboard-client-name-text\">{{ client.name || client.id }}</span>\n <button (click)=\"openChat()\" class=\"rtsee-dashboard-client-engage\">\n <span class=\"rtsee-dashboard-client-engage-icon material-icons-outlined\">chat_bubble</span>\n </button>\n </p>\n </div>\n <div class=\"rtsee-dashboard-sessions\">\n @for(session of client.sessions; track session.id) {\n <div class=\"rtsee-dashboard-sessions-container\">\n <rtsee-rtsee-events-dashboard-session [session]=\"session\"></rtsee-rtsee-events-dashboard-session>\n </div>\n }\n </div>\n</div>\n" }]
1569
1563
  }], ctorParameters: () => [{ type: TimeFormatHelperService }, { type: DefaultImagesService }], propDecorators: { dashboard: [{
1570
1564
  type: Input
1571
1565
  }], client: [{
@@ -1578,9 +1572,7 @@ class RtseeEventsDashboardComponent {
1578
1572
  }
1579
1573
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEventsDashboardComponent, decorators: [{
1580
1574
  type: Component,
1581
- args: [{ selector: 'rtsee-events-dashboard', imports: [
1582
- RtseeEventsDashboardClientThumbnailComponent
1583
- ], standalone: true, template: "<div class=\"rtsee-events-dashboard\">\n <div class=\"rtsee-events-dashboard-client-thumbnails\">\n @for (client of eventsDashboard.clients; track client.id) {\n <div class=\"rtsee-events-dashboard-client-thumbnail-wrapper\">\n <ngx-rtsee-events-dashboard-client-thumbnail\n [client]=\"client\"\n [dashboard]=\"eventsDashboard\"\n ></ngx-rtsee-events-dashboard-client-thumbnail>\n </div>\n }\n </div>\n</div>\n" }]
1575
+ args: [{ selector: 'rtsee-events-dashboard', imports: [RtseeEventsDashboardClientThumbnailComponent], standalone: true, template: "<div class=\"rtsee-events-dashboard\">\n <div class=\"rtsee-events-dashboard-client-thumbnails\">\n @for (client of eventsDashboard.clients; track client.id) {\n <div class=\"rtsee-events-dashboard-client-thumbnail-wrapper\">\n <ngx-rtsee-events-dashboard-client-thumbnail\n [client]=\"client\"\n [dashboard]=\"eventsDashboard\"\n ></ngx-rtsee-events-dashboard-client-thumbnail>\n </div>\n }\n </div>\n</div>\n" }]
1584
1576
  }], propDecorators: { eventsDashboard: [{
1585
1577
  type: Input
1586
1578
  }] } });
@@ -1596,7 +1588,7 @@ class JoinCallComponent {
1596
1588
  this.messageService.add({
1597
1589
  severity: 'success',
1598
1590
  summary: 'Link Copied!',
1599
- detail: 'The link was copied to clipboard!'
1591
+ detail: 'The link was copied to clipboard!',
1600
1592
  });
1601
1593
  this.recentlyCopied = true;
1602
1594
  setTimeout(() => {
@@ -1608,12 +1600,7 @@ class JoinCallComponent {
1608
1600
  }
1609
1601
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: JoinCallComponent, decorators: [{
1610
1602
  type: Component,
1611
- args: [{ selector: 'rtsee-join-call', imports: [
1612
- Button,
1613
- CdkCopyToClipboard,
1614
- Message,
1615
- Toast
1616
- ], providers: [MessageService], template: "<div class=\"rtsee-join-call\">\n <div class=\"rtsee-join-call-button\">\n <p-button [label]=\"presentation.labels[RTSeeTextLabelKeys.START_A_CALL_BUTTON]\"\n (click)=\"presentation.emitJoinRoomCallEvent()\"\n ></p-button>\n </div>\n <div class=\"rtsee-share-call-link\">\n <div class=\"rtsee-share-call-explain-section\">\n <div class=\"rtsee-share-call-explain-section-icon\">\n <span class=\"pi pi-link rtsee-link-icon\"></span>\n </div>\n <div class=\"rtsee-share-call-explain-section-text\">\n <span>Anyone can join your storytelling session using this link.</span>\n </div>\n </div>\n <div class=\"rtsee-share-call-link-section\">\n <p-toast position=\"bottom-center\" />\n <p-button [icon]=\"recentlyCopied ? 'pi pi-check' : 'pi pi-copy'\"\n severity=\"secondary\"\n class=\"rtsee-share-call-link-copy-btn\"\n [cdkCopyToClipboard]=\"window.location.origin + '?room_id=' + room.id\"\n (cdkCopyToClipboardCopied)=\"copyClicked()\"\n ></p-button>\n <p-message severity=\"info\"\n class=\"rtsee-share-call-link-text\"\n >{{ window.location.origin + '?room_id=' + room.id }}</p-message>\n </div>\n </div>\n</div>\n" }]
1603
+ args: [{ selector: 'rtsee-join-call', imports: [Button, CdkCopyToClipboard, Message, Toast], providers: [MessageService], template: "<div class=\"rtsee-join-call\">\n <div class=\"rtsee-join-call-button\">\n <p-button [label]=\"presentation.labels[RTSeeTextLabelKeys.START_A_CALL_BUTTON]\"\n (click)=\"presentation.emitJoinRoomCallEvent()\"\n ></p-button>\n </div>\n <div class=\"rtsee-share-call-link\">\n <div class=\"rtsee-share-call-explain-section\">\n <div class=\"rtsee-share-call-explain-section-icon\">\n <span class=\"pi pi-link rtsee-link-icon\"></span>\n </div>\n <div class=\"rtsee-share-call-explain-section-text\">\n <span>Anyone can join your storytelling session using this link.</span>\n </div>\n </div>\n <div class=\"rtsee-share-call-link-section\">\n <p-toast position=\"bottom-center\" />\n <p-button [icon]=\"recentlyCopied ? 'pi pi-check' : 'pi pi-copy'\"\n severity=\"secondary\"\n class=\"rtsee-share-call-link-copy-btn\"\n [cdkCopyToClipboard]=\"window.location.origin + '?room_id=' + room.id\"\n (cdkCopyToClipboardCopied)=\"copyClicked()\"\n ></p-button>\n <p-message severity=\"info\"\n class=\"rtsee-share-call-link-text\"\n >{{ window.location.origin + '?room_id=' + room.id }}</p-message>\n </div>\n </div>\n</div>\n" }]
1617
1604
  }], ctorParameters: () => [{ type: i1$2.MessageService }], propDecorators: { presentation: [{
1618
1605
  type: Input
1619
1606
  }], room: [{
@@ -1625,54 +1612,15 @@ class PresentationHeaderComponent {
1625
1612
  this.RTSeeTextLabelKeys = RTSeeTextLabelKeys;
1626
1613
  }
1627
1614
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PresentationHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1628
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: PresentationHeaderComponent, isStandalone: true, selector: "rtsee-presentation-header", inputs: { presentation: "presentation" }, ngImport: i0, template: "<header class=\"rtsee-presentation-header\"\n [ngClass]=\"{\n 'rtsee-presentation-header-convertable': presentation.activeStory,\n 'rtsee-presentation-header-visible': presentation.activeStory?.headerVisible\n }\"\n>\n @if (!presentation.activeStory) {\n <div class=\"rtsee-presentations-header-title\">\n <div class=\"rtsee-presentations-header-title-overlay\"></div>\n <div class=\"rtsee-presentations-header-title-content\">\n <h1>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_TITLE_LABEL]}}</h1>\n <p class=\"rtsee-presentations-header-title-subtitle\">\n <span>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_SUBTITLE_LABEL]}}</span>\n </p>\n </div>\n </div>\n }\n\n\n @if (presentation.activeRoom && !presentation.activeStory) {\n <div class=\"rtsee-presentation-room-block\">\n <rtsee-join-call [room]=\"presentation.activeRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n </div>\n }\n\n @if (presentation.activeStory) {\n <div class=\"rtsee-presentation-header-active-story-info\">\n <div class=\"rtsee-presentation-header-active-story-info-close\"\n (click)=\"presentation.disableActiveStory()\"\n >\n <i class=\"pi pi-arrow-left rtsee-presentation-header-active-story-info-close-icon\"></i>\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-details\">\n <p-chip [label]=\"presentation.activeStory.name\"\n [image]=\"presentation.activeStory.imageUrl\"\n class=\"rtsee-presentation-header-active-story-name\"\n alt=\"Story image\" />\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-settings\"\n (click)=\"presentation.settings.expand()\"\n >\n <i class=\"pi pi-ellipsis-h rtsee-presentation-header-active-story-info-settings-icon\"></i>\n </div>\n </div>\n }\n @if (presentation.dashboard && !presentation.activeStory && !presentation.isDashboardOpen) {\n <p-button [label]=\"presentation.labels[RTSeeTextLabelKeys.DASHBOARD_BUTTON]\"\n (click)=\"presentation.toggleDashboardState()\"\n ></p-button>\n }\n</header>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: JoinCallComponent, selector: "rtsee-join-call", inputs: ["presentation", "room"] }] }); }
1615
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: PresentationHeaderComponent, isStandalone: true, selector: "rtsee-presentation-header", inputs: { presentation: "presentation" }, ngImport: i0, template: "<header class=\"rtsee-presentation-header\"\n [ngClass]=\"{\n 'rtsee-presentation-header-convertable': presentation.activeStory,\n 'rtsee-presentation-header-visible': presentation.activeStory?.headerVisible\n }\"\n>\n @if (!presentation.activeStory) {\n <div class=\"rtsee-presentations-header-title\">\n <div class=\"rtsee-presentations-header-title-overlay\"></div>\n <div class=\"rtsee-presentations-header-title-content\">\n <h1>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_TITLE_LABEL]}}</h1>\n <p class=\"rtsee-presentations-header-title-subtitle\">\n <span>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_SUBTITLE_LABEL]}}</span>\n </p>\n </div>\n </div>\n }\n\n\n @if (presentation.activeRoom && !presentation.activeStory) {\n <div class=\"rtsee-presentation-room-block\">\n <rtsee-join-call [room]=\"presentation.activeRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n </div>\n }\n\n @if (presentation.activeStory) {\n <div class=\"rtsee-presentation-header-active-story-info\">\n <div class=\"rtsee-presentation-header-active-story-info-close\"\n (click)=\"presentation.disableActiveStory()\"\n >\n <i class=\"pi pi-arrow-left rtsee-presentation-header-active-story-info-close-icon\"></i>\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-details\">\n <p-chip [label]=\"presentation.activeStory.name\"\n [image]=\"presentation.activeStory.imageUrl || undefined\"\n class=\"rtsee-presentation-header-active-story-name\"\n alt=\"Story image\" />\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-settings\"\n (click)=\"presentation.settings.expand()\"\n >\n <i class=\"pi pi-ellipsis-h rtsee-presentation-header-active-story-info-settings-icon\"></i>\n </div>\n </div>\n }\n @if (presentation.dashboard && !presentation.activeStory && !presentation.isDashboardOpen) {\n <p-button [label]=\"presentation.labels[RTSeeTextLabelKeys.DASHBOARD_BUTTON]\"\n (click)=\"presentation.toggleDashboardState()\"\n ></p-button>\n }\n</header>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: JoinCallComponent, selector: "rtsee-join-call", inputs: ["presentation", "room"] }] }); }
1629
1616
  }
1630
1617
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PresentationHeaderComponent, decorators: [{
1631
1618
  type: Component,
1632
- args: [{ selector: 'rtsee-presentation-header', imports: [
1633
- Button,
1634
- NgClass,
1635
- Chip,
1636
- JoinCallComponent
1637
- ], standalone: true, template: "<header class=\"rtsee-presentation-header\"\n [ngClass]=\"{\n 'rtsee-presentation-header-convertable': presentation.activeStory,\n 'rtsee-presentation-header-visible': presentation.activeStory?.headerVisible\n }\"\n>\n @if (!presentation.activeStory) {\n <div class=\"rtsee-presentations-header-title\">\n <div class=\"rtsee-presentations-header-title-overlay\"></div>\n <div class=\"rtsee-presentations-header-title-content\">\n <h1>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_TITLE_LABEL]}}</h1>\n <p class=\"rtsee-presentations-header-title-subtitle\">\n <span>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_SUBTITLE_LABEL]}}</span>\n </p>\n </div>\n </div>\n }\n\n\n @if (presentation.activeRoom && !presentation.activeStory) {\n <div class=\"rtsee-presentation-room-block\">\n <rtsee-join-call [room]=\"presentation.activeRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n </div>\n }\n\n @if (presentation.activeStory) {\n <div class=\"rtsee-presentation-header-active-story-info\">\n <div class=\"rtsee-presentation-header-active-story-info-close\"\n (click)=\"presentation.disableActiveStory()\"\n >\n <i class=\"pi pi-arrow-left rtsee-presentation-header-active-story-info-close-icon\"></i>\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-details\">\n <p-chip [label]=\"presentation.activeStory.name\"\n [image]=\"presentation.activeStory.imageUrl\"\n class=\"rtsee-presentation-header-active-story-name\"\n alt=\"Story image\" />\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-settings\"\n (click)=\"presentation.settings.expand()\"\n >\n <i class=\"pi pi-ellipsis-h rtsee-presentation-header-active-story-info-settings-icon\"></i>\n </div>\n </div>\n }\n @if (presentation.dashboard && !presentation.activeStory && !presentation.isDashboardOpen) {\n <p-button [label]=\"presentation.labels[RTSeeTextLabelKeys.DASHBOARD_BUTTON]\"\n (click)=\"presentation.toggleDashboardState()\"\n ></p-button>\n }\n</header>\n" }]
1619
+ args: [{ selector: 'rtsee-presentation-header', imports: [Button, NgClass, Chip, JoinCallComponent], standalone: true, template: "<header class=\"rtsee-presentation-header\"\n [ngClass]=\"{\n 'rtsee-presentation-header-convertable': presentation.activeStory,\n 'rtsee-presentation-header-visible': presentation.activeStory?.headerVisible\n }\"\n>\n @if (!presentation.activeStory) {\n <div class=\"rtsee-presentations-header-title\">\n <div class=\"rtsee-presentations-header-title-overlay\"></div>\n <div class=\"rtsee-presentations-header-title-content\">\n <h1>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_TITLE_LABEL]}}</h1>\n <p class=\"rtsee-presentations-header-title-subtitle\">\n <span>{{presentation.labels[RTSeeTextLabelKeys.PRESENTATION_SUBTITLE_LABEL]}}</span>\n </p>\n </div>\n </div>\n }\n\n\n @if (presentation.activeRoom && !presentation.activeStory) {\n <div class=\"rtsee-presentation-room-block\">\n <rtsee-join-call [room]=\"presentation.activeRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n </div>\n }\n\n @if (presentation.activeStory) {\n <div class=\"rtsee-presentation-header-active-story-info\">\n <div class=\"rtsee-presentation-header-active-story-info-close\"\n (click)=\"presentation.disableActiveStory()\"\n >\n <i class=\"pi pi-arrow-left rtsee-presentation-header-active-story-info-close-icon\"></i>\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-details\">\n <p-chip [label]=\"presentation.activeStory.name\"\n [image]=\"presentation.activeStory.imageUrl || undefined\"\n class=\"rtsee-presentation-header-active-story-name\"\n alt=\"Story image\" />\n </div>\n <div class=\"rtsee-presentation-header-active-story-info-settings\"\n (click)=\"presentation.settings.expand()\"\n >\n <i class=\"pi pi-ellipsis-h rtsee-presentation-header-active-story-info-settings-icon\"></i>\n </div>\n </div>\n }\n @if (presentation.dashboard && !presentation.activeStory && !presentation.isDashboardOpen) {\n <p-button [label]=\"presentation.labels[RTSeeTextLabelKeys.DASHBOARD_BUTTON]\"\n (click)=\"presentation.toggleDashboardState()\"\n ></p-button>\n }\n</header>\n" }]
1638
1620
  }], propDecorators: { presentation: [{
1639
1621
  type: Input
1640
1622
  }] } });
1641
1623
 
1642
- class RatingComponent {
1643
- constructor() {
1644
- this.stars = [];
1645
- }
1646
- ngOnInit() {
1647
- this.initStars();
1648
- }
1649
- initStars() {
1650
- const stars = [];
1651
- const full = Math.floor(this.rating.value);
1652
- const hasHalf = this.rating.value - full >= 0.25;
1653
- for (let i = 0; i < full; i++) {
1654
- stars.push('full');
1655
- }
1656
- if (hasHalf) {
1657
- stars.push('half');
1658
- }
1659
- while (stars.length < this.rating.max) {
1660
- stars.push('empty');
1661
- }
1662
- this.stars = stars;
1663
- }
1664
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1665
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RatingComponent, isStandalone: true, selector: "rtsee-rating", inputs: { rating: "rating" }, ngImport: i0, template: "<div class=\"rtsee-rating\">\n @for (star of stars; track $index) {\n <span class=\"rtsee-rating-star\" [ngClass]=\"{\n 'rtsee-rating-star-full': star === 'full',\n 'rtsee-rating-star-half': star === 'half',\n 'rtsee-rating-star-empty': star === 'empty',\n }\">\u2605</span>\n }\n <span class=\"rtsee-rating-number\">{{ rating.value }}</span>\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1666
- }
1667
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingComponent, decorators: [{
1668
- type: Component,
1669
- args: [{ selector: 'rtsee-rating', imports: [
1670
- NgClass
1671
- ], template: "<div class=\"rtsee-rating\">\n @for (star of stars; track $index) {\n <span class=\"rtsee-rating-star\" [ngClass]=\"{\n 'rtsee-rating-star-full': star === 'full',\n 'rtsee-rating-star-half': star === 'half',\n 'rtsee-rating-star-empty': star === 'empty',\n }\">\u2605</span>\n }\n <span class=\"rtsee-rating-number\">{{ rating.value }}</span>\n</div>\n" }]
1672
- }], propDecorators: { rating: [{
1673
- type: Input
1674
- }] } });
1675
-
1676
1624
  class StoryThumbnailComponent {
1677
1625
  constructor() {
1678
1626
  this.progressPercent = 0;
@@ -1680,18 +1628,15 @@ class StoryThumbnailComponent {
1680
1628
  }
1681
1629
  ngOnInit() {
1682
1630
  if (this.story.preselectedSlideNumber) {
1683
- this.progressPercent = Math
1684
- .round((this.story.preselectedSlideNumber / this.story.totalSlides) * 100);
1631
+ this.progressPercent = Math.round((this.story.preselectedSlideNumber / this.story.totalSlides) * 100);
1685
1632
  }
1686
1633
  }
1687
1634
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: StoryThumbnailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1688
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: StoryThumbnailComponent, isStandalone: true, selector: "rtsee-story-thumbnail", inputs: { story: "story" }, ngImport: i0, template: "<div class=\"rtsee-story-thumbnail\">\n <div class=\"rtsee-story-thumbnail-image-container\">\n <div class=\"rtsee-story-thumbnail-image\">\n <img [src]=\"story.imageUrl\"\n [alt]=\"story.name\"\n class=\"rtsee-story-thumbnail-image\"\n />\n </div>\n @if (story.preselectedSlideNumber) {\n <div class=\"rtsee-story-thumbnail-progress-bar-container\">\n <div class=\"rtsee-story-thumbnail-progress-bar\">\n <div class=\"rtsee-story-thumbnail-progress-bar-inner\"\n [style.width]=\"progressPercent + '%'\"\n ></div>\n </div>\n </div>\n }\n </div>\n <div class=\"rtsee-story-thumbnail-body-container\">\n <h4 class=\"rtsee-story-thumbnail-title\">{{story.name}}</h4>\n <div class=\"rtsee-story-thumbnail-body-meta\">\n <rtsee-rating [rating]=\"{max: 5, value: 3.5}\"></rtsee-rating>\n @if (story.averageReadTime) {\n <span class=\"rtsee-story-thumbnail-time-container\">\n <span class=\"rtsee-story-thumbnail-info-time-icon material-icons-outlined\">schedule</span>\n <span class=\"rtsee-story-thumbnail-info-read-time\">{{ Math.ceil(story.averageReadTime / 60) }} \u0445\u0432</span>\n </span>\n <span class=\"rtsee-story-thumbnail-label-container\">{{\"7\"}}+</span>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: RatingComponent, selector: "rtsee-rating", inputs: ["rating"] }] }); }
1635
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: StoryThumbnailComponent, isStandalone: true, selector: "rtsee-story-thumbnail", inputs: { story: "story" }, ngImport: i0, template: "<div class=\"rtsee-story-thumbnail\">\n <div class=\"rtsee-story-thumbnail-image-container\">\n <div class=\"rtsee-story-thumbnail-image\">\n <img [src]=\"story.imageUrl\"\n [alt]=\"story.name\"\n class=\"rtsee-story-thumbnail-image\"\n />\n </div>\n @if (story.preselectedSlideNumber) {\n <div class=\"rtsee-story-thumbnail-progress-bar-container\">\n <div class=\"rtsee-story-thumbnail-progress-bar\">\n <div class=\"rtsee-story-thumbnail-progress-bar-inner\"\n [style.width]=\"progressPercent + '%'\"\n ></div>\n </div>\n </div>\n }\n </div>\n <div class=\"rtsee-story-thumbnail-body-container\">\n <h4 class=\"rtsee-story-thumbnail-title\">{{story.name}}</h4>\n <div class=\"rtsee-story-thumbnail-body-meta\">\n @if (story.rating) {\n <rtsee-rating [rate]=\"{maxValue: 5, value: story.rating}\"></rtsee-rating>\n }\n @if (story.averageReadTime) {\n <span class=\"rtsee-story-thumbnail-time-container\">\n <span class=\"rtsee-story-thumbnail-info-time-icon material-icons-outlined\">schedule</span>\n <span class=\"rtsee-story-thumbnail-info-read-time\">{{ Math.ceil(story.averageReadTime / 60) }} \u0445\u0432</span>\n </span>\n <span class=\"rtsee-story-thumbnail-label-container\">{{\"7\"}}+</span>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: RatingComponent, selector: "rtsee-rating", inputs: ["config", "rate"] }] }); }
1689
1636
  }
1690
1637
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: StoryThumbnailComponent, decorators: [{
1691
1638
  type: Component,
1692
- args: [{ selector: 'rtsee-story-thumbnail', imports: [
1693
- RatingComponent
1694
- ], standalone: true, template: "<div class=\"rtsee-story-thumbnail\">\n <div class=\"rtsee-story-thumbnail-image-container\">\n <div class=\"rtsee-story-thumbnail-image\">\n <img [src]=\"story.imageUrl\"\n [alt]=\"story.name\"\n class=\"rtsee-story-thumbnail-image\"\n />\n </div>\n @if (story.preselectedSlideNumber) {\n <div class=\"rtsee-story-thumbnail-progress-bar-container\">\n <div class=\"rtsee-story-thumbnail-progress-bar\">\n <div class=\"rtsee-story-thumbnail-progress-bar-inner\"\n [style.width]=\"progressPercent + '%'\"\n ></div>\n </div>\n </div>\n }\n </div>\n <div class=\"rtsee-story-thumbnail-body-container\">\n <h4 class=\"rtsee-story-thumbnail-title\">{{story.name}}</h4>\n <div class=\"rtsee-story-thumbnail-body-meta\">\n <rtsee-rating [rating]=\"{max: 5, value: 3.5}\"></rtsee-rating>\n @if (story.averageReadTime) {\n <span class=\"rtsee-story-thumbnail-time-container\">\n <span class=\"rtsee-story-thumbnail-info-time-icon material-icons-outlined\">schedule</span>\n <span class=\"rtsee-story-thumbnail-info-read-time\">{{ Math.ceil(story.averageReadTime / 60) }} \u0445\u0432</span>\n </span>\n <span class=\"rtsee-story-thumbnail-label-container\">{{\"7\"}}+</span>\n }\n </div>\n </div>\n</div>\n" }]
1639
+ args: [{ selector: 'rtsee-story-thumbnail', imports: [RatingComponent], standalone: true, template: "<div class=\"rtsee-story-thumbnail\">\n <div class=\"rtsee-story-thumbnail-image-container\">\n <div class=\"rtsee-story-thumbnail-image\">\n <img [src]=\"story.imageUrl\"\n [alt]=\"story.name\"\n class=\"rtsee-story-thumbnail-image\"\n />\n </div>\n @if (story.preselectedSlideNumber) {\n <div class=\"rtsee-story-thumbnail-progress-bar-container\">\n <div class=\"rtsee-story-thumbnail-progress-bar\">\n <div class=\"rtsee-story-thumbnail-progress-bar-inner\"\n [style.width]=\"progressPercent + '%'\"\n ></div>\n </div>\n </div>\n }\n </div>\n <div class=\"rtsee-story-thumbnail-body-container\">\n <h4 class=\"rtsee-story-thumbnail-title\">{{story.name}}</h4>\n <div class=\"rtsee-story-thumbnail-body-meta\">\n @if (story.rating) {\n <rtsee-rating [rate]=\"{maxValue: 5, value: story.rating}\"></rtsee-rating>\n }\n @if (story.averageReadTime) {\n <span class=\"rtsee-story-thumbnail-time-container\">\n <span class=\"rtsee-story-thumbnail-info-time-icon material-icons-outlined\">schedule</span>\n <span class=\"rtsee-story-thumbnail-info-read-time\">{{ Math.ceil(story.averageReadTime / 60) }} \u0445\u0432</span>\n </span>\n <span class=\"rtsee-story-thumbnail-label-container\">{{\"7\"}}+</span>\n }\n </div>\n </div>\n</div>\n" }]
1695
1640
  }], propDecorators: { story: [{
1696
1641
  type: Input
1697
1642
  }] } });
@@ -1712,8 +1657,7 @@ class SlideComponent {
1712
1657
  }
1713
1658
  }
1714
1659
  ngAfterViewInit() {
1715
- const parentSlideEl = this.elementRef.nativeElement
1716
- .closest('.story-player-slide-container');
1660
+ const parentSlideEl = this.elementRef.nativeElement.closest('.story-player-slide-container');
1717
1661
  if (!parentSlideEl) {
1718
1662
  return;
1719
1663
  }
@@ -1730,7 +1674,7 @@ class SlideComponent {
1730
1674
  }
1731
1675
  handleScroll(position, scrollHeight, clientHeight) {
1732
1676
  const BUFFER = 50;
1733
- const isAtBottom = Math.abs((scrollHeight - position) - clientHeight) < 10;
1677
+ const isAtBottom = Math.abs(scrollHeight - position - clientHeight) < 10;
1734
1678
  if (position > this.lastScrollPosition + BUFFER) {
1735
1679
  if (!this.scrollingDown) {
1736
1680
  this.scrollingDown = true;
@@ -1757,12 +1701,7 @@ class SlideComponent {
1757
1701
  }
1758
1702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SlideComponent, decorators: [{
1759
1703
  type: Component,
1760
- args: [{ selector: 'rtsee-slide', imports: [
1761
- NgStyle,
1762
- WidgetDirective,
1763
- Button,
1764
- NgClass
1765
- ], standalone: true, template: "<div class=\"rtsee-presentation-slide\" (scroll)=\"onScroll($event.target)\">\n @if (slide.widget) {\n <ng-template widgetHost></ng-template>\n }\n <div class=\"rtsee-presentation-slide-default\">\n @if (slide.imageUrl) {\n <div class=\"rtsee-presentation-slide-image-container\"\n [ngStyle]=\"{'background-image': 'url(' + slide.imageUrl + ')'}\"\n >\n </div>\n }\n <div class=\"rtsee-presentation-slide-text\">\n <p [style.font-size]=\"settings.fontSize + 'rem'\">{{slide.text}}</p>\n </div>\n <div class=\"rtsee-presentation-slide-controls\"\n [ngClass]=\"{'rtsee-presentation-slide-controls-hidden': hideRewindControls}\"\n >\n @if (story.activeSlideNumber !== 1) {\n <p-button class=\"slide-navigation-btn navigation-prev\"\n label=\"Previous Page\"\n icon=\"pi pi-arrow-left\"\n [severity]=\"'secondary'\"\n [iconPos]=\"'left'\"\n (click)=\"slideRewindClicked(false)\"\n >\n </p-button>\n }\n @if (story.activeSlideNumber !== this.story.totalSlides) {\n <p-button class=\"slide-navigation-btn navigation-next\"\n label=\"Next Page\"\n icon=\"pi pi-arrow-right\"\n [iconPos]=\"'right'\"\n (click)=\"slideRewindClicked(true)\"\n >\n </p-button>\n }\n </div>\n </div>\n</div>\n" }]
1704
+ args: [{ selector: 'rtsee-slide', imports: [NgStyle, WidgetDirective, Button, NgClass], standalone: true, template: "<div class=\"rtsee-presentation-slide\" (scroll)=\"onScroll($event.target)\">\n @if (slide.widget) {\n <ng-template widgetHost></ng-template>\n }\n <div class=\"rtsee-presentation-slide-default\">\n @if (slide.imageUrl) {\n <div class=\"rtsee-presentation-slide-image-container\"\n [ngStyle]=\"{'background-image': 'url(' + slide.imageUrl + ')'}\"\n >\n </div>\n }\n <div class=\"rtsee-presentation-slide-text\">\n <p [style.font-size]=\"settings.fontSize + 'rem'\">{{slide.text}}</p>\n </div>\n <div class=\"rtsee-presentation-slide-controls\"\n [ngClass]=\"{'rtsee-presentation-slide-controls-hidden': hideRewindControls}\"\n >\n @if (story.activeSlideNumber !== 1) {\n <p-button class=\"slide-navigation-btn navigation-prev\"\n label=\"Previous Page\"\n icon=\"pi pi-arrow-left\"\n [severity]=\"'secondary'\"\n [iconPos]=\"'left'\"\n (click)=\"slideRewindClicked(false)\"\n >\n </p-button>\n }\n @if (story.activeSlideNumber !== this.story.totalSlides) {\n <p-button class=\"slide-navigation-btn navigation-next\"\n label=\"Next Page\"\n icon=\"pi pi-arrow-right\"\n [iconPos]=\"'right'\"\n (click)=\"slideRewindClicked(true)\"\n >\n </p-button>\n }\n </div>\n </div>\n</div>\n" }]
1766
1705
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { story: [{
1767
1706
  type: Input
1768
1707
  }], slide: [{
@@ -1781,7 +1720,7 @@ class StoryPlayerComponent {
1781
1720
  ngAfterViewInit() {
1782
1721
  const swiper = new Swiper(this.swiperEl.nativeElement, {
1783
1722
  effect: 'cards',
1784
- grabCursor: true
1723
+ grabCursor: true,
1785
1724
  });
1786
1725
  this.story.initSwiper(swiper);
1787
1726
  }
@@ -1790,10 +1729,7 @@ class StoryPlayerComponent {
1790
1729
  }
1791
1730
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: StoryPlayerComponent, decorators: [{
1792
1731
  type: Component,
1793
- args: [{ selector: 'rtsee-story-player', imports: [
1794
- NgClass,
1795
- SlideComponent
1796
- ], standalone: true, template: "<div class=\"rtsee-story-player\">\n <div class=\"rtsee-story-player-slider swiper\" #swiperContainer>\n <div class=\"rtsee-story-player-slider-inner swiper-wrapper\">\n @for (slide of story.slides; track slide.id) {\n <div class=\"story-player-slide-container swiper-slide\"\n [ngClass]=\"{'story-player-slide-active': slide.isActive}\"\n >\n <rtsee-slide [slide]=\"slide\"\n [story]=\"story\"\n [settings]=\"settings\"\n ></rtsee-slide>\n </div>\n }\n </div>\n </div>\n</div>\n" }]
1732
+ args: [{ selector: 'rtsee-story-player', imports: [NgClass, SlideComponent], standalone: true, template: "<div class=\"rtsee-story-player\">\n <div class=\"rtsee-story-player-slider swiper\" #swiperContainer>\n <div class=\"rtsee-story-player-slider-inner swiper-wrapper\">\n @for (slide of story.slides; track slide.id) {\n <div class=\"story-player-slide-container swiper-slide\"\n [ngClass]=\"{'story-player-slide-active': slide.isActive}\"\n >\n <rtsee-slide [slide]=\"slide\"\n [story]=\"story\"\n [settings]=\"settings\"\n ></rtsee-slide>\n </div>\n }\n </div>\n </div>\n</div>\n" }]
1797
1733
  }], ctorParameters: () => [], propDecorators: { story: [{
1798
1734
  type: Input
1799
1735
  }], settings: [{
@@ -1803,33 +1739,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1803
1739
  args: ['swiperContainer']
1804
1740
  }] } });
1805
1741
 
1806
- class AutocompleteComponent {
1807
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1808
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AutocompleteComponent, isStandalone: true, selector: "rtsee-autocomplete", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"rtsee-autocomplete rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-autoComplete [(ngModel)]=\"config.selectedSuggestions\"\n [inputId]=\"config.inputId\"\n [multiple]=\"config.allowMultipleSelections\"\n [fluid]=\"config.fluid\"\n [suggestions]=\"config.visibleSuggestions\"\n [optionLabel]=\"config.suggestionLabel\"\n (completeMethod)=\"config.onQueryChanged($event)\"\n (onSelect)=\"config.onSelect($event)\"\n ></p-autoComplete>\n <label [for]=\"config.inputId\">{{config.inputName}}</label>\n </p-floatlabel>\n </p-inputgroup>\n</div>\n", dependencies: [{ kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i1$3.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "minQueryLength", "delay", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "addOnTab", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "addOnBlur", "separator", "appendTo"], outputs: ["completeMethod", "onSelect", "onUnselect", "onAdd", "onFocus", "onBlur", "onDropdownClick", "onClear", "onInputKeydown", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1809
- }
1810
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AutocompleteComponent, decorators: [{
1811
- type: Component,
1812
- args: [{ selector: 'rtsee-autocomplete', imports: [
1813
- AutoCompleteModule,
1814
- FloatLabel,
1815
- InputGroup,
1816
- FormsModule
1817
- ], template: "<div class=\"rtsee-autocomplete rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-autoComplete [(ngModel)]=\"config.selectedSuggestions\"\n [inputId]=\"config.inputId\"\n [multiple]=\"config.allowMultipleSelections\"\n [fluid]=\"config.fluid\"\n [suggestions]=\"config.visibleSuggestions\"\n [optionLabel]=\"config.suggestionLabel\"\n (completeMethod)=\"config.onQueryChanged($event)\"\n (onSelect)=\"config.onSelect($event)\"\n ></p-autoComplete>\n <label [for]=\"config.inputId\">{{config.inputName}}</label>\n </p-floatlabel>\n </p-inputgroup>\n</div>\n" }]
1818
- }], propDecorators: { config: [{
1819
- type: Input
1820
- }] } });
1821
-
1822
1742
  class ManageSlidesComponent {
1823
1743
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageSlidesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1824
1744
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: ManageSlidesComponent, isStandalone: true, selector: "rtsee-manage-slides", inputs: { manageSlides: "manageSlides" }, ngImport: i0, template: "<div class=\"rtsee-presentation-manage-slides\">\n <div class=\"rtsee-presentation-manage-slides-header\">\n <p-button (click)=\"manageSlides.selectNewSlide()\"\n label=\"Create A New Slide\"\n ></p-button>\n </div>\n <div class=\"rtsee-presentation-manage-slides-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageSlides.slides\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n scrollHeight=\"40rem\"\n controlsPosition=\"right\"\n (onReorder)=\"manageSlides.onReorder($event)\"\n [disabled]=\"manageSlides.loadInProgress\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <div class=\"rtsee-presentation-manage-slides-list-item rtsee-ordered-list-item\">\n <img\n [src]=\"option.imageUrl\"\n [alt]=\"'slide_image'\"\n [style.width]=\"'60px'\"\n class=\"rtsee-presentation-manage-slides-list-item-image rtsee-ordered-list-item-image\"\n />\n <div class=\"rtsee-presentation-manage-slides-list-item-info rtsee-ordered-list-item-info\">\n <span [ngClass]=\"{\n 'text-sm': true,\n 'text-surface-500': !selected,\n 'dark:text-surface-400': !selected,\n 'text-inherit': selected,\n }\"\n class=\"rtsee-ordered-list-item-info-label\"\n >{{ option.slideNumber }}</span>\n <div class=\"rtsee-ordered-list-item-info-buttons\">\n <p-button label=\"Edit\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageSlides.selectSlide(option.slideNumber)\"\n ></p-button>\n <p-button label=\"Delete\"\n severity=\"warn\"\n class=\"rtsee-ordered-list-item-info-button\"\n ></p-button>\n </div>\n </div>\n </div>\n </ng-template>\n </p-orderList>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: OrderList, selector: "p-orderList, p-orderlist, p-order-list", inputs: ["header", "styleClass", "tabindex", "ariaLabel", "ariaLabelledBy", "listStyle", "responsive", "filterBy", "filterPlaceholder", "filterLocale", "metaKeySelection", "dragdrop", "controlsPosition", "ariaFilterLabel", "filterMatchMode", "breakpoint", "stripedRows", "disabled", "trackBy", "scrollHeight", "autoOptionFocus", "dataKey", "selection", "value", "buttonProps", "moveUpButtonProps", "moveTopButtonProps", "moveDownButtonProps", "moveBottomButtonProps"], outputs: ["selectionChange", "onReorder", "onSelectionChange", "onFilterEvent", "onFocus", "onBlur"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1825
1745
  }
1826
1746
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageSlidesComponent, decorators: [{
1827
1747
  type: Component,
1828
- args: [{ selector: 'rtsee-manage-slides', imports: [
1829
- OrderList,
1830
- Button,
1831
- NgClass
1832
- ], template: "<div class=\"rtsee-presentation-manage-slides\">\n <div class=\"rtsee-presentation-manage-slides-header\">\n <p-button (click)=\"manageSlides.selectNewSlide()\"\n label=\"Create A New Slide\"\n ></p-button>\n </div>\n <div class=\"rtsee-presentation-manage-slides-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageSlides.slides\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n scrollHeight=\"40rem\"\n controlsPosition=\"right\"\n (onReorder)=\"manageSlides.onReorder($event)\"\n [disabled]=\"manageSlides.loadInProgress\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <div class=\"rtsee-presentation-manage-slides-list-item rtsee-ordered-list-item\">\n <img\n [src]=\"option.imageUrl\"\n [alt]=\"'slide_image'\"\n [style.width]=\"'60px'\"\n class=\"rtsee-presentation-manage-slides-list-item-image rtsee-ordered-list-item-image\"\n />\n <div class=\"rtsee-presentation-manage-slides-list-item-info rtsee-ordered-list-item-info\">\n <span [ngClass]=\"{\n 'text-sm': true,\n 'text-surface-500': !selected,\n 'dark:text-surface-400': !selected,\n 'text-inherit': selected,\n }\"\n class=\"rtsee-ordered-list-item-info-label\"\n >{{ option.slideNumber }}</span>\n <div class=\"rtsee-ordered-list-item-info-buttons\">\n <p-button label=\"Edit\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageSlides.selectSlide(option.slideNumber)\"\n ></p-button>\n <p-button label=\"Delete\"\n severity=\"warn\"\n class=\"rtsee-ordered-list-item-info-button\"\n ></p-button>\n </div>\n </div>\n </div>\n </ng-template>\n </p-orderList>\n </div>\n</div>\n" }]
1748
+ args: [{ selector: 'rtsee-manage-slides', imports: [OrderList, Button, NgClass], template: "<div class=\"rtsee-presentation-manage-slides\">\n <div class=\"rtsee-presentation-manage-slides-header\">\n <p-button (click)=\"manageSlides.selectNewSlide()\"\n label=\"Create A New Slide\"\n ></p-button>\n </div>\n <div class=\"rtsee-presentation-manage-slides-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageSlides.slides\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n scrollHeight=\"40rem\"\n controlsPosition=\"right\"\n (onReorder)=\"manageSlides.onReorder($event)\"\n [disabled]=\"manageSlides.loadInProgress\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <div class=\"rtsee-presentation-manage-slides-list-item rtsee-ordered-list-item\">\n <img\n [src]=\"option.imageUrl\"\n [alt]=\"'slide_image'\"\n [style.width]=\"'60px'\"\n class=\"rtsee-presentation-manage-slides-list-item-image rtsee-ordered-list-item-image\"\n />\n <div class=\"rtsee-presentation-manage-slides-list-item-info rtsee-ordered-list-item-info\">\n <span [ngClass]=\"{\n 'text-sm': true,\n 'text-surface-500': !selected,\n 'dark:text-surface-400': !selected,\n 'text-inherit': selected,\n }\"\n class=\"rtsee-ordered-list-item-info-label\"\n >{{ option.slideNumber }}</span>\n <div class=\"rtsee-ordered-list-item-info-buttons\">\n <p-button label=\"Edit\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageSlides.selectSlide(option.slideNumber)\"\n ></p-button>\n <p-button label=\"Delete\"\n severity=\"warn\"\n class=\"rtsee-ordered-list-item-info-button\"\n ></p-button>\n </div>\n </div>\n </div>\n </ng-template>\n </p-orderList>\n </div>\n</div>\n" }]
1833
1749
  }], propDecorators: { manageSlides: [{
1834
1750
  type: Input
1835
1751
  }] } });
@@ -1842,9 +1758,9 @@ class ManageSlideComponent {
1842
1758
  validators: [
1843
1759
  Validators.required,
1844
1760
  Validators.minLength(3),
1845
- Validators.maxLength(131000)
1846
- ]
1847
- })
1761
+ Validators.maxLength(131000),
1762
+ ],
1763
+ }),
1848
1764
  });
1849
1765
  }
1850
1766
  ngOnInit() {
@@ -1876,200 +1792,384 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1876
1792
  InputGroup,
1877
1793
  Message,
1878
1794
  Textarea,
1879
- Button
1795
+ Button,
1880
1796
  ], template: "<div class=\"rtsee-presentation-manage-story-slide\">\n <div class=\"rtsee-manage-story-slide-info rtsee-form-container\">\n <div class=\"rtsee-manage-story-image\">\n <rtsee-image-uploader [imageUploader]=\"manageSlide.imageUploader\"\n ></rtsee-image-uploader>\n </div>\n\n <form class=\"rtsee-story-form rtsee-form\"\n [formGroup]=\"slideForm\"\n (ngSubmit)=\"submit()\"\n >\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"textField\"\n id=\"rtsee-story-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"textField.invalid && textField.touched\"\n ></textarea>\n <label for=\"rtsee-story-description-field\">Text</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (textField.hasError('required') && textField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageSlide.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageSlide.cancel()\"\n [disabled]=\"manageSlide.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
1881
1797
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageSlide: [{
1882
1798
  type: Input
1883
1799
  }] } });
1884
1800
 
1885
- class ManageStoryComponent {
1886
- constructor(formBuilder) {
1887
- this.formBuilder = formBuilder;
1888
- this.storyForm = this.formBuilder.group({
1889
- name: this.formBuilder.control('', {
1890
- validators: [
1891
- Validators.required,
1892
- Validators.minLength(3),
1893
- Validators.maxLength(131)
1894
- ]
1895
- }),
1896
- description: this.formBuilder.control('', {
1897
- validators: [
1898
- Validators.required,
1899
- Validators.minLength(6),
1900
- Validators.maxLength(244)
1901
- ]
1902
- }),
1903
- averageReadTime: this.formBuilder.control(0),
1904
- isPublished: this.formBuilder.control(false),
1905
- isDiscussable: this.formBuilder.control(false)
1906
- });
1907
- }
1908
- submit() {
1909
- if (this.storyForm.valid) {
1910
- void this.manageStory.save({
1911
- name: this.nameField.value,
1912
- description: this.descriptionField.value,
1913
- averageReadTime: this.averageReadTimeField.value,
1914
- commentsEnabled: this.isDiscussableField.value,
1915
- isPublished: this.isPublishedField.value
1916
- });
1917
- }
1918
- else {
1919
- this.storyForm.markAsTouched(); // this does not work after switching to "nonNullable" form fields
1920
- }
1921
- }
1922
- ngOnInit() {
1923
- this.nameField.setValue(this.manageStory.story.name);
1924
- this.descriptionField.setValue(this.manageStory.story.description || '');
1925
- this.averageReadTimeField.setValue(this.manageStory.story.averageReadTime || 0);
1926
- this.isPublishedField.setValue(this.manageStory.story.isPublished || false);
1927
- this.isDiscussableField.setValue(this.manageStory.story.commentsEnabled || false);
1928
- }
1929
- get nameField() {
1930
- return this.storyForm.get('name');
1931
- }
1932
- get descriptionField() {
1933
- return this.storyForm.get('description');
1934
- }
1935
- get averageReadTimeField() {
1936
- return this.storyForm.get('averageReadTime');
1937
- }
1938
- get isPublishedField() {
1939
- return this.storyForm.get('isPublished');
1940
- }
1941
- get isDiscussableField() {
1942
- return this.storyForm.get('isDiscussable');
1943
- }
1944
- disableFormFields() {
1945
- this.nameField.disable();
1946
- this.descriptionField.disable();
1947
- this.averageReadTimeField.disable();
1801
+ class TextFieldComponent {
1802
+ constructor() {
1803
+ this.fieldChanged = new EventEmitter();
1948
1804
  }
1949
- enableFormFields() {
1950
- this.nameField.disable();
1951
- this.descriptionField.disable();
1952
- this.averageReadTimeField.disable();
1805
+ onModelChange() {
1806
+ this.field.digest();
1807
+ this.fieldChanged.emit();
1953
1808
  }
1954
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoryComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
1955
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageStoryComponent, isStandalone: true, selector: "rtsee-manage-story", inputs: { manageStory: "manageStory" }, ngImport: i0, template: "<div class=\"rtsee-manage-story\">\n @if (!manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-info rtsee-form-container\">\n <div class=\"rtsee-manage-story-image\">\n <rtsee-image-uploader [imageUploader]=\"manageStory.imageUploader\"\n ></rtsee-image-uploader>\n </div>\n <form class=\"rtsee-story-form rtsee-form\"\n [formGroup]=\"storyForm\"\n (ngSubmit)=\"submit()\"\n >\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"sign-up-email\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <rtsee-autocomplete [config]=\"manageStory.categoriesMultiselect\"></rtsee-autocomplete>\n <rtsee-autocomplete [config]=\"manageStory.labelsMultiselect\"></rtsee-autocomplete>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-input-number [formControl]=\"averageReadTimeField\"\n id=\"rtsee-story-average-read-time\"\n mode=\"decimal\"\n [min]=\"2\"\n [max]=\"10000\"\n />\n <label for=\"rtsee-story-average-read-time\">Average Read Time</label>\n </p-floatlabel>\n </p-inputgroup>\n <div class=\"rtsee-form-field-container\">\n <p>Published</p>\n <p-toggleswitch name=\"publishing\" formControlName=\"isPublished\"/>\n </div>\n <div class=\"rtsee-form-field-container\">\n <p>Enable Comments</p>\n <p-toggleswitch name=\"publishing\" formControlName=\"isDiscussable\"/>\n </div>\n </div>\n <p-divider />\n <div class=\"rtsee-story-slides-wrapper\">\n <rtsee-manage-slides [manageSlides]=\"manageStory.manageSlides\"></rtsee-manage-slides>\n </div>\n <p-divider />\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageStory.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageStory.cancel()\"\n [disabled]=\"manageStory.saveInProgress\"\n />\n </form>\n </div>\n }\n @if (manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-slide-wrapper\">\n <rtsee-manage-slide [manageSlide]=\"manageStory.manageSlides.selectedSlide\"\n ></rtsee-manage-slide>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "component", type: InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "placeholder", "tabindex", "title", "ariaLabelledBy", "ariaDescribedBy", "ariaLabel", "ariaRequired", "autocomplete", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: RTSeeImageUploaderComponent, selector: "rtsee-image-uploader", inputs: ["imageUploader"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: AutocompleteComponent, selector: "rtsee-autocomplete", inputs: ["config"] }, { kind: "component", type: ManageSlidesComponent, selector: "rtsee-manage-slides", inputs: ["manageSlides"] }, { kind: "component", type: ManageSlideComponent, selector: "rtsee-manage-slide", inputs: ["manageSlide"] }, { kind: "component", type: Divider, selector: "p-divider", inputs: ["styleClass", "layout", "type", "align"] }, { kind: "component", type: ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["styleClass", "tabindex", "inputId", "readonly", "trueValue", "falseValue", "ariaLabel", "size", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }] }); }
1809
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TextFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1810
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: TextFieldComponent, isStandalone: true, selector: "rtsee-field-text", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input [id]=\"field.name\"\n class=\"rtsee-form-field\"\n pInputText\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [class.p-invalid]=\"!field.isValid && field.isDirty\"\n />\n <label [for]=\"field.name\">{{ field.name }}</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
1956
1811
  }
1957
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoryComponent, decorators: [{
1812
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TextFieldComponent, decorators: [{
1958
1813
  type: Component,
1959
- args: [{ selector: 'rtsee-manage-story', imports: [
1960
- FloatLabel,
1961
- FormsModule,
1962
- InputGroup,
1963
- InputText,
1964
- Message,
1965
- ReactiveFormsModule,
1966
- Textarea,
1967
- InputNumber,
1968
- RTSeeImageUploaderComponent,
1969
- Button,
1970
- AutocompleteComponent,
1971
- ManageSlidesComponent,
1972
- ManageSlideComponent,
1973
- Divider,
1974
- ToggleSwitch
1975
- ], template: "<div class=\"rtsee-manage-story\">\n @if (!manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-info rtsee-form-container\">\n <div class=\"rtsee-manage-story-image\">\n <rtsee-image-uploader [imageUploader]=\"manageStory.imageUploader\"\n ></rtsee-image-uploader>\n </div>\n <form class=\"rtsee-story-form rtsee-form\"\n [formGroup]=\"storyForm\"\n (ngSubmit)=\"submit()\"\n >\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"sign-up-email\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <rtsee-autocomplete [config]=\"manageStory.categoriesMultiselect\"></rtsee-autocomplete>\n <rtsee-autocomplete [config]=\"manageStory.labelsMultiselect\"></rtsee-autocomplete>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-input-number [formControl]=\"averageReadTimeField\"\n id=\"rtsee-story-average-read-time\"\n mode=\"decimal\"\n [min]=\"2\"\n [max]=\"10000\"\n />\n <label for=\"rtsee-story-average-read-time\">Average Read Time</label>\n </p-floatlabel>\n </p-inputgroup>\n <div class=\"rtsee-form-field-container\">\n <p>Published</p>\n <p-toggleswitch name=\"publishing\" formControlName=\"isPublished\"/>\n </div>\n <div class=\"rtsee-form-field-container\">\n <p>Enable Comments</p>\n <p-toggleswitch name=\"publishing\" formControlName=\"isDiscussable\"/>\n </div>\n </div>\n <p-divider />\n <div class=\"rtsee-story-slides-wrapper\">\n <rtsee-manage-slides [manageSlides]=\"manageStory.manageSlides\"></rtsee-manage-slides>\n </div>\n <p-divider />\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageStory.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageStory.cancel()\"\n [disabled]=\"manageStory.saveInProgress\"\n />\n </form>\n </div>\n }\n @if (manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-slide-wrapper\">\n <rtsee-manage-slide [manageSlide]=\"manageStory.manageSlides.selectedSlide\"\n ></rtsee-manage-slide>\n </div>\n }\n</div>\n" }]
1976
- }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageStory: [{
1814
+ args: [{ selector: "rtsee-field-text", standalone: true, imports: [FormsModule, InputText, InputGroup, FloatLabel, Message], template: "<div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input [id]=\"field.name\"\n class=\"rtsee-form-field\"\n pInputText\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [class.p-invalid]=\"!field.isValid && field.isDirty\"\n />\n <label [for]=\"field.name\">{{ field.name }}</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1815
+ }], propDecorators: { field: [{
1977
1816
  type: Input
1817
+ }], fieldChanged: [{
1818
+ type: Output
1978
1819
  }] } });
1979
1820
 
1980
- class ManageStoriesComponent {
1981
- ngOnInit() {
1982
- this.manageStories.init();
1821
+ class TextareaFieldComponent {
1822
+ constructor() {
1823
+ this.fieldChanged = new EventEmitter();
1983
1824
  }
1984
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1985
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageStoriesComponent, isStandalone: true, selector: "rtsee-manage-stories", inputs: { manageStories: "manageStories" }, ngImport: i0, template: "<div class=\"rtsee-manage-stories\">\n <div class=\"rtsee-manage-stories-header\">\n @if (!manageStories.selectedStory) {\n <p-button (click)=\"manageStories.selectNewStory()\"\n label=\"Create A New Story\"\n ></p-button>\n }\n </div>\n @if (manageStories.selectedStory) {\n <div class=\"rtsee-manage-story-container\">\n <rtsee-manage-story [manageStory]=\"manageStories.selectedStory\"\n ></rtsee-manage-story>\n </div>\n }\n @if (!manageStories.selectedStory) {\n <div class=\"rtsee-manage-stories-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageStories.stories\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n [scrollHeight]=\"'40rem'\"\n class=\"rtsee-ordered-list-inner\"\n (onReorder)=\"manageStories.onReorder()\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <div class=\"rtsee-presentation-manage-stories-list-item rtsee-ordered-list-item\">\n <img\n [src]=\"option.imageUrl\"\n [alt]=\"'slide_image'\"\n [style.width]=\"'60px'\"\n class=\"rtsee-presentation-manage-stories-list-item-image rtsee-ordered-list-item-image\"\n />\n <div class=\"rtsee-presentation-manage-stories-list-item-info rtsee-ordered-list-item-info\">\n <span [ngClass]=\"{\n 'text-sm': true,\n 'text-surface-500': !selected,\n 'dark:text-surface-400': !selected,\n 'text-inherit': selected,\n }\"\n >{{ option.name }}</span>\n <div class=\"rtsee-ordered-list-item-info-buttons\">\n <p-button label=\"Edit\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n <p-button label=\"Delete\"\n [severity]=\"'warn'\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n </div>\n </div>\n </div>\n </ng-template>\n </p-orderList>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: ManageStoryComponent, selector: "rtsee-manage-story", inputs: ["manageStory"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: OrderList, selector: "p-orderList, p-orderlist, p-order-list", inputs: ["header", "styleClass", "tabindex", "ariaLabel", "ariaLabelledBy", "listStyle", "responsive", "filterBy", "filterPlaceholder", "filterLocale", "metaKeySelection", "dragdrop", "controlsPosition", "ariaFilterLabel", "filterMatchMode", "breakpoint", "stripedRows", "disabled", "trackBy", "scrollHeight", "autoOptionFocus", "dataKey", "selection", "value", "buttonProps", "moveUpButtonProps", "moveTopButtonProps", "moveDownButtonProps", "moveBottomButtonProps"], outputs: ["selectionChange", "onReorder", "onSelectionChange", "onFilterEvent", "onFocus", "onBlur"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
1825
+ onModelChange() {
1826
+ this.field.digest();
1827
+ this.fieldChanged.emit();
1828
+ }
1829
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TextareaFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1830
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: TextareaFieldComponent, isStandalone: true, selector: "rtsee-field-textarea", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [id]=\"field.name\"\n class=\"rtsee-form-field\"\n pTextarea\n rows=\"3\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [class.p-invalid]=\"!field.isValid && field.isDirty\"\n ></textarea>\n <label [for]=\"field.name\">{{ field.name }}</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
1986
1831
  }
1987
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoriesComponent, decorators: [{
1832
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TextareaFieldComponent, decorators: [{
1988
1833
  type: Component,
1989
- args: [{ selector: 'rtsee-manage-stories', imports: [
1990
- ManageStoryComponent,
1991
- Button,
1992
- OrderList,
1993
- NgClass
1994
- ], template: "<div class=\"rtsee-manage-stories\">\n <div class=\"rtsee-manage-stories-header\">\n @if (!manageStories.selectedStory) {\n <p-button (click)=\"manageStories.selectNewStory()\"\n label=\"Create A New Story\"\n ></p-button>\n }\n </div>\n @if (manageStories.selectedStory) {\n <div class=\"rtsee-manage-story-container\">\n <rtsee-manage-story [manageStory]=\"manageStories.selectedStory\"\n ></rtsee-manage-story>\n </div>\n }\n @if (!manageStories.selectedStory) {\n <div class=\"rtsee-manage-stories-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageStories.stories\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n [scrollHeight]=\"'40rem'\"\n class=\"rtsee-ordered-list-inner\"\n (onReorder)=\"manageStories.onReorder()\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <div class=\"rtsee-presentation-manage-stories-list-item rtsee-ordered-list-item\">\n <img\n [src]=\"option.imageUrl\"\n [alt]=\"'slide_image'\"\n [style.width]=\"'60px'\"\n class=\"rtsee-presentation-manage-stories-list-item-image rtsee-ordered-list-item-image\"\n />\n <div class=\"rtsee-presentation-manage-stories-list-item-info rtsee-ordered-list-item-info\">\n <span [ngClass]=\"{\n 'text-sm': true,\n 'text-surface-500': !selected,\n 'dark:text-surface-400': !selected,\n 'text-inherit': selected,\n }\"\n >{{ option.name }}</span>\n <div class=\"rtsee-ordered-list-item-info-buttons\">\n <p-button label=\"Edit\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n <p-button label=\"Delete\"\n [severity]=\"'warn'\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n </div>\n </div>\n </div>\n </ng-template>\n </p-orderList>\n </div>\n }\n</div>\n" }]
1995
- }], propDecorators: { manageStories: [{
1834
+ args: [{ selector: "rtsee-field-textarea", standalone: true, imports: [FormsModule, Textarea, InputGroup, FloatLabel, Message], template: "<div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [id]=\"field.name\"\n class=\"rtsee-form-field\"\n pTextarea\n rows=\"3\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [class.p-invalid]=\"!field.isValid && field.isDirty\"\n ></textarea>\n <label [for]=\"field.name\">{{ field.name }}</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1835
+ }], propDecorators: { field: [{
1996
1836
  type: Input
1837
+ }], fieldChanged: [{
1838
+ type: Output
1997
1839
  }] } });
1998
1840
 
1999
- class ManageCategoryComponent {
2000
- constructor(formBuilder) {
2001
- this.formBuilder = formBuilder;
2002
- this.categoryForm = this.formBuilder.group({
2003
- name: this.formBuilder.control('', {
2004
- validators: [
2005
- Validators.required,
2006
- Validators.minLength(3),
2007
- Validators.maxLength(131)
2008
- ]
2009
- }),
2010
- description: this.formBuilder.control('', {
2011
- validators: [
2012
- Validators.required,
2013
- Validators.minLength(6),
2014
- Validators.maxLength(244)
2015
- ]
2016
- })
2017
- });
2018
- }
2019
- ngOnInit() {
2020
- this.nameField.setValue(this.manageCategory.category.name);
2021
- this.descriptionField.setValue(this.manageCategory.category.description || '');
2022
- }
2023
- submit() {
2024
- if (this.categoryForm.valid) {
2025
- void this.manageCategory.save({
2026
- name: this.nameField.value,
2027
- description: this.descriptionField.value
2028
- });
2029
- }
2030
- else {
2031
- this.categoryForm.markAsTouched(); // this does not work after switching to "nonNullable" form fields
2032
- }
2033
- }
2034
- get nameField() {
2035
- return this.categoryForm.get('name');
1841
+ class CheckboxFieldComponent {
1842
+ constructor() {
1843
+ this.fieldChanged = new EventEmitter();
2036
1844
  }
2037
- get descriptionField() {
2038
- return this.categoryForm.get('description');
1845
+ onModelChange() {
1846
+ this.field.digest();
1847
+ this.fieldChanged.emit();
2039
1848
  }
2040
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoryComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2041
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageCategoryComponent, isStandalone: true, selector: "rtsee-manage-category", inputs: { manageCategory: "manageCategory" }, ngImport: i0, template: "<div class=\"rtsee-manage-story-category\">\n <div class=\"rtsee-manage-category-info rtsee-form-container\">\n <form class=\"rtsee-story-form rtsee-form\"\n [formGroup]=\"categoryForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"sign-up-email\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageCategory.cancel()\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
1849
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: CheckboxFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1850
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: CheckboxFieldComponent, isStandalone: true, selector: "rtsee-field-checkbox", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container flex items-center\">\n <p-checkbox [inputId]=\"field.name\"\n [binary]=\"true\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n ></p-checkbox>\n <label [for]=\"field.name\" class=\"ml-2\">{{ field.name }}</label>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "inputStyle", "styleClass", "inputClass", "indeterminate", "formControl", "checkboxIcon", "readonly", "autofocus", "trueValue", "falseValue", "variant", "size"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
2042
1851
  }
2043
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoryComponent, decorators: [{
1852
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: CheckboxFieldComponent, decorators: [{
2044
1853
  type: Component,
2045
- args: [{ selector: 'rtsee-manage-category', imports: [
2046
- Button,
2047
- FloatLabel,
2048
- FormsModule,
2049
- InputGroup,
2050
- InputText,
2051
- Message,
2052
- Textarea,
2053
- ReactiveFormsModule
2054
- ], template: "<div class=\"rtsee-manage-story-category\">\n <div class=\"rtsee-manage-category-info rtsee-form-container\">\n <form class=\"rtsee-story-form rtsee-form\"\n [formGroup]=\"categoryForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"sign-up-email\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageCategory.cancel()\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
2055
- }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageCategory: [{
1854
+ args: [{ selector: "rtsee-field-checkbox", standalone: true, imports: [FormsModule, Checkbox, Message], template: "<div class=\"rtsee-form-field-container flex items-center\">\n <p-checkbox [inputId]=\"field.name\"\n [binary]=\"true\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n ></p-checkbox>\n <label [for]=\"field.name\" class=\"ml-2\">{{ field.name }}</label>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1855
+ }], propDecorators: { field: [{
2056
1856
  type: Input
1857
+ }], fieldChanged: [{
1858
+ type: Output
2057
1859
  }] } });
2058
1860
 
2059
- class ManageCategoriesComponent {
2060
- ngOnInit() {
2061
- this.manageCategories.init();
1861
+ class RadioFieldComponent {
1862
+ constructor() {
1863
+ this.fieldChanged = new EventEmitter();
2062
1864
  }
2063
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2064
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageCategoriesComponent, isStandalone: true, selector: "rtsee-manage-categories", inputs: { manageCategories: "manageCategories" }, ngImport: i0, template: "<div class=\"rtsee-manage-stories-categories\">\n <div class=\"rtsee-manage-stories-categories-header\">\n @if (!manageCategories.selectedCategory) {\n <p-button (click)=\"manageCategories.selectNewCategory()\"\n label=\"Create A New Category\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-categories-body\">\n @if (manageCategories.selectedCategory) {\n <rtsee-manage-category [manageCategory]=\"manageCategories.selectedCategory\"\n ></rtsee-manage-category>\n }\n @if (!manageCategories.selectedCategory) {\n @for (category of manageCategories.categories; track category.id) {\n <p (click)=\"manageCategories.selectCategory(category.id)\">{{category.name}}</p>\n }\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ManageCategoryComponent, selector: "rtsee-manage-category", inputs: ["manageCategory"] }] }); }
1865
+ onModelChange() {
1866
+ this.field.digest();
1867
+ this.fieldChanged.emit();
1868
+ }
1869
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RadioFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1870
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RadioFieldComponent, isStandalone: true, selector: "rtsee-field-radio", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container\">\n <div class=\"rtsee-radio-group-label font-semibold\">{{ field.name }}</div>\n @for (option of field.radioOptions; track option.value) {\n <div class=\"flex items-center mt-2\">\n <p-radioButton [name]=\"field.name\"\n [value]=\"option.value\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [inputId]=\"field.name + '_' + option.value\"\n ></p-radioButton>\n <label [for]=\"field.name + '_' + option.value\" class=\"ml-2\">{{ option.label }}</label>\n </div>\n }\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RadioButton, selector: "p-radioButton, p-radiobutton, p-radio-button", inputs: ["value", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "styleClass", "autofocus", "binary", "variant", "size"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
2065
1871
  }
2066
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoriesComponent, decorators: [{
1872
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RadioFieldComponent, decorators: [{
2067
1873
  type: Component,
2068
- args: [{ selector: 'rtsee-manage-categories', imports: [
2069
- Button,
2070
- ManageCategoryComponent
2071
- ], template: "<div class=\"rtsee-manage-stories-categories\">\n <div class=\"rtsee-manage-stories-categories-header\">\n @if (!manageCategories.selectedCategory) {\n <p-button (click)=\"manageCategories.selectNewCategory()\"\n label=\"Create A New Category\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-categories-body\">\n @if (manageCategories.selectedCategory) {\n <rtsee-manage-category [manageCategory]=\"manageCategories.selectedCategory\"\n ></rtsee-manage-category>\n }\n @if (!manageCategories.selectedCategory) {\n @for (category of manageCategories.categories; track category.id) {\n <p (click)=\"manageCategories.selectCategory(category.id)\">{{category.name}}</p>\n }\n }\n </div>\n</div>\n" }]
2072
- }], propDecorators: { manageCategories: [{
1874
+ args: [{ selector: "rtsee-field-radio", standalone: true, imports: [FormsModule, RadioButton, Message], template: "<div class=\"rtsee-form-field-container\">\n <div class=\"rtsee-radio-group-label font-semibold\">{{ field.name }}</div>\n @for (option of field.radioOptions; track option.value) {\n <div class=\"flex items-center mt-2\">\n <p-radioButton [name]=\"field.name\"\n [value]=\"option.value\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [inputId]=\"field.name + '_' + option.value\"\n ></p-radioButton>\n <label [for]=\"field.name + '_' + option.value\" class=\"ml-2\">{{ option.label }}</label>\n </div>\n }\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1875
+ }], propDecorators: { field: [{
1876
+ type: Input
1877
+ }], fieldChanged: [{
1878
+ type: Output
1879
+ }] } });
1880
+
1881
+ class NumberFieldComponent {
1882
+ constructor() {
1883
+ this.fieldChanged = new EventEmitter();
1884
+ }
1885
+ onModelChange() {
1886
+ this.field.digest();
1887
+ this.fieldChanged.emit();
1888
+ }
1889
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: NumberFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1890
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: NumberFieldComponent, isStandalone: true, selector: "rtsee-field-number", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-inputNumber [inputId]=\"field.name\"\n class=\"rtsee-form-field\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [class.p-invalid]=\"!field.isValid && field.isDirty\"\n ></p-inputNumber>\n <label [for]=\"field.name\">{{ field.name }}</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "placeholder", "tabindex", "title", "ariaLabelledBy", "ariaDescribedBy", "ariaLabel", "ariaRequired", "autocomplete", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
1891
+ }
1892
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: NumberFieldComponent, decorators: [{
1893
+ type: Component,
1894
+ args: [{ selector: "rtsee-field-number", standalone: true, imports: [FormsModule, InputNumber, InputGroup, FloatLabel, Message], template: "<div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-inputNumber [inputId]=\"field.name\"\n class=\"rtsee-form-field\"\n [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onModelChange()\"\n [class.p-invalid]=\"!field.isValid && field.isDirty\"\n ></p-inputNumber>\n <label [for]=\"field.name\">{{ field.name }}</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1895
+ }], propDecorators: { field: [{
1896
+ type: Input
1897
+ }], fieldChanged: [{
1898
+ type: Output
1899
+ }] } });
1900
+
1901
+ class AutocompleteComponent {
1902
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1903
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AutocompleteComponent, isStandalone: true, selector: "rtsee-autocomplete", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"rtsee-autocomplete rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-autoComplete [(ngModel)]=\"config.selectedSuggestions\"\n [inputId]=\"config.inputId\"\n [multiple]=\"true\"\n [fluid]=\"config.fluid\"\n [suggestions]=\"config.visibleSuggestions\"\n [optionLabel]=\"config.suggestionLabel\"\n (completeMethod)=\"config.onQueryChanged($event)\"\n (onSelect)=\"config.onSelect($event)\"\n ></p-autoComplete>\n <label [for]=\"config.inputId\">{{config.inputName}}</label>\n </p-floatlabel>\n </p-inputgroup>\n</div>\n", dependencies: [{ kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i1$3.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "minQueryLength", "delay", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "addOnTab", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "addOnBlur", "separator", "appendTo"], outputs: ["completeMethod", "onSelect", "onUnselect", "onAdd", "onFocus", "onBlur", "onDropdownClick", "onClear", "onInputKeydown", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1904
+ }
1905
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AutocompleteComponent, decorators: [{
1906
+ type: Component,
1907
+ args: [{ selector: 'rtsee-autocomplete', imports: [AutoCompleteModule, FloatLabel, InputGroup, FormsModule], template: "<div class=\"rtsee-autocomplete rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-autoComplete [(ngModel)]=\"config.selectedSuggestions\"\n [inputId]=\"config.inputId\"\n [multiple]=\"true\"\n [fluid]=\"config.fluid\"\n [suggestions]=\"config.visibleSuggestions\"\n [optionLabel]=\"config.suggestionLabel\"\n (completeMethod)=\"config.onQueryChanged($event)\"\n (onSelect)=\"config.onSelect($event)\"\n ></p-autoComplete>\n <label [for]=\"config.inputId\">{{config.inputName}}</label>\n </p-floatlabel>\n </p-inputgroup>\n</div>\n" }]
1908
+ }], propDecorators: { config: [{
1909
+ type: Input
1910
+ }] } });
1911
+
1912
+ class AutocompleteFieldComponent {
1913
+ constructor() {
1914
+ this.fieldChanged = new EventEmitter();
1915
+ }
1916
+ ngOnInit() {
1917
+ this.field.autocomplete.on("select", () => {
1918
+ this.onModelChange();
1919
+ });
1920
+ }
1921
+ onModelChange() {
1922
+ this.field.digest();
1923
+ this.fieldChanged.emit();
1924
+ }
1925
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AutocompleteFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1926
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: AutocompleteFieldComponent, isStandalone: true, selector: "rtsee-field-autocomplete", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container\">\n <rtsee-autocomplete [config]=\"field.autocomplete\"></rtsee-autocomplete>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "rtsee-autocomplete", inputs: ["config"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
1927
+ }
1928
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AutocompleteFieldComponent, decorators: [{
1929
+ type: Component,
1930
+ args: [{ selector: "rtsee-field-autocomplete", standalone: true, imports: [AutocompleteComponent, Message], template: "<div class=\"rtsee-form-field-container\">\n <rtsee-autocomplete [config]=\"field.autocomplete\"></rtsee-autocomplete>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1931
+ }], propDecorators: { field: [{
1932
+ type: Input
1933
+ }], fieldChanged: [{
1934
+ type: Output
1935
+ }] } });
1936
+
1937
+ class RecursiveSelectComponent {
1938
+ constructor() {
1939
+ this.value = undefined;
1940
+ }
1941
+ ngOnInit() {
1942
+ this.value = this.selectModel.value;
1943
+ }
1944
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RecursiveSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1945
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RecursiveSelectComponent, isStandalone: true, selector: "rtsee-recursive-select", inputs: { selectModel: "selectModel" }, ngImport: i0, template: "<div class=\"rtsee-recursive-select\">\n @for (item of selectModel.selectionHierarchy; track item.level) {\n <div class=\"rtsee-form-field-container\">\n <p-select [options]=\"item.children\"\n [(ngModel)]=\"item.selected\"\n [optionLabel]=\"'label'\"\n [placeholder]=\"selectModel.placeholderValue\"\n (onChange)=\"selectModel.onSelectionChanged(item.selected, item.level)\"\n class=\"rtsee-form-field\"\n />\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1946
+ }
1947
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RecursiveSelectComponent, decorators: [{
1948
+ type: Component,
1949
+ args: [{ selector: 'rtsee-recursive-select', imports: [Select, FormsModule], template: "<div class=\"rtsee-recursive-select\">\n @for (item of selectModel.selectionHierarchy; track item.level) {\n <div class=\"rtsee-form-field-container\">\n <p-select [options]=\"item.children\"\n [(ngModel)]=\"item.selected\"\n [optionLabel]=\"'label'\"\n [placeholder]=\"selectModel.placeholderValue\"\n (onChange)=\"selectModel.onSelectionChanged(item.selected, item.level)\"\n class=\"rtsee-form-field\"\n />\n </div>\n }\n</div>\n" }]
1950
+ }], propDecorators: { selectModel: [{
1951
+ type: Input
1952
+ }] } });
1953
+
1954
+ class RecursiveSelectFieldComponent {
1955
+ constructor() {
1956
+ this.fieldChanged = new EventEmitter();
1957
+ }
1958
+ ngDoCheck() {
1959
+ if (this.field.recursiveSelect.value !== this.lastValue) {
1960
+ this.lastValue = this.field.recursiveSelect.value;
1961
+ this.onModelChange();
1962
+ }
1963
+ }
1964
+ onModelChange() {
1965
+ this.field.digest();
1966
+ this.fieldChanged.emit();
1967
+ }
1968
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RecursiveSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1969
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RecursiveSelectFieldComponent, isStandalone: true, selector: "rtsee-field-recursive-select", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container\">\n <rtsee-recursive-select [selectModel]=\"field.recursiveSelect\"></rtsee-recursive-select>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "component", type: RecursiveSelectComponent, selector: "rtsee-recursive-select", inputs: ["selectModel"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
1970
+ }
1971
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RecursiveSelectFieldComponent, decorators: [{
1972
+ type: Component,
1973
+ args: [{ selector: "rtsee-field-recursive-select", standalone: true, imports: [RecursiveSelectComponent, Message], template: "<div class=\"rtsee-form-field-container\">\n <rtsee-recursive-select [selectModel]=\"field.recursiveSelect\"></rtsee-recursive-select>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1974
+ }], propDecorators: { field: [{
1975
+ type: Input
1976
+ }], fieldChanged: [{
1977
+ type: Output
1978
+ }] } });
1979
+
1980
+ class ImageUploaderFieldComponent {
1981
+ constructor() {
1982
+ this.fieldChanged = new EventEmitter();
1983
+ }
1984
+ ngOnInit() {
1985
+ this.field.imageUploader.on("completed", () => {
1986
+ this.onModelChange();
1987
+ });
1988
+ }
1989
+ onModelChange() {
1990
+ this.field.digest();
1991
+ this.fieldChanged.emit();
1992
+ }
1993
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ImageUploaderFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1994
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ImageUploaderFieldComponent, isStandalone: true, selector: "rtsee-field-image-uploader", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "<div class=\"rtsee-form-field-container\">\n <div class=\"rtsee-image-uploader-label font-semibold mb-2\">{{ field.name }}</div>\n <rtsee-image-uploader [imageUploader]=\"field.imageUploader\"></rtsee-image-uploader>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n", dependencies: [{ kind: "component", type: RTSeeImageUploaderComponent, selector: "rtsee-image-uploader", inputs: ["imageUploader"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
1995
+ }
1996
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ImageUploaderFieldComponent, decorators: [{
1997
+ type: Component,
1998
+ args: [{ selector: "rtsee-field-image-uploader", standalone: true, imports: [RTSeeImageUploaderComponent, Message], template: "<div class=\"rtsee-form-field-container\">\n <div class=\"rtsee-image-uploader-label font-semibold mb-2\">{{ field.name }}</div>\n <rtsee-image-uploader [imageUploader]=\"field.imageUploader\"></rtsee-image-uploader>\n @if (!field.isValid && field.isDirty) {\n @for (error of field.validator.result.errors; track error.message) {\n <p-message class=\"rtsee-form-field-error-message block mt-1\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ error.message }}</p-message>\n }\n }\n</div>\n" }]
1999
+ }], propDecorators: { field: [{
2000
+ type: Input
2001
+ }], fieldChanged: [{
2002
+ type: Output
2003
+ }] } });
2004
+
2005
+ class FormFieldComponent {
2006
+ constructor() {
2007
+ this.fieldChanged = new EventEmitter();
2008
+ }
2009
+ onFieldChanged() {
2010
+ this.fieldChanged.emit();
2011
+ }
2012
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2013
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: FormFieldComponent, isStandalone: true, selector: "rtsee-form-field", inputs: { field: "field" }, outputs: { fieldChanged: "fieldChanged" }, ngImport: i0, template: "@switch (field.type) {\n @case ('text') {\n <rtsee-field-text [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-text>\n }\n @case ('textarea') {\n <rtsee-field-textarea [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-textarea>\n }\n @case ('checkbox') {\n <rtsee-field-checkbox [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-checkbox>\n }\n @case ('radio') {\n <rtsee-field-radio [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-radio>\n }\n @case ('number') {\n <rtsee-field-number [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-number>\n }\n @case ('autocomplete') {\n <rtsee-field-autocomplete [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-autocomplete>\n }\n @case ('recursive-select') {\n <rtsee-field-recursive-select [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-recursive-select>\n }\n @case ('image-uploader') {\n <rtsee-field-image-uploader [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-image-uploader>\n }\n}\n", dependencies: [{ kind: "component", type: TextFieldComponent, selector: "rtsee-field-text", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: TextareaFieldComponent, selector: "rtsee-field-textarea", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: CheckboxFieldComponent, selector: "rtsee-field-checkbox", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: RadioFieldComponent, selector: "rtsee-field-radio", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: NumberFieldComponent, selector: "rtsee-field-number", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: AutocompleteFieldComponent, selector: "rtsee-field-autocomplete", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: RecursiveSelectFieldComponent, selector: "rtsee-field-recursive-select", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: ImageUploaderFieldComponent, selector: "rtsee-field-image-uploader", inputs: ["field"], outputs: ["fieldChanged"] }] }); }
2014
+ }
2015
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: FormFieldComponent, decorators: [{
2016
+ type: Component,
2017
+ args: [{ selector: "rtsee-form-field", standalone: true, imports: [
2018
+ TextFieldComponent,
2019
+ TextareaFieldComponent,
2020
+ CheckboxFieldComponent,
2021
+ RadioFieldComponent,
2022
+ NumberFieldComponent,
2023
+ AutocompleteFieldComponent,
2024
+ RecursiveSelectFieldComponent,
2025
+ ImageUploaderFieldComponent
2026
+ ], template: "@switch (field.type) {\n @case ('text') {\n <rtsee-field-text [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-text>\n }\n @case ('textarea') {\n <rtsee-field-textarea [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-textarea>\n }\n @case ('checkbox') {\n <rtsee-field-checkbox [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-checkbox>\n }\n @case ('radio') {\n <rtsee-field-radio [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-radio>\n }\n @case ('number') {\n <rtsee-field-number [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-number>\n }\n @case ('autocomplete') {\n <rtsee-field-autocomplete [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-autocomplete>\n }\n @case ('recursive-select') {\n <rtsee-field-recursive-select [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-recursive-select>\n }\n @case ('image-uploader') {\n <rtsee-field-image-uploader [field]=\"$any(field)\" (fieldChanged)=\"onFieldChanged()\"></rtsee-field-image-uploader>\n }\n}\n" }]
2027
+ }], propDecorators: { field: [{
2028
+ type: Input
2029
+ }], fieldChanged: [{
2030
+ type: Output
2031
+ }] } });
2032
+
2033
+ class FormComponent {
2034
+ constructor() {
2035
+ this.formSubmit = new EventEmitter();
2036
+ }
2037
+ submit() {
2038
+ this.formSubmit.emit(this.form);
2039
+ }
2040
+ onFieldChanged() {
2041
+ this.form.evaluateIsValid();
2042
+ this.form.evaluateIsDirty();
2043
+ this.form.evaluateIsChanged();
2044
+ }
2045
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: FormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2046
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: FormComponent, isStandalone: true, selector: "rtsee-form", inputs: { form: "form" }, outputs: { formSubmit: "formSubmit" }, ngImport: i0, template: "<div class=\"rtsee-form-container\">\n @if (form.name) {\n <h3 class=\"rtsee-form-title font-bold text-lg mb-2\">{{ form.name }}</h3>\n }\n @if (form.description) {\n <p class=\"rtsee-form-description text-sm text-gray-500 mb-4\">{{ form.description }}</p>\n }\n <form class=\"rtsee-story-form rtsee-form\" (ngSubmit)=\"submit()\">\n @for (field of form.fields; track field.name) {\n <div class=\"rtsee-form-field-container\">\n <rtsee-form-field [field]=\"field\"\n (fieldChanged)=\"onFieldChanged()\"\n ></rtsee-form-field>\n </div>\n }\n\n <div class=\"rtsee-form-submit-container mt-4\">\n <ng-content>\n <p-button type=\"submit\" label=\"Submit\" [disabled]=\"!form.isValid\"></p-button>\n </ng-content>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "component", type: FormFieldComponent, selector: "rtsee-form-field", inputs: ["field"], outputs: ["fieldChanged"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
2047
+ }
2048
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: FormComponent, decorators: [{
2049
+ type: Component,
2050
+ args: [{ selector: "rtsee-form", standalone: true, imports: [FormFieldComponent, Button, FormsModule], template: "<div class=\"rtsee-form-container\">\n @if (form.name) {\n <h3 class=\"rtsee-form-title font-bold text-lg mb-2\">{{ form.name }}</h3>\n }\n @if (form.description) {\n <p class=\"rtsee-form-description text-sm text-gray-500 mb-4\">{{ form.description }}</p>\n }\n <form class=\"rtsee-story-form rtsee-form\" (ngSubmit)=\"submit()\">\n @for (field of form.fields; track field.name) {\n <div class=\"rtsee-form-field-container\">\n <rtsee-form-field [field]=\"field\"\n (fieldChanged)=\"onFieldChanged()\"\n ></rtsee-form-field>\n </div>\n }\n\n <div class=\"rtsee-form-submit-container mt-4\">\n <ng-content>\n <p-button type=\"submit\" label=\"Submit\" [disabled]=\"!form.isValid\"></p-button>\n </ng-content>\n </div>\n </form>\n</div>\n" }]
2051
+ }], propDecorators: { form: [{
2052
+ type: Input
2053
+ }], formSubmit: [{
2054
+ type: Output
2055
+ }] } });
2056
+
2057
+ class ManageStoryComponent {
2058
+ ngOnInit() {
2059
+ if (!this.manageStory.activeStoryForm) {
2060
+ this.manageStory.initForm();
2061
+ }
2062
+ if (!this.manageStory.activeStoryForm) {
2063
+ throw new Error(`Active story form should be selected`);
2064
+ }
2065
+ }
2066
+ submit() {
2067
+ if (!this.manageStory.activeStoryForm) {
2068
+ return;
2069
+ }
2070
+ this.manageStory.activeStoryForm.submit();
2071
+ }
2072
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2073
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageStoryComponent, isStandalone: true, selector: "rtsee-manage-story", inputs: { manageStory: "manageStory" }, ngImport: i0, template: "<div class=\"rtsee-manage-story\">\n @if (!manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-info rtsee-form-container\">\n @if (manageStory.activeStoryForm) {\n <rtsee-form [form]=\"manageStory.activeStoryForm\" (formSubmit)=\"submit()\">\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageStory.saveInProgress\"\n ></p-button>\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageStory.cancel()\"\n [disabled]=\"manageStory.saveInProgress\"\n />\n </rtsee-form>\n\n <p-divider />\n <div class=\"rtsee-story-slides-wrapper\">\n <rtsee-manage-slides [manageSlides]=\"manageStory.manageSlides\"></rtsee-manage-slides>\n </div>\n }\n </div>\n }\n @if (manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-slide-wrapper\">\n <rtsee-manage-slide [manageSlide]=\"manageStory.manageSlides.selectedSlide\"\n ></rtsee-manage-slide>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ManageSlidesComponent, selector: "rtsee-manage-slides", inputs: ["manageSlides"] }, { kind: "component", type: ManageSlideComponent, selector: "rtsee-manage-slide", inputs: ["manageSlide"] }, { kind: "component", type: Divider, selector: "p-divider", inputs: ["styleClass", "layout", "type", "align"] }, { kind: "component", type: FormComponent, selector: "rtsee-form", inputs: ["form"], outputs: ["formSubmit"] }] }); }
2074
+ }
2075
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoryComponent, decorators: [{
2076
+ type: Component,
2077
+ args: [{ selector: "rtsee-manage-story", standalone: true, imports: [
2078
+ Button,
2079
+ ManageSlidesComponent,
2080
+ ManageSlideComponent,
2081
+ Divider,
2082
+ FormComponent,
2083
+ ], template: "<div class=\"rtsee-manage-story\">\n @if (!manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-info rtsee-form-container\">\n @if (manageStory.activeStoryForm) {\n <rtsee-form [form]=\"manageStory.activeStoryForm\" (formSubmit)=\"submit()\">\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageStory.saveInProgress\"\n ></p-button>\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageStory.cancel()\"\n [disabled]=\"manageStory.saveInProgress\"\n />\n </rtsee-form>\n\n <p-divider />\n <div class=\"rtsee-story-slides-wrapper\">\n <rtsee-manage-slides [manageSlides]=\"manageStory.manageSlides\"></rtsee-manage-slides>\n </div>\n }\n </div>\n }\n @if (manageStory.manageSlides.selectedSlide) {\n <div class=\"rtsee-manage-story-slide-wrapper\">\n <rtsee-manage-slide [manageSlide]=\"manageStory.manageSlides.selectedSlide\"\n ></rtsee-manage-slide>\n </div>\n }\n</div>\n" }]
2084
+ }], propDecorators: { manageStory: [{
2085
+ type: Input
2086
+ }] } });
2087
+
2088
+ class ManageStoriesComponent {
2089
+ ngOnInit() {
2090
+ this.manageStories.init();
2091
+ }
2092
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2093
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageStoriesComponent, isStandalone: true, selector: "rtsee-manage-stories", inputs: { manageStories: "manageStories" }, ngImport: i0, template: "<div class=\"rtsee-manage-stories\">\n <div class=\"rtsee-manage-stories-header\">\n @if (!manageStories.selectedStory) {\n <p-button (click)=\"manageStories.selectNewStory()\"\n label=\"Create A New Story\"\n ></p-button>\n }\n </div>\n @if (manageStories.selectedStory) {\n <div class=\"rtsee-manage-story-container\">\n <rtsee-manage-story [manageStory]=\"manageStories.selectedStory\"\n ></rtsee-manage-story>\n </div>\n }\n @if (!manageStories.selectedStory) {\n <div class=\"rtsee-manage-stories-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageStories.stories\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n [scrollHeight]=\"'40rem'\"\n class=\"rtsee-ordered-list-inner\"\n (onReorder)=\"manageStories.onReorder()\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <div class=\"rtsee-presentation-manage-stories-list-item rtsee-ordered-list-item\">\n <img\n [src]=\"option.imageUrl\"\n [alt]=\"'slide_image'\"\n [style.width]=\"'60px'\"\n class=\"rtsee-presentation-manage-stories-list-item-image rtsee-ordered-list-item-image\"\n />\n <div class=\"rtsee-presentation-manage-stories-list-item-info rtsee-ordered-list-item-info\">\n <span [ngClass]=\"{\n 'text-sm': true,\n 'text-surface-500': !selected,\n 'dark:text-surface-400': !selected,\n 'text-inherit': selected,\n }\"\n >{{ option.name }}</span>\n <div class=\"rtsee-ordered-list-item-info-buttons\">\n <p-button label=\"Edit\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n <p-button label=\"Delete\"\n [severity]=\"'warn'\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n </div>\n </div>\n </div>\n </ng-template>\n </p-orderList>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: ManageStoryComponent, selector: "rtsee-manage-story", inputs: ["manageStory"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: OrderList, selector: "p-orderList, p-orderlist, p-order-list", inputs: ["header", "styleClass", "tabindex", "ariaLabel", "ariaLabelledBy", "listStyle", "responsive", "filterBy", "filterPlaceholder", "filterLocale", "metaKeySelection", "dragdrop", "controlsPosition", "ariaFilterLabel", "filterMatchMode", "breakpoint", "stripedRows", "disabled", "trackBy", "scrollHeight", "autoOptionFocus", "dataKey", "selection", "value", "buttonProps", "moveUpButtonProps", "moveTopButtonProps", "moveDownButtonProps", "moveBottomButtonProps"], outputs: ["selectionChange", "onReorder", "onSelectionChange", "onFilterEvent", "onFocus", "onBlur"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
2094
+ }
2095
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageStoriesComponent, decorators: [{
2096
+ type: Component,
2097
+ args: [{ selector: 'rtsee-manage-stories', imports: [ManageStoryComponent, Button, OrderList, NgClass], template: "<div class=\"rtsee-manage-stories\">\n <div class=\"rtsee-manage-stories-header\">\n @if (!manageStories.selectedStory) {\n <p-button (click)=\"manageStories.selectNewStory()\"\n label=\"Create A New Story\"\n ></p-button>\n }\n </div>\n @if (manageStories.selectedStory) {\n <div class=\"rtsee-manage-story-container\">\n <rtsee-manage-story [manageStory]=\"manageStories.selectedStory\"\n ></rtsee-manage-story>\n </div>\n }\n @if (!manageStories.selectedStory) {\n <div class=\"rtsee-manage-stories-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageStories.stories\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n [scrollHeight]=\"'40rem'\"\n class=\"rtsee-ordered-list-inner\"\n (onReorder)=\"manageStories.onReorder()\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <div class=\"rtsee-presentation-manage-stories-list-item rtsee-ordered-list-item\">\n <img\n [src]=\"option.imageUrl\"\n [alt]=\"'slide_image'\"\n [style.width]=\"'60px'\"\n class=\"rtsee-presentation-manage-stories-list-item-image rtsee-ordered-list-item-image\"\n />\n <div class=\"rtsee-presentation-manage-stories-list-item-info rtsee-ordered-list-item-info\">\n <span [ngClass]=\"{\n 'text-sm': true,\n 'text-surface-500': !selected,\n 'dark:text-surface-400': !selected,\n 'text-inherit': selected,\n }\"\n >{{ option.name }}</span>\n <div class=\"rtsee-ordered-list-item-info-buttons\">\n <p-button label=\"Edit\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n <p-button label=\"Delete\"\n [severity]=\"'warn'\"\n class=\"rtsee-ordered-list-item-info-button\"\n (click)=\"manageStories.selectStory(option.id)\"\n ></p-button>\n </div>\n </div>\n </div>\n </ng-template>\n </p-orderList>\n </div>\n }\n</div>\n" }]
2098
+ }], propDecorators: { manageStories: [{
2099
+ type: Input
2100
+ }] } });
2101
+
2102
+ class ManageCategoryComponent {
2103
+ constructor(formBuilder) {
2104
+ this.formBuilder = formBuilder;
2105
+ this.categoryForm = this.formBuilder.group({
2106
+ name: this.formBuilder.control('', {
2107
+ validators: [
2108
+ Validators.required,
2109
+ Validators.minLength(3),
2110
+ Validators.maxLength(131),
2111
+ ],
2112
+ }),
2113
+ description: this.formBuilder.control('', {
2114
+ validators: [
2115
+ Validators.required,
2116
+ Validators.minLength(6),
2117
+ Validators.maxLength(244),
2118
+ ],
2119
+ }),
2120
+ });
2121
+ }
2122
+ ngOnInit() {
2123
+ this.nameField.setValue(this.manageCategory.category.name);
2124
+ this.descriptionField.setValue(this.manageCategory.category.description || '');
2125
+ }
2126
+ submit() {
2127
+ if (this.categoryForm.valid) {
2128
+ void this.manageCategory.save({
2129
+ name: this.nameField.value,
2130
+ description: this.descriptionField.value,
2131
+ });
2132
+ }
2133
+ else {
2134
+ this.categoryForm.markAsTouched(); // this does not work after switching to "nonNullable" form fields
2135
+ }
2136
+ }
2137
+ get nameField() {
2138
+ return this.categoryForm.get('name');
2139
+ }
2140
+ get descriptionField() {
2141
+ return this.categoryForm.get('description');
2142
+ }
2143
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoryComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2144
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageCategoryComponent, isStandalone: true, selector: "rtsee-manage-category", inputs: { manageCategory: "manageCategory" }, ngImport: i0, template: "<div class=\"rtsee-manage-story-category\">\n <div class=\"rtsee-manage-category-info rtsee-form-container\">\n <form class=\"rtsee-story-form rtsee-form\"\n [formGroup]=\"categoryForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"sign-up-email\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageCategory.cancel()\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
2145
+ }
2146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoryComponent, decorators: [{
2147
+ type: Component,
2148
+ args: [{ selector: 'rtsee-manage-category', imports: [
2149
+ Button,
2150
+ FloatLabel,
2151
+ FormsModule,
2152
+ InputGroup,
2153
+ InputText,
2154
+ Message,
2155
+ Textarea,
2156
+ ReactiveFormsModule,
2157
+ ], template: "<div class=\"rtsee-manage-story-category\">\n <div class=\"rtsee-manage-category-info rtsee-form-container\">\n <form class=\"rtsee-story-form rtsee-form\"\n [formGroup]=\"categoryForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"sign-up-email\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageCategory.cancel()\"\n [disabled]=\"manageCategory.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
2158
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageCategory: [{
2159
+ type: Input
2160
+ }] } });
2161
+
2162
+ class ManageCategoriesComponent {
2163
+ ngOnInit() {
2164
+ this.manageCategories.init();
2165
+ }
2166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageCategoriesComponent, isStandalone: true, selector: "rtsee-manage-categories", inputs: { manageCategories: "manageCategories" }, ngImport: i0, template: "<div class=\"rtsee-manage-stories-categories\">\n <div class=\"rtsee-manage-stories-categories-header\">\n @if (!manageCategories.selectedCategory) {\n <p-button (click)=\"manageCategories.selectNewCategory()\"\n label=\"Create A New Category\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-categories-body\">\n @if (manageCategories.selectedCategory) {\n <rtsee-manage-category [manageCategory]=\"manageCategories.selectedCategory\"\n ></rtsee-manage-category>\n }\n @if (!manageCategories.selectedCategory) {\n @for (category of manageCategories.categories; track category.id) {\n <p (click)=\"manageCategories.selectCategory(category.id)\">{{category.name}}</p>\n }\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ManageCategoryComponent, selector: "rtsee-manage-category", inputs: ["manageCategory"] }] }); }
2168
+ }
2169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageCategoriesComponent, decorators: [{
2170
+ type: Component,
2171
+ args: [{ selector: 'rtsee-manage-categories', imports: [Button, ManageCategoryComponent], template: "<div class=\"rtsee-manage-stories-categories\">\n <div class=\"rtsee-manage-stories-categories-header\">\n @if (!manageCategories.selectedCategory) {\n <p-button (click)=\"manageCategories.selectNewCategory()\"\n label=\"Create A New Category\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-categories-body\">\n @if (manageCategories.selectedCategory) {\n <rtsee-manage-category [manageCategory]=\"manageCategories.selectedCategory\"\n ></rtsee-manage-category>\n }\n @if (!manageCategories.selectedCategory) {\n @for (category of manageCategories.categories; track category.id) {\n <p (click)=\"manageCategories.selectCategory(category.id)\">{{category.name}}</p>\n }\n }\n </div>\n</div>\n" }]
2172
+ }], propDecorators: { manageCategories: [{
2073
2173
  type: Input
2074
2174
  }] } });
2075
2175
 
@@ -2081,23 +2181,23 @@ class ManageLabelComponent {
2081
2181
  validators: [
2082
2182
  Validators.required,
2083
2183
  Validators.minLength(3),
2084
- Validators.maxLength(131)
2085
- ]
2184
+ Validators.maxLength(131),
2185
+ ],
2086
2186
  }),
2087
2187
  description: this.formBuilder.control('', {
2088
2188
  validators: [
2089
2189
  Validators.required,
2090
2190
  Validators.minLength(6),
2091
- Validators.maxLength(244)
2092
- ]
2191
+ Validators.maxLength(244),
2192
+ ],
2093
2193
  }),
2094
2194
  symbol: this.formBuilder.control('', {
2095
2195
  validators: [
2096
2196
  Validators.required,
2097
2197
  Validators.minLength(1),
2098
- Validators.maxLength(244)
2099
- ]
2100
- })
2198
+ Validators.maxLength(244),
2199
+ ],
2200
+ }),
2101
2201
  });
2102
2202
  }
2103
2203
  ngOnInit() {
@@ -2140,7 +2240,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2140
2240
  Message,
2141
2241
  Textarea,
2142
2242
  ReactiveFormsModule,
2143
- ColorPicker
2243
+ ColorPicker,
2144
2244
  ], template: "<div class=\"rtsee-manage-story-label\">\n <div class=\"rtsee-manage-story-label-info rtsee-form-container\">\n <form class=\"rtsee-story-label-form rtsee-form\"\n [formGroup]=\"labelForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-label-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-story-label-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-label-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-label-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-label-symbol-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"symbolField\"\n [class.p-invalid]=\"symbolField.invalid && symbolField.touched\"\n />\n <label for=\"rtsee-story-label-symbol-field\">Symbol</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (symbolField.hasError('required') && symbolField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Symbol is required, pick a smile, dummy</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-colorPicker [(ngModel)]=\"manageLabel.label.color\"/>\n </div>\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageLabel.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageLabel.cancel()\"\n [disabled]=\"manageLabel.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
2145
2245
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageLabel: [{
2146
2246
  type: Input
@@ -2155,10 +2255,7 @@ class ManageLabelsComponent {
2155
2255
  }
2156
2256
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageLabelsComponent, decorators: [{
2157
2257
  type: Component,
2158
- args: [{ selector: 'rtsee-manage-labels', imports: [
2159
- Button,
2160
- ManageLabelComponent
2161
- ], template: "<div class=\"rtsee-manage-stories-labels\">\n <div class=\"rtsee-manage-stories-labels-header\">\n @if (!manageLabels.selectedLabel) {\n <p-button (click)=\"manageLabels.selectNewLabel()\"\n label=\"Create A New Label\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-labels-body\">\n @if (manageLabels.selectedLabel) {\n <rtsee-manage-label [manageLabel]=\"manageLabels.selectedLabel\"\n ></rtsee-manage-label>\n }\n @if (!manageLabels.selectedLabel) {\n @for (label of manageLabels.labels; track label.id) {\n <p (click)=\"manageLabels.selectLabel(label.id)\">{{label.name}}</p>\n }\n }\n </div>\n</div>\n" }]
2258
+ args: [{ selector: 'rtsee-manage-labels', imports: [Button, ManageLabelComponent], template: "<div class=\"rtsee-manage-stories-labels\">\n <div class=\"rtsee-manage-stories-labels-header\">\n @if (!manageLabels.selectedLabel) {\n <p-button (click)=\"manageLabels.selectNewLabel()\"\n label=\"Create A New Label\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-labels-body\">\n @if (manageLabels.selectedLabel) {\n <rtsee-manage-label [manageLabel]=\"manageLabels.selectedLabel\"\n ></rtsee-manage-label>\n }\n @if (!manageLabels.selectedLabel) {\n @for (label of manageLabels.labels; track label.id) {\n <p (click)=\"manageLabels.selectLabel(label.id)\">{{label.name}}</p>\n }\n }\n </div>\n</div>\n" }]
2162
2259
  }], propDecorators: { manageLabels: [{
2163
2260
  type: Input
2164
2261
  }] } });
@@ -2171,23 +2268,23 @@ class ManageTopicComponent {
2171
2268
  validators: [
2172
2269
  Validators.required,
2173
2270
  Validators.minLength(3),
2174
- Validators.maxLength(131)
2175
- ]
2271
+ Validators.maxLength(131),
2272
+ ],
2176
2273
  }),
2177
2274
  key: this.formBuilder.control('', {
2178
2275
  validators: [
2179
2276
  Validators.required,
2180
2277
  Validators.minLength(1),
2181
- Validators.maxLength(244)
2182
- ]
2278
+ Validators.maxLength(244),
2279
+ ],
2183
2280
  }),
2184
2281
  description: this.formBuilder.control('', {
2185
2282
  validators: [
2186
2283
  Validators.required,
2187
2284
  Validators.minLength(6),
2188
- Validators.maxLength(244)
2189
- ]
2190
- })
2285
+ Validators.maxLength(244),
2286
+ ],
2287
+ }),
2191
2288
  });
2192
2289
  }
2193
2290
  ngOnInit() {
@@ -2230,7 +2327,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2230
2327
  ReactiveFormsModule,
2231
2328
  Textarea,
2232
2329
  AutocompleteComponent,
2233
- OrderList
2330
+ OrderList,
2234
2331
  ], template: "<div class=\"rtsee-manage-story-topic\">\n <div class=\"rtsee-manage-story-topic-info rtsee-form-container\">\n <form class=\"rtsee-story-topic-form rtsee-form\"\n [formGroup]=\"topicForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-topic-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-story-topic-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-topic-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-topic-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-topic-key-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"keyField\"\n [class.p-invalid]=\"keyField.invalid && keyField.touched\"\n />\n <label for=\"rtsee-story-topic-key-field\">Key</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (keyField.hasError('required') && keyField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Key is required, pick a smile, dummy</p-message>\n }\n </div>\n <rtsee-autocomplete [config]=\"manageTopic.categoriesMultiselect\"></rtsee-autocomplete>\n <div class=\"rtsee-manage-story-topic-categories-list rtsee-ordered-list\">\n <p-orderList [value]=\"manageTopic.topic.categories\"\n dataKey=\"id\"\n [dragdrop]=\"true\"\n [responsive]=\"true\"\n scrollHeight=\"40rem\"\n controlsPosition=\"right\"\n (onReorder)=\"manageTopic.onReorder($event)\"\n >\n <ng-template let-option let-selected=\"selected\" #item>\n <p>{{option.name}}</p>\n <p-button label=\"Delete\" (click)=\"manageTopic.removeCategory(option.id)\"></p-button>\n </ng-template>\n </p-orderList>\n </div>\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageTopic.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"manageTopic.cancel()\"\n [disabled]=\"manageTopic.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
2235
2332
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageTopic: [{
2236
2333
  type: Input
@@ -2245,10 +2342,7 @@ class ManageTopicsComponent {
2245
2342
  }
2246
2343
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageTopicsComponent, decorators: [{
2247
2344
  type: Component,
2248
- args: [{ selector: 'rtsee-manage-topics', imports: [
2249
- Button,
2250
- ManageTopicComponent
2251
- ], template: "<div class=\"rtsee-manage-stories-topics\">\n <div class=\"rtsee-manage-stories-topics-header\">\n @if (!manageTopics.selectedTopic) {\n <p-button (click)=\"manageTopics.selectNewTopic()\"\n label=\"Create A New Topic\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-topics-body\">\n @if (manageTopics.selectedTopic) {\n <rtsee-manage-topic [manageTopic]=\"manageTopics.selectedTopic\"\n ></rtsee-manage-topic>\n }\n @if (!manageTopics.selectedTopic) {\n @for (topic of manageTopics.topics; track topic.id) {\n <p (click)=\"manageTopics.selectTopic(topic.id)\">{{topic.name}}</p>\n }\n }\n </div>\n</div>\n" }]
2345
+ args: [{ selector: 'rtsee-manage-topics', imports: [Button, ManageTopicComponent], template: "<div class=\"rtsee-manage-stories-topics\">\n <div class=\"rtsee-manage-stories-topics-header\">\n @if (!manageTopics.selectedTopic) {\n <p-button (click)=\"manageTopics.selectNewTopic()\"\n label=\"Create A New Topic\"\n ></p-button>\n }\n </div>\n <div class=\"rtsee-manage-stories-topics-body\">\n @if (manageTopics.selectedTopic) {\n <rtsee-manage-topic [manageTopic]=\"manageTopics.selectedTopic\"\n ></rtsee-manage-topic>\n }\n @if (!manageTopics.selectedTopic) {\n @for (topic of manageTopics.topics; track topic.id) {\n <p (click)=\"manageTopics.selectTopic(topic.id)\">{{topic.name}}</p>\n }\n }\n </div>\n</div>\n" }]
2252
2346
  }], propDecorators: { manageTopics: [{
2253
2347
  type: Input
2254
2348
  }] } });
@@ -2270,7 +2364,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2270
2364
  Button,
2271
2365
  Chip,
2272
2366
  ManageLabelsComponent,
2273
- ManageTopicsComponent
2367
+ ManageTopicsComponent,
2274
2368
  ], template: "<div class=\"rtsee-presentations-dashboard\">\n <div class=\"rtsee-presentations-dashboard-header\">\n <p-chip label=\"Presentation Dashboard\" />\n <p-button label=\"Close\"\n (click)=\"dashboard.onCloseDashboardClicked()\"\n class=\"rtsee-presentations-dashboard-close-btn\"\n ></p-button>\n </div>\n\n <div class=\"manage-stories-container\">\n <p-tabs lazy value=\"stories\">\n <p-tablist>\n <p-tab value=\"stories\">Stories</p-tab>\n <p-tab value=\"categories\">Categories</p-tab>\n <p-tab value=\"labels\">Labels</p-tab>\n <p-tab value=\"topics\">Topics</p-tab>\n </p-tablist>\n <p-tabpanels>\n <p-tabpanel value=\"stories\">\n <ng-template #content>\n <rtsee-manage-stories [manageStories]=\"dashboard.manageStories\"></rtsee-manage-stories>\n </ng-template>\n </p-tabpanel>\n <p-tabpanel value=\"categories\">\n <ng-template #content>\n <rtsee-manage-categories [manageCategories]=\"dashboard.manageCategories\"></rtsee-manage-categories>\n </ng-template>\n </p-tabpanel>\n <p-tabpanel value=\"labels\">\n <ng-template #content>\n <rtsee-manage-labels [manageLabels]=\"dashboard.manageLabels\"></rtsee-manage-labels>\n </ng-template>\n </p-tabpanel>\n <p-tabpanel value=\"topics\">\n <ng-template #content>\n <rtsee-manage-topics [manageTopics]=\"dashboard.manageTopics\"></rtsee-manage-topics>\n </ng-template>\n </p-tabpanel>\n </p-tabpanels>\n </p-tabs>\n </div>\n</div>\n" }]
2275
2369
  }], propDecorators: { dashboard: [{
2276
2370
  type: Input
@@ -2281,40 +2375,304 @@ class PresentationSettingsComponent {
2281
2375
  this.COMMON_CONSTANTS = COMMON_CONSTANTS;
2282
2376
  this.window = window;
2283
2377
  }
2284
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PresentationSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2285
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: PresentationSettingsComponent, isStandalone: true, selector: "rtsee-presentation-settings", inputs: { settings: "settings", presentation: "presentation" }, ngImport: i0, template: "<div class=\"rtsee-presentation-settings\">\n <div class=\"rtsee-presentation-settings-header\">\n <p-chip label=\"Settings\" />\n <p-button label=\"Close\"\n (click)=\"settings.collapse()\"\n class=\"rtsee-presentations-dashboard-close-btn\"\n ></p-button>\n </div>\n\n <div class=\"rtsee-presentation-rooms\">\n <p-fieldset legend=\"Rooms\">\n <p-listbox [options]=\"presentation.rooms\"\n [(ngModel)]=\"presentation.selectedRoom\"\n (onChange)=\"presentation.setActiveRoom()\"\n class=\"rtsee-presentation-settings-rooms-list\"\n >\n <ng-template #item let-room>\n <div class=\"rtsee-presentation-settings-rooms-list-item\">\n\n <img [src]=\"room.imageUrl || COMMON_CONSTANTS.defaultProfileImgUrl\"\n class=\"rtsee-presentation-settings-rooms-list-item-image\" />\n <div>{{ room.name }}</div>\n </div>\n </ng-template>\n </p-listbox>\n @if (presentation.selectedRoom) {\n <rtsee-join-call [room]=\"presentation.selectedRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n }\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-sound-settings\">\n <p-fieldset legend=\"Volume\" class=\"rtsee-presentation-sound-settings-fieldset\">\n <div class=\"rtsee-presentation-sound-settings-inner\">\n <div class=\"rtsee-presentation-sound-settings-inner-left\">\n <p-slider [(ngModel)]=\"settings.volume\"\n (onChange)=\"settings.setVolume(settings.volume)\"\n />\n </div>\n <div class=\"rtsee-presentation-sound-settings-inner-right\">\n <p-tag severity=\"info\"\n class=\"rtsee-presentation-sound-value-label\"\n [icon]=\"settings.volume ? 'pi pi-volume-up' : 'pi pi-volume-off'\"\n [value]=\"settings.volume.toString()\"\n [rounded]=\"true\" />\n </div>\n </div>\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-font-size-settings\">\n <p-fieldset legend=\"Font Size\">\n <div class=\"rtsee-presentation-font-size-range\">\n <p-slider [(ngModel)]=\"settings.fontSizeOption\"\n (onChange)=\"settings.setFontSize(settings.fontSizeOption)\"\n [min]=\"1\"\n [max]=\"10\"\n />\n </div>\n <p-message severity=\"secondary\" class=\"rtsee-presentation-font-size-example\">\n <span [style.font-size]=\"settings.fontSize + 'rem'\">A long time ago in a galaxy far, far away...</span>\n </p-message>\n </p-fieldset>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Slider, selector: "p-slider", inputs: ["animate", "min", "max", "orientation", "step", "range", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: Listbox, selector: "p-listbox, p-listBox, p-list-box", inputs: ["id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "ariaLabel", "selectOnFocus", "searchLocale", "focusOnHover", "filterMessage", "filterFields", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "scrollHeight", "tabindex", "multiple", "styleClass", "listStyle", "listStyleClass", "readonly", "checkbox", "filter", "filterBy", "filterMatchMode", "filterLocale", "metaKeySelection", "dataKey", "showToggleAll", "optionLabel", "optionValue", "optionGroupChildren", "optionGroupLabel", "optionDisabled", "ariaFilterLabel", "filterPlaceHolder", "emptyFilterMessage", "emptyMessage", "group", "options", "filterValue", "selectAll", "striped", "highlightOnSelect", "checkmark", "dragdrop", "dropListData", "fluid"], outputs: ["onChange", "onClick", "onDblClick", "onFilter", "onFocus", "onBlur", "onSelectAllChange", "onLazyLoad", "onDrop"] }, { kind: "component", type: JoinCallComponent, selector: "rtsee-join-call", inputs: ["presentation", "room"] }] }); }
2378
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PresentationSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2379
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: PresentationSettingsComponent, isStandalone: true, selector: "rtsee-presentation-settings", inputs: { settings: "settings", presentation: "presentation" }, ngImport: i0, template: "<div class=\"rtsee-presentation-settings\">\n <div class=\"rtsee-presentation-settings-header\">\n <p-chip label=\"Settings\" />\n <p-button label=\"Close\"\n (click)=\"settings.collapse()\"\n class=\"rtsee-presentations-dashboard-close-btn\"\n ></p-button>\n </div>\n\n <div class=\"rtsee-presentation-rooms\">\n <p-fieldset legend=\"Rooms\">\n <p-listbox [options]=\"presentation.rooms\"\n [(ngModel)]=\"presentation.selectedRoom\"\n (onChange)=\"presentation.setActiveRoom()\"\n class=\"rtsee-presentation-settings-rooms-list\"\n >\n <ng-template #item let-room>\n <div class=\"rtsee-presentation-settings-rooms-list-item\">\n\n <img [src]=\"room.imageUrl || COMMON_CONSTANTS.defaultProfileImgUrl\"\n class=\"rtsee-presentation-settings-rooms-list-item-image\" />\n <div>{{ room.name }}</div>\n </div>\n </ng-template>\n </p-listbox>\n @if (presentation.selectedRoom) {\n <rtsee-join-call [room]=\"presentation.selectedRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n }\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-sound-settings\">\n <p-fieldset legend=\"Volume\" class=\"rtsee-presentation-sound-settings-fieldset\">\n <div class=\"rtsee-presentation-sound-settings-inner\">\n <div class=\"rtsee-presentation-sound-settings-inner-left\">\n <p-slider [(ngModel)]=\"settings.volume\"\n (onChange)=\"settings.setVolume(settings.volume)\"\n />\n </div>\n <div class=\"rtsee-presentation-sound-settings-inner-right\">\n <p-tag severity=\"info\"\n class=\"rtsee-presentation-sound-value-label\"\n [icon]=\"settings.volume ? 'pi pi-volume-up' : 'pi pi-volume-off'\"\n [value]=\"settings.volume.toString()\"\n [rounded]=\"true\" />\n </div>\n </div>\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-font-size-settings\">\n <p-fieldset legend=\"Font Size\">\n <div class=\"rtsee-presentation-font-size-range\">\n <p-slider [(ngModel)]=\"settings.fontSizeOption\"\n (onChange)=\"settings.setFontSize(settings.fontSizeOption)\"\n [min]=\"1\"\n [max]=\"10\"\n />\n </div>\n <p-message severity=\"secondary\" class=\"rtsee-presentation-font-size-example\">\n <span [style.font-size]=\"settings.fontSize + 'rem'\">A long time ago in a galaxy far, far away...</span>\n </p-message>\n </p-fieldset>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Slider, selector: "p-slider", inputs: ["animate", "min", "max", "orientation", "step", "range", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: Listbox, selector: "p-listbox, p-listBox, p-list-box", inputs: ["id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "ariaLabel", "selectOnFocus", "searchLocale", "focusOnHover", "filterMessage", "filterFields", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "scrollHeight", "tabindex", "multiple", "styleClass", "listStyle", "listStyleClass", "readonly", "checkbox", "filter", "filterBy", "filterMatchMode", "filterLocale", "metaKeySelection", "dataKey", "showToggleAll", "optionLabel", "optionValue", "optionGroupChildren", "optionGroupLabel", "optionDisabled", "ariaFilterLabel", "filterPlaceHolder", "emptyFilterMessage", "emptyMessage", "group", "options", "filterValue", "selectAll", "striped", "highlightOnSelect", "checkmark", "dragdrop", "dropListData", "fluid"], outputs: ["onChange", "onClick", "onDblClick", "onFilter", "onFocus", "onBlur", "onSelectAllChange", "onLazyLoad", "onDrop"] }, { kind: "component", type: JoinCallComponent, selector: "rtsee-join-call", inputs: ["presentation", "room"] }] }); }
2380
+ }
2381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PresentationSettingsComponent, decorators: [{
2382
+ type: Component,
2383
+ args: [{ selector: 'rtsee-presentation-settings', imports: [
2384
+ Slider,
2385
+ Fieldset,
2386
+ FormsModule,
2387
+ Button,
2388
+ Chip,
2389
+ Message,
2390
+ Tag,
2391
+ Listbox,
2392
+ JoinCallComponent,
2393
+ ], template: "<div class=\"rtsee-presentation-settings\">\n <div class=\"rtsee-presentation-settings-header\">\n <p-chip label=\"Settings\" />\n <p-button label=\"Close\"\n (click)=\"settings.collapse()\"\n class=\"rtsee-presentations-dashboard-close-btn\"\n ></p-button>\n </div>\n\n <div class=\"rtsee-presentation-rooms\">\n <p-fieldset legend=\"Rooms\">\n <p-listbox [options]=\"presentation.rooms\"\n [(ngModel)]=\"presentation.selectedRoom\"\n (onChange)=\"presentation.setActiveRoom()\"\n class=\"rtsee-presentation-settings-rooms-list\"\n >\n <ng-template #item let-room>\n <div class=\"rtsee-presentation-settings-rooms-list-item\">\n\n <img [src]=\"room.imageUrl || COMMON_CONSTANTS.defaultProfileImgUrl\"\n class=\"rtsee-presentation-settings-rooms-list-item-image\" />\n <div>{{ room.name }}</div>\n </div>\n </ng-template>\n </p-listbox>\n @if (presentation.selectedRoom) {\n <rtsee-join-call [room]=\"presentation.selectedRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n }\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-sound-settings\">\n <p-fieldset legend=\"Volume\" class=\"rtsee-presentation-sound-settings-fieldset\">\n <div class=\"rtsee-presentation-sound-settings-inner\">\n <div class=\"rtsee-presentation-sound-settings-inner-left\">\n <p-slider [(ngModel)]=\"settings.volume\"\n (onChange)=\"settings.setVolume(settings.volume)\"\n />\n </div>\n <div class=\"rtsee-presentation-sound-settings-inner-right\">\n <p-tag severity=\"info\"\n class=\"rtsee-presentation-sound-value-label\"\n [icon]=\"settings.volume ? 'pi pi-volume-up' : 'pi pi-volume-off'\"\n [value]=\"settings.volume.toString()\"\n [rounded]=\"true\" />\n </div>\n </div>\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-font-size-settings\">\n <p-fieldset legend=\"Font Size\">\n <div class=\"rtsee-presentation-font-size-range\">\n <p-slider [(ngModel)]=\"settings.fontSizeOption\"\n (onChange)=\"settings.setFontSize(settings.fontSizeOption)\"\n [min]=\"1\"\n [max]=\"10\"\n />\n </div>\n <p-message severity=\"secondary\" class=\"rtsee-presentation-font-size-example\">\n <span [style.font-size]=\"settings.fontSize + 'rem'\">A long time ago in a galaxy far, far away...</span>\n </p-message>\n </p-fieldset>\n </div>\n</div>\n" }]
2394
+ }], propDecorators: { settings: [{
2395
+ type: Input
2396
+ }], presentation: [{
2397
+ type: Input
2398
+ }] } });
2399
+
2400
+ class RtseeEntityCommentsComponent {
2401
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityCommentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2402
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RtseeEntityCommentsComponent, isStandalone: true, selector: "rtsee-entity-comments", inputs: { messenger: "messenger", chat: "chat", entity: "entity" }, ngImport: i0, template: "<div class=\"rtsee-entity-comments\">\n @if (messenger && chat) {\n <rtsee-chat [messenger]=\"messenger\"\n [chatData]=\"chat\"\n [entity]=\"entity\"\n ></rtsee-chat>\n }\n</div>\n", dependencies: [{ kind: "component", type: ChatComponent, selector: "rtsee-chat", inputs: ["chat", "chatData", "entity", "messenger"] }] }); }
2403
+ }
2404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityCommentsComponent, decorators: [{
2405
+ type: Component,
2406
+ args: [{ selector: 'rtsee-entity-comments', imports: [ChatComponent], template: "<div class=\"rtsee-entity-comments\">\n @if (messenger && chat) {\n <rtsee-chat [messenger]=\"messenger\"\n [chatData]=\"chat\"\n [entity]=\"entity\"\n ></rtsee-chat>\n }\n</div>\n" }]
2407
+ }], propDecorators: { messenger: [{
2408
+ type: Input
2409
+ }], chat: [{
2410
+ type: Input
2411
+ }], entity: [{
2412
+ type: Input
2413
+ }] } });
2414
+
2415
+ class RtseeEntityTagsComponent {
2416
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityTagsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2417
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RtseeEntityTagsComponent, isStandalone: true, selector: "rtsee-entity-tags", inputs: { entity: "entity" }, ngImport: i0, template: "<div class=\"rtsee-entity-tags\">\n @if (entity && entity.tags?.length) {\n <div class=\"rtsee-entity-tags-list\">\n @for (tag of entity.tags; track tag.id) {\n <p-chip class=\"rtsee-entity-tag\">\n <span class=\"rtsee-entity-tag-right\"\n >{{tag.name}}</span>\n </p-chip>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }] }); }
2418
+ }
2419
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityTagsComponent, decorators: [{
2420
+ type: Component,
2421
+ args: [{ selector: 'rtsee-entity-tags', imports: [Chip], template: "<div class=\"rtsee-entity-tags\">\n @if (entity && entity.tags?.length) {\n <div class=\"rtsee-entity-tags-list\">\n @for (tag of entity.tags; track tag.id) {\n <p-chip class=\"rtsee-entity-tag\">\n <span class=\"rtsee-entity-tag-right\"\n >{{tag.name}}</span>\n </p-chip>\n }\n </div>\n }\n</div>\n" }]
2422
+ }], propDecorators: { entity: [{
2423
+ type: Input
2424
+ }] } });
2425
+
2426
+ class RateInputComponent {
2427
+ constructor() {
2428
+ this.sendRateForm = new FormGroup({
2429
+ comment: new FormControl(''),
2430
+ });
2431
+ this.showMissingRateError = false;
2432
+ }
2433
+ set config(value) {
2434
+ this._config = value;
2435
+ this.updateCommentControl();
2436
+ }
2437
+ get config() {
2438
+ return this._config;
2439
+ }
2440
+ ngOnInit() {
2441
+ this.updateCommentControl();
2442
+ }
2443
+ ngOnDestroy() {
2444
+ this.commentSubscription?.unsubscribe();
2445
+ }
2446
+ updateCommentControl() {
2447
+ this.commentSubscription?.unsubscribe();
2448
+ if (this._config && this._config.rate) {
2449
+ this.sendRateForm
2450
+ .get('comment')
2451
+ ?.setValue(this._config.rate.text || '', { emitEvent: false });
2452
+ this.commentSubscription = this.sendRateForm
2453
+ .get('comment')
2454
+ ?.valueChanges.subscribe((value) => {
2455
+ if (this._config.rate) {
2456
+ this._config.rate.text = value || '';
2457
+ }
2458
+ });
2459
+ }
2460
+ }
2461
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RateInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2462
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RateInputComponent, isStandalone: true, selector: "rtsee-rate-input", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"rtsee-rate-input\">\n <div class=\"rtsee-rate-input-header\">\n <h3 class=\"rtsee-rate-input-name\">{{ config.name }}</h3>\n @if (config.description) {\n <p class=\"rtsee-rate-input-description\">{{ config.description }}</p>\n }\n </div>\n <div class=\"rtsee-rate-form-container\">\n <form [formGroup]=\"sendRateForm\" class=\"rtsee-rate-form\">\n <textarea\n [invalid]=\"false\"\n [autoResize]=\"true\"\n formControlName=\"comment\"\n pTextarea\n placeholder=\"Your comment here...\"\n class=\"rtsee-rate-comment-field\"\n rows=\"1\"\n cols=\"30\"\n ></textarea>\n </form>\n </div>\n <div class=\"rtsee-rate-select-container\">\n <rtsee-rating [config]=\"config\"></rtsee-rating>\n @if (!config.rate?.value && showMissingRateError) {\n <p-message severity=\"error\">Please add your rate!</p-message>\n }\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "component", type: RatingComponent, selector: "rtsee-rating", inputs: ["config", "rate"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] }); }
2463
+ }
2464
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RateInputComponent, decorators: [{
2465
+ type: Component,
2466
+ args: [{ selector: 'rtsee-rate-input', imports: [ReactiveFormsModule, Textarea, RatingComponent, Message], standalone: true, template: "<div class=\"rtsee-rate-input\">\n <div class=\"rtsee-rate-input-header\">\n <h3 class=\"rtsee-rate-input-name\">{{ config.name }}</h3>\n @if (config.description) {\n <p class=\"rtsee-rate-input-description\">{{ config.description }}</p>\n }\n </div>\n <div class=\"rtsee-rate-form-container\">\n <form [formGroup]=\"sendRateForm\" class=\"rtsee-rate-form\">\n <textarea\n [invalid]=\"false\"\n [autoResize]=\"true\"\n formControlName=\"comment\"\n pTextarea\n placeholder=\"Your comment here...\"\n class=\"rtsee-rate-comment-field\"\n rows=\"1\"\n cols=\"30\"\n ></textarea>\n </form>\n </div>\n <div class=\"rtsee-rate-select-container\">\n <rtsee-rating [config]=\"config\"></rtsee-rating>\n @if (!config.rate?.value && showMissingRateError) {\n <p-message severity=\"error\">Please add your rate!</p-message>\n }\n </div>\n</div>\n" }]
2467
+ }], propDecorators: { config: [{
2468
+ type: Input
2469
+ }] } });
2470
+
2471
+ class RateItemComponent {
2472
+ constructor() {
2473
+ this.showActions = false;
2474
+ this.edit = new EventEmitter();
2475
+ this.delete = new EventEmitter();
2476
+ }
2477
+ onEdit(event) {
2478
+ event.stopPropagation();
2479
+ this.edit.emit();
2480
+ }
2481
+ onDelete(event) {
2482
+ event.stopPropagation();
2483
+ this.delete.emit();
2484
+ }
2485
+ getRatingConfigName(configId) {
2486
+ if (!this.rater) {
2487
+ return '';
2488
+ }
2489
+ const config = this.rater.ratingConfigurations.find((c) => c.id === configId);
2490
+ return config ? config.name : '';
2491
+ }
2492
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RateItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2493
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RateItemComponent, isStandalone: true, selector: "rtsee-rate-item", inputs: { group: "group", rater: "rater", showActions: "showActions" }, outputs: { edit: "edit", delete: "delete" }, ngImport: i0, template: "<div class=\"rtsee-rates-group-item\">\n <div class=\"rtsee-rates-group-header\">\n <div class=\"rtsee-rates-group-user-info\">\n @if (group.peer?.imageUrl) {\n <img\n class=\"rtsee-rates-group-avatar\"\n [src]=\"group.peer.imageUrl\"\n alt=\"User avatar\"\n />\n } @else {\n <div class=\"rtsee-rates-group-avatar-fallback\">\n {{ (group.peer?.name || \"?\").substring(0, 1) }}\n </div>\n }\n <span class=\"rtsee-rates-group-peer-name\">{{\n group.peer?.name || group.peerId\n }}</span>\n </div>\n\n <div class=\"rtsee-rates-group-right-header\">\n <span class=\"rtsee-rates-group-date\">{{\n group.createdAt | date: \"short\"\n }}</span>\n\n @if (showActions) {\n <div class=\"rtsee-rates-group-actions\">\n <p-button\n (click)=\"onEdit($event)\"\n [severity]=\"'secondary'\"\n [text]=\"true\"\n class=\"rtsee-rates-group-btn-edit\"\n >\n <span class=\"pi pi-pencil\"></span>\n </p-button>\n <p-button\n (click)=\"onDelete($event)\"\n [severity]=\"'danger'\"\n [text]=\"true\"\n class=\"rtsee-rates-group-btn-delete\"\n >\n <span class=\"pi pi-trash\"></span>\n </p-button>\n </div>\n }\n </div>\n </div>\n <div class=\"rtsee-rates-group-body\">\n @for (rate of group.rates; track rate.id) {\n <div class=\"rtsee-rates-group-rate-item-container\">\n <div class=\"rtsee-rates-group-rate-item\">\n <span class=\"rtsee-rates-group-rate-config-name\">{{\n getRatingConfigName(rate.configurationId)\n }}</span>\n <rtsee-rating [rate]=\"rate\"></rtsee-rating>\n </div>\n @if (rate.text) {\n <p class=\"rtsee-rates-group-rate-comment\">\"{{ rate.text }}\"</p>\n }\n </div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: RatingComponent, selector: "rtsee-rating", inputs: ["config", "rate"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: DatePipe, name: "date" }] }); }
2494
+ }
2495
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RateItemComponent, decorators: [{
2496
+ type: Component,
2497
+ args: [{ selector: 'rtsee-rate-item', imports: [RatingComponent, DatePipe, Button], template: "<div class=\"rtsee-rates-group-item\">\n <div class=\"rtsee-rates-group-header\">\n <div class=\"rtsee-rates-group-user-info\">\n @if (group.peer?.imageUrl) {\n <img\n class=\"rtsee-rates-group-avatar\"\n [src]=\"group.peer.imageUrl\"\n alt=\"User avatar\"\n />\n } @else {\n <div class=\"rtsee-rates-group-avatar-fallback\">\n {{ (group.peer?.name || \"?\").substring(0, 1) }}\n </div>\n }\n <span class=\"rtsee-rates-group-peer-name\">{{\n group.peer?.name || group.peerId\n }}</span>\n </div>\n\n <div class=\"rtsee-rates-group-right-header\">\n <span class=\"rtsee-rates-group-date\">{{\n group.createdAt | date: \"short\"\n }}</span>\n\n @if (showActions) {\n <div class=\"rtsee-rates-group-actions\">\n <p-button\n (click)=\"onEdit($event)\"\n [severity]=\"'secondary'\"\n [text]=\"true\"\n class=\"rtsee-rates-group-btn-edit\"\n >\n <span class=\"pi pi-pencil\"></span>\n </p-button>\n <p-button\n (click)=\"onDelete($event)\"\n [severity]=\"'danger'\"\n [text]=\"true\"\n class=\"rtsee-rates-group-btn-delete\"\n >\n <span class=\"pi pi-trash\"></span>\n </p-button>\n </div>\n }\n </div>\n </div>\n <div class=\"rtsee-rates-group-body\">\n @for (rate of group.rates; track rate.id) {\n <div class=\"rtsee-rates-group-rate-item-container\">\n <div class=\"rtsee-rates-group-rate-item\">\n <span class=\"rtsee-rates-group-rate-config-name\">{{\n getRatingConfigName(rate.configurationId)\n }}</span>\n <rtsee-rating [rate]=\"rate\"></rtsee-rating>\n </div>\n @if (rate.text) {\n <p class=\"rtsee-rates-group-rate-comment\">\"{{ rate.text }}\"</p>\n }\n </div>\n }\n </div>\n</div>\n" }]
2498
+ }], propDecorators: { group: [{
2499
+ type: Input
2500
+ }], rater: [{
2501
+ type: Input
2502
+ }], showActions: [{
2503
+ type: Input
2504
+ }], edit: [{
2505
+ type: Output
2506
+ }], delete: [{
2507
+ type: Output
2508
+ }] } });
2509
+
2510
+ class RaterComponent {
2511
+ constructor() {
2512
+ this.isEditing = false;
2513
+ }
2514
+ ngOnInit() {
2515
+ this.getRatingConfigurations()
2516
+ .then(() => {
2517
+ console.log('Getting rating configurations...');
2518
+ })
2519
+ .catch((error) => {
2520
+ console.error(error);
2521
+ });
2522
+ }
2523
+ async sendRate() {
2524
+ const rates = this.rater.configsWithRates
2525
+ .map((config) => config.rate)
2526
+ .filter((r) => !!r);
2527
+ if (this.rater.userRateGroup) {
2528
+ await this.rater.editRateGroup({
2529
+ ...this.rater.userRateGroup,
2530
+ rates,
2531
+ });
2532
+ }
2533
+ else {
2534
+ await this.rater.createRateGroup({
2535
+ entityId: this.rater.entityId,
2536
+ peerId: this.rater.peer.clientId,
2537
+ rates,
2538
+ applicationId: this.rater.applicationId,
2539
+ createdAt: new Date(),
2540
+ peer: this.rater.peer,
2541
+ });
2542
+ }
2543
+ this.isEditing = false;
2544
+ }
2545
+ async deleteRate() {
2546
+ if (this.rater.userRateGroup) {
2547
+ await this.rater.deleteRateGroup(this.rater.userRateGroup.id);
2548
+ }
2549
+ }
2550
+ startEdit() {
2551
+ this.isEditing = true;
2552
+ }
2553
+ async getRatingConfigurations() {
2554
+ if (!this.rater || !this.entity) {
2555
+ console.log('No rater or entity found.');
2556
+ return [];
2557
+ }
2558
+ const rates = await this.rater.getRates();
2559
+ console.log('Rates found.', rates);
2560
+ return rates;
2561
+ }
2562
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RaterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2563
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RaterComponent, isStandalone: true, selector: "rtsee-rater", inputs: { entity: "entity", rater: "rater" }, ngImport: i0, template: "<div class=\"rtsee-rater\" [ngClass]=\"{'rtsee-rater-view-mode': rater.userRateGroup && !isEditing}\">\n @if (rater.userRateGroup && !isEditing) {\n <rtsee-rate-item\n [group]=\"rater.userRateGroup\"\n [rater]=\"rater\"\n [showActions]=\"true\"\n (edit)=\"startEdit()\"\n (delete)=\"deleteRate()\"\n ></rtsee-rate-item>\n } @else {\n <div class=\"rtsee-rater-user-header\">\n @if (rater.peer?.imageUrl) {\n <img\n class=\"rtsee-rater-avatar\"\n [src]=\"rater.peer?.imageUrl\"\n alt=\"User avatar\"\n />\n } @else {\n <div class=\"rtsee-rater-avatar-fallback\">\n {{ (rater.peer?.name || \"?\").substring(0, 1) }}\n </div>\n }\n <div class=\"rtsee-rater-user-info\">\n <span class=\"rtsee-rater-user-name\">{{\n rater.peer?.name || \"Anonymous\"\n }}</span>\n <span class=\"rtsee-rater-user-status\">Rating publicly</span>\n </div>\n </div>\n <hr class=\"rtsee-rater-divider\" />\n @for (config of rater.configsWithRates; track config.id) {\n <rtsee-rate-input [config]=\"config\"></rtsee-rate-input>\n }\n <div class=\"rtsee-rater-actions\">\n @if (rater.userRateGroup) {\n <p-button\n (click)=\"sendRate()\"\n [severity]=\"'success'\"\n [label]=\"'Update'\"\n type=\"submit\"\n class=\"rtsee-rater-btn-update rts-action-button\"\n >\n <span class=\"pi pi-check\"></span>\n </p-button>\n <p-button\n (click)=\"deleteRate()\"\n [severity]=\"'danger'\"\n [label]=\"'Delete'\"\n class=\"rtsee-rater-btn-delete rts-action-button\"\n >\n <span class=\"pi pi-trash\"></span>\n </p-button>\n } @else {\n <p-button\n (click)=\"sendRate()\"\n [severity]=\"'primary'\"\n [label]=\"'Send'\"\n type=\"submit\"\n class=\"rtsee-rater-btn-send rts-action-button\"\n >\n <span class=\"pi pi-send\"></span>\n </p-button>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: RateInputComponent, selector: "rtsee-rate-input", inputs: ["config"] }, { kind: "component", type: RateItemComponent, selector: "rtsee-rate-item", inputs: ["group", "rater", "showActions"], outputs: ["edit", "delete"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
2564
+ }
2565
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RaterComponent, decorators: [{
2566
+ type: Component,
2567
+ args: [{ selector: 'rtsee-rater', imports: [Button, RateInputComponent, RateItemComponent, NgClass], template: "<div class=\"rtsee-rater\" [ngClass]=\"{'rtsee-rater-view-mode': rater.userRateGroup && !isEditing}\">\n @if (rater.userRateGroup && !isEditing) {\n <rtsee-rate-item\n [group]=\"rater.userRateGroup\"\n [rater]=\"rater\"\n [showActions]=\"true\"\n (edit)=\"startEdit()\"\n (delete)=\"deleteRate()\"\n ></rtsee-rate-item>\n } @else {\n <div class=\"rtsee-rater-user-header\">\n @if (rater.peer?.imageUrl) {\n <img\n class=\"rtsee-rater-avatar\"\n [src]=\"rater.peer?.imageUrl\"\n alt=\"User avatar\"\n />\n } @else {\n <div class=\"rtsee-rater-avatar-fallback\">\n {{ (rater.peer?.name || \"?\").substring(0, 1) }}\n </div>\n }\n <div class=\"rtsee-rater-user-info\">\n <span class=\"rtsee-rater-user-name\">{{\n rater.peer?.name || \"Anonymous\"\n }}</span>\n <span class=\"rtsee-rater-user-status\">Rating publicly</span>\n </div>\n </div>\n <hr class=\"rtsee-rater-divider\" />\n @for (config of rater.configsWithRates; track config.id) {\n <rtsee-rate-input [config]=\"config\"></rtsee-rate-input>\n }\n <div class=\"rtsee-rater-actions\">\n @if (rater.userRateGroup) {\n <p-button\n (click)=\"sendRate()\"\n [severity]=\"'success'\"\n [label]=\"'Update'\"\n type=\"submit\"\n class=\"rtsee-rater-btn-update rts-action-button\"\n >\n <span class=\"pi pi-check\"></span>\n </p-button>\n <p-button\n (click)=\"deleteRate()\"\n [severity]=\"'danger'\"\n [label]=\"'Delete'\"\n class=\"rtsee-rater-btn-delete rts-action-button\"\n >\n <span class=\"pi pi-trash\"></span>\n </p-button>\n } @else {\n <p-button\n (click)=\"sendRate()\"\n [severity]=\"'primary'\"\n [label]=\"'Send'\"\n type=\"submit\"\n class=\"rtsee-rater-btn-send rts-action-button\"\n >\n <span class=\"pi pi-send\"></span>\n </p-button>\n }\n </div>\n }\n</div>\n" }]
2568
+ }], propDecorators: { entity: [{
2569
+ type: Input
2570
+ }], rater: [{
2571
+ type: Input
2572
+ }] } });
2573
+
2574
+ class RatesListComponent {
2575
+ ngOnInit() {
2576
+ if (this.rater) {
2577
+ this.rater
2578
+ .loadOtherUsersRateGroups(true)
2579
+ .then(() => {
2580
+ console.log('Other users rate groups loaded.');
2581
+ })
2582
+ .catch((err) => {
2583
+ console.error(err);
2584
+ });
2585
+ }
2586
+ }
2587
+ onScroll() {
2588
+ if (this.rater) {
2589
+ this.rater
2590
+ .loadOtherUsersRateGroups()
2591
+ .then(() => {
2592
+ console.log('More other users rate groups loaded.');
2593
+ })
2594
+ .catch((err) => {
2595
+ console.error(err);
2596
+ });
2597
+ }
2598
+ }
2599
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatesListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2600
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RatesListComponent, isStandalone: true, selector: "rtsee-rates-list", inputs: { rater: "rater", entity: "entity" }, ngImport: i0, template: "<div\n class=\"rtsee-rates-list\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolled)=\"onScroll()\"\n>\n @for (group of rater.otherUsersRateGroups; track group.id) {\n <rtsee-rate-item\n [group]=\"group\"\n [rater]=\"rater\"\n [showActions]=\"false\"\n ></rtsee-rate-item>\n }\n @if (rater.loadingRatesGroups) {\n <div class=\"rtsee-rates-list-loading\">Loading more...</div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: RateItemComponent, selector: "rtsee-rate-item", inputs: ["group", "rater", "showActions"], outputs: ["edit", "delete"] }] }); }
2601
+ }
2602
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatesListComponent, decorators: [{
2603
+ type: Component,
2604
+ args: [{ selector: 'rtsee-rates-list', imports: [InfiniteScrollDirective, RateItemComponent], template: "<div\n class=\"rtsee-rates-list\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n [scrollWindow]=\"false\"\n (scrolled)=\"onScroll()\"\n>\n @for (group of rater.otherUsersRateGroups; track group.id) {\n <rtsee-rate-item\n [group]=\"group\"\n [rater]=\"rater\"\n [showActions]=\"false\"\n ></rtsee-rate-item>\n }\n @if (rater.loadingRatesGroups) {\n <div class=\"rtsee-rates-list-loading\">Loading more...</div>\n }\n</div>\n" }]
2605
+ }], propDecorators: { rater: [{
2606
+ type: Input
2607
+ }], entity: [{
2608
+ type: Input
2609
+ }] } });
2610
+
2611
+ class RatingSectionComponent {
2612
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2613
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: RatingSectionComponent, isStandalone: true, selector: "rtsee-rating-section", inputs: { rater: "rater", entity: "entity" }, ngImport: i0, template: "<div class=\"rtsee-rating-section\">\n <rtsee-rater [rater]=\"rater\"\n [entity]=\"entity\"\n ></rtsee-rater>\n <rtsee-rates-list [rater]=\"rater\"\n [entity]=\"entity\"\n ></rtsee-rates-list>\n</div>\n", dependencies: [{ kind: "component", type: RaterComponent, selector: "rtsee-rater", inputs: ["entity", "rater"] }, { kind: "component", type: RatesListComponent, selector: "rtsee-rates-list", inputs: ["rater", "entity"] }] }); }
2614
+ }
2615
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingSectionComponent, decorators: [{
2616
+ type: Component,
2617
+ args: [{ selector: 'rtsee-rating-section', imports: [RaterComponent, RatesListComponent], template: "<div class=\"rtsee-rating-section\">\n <rtsee-rater [rater]=\"rater\"\n [entity]=\"entity\"\n ></rtsee-rater>\n <rtsee-rates-list [rater]=\"rater\"\n [entity]=\"entity\"\n ></rtsee-rates-list>\n</div>\n" }]
2618
+ }], propDecorators: { rater: [{
2619
+ type: Input
2620
+ }], entity: [{
2621
+ type: Input
2622
+ }] } });
2623
+
2624
+ class RtseeEntityPreviewComponent {
2625
+ constructor() {
2626
+ this.rater = null;
2627
+ this.showRating = true;
2628
+ }
2629
+ ngOnInit() {
2630
+ void this.entity.reload();
2631
+ this.rater = new RTSeeRater({
2632
+ entityId: this.entity.id,
2633
+ entityConfigurationId: this.entity.configurationId,
2634
+ ...this.entity.getHandlerCommonOptions(),
2635
+ });
2636
+ }
2637
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2638
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RtseeEntityPreviewComponent, isStandalone: true, selector: "rtsee-entity-preview", inputs: { entity: "entity", messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-entity-preview\">\n <div class=\"rtsee-entity-preview-tags\">\n <rtsee-entity-tags [entity]=\"entity\"></rtsee-entity-tags>\n </div>\n\n @if (showRating && rater) {\n <rtsee-rating-section [entity]=\"entity\"\n [rater]=\"rater\"\n ></rtsee-rating-section>\n } @else if (!showRating && entity.comments && messenger) {\n <div class=\"rtsee-entity-preview-comments\">\n <rtsee-entity-comments [messenger]=\"messenger\"\n [chat]=\"entity.comments\"\n [entity]=\"entity\"\n ></rtsee-entity-comments>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: RtseeEntityCommentsComponent, selector: "rtsee-entity-comments", inputs: ["messenger", "chat", "entity"] }, { kind: "component", type: RtseeEntityTagsComponent, selector: "rtsee-entity-tags", inputs: ["entity"] }, { kind: "component", type: RatingSectionComponent, selector: "rtsee-rating-section", inputs: ["rater", "entity"] }] }); }
2286
2639
  }
2287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PresentationSettingsComponent, decorators: [{
2640
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityPreviewComponent, decorators: [{
2288
2641
  type: Component,
2289
- args: [{ selector: 'rtsee-presentation-settings', imports: [
2290
- Slider,
2291
- Fieldset,
2292
- FormsModule,
2293
- Button,
2294
- Chip,
2295
- Message,
2296
- Tag,
2297
- Listbox,
2298
- JoinCallComponent
2299
- ], template: "<div class=\"rtsee-presentation-settings\">\n <div class=\"rtsee-presentation-settings-header\">\n <p-chip label=\"Settings\" />\n <p-button label=\"Close\"\n (click)=\"settings.collapse()\"\n class=\"rtsee-presentations-dashboard-close-btn\"\n ></p-button>\n </div>\n\n <div class=\"rtsee-presentation-rooms\">\n <p-fieldset legend=\"Rooms\">\n <p-listbox [options]=\"presentation.rooms\"\n [(ngModel)]=\"presentation.selectedRoom\"\n (onChange)=\"presentation.setActiveRoom()\"\n class=\"rtsee-presentation-settings-rooms-list\"\n >\n <ng-template #item let-room>\n <div class=\"rtsee-presentation-settings-rooms-list-item\">\n\n <img [src]=\"room.imageUrl || COMMON_CONSTANTS.defaultProfileImgUrl\"\n class=\"rtsee-presentation-settings-rooms-list-item-image\" />\n <div>{{ room.name }}</div>\n </div>\n </ng-template>\n </p-listbox>\n @if (presentation.selectedRoom) {\n <rtsee-join-call [room]=\"presentation.selectedRoom\"\n [presentation]=\"presentation\"\n ></rtsee-join-call>\n }\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-sound-settings\">\n <p-fieldset legend=\"Volume\" class=\"rtsee-presentation-sound-settings-fieldset\">\n <div class=\"rtsee-presentation-sound-settings-inner\">\n <div class=\"rtsee-presentation-sound-settings-inner-left\">\n <p-slider [(ngModel)]=\"settings.volume\"\n (onChange)=\"settings.setVolume(settings.volume)\"\n />\n </div>\n <div class=\"rtsee-presentation-sound-settings-inner-right\">\n <p-tag severity=\"info\"\n class=\"rtsee-presentation-sound-value-label\"\n [icon]=\"settings.volume ? 'pi pi-volume-up' : 'pi pi-volume-off'\"\n [value]=\"settings.volume.toString()\"\n [rounded]=\"true\" />\n </div>\n </div>\n </p-fieldset>\n </div>\n <div class=\"rtsee-presentation-font-size-settings\">\n <p-fieldset legend=\"Font Size\">\n <div class=\"rtsee-presentation-font-size-range\">\n <p-slider [(ngModel)]=\"settings.fontSizeOption\"\n (onChange)=\"settings.setFontSize(settings.fontSizeOption)\"\n [min]=\"1\"\n [max]=\"10\"\n />\n </div>\n <p-message severity=\"secondary\" class=\"rtsee-presentation-font-size-example\">\n <span [style.font-size]=\"settings.fontSize + 'rem'\">A long time ago in a galaxy far, far away...</span>\n </p-message>\n </p-fieldset>\n </div>\n</div>\n" }]
2300
- }], propDecorators: { settings: [{
2642
+ args: [{ selector: 'rtsee-entity-preview', imports: [
2643
+ RtseeEntityCommentsComponent,
2644
+ RtseeEntityTagsComponent,
2645
+ RatingSectionComponent,
2646
+ ], template: "<div class=\"rtsee-entity-preview\">\n <div class=\"rtsee-entity-preview-tags\">\n <rtsee-entity-tags [entity]=\"entity\"></rtsee-entity-tags>\n </div>\n\n @if (showRating && rater) {\n <rtsee-rating-section [entity]=\"entity\"\n [rater]=\"rater\"\n ></rtsee-rating-section>\n } @else if (!showRating && entity.comments && messenger) {\n <div class=\"rtsee-entity-preview-comments\">\n <rtsee-entity-comments [messenger]=\"messenger\"\n [chat]=\"entity.comments\"\n [entity]=\"entity\"\n ></rtsee-entity-comments>\n </div>\n }\n</div>\n" }]
2647
+ }], propDecorators: { entity: [{
2301
2648
  type: Input
2302
- }], presentation: [{
2649
+ }], messenger: [{
2303
2650
  type: Input
2304
2651
  }] } });
2305
2652
 
2306
2653
  class StoryDetailsComponent {
2654
+ getStarArray(rating) {
2655
+ const stars = [];
2656
+ const val = rating || 0;
2657
+ for (let i = 1; i <= 5; i++) {
2658
+ if (val >= i) {
2659
+ stars.push('full');
2660
+ }
2661
+ else if (val + 0.5 >= i) {
2662
+ stars.push('half');
2663
+ }
2664
+ else {
2665
+ stars.push('empty');
2666
+ }
2667
+ }
2668
+ return stars;
2669
+ }
2307
2670
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: StoryDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2308
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: StoryDetailsComponent, isStandalone: true, selector: "rtsee-story-details", inputs: { story: "story", presentation: "presentation", messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-story-details\">\n <div class=\"rtsee-story-details-image-container\" (click)=\"presentation.setActiveStory(story)\">\n <img [src]=\"story.imageUrl\" alt=\"story_image\" class=\"rtsee-story-details-image\">\n <p-button [label]=\"story.preselectedSlideNumber ? 'Continue Reading' : 'Start Reading'\"\n class=\"rtsee-story-details-start-reading\"\n ></p-button>\n <p-button label=\"Close\"\n class=\"rtsee-story-details-close\"\n severity=\"secondary\"\n (click)=\"presentation.closeStoryDetails()\"\n ></p-button>\n </div>\n <div class=\"rtsee-story-details-title-container\">\n <h1 class=\"rtsee-story-details-title\">{{story.name}}</h1>\n </div>\n @if (story.categories?.length && false) {\n <div class=\"rtsee-story-details-categories\">\n @for (category of story.categories; track category.id) {\n <p-tag [value]=\"category.name\"></p-tag>\n }\n </div>\n }\n\n @if (story.labels?.length) {\n <div class=\"rtsee-story-details-labels\">\n @for (label of story.labels; track label .id) {\n <p-chip class=\"rtsee-story-details-label\">\n <span class=\"rtsee-story-details-label-left\"\n >{{label.symbol}}</span>\n <span class=\"rtsee-story-details-label-right\"\n >{{label.name}}</span>\n </p-chip>\n }\n </div>\n }\n\n <div class=\"rtsee-story-details-description-container\">\n <p class=\"rtsee-story-details-description\">{{story.description}}</p>\n </div>\n <div class=\"rtsee-story-details-description-history\">\n </div>\n @if (story.isPublished) {\n <div class=\"rtsee-story-details-feedback\">\n <p>feedback here</p>\n </div>\n } @else if (messenger && story.discussion) {\n\n <div class=\"rtsee-story-details-votes\">\n <p class=\"rtsee-story-details-comments-label\">Comments</p>\n <rtsee-chat [messenger]=\"messenger\"\n [chatData]=\"story.discussion\"\n ></rtsee-chat>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ChatComponent, selector: "rtsee-chat", inputs: ["chat", "chatData", "messenger"] }] }); }
2671
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: StoryDetailsComponent, isStandalone: true, selector: "rtsee-story-details", inputs: { story: "story", presentation: "presentation", messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-story-details\">\n <section\n class=\"rtsee-story-details-cover\"\n [style.background-image]=\"'url(' + story.imageUrl + ')'\"\n >\n <button\n class=\"rtsee-story-details-btn-close\"\n (click)=\"presentation.closeStoryDetails()\"\n aria-label=\"Close\"\n >\n <span class=\"pi pi-times\"></span>\n </button>\n <div class=\"rtsee-story-details-cover-overlay\"></div>\n <div class=\"rtsee-story-details-cover-content\">\n <div class=\"rtsee-story-details-cover-badges\">\n @if (story.categories?.length) {\n @for (category of story.categories; track category.id) {\n <span class=\"rtsee-story-details-tag-pill\">\n {{ category.name }}\n </span>\n }\n }\n @if (story.tags?.length) {\n @for (tag of story.tags; track tag.id) {\n <span\n class=\"rtsee-story-details-tag-pill rtsee-story-details-tag-pill-label\"\n >\n @if (tag.symbol) {\n <span class=\"symbol\">{{ tag.symbol }}</span>\n }\n {{ tag.name }}\n </span>\n }\n }\n </div>\n\n <h1 class=\"rtsee-story-details-cover-title\">{{ story.name }}</h1>\n\n <div class=\"rtsee-story-details-cover-meta\">\n @if (story.rating !== null) {\n <div class=\"rtsee-story-details-cover-rating\">\n <span class=\"rtsee-story-details-stars\">\n @for (star of getStarArray(story.rating); track $index) {\n <span\n class=\"rtsee-story-details-star\"\n [class.rtsee-story-details-star-full]=\"star === 'full'\"\n [class.rtsee-story-details-star-half]=\"star === 'half'\"\n [class.rtsee-story-details-star-empty]=\"star === 'empty'\"\n >\n @if (star === \"full\") {\n \u2605\n } @else if (star === \"half\") {\n \u2605\n } @else {\n \u2606\n }\n </span>\n }\n </span>\n <span class=\"rtsee-story-details-rating-number\">{{\n story.rating\n }}</span>\n @if (story.ratesCount !== null) {\n <span class=\"rtsee-story-details-rating-count\"\n >({{ story.ratesCount }} ratings)</span\n >\n }\n </div>\n }\n\n <div class=\"rtsee-story-details-cover-info-chips\">\n @if (story.averageReadTime) {\n <span class=\"rtsee-story-details-info-chip\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n {{ story.averageReadTime }} min\n </span>\n }\n @if (story.totalSlides) {\n <span class=\"rtsee-story-details-info-chip\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\" />\n <path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\" />\n </svg>\n {{ story.totalSlides }} slides\n </span>\n }\n </div>\n </div>\n </div>\n </section>\n\n <!-- CONTENT AREA -->\n <div class=\"rtsee-story-details-content-wrapper\">\n <div class=\"rtsee-story-details-cover-actions\">\n <p-button\n (click)=\"presentation.setActiveStory(story)\"\n [severity]=\"'primary'\"\n [label]=\"story.preselectedSlideNumber ? 'Continue Reading' : 'Start Reading'\"\n class=\"rtsee-story-details-start-reading rts-action-button\"\n >\n </p-button>\n </div>\n <div class=\"rtsee-story-details-content-grid\">\n <!-- Description Card -->\n <article class=\"rtsee-story-details-glass-card\">\n <div class=\"rtsee-story-details-glass-card-header\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\" />\n <path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\" />\n </svg>\n <h2>About This Story</h2>\n </div>\n <p class=\"rtsee-story-details-glass-card-text\">\n {{ story.description }}\n </p>\n </article>\n </div>\n\n @if (messenger) {\n <rtsee-entity-preview\n [entity]=\"story\"\n [messenger]=\"messenger\"\n ></rtsee-entity-preview>\n }\n\n @if (story.categories?.length && false) {\n <div class=\"rtsee-story-details-categories\">\n @for (category of story.categories; track category.id) {\n <p-tag [value]=\"category.name\"></p-tag>\n }\n </div>\n }\n\n @if (story.tags?.length && false) {\n <div class=\"rtsee-story-details-labels\">\n @for (tag of story.tags; track tag.id) {\n <p-chip class=\"rtsee-story-details-label\">\n @if (tag.symbol) {\n <span class=\"rtsee-story-details-label-left\">{{\n tag.symbol\n }}</span>\n }\n <span class=\"rtsee-story-details-label-right\">{{\n tag.name\n }}</span>\n </p-chip>\n }\n </div>\n }\n\n <div class=\"rtsee-story-details-description-history\"></div>\n @if (story.isPublished && false) {\n <div class=\"rtsee-story-details-feedback\">\n <p>feedback here</p>\n </div>\n } @else if (messenger && story.discussion && false) {\n <div class=\"rtsee-story-details-votes\">\n <p class=\"rtsee-story-details-comments-label\">Comments</p>\n <rtsee-chat\n [messenger]=\"messenger\"\n [chatData]=\"story.discussion\"\n ></rtsee-chat>\n </div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ChatComponent, selector: "rtsee-chat", inputs: ["chat", "chatData", "entity", "messenger"] }, { kind: "component", type: RtseeEntityPreviewComponent, selector: "rtsee-entity-preview", inputs: ["entity", "messenger"] }] }); }
2309
2672
  }
2310
2673
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: StoryDetailsComponent, decorators: [{
2311
2674
  type: Component,
2312
- args: [{ selector: 'rtsee-story-details', imports: [
2313
- Chip,
2314
- Tag,
2315
- Button,
2316
- ChatComponent
2317
- ], template: "<div class=\"rtsee-story-details\">\n <div class=\"rtsee-story-details-image-container\" (click)=\"presentation.setActiveStory(story)\">\n <img [src]=\"story.imageUrl\" alt=\"story_image\" class=\"rtsee-story-details-image\">\n <p-button [label]=\"story.preselectedSlideNumber ? 'Continue Reading' : 'Start Reading'\"\n class=\"rtsee-story-details-start-reading\"\n ></p-button>\n <p-button label=\"Close\"\n class=\"rtsee-story-details-close\"\n severity=\"secondary\"\n (click)=\"presentation.closeStoryDetails()\"\n ></p-button>\n </div>\n <div class=\"rtsee-story-details-title-container\">\n <h1 class=\"rtsee-story-details-title\">{{story.name}}</h1>\n </div>\n @if (story.categories?.length && false) {\n <div class=\"rtsee-story-details-categories\">\n @for (category of story.categories; track category.id) {\n <p-tag [value]=\"category.name\"></p-tag>\n }\n </div>\n }\n\n @if (story.labels?.length) {\n <div class=\"rtsee-story-details-labels\">\n @for (label of story.labels; track label .id) {\n <p-chip class=\"rtsee-story-details-label\">\n <span class=\"rtsee-story-details-label-left\"\n >{{label.symbol}}</span>\n <span class=\"rtsee-story-details-label-right\"\n >{{label.name}}</span>\n </p-chip>\n }\n </div>\n }\n\n <div class=\"rtsee-story-details-description-container\">\n <p class=\"rtsee-story-details-description\">{{story.description}}</p>\n </div>\n <div class=\"rtsee-story-details-description-history\">\n </div>\n @if (story.isPublished) {\n <div class=\"rtsee-story-details-feedback\">\n <p>feedback here</p>\n </div>\n } @else if (messenger && story.discussion) {\n\n <div class=\"rtsee-story-details-votes\">\n <p class=\"rtsee-story-details-comments-label\">Comments</p>\n <rtsee-chat [messenger]=\"messenger\"\n [chatData]=\"story.discussion\"\n ></rtsee-chat>\n </div>\n }\n</div>\n" }]
2675
+ args: [{ selector: 'rtsee-story-details', imports: [Chip, Tag, Button, ChatComponent, RtseeEntityPreviewComponent], template: "<div class=\"rtsee-story-details\">\n <section\n class=\"rtsee-story-details-cover\"\n [style.background-image]=\"'url(' + story.imageUrl + ')'\"\n >\n <button\n class=\"rtsee-story-details-btn-close\"\n (click)=\"presentation.closeStoryDetails()\"\n aria-label=\"Close\"\n >\n <span class=\"pi pi-times\"></span>\n </button>\n <div class=\"rtsee-story-details-cover-overlay\"></div>\n <div class=\"rtsee-story-details-cover-content\">\n <div class=\"rtsee-story-details-cover-badges\">\n @if (story.categories?.length) {\n @for (category of story.categories; track category.id) {\n <span class=\"rtsee-story-details-tag-pill\">\n {{ category.name }}\n </span>\n }\n }\n @if (story.tags?.length) {\n @for (tag of story.tags; track tag.id) {\n <span\n class=\"rtsee-story-details-tag-pill rtsee-story-details-tag-pill-label\"\n >\n @if (tag.symbol) {\n <span class=\"symbol\">{{ tag.symbol }}</span>\n }\n {{ tag.name }}\n </span>\n }\n }\n </div>\n\n <h1 class=\"rtsee-story-details-cover-title\">{{ story.name }}</h1>\n\n <div class=\"rtsee-story-details-cover-meta\">\n @if (story.rating !== null) {\n <div class=\"rtsee-story-details-cover-rating\">\n <span class=\"rtsee-story-details-stars\">\n @for (star of getStarArray(story.rating); track $index) {\n <span\n class=\"rtsee-story-details-star\"\n [class.rtsee-story-details-star-full]=\"star === 'full'\"\n [class.rtsee-story-details-star-half]=\"star === 'half'\"\n [class.rtsee-story-details-star-empty]=\"star === 'empty'\"\n >\n @if (star === \"full\") {\n \u2605\n } @else if (star === \"half\") {\n \u2605\n } @else {\n \u2606\n }\n </span>\n }\n </span>\n <span class=\"rtsee-story-details-rating-number\">{{\n story.rating\n }}</span>\n @if (story.ratesCount !== null) {\n <span class=\"rtsee-story-details-rating-count\"\n >({{ story.ratesCount }} ratings)</span\n >\n }\n </div>\n }\n\n <div class=\"rtsee-story-details-cover-info-chips\">\n @if (story.averageReadTime) {\n <span class=\"rtsee-story-details-info-chip\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n {{ story.averageReadTime }} min\n </span>\n }\n @if (story.totalSlides) {\n <span class=\"rtsee-story-details-info-chip\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\" />\n <path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\" />\n </svg>\n {{ story.totalSlides }} slides\n </span>\n }\n </div>\n </div>\n </div>\n </section>\n\n <!-- CONTENT AREA -->\n <div class=\"rtsee-story-details-content-wrapper\">\n <div class=\"rtsee-story-details-cover-actions\">\n <p-button\n (click)=\"presentation.setActiveStory(story)\"\n [severity]=\"'primary'\"\n [label]=\"story.preselectedSlideNumber ? 'Continue Reading' : 'Start Reading'\"\n class=\"rtsee-story-details-start-reading rts-action-button\"\n >\n </p-button>\n </div>\n <div class=\"rtsee-story-details-content-grid\">\n <!-- Description Card -->\n <article class=\"rtsee-story-details-glass-card\">\n <div class=\"rtsee-story-details-glass-card-header\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\" />\n <path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\" />\n </svg>\n <h2>About This Story</h2>\n </div>\n <p class=\"rtsee-story-details-glass-card-text\">\n {{ story.description }}\n </p>\n </article>\n </div>\n\n @if (messenger) {\n <rtsee-entity-preview\n [entity]=\"story\"\n [messenger]=\"messenger\"\n ></rtsee-entity-preview>\n }\n\n @if (story.categories?.length && false) {\n <div class=\"rtsee-story-details-categories\">\n @for (category of story.categories; track category.id) {\n <p-tag [value]=\"category.name\"></p-tag>\n }\n </div>\n }\n\n @if (story.tags?.length && false) {\n <div class=\"rtsee-story-details-labels\">\n @for (tag of story.tags; track tag.id) {\n <p-chip class=\"rtsee-story-details-label\">\n @if (tag.symbol) {\n <span class=\"rtsee-story-details-label-left\">{{\n tag.symbol\n }}</span>\n }\n <span class=\"rtsee-story-details-label-right\">{{\n tag.name\n }}</span>\n </p-chip>\n }\n </div>\n }\n\n <div class=\"rtsee-story-details-description-history\"></div>\n @if (story.isPublished && false) {\n <div class=\"rtsee-story-details-feedback\">\n <p>feedback here</p>\n </div>\n } @else if (messenger && story.discussion && false) {\n <div class=\"rtsee-story-details-votes\">\n <p class=\"rtsee-story-details-comments-label\">Comments</p>\n <rtsee-chat\n [messenger]=\"messenger\"\n [chatData]=\"story.discussion\"\n ></rtsee-chat>\n </div>\n }\n </div>\n</div>\n" }]
2318
2676
  }], propDecorators: { story: [{
2319
2677
  type: Input
2320
2678
  }], presentation: [{
@@ -2340,7 +2698,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2340
2698
  PreloaderComponent,
2341
2699
  PresentationsDashboardComponent,
2342
2700
  PresentationSettingsComponent,
2343
- StoryDetailsComponent
2701
+ StoryDetailsComponent,
2344
2702
  ], standalone: true, template: "<div class=\"rtsee-presentation\">\n <div class=\"rtsee-presentation-header-block\">\n <rtsee-presentation-header [presentation]=\"presentation\"\n ></rtsee-presentation-header>\n </div>\n\n @if (presentation.storyLoadInProgress) {\n <rtsee-preloader [diameter]=\"15\"></rtsee-preloader>\n }\n\n @if(presentation.isDashboardOpen && presentation.dashboard) {\n <rtsee-presentations-dashboard [dashboard]=\"presentation.dashboard\"\n ></rtsee-presentations-dashboard>\n }\n\n @if (presentation.settings.isExpanded) {\n <rtsee-presentation-settings [settings]=\"presentation.settings\"\n [presentation]=\"presentation\"\n ></rtsee-presentation-settings>\n }\n\n @if (presentation.isCategoriesListVisible && !presentation.storyLoadInProgress) {\n <div class=\"rtsee-presentation-categories-list\">\n @if (presentation.categoriesLoadInProgress) {\n <rtsee-preloader [diameter]=\"15\"></rtsee-preloader>\n }\n\n @if (presentation.activeSessionsStories.length) {\n <div class=\"rtsee-presentation-category-header\">\n <h2 class=\"rtsee-presentation-category-name\">{{presentation.labels[RTSeeTextLabelKeys.CONTINUE_SESSIONS_LABEL]}}</h2>\n </div>\n <div class=\"rtsee-presentation-stories-list\">\n @for (story of presentation.activeSessionsStories; track story.id) {\n <div class=\"rtsee-presentation-story-thumbnail-container\"\n (click)=\"presentation.openStoryDetails(story.id, story.preselectedSlideNumber || undefined)\"\n >\n <rtsee-story-thumbnail\n [story]=\"story\"\n ></rtsee-story-thumbnail>\n </div>\n }\n </div>\n }\n\n @for (category of presentation.categories; track category.id) {\n <div class=\"rtsee-presentation-category-header\">\n <h2 class=\"rtsee-presentation-category-name\">{{ category.name }}</h2>\n <span class=\"rtsee-presentation-category-description\">{{ category.description }}</span>\n </div>\n <div class=\"rtsee-presentation-stories-list\">\n @for (story of category.stories; track story.id) {\n <div class=\"rtsee-presentation-story-thumbnail-container\"\n (click)=\"presentation.openStoryDetails(story.id)\"\n >\n <rtsee-story-thumbnail\n [story]=\"story\"\n ></rtsee-story-thumbnail>\n </div>\n }\n </div>\n }\n </div>\n }\n\n @if (presentation.activeStory && !presentation.isDashboardOpen) {\n <div class=\"rtsee-presentation-story-viewer-container\">\n <rtsee-story-player [story]=\"presentation.activeStory\"\n [settings]=\"presentation.settings\"\n ></rtsee-story-player>\n </div>\n } @else if (presentation.openedStoryDetails && !presentation.isDashboardOpen) {\n <rtsee-story-details [story]=\"presentation.openedStoryDetails\"\n [presentation]=\"presentation\"\n [messenger]=\"messenger\"\n ></rtsee-story-details>\n }\n</div>\n" }]
2345
2703
  }], ctorParameters: () => [], propDecorators: { presentation: [{
2346
2704
  type: Input
@@ -2371,12 +2729,9 @@ class RtseeNavComponent {
2371
2729
  console.log('RTSeeContainer: user peer not found');
2372
2730
  return false;
2373
2731
  }
2374
- const profileRoute = this.config.routes
2375
- .find((r) => r.rtseeRoute === RTSeeRoutesList.PROFILE) || null;
2376
- const dashboardRoute = this.config.routes
2377
- .find((r) => r.rtseeRoute === RTSeeRoutesList.EVENTS_DASHBOARD) || null;
2378
- const messengerRoute = this.config.routes
2379
- .find((r) => r.rtseeRoute === RTSeeRoutesList.MESSENGER) || null;
2732
+ const profileRoute = this.config.routes.find((r) => r.rtseeRoute === RTSeeRoutesList.PROFILE) || null;
2733
+ const dashboardRoute = this.config.routes.find((r) => r.rtseeRoute === RTSeeRoutesList.EVENTS_DASHBOARD) || null;
2734
+ const messengerRoute = this.config.routes.find((r) => r.rtseeRoute === RTSeeRoutesList.MESSENGER) || null;
2380
2735
  if (dashboardRoute) {
2381
2736
  dashboardRoute.isEnabled = hasPermission(peer, RTSeePeerPermissions.ACCESS_EVENTS_DASHBOARD);
2382
2737
  }
@@ -2403,7 +2758,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2403
2758
  Avatar,
2404
2759
  Image,
2405
2760
  Divider,
2406
- Tooltip
2761
+ Tooltip,
2407
2762
  ], standalone: true, template: "<div class=\"rtsee-nav\">\n @if (config.siteLogo) {\n <div class=\"rtsee-site-logo\">\n <p-image [src]=\"config.siteLogo.src\" class=\"rtsee-site-logo-image\"></p-image>\n <p-divider class=\"rtsee-site-logo-divider\" />\n </div>\n }\n <div class=\"rtsee-nav-bar\">\n @for (route of config.routes; track route.name) {\n <a [routerLink]=\"route.link\"\n routerLinkActive=\"rtsee-nav-item-active\"\n [ngClass]=\"{'rtsee-nav-item-hidden': !route.isEnabled || !route.iconClassName}\"\n [routerLinkActiveOptions]=\"{ exact: route.exactActiveLinkMatcher || false }\"\n class=\"rtsee-nav-item\"\n [pTooltip]=\"route.name\"\n >\n <span [ngClass]=\"route.iconClassName\"\n class=\"rtsee-nav-item-icon\" >\n </span>\n </a>\n }\n <p-avatar [image]=\"rtsee.socketConnection?.myPeer?.imageUrl\"\n class=\"rtsee-nav-item rtsee-nav-image rtsee-nav-profile\"\n [routerLink]=\"profileLink\"\n routerLinkActive=\"rtsee-nav-item-active\"\n [routerLinkActiveOptions]=\"{exact: true}\"\n [queryParams]=\"queryParams\"\n ></p-avatar>\n </div>\n</div>\n" }]
2408
2763
  }], ctorParameters: () => [{ type: RTSeeAuthService }], propDecorators: { config: [{
2409
2764
  type: Input
@@ -2421,9 +2776,11 @@ class RTSeeContainerComponent {
2421
2776
  }
2422
2777
  ngOnInit() {
2423
2778
  this.authService.init(this.auth);
2424
- this.routeSubscription = this.router.events.pipe(
2779
+ this.routeSubscription = this.router.events
2780
+ .pipe(
2425
2781
  // Filter for the NavigationEnd event to know when navigation is complete
2426
- filter((event) => event instanceof NavigationEnd)).subscribe((event) => {
2782
+ filter((event) => event instanceof NavigationEnd))
2783
+ .subscribe((event) => {
2427
2784
  this.defineSideNavState(event.url);
2428
2785
  });
2429
2786
  }
@@ -2433,12 +2790,12 @@ class RTSeeContainerComponent {
2433
2790
  defineSideNavState(url) {
2434
2791
  const isBase = url === '/' || url.startsWith('/?');
2435
2792
  const routeUrlSplit = url.split('/');
2436
- const rootRoutePath = isBase ? '' : (routeUrlSplit[1] || null);
2793
+ const rootRoutePath = isBase ? '' : routeUrlSplit[1] || null;
2437
2794
  if (!rootRoutePath && !isBase) {
2438
2795
  return;
2439
2796
  }
2440
- const rtseeRoute = this.navigationConfig.routes
2441
- .find((rn) => rn.link === rootRoutePath) || null;
2797
+ const rtseeRoute = this.navigationConfig.routes.find((rn) => rn.link === rootRoutePath) ||
2798
+ null;
2442
2799
  if (!rtseeRoute) {
2443
2800
  return;
2444
2801
  }
@@ -2456,7 +2813,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2456
2813
  MessengerComponent,
2457
2814
  RtseeEventsDashboardComponent,
2458
2815
  PresentationComponent,
2459
- RtseeNavComponent
2816
+ RtseeNavComponent,
2460
2817
  ], standalone: true, template: "<div class=\"rtsee-shell\"\n [ngClass]=\"{\n 'rtsee-shell-conference-mode': rtsee.conference && rtsee.conference.isInActiveCall,\n 'rtsee-shell-messenger-active': rtsee.messenger && rtsee.activeTab === 'messenger',\n 'rtsee-shell-dashboard-active': rtsee.eventsDashboard && rtsee.activeTab === 'events-dashboard',\n 'rtsee-shell-presentation-active': rtsee.presentation && rtsee.activeTab === 'presentation',\n 'rtsee-shell-side-nav-expanded': isSidenavExpanded,\n 'rtsee-shell-side-nav-is-content': isSidenavContent,\n 'rtsee-shell-side-nav-full-screen': isSidenavFullScreen\n }\"\n>\n <div class=\"rtsee-nav-block\">\n <rtsee-nav [config]=\"navigationConfig\" [rtsee]=\"rtsee\"></rtsee-nav>\n </div>\n\n <div class=\"rtsee-shell-panel\">\n <div class=\"rtsee-shell-panel-inner\">\n @if (rtsee.conference && rtsee.conference.isInActiveCall) {\n <div class=\"rtsee-conference-container\">\n <rtsee-conference [rtSee]=\"rtsee.conference\"\n ></rtsee-conference>\n </div>\n }\n\n @if (rtsee.messenger) {\n <div class=\"rtsee-messenger-container\">\n <rtsee-messenger [messenger]=\"rtsee.messenger\"\n ></rtsee-messenger>\n </div>\n }\n\n @if (rtsee.eventsDashboard && rtsee.eventsDashboard.isReady) {\n <div class=\"rtsee-events-dashboard-container\">\n <rtsee-events-dashboard [eventsDashboard]=\"rtsee.eventsDashboard\"\n ></rtsee-events-dashboard>\n </div>\n }\n\n @if (rtsee.presentation && rtsee.presentation.isActive) {\n <div class=\"rtsee-presentation-container\">\n <rtsee-presentation [presentation]=\"rtsee.presentation\"\n [messenger]=\"rtsee.messenger\"\n ></rtsee-presentation>\n </div>\n }\n </div>\n </div>\n\n <div class=\"rtsee-content\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
2461
2818
  }], ctorParameters: () => [{ type: RTSeeAuthService }, { type: i2.Router }], propDecorators: { rtsee: [{
2462
2819
  type: Input
@@ -2472,11 +2829,13 @@ class RtseeTagsAccordionMenuComponent {
2472
2829
  this.onTagClicked = output();
2473
2830
  }
2474
2831
  ngOnInit() {
2475
- this.manageTags.loadTags()
2832
+ this.manageTags
2833
+ .loadTags()
2476
2834
  .then(() => {
2477
2835
  this.items = this.tagsToItems(this.manageTags.tags);
2478
2836
  console.log(this.items);
2479
- }).catch((err) => {
2837
+ })
2838
+ .catch((err) => {
2480
2839
  console.log(err);
2481
2840
  });
2482
2841
  }
@@ -2489,7 +2848,7 @@ class RtseeTagsAccordionMenuComponent {
2489
2848
  isSelected: false,
2490
2849
  command: () => {
2491
2850
  this.onTagClicked.emit(t);
2492
- }
2851
+ },
2493
2852
  };
2494
2853
  });
2495
2854
  }
@@ -2498,33 +2857,11 @@ class RtseeTagsAccordionMenuComponent {
2498
2857
  }
2499
2858
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeTagsAccordionMenuComponent, decorators: [{
2500
2859
  type: Component,
2501
- args: [{ selector: 'rtsee-tags-accordion', imports: [
2502
- PanelMenu
2503
- ], template: "<div class=\"rtsee-tags-accordion\">\n <p-panel-menu [model]=\"items\"/>\n</div>\n" }]
2860
+ args: [{ selector: 'rtsee-tags-accordion', imports: [PanelMenu], template: "<div class=\"rtsee-tags-accordion\">\n <p-panel-menu [model]=\"items\"/>\n</div>\n" }]
2504
2861
  }], propDecorators: { manageTags: [{
2505
2862
  type: Input
2506
2863
  }] } });
2507
2864
 
2508
- class RecursiveSelectComponent {
2509
- constructor() {
2510
- this.value = undefined;
2511
- }
2512
- ngOnInit() {
2513
- this.value = this.selectModel.value;
2514
- }
2515
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RecursiveSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2516
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RecursiveSelectComponent, isStandalone: true, selector: "rtsee-recursive-select", inputs: { selectModel: "selectModel" }, ngImport: i0, template: "<div class=\"rtsee-recursive-select\">\n @for (item of selectModel.selectionHierarchy; track item.level) {\n <div class=\"rtsee-form-field-container\">\n <p-select [options]=\"item.children\"\n [(ngModel)]=\"item.selected\"\n [optionLabel]=\"'label'\"\n [placeholder]=\"selectModel.placeholderValue\"\n (onChange)=\"selectModel.onSelectionChanged(item.selected, item.level)\"\n class=\"rtsee-form-field\"\n />\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
2517
- }
2518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RecursiveSelectComponent, decorators: [{
2519
- type: Component,
2520
- args: [{ selector: 'rtsee-recursive-select', imports: [
2521
- Select,
2522
- FormsModule
2523
- ], template: "<div class=\"rtsee-recursive-select\">\n @for (item of selectModel.selectionHierarchy; track item.level) {\n <div class=\"rtsee-form-field-container\">\n <p-select [options]=\"item.children\"\n [(ngModel)]=\"item.selected\"\n [optionLabel]=\"'label'\"\n [placeholder]=\"selectModel.placeholderValue\"\n (onChange)=\"selectModel.onSelectionChanged(item.selected, item.level)\"\n class=\"rtsee-form-field\"\n />\n </div>\n }\n</div>\n" }]
2524
- }], propDecorators: { selectModel: [{
2525
- type: Input
2526
- }] } });
2527
-
2528
2865
  class RtseeTagManageComponent {
2529
2866
  constructor(formBuilder) {
2530
2867
  this.formBuilder = formBuilder;
@@ -2541,7 +2878,7 @@ class RtseeTagManageComponent {
2541
2878
  this.presetFields(this.manageTags.activeTag);
2542
2879
  }
2543
2880
  async presetParent() {
2544
- console.log("presetParent", this.manageTags.activeTag);
2881
+ console.log('presetParent', this.manageTags.activeTag);
2545
2882
  if (!this.manageTags.activeTag) {
2546
2883
  return;
2547
2884
  }
@@ -2559,7 +2896,7 @@ class RtseeTagManageComponent {
2559
2896
  return Promise.resolve(null);
2560
2897
  }
2561
2898
  return this.manageTags.getTag(tag.parentId);
2562
- }
2899
+ },
2563
2900
  };
2564
2901
  console.log('active tag', this.manageTags.activeTag);
2565
2902
  if (this.manageTags.activeTag.parentId) {
@@ -2568,7 +2905,9 @@ class RtseeTagManageComponent {
2568
2905
  this.tagsRecursiveSelect = new RecursiveSelect(selectOptions);
2569
2906
  }
2570
2907
  async submit() {
2571
- if (this.tagForm.invalid || !this.manageTags.peer.rtseeAppId || !this.manageTags.activeTag) {
2908
+ if (this.tagForm.invalid ||
2909
+ !this.manageTags.peer.rtseeAppId ||
2910
+ !this.manageTags.activeTag) {
2572
2911
  console.log('Form Invalid!');
2573
2912
  return;
2574
2913
  }
@@ -2577,12 +2916,12 @@ class RtseeTagManageComponent {
2577
2916
  name: this.nameField.getRawValue(),
2578
2917
  description: this.descriptionField.getRawValue(),
2579
2918
  applicationId: this.manageTags.applicationId,
2580
- parentId
2919
+ parentId,
2581
2920
  };
2582
2921
  if (this.manageTags.activeTag.id) {
2583
2922
  const options = {
2584
2923
  id: this.manageTags.activeTag.id,
2585
- ...tagParams
2924
+ ...tagParams,
2586
2925
  };
2587
2926
  await this.manageTags.updateTag(options);
2588
2927
  }
@@ -2606,28 +2945,22 @@ class RtseeTagManageComponent {
2606
2945
  validators: [
2607
2946
  Validators.required,
2608
2947
  Validators.minLength(3),
2609
- Validators.maxLength(131)
2610
- ]
2948
+ Validators.maxLength(131),
2949
+ ],
2611
2950
  }),
2612
2951
  description: this.formBuilder.control('', {
2613
2952
  validators: [
2614
2953
  Validators.required,
2615
2954
  Validators.minLength(6),
2616
- Validators.maxLength(244)
2617
- ]
2955
+ Validators.maxLength(244),
2956
+ ],
2618
2957
  }),
2619
2958
  iconClass: this.formBuilder.control('', {
2620
- validators: [
2621
- Validators.minLength(1),
2622
- Validators.maxLength(244)
2623
- ]
2959
+ validators: [Validators.minLength(1), Validators.maxLength(244)],
2624
2960
  }),
2625
2961
  value: this.formBuilder.control('', {
2626
- validators: [
2627
- Validators.minLength(1),
2628
- Validators.maxLength(244)
2629
- ]
2630
- })
2962
+ validators: [Validators.minLength(1), Validators.maxLength(244)],
2963
+ }),
2631
2964
  });
2632
2965
  }
2633
2966
  get nameField() {
@@ -2657,7 +2990,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2657
2990
  Textarea,
2658
2991
  ReactiveFormsModule,
2659
2992
  RecursiveSelectComponent,
2660
- Divider
2993
+ Divider,
2661
2994
  ], template: "<div class=\"rtsee-manage-tag\">\n <div class=\"rtsee-manage-tag-info rtsee-form-container\">\n <form class=\"rtsee-tag-form rtsee-form\"\n [formGroup]=\"tagForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-label-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-story-label-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n @if (tagsRecursiveSelect && manageTags.activeTag) {\n <div class=\"rtsee-select-tag-container\">\n <p-divider></p-divider>\n <p>Parent Tag</p>\n <rtsee-recursive-select [selectModel]=\"tagsRecursiveSelect\"\n ></rtsee-recursive-select>\n <p-divider></p-divider>\n </div>\n }\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-label-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-label-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-label-symbol-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"iconClassField\"\n [class.p-invalid]=\"iconClassField.invalid && iconClassField.touched\"\n />\n <label for=\"rtsee-story-label-symbol-field\">Symbol</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (iconClassField.hasError('required') && iconClassField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Symbol is required, pick a smile, dummy</p-message>\n }\n </div>\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageTags.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageTags.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
2662
2995
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageTags: [{
2663
2996
  type: Input
@@ -2670,15 +3003,17 @@ class RtseeTagGroupsManageComponent {
2670
3003
  this.onTagGroupClicked = output();
2671
3004
  }
2672
3005
  ngOnInit() {
2673
- this.manageTagGroups.loadTagGroups()
3006
+ this.manageTagGroups
3007
+ .loadTagGroups()
2674
3008
  .then(() => {
2675
3009
  this.items = this.tagGroupsToItems(this.manageTagGroups.tagGroups);
2676
- }).catch((err) => {
3010
+ })
3011
+ .catch((err) => {
2677
3012
  console.log(err);
2678
3013
  });
2679
3014
  }
2680
3015
  tagGroupsToItems(tagGroups) {
2681
- console.log("tagGroupsToItems", tagGroups);
3016
+ console.log('tagGroupsToItems', tagGroups);
2682
3017
  return tagGroups.map((tg) => {
2683
3018
  return {
2684
3019
  label: tg.name,
@@ -2686,7 +3021,7 @@ class RtseeTagGroupsManageComponent {
2686
3021
  command: () => {
2687
3022
  this.selectedTagGroup = tg;
2688
3023
  this.onTagGroupClicked.emit(tg);
2689
- }
3024
+ },
2690
3025
  };
2691
3026
  });
2692
3027
  }
@@ -2695,9 +3030,7 @@ class RtseeTagGroupsManageComponent {
2695
3030
  }
2696
3031
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeTagGroupsManageComponent, decorators: [{
2697
3032
  type: Component,
2698
- args: [{ selector: 'rtsee-rtsee-tag-groups-manage', imports: [
2699
- Menu
2700
- ], template: "<div class=\"rtsee-manage-tag-groups\">\n <p-menu [model]=\"items\" />\n</div>\n" }]
3033
+ args: [{ selector: 'rtsee-rtsee-tag-groups-manage', imports: [Menu], template: "<div class=\"rtsee-manage-tag-groups\">\n <p-menu [model]=\"items\" />\n</div>\n" }]
2701
3034
  }], propDecorators: { manageTagGroups: [{
2702
3035
  type: Input
2703
3036
  }] } });
@@ -2728,12 +3061,12 @@ class RtseeTagGroupManageComponent {
2728
3061
  const tagGroupParams = {
2729
3062
  name: this.nameField.getRawValue(),
2730
3063
  description: this.descriptionField.getRawValue(),
2731
- applicationId: this.manageTagGroups.peer.rtseeAppId
3064
+ applicationId: this.manageTagGroups.peer.rtseeAppId,
2732
3065
  };
2733
3066
  if (this.manageTagGroups.activeTagGroup.id) {
2734
3067
  await this.manageTagGroups.updateTagGroup({
2735
3068
  ...tagGroupParams,
2736
- id: this.manageTagGroups.activeTagGroup.id
3069
+ id: this.manageTagGroups.activeTagGroup.id,
2737
3070
  });
2738
3071
  }
2739
3072
  else {
@@ -2753,16 +3086,16 @@ class RtseeTagGroupManageComponent {
2753
3086
  validators: [
2754
3087
  Validators.required,
2755
3088
  Validators.minLength(3),
2756
- Validators.maxLength(131)
2757
- ]
3089
+ Validators.maxLength(131),
3090
+ ],
2758
3091
  }),
2759
3092
  description: this.formBuilder.control('', {
2760
3093
  validators: [
2761
3094
  Validators.required,
2762
3095
  Validators.minLength(6),
2763
- Validators.maxLength(244)
2764
- ]
2765
- })
3096
+ Validators.maxLength(244),
3097
+ ],
3098
+ }),
2766
3099
  });
2767
3100
  }
2768
3101
  get nameField() {
@@ -2784,7 +3117,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2784
3117
  Message,
2785
3118
  ReactiveFormsModule,
2786
3119
  Textarea,
2787
- AutocompleteComponent
3120
+ AutocompleteComponent,
2788
3121
  ], template: "<div class=\"rtsee-manage-tag-group\">\n <div class=\"rtsee-manage-tag-group-info rtsee-form-container\">\n <form class=\"rtsee-tag-form rtsee-form\"\n [formGroup]=\"tagGroupForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-story-label-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-story-label-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-story-label-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-story-label-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n\n @if (manageTagGroups && manageTagGroups.tagsMultiselect) {\n <div class=\"rtsee-form-field-container\">\n <rtsee-autocomplete [config]=\"manageTagGroups.tagsMultiselect\"></rtsee-autocomplete>\n </div>\n }\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageTagGroups.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageTagGroups.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
2789
3122
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageTagGroups: [{
2790
3123
  type: Input
@@ -2796,15 +3129,17 @@ class EntitiesConfigurationsListComponent {
2796
3129
  this.onConfigurationClicked = output();
2797
3130
  }
2798
3131
  ngOnInit() {
2799
- this.manageEntityConfigurations.loadEntityConfigurations()
3132
+ this.manageEntityConfigurations
3133
+ .loadEntityConfigurations()
2800
3134
  .then(() => {
2801
3135
  this.items = this.configurationsToItems(this.manageEntityConfigurations.entityConfigurations);
2802
- }).catch((err) => {
3136
+ })
3137
+ .catch((err) => {
2803
3138
  console.log(err);
2804
3139
  });
2805
3140
  }
2806
3141
  configurationsToItems(entityConfigurations) {
2807
- console.log("entityConfigsToItems", entityConfigurations);
3142
+ console.log('entityConfigsToItems', entityConfigurations);
2808
3143
  return entityConfigurations.map((ec) => {
2809
3144
  return {
2810
3145
  label: ec.name,
@@ -2812,7 +3147,7 @@ class EntitiesConfigurationsListComponent {
2812
3147
  command: () => {
2813
3148
  this.selectedEntityConfiguration = ec;
2814
3149
  this.onConfigurationClicked.emit(ec);
2815
- }
3150
+ },
2816
3151
  };
2817
3152
  });
2818
3153
  }
@@ -2821,118 +3156,189 @@ class EntitiesConfigurationsListComponent {
2821
3156
  }
2822
3157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: EntitiesConfigurationsListComponent, decorators: [{
2823
3158
  type: Component,
2824
- args: [{ selector: 'rtsee-entities-configurations-list', imports: [
2825
- Menu
2826
- ], template: "<div class=\"rtsee-entities-configurations-list\">\n <p-menu [model]=\"items\" />\n</div>\n" }]
3159
+ args: [{ selector: 'rtsee-entities-configurations-list', imports: [Menu], template: "<div class=\"rtsee-entities-configurations-list\">\n <p-menu [model]=\"items\" />\n</div>\n" }]
2827
3160
  }], propDecorators: { manageEntityConfigurations: [{
2828
3161
  type: Input
2829
3162
  }] } });
2830
3163
 
2831
- class ManageEntityConfigurationComponent {
3164
+ class ManageRatingConfigurationComponent {
2832
3165
  constructor(formBuilder) {
2833
3166
  this.formBuilder = formBuilder;
2834
- this.entityConfigurationForm = this.getEntityConfigurationForm();
3167
+ this.ratingConfigurationForm = this.getRatingConfigurationForm();
2835
3168
  }
2836
3169
  ngOnInit() {
2837
- if (!this.manageEntityConfigurations.activeEntityConfiguration) {
2838
- this.manageEntityConfigurations.setBlankActiveEntityConfiguration();
2839
- }
2840
- if (!this.manageEntityConfigurations.activeEntityConfiguration) {
2841
- throw new Error(`Active entityConfig should be selected`);
3170
+ this.presetFields();
3171
+ }
3172
+ presetFields() {
3173
+ if (!this.ratingConfiguration) {
3174
+ return;
2842
3175
  }
2843
- this.presetFields(this.manageEntityConfigurations.activeEntityConfiguration);
2844
- void this.manageEntityConfigurations.initMultiselect();
3176
+ this.nameField.setValue(this.ratingConfiguration.name);
3177
+ this.descriptionField.setValue(this.ratingConfiguration.description || '');
3178
+ this.maxRateField.setValue(this.ratingConfiguration.maxRateValue || 5);
3179
+ this.stepField.setValue(this.ratingConfiguration.stepValue || 1);
2845
3180
  }
2846
3181
  async submit() {
2847
- if (!this.manageEntityConfigurations.activeEntityConfiguration) {
2848
- throw new Error(`Active entityConfiguration should be selected`);
3182
+ if (!this.manageRatingConfigurations.entityConfigurationId) {
3183
+ throw new Error(`No entity config id found`);
2849
3184
  }
2850
- if (this.entityConfigurationForm.invalid || !this.manageEntityConfigurations.peer.rtseeAppId) {
3185
+ if (this.ratingConfigurationForm.invalid ||
3186
+ !this.manageRatingConfigurations.applicationId) {
2851
3187
  console.log('Form Invalid!');
2852
3188
  return;
2853
3189
  }
2854
3190
  const configurationParams = {
2855
3191
  name: this.nameField.getRawValue(),
2856
3192
  description: this.descriptionField.getRawValue(),
2857
- applicationId: this.manageEntityConfigurations.peer.rtseeAppId,
2858
- taggingEnabled: this.taggingEnabledField.getRawValue(),
2859
- commentsEnabled: this.commentsEnabledField.getRawValue(),
2860
- ratingEnabled: this.ratingEnabledField.getRawValue(),
3193
+ entityConfigurationId: this.manageRatingConfigurations.entityConfigurationId,
3194
+ applicationId: this.manageRatingConfigurations.applicationId,
3195
+ maxRateValue: this.maxRateField.getRawValue(),
3196
+ stepValue: this.stepField.getRawValue(),
2861
3197
  };
2862
- if (this.manageEntityConfigurations.activeEntityConfiguration.id) {
2863
- await this.manageEntityConfigurations.updateEntityConfiguration({
3198
+ if (this.ratingConfiguration?.id) {
3199
+ await this.manageRatingConfigurations.updateRatingConfiguration({
2864
3200
  ...configurationParams,
2865
- id: this.manageEntityConfigurations.activeEntityConfiguration.id
3201
+ id: this.ratingConfiguration.id,
2866
3202
  });
2867
3203
  }
2868
3204
  else {
2869
- await this.manageEntityConfigurations.createEntityConfiguration(configurationParams);
3205
+ await this.manageRatingConfigurations.createRatingConfiguration(configurationParams);
2870
3206
  }
2871
3207
  }
2872
3208
  cancel() {
2873
- console.log('Cancel');
3209
+ console.log('cancel');
2874
3210
  }
2875
- presetFields(entityConfiguration) {
2876
- this.nameField.setValue(entityConfiguration.name);
2877
- this.descriptionField.setValue(entityConfiguration.description || '');
2878
- this.taggingEnabledField.setValue(entityConfiguration.taggingEnabled || false);
2879
- this.commentsEnabledField.setValue(entityConfiguration.commentsEnabled || false);
2880
- this.ratingEnabledField.setValue(entityConfiguration.ratingEnabled || false);
2881
- }
2882
- getEntityConfigurationForm() {
3211
+ getRatingConfigurationForm() {
2883
3212
  return this.formBuilder.group({
2884
3213
  name: this.formBuilder.control('', {
2885
3214
  validators: [
2886
3215
  Validators.required,
2887
3216
  Validators.minLength(3),
2888
- Validators.maxLength(131)
2889
- ]
3217
+ Validators.maxLength(131),
3218
+ ],
2890
3219
  }),
2891
3220
  description: this.formBuilder.control('', {
2892
3221
  validators: [
2893
3222
  Validators.required,
2894
3223
  Validators.minLength(6),
2895
- Validators.maxLength(244)
2896
- ]
3224
+ Validators.maxLength(244),
3225
+ ],
3226
+ }),
3227
+ maxRate: this.formBuilder.control(5, {
3228
+ validators: [Validators.required, Validators.min(4)],
3229
+ }),
3230
+ step: this.formBuilder.control(1, {
3231
+ validators: [Validators.required, Validators.min(1)],
2897
3232
  }),
2898
- taggingEnabled: this.formBuilder.control(false),
2899
- commentsEnabled: this.formBuilder.control(false),
2900
- ratingEnabled: this.formBuilder.control(false)
2901
3233
  });
2902
3234
  }
2903
3235
  get nameField() {
2904
- return this.entityConfigurationForm.get('name');
3236
+ return this.ratingConfigurationForm.get('name');
2905
3237
  }
2906
3238
  get descriptionField() {
2907
- return this.entityConfigurationForm.get('description');
2908
- }
2909
- get taggingEnabledField() {
2910
- return this.entityConfigurationForm.get('taggingEnabled');
3239
+ return this.ratingConfigurationForm.get('description');
2911
3240
  }
2912
- get commentsEnabledField() {
2913
- return this.entityConfigurationForm.get('commentsEnabled');
3241
+ get maxRateField() {
3242
+ return this.ratingConfigurationForm.get('maxRate');
2914
3243
  }
2915
- get ratingEnabledField() {
2916
- return this.entityConfigurationForm.get('ratingEnabled');
3244
+ get stepField() {
3245
+ return this.ratingConfigurationForm.get('step');
2917
3246
  }
2918
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageEntityConfigurationComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2919
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageEntityConfigurationComponent, isStandalone: true, selector: "rtsee-manage-entity-configuration", inputs: { manageEntityConfigurations: "manageEntityConfigurations" }, ngImport: i0, template: "<div class=\"rtsee-manage-entity-configuration\">\n <div class=\"rtsee-manage-entity-configuration-info rtsee-form-container\">\n <form class=\"rtsee-entity-configuration-form rtsee-form\"\n [formGroup]=\"entityConfigurationForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-entity-config-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-entity-config-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-entity-config-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-entity-config-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n\n @if (manageEntityConfigurations && manageEntityConfigurations.tagGroupsMultiselect) {\n <div class=\"rtsee-form-field-container\">\n <rtsee-autocomplete [config]=\"manageEntityConfigurations.tagGroupsMultiselect\"></rtsee-autocomplete>\n </div>\n }\n\n <div class=\"rtsee-form-field-container\">\n <p>Tagging Enabled</p>\n <p-toggleswitch name=\"tagging-enabled\" formControlName=\"taggingEnabled\"/>\n </div>\n <div class=\"rtsee-form-field-container\">\n <p>Comments Enabled</p>\n <p-toggleswitch name=\"comments-enabled\" formControlName=\"commentsEnabled\"/>\n </div>\n <div class=\"rtsee-form-field-container\">\n <p>Rating Enabled</p>\n <p-toggleswitch name=\"ratings-enabled\" formControlName=\"ratingEnabled\"/>\n </div>\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n />\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "rtsee-autocomplete", inputs: ["config"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["styleClass", "tabindex", "inputId", "readonly", "trueValue", "falseValue", "ariaLabel", "size", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }] }); }
3247
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageRatingConfigurationComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
3248
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageRatingConfigurationComponent, isStandalone: true, selector: "rtsee-manage-rating-configuration", inputs: { manageRatingConfigurations: "manageRatingConfigurations", ratingConfiguration: "ratingConfiguration" }, ngImport: i0, template: "<div class=\"rtsee-manage-rating-configuration\">\n <div class=\"rtsee-form-container\">\n <form class=\"rtsee-rating-configuration-form rtsee-form\"\n [formGroup]=\"ratingConfigurationForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-rating-configuration-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-rating-configuration-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-rating-configuration-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-rating-configuration-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-inputNumber [formControl]=\"maxRateField\"\n [min]=\"1\"\n [max]=\"10\"\n id=\"rtsee-rating-configuration-max-rate-field\"\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n />\n <label for=\"rtsee-rating-configuration-max-rate-field\">Max Rate</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (maxRateField.hasError('required') && maxRateField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Max rate is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-inputNumber [formControl]=\"stepField\"\n [min]=\"1\"\n [max]=\"2\"\n id=\"rtsee-rating-configuration-step-field\"\n [class.p-invalid]=\"stepField.invalid && stepField.touched\"\n />\n <label for=\"rtsee-rating-configuration-step-field\">Max Rate</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (maxRateField.hasError('required') && maxRateField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Step is required</p-message>\n }\n </div>\n\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageRatingConfigurations.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageRatingConfigurations.saveInProgress\"\n />\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "component", type: InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "placeholder", "tabindex", "title", "ariaLabelledBy", "ariaDescribedBy", "ariaLabel", "ariaRequired", "autocomplete", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }] }); }
2920
3249
  }
2921
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageEntityConfigurationComponent, decorators: [{
3250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageRatingConfigurationComponent, decorators: [{
2922
3251
  type: Component,
2923
- args: [{ selector: 'rtsee-manage-entity-configuration', imports: [
2924
- AutocompleteComponent,
3252
+ args: [{ selector: 'rtsee-manage-rating-configuration', imports: [
2925
3253
  Button,
2926
3254
  FloatLabel,
2927
3255
  FormsModule,
2928
3256
  InputGroup,
2929
3257
  InputText,
2930
3258
  Message,
2931
- Textarea,
2932
3259
  ReactiveFormsModule,
2933
- ToggleSwitch
2934
- ], template: "<div class=\"rtsee-manage-entity-configuration\">\n <div class=\"rtsee-manage-entity-configuration-info rtsee-form-container\">\n <form class=\"rtsee-entity-configuration-form rtsee-form\"\n [formGroup]=\"entityConfigurationForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-entity-config-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-entity-config-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-entity-config-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-entity-config-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n\n @if (manageEntityConfigurations && manageEntityConfigurations.tagGroupsMultiselect) {\n <div class=\"rtsee-form-field-container\">\n <rtsee-autocomplete [config]=\"manageEntityConfigurations.tagGroupsMultiselect\"></rtsee-autocomplete>\n </div>\n }\n\n <div class=\"rtsee-form-field-container\">\n <p>Tagging Enabled</p>\n <p-toggleswitch name=\"tagging-enabled\" formControlName=\"taggingEnabled\"/>\n </div>\n <div class=\"rtsee-form-field-container\">\n <p>Comments Enabled</p>\n <p-toggleswitch name=\"comments-enabled\" formControlName=\"commentsEnabled\"/>\n </div>\n <div class=\"rtsee-form-field-container\">\n <p>Rating Enabled</p>\n <p-toggleswitch name=\"ratings-enabled\" formControlName=\"ratingEnabled\"/>\n </div>\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
2935
- }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageEntityConfigurations: [{
3260
+ Textarea,
3261
+ InputNumber,
3262
+ ], template: "<div class=\"rtsee-manage-rating-configuration\">\n <div class=\"rtsee-form-container\">\n <form class=\"rtsee-rating-configuration-form rtsee-form\"\n [formGroup]=\"ratingConfigurationForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-rating-configuration-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-rating-configuration-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <textarea [formControl]=\"descriptionField\"\n id=\"rtsee-rating-configuration-description-field\"\n class=\"rtsee-form-field\"\n rows=\"3\"\n cols=\"30\"\n pTextarea\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n ></textarea>\n <label for=\"rtsee-rating-configuration-description-field\">Description</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (descriptionField.hasError('required') && descriptionField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Description is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-inputNumber [formControl]=\"maxRateField\"\n [min]=\"1\"\n [max]=\"10\"\n id=\"rtsee-rating-configuration-max-rate-field\"\n [class.p-invalid]=\"descriptionField.invalid && descriptionField.touched\"\n />\n <label for=\"rtsee-rating-configuration-max-rate-field\">Max Rate</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (maxRateField.hasError('required') && maxRateField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Max rate is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-inputNumber [formControl]=\"stepField\"\n [min]=\"1\"\n [max]=\"2\"\n id=\"rtsee-rating-configuration-step-field\"\n [class.p-invalid]=\"stepField.invalid && stepField.touched\"\n />\n <label for=\"rtsee-rating-configuration-step-field\">Max Rate</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (maxRateField.hasError('required') && maxRateField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Step is required</p-message>\n }\n </div>\n\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageRatingConfigurations.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageRatingConfigurations.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
3263
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageRatingConfigurations: [{
3264
+ type: Input
3265
+ }], ratingConfiguration: [{
3266
+ type: Input
3267
+ }] } });
3268
+
3269
+ class RatingConfigurationsListComponent {
3270
+ constructor() {
3271
+ this.items = [];
3272
+ this.onRatingConfigurationClicked = output();
3273
+ }
3274
+ ngOnInit() {
3275
+ this.manageRatingConfigurations
3276
+ .loadRatingConfigurations(this.entityConfiguration.id)
3277
+ .then(() => {
3278
+ this.items = this.ratingConfigurationsToItems(this.manageRatingConfigurations.ratingConfigurations);
3279
+ })
3280
+ .catch((err) => {
3281
+ console.log(err);
3282
+ });
3283
+ }
3284
+ onCreateClicked() {
3285
+ this.manageRatingConfigurations.setBlankActiveConfiguration();
3286
+ this.selectedRatingConfiguration =
3287
+ this.manageRatingConfigurations.activeRatingConfiguration || undefined;
3288
+ }
3289
+ ratingConfigurationsToItems(ratingConfigurations) {
3290
+ return ratingConfigurations.map((rc) => {
3291
+ return {
3292
+ label: rc.name,
3293
+ isSelected: false,
3294
+ command: () => {
3295
+ this.selectedRatingConfiguration = rc;
3296
+ this.onRatingConfigurationClicked.emit(rc);
3297
+ },
3298
+ };
3299
+ });
3300
+ }
3301
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingConfigurationsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3302
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RatingConfigurationsListComponent, isStandalone: true, selector: "rtsee-rating-configurations-list", inputs: { entityConfiguration: "entityConfiguration", manageRatingConfigurations: "manageRatingConfigurations" }, outputs: { onRatingConfigurationClicked: "onRatingConfigurationClicked" }, ngImport: i0, template: "<div class=\"rtsee-rating-configurations-list\">\n <p-divider></p-divider>\n <p>Rating Configurations</p>\n @if (selectedRatingConfiguration) {\n <rtsee-manage-rating-configuration [manageRatingConfigurations]=\"manageRatingConfigurations\"\n [ratingConfiguration]=\"selectedRatingConfiguration\"\n ></rtsee-manage-rating-configuration>\n } @else {\n <div class=\"rtsee-rating-configurations-controls\">\n <p-button label=\"Create\" (click)=\"onCreateClicked()\"></p-button>\n </div>\n <div class=\"rtsee-rating-configurations-list-items\">\n <p-menu [model]=\"items\" />\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Divider, selector: "p-divider", inputs: ["styleClass", "layout", "type", "align"] }, { kind: "component", type: ManageRatingConfigurationComponent, selector: "rtsee-manage-rating-configuration", inputs: ["manageRatingConfigurations", "ratingConfiguration"] }] }); }
3303
+ }
3304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RatingConfigurationsListComponent, decorators: [{
3305
+ type: Component,
3306
+ args: [{ selector: 'rtsee-rating-configurations-list', imports: [Menu, Button, Divider, ManageRatingConfigurationComponent], template: "<div class=\"rtsee-rating-configurations-list\">\n <p-divider></p-divider>\n <p>Rating Configurations</p>\n @if (selectedRatingConfiguration) {\n <rtsee-manage-rating-configuration [manageRatingConfigurations]=\"manageRatingConfigurations\"\n [ratingConfiguration]=\"selectedRatingConfiguration\"\n ></rtsee-manage-rating-configuration>\n } @else {\n <div class=\"rtsee-rating-configurations-controls\">\n <p-button label=\"Create\" (click)=\"onCreateClicked()\"></p-button>\n </div>\n <div class=\"rtsee-rating-configurations-list-items\">\n <p-menu [model]=\"items\" />\n </div>\n }\n</div>\n" }]
3307
+ }], propDecorators: { entityConfiguration: [{
3308
+ type: Input
3309
+ }], manageRatingConfigurations: [{
3310
+ type: Input
3311
+ }] } });
3312
+
3313
+ class ManageEntityConfigurationComponent {
3314
+ ngOnInit() {
3315
+ if (!this.manageEntityConfigurations.activeEntityConfiguration) {
3316
+ this.manageEntityConfigurations.setBlankActiveEntityConfiguration();
3317
+ }
3318
+ if (!this.manageEntityConfigurations.activeEntityConfigurationForm) {
3319
+ throw new Error(`Active entityConfig form should be selected`);
3320
+ }
3321
+ }
3322
+ submit() {
3323
+ if (!this.manageEntityConfigurations.activeEntityConfigurationForm) {
3324
+ return;
3325
+ }
3326
+ this.manageEntityConfigurations.activeEntityConfigurationForm.submit();
3327
+ }
3328
+ cancel() {
3329
+ this.manageEntityConfigurations.flushActiveEntityConfiguration();
3330
+ }
3331
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageEntityConfigurationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3332
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageEntityConfigurationComponent, isStandalone: true, selector: "rtsee-manage-entity-configuration", inputs: { manageEntityConfigurations: "manageEntityConfigurations" }, ngImport: i0, template: "<div class=\"rtsee-manage-entity-configuration\">\n <div class=\"rtsee-manage-entity-configuration-info rtsee-form-container\">\n @if (manageEntityConfigurations.activeEntityConfigurationForm) {\n <rtsee-form [form]=\"manageEntityConfigurations.activeEntityConfigurationForm\" (formSubmit)=\"submit()\">\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n ></p-button>\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n />\n </rtsee-form>\n\n @if (manageEntityConfigurations.activeEntityConfiguration && manageEntityConfigurations.activeEntityConfiguration.id) {\n <rtsee-rating-configurations-list [entityConfiguration]=\"manageEntityConfigurations.activeEntityConfiguration\"\n [manageRatingConfigurations]=\"manageEntityConfigurations.activeEntityConfiguration.manageRatingConfigurations\"\n ></rtsee-rating-configurations-list>\n }\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FormComponent, selector: "rtsee-form", inputs: ["form"], outputs: ["formSubmit"] }, { kind: "component", type: RatingConfigurationsListComponent, selector: "rtsee-rating-configurations-list", inputs: ["entityConfiguration", "manageRatingConfigurations"], outputs: ["onRatingConfigurationClicked"] }] }); }
3333
+ }
3334
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageEntityConfigurationComponent, decorators: [{
3335
+ type: Component,
3336
+ args: [{ selector: "rtsee-manage-entity-configuration", standalone: true, imports: [
3337
+ Button,
3338
+ FormComponent,
3339
+ RatingConfigurationsListComponent,
3340
+ ], template: "<div class=\"rtsee-manage-entity-configuration\">\n <div class=\"rtsee-manage-entity-configuration-info rtsee-form-container\">\n @if (manageEntityConfigurations.activeEntityConfigurationForm) {\n <rtsee-form [form]=\"manageEntityConfigurations.activeEntityConfigurationForm\" (formSubmit)=\"submit()\">\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n ></p-button>\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntityConfigurations.saveInProgress\"\n />\n </rtsee-form>\n\n @if (manageEntityConfigurations.activeEntityConfiguration && manageEntityConfigurations.activeEntityConfiguration.id) {\n <rtsee-rating-configurations-list [entityConfiguration]=\"manageEntityConfigurations.activeEntityConfiguration\"\n [manageRatingConfigurations]=\"manageEntityConfigurations.activeEntityConfiguration.manageRatingConfigurations\"\n ></rtsee-rating-configurations-list>\n }\n }\n </div>\n</div>\n" }]
3341
+ }], propDecorators: { manageEntityConfigurations: [{
2936
3342
  type: Input
2937
3343
  }] } });
2938
3344
 
@@ -2942,15 +3348,17 @@ class EntitiesListComponent {
2942
3348
  this.onEntityClicked = output();
2943
3349
  }
2944
3350
  ngOnInit() {
2945
- this.manageEntities.loadEntities()
3351
+ this.manageEntities
3352
+ .loadEntities()
2946
3353
  .then(() => {
2947
3354
  this.items = this.entitiesToItems(this.manageEntities.entities);
2948
- }).catch((err) => {
3355
+ })
3356
+ .catch((err) => {
2949
3357
  console.log(err);
2950
3358
  });
2951
3359
  }
2952
3360
  entitiesToItems(entityConfigurations) {
2953
- console.log("entityConfigsToItems", entityConfigurations);
3361
+ console.log('entityConfigsToItems', entityConfigurations);
2954
3362
  return entityConfigurations.map((et) => {
2955
3363
  return {
2956
3364
  label: et.name,
@@ -2958,7 +3366,7 @@ class EntitiesListComponent {
2958
3366
  command: () => {
2959
3367
  this.selectedEntity = et;
2960
3368
  this.onEntityClicked.emit(et);
2961
- }
3369
+ },
2962
3370
  };
2963
3371
  });
2964
3372
  }
@@ -2967,160 +3375,39 @@ class EntitiesListComponent {
2967
3375
  }
2968
3376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: EntitiesListComponent, decorators: [{
2969
3377
  type: Component,
2970
- args: [{ selector: 'rtsee-entities-list', imports: [
2971
- Menu
2972
- ], template: "<div class=\"rtsee-entities-list\">\n <p-menu [model]=\"items\" />\n</div>\n" }]
3378
+ args: [{ selector: 'rtsee-entities-list', imports: [Menu], template: "<div class=\"rtsee-entities-list\">\n <p-menu [model]=\"items\" />\n</div>\n" }]
2973
3379
  }], propDecorators: { manageEntities: [{
2974
3380
  type: Input
2975
3381
  }] } });
2976
3382
 
2977
3383
  class ManageEntityComponent {
2978
- constructor(formBuilder) {
2979
- this.formBuilder = formBuilder;
2980
- this.entityForm = this.getEntityForm();
2981
- }
2982
3384
  ngOnInit() {
2983
3385
  if (!this.manageEntities.activeEntity) {
2984
3386
  this.manageEntities.setBlankActiveEntity();
2985
3387
  }
2986
- if (!this.manageEntities.activeEntity) {
2987
- throw new Error(`Active entity should be selected`);
3388
+ if (!this.manageEntities.activeEntityForm) {
3389
+ throw new Error(`Active entity form should be selected`);
2988
3390
  }
2989
- this.presetFields(this.manageEntities.activeEntity);
2990
- void this.manageEntities.initMultiselect();
2991
3391
  }
2992
- async submit() {
2993
- if (!this.manageEntities.activeEntity) {
2994
- throw new Error(`Active entity should be selected`);
2995
- }
2996
- if (this.entityForm.invalid || !this.manageEntities.peer.rtseeAppId) {
2997
- console.log('Form Invalid!');
3392
+ submit() {
3393
+ if (!this.manageEntities.activeEntityForm) {
2998
3394
  return;
2999
3395
  }
3000
- const entityParams = {
3001
- name: this.nameField.getRawValue(),
3002
- applicationId: this.manageEntities.peer.rtseeAppId,
3003
- configurationId: this.configurationIdField.getRawValue(),
3004
- imageUrl: this.imageUrlField.getRawValue(),
3005
- tags: [],
3006
- tagIds: []
3007
- };
3008
- if (this.manageEntities.activeEntity.id) {
3009
- await this.manageEntities.updateEntity({
3010
- ...entityParams,
3011
- id: this.manageEntities.activeEntity.id
3012
- });
3013
- }
3014
- else {
3015
- await this.manageEntities.createEntity(entityParams);
3016
- }
3017
- }
3018
- configurationInputChanged() {
3019
- console.log('Configuration Input Changed');
3396
+ this.manageEntities.activeEntityForm.submit();
3020
3397
  }
3021
3398
  cancel() {
3022
- console.log('Cancel');
3023
- }
3024
- presetFields(entityConfiguration) {
3025
- this.nameField.setValue(entityConfiguration.name);
3026
- this.imageUrlField.setValue(entityConfiguration.imageUrl || '');
3027
- this.configurationIdField.setValue(entityConfiguration.configurationId || '');
3028
- }
3029
- getEntityForm() {
3030
- return this.formBuilder.group({
3031
- name: this.formBuilder.control('', {
3032
- validators: [
3033
- Validators.required,
3034
- Validators.minLength(3),
3035
- Validators.maxLength(131)
3036
- ]
3037
- }),
3038
- configurationId: this.formBuilder.control('', {
3039
- validators: [
3040
- Validators.required,
3041
- ]
3042
- }),
3043
- imageUrl: this.formBuilder.control('', {
3044
- validators: [
3045
- Validators.minLength(6),
3046
- Validators.maxLength(244)
3047
- ]
3048
- })
3049
- });
3050
- }
3051
- get nameField() {
3052
- return this.entityForm.get('name');
3053
- }
3054
- get imageUrlField() {
3055
- return this.entityForm.get('imageUrl');
3399
+ this.manageEntities.flushActiveEntity();
3056
3400
  }
3057
- get configurationIdField() {
3058
- return this.entityForm.get('configurationId');
3059
- }
3060
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageEntityComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
3061
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageEntityComponent, isStandalone: true, selector: "rtsee-manage-entity", inputs: { manageEntities: "manageEntities" }, ngImport: i0, template: "<div class=\"rtsee-manage-entity\">\n <div class=\"rtsee-manage-entity-info rtsee-form-container\">\n <form class=\"rtsee-entity-form rtsee-form\"\n [formGroup]=\"entityForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-entity-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-entity-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n @if (manageEntities.activeEntity) {\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"manageEntities.configurations\"\n [formControl]=\"configurationIdField\"\n inputId=\"configuration_input\"\n optionLabel=\"name\"\n optionValue=\"id\"\n class=\"rtsee-entity-configuration-input\" />\n <label for=\"configuration_input\">Entity Configuration</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (configurationIdField.hasError('required') && configurationIdField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Entity Configuration is required</p-message>\n }\n </div>\n }\n\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-entity-image-url-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"imageUrlField\"\n [class.p-invalid]=\"imageUrlField.invalid && imageUrlField.touched\"\n />\n <label for=\"rtsee-entity-image-url-field\">ImageUrl</label>\n </p-floatlabel>\n </p-inputgroup>\n </div>\n\n @if (manageEntities && manageEntities.tagsMultiselect) {\n <div class=\"rtsee-form-field-container\">\n <rtsee-autocomplete [config]=\"manageEntities.tagsMultiselect\"></rtsee-autocomplete>\n </div>\n }\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageEntities.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntities.saveInProgress\"\n />\n </form>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "rtsee-autocomplete", inputs: ["config"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FloatLabel, selector: "p-floatlabel, p-floatLabel, p-float-label", inputs: ["variant"] }, { kind: "component", type: InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }] }); }
3401
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageEntityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3402
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ManageEntityComponent, isStandalone: true, selector: "rtsee-manage-entity", inputs: { manageEntities: "manageEntities" }, ngImport: i0, template: "<div class=\"rtsee-manage-entity\">\n @if (manageEntities.activeEntityForm) {\n <rtsee-form [form]=\"manageEntities.activeEntityForm\" (formSubmit)=\"submit()\">\n <p-button type=\"submit\"\n label=\"Submit\"\n [disabled]=\"manageEntities.saveInProgress\"\n ></p-button>\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntities.saveInProgress\"\n />\n </rtsee-form>\n }\n</div>\n", dependencies: [{ kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FormComponent, selector: "rtsee-form", inputs: ["form"], outputs: ["formSubmit"] }] }); }
3062
3403
  }
3063
3404
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ManageEntityComponent, decorators: [{
3064
3405
  type: Component,
3065
- args: [{ selector: 'rtsee-manage-entity', imports: [
3066
- AutocompleteComponent,
3406
+ args: [{ selector: "rtsee-manage-entity", standalone: true, imports: [
3067
3407
  Button,
3068
- FloatLabel,
3069
- InputGroup,
3070
- InputText,
3071
- Message,
3072
- ReactiveFormsModule,
3073
- Select,
3074
- FormsModule
3075
- ], template: "<div class=\"rtsee-manage-entity\">\n <div class=\"rtsee-manage-entity-info rtsee-form-container\">\n <form class=\"rtsee-entity-form rtsee-form\"\n [formGroup]=\"entityForm\" (ngSubmit)=\"submit()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-entity-name-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"nameField\"\n [class.p-invalid]=\"nameField.invalid && nameField.touched\"\n />\n <label for=\"rtsee-entity-name-field\">Name</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (nameField.hasError('required') && nameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Name is required</p-message>\n }\n </div>\n @if (manageEntities.activeEntity) {\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-select [options]=\"manageEntities.configurations\"\n [formControl]=\"configurationIdField\"\n inputId=\"configuration_input\"\n optionLabel=\"name\"\n optionValue=\"id\"\n class=\"rtsee-entity-configuration-input\" />\n <label for=\"configuration_input\">Entity Configuration</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (configurationIdField.hasError('required') && configurationIdField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Entity Configuration is required</p-message>\n }\n </div>\n }\n\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"rtsee-entity-image-url-field\"\n class=\"rtsee-form-field\"\n pInputText\n [formControl]=\"imageUrlField\"\n [class.p-invalid]=\"imageUrlField.invalid && imageUrlField.touched\"\n />\n <label for=\"rtsee-entity-image-url-field\">ImageUrl</label>\n </p-floatlabel>\n </p-inputgroup>\n </div>\n\n @if (manageEntities && manageEntities.tagsMultiselect) {\n <div class=\"rtsee-form-field-container\">\n <rtsee-autocomplete [config]=\"manageEntities.tagsMultiselect\"></rtsee-autocomplete>\n </div>\n }\n\n <p-button type=\"submit\"\n [label]=\"'Save'\"\n [disabled]=\"manageEntities.saveInProgress\"\n />\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntities.saveInProgress\"\n />\n </form>\n </div>\n</div>\n" }]
3076
- }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { manageEntities: [{
3077
- type: Input
3078
- }] } });
3079
-
3080
- class RtseeEntityCommentsComponent {
3081
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityCommentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3082
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RtseeEntityCommentsComponent, isStandalone: true, selector: "rtsee-entity-comments", inputs: { messenger: "messenger", chat: "chat" }, ngImport: i0, template: "<div class=\"rtsee-entity-comments\">\n @if (messenger && chat) {\n <rtsee-chat [messenger]=\"messenger\"\n [chatData]=\"chat\"\n ></rtsee-chat>\n }\n</div>\n", dependencies: [{ kind: "component", type: ChatComponent, selector: "rtsee-chat", inputs: ["chat", "chatData", "messenger"] }] }); }
3083
- }
3084
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityCommentsComponent, decorators: [{
3085
- type: Component,
3086
- args: [{ selector: 'rtsee-entity-comments', imports: [
3087
- ChatComponent
3088
- ], template: "<div class=\"rtsee-entity-comments\">\n @if (messenger && chat) {\n <rtsee-chat [messenger]=\"messenger\"\n [chatData]=\"chat\"\n ></rtsee-chat>\n }\n</div>\n" }]
3089
- }], propDecorators: { messenger: [{
3090
- type: Input
3091
- }], chat: [{
3092
- type: Input
3093
- }] } });
3094
-
3095
- class RtseeEntityTagsComponent {
3096
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityTagsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3097
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RtseeEntityTagsComponent, isStandalone: true, selector: "rtsee-entity-tags", inputs: { entity: "entity" }, ngImport: i0, template: "<div class=\"rtsee-entity-tags\">\n @if (entity && entity.tags?.length) {\n <div class=\"rtsee-entity-tags-list\">\n @for (tag of entity.tags; track tag.id) {\n <p-chip class=\"rtsee-entity-tag\">\n <span class=\"rtsee-entity-tag-right\"\n >{{tag.name}}</span>\n </p-chip>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "styleClass", "disabled", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }] }); }
3098
- }
3099
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityTagsComponent, decorators: [{
3100
- type: Component,
3101
- args: [{ selector: 'rtsee-entity-tags', imports: [
3102
- Chip
3103
- ], template: "<div class=\"rtsee-entity-tags\">\n @if (entity && entity.tags?.length) {\n <div class=\"rtsee-entity-tags-list\">\n @for (tag of entity.tags; track tag.id) {\n <p-chip class=\"rtsee-entity-tag\">\n <span class=\"rtsee-entity-tag-right\"\n >{{tag.name}}</span>\n </p-chip>\n }\n </div>\n }\n</div>\n" }]
3104
- }], propDecorators: { entity: [{
3105
- type: Input
3106
- }] } });
3107
-
3108
- class RtseeEntityPreviewComponent {
3109
- ngOnInit() {
3110
- void this.entity.reload();
3111
- }
3112
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3113
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: RtseeEntityPreviewComponent, isStandalone: true, selector: "rtsee-entity-preview", inputs: { entity: "entity", messenger: "messenger" }, ngImport: i0, template: "<div class=\"rtsee-entity-preview\">\n <div class=\"rtsee-entity-preview-tags\">\n <rtsee-entity-tags [entity]=\"entity\"></rtsee-entity-tags>\n </div>\n <div class=\"rtsee-entity-preview-comments\">\n @if (entity.comments && messenger) {\n <rtsee-entity-comments [messenger]=\"messenger\"\n [chat]=\"entity.comments\"\n ></rtsee-entity-comments>\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: RtseeEntityCommentsComponent, selector: "rtsee-entity-comments", inputs: ["messenger", "chat"] }, { kind: "component", type: RtseeEntityTagsComponent, selector: "rtsee-entity-tags", inputs: ["entity"] }] }); }
3114
- }
3115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RtseeEntityPreviewComponent, decorators: [{
3116
- type: Component,
3117
- args: [{ selector: 'rtsee-entity-preview', imports: [
3118
- RtseeEntityCommentsComponent,
3119
- RtseeEntityTagsComponent
3120
- ], template: "<div class=\"rtsee-entity-preview\">\n <div class=\"rtsee-entity-preview-tags\">\n <rtsee-entity-tags [entity]=\"entity\"></rtsee-entity-tags>\n </div>\n <div class=\"rtsee-entity-preview-comments\">\n @if (entity.comments && messenger) {\n <rtsee-entity-comments [messenger]=\"messenger\"\n [chat]=\"entity.comments\"\n ></rtsee-entity-comments>\n }\n </div>\n</div>\n" }]
3121
- }], propDecorators: { entity: [{
3122
- type: Input
3123
- }], messenger: [{
3408
+ FormComponent
3409
+ ], template: "<div class=\"rtsee-manage-entity\">\n @if (manageEntities.activeEntityForm) {\n <rtsee-form [form]=\"manageEntities.activeEntityForm\" (formSubmit)=\"submit()\">\n <p-button type=\"submit\"\n label=\"Submit\"\n [disabled]=\"manageEntities.saveInProgress\"\n ></p-button>\n <p-button [label]=\"'Cancel'\"\n severity=\"secondary\"\n (click)=\"cancel()\"\n [disabled]=\"manageEntities.saveInProgress\"\n />\n </rtsee-form>\n }\n</div>\n" }]
3410
+ }], propDecorators: { manageEntities: [{
3124
3411
  type: Input
3125
3412
  }] } });
3126
3413
 
@@ -3132,13 +3419,13 @@ class SignInComponent {
3132
3419
  this.signInForm = this.formBuilder.group({
3133
3420
  username: this.formBuilder.nonNullable.control({
3134
3421
  value: '',
3135
- disabled: false
3422
+ disabled: false,
3136
3423
  }, {
3137
- validators: [Validators.required, Validators.email]
3424
+ validators: [Validators.required, Validators.email],
3138
3425
  }),
3139
3426
  password: this.formBuilder.nonNullable.control({
3140
3427
  value: '',
3141
- disabled: false
3428
+ disabled: false,
3142
3429
  }, { validators: [Validators.required] }),
3143
3430
  remember: this.formBuilder.nonNullable.control(false),
3144
3431
  });
@@ -3160,23 +3447,22 @@ class SignInComponent {
3160
3447
  login() {
3161
3448
  if (this.signInForm.valid) {
3162
3449
  this.disableFormFields();
3163
- this.authService.signIn(this.signInForm.getRawValue())
3164
- .subscribe({
3165
- next: (() => {
3450
+ this.authService.signIn(this.signInForm.getRawValue()).subscribe({
3451
+ next: () => {
3166
3452
  void this.router.navigate(this.authService.rtseeAuth.authConfiguration.defaultPostLoginRoute);
3167
3453
  this.enableFormFields();
3168
3454
  setTimeout(() => {
3169
3455
  window.location.reload();
3170
3456
  }, 100);
3171
- }),
3172
- error: ((error) => {
3457
+ },
3458
+ error: (error) => {
3173
3459
  console.log(error);
3174
3460
  this.showServerSideErrorForXSeconds(error.error.message);
3175
3461
  this.enableFormFields();
3176
- }),
3177
- complete: (() => {
3462
+ },
3463
+ complete: () => {
3178
3464
  this.enableFormFields();
3179
- })
3465
+ },
3180
3466
  });
3181
3467
  }
3182
3468
  else {
@@ -3217,14 +3503,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3217
3503
  FloatLabel,
3218
3504
  Checkbox,
3219
3505
  Message,
3220
- ProgressSpinner
3506
+ ProgressSpinner,
3221
3507
  ], standalone: true, template: "<div class=\"auth-container rtsee-form-container\" >\n <img [ngSrc]=\"authConfiguration.appLogo\"\n alt=\"Company Logo\"\n class=\"auth-logo\"\n height=\"37\"\n width=\"37\"\n />\n <h2 class=\"auth-title\">{{ authService.rtseeAuth.labels[RTSeeTextLabelKeys.SIGN_IN_FORM_HEADER] }}</h2>\n <p class=\"auth-title-description\">{{ authService.rtseeAuth.labels[RTSeeTextLabelKeys.SIGN_IN_TEXT_SUBHEADER] }}</p>\n\n <form class=\"auth-form rtsee-form\" [formGroup]=\"signInForm\" (ngSubmit)=\"login()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup >\n <p-floatlabel variant=\"on\">\n <input id=\"user-email\"\n pInputText\n [formControl]=\"usernameField\"\n />\n <label for=\"user-email\">Email</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!usernameField.valid && usernameField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Email is invalid</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-password id=\"user-password\"\n [formControl]=\"passwordField\"\n [feedback]=\"false\"\n />\n <label for=\"user-password\">Password</label>\n </p-floatlabel>\n </p-inputgroup>\n\n @if (!passwordField.valid && passwordField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Password is required</p-message>\n }\n @if (serverSideError) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{serverSideError}}</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-checkbox inputId=\"remember\" [binary]=\"true\" [formControl]=\"rememberField\" />\n <label for=\"remember\" class=\"ml-2\">\n <span>\n {{authService.rtseeAuth.labels[RTSeeTextLabelKeys.REMEMBER_ME_CHECKBOX_LABEL] }}\n </span>\n </label>\n </div>\n <div class=\"rtsee-form-field-container\">\n <a href=\"#\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.FORGOT_PASSWORD)\"\n class=\"auth-deep-blue-sm-medium\"\n >Forgot password?</a>\n </div>\n <div class=\"rtsee-form-submit-container\">\n <p-button type=\"submit\"\n label=\"Sign In\"\n [disabled]=\"loadInProgress\"\n />\n @if (loadInProgress) {\n <p-progress-spinner class=\"rtsee-progress-spinner rtsee-progress-spinner-sm\"></p-progress-spinner>\n }\n </div>\n </form>\n <p class=\"rtsee-form-label\">\n <span>Don't have an account?</span>\n <span>&nbsp;</span>\n <a href=\"#\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.SIGN_UP)\"\n class=\"auth-deep-blue-sm-medium\"\n >Create one!</a>\n </p>\n</div>\n" }]
3222
3508
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.Router }, { type: RTSeeAuthService }] });
3223
3509
 
3224
3510
  class UtilsService {
3225
- constructor() {
3226
- }
3511
+ constructor() { }
3227
3512
  static getKeysAsValueObject(obj) {
3513
+ // object was {}
3228
3514
  if (obj) {
3229
3515
  return Object.keys(obj).reduce((result, value) => {
3230
3516
  result[value] = value;
@@ -3239,7 +3525,7 @@ class UtilsService {
3239
3525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UtilsService, decorators: [{
3240
3526
  type: Injectable,
3241
3527
  args: [{
3242
- providedIn: 'root'
3528
+ providedIn: 'root',
3243
3529
  }]
3244
3530
  }], ctorParameters: () => [] });
3245
3531
 
@@ -3258,7 +3544,7 @@ class ConfirmPasswordValidator {
3258
3544
  const passwordConfirmation = passwordConfirmationField.getRawValue();
3259
3545
  if (password !== passwordConfirmation) {
3260
3546
  return {
3261
- confirmPassword: true
3547
+ confirmPassword: true,
3262
3548
  };
3263
3549
  }
3264
3550
  return null;
@@ -3275,16 +3561,18 @@ class SignUpComponent {
3275
3561
  this.errorMessage = '';
3276
3562
  this.AuthEndpointsKeys = AuthEndpointsKeys;
3277
3563
  this.signUpForm = this.formBuilder.group({
3278
- email: this.formBuilder.control('', { validators: [Validators.required, Validators.email] }),
3279
- password: this.formBuilder.control('', { validators: [Validators.required, Validators.minLength(6)] }),
3564
+ email: this.formBuilder.control('', {
3565
+ validators: [Validators.required, Validators.email],
3566
+ }),
3567
+ password: this.formBuilder.control('', {
3568
+ validators: [Validators.required, Validators.minLength(6)],
3569
+ }),
3280
3570
  passwordConfirmation: this.formBuilder.control('', {
3281
- validators: [
3282
- Validators.required,
3283
- Validators.minLength(6)
3284
- ]
3571
+ validators: [Validators.required, Validators.minLength(6)],
3285
3572
  }),
3286
- terms: this.formBuilder.control(false, { nonNullable: true,
3287
- validators: [Validators.requiredTrue]
3573
+ terms: this.formBuilder.control(false, {
3574
+ nonNullable: true,
3575
+ validators: [Validators.requiredTrue],
3288
3576
  }),
3289
3577
  }, { validators: [ConfirmPasswordValidator.MatchFields] });
3290
3578
  this.signUpFormKeys = UtilsService.getKeysAsValueObject(this.signUpForm.getRawValue());
@@ -3309,22 +3597,27 @@ class SignUpComponent {
3309
3597
  this.errorMessage = '';
3310
3598
  this.successMessage = '';
3311
3599
  const formValues = this.signUpForm.getRawValue();
3312
- this.authService.signUp({
3600
+ this.authService
3601
+ .signUp({
3313
3602
  email: formValues.email,
3314
3603
  password: formValues.password,
3315
- terms: formValues.terms
3316
- }).subscribe({
3604
+ terms: formValues.terms,
3605
+ })
3606
+ .subscribe({
3317
3607
  next: (response) => {
3318
3608
  this.loadInProgress = false;
3319
- this.successMessage = 'Registration successful! You can now sign in.';
3609
+ this.successMessage =
3610
+ 'Registration successful! You can now sign in.';
3320
3611
  void this.router.navigate(this.authConfiguration.getRoutePathSplit(this.AuthEndpointsKeys.SIGN_IN));
3321
3612
  console.log('User registered successfully', response);
3322
3613
  },
3323
3614
  error: (error) => {
3324
3615
  this.loadInProgress = false;
3325
- this.errorMessage = error.error?.message || 'Error during registration. Please try again.';
3616
+ this.errorMessage =
3617
+ error.error?.message ||
3618
+ 'Error during registration. Please try again.';
3326
3619
  console.error('Error during registration', error);
3327
- }
3620
+ },
3328
3621
  });
3329
3622
  }
3330
3623
  }
@@ -3344,7 +3637,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3344
3637
  FloatLabel,
3345
3638
  Checkbox,
3346
3639
  Message,
3347
- ProgressSpinner
3640
+ ProgressSpinner,
3348
3641
  ], standalone: true, template: "<div class=\"auth-container rtsee-form-container\">\n <img [ngSrc]=\"authConfiguration.appLogo\"\n alt=\"Company Logo\"\n class=\"auth-logo\"\n height=\"37\"\n width=\"37\"\n />\n <h2 class=\"auth-title\">Personal Account Registration</h2>\n <p class=\"auth-title-description\">Create your personal account to view stories</p>\n\n <form class=\"auth-form rtsee-form\" [formGroup]=\"signUpForm\" (ngSubmit)=\"signUp()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"sign-up-email\"\n pInputText\n [formControl]=\"emailField\"\n [class.p-invalid]=\"emailField.invalid && emailField.touched\"\n />\n <label for=\"sign-up-email\">Email</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (emailField.hasError('required') && emailField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Email is required</p-message>\n }\n @if (emailField.hasError('email') && emailField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Please enter a valid email address</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-password id=\"sign-up-password\"\n [formControl]=\"passwordField\"\n [feedback]=\"false\"\n [styleClass]=\"(passwordField.invalid && passwordField.touched) || (signUpForm.hasError('confirmPassword') && passwordField.touched) ? 'p-invalid' : ''\"\n />\n <label for=\"sign-up-password\">Password</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (passwordField.hasError('required') && passwordField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Password is required</p-message>\n }\n @if (passwordField.hasError('minlength') && passwordField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Password must be at least 6 characters long</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-password id=\"confirm-password\"\n [formControl]=\"passwordConfirmationField\"\n [feedback]=\"false\"\n [styleClass]=\"(passwordConfirmationField.invalid && passwordConfirmationField.touched) || (signUpForm.hasError('confirmPassword') && passwordConfirmationField.touched) ? 'p-invalid' : ''\"\n />\n <label for=\"confirm-password\">Confirm Password</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (passwordConfirmationField.hasError('required') && passwordConfirmationField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Password confirmation is required</p-message>\n }\n @if (passwordConfirmationField.hasError('minlength') && passwordConfirmationField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Password confirmation must be at least 6 characters long</p-message>\n }\n @if (signUpForm.hasError('confirmPassword') && passwordConfirmationField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Passwords do not match</p-message>\n }\n </div>\n\n @if (successMessage) {\n <p-message class=\"rtsee-form-success-message\"\n severity=\"success\"\n variant=\"simple\"\n size=\"small\"\n >{{ successMessage }}</p-message>\n }\n\n @if (errorMessage) {\n <p-message class=\"rtsee-form-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ errorMessage }}</p-message>\n }\n <div class=\"rtsee-form-field-container\">\n <p-checkbox inputId=\"terms\" [binary]=\"true\" [formControl]=\"termsField\" />\n <label for=\"terms\" class=\"ml-2\">I agree to the&nbsp;<a href=\"#\" [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.PRIVACY_POLICY)\" class=\"auth-deep-blue-sm-medium\">terms of use</a></label>\n @if (termsField.hasError('required') && termsField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >You must accept the terms and conditions</p-message>\n }\n </div>\n <div class=\"rtsee-form-submit-container\">\n <p-button type=\"submit\"\n label=\"Sign Up\"\n [disabled]=\"loadInProgress\"\n />\n @if (loadInProgress) {\n <p-progress-spinner class=\"rtsee-progress-spinner rtsee-progress-spinner-sm\"></p-progress-spinner>\n }\n </div>\n </form>\n\n <p class=\"rtsee-form-label\">\n <span>Already have an account?</span>\n <span>&nbsp;</span>\n <a href=\"#\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.SIGN_IN)\"\n class=\"auth-deep-blue-sm-medium\"\n >Sign In</a>\n </p>\n</div>\n" }]
3349
3642
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.Router }, { type: RTSeeAuthService }] });
3350
3643
 
@@ -3358,7 +3651,9 @@ class ForgotPasswordComponent {
3358
3651
  this.errorMessage = '';
3359
3652
  this.AuthEndpointsKeys = AuthEndpointsKeys;
3360
3653
  this.emailForm = this.formBuilder.group({
3361
- email: this.formBuilder.nonNullable.control('', { validators: [Validators.required, Validators.email] }),
3654
+ email: this.formBuilder.nonNullable.control('', {
3655
+ validators: [Validators.required, Validators.email],
3656
+ }),
3362
3657
  });
3363
3658
  this.forgotPasswordFormKeys = UtilsService.getKeysAsValueObject(this.emailForm.getRawValue());
3364
3659
  this.authConfiguration = this.authService.rtseeAuth.authConfiguration;
@@ -3373,18 +3668,23 @@ class ForgotPasswordComponent {
3373
3668
  this.errorMessage = '';
3374
3669
  this.successMessage = '';
3375
3670
  const email = this.emailForm.getRawValue().email;
3376
- this.authService.forgotPassword({ email }).subscribe({
3671
+ this.authService
3672
+ .forgotPassword({ email })
3673
+ .subscribe({
3377
3674
  next: (response) => {
3378
3675
  this.isLoading = false;
3379
- this.successMessage = response.message || 'Password reset email sent successfully!';
3676
+ this.successMessage =
3677
+ response.message || 'Password reset email sent successfully!';
3380
3678
  console.log('Password reset email sent successfully', response);
3381
3679
  void this.router.navigate(this.authConfiguration.getRoutePathSplit(this.AuthEndpointsKeys.SIGN_IN));
3382
3680
  },
3383
3681
  error: (error) => {
3384
3682
  this.isLoading = false;
3385
- this.errorMessage = error.error?.message || 'Error sending password reset email. Please try again.';
3683
+ this.errorMessage =
3684
+ error.error?.message ||
3685
+ 'Error sending password reset email. Please try again.';
3386
3686
  console.error('Error sending password reset email', error);
3387
- }
3687
+ },
3388
3688
  });
3389
3689
  }
3390
3690
  }
@@ -3402,7 +3702,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3402
3702
  InputText,
3403
3703
  FloatLabel,
3404
3704
  Message,
3405
- ProgressSpinner
3705
+ ProgressSpinner,
3406
3706
  ], standalone: true, template: "<div class=\"auth-container rtsee-form-container\">\n <img [ngSrc]=\"authConfiguration.appLogo\"\n alt=\"Company Logo\"\n class=\"auth-logo\"\n height=\"37\"\n width=\"37\"\n />\n <h2 class=\"auth-title\">Password Recovery</h2>\n <p class=\"auth-title-description\">Enter your email address to receive password reset instructions</p>\n\n <form class=\"auth-form rtsee-form\" [formGroup]=\"emailForm\" (ngSubmit)=\"submitEmail()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <input id=\"forgot-password-email\"\n pInputText\n [formControl]=\"emailField\"\n [class.p-invalid]=\"emailField.invalid && emailField.touched\"\n />\n <label for=\"forgot-password-email\">Email</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (emailField.hasError('required') && emailField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Email is required</p-message>\n }\n @if (emailField.hasError('email') && emailField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Please enter a valid email address</p-message>\n }\n </div>\n\n @if (successMessage) {\n <p-message class=\"rtsee-form-success-message\"\n severity=\"success\"\n variant=\"simple\"\n size=\"small\"\n >{{ successMessage }}</p-message>\n }\n\n @if (errorMessage) {\n <p-message class=\"rtsee-form-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ errorMessage }}</p-message>\n }\n\n <div class=\"rtsee-form-submit-container\">\n <p-button type=\"submit\"\n label=\"Send\"\n [disabled]=\"isLoading\"\n />\n @if (isLoading) {\n <p-progress-spinner class=\"rtsee-progress-spinner rtsee-progress-spinner-sm\"></p-progress-spinner>\n }\n </div>\n </form>\n\n <p class=\"rtsee-form-label\">\n <span>Remember your password?</span>\n <span>&nbsp;</span>\n <a href=\"#\"\n [routerLink]=\"authConfiguration.getRoutePathSplit(AuthEndpointsKeys.SIGN_IN)\"\n class=\"auth-deep-blue-sm-medium\"\n >Sign In</a>\n </p>\n</div>\n" }]
3407
3707
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.Router }, { type: RTSeeAuthService }] });
3408
3708
 
@@ -3427,13 +3727,25 @@ class ResetPasswordComponent {
3427
3727
  this.errorMessage = '';
3428
3728
  this.hidePassword = {
3429
3729
  password: true,
3430
- passwordConfirm: true
3730
+ passwordConfirm: true,
3431
3731
  };
3432
3732
  this.FormErrorKey = FormErrorKey;
3433
3733
  this.AuthEndpointsKeys = AuthEndpointsKeys;
3434
3734
  this.resetPasswordForm = this.formBuilder.group({
3435
- password: this.formBuilder.control('', { validators: [Validators.required, Validators.minLength(COMMON_CONSTANTS.minPasswordLength)], nonNullable: true }),
3436
- passwordConfirm: this.formBuilder.control('', { validators: [Validators.required, Validators.minLength(COMMON_CONSTANTS.minPasswordLength)], nonNullable: true }),
3735
+ password: this.formBuilder.control('', {
3736
+ validators: [
3737
+ Validators.required,
3738
+ Validators.minLength(COMMON_CONSTANTS.minPasswordLength),
3739
+ ],
3740
+ nonNullable: true,
3741
+ }),
3742
+ passwordConfirm: this.formBuilder.control('', {
3743
+ validators: [
3744
+ Validators.required,
3745
+ Validators.minLength(COMMON_CONSTANTS.minPasswordLength),
3746
+ ],
3747
+ nonNullable: true,
3748
+ }),
3437
3749
  }, { validators: [this.passwordMatchValidator()] });
3438
3750
  this.passwordFormKeys = UtilsService.getKeysAsValueObject(this.resetPasswordForm.value);
3439
3751
  this.authConfiguration = this.authService.authConfiguration;
@@ -3454,22 +3766,27 @@ class ResetPasswordComponent {
3454
3766
  this.errorMessage = '';
3455
3767
  this.successMessage = '';
3456
3768
  const formValues = this.resetPasswordForm.getRawValue();
3457
- this.authService.resetPassword({
3769
+ this.authService
3770
+ .resetPassword({
3458
3771
  password: formValues.password,
3459
3772
  passwordConfirm: formValues.passwordConfirm,
3460
- token: this.token
3461
- }).subscribe({
3773
+ token: this.token,
3774
+ })
3775
+ .subscribe({
3462
3776
  next: (response) => {
3463
3777
  this.isLoading = false;
3464
- this.successMessage = response.message || 'Password reset successfully!';
3778
+ this.successMessage =
3779
+ response.message || 'Password reset successfully!';
3465
3780
  console.log('Password reset successfully', response);
3466
3781
  void this.router.navigate(this.authConfiguration.getRoutePathSplit(this.AuthEndpointsKeys.SIGN_IN));
3467
3782
  },
3468
3783
  error: (error) => {
3469
3784
  this.isLoading = false;
3470
- this.errorMessage = error.error?.message || 'Error resetting password. Please try again.';
3785
+ this.errorMessage =
3786
+ error.error?.message ||
3787
+ 'Error resetting password. Please try again.';
3471
3788
  console.error('Error resetting password', error);
3472
- }
3789
+ },
3473
3790
  });
3474
3791
  }
3475
3792
  }
@@ -3480,10 +3797,14 @@ class ResetPasswordComponent {
3480
3797
  const passwordConfirm = form.value.passwordConfirm;
3481
3798
  if (password !== passwordConfirm) {
3482
3799
  if (form.controls.password.valid) {
3483
- form.controls.password.setErrors({ [FormErrorKey.passwordsMismatch]: true });
3800
+ form.controls.password.setErrors({
3801
+ [FormErrorKey.passwordsMismatch]: true,
3802
+ });
3484
3803
  }
3485
3804
  if (form.controls.passwordConfirm.valid) {
3486
- form.controls.passwordConfirm.setErrors({ [FormErrorKey.passwordsMismatch]: true });
3805
+ form.controls.passwordConfirm.setErrors({
3806
+ [FormErrorKey.passwordsMismatch]: true,
3807
+ });
3487
3808
  }
3488
3809
  return { [FormErrorKey.passwordsMismatch]: true };
3489
3810
  }
@@ -3509,7 +3830,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3509
3830
  Password,
3510
3831
  FloatLabel,
3511
3832
  Message,
3512
- ProgressSpinner
3833
+ ProgressSpinner,
3513
3834
  ], standalone: true, template: "<div class=\"auth-container rtsee-form-container\">\n <img [ngSrc]=\"authConfiguration.appLogo\"\n alt=\"Company Logo\"\n class=\"auth-logo\"\n height=\"37\"\n width=\"37\"\n />\n <h2 class=\"auth-title\">Password Reset</h2>\n <p class=\"auth-title-description\">Please enter a new password for your account.</p>\n\n <form class=\"auth-form rtsee-form\" [formGroup]=\"resetPasswordForm\" (ngSubmit)=\"resetPassword()\">\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-password id=\"new-password\"\n [formControl]=\"passwordField\"\n [feedback]=\"false\"\n [class]=\"(passwordField.invalid && passwordField.touched) || (resetPasswordForm.hasError(FormErrorKey.passwordsMismatch) && passwordField.touched) ? 'p-invalid' : ''\"\n />\n <label for=\"new-password\">New Password</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!passwordField.valid && passwordField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Password is required</p-message>\n }\n </div>\n <div class=\"rtsee-form-field-container\">\n <p-inputgroup>\n <p-floatlabel variant=\"on\">\n <p-password id=\"confirm-password\"\n [formControl]=\"passwordConfirmField\"\n [feedback]=\"false\"\n [class]=\"(passwordConfirmField.invalid && passwordConfirmField.touched) || (resetPasswordForm.hasError(FormErrorKey.passwordsMismatch) && passwordConfirmField.touched) ? 'p-invalid' : ''\"\n />\n <label for=\"confirm-password\">Confirm Password</label>\n </p-floatlabel>\n </p-inputgroup>\n @if (!passwordConfirmField.valid && passwordConfirmField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Password confirmation is required</p-message>\n }\n @if (resetPasswordForm.hasError(FormErrorKey.passwordsMismatch) && passwordConfirmField.touched) {\n <p-message class=\"rtsee-form-field-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >Passwords do not match</p-message>\n }\n </div>\n\n @if (successMessage) {\n <p-message class=\"rtsee-form-success-message\"\n severity=\"success\"\n variant=\"simple\"\n size=\"small\"\n >{{ successMessage }}</p-message>\n }\n\n @if (errorMessage) {\n <p-message class=\"rtsee-form-error-message\"\n severity=\"error\"\n variant=\"simple\"\n size=\"small\"\n >{{ errorMessage }}</p-message>\n }\n\n <div class=\"rtsee-form-submit-container\">\n <p-button type=\"submit\"\n label=\"Reset Password\"\n [disabled]=\"isLoading\"\n />\n @if (isLoading) {\n <p-progress-spinner class=\"rtsee-progress-spinner rtsee-progress-spinner-sm\"></p-progress-spinner>\n }\n </div>\n </form>\n\n <p class=\"rtsee-form-label\">\n <span>Remember your password?</span>\n <span>&nbsp;</span>\n <a href=\"#\" class=\"auth-deep-blue-sm-medium\">Sign In</a>\n </p>\n</div>\n" }]
3514
3835
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: RTSeeAuthService }] });
3515
3836
 
@@ -3519,10 +3840,7 @@ class PrivacyPolicyComponent {
3519
3840
  }
3520
3841
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: PrivacyPolicyComponent, decorators: [{
3521
3842
  type: Component,
3522
- args: [{ selector: 'rtsee-privacy-policy', imports: [
3523
- ButtonModule,
3524
- MessageModule
3525
- ], standalone: true, template: "<div class=\"privacy-policy-container\">\n <div class=\"policy-card\">\n <div class=\"header-section\">\n <div class=\"header-content\">\n <div class=\"flex justify-content-center align-items-center\">\n <h1>Terms of Use & Privacy Policy</h1>\n </div>\n </div>\n </div>\n\n <div class=\"content-section\">\n <p-message severity=\"info\" [closable]=\"false\" class=\"info-banner\">\n <ng-template pTemplate>\n <div class=\"p-message-content\">\n <p class=\"last-updated\"><strong>Last Updated:</strong> December 2024</p>\n <p>By using our services, you agree to the terms and conditions outlined in this document. Please read this Privacy Policy and Terms of Use carefully before using our platform.</p>\n </div>\n </ng-template>\n </p-message>\n\n <h2>1. Acceptance of Terms</h2>\n <p>By accessing and using this service, you accept and agree to be bound by the terms and provision of this agreement. If you do not agree to abide by the above, please do not use this service.</p>\n\n <h2>2. Privacy Policy</h2>\n\n <h3>2.1 Information We Collect</h3>\n <p>We collect information you provide directly to us, such as when you create an account, use our services, or contact us for support. This may include:</p>\n <ul>\n <li><strong>Personal Information:</strong> Name, email address, phone number, and other contact details</li>\n <li><strong>Account Information:</strong> Username, password, and profile information</li>\n <li><strong>Usage Data:</strong> Information about how you use our services, including pages visited, time spent, and features used</li>\n <li><strong>Device Information:</strong> IP address, browser type, operating system, and device identifiers</li>\n <li><strong>Cookies and Tracking:</strong> We use cookies and similar technologies to enhance your experience</li>\n </ul>\n\n <h3>2.2 How We Use Your Information</h3>\n <p>We use the information we collect to:</p>\n <ul>\n <li>Provide, maintain, and improve our services</li>\n <li>Process transactions and send related information</li>\n <li>Send technical notices, updates, security alerts, and support messages</li>\n <li>Respond to your comments, questions, and requests</li>\n <li>Monitor and analyze trends, usage, and activities</li>\n <li>Personalize and improve your experience</li>\n <li>Detect, investigate, and prevent fraudulent transactions and other illegal activities</li>\n </ul>\n\n <h3>2.3 Information Sharing and Disclosure</h3>\n <p>We do not sell, trade, or otherwise transfer your personal information to third parties without your consent, except in the following circumstances:</p>\n <ul>\n <li><strong>Service Providers:</strong> We may share information with trusted third-party service providers who assist us in operating our platform</li>\n <li><strong>Legal Requirements:</strong> We may disclose information when required by law or to protect our rights and safety</li>\n <li><strong>Business Transfers:</strong> In connection with any merger, sale of assets, or acquisition of all or a portion of our business</li>\n <li><strong>Consent:</strong> We may share information with your explicit consent</li>\n </ul>\n\n <h3>2.4 Data Security</h3>\n <p>We implement appropriate technical and organizational security measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the internet or electronic storage is 100% secure.</p>\n\n <h3>2.5 Data Retention</h3>\n <p>We retain your personal information for as long as necessary to provide our services and fulfill the purposes outlined in this privacy policy, unless a longer retention period is required or permitted by law.</p>\n\n <h3>2.6 Your Rights</h3>\n <p>Depending on your location, you may have certain rights regarding your personal information, including:</p>\n <ul>\n <li>The right to access and receive a copy of your personal information</li>\n <li>The right to rectify or update your personal information</li>\n <li>The right to erase your personal information</li>\n <li>The right to restrict or object to the processing of your personal information</li>\n <li>The right to data portability</li>\n <li>The right to withdraw consent at any time</li>\n </ul>\n\n <h2>3. Terms of Service</h2>\n\n <h3>3.1 User Accounts</h3>\n <p>To access certain features of our service, you may be required to create an account. You are responsible for:</p>\n <ul>\n <li>Maintaining the confidentiality of your account credentials</li>\n <li>All activities that occur under your account</li>\n <li>Notifying us immediately of any unauthorized use of your account</li>\n <li>Providing accurate and up-to-date information</li>\n </ul>\n\n <h3>3.2 Acceptable Use</h3>\n <p>You agree not to use our service for any unlawful purpose or any purpose prohibited under this clause. You may not use our service in any manner that could damage, disable, overburden, or impair our servers or networks.</p>\n\n <h3>3.3 Prohibited Activities</h3>\n <p>The following activities are prohibited:</p>\n <ul>\n <li>Violating any applicable laws or regulations</li>\n <li>Transmitting or procuring the sending of any unsolicited or unauthorized advertising</li>\n <li>Attempting to gain unauthorized access to any portion of our service</li>\n <li>Interfering with or disrupting the service or servers connected to the service</li>\n <li>Using any automated system to access the service for any purpose</li>\n <li>Impersonating any person or entity or misrepresenting your affiliation with a person or entity</li>\n </ul>\n\n <h3>3.4 Intellectual Property</h3>\n <p>The service and its original content, features, and functionality are and will remain the exclusive property of our company and its licensors. The service is protected by copyright, trademark, and other laws.</p>\n\n <h3>3.5 Termination</h3>\n <p>We may terminate or suspend your account and bar access to the service immediately, without prior notice or liability, under our sole discretion, for any reason whatsoever, including without limitation if you breach the Terms.</p>\n\n <h3>3.6 Disclaimer</h3>\n <p>The information on this service is provided on an \"as is\" basis. To the fullest extent permitted by law, this company excludes all representations, warranties, conditions and terms relating to our service and the use of this service.</p>\n\n <h3>3.7 Limitation of Liability</h3>\n <p>In no event shall our company, nor its directors, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your use of the service.</p>\n\n <h2>4. Cookies and Tracking Technologies</h2>\n <p>We use cookies and similar tracking technologies to track activity on our service and hold certain information. Cookies are files with a small amount of data which may include an anonymous unique identifier. You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent.</p>\n\n <h2>5. Third-Party Services</h2>\n <p>Our service may contain links to third-party websites or services that are not owned or controlled by us. We have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party websites or services.</p>\n\n <h2>6. Children's Privacy</h2>\n <p>Our service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us.</p>\n\n <h2>7. International Data Transfers</h2>\n <p>Your information may be transferred to and processed in countries other than your own. We ensure that such transfers comply with applicable data protection laws and implement appropriate safeguards to protect your personal information.</p>\n\n <h2>8. Changes to This Policy</h2>\n <p>We reserve the right to update or change our Privacy Policy and Terms of Use at any time. We will notify you of any changes by posting the new Privacy Policy and Terms of Use on this page and updating the \"Last Updated\" date.</p>\n\n <div class=\"contact-section\">\n <h2>9. Contact Information</h2>\n <p>If you have any questions about this Privacy Policy and Terms of Use, please contact us:</p>\n <ul>\n <li><strong>Email:</strong> [Your Email Address]</li>\n <li><strong>Address:</strong> [Your Company Address]</li>\n <li><strong>Phone:</strong> [Your Contact Number]</li>\n </ul>\n </div>\n\n <div class=\"footer-section\">\n <p>This document was last updated on December 2024</p>\n </div>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";.privacy-policy-container{min-height:100vh;background:linear-gradient(135deg,#667eea,#764ba2);padding:2rem 1rem}.privacy-policy-container .policy-card{max-width:1000px;margin:0 auto;background:#fffffff2;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:20px;box-shadow:0 20px 40px #0000001a;border:1px solid rgba(255,255,255,.2);overflow:hidden;transition:transform .3s ease,box-shadow .3s ease}.privacy-policy-container .policy-card:hover{transform:translateY(-5px);box-shadow:0 25px 50px #00000026}.privacy-policy-container .header-section{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:2rem;position:relative;overflow:hidden}.privacy-policy-container .header-section:before{content:\"\";position:absolute;inset:0;background:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><defs><pattern id=\"grain\" width=\"100\" height=\"100\" patternUnits=\"userSpaceOnUse\"><circle cx=\"25\" cy=\"25\" r=\"1\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"75\" cy=\"75\" r=\"1\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"50\" cy=\"10\" r=\"0.5\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"10\" cy=\"60\" r=\"0.5\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"90\" cy=\"40\" r=\"0.5\" fill=\"white\" opacity=\"0.1\"/></pattern></defs><rect width=\"100\" height=\"100\" fill=\"url(%23grain)\"/></svg>');opacity:.3}.privacy-policy-container .header-section .header-content{position:relative;z-index:1}.privacy-policy-container .header-section h1{font-size:2.5rem;font-weight:700;margin:0;text-shadow:0 2px 4px rgba(0,0,0,.3);background:linear-gradient(45deg,#fff,#f0f0f0);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.privacy-policy-container .content-section{padding:3rem}.privacy-policy-container .content-section .info-banner{background:linear-gradient(135deg,#e3f2fd,#bbdefb);border:none;border-radius:15px;box-shadow:0 5px 15px #2196f31a;margin-bottom:2rem}.privacy-policy-container .content-section .info-banner .p-message-content{padding:1.5rem}.privacy-policy-container .content-section .info-banner .p-message-content .last-updated{font-size:1.1rem;font-weight:600;color:#1976d2;margin-bottom:1rem}.privacy-policy-container .content-section .info-banner .p-message-content p{color:#424242;line-height:1.6;margin:0}.privacy-policy-container .content-section h2{color:#2c3e50;font-size:1.8rem;font-weight:600;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:3px solid #667eea;position:relative}.privacy-policy-container .content-section h2:before{content:\"\";position:absolute;bottom:-3px;left:0;width:50px;height:3px;background:linear-gradient(90deg,#667eea,#764ba2);border-radius:2px}.privacy-policy-container .content-section h3{color:#34495e;font-size:1.3rem;font-weight:600;margin:2rem 0 1rem;padding-left:1rem;border-left:4px solid #667eea;background:linear-gradient(90deg,rgba(102,126,234,.1),transparent);padding:.75rem 1rem;border-radius:0 8px 8px 0}.privacy-policy-container .content-section p{color:#555;line-height:1.7;margin-bottom:1.5rem;font-size:1rem}.privacy-policy-container .content-section ul{margin:1rem 0 2rem;padding-left:0}.privacy-policy-container .content-section ul li{color:#555;line-height:1.6;margin-bottom:.75rem;padding-left:2rem;position:relative;font-size:1rem}.privacy-policy-container .content-section ul li:before{content:\"\\25b6\";position:absolute;left:0;color:#667eea;font-size:.8rem;top:.2rem}.privacy-policy-container .content-section ul li strong{color:#2c3e50;font-weight:600}.privacy-policy-container .content-section .contact-section{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border-radius:15px;padding:2rem;margin-top:3rem;border:1px solid #dee2e6;box-shadow:0 5px 15px #0000000d}.privacy-policy-container .content-section .contact-section h2{color:#2c3e50;margin-top:0;border-bottom:3px solid #28a745}.privacy-policy-container .content-section .contact-section h2:before{background:linear-gradient(90deg,#28a745,#20c997)}.privacy-policy-container .content-section .contact-section ul li:before{color:#28a745}.privacy-policy-container .content-section .footer-section{text-align:center;margin-top:3rem;padding-top:2rem;border-top:2px solid #e9ecef}.privacy-policy-container .content-section .footer-section p{color:#6c757d;font-style:italic;font-size:.9rem;margin:0}@media (max-width: 768px){.privacy-policy-container{padding:1rem .5rem}.privacy-policy-container .policy-card{border-radius:15px}.privacy-policy-container .header-section{padding:1.5rem}.privacy-policy-container .header-section h1{font-size:2rem}.privacy-policy-container .content-section{padding:2rem 1.5rem}.privacy-policy-container .content-section h2{font-size:1.5rem}.privacy-policy-container .content-section h3{font-size:1.2rem}}@media (max-width: 480px){.privacy-policy-container .header-section h1{font-size:1.8rem}.privacy-policy-container .content-section{padding:1.5rem 1rem}.privacy-policy-container .content-section h2{font-size:1.3rem}.privacy-policy-container .content-section h3{font-size:1.1rem}}html{scroll-behavior:smooth}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:#f1f1f1;border-radius:4px}::-webkit-scrollbar-thumb{background:linear-gradient(135deg,#667eea,#764ba2);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:linear-gradient(135deg,#5a6fd8,#6a4190)}\n"] }]
3843
+ args: [{ selector: 'rtsee-privacy-policy', imports: [ButtonModule, MessageModule], standalone: true, template: "<div class=\"privacy-policy-container\">\n <div class=\"policy-card\">\n <div class=\"header-section\">\n <div class=\"header-content\">\n <div class=\"flex justify-content-center align-items-center\">\n <h1>Terms of Use & Privacy Policy</h1>\n </div>\n </div>\n </div>\n\n <div class=\"content-section\">\n <p-message severity=\"info\" [closable]=\"false\" class=\"info-banner\">\n <ng-template pTemplate>\n <div class=\"p-message-content\">\n <p class=\"last-updated\"><strong>Last Updated:</strong> December 2024</p>\n <p>By using our services, you agree to the terms and conditions outlined in this document. Please read this Privacy Policy and Terms of Use carefully before using our platform.</p>\n </div>\n </ng-template>\n </p-message>\n\n <h2>1. Acceptance of Terms</h2>\n <p>By accessing and using this service, you accept and agree to be bound by the terms and provision of this agreement. If you do not agree to abide by the above, please do not use this service.</p>\n\n <h2>2. Privacy Policy</h2>\n\n <h3>2.1 Information We Collect</h3>\n <p>We collect information you provide directly to us, such as when you create an account, use our services, or contact us for support. This may include:</p>\n <ul>\n <li><strong>Personal Information:</strong> Name, email address, phone number, and other contact details</li>\n <li><strong>Account Information:</strong> Username, password, and profile information</li>\n <li><strong>Usage Data:</strong> Information about how you use our services, including pages visited, time spent, and features used</li>\n <li><strong>Device Information:</strong> IP address, browser type, operating system, and device identifiers</li>\n <li><strong>Cookies and Tracking:</strong> We use cookies and similar technologies to enhance your experience</li>\n </ul>\n\n <h3>2.2 How We Use Your Information</h3>\n <p>We use the information we collect to:</p>\n <ul>\n <li>Provide, maintain, and improve our services</li>\n <li>Process transactions and send related information</li>\n <li>Send technical notices, updates, security alerts, and support messages</li>\n <li>Respond to your comments, questions, and requests</li>\n <li>Monitor and analyze trends, usage, and activities</li>\n <li>Personalize and improve your experience</li>\n <li>Detect, investigate, and prevent fraudulent transactions and other illegal activities</li>\n </ul>\n\n <h3>2.3 Information Sharing and Disclosure</h3>\n <p>We do not sell, trade, or otherwise transfer your personal information to third parties without your consent, except in the following circumstances:</p>\n <ul>\n <li><strong>Service Providers:</strong> We may share information with trusted third-party service providers who assist us in operating our platform</li>\n <li><strong>Legal Requirements:</strong> We may disclose information when required by law or to protect our rights and safety</li>\n <li><strong>Business Transfers:</strong> In connection with any merger, sale of assets, or acquisition of all or a portion of our business</li>\n <li><strong>Consent:</strong> We may share information with your explicit consent</li>\n </ul>\n\n <h3>2.4 Data Security</h3>\n <p>We implement appropriate technical and organizational security measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the internet or electronic storage is 100% secure.</p>\n\n <h3>2.5 Data Retention</h3>\n <p>We retain your personal information for as long as necessary to provide our services and fulfill the purposes outlined in this privacy policy, unless a longer retention period is required or permitted by law.</p>\n\n <h3>2.6 Your Rights</h3>\n <p>Depending on your location, you may have certain rights regarding your personal information, including:</p>\n <ul>\n <li>The right to access and receive a copy of your personal information</li>\n <li>The right to rectify or update your personal information</li>\n <li>The right to erase your personal information</li>\n <li>The right to restrict or object to the processing of your personal information</li>\n <li>The right to data portability</li>\n <li>The right to withdraw consent at any time</li>\n </ul>\n\n <h2>3. Terms of Service</h2>\n\n <h3>3.1 User Accounts</h3>\n <p>To access certain features of our service, you may be required to create an account. You are responsible for:</p>\n <ul>\n <li>Maintaining the confidentiality of your account credentials</li>\n <li>All activities that occur under your account</li>\n <li>Notifying us immediately of any unauthorized use of your account</li>\n <li>Providing accurate and up-to-date information</li>\n </ul>\n\n <h3>3.2 Acceptable Use</h3>\n <p>You agree not to use our service for any unlawful purpose or any purpose prohibited under this clause. You may not use our service in any manner that could damage, disable, overburden, or impair our servers or networks.</p>\n\n <h3>3.3 Prohibited Activities</h3>\n <p>The following activities are prohibited:</p>\n <ul>\n <li>Violating any applicable laws or regulations</li>\n <li>Transmitting or procuring the sending of any unsolicited or unauthorized advertising</li>\n <li>Attempting to gain unauthorized access to any portion of our service</li>\n <li>Interfering with or disrupting the service or servers connected to the service</li>\n <li>Using any automated system to access the service for any purpose</li>\n <li>Impersonating any person or entity or misrepresenting your affiliation with a person or entity</li>\n </ul>\n\n <h3>3.4 Intellectual Property</h3>\n <p>The service and its original content, features, and functionality are and will remain the exclusive property of our company and its licensors. The service is protected by copyright, trademark, and other laws.</p>\n\n <h3>3.5 Termination</h3>\n <p>We may terminate or suspend your account and bar access to the service immediately, without prior notice or liability, under our sole discretion, for any reason whatsoever, including without limitation if you breach the Terms.</p>\n\n <h3>3.6 Disclaimer</h3>\n <p>The information on this service is provided on an \"as is\" basis. To the fullest extent permitted by law, this company excludes all representations, warranties, conditions and terms relating to our service and the use of this service.</p>\n\n <h3>3.7 Limitation of Liability</h3>\n <p>In no event shall our company, nor its directors, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your use of the service.</p>\n\n <h2>4. Cookies and Tracking Technologies</h2>\n <p>We use cookies and similar tracking technologies to track activity on our service and hold certain information. Cookies are files with a small amount of data which may include an anonymous unique identifier. You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent.</p>\n\n <h2>5. Third-Party Services</h2>\n <p>Our service may contain links to third-party websites or services that are not owned or controlled by us. We have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party websites or services.</p>\n\n <h2>6. Children's Privacy</h2>\n <p>Our service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us.</p>\n\n <h2>7. International Data Transfers</h2>\n <p>Your information may be transferred to and processed in countries other than your own. We ensure that such transfers comply with applicable data protection laws and implement appropriate safeguards to protect your personal information.</p>\n\n <h2>8. Changes to This Policy</h2>\n <p>We reserve the right to update or change our Privacy Policy and Terms of Use at any time. We will notify you of any changes by posting the new Privacy Policy and Terms of Use on this page and updating the \"Last Updated\" date.</p>\n\n <div class=\"contact-section\">\n <h2>9. Contact Information</h2>\n <p>If you have any questions about this Privacy Policy and Terms of Use, please contact us:</p>\n <ul>\n <li><strong>Email:</strong> [Your Email Address]</li>\n <li><strong>Address:</strong> [Your Company Address]</li>\n <li><strong>Phone:</strong> [Your Contact Number]</li>\n </ul>\n </div>\n\n <div class=\"footer-section\">\n <p>This document was last updated on December 2024</p>\n </div>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";.privacy-policy-container{min-height:100vh;background:linear-gradient(135deg,#667eea,#764ba2);padding:2rem 1rem}.privacy-policy-container .policy-card{max-width:1000px;margin:0 auto;background:#fffffff2;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:20px;box-shadow:0 20px 40px #0000001a;border:1px solid rgba(255,255,255,.2);overflow:hidden;transition:transform .3s ease,box-shadow .3s ease}.privacy-policy-container .policy-card:hover{transform:translateY(-5px);box-shadow:0 25px 50px #00000026}.privacy-policy-container .header-section{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:2rem;position:relative;overflow:hidden}.privacy-policy-container .header-section:before{content:\"\";position:absolute;inset:0;background:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><defs><pattern id=\"grain\" width=\"100\" height=\"100\" patternUnits=\"userSpaceOnUse\"><circle cx=\"25\" cy=\"25\" r=\"1\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"75\" cy=\"75\" r=\"1\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"50\" cy=\"10\" r=\"0.5\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"10\" cy=\"60\" r=\"0.5\" fill=\"white\" opacity=\"0.1\"/><circle cx=\"90\" cy=\"40\" r=\"0.5\" fill=\"white\" opacity=\"0.1\"/></pattern></defs><rect width=\"100\" height=\"100\" fill=\"url(%23grain)\"/></svg>');opacity:.3}.privacy-policy-container .header-section .header-content{position:relative;z-index:1}.privacy-policy-container .header-section h1{font-size:2.5rem;font-weight:700;margin:0;text-shadow:0 2px 4px rgba(0,0,0,.3);background:linear-gradient(45deg,#fff,#f0f0f0);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.privacy-policy-container .content-section{padding:3rem}.privacy-policy-container .content-section .info-banner{background:linear-gradient(135deg,#e3f2fd,#bbdefb);border:none;border-radius:15px;box-shadow:0 5px 15px #2196f31a;margin-bottom:2rem}.privacy-policy-container .content-section .info-banner .p-message-content{padding:1.5rem}.privacy-policy-container .content-section .info-banner .p-message-content .last-updated{font-size:1.1rem;font-weight:600;color:#1976d2;margin-bottom:1rem}.privacy-policy-container .content-section .info-banner .p-message-content p{color:#424242;line-height:1.6;margin:0}.privacy-policy-container .content-section h2{color:#2c3e50;font-size:1.8rem;font-weight:600;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:3px solid #667eea;position:relative}.privacy-policy-container .content-section h2:before{content:\"\";position:absolute;bottom:-3px;left:0;width:50px;height:3px;background:linear-gradient(90deg,#667eea,#764ba2);border-radius:2px}.privacy-policy-container .content-section h3{color:#34495e;font-size:1.3rem;font-weight:600;margin:2rem 0 1rem;padding-left:1rem;border-left:4px solid #667eea;background:linear-gradient(90deg,rgba(102,126,234,.1),transparent);padding:.75rem 1rem;border-radius:0 8px 8px 0}.privacy-policy-container .content-section p{color:#555;line-height:1.7;margin-bottom:1.5rem;font-size:1rem}.privacy-policy-container .content-section ul{margin:1rem 0 2rem;padding-left:0}.privacy-policy-container .content-section ul li{color:#555;line-height:1.6;margin-bottom:.75rem;padding-left:2rem;position:relative;font-size:1rem}.privacy-policy-container .content-section ul li:before{content:\"\\25b6\";position:absolute;left:0;color:#667eea;font-size:.8rem;top:.2rem}.privacy-policy-container .content-section ul li strong{color:#2c3e50;font-weight:600}.privacy-policy-container .content-section .contact-section{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border-radius:15px;padding:2rem;margin-top:3rem;border:1px solid #dee2e6;box-shadow:0 5px 15px #0000000d}.privacy-policy-container .content-section .contact-section h2{color:#2c3e50;margin-top:0;border-bottom:3px solid #28a745}.privacy-policy-container .content-section .contact-section h2:before{background:linear-gradient(90deg,#28a745,#20c997)}.privacy-policy-container .content-section .contact-section ul li:before{color:#28a745}.privacy-policy-container .content-section .footer-section{text-align:center;margin-top:3rem;padding-top:2rem;border-top:2px solid #e9ecef}.privacy-policy-container .content-section .footer-section p{color:#6c757d;font-style:italic;font-size:.9rem;margin:0}@media (max-width: 768px){.privacy-policy-container{padding:1rem .5rem}.privacy-policy-container .policy-card{border-radius:15px}.privacy-policy-container .header-section{padding:1.5rem}.privacy-policy-container .header-section h1{font-size:2rem}.privacy-policy-container .content-section{padding:2rem 1.5rem}.privacy-policy-container .content-section h2{font-size:1.5rem}.privacy-policy-container .content-section h3{font-size:1.2rem}}@media (max-width: 480px){.privacy-policy-container .header-section h1{font-size:1.8rem}.privacy-policy-container .content-section{padding:1.5rem 1rem}.privacy-policy-container .content-section h2{font-size:1.3rem}.privacy-policy-container .content-section h3{font-size:1.1rem}}html{scroll-behavior:smooth}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:#f1f1f1;border-radius:4px}::-webkit-scrollbar-thumb{background:linear-gradient(135deg,#667eea,#764ba2);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:linear-gradient(135deg,#5a6fd8,#6a4190)}\n"] }]
3526
3844
  }] });
3527
3845
 
3528
3846
  class RTSeeAuthComponent {
@@ -3538,8 +3856,7 @@ class RTSeeAuthComponent {
3538
3856
  else if (window.location.pathname.includes(DEFAULT_ROUTE_NAMES[AuthEndpointsKeys.FORGOT_PASSWORD])) {
3539
3857
  this.activeComponent = 'forgot-password';
3540
3858
  }
3541
- else if (window.location.pathname
3542
- .includes(DEFAULT_ROUTE_NAMES[AuthEndpointsKeys.RESET_PASSWORD].split('/')[0])) {
3859
+ else if (window.location.pathname.includes(DEFAULT_ROUTE_NAMES[AuthEndpointsKeys.RESET_PASSWORD].split('/')[0])) {
3543
3860
  this.activeComponent = 'reset-password';
3544
3861
  }
3545
3862
  else if (window.location.pathname.includes(DEFAULT_ROUTE_NAMES[AuthEndpointsKeys.PRIVACY_POLICY])) {
@@ -3559,7 +3876,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3559
3876
  SignUpComponent,
3560
3877
  ForgotPasswordComponent,
3561
3878
  ResetPasswordComponent,
3562
- PrivacyPolicyComponent
3879
+ PrivacyPolicyComponent,
3563
3880
  ], standalone: true, template: "<div class=\"rtsee-auth\">\n @if (authService.rtseeAuth) {\n @if (activeComponent === 'sign-in') {\n <rtsee-sign-in></rtsee-sign-in>\n }\n @if (activeComponent === 'sign-up') {\n <rtsee-sign-up></rtsee-sign-up>\n }\n @if (activeComponent === 'forgot-password') {\n <rtsee-forgot-password></rtsee-forgot-password>\n }\n @if (activeComponent === 'reset-password') {\n <rtsee-reset-password></rtsee-reset-password>\n }\n @if (activeComponent === 'privacy-policy') {\n <rtsee-privacy-policy></rtsee-privacy-policy>\n }\n }\n</div>\n" }]
3564
3881
  }], ctorParameters: () => [{ type: RTSeeAuthService }], propDecorators: { auth: [{
3565
3882
  type: Input
@@ -3610,11 +3927,7 @@ class SearchComponent {
3610
3927
  }
3611
3928
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SearchComponent, decorators: [{
3612
3929
  type: Component,
3613
- args: [{ selector: 'rtsee-search', imports: [
3614
- ReactiveFormsModule,
3615
- PreloaderComponent,
3616
- NgForOf
3617
- ], standalone: true, template: "<div class=\"rtsee-messenger-search\">\n <input type=\"text\"\n [formControl]=\"queryControl\"\n class=\"rtsee-messenger-search-input\"\n placeholder=\"Search\"/>\n</div>\n\n<div class=\"rtsee-messenger-search-results\">\n <rtsee-preloader [diameter]=\"50\"\n *ngIf=\"search.searchInProgress\"\n ></rtsee-preloader>\n <p>Chats</p>\n <div class=\"rtsee-messenger-search-results-chats\">\n <div *ngFor=\"let chat of search.results.chats\"\n class=\"rtsee-messenger-search-results-chat-wrapper\">\n <p>{{chat.name}}</p>\n </div>\n </div>\n <p>Messages</p>\n <div class=\"rtsee-messenger-search-results-messages\">\n <div *ngFor=\"let message of search.results.messages\" class=\"rtsee-messenger-search-results-message-wrapper\">\n <p>{{message.chatName || message.senderName }}</p>\n </div>\n </div>\n</div>\n" }]
3930
+ args: [{ selector: 'rtsee-search', imports: [ReactiveFormsModule, PreloaderComponent, NgForOf], standalone: true, template: "<div class=\"rtsee-messenger-search\">\n <input type=\"text\"\n [formControl]=\"queryControl\"\n class=\"rtsee-messenger-search-input\"\n placeholder=\"Search\"/>\n</div>\n\n<div class=\"rtsee-messenger-search-results\">\n <rtsee-preloader [diameter]=\"50\"\n *ngIf=\"search.searchInProgress\"\n ></rtsee-preloader>\n <p>Chats</p>\n <div class=\"rtsee-messenger-search-results-chats\">\n <div *ngFor=\"let chat of search.results.chats\"\n class=\"rtsee-messenger-search-results-chat-wrapper\">\n <p>{{chat.name}}</p>\n </div>\n </div>\n <p>Messages</p>\n <div class=\"rtsee-messenger-search-results-messages\">\n <div *ngFor=\"let message of search.results.messages\" class=\"rtsee-messenger-search-results-message-wrapper\">\n <p>{{message.chatName || message.senderName }}</p>\n </div>\n </div>\n</div>\n" }]
3618
3931
  }], propDecorators: { search: [{
3619
3932
  type: Input
3620
3933
  }] } });
@@ -3641,9 +3954,7 @@ class ContactsMultiselectComponent {
3641
3954
  }
3642
3955
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ContactsMultiselectComponent, decorators: [{
3643
3956
  type: Component,
3644
- args: [{ selector: 'rtsee-contacts-multiselect', imports: [
3645
- SearchComponent
3646
- ], standalone: true, template: "<div class=\"rtsee-messenger-contacts-multiselect\">\n <rtsee-search [search]=\"search\"></rtsee-search>\n</div>\n" }]
3957
+ args: [{ selector: 'rtsee-contacts-multiselect', imports: [SearchComponent], standalone: true, template: "<div class=\"rtsee-messenger-contacts-multiselect\">\n <rtsee-search [search]=\"search\"></rtsee-search>\n</div>\n" }]
3647
3958
  }], propDecorators: { menuState: [{
3648
3959
  type: Input
3649
3960
  }], search: [{
@@ -3672,7 +3983,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3672
3983
  NgIf,
3673
3984
  SearchComponent,
3674
3985
  ManageChatComponent,
3675
- ContactsMultiselectComponent
3986
+ ContactsMultiselectComponent,
3676
3987
  ], standalone: true, template: "<div class=\"rtsee-messenger-main-menu\">\n <div class=\"rtsee-messenger-main-menu-home\" *ngIf=\"state.activePanel === MainMenuPanels.HOME\">\n <ul class=\"rtsee-messenger-controls\">\n <li>\n <div class=\"rtsee-messenger-control-item\" (click)=\"onNewGroupClicked()\">\n <div class=\"rtsee-messenger-control-icon\">\n <span class=\"material-icons-outlined\">people</span>\n </div>\n <span>New Group</span>\n </div>\n </li>\n <li>\n <div class=\"rtsee-messenger-control-item\" (click)=\"onNewChannelClicked()\">\n <div class=\"rtsee-messenger-control-icon\">\n <span class=\"material-icons-outlined\">campaign</span>\n </div>\n <span>New Channel</span>\n </div>\n </li>\n </ul>\n <rtsee-search [search]=\"search\" ></rtsee-search>\n </div>\n\n <rtsee-manage-chat *ngIf=\"state.activePanel === MainMenuPanels.MANAGE_CHAT\"\n [messenger]=\"messenger\"\n [menuState]=\"state\"\n ></rtsee-manage-chat>\n <rtsee-contacts-multiselect [search]=\"search\"\n [menuState]=\"state\"\n *ngIf=\"state.activePanel === MainMenuPanels.CONTACTS_SELECT\"\n ></rtsee-contacts-multiselect>\n</div>\n" }]
3677
3988
  }], propDecorators: { search: [{
3678
3989
  type: Input
@@ -3695,7 +4006,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3695
4006
  type: Directive,
3696
4007
  args: [{
3697
4008
  selector: '[rtseeShave]',
3698
- standalone: true
4009
+ standalone: true,
3699
4010
  }]
3700
4011
  }], ctorParameters: () => [{ type: i0.ElementRef }] });
3701
4012
 
@@ -3760,20 +4071,22 @@ class RTSeeModule {
3760
4071
  NgOptimizedImage,
3761
4072
  RouterLink,
3762
4073
  RouterLinkActive,
3763
- NgxCaptchaModule], exports: [RTSeeConferenceComponent,
4074
+ NgxCaptchaModule,
4075
+ FormComponent], exports: [RTSeeConferenceComponent,
3764
4076
  MessengerComponent,
3765
4077
  RtseeEventsDashboardComponent,
3766
4078
  RTSeeContainerComponent,
3767
4079
  PresentationComponent,
3768
4080
  RTSeeAuthComponent,
3769
- PaymentProductSnippetComponent] }); }
4081
+ PaymentProductSnippetComponent,
4082
+ FormComponent] }); }
3770
4083
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RTSeeModule, providers: [
3771
4084
  provideAnimationsAsync(),
3772
4085
  providePrimeNG({
3773
4086
  theme: {
3774
- preset: Aura
3775
- }
3776
- })
4087
+ preset: Aura,
4088
+ },
4089
+ }),
3777
4090
  ], imports: [RTSeeAuthComponent,
3778
4091
  ForgotPasswordComponent,
3779
4092
  SignInComponent,
@@ -3800,7 +4113,8 @@ class RTSeeModule {
3800
4113
  AutosizeModule,
3801
4114
  InfiniteScrollModule,
3802
4115
  FormsModule,
3803
- NgxCaptchaModule] }); }
4116
+ NgxCaptchaModule,
4117
+ FormComponent] }); }
3804
4118
  }
3805
4119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RTSeeModule, decorators: [{
3806
4120
  type: NgModule,
@@ -3809,9 +4123,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3809
4123
  provideAnimationsAsync(),
3810
4124
  providePrimeNG({
3811
4125
  theme: {
3812
- preset: Aura
3813
- }
3814
- })
4126
+ preset: Aura,
4127
+ },
4128
+ }),
3815
4129
  ],
3816
4130
  declarations: [],
3817
4131
  imports: [
@@ -3865,7 +4179,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3865
4179
  NgOptimizedImage,
3866
4180
  RouterLink,
3867
4181
  RouterLinkActive,
3868
- NgxCaptchaModule
4182
+ NgxCaptchaModule,
4183
+ FormComponent,
3869
4184
  ],
3870
4185
  exports: [
3871
4186
  RTSeeConferenceComponent,
@@ -3874,11 +4189,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3874
4189
  RTSeeContainerComponent,
3875
4190
  PresentationComponent,
3876
4191
  RTSeeAuthComponent,
3877
- PaymentProductSnippetComponent
4192
+ PaymentProductSnippetComponent,
4193
+ FormComponent,
3878
4194
  ],
3879
- schemas: [
3880
- CUSTOM_ELEMENTS_SCHEMA,
3881
- ]
4195
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
3882
4196
  }]
3883
4197
  }] });
3884
4198
 
@@ -3890,5 +4204,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
3890
4204
  * Generated bundle index. Do not edit.
3891
4205
  */
3892
4206
 
3893
- export { EntitiesConfigurationsListComponent, EntitiesListComponent, ManageEntityComponent, ManageEntityConfigurationComponent, MessengerComponent, NgxService, PaymentProductSnippetComponent, PresentationComponent, ProfileComponent, RTSeeAuthComponent, RTSeeConferenceComponent, RTSeeContainerComponent, RTSeeControlsComponent, RTSeeModule, RtseeEntityCommentsComponent, RtseeEntityPreviewComponent, RtseeEntityTagsComponent, RtseeEventsDashboardComponent, RtseePeerComponent, RtseeSettingsComponent, RtseeTagGroupManageComponent, RtseeTagGroupsManageComponent, RtseeTagManageComponent, RtseeTagsAccordionMenuComponent };
4207
+ export { EntitiesConfigurationsListComponent, EntitiesListComponent, FormComponent, ManageEntityComponent, ManageEntityConfigurationComponent, MessengerComponent, NgxService, PaymentProductSnippetComponent, PresentationComponent, ProfileComponent, RTSeeAuthComponent, RTSeeConferenceComponent, RTSeeContainerComponent, RTSeeControlsComponent, RTSeeModule, RtseeEntityCommentsComponent, RtseeEntityPreviewComponent, RtseeEntityTagsComponent, RtseeEventsDashboardComponent, RtseePeerComponent, RtseeSettingsComponent, RtseeTagGroupManageComponent, RtseeTagGroupsManageComponent, RtseeTagManageComponent, RtseeTagsAccordionMenuComponent };
3894
4208
  //# sourceMappingURL=rtsee-ngx.mjs.map