diff --git a/apps/red-ui/src/app/modules/admin/admin.routes.ts b/apps/red-ui/src/app/modules/admin/admin.routes.ts
index fd10a56ab..233f15870 100644
--- a/apps/red-ui/src/app/modules/admin/admin.routes.ts
+++ b/apps/red-ui/src/app/modules/admin/admin.routes.ts
@@ -1,22 +1,24 @@
-import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
-import { RedRoleGuard } from '@users/red-role.guard';
-import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
+import { ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
-import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
-import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
-import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
-import { AuditScreenComponent } from './screens/audit/audit-screen.component';
-import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
+import { templateExistsWhenEnteringAdmin } from '@guards/dossier-template-exists.guard';
+import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
+import { entityExistsGuard } from '@guards/entity-exists-guard.service';
+import { PermissionsGuard } from '@guards/permissions-guard';
+import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
+import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
+import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
+import { CopilotService } from '@services/copilot.service';
+import { RedRoleGuard } from '@users/red-role.guard';
+import { Roles } from '@users/roles';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
-import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
-import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
-import { templateExistsWhenEnteringAdmin } from '@guards/dossier-template-exists.guard';
-import { entityExistsGuard } from '@guards/entity-exists-guard.service';
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
-import { PermissionsGuard } from '@guards/permissions-guard';
-import { Roles } from '@users/roles';
-import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
+import { AuditScreenComponent } from './screens/audit/audit-screen.component';
+import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
+import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
+import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
+import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
+import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
import { AdminDialogService } from './services/admin-dialog.service';
import { AuditService } from './services/audit.service';
import { DigitalSignatureService } from './services/digital-signature.service';
@@ -78,7 +80,22 @@ const dossierTemplateIdRoutes: IqserRoutes = [
},
type: 'ENTITY',
},
- providers: [RulesService],
+ providers: [
+ RulesService,
+ {
+ provide: ENVIRONMENT_INITIALIZER,
+ multi: true,
+ useFactory: () => {
+ const service = inject(CopilotService);
+ return () => {
+ setTimeout(() => {
+ service.connect('/api/llm/llm-websocket');
+ console.log('Copilot ready');
+ }, 2000);
+ };
+ },
+ },
+ ],
},
{
path: 'component-rules',
diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.html
index 82d524af4..5ade8725a 100644
--- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.html
+++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.html
@@ -1,9 +1,57 @@
-
+
+
+
+
+
+
+
+
+
+ @for (comment of responses$ | async; track comment) {
+
+ }
+
+
+
+
+
+
+
+
+
@@ -13,15 +61,15 @@
@@ -30,11 +78,11 @@
diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.scss b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.scss
index 49e950daf..702bc576e 100644
--- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.scss
+++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.scss
@@ -81,3 +81,18 @@ ngx-monaco-editor {
gap: 24px;
}
}
+
+.right-container {
+ display: flex;
+ width: 375px;
+ min-width: 375px;
+ padding: 16px 24px 16px 24px;
+
+ &.has-scrollbar:hover {
+ padding-right: 13px;
+ }
+
+ redaction-dossier-details {
+ width: 100%;
+ }
+}
diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts
index d992fb0b7..9e133bfa6 100644
--- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts
+++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts
@@ -1,22 +1,29 @@
-import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, OnInit, signal } from '@angular/core';
-import { PermissionsService } from '@services/permissions.service';
-import { IconButtonComponent, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
-import { RulesService } from '../../../services/rules.service';
-import { firstValueFrom } from 'rxjs';
-import { DOSSIER_TEMPLATE_ID, DroolsKeywords, IRules } from '@red/domain';
-import { EditorThemeService } from '@services/editor-theme.service';
+import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
+import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, inject, input, OnInit, signal } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
+import { FormsModule } from '@angular/forms';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
+import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
+import { TenantsService } from '@common-ui/tenants';
+import { getCurrentUser } from '@common-ui/users';
+import { NamePipe } from '@common-ui/users/name.pipe';
import { ComponentCanDeactivate } from '@guards/can-deactivate.guard';
-import { Debounce, getParam } from '@iqser/common-ui/lib/utils';
-import { ActivatedRoute } from '@angular/router';
+import { CircleButtonComponent, IconButtonComponent, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
+import { Debounce, IqserTooltipPositions } from '@iqser/common-ui/lib/utils';
+import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
+import { TranslateModule } from '@ngx-translate/core';
+import { DroolsKeywords, IRules } from '@red/domain';
+import { CopilotService } from '@services/copilot.service';
+import { EditorThemeService } from '@services/editor-theme.service';
+import { PermissionsService } from '@services/permissions.service';
+import { DatePipe } from '@shared/pipes/date.pipe';
+import { BehaviorSubject, firstValueFrom } from 'rxjs';
+import { RulesService } from '../../../services/rules.service';
import { rulesScreenTranslations } from '../../../translations/rules-screen-translations';
import ICodeEditor = monaco.editor.ICodeEditor;
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions;
-import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
-import { MatIcon } from '@angular/material/icon';
-import { FormsModule } from '@angular/forms';
-import { NgIf } from '@angular/common';
-import { TranslateModule } from '@ngx-translate/core';
interface SyntaxError {
line: number;
@@ -38,11 +45,35 @@ const RULE_VALIDATION_TIMEOUT = 2000;
styleUrls: ['./rules-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
- imports: [MonacoEditorModule, MatIcon, FormsModule, IconButtonComponent, NgIf, TranslateModule],
+ imports: [
+ MonacoEditorModule,
+ MatIcon,
+ FormsModule,
+ IconButtonComponent,
+ NgIf,
+ TranslateModule,
+ AsyncPipe,
+ NgTemplateOutlet,
+ CircleButtonComponent,
+ DatePipe,
+ InputWithActionComponent,
+ NamePipe,
+ NgForOf,
+ MatTooltip,
+ ],
})
export default class RulesScreenComponent implements OnInit, ComponentCanDeactivate {
+ readonly #errorGlyphs = signal([]);
+ #codeEditor: ICodeEditor;
+ #decorations: string[] = [];
+ readonly #errors = signal([]);
+ #ruleValidationTimeout: number = null;
+ readonly #copilotService = inject(CopilotService);
+ readonly #currentUser = getCurrentUser();
+ protected readonly collapsed = signal(true);
+ protected readonly IqserTooltipPositions = IqserTooltipPositions;
+ readonly dossierTemplateId = input.required();
readonly translations = rulesScreenTranslations;
-
readonly iconButtonTypes = IconButtonTypes;
readonly editorOptions: IStandaloneEditorConstructionOptions = {
theme: 'vs',
@@ -55,15 +86,33 @@ export default class RulesScreenComponent implements OnInit, ComponentCanDeactiv
initialLines: string[] = [];
currentLines: string[] = [];
isLeaving = false;
- readonly type: IRules['ruleFileType'];
- readonly #errorGlyphs = signal([]);
+ readonly type = input.required();
readonly numberOfErrors = computed(() => this.#errors().filter(e => !e.warning).length);
readonly numberOfWarnings = computed(() => this.#errors().filter(e => e.warning).length);
- readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
- #codeEditor: ICodeEditor;
- #decorations: string[] = [];
- #errors = signal([]);
- #ruleValidationTimeout: number = null;
+ readonly responses$ = new BehaviorSubject<{ text: string; date: string }[]>([]);
+
+ constructor(
+ readonly permissionsService: PermissionsService,
+ private readonly _rulesService: RulesService,
+ private readonly _changeDetectorRef: ChangeDetectorRef,
+ private readonly _toaster: Toaster,
+ private readonly _loadingService: LoadingService,
+ private readonly _editorThemeService: EditorThemeService,
+ ) {
+ const username = this.#currentUser.username;
+ const tenant = inject(TenantsService).activeTenantId;
+ this.#copilotService
+ .listen('/user/' + username + '/queue/' + tenant + '/rules-copilot')
+ .pipe(takeUntilDestroyed())
+ .subscribe(response => {
+ console.log('WS response: ' + response);
+ });
+
+ this.#copilotService.publish({
+ destination: '/app/rules-copilot',
+ body: JSON.stringify({ prompts: ['manageradmin'] }),
+ });
+ }
set isLeavingPage(isLeaving: boolean) {
this.isLeaving = isLeaving;
@@ -85,16 +134,13 @@ export default class RulesScreenComponent implements OnInit, ComponentCanDeactiv
this.#closeProblemsView();
}
- constructor(
- readonly permissionsService: PermissionsService,
- private readonly _rulesService: RulesService,
- private readonly _changeDetectorRef: ChangeDetectorRef,
- private readonly _toaster: Toaster,
- private readonly _loadingService: LoadingService,
- private readonly _editorThemeService: EditorThemeService,
- private readonly _route: ActivatedRoute,
- ) {
- this.type = this._route.snapshot.data.type;
+ add(question: string) {
+ console.log(question);
+ this.responses$.next([...this.responses$.value, { text: question, date: new Date().toISOString() }]);
+ this.#copilotService.publish({
+ destination: '/app/rules-copilot',
+ body: JSON.stringify({ prompts: [question] }),
+ });
}
async ngOnInit() {
@@ -142,12 +188,20 @@ export default class RulesScreenComponent implements OnInit, ComponentCanDeactiv
await this.#uploadRules();
}
+ revert(): void {
+ this.currentLines = this.initialLines;
+ this.#decorations = this.#codeEditor?.deltaDecorations(this.#decorations, []) || [];
+ this.#removeErrorMarkers();
+ this._changeDetectorRef.detectChanges();
+ this._loadingService.stop();
+ }
+
async #uploadRules(dryRun = false) {
return firstValueFrom(
this._rulesService.uploadRules({
rules: this.#getValue(),
- dossierTemplateId: this.#dossierTemplateId,
- ruleFileType: this.type,
+ dossierTemplateId: this.dossierTemplateId(),
+ ruleFileType: this.type(),
dryRun,
}),
).then(
@@ -156,7 +210,7 @@ export default class RulesScreenComponent implements OnInit, ComponentCanDeactiv
this.#drawErrorMarkers(errors);
if (!dryRun) {
await this.#initialize();
- this._toaster.success(rulesScreenTranslations[this.type]['success.generic']);
+ this._toaster.success(rulesScreenTranslations[this.type()]['success.generic']);
}
},
error => {
@@ -173,20 +227,12 @@ export default class RulesScreenComponent implements OnInit, ComponentCanDeactiv
this.#drawErrorMarkers(errors);
this._loadingService.stop();
if (!dryRun) {
- this._toaster.error(rulesScreenTranslations[this.type]['error.generic']);
+ this._toaster.error(rulesScreenTranslations[this.type()]['error.generic']);
}
},
);
}
- revert(): void {
- this.currentLines = this.initialLines;
- this.#decorations = this.#codeEditor?.deltaDecorations(this.#decorations, []) || [];
- this.#removeErrorMarkers();
- this._changeDetectorRef.detectChanges();
- this._loadingService.stop();
- }
-
#mapErrors(response: UploadResponse, dryRun = false) {
const warnings = response.deprecatedWarnings.map(w => ({ ...w, warning: true }));
if (dryRun) {
@@ -296,7 +342,7 @@ export default class RulesScreenComponent implements OnInit, ComponentCanDeactiv
async #initialize() {
this._loadingService.start();
- await firstValueFrom(this._rulesService.download(this.#dossierTemplateId, this.type)).then(
+ await firstValueFrom(this._rulesService.download(this.dossierTemplateId(), this.type())).then(
rules => {
this.currentLines = this.initialLines = rules.rules.split('\n');
this.revert();
diff --git a/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts
index 9e6bfb412..bbd901aaa 100644
--- a/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts
+++ b/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts
@@ -1,9 +1,11 @@
+import { AsyncPipe, NgIf } from '@angular/common';
import { Component, ElementRef, HostListener, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
CircleButtonTypes,
CustomError,
ErrorService,
+ HasScrollbarDirective,
IqserListingModule,
IqserPermissionsService,
ListingComponent,
@@ -16,6 +18,7 @@ import {
} from '@iqser/common-ui';
import { NestedFilter } from '@iqser/common-ui/lib/filtering';
import { getParam, OnAttach, OnDetach, shareLast } from '@iqser/common-ui/lib/utils';
+import { TranslateModule } from '@ngx-translate/core';
import {
Dossier,
DOSSIER_ID,
@@ -26,6 +29,7 @@ import {
WorkflowFileStatus,
} from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
+import { DossiersCacheService } from '@services/dossiers/dossiers-cache.service';
import { DossiersService } from '@services/dossiers/dossiers.service';
import { DossierAttributesService } from '@services/entity-services/dossier-attributes.service';
import { dossiersServiceProvider } from '@services/entity-services/dossiers.service.provider';
@@ -33,6 +37,7 @@ import { FileAttributesService } from '@services/entity-services/file-attributes
import { FilesMapService } from '@services/files/files-map.service';
import { FilesService } from '@services/files/files.service';
import { PermissionsService } from '@services/permissions.service';
+import { TypeFilterComponent } from '@shared/components/type-filter/type-filter.component';
import { FileUploadModel } from '@upload-download/model/file-upload.model';
import { FileDropOverlayService } from '@upload-download/services/file-drop-overlay.service';
import { FileUploadService } from '@upload-download/services/file-upload.service';
@@ -42,17 +47,13 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { convertFiles, Files, handleFileDrop } from '@utils/index';
import { merge, Observable } from 'rxjs';
import { filter, skip, switchMap, tap } from 'rxjs/operators';
+import { DossierOverviewBulkActionsComponent } from '../components/bulk-actions/dossier-overview-bulk-actions.component';
+import { DossierDetailsComponent } from '../components/dossier-details/dossier-details.component';
+import { DossierOverviewScreenHeaderComponent } from '../components/screen-header/dossier-overview-screen-header.component';
+import { TableItemComponent } from '../components/table-item/table-item.component';
+import { WorkflowItemComponent } from '../components/workflow-item/workflow-item.component';
import { ConfigService } from '../config.service';
import { BulkActionsService } from '../services/bulk-actions.service';
-import { DossiersCacheService } from '@services/dossiers/dossiers-cache.service';
-import { AsyncPipe, NgIf } from '@angular/common';
-import { DossierOverviewScreenHeaderComponent } from '../components/screen-header/dossier-overview-screen-header.component';
-import { TranslateModule } from '@ngx-translate/core';
-import { WorkflowItemComponent } from '../components/workflow-item/workflow-item.component';
-import { DossierDetailsComponent } from '../components/dossier-details/dossier-details.component';
-import { DossierOverviewBulkActionsComponent } from '../components/bulk-actions/dossier-overview-bulk-actions.component';
-import { TableItemComponent } from '../components/table-item/table-item.component';
-import { TypeFilterComponent } from '@shared/components/type-filter/type-filter.component';
@Component({
templateUrl: './dossier-overview-screen.component.html',
@@ -70,6 +71,7 @@ import { TypeFilterComponent } from '@shared/components/type-filter/type-filter.
DossierOverviewBulkActionsComponent,
TableItemComponent,
TypeFilterComponent,
+ HasScrollbarDirective,
],
})
export default class DossierOverviewScreenComponent extends ListingComponent implements OnInit, OnAttach, OnDetach, OnDestroy {
diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts
index e4abcaae4..b4e5f147d 100644
--- a/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts
+++ b/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts
@@ -6,6 +6,7 @@ import { AnnotationActionsService } from './services/annotation-actions.service'
import { AnnotationProcessingService } from './services/annotation-processing.service';
import { AnnotationReferencesService } from './services/annotation-references.service';
import { AnnotationsListingService } from './services/annotations-listing.service';
+import { ComponentLogFilterService } from './services/component-log-filter.service';
import { DocumentInfoService } from './services/document-info.service';
import { ExcludedPagesService } from './services/excluded-pages.service';
import { FileDataService } from './services/file-data.service';
@@ -16,7 +17,6 @@ import { PdfProxyService } from './services/pdf-proxy.service';
import { SkippedService } from './services/skipped.service';
import { StampService } from './services/stamp.service';
import { ViewModeService } from './services/view-mode.service';
-import { ComponentLogFilterService } from './services/component-log-filter.service';
export const filePreviewScreenProviders = [
FilterService,
diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview.routes.ts b/apps/red-ui/src/app/modules/file-preview/file-preview.routes.ts
index ca59f7a45..95d6028c9 100644
--- a/apps/red-ui/src/app/modules/file-preview/file-preview.routes.ts
+++ b/apps/red-ui/src/app/modules/file-preview/file-preview.routes.ts
@@ -1,11 +1,13 @@
-import { IqserRoutes } from '@iqser/common-ui';
-import { FilePreviewScreenComponent } from './file-preview-screen.component';
+import { ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
+import { IqserRoutes } from '@iqser/common-ui';
+import { WebSocketService } from '@services/web-socket.service';
+import { FileAssignService } from '../shared-dossiers/services/file-assign.service';
+import { FilePreviewScreenComponent } from './file-preview-screen.component';
import { DocumentUnloadedGuard } from './services/document-unloaded.guard';
import { FilePreviewDialogService } from './services/file-preview-dialog.service';
import { ManualRedactionService } from './services/manual-redaction.service';
import { TablesService } from './services/tables.service';
-import { FileAssignService } from '../shared-dossiers/services/file-assign.service';
export default [
{
@@ -13,6 +15,22 @@ export default [
component: FilePreviewScreenComponent,
pathMatch: 'full',
canDeactivate: [PendingChangesGuard, DocumentUnloadedGuard],
- providers: [FilePreviewDialogService, ManualRedactionService, DocumentUnloadedGuard, TablesService, FileAssignService],
+ providers: [
+ FilePreviewDialogService,
+ ManualRedactionService,
+ DocumentUnloadedGuard,
+ TablesService,
+ FileAssignService,
+ {
+ provide: ENVIRONMENT_INITIALIZER,
+ multi: true,
+ useFactory: () => {
+ const service = inject(WebSocketService);
+ return () => {
+ setTimeout(() => service.connect('/redaction-gateway-v1/websocket'), 2000);
+ };
+ },
+ },
+ ],
},
] satisfies IqserRoutes;
diff --git a/apps/red-ui/src/app/services/copilot.service.ts b/apps/red-ui/src/app/services/copilot.service.ts
new file mode 100644
index 000000000..4b929105c
--- /dev/null
+++ b/apps/red-ui/src/app/services/copilot.service.ts
@@ -0,0 +1,11 @@
+import { Injectable } from '@angular/core';
+import { WebSocketService } from '@services/web-socket.service';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class CopilotService extends WebSocketService {
+ get topicPrefix(): string {
+ return '';
+ }
+}
diff --git a/apps/red-ui/src/app/services/web-socket.service.ts b/apps/red-ui/src/app/services/web-socket.service.ts
index feb2a015d..ae543dc39 100644
--- a/apps/red-ui/src/app/services/web-socket.service.ts
+++ b/apps/red-ui/src/app/services/web-socket.service.ts
@@ -1,4 +1,5 @@
-import { inject, Injectable } from '@angular/core';
+import { DestroyRef, inject, Injectable } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { TenantsService } from '@common-ui/tenants';
import { log } from '@common-ui/utils';
import { getConfig } from '@iqser/common-ui';
@@ -16,17 +17,21 @@ export class WebSocketService extends RxStomp {
readonly #logger = inject(NGXLogger);
readonly #config = getConfig();
readonly #tenantService = inject(TenantsService);
+ readonly #destroyRef = inject(DestroyRef);
constructor() {
super();
- setTimeout(() => this.connect(), 1000);
+ }
+
+ get topicPrefix() {
+ return '/topic/' + this.#tenantService.activeTenantId + '/';
}
watch(opts: IWatchParams): Observable;
watch(destination: string, headers?: StompHeaders): Observable;
watch(opts: string | IWatchParams, headers?: StompHeaders): Observable {
if (typeof opts === 'string') {
- return super.watch('/topic/' + this.#tenantService.activeTenantId + '/' + opts, headers);
+ return super.watch(this.topicPrefix + opts, headers);
}
return super.watch(opts);
@@ -36,13 +41,15 @@ export class WebSocketService extends RxStomp {
return this.watch(topic).pipe(map(msg => JSON.parse(msg.body)));
}
- private connect() {
+ connect(url: string) {
const headers = { Authorization: 'Bearer ' + localStorage.getItem('token') };
+ console.log(headers);
this.configure({
debug: (msg: string) => this.#logger.debug(msg),
- brokerURL: this.#config.API_URL + '/redaction-gateway-v1/websocket',
+ brokerURL: this.#config.API_URL + url,
connectHeaders: headers,
});
+
this.connectionState$.pipe(log('[WS] Connection state')).subscribe();
this.webSocketErrors$.pipe(log('[WS] Errors')).subscribe();
this.stompErrors$
@@ -52,6 +59,7 @@ export class WebSocketService extends RxStomp {
console.error('Broker reported error: ' + frame.headers['message']);
console.error('Additional details: ' + frame.body);
}),
+ takeUntilDestroyed(this.#destroyRef),
)
.subscribe();
diff --git a/apps/red-ui/src/assets/config/config.json b/apps/red-ui/src/assets/config/config.json
index 5f6c0ce6e..deb14e6da 100644
--- a/apps/red-ui/src/assets/config/config.json
+++ b/apps/red-ui/src/assets/config/config.json
@@ -1,7 +1,7 @@
{
"ADMIN_CONTACT_NAME": null,
"ADMIN_CONTACT_URL": null,
- "API_URL": "https://dan2.iqser.cloud",
+ "API_URL": "https://dan1.iqser.cloud",
"APP_NAME": "RedactManager",
"IS_DOCUMINE": false,
"RULE_EDITOR_DEV_ONLY": false,
@@ -13,7 +13,7 @@
"MAX_RETRIES_ON_SERVER_ERROR": 3,
"OAUTH_CLIENT_ID": "redaction",
"OAUTH_IDP_HINT": null,
- "OAUTH_URL": "https://dan2.iqser.cloud/auth",
+ "OAUTH_URL": "https://dan1.iqser.cloud/auth",
"RECENT_PERIOD_IN_HOURS": 24,
"SELECTION_MODE": "structural",
"MANUAL_BASE_URL": "https://docs.redactmanager.com/preview",
diff --git a/libs/common-ui b/libs/common-ui
index c331a6130..17943f2e8 160000
--- a/libs/common-ui
+++ b/libs/common-ui
@@ -1 +1 @@
-Subproject commit c331a61309dfa220a5c83228438bc138539d2045
+Subproject commit 17943f2e8dcab28450e9102d6e8b7a0b5f7227db