diff --git a/src/app/sections/search-payments/search-payments.component.ts b/src/app/sections/search-payments/search-payments.component.ts
index d7eae2fc..09664049 100644
--- a/src/app/sections/search-payments/search-payments.component.ts
+++ b/src/app/sections/search-payments/search-payments.component.ts
@@ -4,9 +4,7 @@ import { Router } from '@angular/router';
import {
PaymentActions,
PaymentMenuItemEvent,
- SearcherType,
SearchFiltersParams,
- SearchType,
} from '@cc/app/shared/components';
import { SearchPaymentsService } from './search-payments.service';
@@ -17,10 +15,6 @@ import { SearchPaymentsService } from './search-payments.service';
providers: [SearchPaymentsService],
})
export class SearchPaymentsComponent {
- searchType: SearcherType = {
- type: SearchType.GlobalSearcher,
- };
-
initsearchParams$ = this.searchPaymentsService.data$;
constructor(private searchPaymentsService: SearchPaymentsService, private router: Router) {}
diff --git a/src/app/sections/search-payments/search-payments.module.ts b/src/app/sections/search-payments/search-payments.module.ts
index 52d37124..3905deba 100644
--- a/src/app/sections/search-payments/search-payments.module.ts
+++ b/src/app/sections/search-payments/search-payments.module.ts
@@ -13,7 +13,6 @@ import {
} from '@cc/app/shared/components';
import { EmptySearchResultModule } from '@cc/components/empty-search-result';
-import { PartyPaymentsModule } from '../party-payments';
import { SearchPaymentsRoutingModule } from './search-payments-routing.module';
import { SearchPaymentsComponent } from './search-payments.component';
@@ -29,7 +28,6 @@ import { SearchPaymentsComponent } from './search-payments.component';
EmptySearchResultModule,
PaymentsTableModule,
MatButtonModule,
- PartyPaymentsModule,
PaymentsSearcherModule,
],
declarations: [SearchPaymentsComponent],
diff --git a/src/app/sections/sections-routing.module.ts b/src/app/sections/sections-routing.module.ts
index 0c021739..a81df9c0 100644
--- a/src/app/sections/sections-routing.module.ts
+++ b/src/app/sections/sections-routing.module.ts
@@ -6,6 +6,23 @@ const ROUTES: Routes = [
path: 'party',
loadChildren: () => import('./party/party.module').then((m) => m.PartyModule),
},
+ {
+ path: 'party',
+ loadChildren: () => import('./party/party.module').then((m) => m.PartyModule),
+ },
+ {
+ path: 'party/:partyID',
+ children: [
+ {
+ path: 'claim/:claimID',
+ loadChildren: () => import('./claim').then((m) => m.ClaimModule),
+ },
+ {
+ path: 'invoice/:invoiceID/payment/:paymentID',
+ loadChildren: () => import('./payment-details').then((m) => m.PaymentDetailsModule),
+ },
+ ],
+ },
{
path: 'withdrawals',
loadChildren: () =>
diff --git a/src/app/sections/withdrawals/components/create-adjustment-dialog/create-adjustment-dialog.component.ts b/src/app/sections/withdrawals/components/create-adjustment-dialog/create-adjustment-dialog.component.ts
index ebff197c..d4e15a8e 100644
--- a/src/app/sections/withdrawals/components/create-adjustment-dialog/create-adjustment-dialog.component.ts
+++ b/src/app/sections/withdrawals/components/create-adjustment-dialog/create-adjustment-dialog.component.ts
@@ -5,14 +5,11 @@ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
import { ExternalID } from '@vality/fistful-proto/lib/base';
import { StatWithdrawal } from '@vality/fistful-proto/lib/fistful_stat';
import { Status } from '@vality/fistful-proto/lib/withdrawal';
+import { BaseDialogResponseStatus, BaseDialogSuperclass } from '@vality/ng-core';
import { combineLatest, from, of } from 'rxjs';
import { catchError, finalize } from 'rxjs/operators';
import * as short from 'short-uuid';
-import {
- BaseDialogResponseStatus,
- BaseDialogSuperclass,
-} from '../../../../../components/base-dialog';
import { ManagementService } from '../../../../api/withdrawal';
import { MetadataFormExtension } from '../../../../shared';
import { ErrorService } from '../../../../shared/services/error';
diff --git a/src/app/sections/withdrawals/withdrawals.component.ts b/src/app/sections/withdrawals/withdrawals.component.ts
index d6e8cbed..48c3d902 100644
--- a/src/app/sections/withdrawals/withdrawals.component.ts
+++ b/src/app/sections/withdrawals/withdrawals.component.ts
@@ -6,11 +6,10 @@ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
import { omitBy } from '@s-libs/micro-dash';
import { PartyID } from '@vality/domain-proto';
import { StatWithdrawal } from '@vality/fistful-proto/lib/fistful_stat';
+import { BaseDialogResponseStatus, BaseDialogService } from '@vality/ng-core';
import { Moment } from 'moment';
import { map } from 'rxjs/operators';
-import { BaseDialogResponseStatus } from '../../../components/base-dialog';
-import { BaseDialogService } from '../../../components/base-dialog/services/base-dialog.service';
import { SELECT_COLUMN_NAME } from '../../../components/table';
import { isNilOrEmptyString } from '../../../utils';
import { WithdrawalParams } from '../../query-dsl';
diff --git a/src/app/sections/withdrawals/withdrawals.module.ts b/src/app/sections/withdrawals/withdrawals.module.ts
index a98084be..2396ec4a 100644
--- a/src/app/sections/withdrawals/withdrawals.module.ts
+++ b/src/app/sections/withdrawals/withdrawals.module.ts
@@ -12,13 +12,14 @@ import { MatRadioModule } from '@angular/material/radio';
import { MatSelectModule } from '@angular/material/select';
import { MatSortModule } from '@angular/material/sort';
import { MatTableModule } from '@angular/material/table';
+import { BaseDialogModule } from '@vality/ng-core';
-import { BaseDialogModule } from '../../../components/base-dialog';
import { EmptySearchResultModule } from '../../../components/empty-search-result';
import { TableModule } from '../../../components/table';
-import { MetadataFormModule, ThriftPipesModule } from '../../shared';
import { DateRangeModule } from '../../shared/components/date-range/date-range.module';
import { MerchantFieldModule } from '../../shared/components/merchant-field';
+import { MetadataFormModule } from '../../shared/components/metadata-form';
+import { ThriftPipesModule } from '../../shared/pipes/thrift';
import { CreateAdjustmentDialogComponent } from './components/create-adjustment-dialog/create-adjustment-dialog.component';
import { WithdrawalsRoutingModule } from './withdrawals-routing.module';
import { WithdrawalsComponent } from './withdrawals.component';
diff --git a/src/app/shared/components/change-chargeback-status-dialog/change-chargeback-status-dialog.component.html b/src/app/shared/components/change-chargeback-status-dialog/change-chargeback-status-dialog.component.html
new file mode 100644
index 00000000..76ee5269
--- /dev/null
+++ b/src/app/shared/components/change-chargeback-status-dialog/change-chargeback-status-dialog.component.html
@@ -0,0 +1,31 @@
+
+
+
+ Action
+
+ {{
+ k
+ }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/shared/components/change-chargeback-status-dialog/change-chargeback-status-dialog.component.ts b/src/app/shared/components/change-chargeback-status-dialog/change-chargeback-status-dialog.component.ts
new file mode 100644
index 00000000..9a2552ac
--- /dev/null
+++ b/src/app/shared/components/change-chargeback-status-dialog/change-chargeback-status-dialog.component.ts
@@ -0,0 +1,112 @@
+import { CommonModule } from '@angular/common';
+import { Component, Injector, OnInit } from '@angular/core';
+import { GridModule } from '@angular/flex-layout';
+import { ReactiveFormsModule, FormControl, Validators } from '@angular/forms';
+import { MatButtonModule } from '@angular/material/button';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatSelectModule } from '@angular/material/select';
+import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy';
+import { BaseDialogSuperclass, BaseDialogModule, BaseDialogService } from '@vality/ng-core';
+import { from, BehaviorSubject, Observable } from 'rxjs';
+
+import { InvoicingService } from '@cc/app/api/payment-processing';
+import { MetadataFormModule, EnumKeysPipe, EnumKeyPipe } from '@cc/app/shared';
+import { DomainMetadataFormExtensionsService } from '@cc/app/shared/services';
+import { ErrorService } from '@cc/app/shared/services/error';
+import { NotificationService } from '@cc/app/shared/services/notification';
+import { progressTo } from '@cc/utils';
+
+enum Action {
+ Accept,
+ Reject,
+ Reopen,
+ Cancel,
+}
+
+@UntilDestroy()
+@Component({
+ standalone: true,
+ selector: 'cc-change-chargeback-status-dialog',
+ templateUrl: './change-chargeback-status-dialog.component.html',
+ imports: [
+ CommonModule,
+ BaseDialogModule,
+ MatButtonModule,
+ MetadataFormModule,
+ ReactiveFormsModule,
+ MatFormFieldModule,
+ MatSelectModule,
+ EnumKeysPipe,
+ GridModule,
+ EnumKeyPipe,
+ ],
+})
+export class ChangeChargebackStatusDialogComponent
+ extends BaseDialogSuperclass<
+ ChangeChargebackStatusDialogComponent,
+ { id: string; paymentId: string; invoiceId: string }
+ >
+ implements OnInit
+{
+ metadata$ = from(import('@vality/domain-proto/lib/metadata.json').then((m) => m.default));
+ extensions$ = this.domainMetadataFormExtensionsService.extensions$;
+ control = new FormControl();
+ actionControl = new FormControl
(null, Validators.required);
+ typeEnum = Action;
+ types = {
+ [Action.Accept]: 'InvoicePaymentChargebackAcceptParams',
+ [Action.Reject]: 'InvoicePaymentChargebackRejectParams',
+ [Action.Reopen]: 'InvoicePaymentChargebackReopenParams',
+ [Action.Cancel]: 'InvoicePaymentChargebackCancelParams',
+ };
+ progress$ = new BehaviorSubject(0);
+
+ constructor(
+ injector: Injector,
+ private invoicingService: InvoicingService,
+ private baseDialogService: BaseDialogService,
+ private notificationService: NotificationService,
+ private errorService: ErrorService,
+ private domainMetadataFormExtensionsService: DomainMetadataFormExtensionsService
+ ) {
+ super(injector);
+ }
+
+ ngOnInit() {
+ this.actionControl.valueChanges.pipe(untilDestroyed(this)).subscribe(() => {
+ this.control.reset();
+ });
+ }
+
+ confirm() {
+ let action$: Observable;
+ const args = [
+ this.dialogData.invoiceId,
+ this.dialogData.paymentId,
+ this.dialogData.id,
+ this.control.value,
+ ] as const;
+ switch (this.actionControl.value) {
+ case Action.Accept:
+ action$ = this.invoicingService.AcceptChargeback(...args);
+ break;
+ case Action.Reject:
+ action$ = this.invoicingService.RejectChargeback(...args);
+ break;
+ case Action.Reopen:
+ action$ = this.invoicingService.ReopenChargeback(...args);
+ break;
+ case Action.Cancel:
+ action$ = this.invoicingService.CancelChargeback(...args);
+ break;
+ }
+ action$.pipe(progressTo(this.progress$), untilDestroyed(this)).subscribe({
+ next: () => {
+ this.notificationService.success();
+ },
+ error: (err) => {
+ this.errorService.error(err);
+ },
+ });
+ }
+}
diff --git a/src/app/shared/components/chargebacks/chargebacks.component.html b/src/app/shared/components/chargebacks/chargebacks.component.html
new file mode 100644
index 00000000..29726d44
--- /dev/null
+++ b/src/app/shared/components/chargebacks/chargebacks.component.html
@@ -0,0 +1,49 @@
+
+
+ ID |
+ {{ c.chargeback.id }} |
+
+
+ Status |
+ {{ c.chargeback.status | ccUnionKey }} |
+
+
+ Created At |
+
+ {{ c.chargeback.created_at | date: 'dd.MM.yyyy HH:mm:ss' }}
+ |
+
+
+ Body |
+
+ {{
+ c.chargeback.body.amount | amountCurrency: c.chargeback.body.currency.symbolic_code
+ }}
+ |
+
+
+ Levy |
+
+ {{
+ c.chargeback.levy.amount | amountCurrency: c.chargeback.levy.currency.symbolic_code
+ }}
+ |
+
+
+ Stage |
+ {{ c.chargeback.stage | ccUnionKey }} |
+
+
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+
diff --git a/src/app/shared/components/chargebacks/chargebacks.component.ts b/src/app/shared/components/chargebacks/chargebacks.component.ts
new file mode 100644
index 00000000..a7d23e94
--- /dev/null
+++ b/src/app/shared/components/chargebacks/chargebacks.component.ts
@@ -0,0 +1,56 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { MatMenuModule } from '@angular/material/menu';
+import { MatTableModule } from '@angular/material/table';
+import { UntilDestroy } from '@ngneat/until-destroy';
+import { InvoicePaymentChargeback } from '@vality/magista-proto/lib/payment_processing';
+import { BaseDialogService } from '@vality/ng-core';
+
+import { InvoicingService } from '@cc/app/api/payment-processing';
+import { AmountCurrencyPipe, ThriftPipesModule } from '@cc/app/shared';
+import { DetailsDialogComponent } from '@cc/app/shared/components/details-dialog/details-dialog.component';
+import { TableModule, Columns } from '@cc/components/table';
+
+import { ChangeChargebackStatusDialogComponent } from '../change-chargeback-status-dialog/change-chargeback-status-dialog.component';
+
+@UntilDestroy()
+@Component({
+ standalone: true,
+ selector: 'cc-chargebacks',
+ templateUrl: './chargebacks.component.html',
+ imports: [
+ MatTableModule,
+ TableModule,
+ ThriftPipesModule,
+ CommonModule,
+ AmountCurrencyPipe,
+ MatMenuModule,
+ ],
+})
+export class ChargebacksComponent {
+ @Input() chargebacks: InvoicePaymentChargeback[];
+ @Input() paymentId: string;
+ @Input() invoiceId: string;
+
+ cols = new Columns('id', 'status', 'created_at', 'body', 'levy', 'stage', 'actions');
+
+ constructor(
+ private invoicingService: InvoicingService,
+ private baseDialogService: BaseDialogService
+ ) {}
+
+ changeStatus(id: string) {
+ this.baseDialogService.open(ChangeChargebackStatusDialogComponent, {
+ paymentId: this.paymentId,
+ invoiceId: this.invoiceId,
+ id,
+ });
+ }
+
+ showDetails(chargeback: InvoicePaymentChargeback) {
+ this.baseDialogService.open(DetailsDialogComponent, {
+ title: 'Chargeback details',
+ json: chargeback,
+ });
+ }
+}
diff --git a/src/app/shared/components/claim-search-form/claim-search-form.component.ts b/src/app/shared/components/claim-search-form/claim-search-form.component.ts
index 768fc275..0a3d2f6c 100644
--- a/src/app/shared/components/claim-search-form/claim-search-form.component.ts
+++ b/src/app/shared/components/claim-search-form/claim-search-form.component.ts
@@ -9,15 +9,14 @@ import {
import { ActivatedRoute, Router } from '@angular/router';
import { FormBuilder } from '@ngneat/reactive-forms';
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
-import { ClaimStatus } from '@vality/domain-proto/lib/claim_management';
import { coerceBoolean } from 'coerce-property';
import { debounceTime, map, take } from 'rxjs/operators';
-import { queryParamsToFormValue } from '@cc/app/shared/components/claim-search-form/query-params-to-form-value';
+import { CLAIM_STATUSES } from '@cc/app/api/claim-management';
import { removeEmptyProperties } from '@cc/utils/remove-empty-properties';
import { ClaimSearchForm } from './claim-search-form';
-import { formValueToSearchParams } from './form-value-to-search-params';
+import { queryParamsToFormValue } from './query-params-to-form-value';
@UntilDestroy()
@Component({
@@ -35,14 +34,7 @@ export class ClaimSearchFormComponent implements OnInit {
party_id: null,
});
- claimStatuses: (keyof ClaimStatus)[] = [
- 'pending',
- 'review',
- 'accepted',
- 'denied',
- 'revoked',
- 'pending_acceptance',
- ];
+ claimStatuses = CLAIM_STATUSES;
constructor(private route: ActivatedRoute, private router: Router, private fb: FormBuilder) {}
@@ -51,7 +43,7 @@ export class ClaimSearchFormComponent implements OnInit {
.pipe(debounceTime(600), map(removeEmptyProperties), untilDestroyed(this))
.subscribe((value) => {
void this.router.navigate([location.pathname], { queryParams: value });
- this.valueChanges.emit(formValueToSearchParams(value));
+ this.valueChanges.emit(value as never);
});
this.route.queryParams
.pipe(
diff --git a/src/app/shared/components/claim-search-form/claim-search-form.ts b/src/app/shared/components/claim-search-form/claim-search-form.ts
index e23492f9..b8d7f317 100644
--- a/src/app/shared/components/claim-search-form/claim-search-form.ts
+++ b/src/app/shared/components/claim-search-form/claim-search-form.ts
@@ -1,10 +1,8 @@
import { PartyID } from '@vality/domain-proto';
-import { ClaimID } from '@vality/domain-proto/lib/claim_management';
-
-import { ClaimStatus } from '@cc/app/api/claim-management';
+import { ClaimID, ClaimStatus } from '@vality/domain-proto/lib/claim_management';
export interface ClaimSearchForm {
claim_id: ClaimID;
- statuses: ClaimStatus[];
+ statuses: (keyof ClaimStatus)[];
party_id: PartyID;
}
diff --git a/src/app/shared/components/claim-search-form/form-value-to-search-params.ts b/src/app/shared/components/claim-search-form/form-value-to-search-params.ts
deleted file mode 100644
index 092f89e5..00000000
--- a/src/app/shared/components/claim-search-form/form-value-to-search-params.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import pick from 'lodash-es/pick';
-import pickBy from 'lodash-es/pickBy';
-
-import { isNumeric } from '@cc/utils/is-numeric';
-import { mapValuesToNumber } from '@cc/utils/map-values-to-number';
-import { mapValuesToThriftEnum } from '@cc/utils/map-values-to-thrift-enum';
-
-import { ClaimSearchForm } from './claim-search-form';
-
-export const formValueToSearchParams = (params: any): ClaimSearchForm => ({
- ...params,
- ...mapValuesToThriftEnum(pick(params, 'statuses')),
- ...mapValuesToNumber(pickBy(params, isNumeric)),
-});
diff --git a/src/app/shared/components/datetime/datetime.component.html b/src/app/shared/components/datetime/datetime.component.html
new file mode 100644
index 00000000..5b8dd87f
--- /dev/null
+++ b/src/app/shared/components/datetime/datetime.component.html
@@ -0,0 +1,19 @@
+
+
+
+ {{ label }}
+
+ {{ hint }}
+
+
+
+
+
+
+
+
diff --git a/src/app/shared/components/datetime/datetime.component.ts b/src/app/shared/components/datetime/datetime.component.ts
new file mode 100644
index 00000000..0a08f4bb
--- /dev/null
+++ b/src/app/shared/components/datetime/datetime.component.ts
@@ -0,0 +1,53 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { FlexModule } from '@angular/flex-layout';
+import { ValidationErrors } from '@angular/forms';
+import { MatDatepickerModule, MatDatepickerInputEvent } from '@angular/material/datepicker';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
+import { FormComponentSuperclass } from '@s-libs/ng-core';
+import { coerceBoolean } from 'coerce-property';
+import moment from 'moment';
+import { Moment } from 'moment/moment';
+
+import { createControlProviders } from '@cc/utils';
+
+@Component({
+ selector: 'cc-datetime',
+ standalone: true,
+ imports: [CommonModule, MatFormFieldModule, MatInputModule, MatDatepickerModule, FlexModule],
+ templateUrl: './datetime.component.html',
+ providers: createControlProviders(DatetimeComponent),
+})
+export class DatetimeComponent extends FormComponentSuperclass {
+ @Input() label: string;
+ @Input() @coerceBoolean required = false;
+ @Input() hint?: string;
+
+ datetime: Moment;
+
+ get time() {
+ return this.datetime ? this.datetime.format('HH:mm') : '';
+ }
+
+ handleIncomingValue(value: string) {
+ this.datetime = value ? moment(value) : null;
+ }
+
+ timeChanged(event: Event) {
+ const [hours, minutes] = (event.target as HTMLInputElement).value.split(':');
+ this.datetime = this.datetime
+ .clone()
+ .set({ minutes: Number(minutes), hours: Number(hours) });
+ this.emitOutgoingValue(this.datetime.toISOString());
+ }
+
+ dateChanged(date: MatDatepickerInputEvent) {
+ this.datetime = date.target.value;
+ this.emitOutgoingValue(this.datetime.toISOString());
+ }
+
+ validate(): ValidationErrors | null {
+ return !this.datetime || this.datetime.isValid() ? null : { invalidDatetime: true };
+ }
+}
diff --git a/src/app/shared/components/details-dialog/details-dialog.component.html b/src/app/shared/components/details-dialog/details-dialog.component.html
new file mode 100644
index 00000000..e5773146
--- /dev/null
+++ b/src/app/shared/components/details-dialog/details-dialog.component.html
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/app/shared/components/details-dialog/details-dialog.component.ts b/src/app/shared/components/details-dialog/details-dialog.component.ts
new file mode 100644
index 00000000..c63a4667
--- /dev/null
+++ b/src/app/shared/components/details-dialog/details-dialog.component.ts
@@ -0,0 +1,17 @@
+import { Component } from '@angular/core';
+import { BaseDialogSuperclass, BaseDialogModule, DEFAULT_DIALOG_CONFIG } from '@vality/ng-core';
+
+import { JsonViewerModule } from '@cc/app/shared/components/json-viewer';
+
+@Component({
+ standalone: true,
+ selector: 'cc-details-dialog',
+ templateUrl: './details-dialog.component.html',
+ imports: [BaseDialogModule, JsonViewerModule],
+})
+export class DetailsDialogComponent extends BaseDialogSuperclass<
+ DetailsDialogComponent,
+ { title?: string; json: unknown }
+> {
+ static defaultDialogConfig = DEFAULT_DIALOG_CONFIG.large;
+}
diff --git a/src/app/shared/components/merchant-field/merchant-field.component.ts b/src/app/shared/components/merchant-field/merchant-field.component.ts
index 7b20c835..36f5c6ea 100644
--- a/src/app/shared/components/merchant-field/merchant-field.component.ts
+++ b/src/app/shared/components/merchant-field/merchant-field.component.ts
@@ -3,15 +3,14 @@ import { MatSnackBar } from '@angular/material/snack-bar';
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
import { PartyID } from '@vality/domain-proto';
import { coerceBoolean } from 'coerce-property';
-import { BehaviorSubject, Observable, of, ReplaySubject, Subject } from 'rxjs';
-import { catchError, debounceTime, filter, first, map, switchMap } from 'rxjs/operators';
+import { BehaviorSubject, Observable, of, ReplaySubject, Subject, merge } from 'rxjs';
+import { catchError, debounceTime, filter, map, switchMap, first, takeUntil } from 'rxjs/operators';
+import { DeanonimusService } from '@cc/app/thrift-services/deanonimus';
import { Option } from '@cc/components/select-search-field';
+import { createControlProviders, ValidatedFormControlSuperclass } from '@cc/utils';
import { progressTo } from '@cc/utils/operators';
-import { createControlProviders, ValidatedFormControlSuperclass } from '../../../../utils';
-import { DeanonimusService } from '../../../thrift-services/deanonimus';
-
@UntilDestroy()
@Component({
selector: 'cc-merchant-field',
@@ -38,8 +37,10 @@ export class MerchantFieldComponent
}
ngOnInit() {
- this.control.valueChanges.pipe(first()).subscribe((v) => this.searchChange$.next(v));
- this.searchChange$
+ merge(
+ this.searchChange$,
+ this.control.valueChanges.pipe(filter(Boolean), first(), takeUntil(this.searchChange$))
+ )
.pipe(
filter(Boolean),
debounceTime(600),
diff --git a/src/app/shared/components/metadata-form/components/complex-form/complex-form.component.html b/src/app/shared/components/metadata-form/components/complex-form/complex-form.component.html
index 0cf66dca..d8dfca76 100644
--- a/src/app/shared/components/metadata-form/components/complex-form/complex-form.component.html
+++ b/src/app/shared/components/metadata-form/components/complex-form/complex-form.component.html
@@ -1,7 +1,6 @@
-
- ({{ data.type.name | titlecase }})
+ {{ data.type | fieldLabel: data.field }} ({{ data.type.name | titlecase }})
-
-
-
+ {{ data.type | fieldLabel: data.field }}
-
+
{{ data.type | fieldLabel: data.field }}
False
@@ -28,65 +24,90 @@
-
-
-
- {{
- (data.extensionResult$ | async).label
- }}
-
-
+
-
-
-
-
- {{ aliases }}
-
-
-
+
+
+
+
+
+
+ {{ data.type | fieldLabel: data.field }}
-
-
- {{ option.value }}
+
{{
+ (data.extensionResult$ | async).label
+ }}
+
+
{{ aliases }}
+
+
+
+
+
+
+
+
+
+
+ {{ option.value }}
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/app/shared/components/metadata-form/components/struct-form/struct-form.component.html b/src/app/shared/components/metadata-form/components/struct-form/struct-form.component.html
index 96efd6df..bd1a4c97 100644
--- a/src/app/shared/components/metadata-form/components/struct-form/struct-form.component.html
+++ b/src/app/shared/components/metadata-form/components/struct-form/struct-form.component.html
@@ -4,11 +4,7 @@
-
+ {{ data.type | fieldLabel: data.field }}
diff --git a/src/app/shared/components/metadata-form/components/union-field/union-field.component.html b/src/app/shared/components/metadata-form/components/union-field/union-field.component.html
index 307fdd15..402abfcb 100644
--- a/src/app/shared/components/metadata-form/components/union-field/union-field.component.html
+++ b/src/app/shared/components/metadata-form/components/union-field/union-field.component.html
@@ -1,16 +1,14 @@
-
-
-
+ {{ data.type | fieldLabel: data.field }}
-
-
-
+ {{
+ field.type | fieldLabel: field
+ }}