Browse Source

Improve usability of import activities action

pull/1695/head
Thomas 3 years ago
parent
commit
11cd395484
  1. 7
      apps/api/src/app/import/import.controller.ts
  2. 4
      apps/api/src/app/info/info.service.ts
  3. 1
      apps/api/src/services/configuration.service.ts
  4. 1
      apps/api/src/services/interfaces/environment.interface.ts
  5. 1
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
  6. 1
      apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
  7. 19
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  8. 1
      apps/client/src/app/pages/portfolio/activities/activities-page.html
  9. 1
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
  10. 61
      libs/ui/src/lib/activities-table/activities-table.component.html
  11. 1
      libs/ui/src/lib/activities-table/activities-table.component.ts

7
apps/api/src/app/import/import.controller.ts

@ -40,8 +40,11 @@ export class ImportController {
@Query('dryRun') isDryRun?: boolean @Query('dryRun') isDryRun?: boolean
): Promise<ImportResponse> { ): Promise<ImportResponse> {
if ( if (
!this.configurationService.get('ENABLE_FEATURE_IMPORT') || !hasPermission(
!hasPermission(this.request.user.permissions, permissions.createAccount) this.request.user.permissions,
permissions.createAccount
) ||
!hasPermission(this.request.user.permissions, permissions.createOrder)
) { ) {
throw new HttpException( throw new HttpException(
getReasonPhrase(StatusCodes.FORBIDDEN), getReasonPhrase(StatusCodes.FORBIDDEN),

4
apps/api/src/app/info/info.service.ts

@ -72,10 +72,6 @@ export class InfoService {
globalPermissions.push(permissions.enableFearAndGreedIndex); globalPermissions.push(permissions.enableFearAndGreedIndex);
} }
if (this.configurationService.get('ENABLE_FEATURE_IMPORT')) {
globalPermissions.push(permissions.enableImport);
}
if (this.configurationService.get('ENABLE_FEATURE_READ_ONLY_MODE')) { if (this.configurationService.get('ENABLE_FEATURE_READ_ONLY_MODE')) {
isReadOnlyMode = (await this.propertyService.getByKey( isReadOnlyMode = (await this.propertyService.getByKey(
PROPERTY_IS_READ_ONLY_MODE PROPERTY_IS_READ_ONLY_MODE

1
apps/api/src/services/configuration.service.ts

@ -24,7 +24,6 @@ export class ConfigurationService {
ENABLE_FEATURE_BLOG: bool({ default: false }), ENABLE_FEATURE_BLOG: bool({ default: false }),
ENABLE_FEATURE_CUSTOM_SYMBOLS: bool({ default: false }), ENABLE_FEATURE_CUSTOM_SYMBOLS: bool({ default: false }),
ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }),
ENABLE_FEATURE_IMPORT: bool({ default: true }),
ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }), ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }),
ENABLE_FEATURE_SOCIAL_LOGIN: bool({ default: false }), ENABLE_FEATURE_SOCIAL_LOGIN: bool({ default: false }),
ENABLE_FEATURE_STATISTICS: bool({ default: false }), ENABLE_FEATURE_STATISTICS: bool({ default: false }),

1
apps/api/src/services/interfaces/environment.interface.ts

@ -10,7 +10,6 @@ export interface Environment extends CleanedEnvAccessors {
ENABLE_FEATURE_BLOG: boolean; ENABLE_FEATURE_BLOG: boolean;
ENABLE_FEATURE_CUSTOM_SYMBOLS: boolean; ENABLE_FEATURE_CUSTOM_SYMBOLS: boolean;
ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean;
ENABLE_FEATURE_IMPORT: boolean;
ENABLE_FEATURE_READ_ONLY_MODE: boolean; ENABLE_FEATURE_READ_ONLY_MODE: boolean;
ENABLE_FEATURE_SOCIAL_LOGIN: boolean; ENABLE_FEATURE_SOCIAL_LOGIN: boolean;
ENABLE_FEATURE_STATISTICS: boolean; ENABLE_FEATURE_STATISTICS: boolean;

1
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html

@ -40,7 +40,6 @@
[hasPermissionToCreateActivity]="false" [hasPermissionToCreateActivity]="false"
[hasPermissionToExportActivities]="true" [hasPermissionToExportActivities]="true"
[hasPermissionToFilter]="false" [hasPermissionToFilter]="false"
[hasPermissionToImportActivities]="false"
[hasPermissionToOpenDetails]="false" [hasPermissionToOpenDetails]="false"
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
[showActions]="false" [showActions]="false"

1
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html

@ -239,7 +239,6 @@
[hasPermissionToCreateActivity]="false" [hasPermissionToCreateActivity]="false"
[hasPermissionToExportActivities]="true" [hasPermissionToExportActivities]="true"
[hasPermissionToFilter]="false" [hasPermissionToFilter]="false"
[hasPermissionToImportActivities]="false"
[hasPermissionToOpenDetails]="false" [hasPermissionToOpenDetails]="false"
[locale]="data.locale" [locale]="data.locale"
[showActions]="false" [showActions]="false"

19
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -36,7 +36,6 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
public hasImpersonationId: boolean; public hasImpersonationId: boolean;
public hasPermissionToCreateActivity: boolean; public hasPermissionToCreateActivity: boolean;
public hasPermissionToDeleteActivity: boolean; public hasPermissionToDeleteActivity: boolean;
public hasPermissionToImportActivities: boolean;
public routeQueryParams: Subscription; public routeQueryParams: Subscription;
public user: User; public user: User;
@ -91,10 +90,6 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
.pipe(takeUntil(this.unsubscribeSubject)) .pipe(takeUntil(this.unsubscribeSubject))
.subscribe((aId) => { .subscribe((aId) => {
this.hasImpersonationId = !!aId; this.hasImpersonationId = !!aId;
this.hasPermissionToImportActivities =
hasPermission(globalPermissions, permissions.enableImport) &&
!this.hasImpersonationId;
}); });
this.userService.stateChanged this.userService.stateChanged
@ -356,13 +351,11 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
return account.isDefault; return account.isDefault;
})?.id; })?.id;
this.hasPermissionToCreateActivity = hasPermission( this.hasPermissionToCreateActivity =
this.user.permissions, !this.hasImpersonationId &&
permissions.createOrder hasPermission(this.user.permissions, permissions.createOrder);
); this.hasPermissionToDeleteActivity =
this.hasPermissionToDeleteActivity = hasPermission( !this.hasImpersonationId &&
this.user.permissions, hasPermission(this.user.permissions, permissions.deleteOrder);
permissions.deleteOrder
);
} }
} }

