Skip to content

Commit 79423be

Browse files
mattfoley8lazynina
andauthored
Access group spending limits. (#222)
* associations transcoders, access levels, and approve flow descriptions * fix transcoders for associations * check in draft of associations in spending limits (#219) * check in draft of associations in spending limits * Associations spending limits. (#221) * Associations spending limits. * Use avatar directive. * Dont show icon. Co-authored-by: Matt Foley <[email protected]> * Access group spending limits. * More updates to support access group spending limits. * Build out new modules. * Fix wording in spending limit UI. * Resolve conflicts moar. * Fix case. Co-authored-by: Lazy Nina <> Co-authored-by: lazynina <[email protected]> Co-authored-by: Lazy Nina <[email protected]>
1 parent fda265d commit 79423be

12 files changed

+268
-13
lines changed

src/app/app.module.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ import { ArrowToggleComponent } from './arrow-toggle/arrow-toggle.component';
5151
import { TruncateAddressOrUsernamePipe } from 'src/lib/pipes/truncate-deso-address.pipe';
5252
import { LogInOptionsComponent } from './log-in-options/log-in-options.component';
5353
import { AccountSelectComponent } from './account-select/account-select.component';
54-
import {
55-
TransactionSpendingLimitAssociationComponent
56-
} from './transaction-spending-limit/transaction-spending-limit-association/transaction-spending-limit-association.component';
54+
import { TransactionSpendingLimitAssociationComponent } from './transaction-spending-limit/transaction-spending-limit-association/transaction-spending-limit-association.component';
55+
import { TransactionSpendingLimitAccessGroupComponent } from './transaction-spending-limit/transaction-spending-limit-access-group/transaction-spending-limit-access-group.component';
56+
import { TransactionSpendingLimitAccessGroupMemberComponent } from './transaction-spending-limit/transaction-spending-limit-access-group-member/transaction-spending-limit-access-group-member.component';
5757

5858
@NgModule({
5959
declarations: [
@@ -95,6 +95,8 @@ import {
9595
AccountSelectComponent,
9696
MessagingGroupComponent,
9797
TransactionSpendingLimitAssociationComponent,
98+
TransactionSpendingLimitAccessGroupComponent,
99+
TransactionSpendingLimitAccessGroupMemberComponent,
98100
],
99101
imports: [
100102
BrowserModule,

src/app/backend-api.service.ts

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,9 @@ export type LimitOperationString =
142142
| DAOCoinLimitOperationString
143143
| CreatorCoinLimitOperationString
144144
| NFTLimitOperationString
145-
| AssociationOperationString;
145+
| AssociationOperationString
146+
| AccessGroupOperationString
147+
| AccessGroupMemberOperationString;
146148
export type CreatorCoinOperationLimitMap =
147149
CoinOperationLimitMap<CreatorCoinLimitOperationString>;
148150
export type DAOCoinOperationLimitMap =
@@ -171,21 +173,20 @@ export type NFTOperationLimitMap = {
171173
};
172174
};
173175

174-
175176
export enum AssociationClass {
176-
USER = 'user',
177-
POST = 'post',
177+
USER = 'User',
178+
POST = 'Post',
178179
}
179180

180181
export enum AssociationAppScopeType {
181-
ANY = 'any',
182-
SCOPED = 'scoped',
182+
ANY = 'Any',
183+
SCOPED = 'Scoped',
183184
}
184185

185186
export enum AssociationOperationString {
186-
ANY = 'any',
187-
CREATE = 'create',
188-
DELETE = 'delete',
187+
ANY = 'Any',
188+
CREATE = 'Create',
189+
DELETE = 'Delete',
189190
}
190191

191192
export type AssociationLimitMapItem = {
@@ -197,6 +198,40 @@ export type AssociationLimitMapItem = {
197198
OpCount: number;
198199
}
199200

201+
export enum AccessGroupScopeType {
202+
ANY = 'any',
203+
SCOPED = 'scoped',
204+
}
205+
206+
export enum AccessGroupOperationString {
207+
ANY = 'Any',
208+
CREATE = 'Create',
209+
UPDATE = 'Update',
210+
}
211+
212+
export type AccessGroupLimitMapItem = {
213+
AccessGroupOwnerPublicKeyBase58Check: string;
214+
ScopeType: AccessGroupScopeType;
215+
AccessGroupKeyName: string;
216+
OperationType: AccessGroupOperationString;
217+
OpCount: number;
218+
}
219+
220+
export enum AccessGroupMemberOperationString {
221+
ANY = 'Any',
222+
ADD = 'Add',
223+
REMOVE = 'Remove',
224+
UPDATE = 'Update',
225+
}
226+
227+
export type AccessGroupMemberLimitMapItem = {
228+
AccessGroupOwnerPublicKeyBase58Check: string;
229+
ScopeType: AccessGroupScopeType;
230+
AccessGroupKeyName: string;
231+
OperationType: AccessGroupMemberOperationString;
232+
OpCount: number;
233+
}
234+
200235
export interface TransactionSpendingLimitResponse {
201236
GlobalDESOLimit: number;
202237
// TODO: make enum for transaction type string
@@ -206,6 +241,8 @@ export interface TransactionSpendingLimitResponse {
206241
NFTOperationLimitMap?: NFTOperationLimitMap;
207242
DAOCoinLimitOrderLimitMap?: DAOCoinLimitOrderLimitMap;
208243
AssociationLimitMap?: AssociationLimitMapItem[];
244+
AccessGroupLimitMap?: AccessGroupLimitMapItem[];
245+
AccessGroupMemberLimitMap?: AccessGroupMemberLimitMapItem[];
209246
IsUnlimited?: boolean;
210247
DerivedKeyMemo?: string;
211248
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<div class="d-flex flex-column border br-12px border-primary p-1">
2+
<div class="d-flex justify-content-between align-items-center">
3+
<div class="d-flex justify-content-start align-items-center py-10px col-12">
4+
{{ getOperationString() }}{{ !isScoped() ? ' any of' : '' }}
5+
{{ (appUser?.ProfileEntryResponse?.Username || accessGroupMemberLimitMapItem?.AccessGroupOwnerPublicKeyBase58Check | truncateAddressOrUsername)}}'s
6+
access group{{ isScoped() ? ' "' + accessGroupMemberLimitMapItem?.AccessGroupKeyName + '"' : 's' }}
7+
({{ accessGroupMemberLimitMapItem?.OpCount }}x).
8+
</div>
9+
</div>
10+
</div>

src/app/transaction-spending-limit/transaction-spending-limit-access-group-member/transaction-spending-limit-access-group-member.component.scss

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import {Component, Input, OnInit} from '@angular/core';
2+
import {GlobalVarsService} from 'src/app/global-vars.service';
3+
import {
4+
AccessGroupMemberLimitMapItem,
5+
AccessGroupMemberOperationString,
6+
AccessGroupScopeType,
7+
BackendAPIService,
8+
User
9+
} from '../../backend-api.service';
10+
import {TransactionSpendingLimitComponent} from '../transaction-spending-limit.component';
11+
12+
@Component({
13+
selector: 'app-transaction-spending-limit-access-group-member',
14+
templateUrl: './transaction-spending-limit-access-group-member.component.html',
15+
styleUrls: ['./transaction-spending-limit-access-group-member.component.scss'],
16+
})
17+
export class TransactionSpendingLimitAccessGroupMemberComponent implements OnInit {
18+
@Input() accessGroupMemberLimitMapItem: AccessGroupMemberLimitMapItem | undefined;
19+
@Input() appUser: User | undefined;
20+
TransactionSpendingLimitComponent = TransactionSpendingLimitComponent;
21+
22+
constructor(
23+
private backendApi: BackendAPIService,
24+
public globalVars: GlobalVarsService
25+
) {}
26+
27+
ngOnInit(): void {
28+
}
29+
30+
isScoped(): boolean {
31+
return this.accessGroupMemberLimitMapItem?.ScopeType === AccessGroupScopeType.SCOPED;
32+
}
33+
34+
getOperationString(): string {
35+
switch (this.accessGroupMemberLimitMapItem?.OperationType) {
36+
case AccessGroupMemberOperationString.ANY:
37+
return 'Add, remove, or update members from';
38+
case AccessGroupMemberOperationString.ADD:
39+
return 'Add members to';
40+
case AccessGroupMemberOperationString.REMOVE:
41+
return 'Remove members from';
42+
case AccessGroupMemberOperationString.UPDATE:
43+
return 'Update members from';
44+
default:
45+
return '';
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<div class="d-flex flex-column border br-12px border-primary p-1">
2+
<div class="d-flex justify-content-between align-items-center">
3+
<div class="d-flex justify-content-start align-items-center py-10px col-12">
4+
{{ getOperationString() }}{{ !isScoped() ? ' any of' : '' }}
5+
{{ (appUser?.ProfileEntryResponse?.Username || accessGroupLimitMapItem?.AccessGroupOwnerPublicKeyBase58Check | truncateAddressOrUsername)}}'s
6+
access group{{ isScoped() ? ' "' + accessGroupLimitMapItem?.AccessGroupKeyName + '"' : 's' }}
7+
({{ accessGroupLimitMapItem?.OpCount }}x).
8+
</div>
9+
</div>
10+
</div>

src/app/transaction-spending-limit/transaction-spending-limit-access-group/transaction-spending-limit-access-group.component.scss

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import {Component, Input, OnInit} from '@angular/core';
2+
import {GlobalVarsService} from 'src/app/global-vars.service';
3+
import {
4+
AccessGroupLimitMapItem,
5+
AccessGroupOperationString,
6+
AccessGroupScopeType,
7+
BackendAPIService,
8+
User
9+
} from '../../backend-api.service';
10+
import {TransactionSpendingLimitComponent} from '../transaction-spending-limit.component';
11+
12+
@Component({
13+
selector: 'app-transaction-spending-limit-access-group',
14+
templateUrl: './transaction-spending-limit-access-group.component.html',
15+
styleUrls: ['./transaction-spending-limit-access-group.component.scss'],
16+
})
17+
export class TransactionSpendingLimitAccessGroupComponent implements OnInit {
18+
@Input() accessGroupLimitMapItem: AccessGroupLimitMapItem | undefined;
19+
@Input() appUser: User | undefined;
20+
TransactionSpendingLimitComponent = TransactionSpendingLimitComponent;
21+
22+
constructor(
23+
private backendApi: BackendAPIService,
24+
public globalVars: GlobalVarsService
25+
) {}
26+
27+
ngOnInit(): void {
28+
}
29+
30+
isScoped(): boolean {
31+
return this.accessGroupLimitMapItem?.ScopeType === AccessGroupScopeType.SCOPED;
32+
}
33+
34+
getOperationString(): string {
35+
switch (this.accessGroupLimitMapItem?.OperationType) {
36+
case AccessGroupOperationString.ANY:
37+
return 'Create or update';
38+
case AccessGroupOperationString.CREATE:
39+
return 'Create';
40+
case AccessGroupOperationString.UPDATE:
41+
return 'Update';
42+
default:
43+
return '';
44+
}
45+
}
46+
}

src/app/transaction-spending-limit/transaction-spending-limit-section/transaction-spending-limit-section.component.html

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,50 @@
175175
></app-transaction-spending-limit-association>
176176
</div>
177177
</ng-container>
178+
<ng-container
179+
*ngIf="
180+
sectionTitle === TransactionSpendingLimitComponent.AccessGroupSection
181+
"
182+
>
183+
<div
184+
*ngFor="
185+
let accessGroupLimitMapItem of accessGroupLimitMap
186+
| slice
187+
: 0
188+
: (showAll
189+
? accessGroupLimitMap.length
190+
: defaultNumShown)
191+
"
192+
class="d-flex flex-column pb-15px"
193+
>
194+
<app-transaction-spending-limit-access-group
195+
[accessGroupLimitMapItem]="accessGroupLimitMapItem"
196+
[appUser]="userMap[accessGroupLimitMapItem.AccessGroupOwnerPublicKeyBase58Check]"
197+
></app-transaction-spending-limit-access-group>
198+
</div>
199+
</ng-container>
200+
<ng-container
201+
*ngIf="
202+
sectionTitle === TransactionSpendingLimitComponent.AccessGroupMemberSection
203+
"
204+
>
205+
<div
206+
*ngFor="
207+
let accessGroupMemberLimitMapItem of accessGroupMemberLimitMap
208+
| slice
209+
: 0
210+
: (showAll
211+
? accessGroupMemberLimitMap.length
212+
: defaultNumShown)
213+
"
214+
class="d-flex flex-column pb-15px"
215+
>
216+
<app-transaction-spending-limit-access-group-member
217+
[accessGroupMemberLimitMapItem]="accessGroupMemberLimitMapItem"
218+
[appUser]="userMap[accessGroupMemberLimitMapItem.AccessGroupOwnerPublicKeyBase58Check]"
219+
></app-transaction-spending-limit-access-group-member>
220+
</div>
221+
</ng-container>
178222
</div>
179223
</div>
180224

src/app/transaction-spending-limit/transaction-spending-limit-section/transaction-spending-limit-section.component.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { Component, Input, OnInit } from '@angular/core';
22
import {
3+
AccessGroupLimitMapItem,
4+
AccessGroupMemberLimitMapItem,
35
AssociationLimitMapItem,
46
CreatorCoinLimitOperationString,
57
CreatorCoinOperationLimitMap,
@@ -27,7 +29,9 @@ export class TransactionSpendingLimitSectionComponent implements OnInit {
2729
| DAOCoinOperationLimitMap
2830
| NFTOperationLimitMap
2931
| DAOCoinLimitOrderLimitMap
30-
| AssociationLimitMapItem[] = {};
32+
| AssociationLimitMapItem[]
33+
| AccessGroupLimitMapItem[]
34+
| AccessGroupMemberLimitMapItem[] = {};
3135
@Input() sectionTitle: string = '';
3236

3337
@Input() userMap: { [k: string]: User } = {};
@@ -47,6 +51,8 @@ export class TransactionSpendingLimitSectionComponent implements OnInit {
4751
daoCoinLimitOrderLimitMap: DAOCoinLimitOrderLimitMap = {};
4852
daoCoinLimitOrderLimitItems: DAOCoinLimitOrderLimitItem[] = [];
4953
associationLimitMap: AssociationLimitMapItem[] = [];
54+
accessGroupLimitMap: AccessGroupLimitMapItem[] = [];
55+
accessGroupMemberLimitMap: AccessGroupMemberLimitMapItem[] = [];
5056

5157
constructor(public globalVars: GlobalVarsService) {}
5258

@@ -96,6 +102,12 @@ export class TransactionSpendingLimitSectionComponent implements OnInit {
96102
break;
97103
case TransactionSpendingLimitComponent.AssociationSection:
98104
this.associationLimitMap = this.sectionMap as AssociationLimitMapItem[];
105+
break;
106+
case TransactionSpendingLimitComponent.AccessGroupSection:
107+
this.accessGroupLimitMap = this.sectionMap as AccessGroupLimitMapItem[];
108+
break;
109+
case TransactionSpendingLimitComponent.AccessGroupMemberSection:
110+
this.accessGroupMemberLimitMap = this.sectionMap as AccessGroupMemberLimitMapItem[];
99111
}
100112

101113
this.showAll = this.getSectionMapLength() <= this.defaultNumShown;
@@ -115,6 +127,10 @@ export class TransactionSpendingLimitSectionComponent implements OnInit {
115127
return 'DAO coin limit order';
116128
case TransactionSpendingLimitComponent.AssociationSection:
117129
return 'Association';
130+
case TransactionSpendingLimitComponent.AccessGroupSection:
131+
return 'Access Group';
132+
case TransactionSpendingLimitComponent.AccessGroupMemberSection:
133+
return 'Access Group Member';
118134
default:
119135
return '';
120136
}
@@ -156,6 +172,10 @@ export class TransactionSpendingLimitSectionComponent implements OnInit {
156172
return this.daoCoinLimitOrderLimitItems.length;
157173
case TransactionSpendingLimitComponent.AssociationSection:
158174
return this.associationLimitMap.length;
175+
case TransactionSpendingLimitComponent.AccessGroupSection:
176+
return this.accessGroupLimitMap.length;
177+
case TransactionSpendingLimitComponent.AccessGroupMemberSection:
178+
return this.accessGroupMemberLimitMap.length;
159179
default:
160180
return this.globalVars.ObjectKeyLength(this.sectionMap);
161181
}

0 commit comments

Comments
 (0)