1
apps/client/src/app/pages/portfolio/activities/activities-page.html

@ -8,7 +8,6 @@
[deviceType]="deviceType" [deviceType]="deviceType"
[hasPermissionToCreateActivity]="hasPermissionToCreateActivity" [hasPermissionToCreateActivity]="hasPermissionToCreateActivity"
[hasPermissionToExportActivities]="!hasImpersonationId" [hasPermissionToExportActivities]="!hasImpersonationId"
[hasPermissionToImportActivities]="hasPermissionToImportActivities"
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
[showActions]="!hasImpersonationId && hasPermissionToDeleteActivity && !user.settings.isRestrictedView" [showActions]="!hasImpersonationId && hasPermissionToDeleteActivity && !user.settings.isRestrictedView"
(activityDeleted)="onDeleteActivity($event)" (activityDeleted)="onDeleteActivity($event)"

1
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html

@ -70,7 +70,6 @@
[hasPermissionToCreateActivity]="false" [hasPermissionToCreateActivity]="false"
[hasPermissionToExportActivities]="false" [hasPermissionToExportActivities]="false"
[hasPermissionToFilter]="false" [hasPermissionToFilter]="false"
[hasPermissionToImportActivities]="false"
[hasPermissionToOpenDetails]="false" [hasPermissionToOpenDetails]="false"
[locale]="data?.user?.settings?.locale" [locale]="data?.user?.settings?.locale"
[showActions]="false" [showActions]="false"

61
libs/ui/src/lib/activities-table/activities-table.component.html

@ -6,6 +6,56 @@
(valueChanged)="filters$.next($event)" (valueChanged)="filters$.next($event)"
></gf-activities-filter> ></gf-activities-filter>
<div *ngIf="hasPermissionToCreateActivity" class="d-flex justify-content-end">
<button
class="align-items-center d-flex"
mat-stroked-button
(click)="onImport()"
>
<ion-icon class="mr-2" name="cloud-upload-outline"></ion-icon>
<span i18n>Import Activities...</span>
</button>
<button
*ngIf="hasPermissionToExportActivities"
class="mx-1 no-min-width px-2"
mat-stroked-button
[matMenuTriggerFor]="activitiesMenu"
(click)="$event.stopPropagation()"
>
<ion-icon name="ellipsis-vertical"></ion-icon>
</button>
<mat-menu #activitiesMenu="matMenu" xPosition="before">
<button
mat-menu-item
[disabled]="dataSource.data.length === 0"
(click)="onImportDividends()"
>
<ion-icon class="mr-2" name="color-wand-outline"></ion-icon>
<span i18n>Import Dividends...</span>
</button>
<button
*ngIf="hasPermissionToExportActivities"
class="align-items-center d-flex"
mat-menu-item
[disabled]="dataSource.data.length === 0"
(click)="onExport()"
>
<ion-icon class="mr-2" name="cloud-download-outline"></ion-icon>
<span i18n>Export Activities</span>
</button>
<button
*ngIf="hasPermissionToExportActivities"
class="align-items-center d-flex"
mat-menu-item
[disabled]="!hasDrafts"
(click)="onExportDrafts()"
>
<ion-icon class="mr-2" name="calendar-clear-outline"></ion-icon>
<span i18n>Export Drafts as ICS</span>
</button>
</mat-menu>
</div>
<div class="activities"> <div class="activities">
<table <table
class="gf-table w-100" class="gf-table w-100"
@ -369,7 +419,7 @@
<th *matHeaderCellDef class="px-1 text-center" mat-header-cell> <th *matHeaderCellDef class="px-1 text-center" mat-header-cell>
<button <button
*ngIf=" *ngIf="
hasPermissionToExportActivities || hasPermissionToImportActivities !hasPermissionToCreateActivity && hasPermissionToExportActivities
" "
class="mx-1 no-min-width px-2" class="mx-1 no-min-width px-2"
mat-button mat-button
@ -380,21 +430,22 @@
</button> </button>
<mat-menu #activitiesMenu="matMenu" xPosition="before"> <mat-menu #activitiesMenu="matMenu" xPosition="before">
<button <button
*ngIf="hasPermissionToImportActivities" *ngIf="hasPermissionToCreateActivity"
class="align-items-center d-flex" class="align-items-center d-flex"
mat-menu-item mat-menu-item
(click)="onImport()" (click)="onImport()"
> >
<ion-icon class="mr-2" name="cloud-upload-outline"></ion-icon> <ion-icon class="mr-2" name="cloud-upload-outline"></ion-icon>
<span i18n>Import Activities</span> <span i18n>Import Activities...</span>
</button> </button>
<button <button
*ngIf="hasPermissionToImportActivities" *ngIf="hasPermissionToCreateActivity"
mat-menu-item mat-menu-item
[disabled]="dataSource.data.length === 0"
(click)="onImportDividends()" (click)="onImportDividends()"
> >
<ion-icon class="mr-2" name="color-wand-outline"></ion-icon> <ion-icon class="mr-2" name="color-wand-outline"></ion-icon>
<span i18n>Import Dividends</span> <span i18n>Import Dividends...</span>
</button> </button>
<button <button
*ngIf="hasPermissionToExportActivities" *ngIf="hasPermissionToExportActivities"

1
libs/ui/src/lib/activities-table/activities-table.component.ts

@ -40,7 +40,6 @@ export class ActivitiesTableComponent implements OnChanges, OnDestroy {
@Input() hasPermissionToCreateActivity: boolean; @Input() hasPermissionToCreateActivity: boolean;
@Input() hasPermissionToExportActivities: boolean; @Input() hasPermissionToExportActivities: boolean;
@Input() hasPermissionToFilter = true; @Input() hasPermissionToFilter = true;
@Input() hasPermissionToImportActivities: boolean;
@Input() hasPermissionToOpenDetails = true; @Input() hasPermissionToOpenDetails = true;
@Input() locale: string; @Input() locale: string;
@Input() pageSize = DEFAULT_PAGE_SIZE; @Input() pageSize = DEFAULT_PAGE_SIZE;

Loading…
Cancel
Save