Methods
|
Public
download
|
download(id: any)
|
|
|
Parameters :
| Name |
Type |
Optional |
| id |
any
|
No
|
|
|
Public
getDetails
|
getDetails(sub: any, index: any)
|
|
|
Parameters :
| Name |
Type |
Optional |
| sub |
any
|
No
|
| index |
any
|
No
|
|
|
Public
goToDetails
|
goToDetails(table_id: any)
|
|
|
Parameters :
| Name |
Type |
Optional |
| table_id |
any
|
No
|
|
|
Public
goToStage
|
goToStage(table_id: any)
|
|
|
Parameters :
| Name |
Type |
Optional |
| table_id |
any
|
No
|
|
|
ngAfterViewInit
|
ngAfterViewInit()
|
|
|
|
|
|
Async
ngOnInit
|
ngOnInit()
|
|
|
|
|
|
Private
_backToSub
|
Type : Subscription
|
|
|
|
Private
_readySub
|
Type : Subscription
|
|
|
|
Public
detailsOpen
|
Type : boolean
|
Default value : false
|
|
|
|
Public
loaded
|
Type : boolean
|
Default value : false
|
|
|
|
Public
remained
|
Type : number
|
Default value : 0
|
|
|
|
Public
submitData
|
Type : Array<any>
|
|
|
|
Public
submitReasonFilter
|
Type : unknown
|
Default value : new SubmitReasonFilter()
|
|
|
|
Public
submittedFilter
|
Type : unknown
|
Default value : new SubmittedFilter()
|
|
|
|
Public
submitter
|
Type : string
|
|
|
|
Public
submitterList
|
Type : SubmitterData[]
|
|
|
|
Public
subReady
|
Type : boolean
|
Default value : false
|
|
|
import {
Component,
AfterViewInit,
OnInit,
ViewEncapsulation
} from '@angular/core'
import { Subscription } from 'rxjs'
import { ActivatedRoute, Router } from '@angular/router'
import { SasStoreService, EventService, SasService } from '../../services'
import { ClrDatagridStringFilterInterface } from '@clr/angular'
interface SubmitterData {
tableId: string
base: string
submitted: string
submitReason: string
approver: string
}
class SubmittedFilter implements ClrDatagridStringFilterInterface<SubmitterData> {
accepts(data: SubmitterData, search: string): boolean {
return data.submitted.toLowerCase().indexOf(search.toLowerCase()) >= 0
}
}
class SubmitReasonFilter implements ClrDatagridStringFilterInterface<SubmitterData> {
accepts(data: SubmitterData, search: string): boolean {
return data.submitReason.toLowerCase().indexOf(search.toLowerCase()) >= 0
}
}
@Component({
selector: 'app-submitter',
templateUrl: './submitter.component.html',
styleUrls: ['./submitter.component.scss'],
host: {
class: 'content-container'
},
encapsulation: ViewEncapsulation.None,
standalone: false
})
export class SubmitterComponent implements OnInit, AfterViewInit {
public remained: number = 0
public itemsNum!: number
public submitterList!: SubmitterData[]
public loaded: boolean = false
public subReady: boolean = false
public detailsOpen: boolean = false
public submitter!: string
public submitData!: Array<any>
private _readySub!: Subscription
private _backToSub!: Subscription
// Filter instances for datagrid accessibility
public submittedFilter = new SubmittedFilter()
public submitReasonFilter = new SubmitReasonFilter()
constructor(
private sasStoreService: SasStoreService,
private eventService: EventService,
private router: Router,
private route: ActivatedRoute,
private sasService: SasService
) {}
public goToStage(table_id: any) {
this.router.navigateByUrl('/stage/' + table_id)
}
public goToDetails(table_id: any) {
// the details URL re-creates this component - carry the queue payload
// over so it is not fetched again on mount
this.sasStoreService.handoffSubmits(this.submitData)
this.router.navigateByUrl('/review/submitted/' + table_id)
}
public getDetails(sub: any, index: any) {
this.subReady = true
setTimeout(() => {
this.sasStoreService.sendDetails(sub, index, this.submitData)
}, 0)
}
async ngOnInit() {
const tableIdParam = this.route.snapshot.params['tableId']
this.itemsNum = 10
try {
// navigating from the submit list to a details URL re-creates this
// component - take the queue payload carried over by that navigation
// instead of fetching it again
let fromsas: any = this.sasStoreService.takeSubmitsHandoff()
if (!fromsas) {
fromsas = (await this.sasStoreService.getSubmitts()).fromsas
}
this.remained = fromsas.length
if (this.remained > 0) {
this.submitter = fromsas[0].SUBMITTED_BY_NM
let submitterList: SubmitterData[] = fromsas.map(function (item: any) {
return {
tableId: item.TABLE_ID,
base: item.BASE_TABLE,
submitted: item.SUBMITTED_ON_DTTM,
submitter: item.SUBMITTED_BY_NM,
submitReason: item.SUBMITTED_REASON_TXT
}
})
this.submitterList = submitterList
this.submitData = fromsas
// Details page
if (typeof tableIdParam !== 'undefined') {
const submitterIndex = this.submitterList.findIndex(
(x) => x.tableId === tableIdParam
)
if (submitterIndex > -1) {
const submitter = this.submitterList[submitterIndex]
this.getDetails(submitter, submitterIndex)
}
}
}
this.loaded = true
} catch (error) {
this.eventService.catchResponseError('editors/getsubmits', error)
}
}
ngAfterViewInit() {
this._readySub = this.sasStoreService.setSubmit.subscribe((sub) => {
this.subReady = sub
})
this._backToSub = this.sasStoreService.setSubmitList.subscribe((sub) => {
this.subReady = !this.subReady
this.detailsOpen = false
})
}
public download(id: any) {
let sasjsConfig = this.sasService.getSasjsConfig()
let storage = sasjsConfig.serverUrl
let metaData = sasjsConfig.appLoc
let path = this.sasService.getExecutionPath()
let downUrl =
storage +
path +
'/?_program=' +
metaData +
'/services/auditors/getauditfile&table=' +
id
window.open(downUrl)
}
}
<div class="w-100">
@if (!subReady) {
<div class="content-area">
@if (!subReady) {
<div class="card">
@if (remained === 0 && loaded) {
<div class="d-flex justify-content-center">
<div
class="no-submitted-tables card-block d-flex justify-content-center flex-column align-items-center"
>
<clr-icon
shape="warning-standard"
size="60"
class="is-info"
></clr-icon>
<h3 class="text-center color-gray">
You have not submitted any tables
</h3>
</div>
</div>
}
<div class="card-header" [ngClass]="{ noBorder: !loaded }">
@if (remained !== 0) {
<h3 class="center clr-col-md-12 text-center">SUBMIT QUEUE</h3>
}
@if (loaded && remained !== 0) {
<p class="text-center font-weight-700 color-dark-gray">
You have <span>{{ remained }} </span>submissions waiting to be
approved
</p>
}
</div>
@if (!loaded) {
<div
class="h-70vh d-flex justify-content-center flex-column align-items-center"
>
@if (!loaded) {
<span class="spinner"> Loading... </span>
}
@if (!loaded) {
<div>
<h3>Loading submitted list</h3>
</div>
}
</div>
}
@if (loaded) {
<div class="clr-col-md-12">
@if (submitterList && remained !== 0) {
<div>
<clr-datagrid class="datagrid-compact datagrid-custom-footer">
<clr-dg-column>BASE TABLE</clr-dg-column>
<clr-dg-column [clrDgField]="'submitted'">
SUBMITTED
<clr-dg-string-filter
[clrDgStringFilter]="submittedFilter"
aria-label="Filter submitted date"
></clr-dg-string-filter>
</clr-dg-column>
<clr-dg-column [clrDgField]="'submitReason'">
SUBMIT REASON
<clr-dg-string-filter
[clrDgStringFilter]="submitReasonFilter"
aria-label="Filter submit reason"
></clr-dg-string-filter>
</clr-dg-column>
<clr-dg-column class="d-flex justify-content-center"
>ACTION</clr-dg-column
>
<clr-dg-column class="d-flex justify-content-center"
>DOWNLOAD</clr-dg-column
>
<clr-dg-row
*clrDgItems="let sub of submitterList; let i = index"
(click)="goToDetails(sub.tableId)"
class="cursor-pointer"
>
<clr-dg-cell>{{ sub.base }}</clr-dg-cell>
<clr-dg-cell>{{ sub.submitted }}</clr-dg-cell>
<!-- <clr-dg-cell>{{sub.approver}}</clr-dg-cell> -->
<clr-dg-cell>{{ sub.submitReason }}</clr-dg-cell>
<clr-dg-cell>
<div
class="row justify-content-around"
role="tooltip"
aria-label="Go to staged data screen"
>
<a
class="column-center links tooltip tooltip-md tooltip-bottom-left color-blue"
(click)="goToStage(sub.tableId)"
>
<clr-icon shape="code" size="28"></clr-icon>
<span class="tooltip-content"
>Go to staged data screen</span
>
</a>
</div>
</clr-dg-cell>
<clr-dg-cell class="p-0 d-flex justify-content-center">
<button
class="btn btn-success"
aria-label="Download audit file for table record"
(click)="
download(sub.tableId); $event.stopPropagation()
"
>
<clr-icon shape="download"></clr-icon>
</button>
</clr-dg-cell>
</clr-dg-row>
<clr-dg-footer>
<clr-dg-pagination #pagination [clrDgPageSize]="10">
<clr-dg-page-size [clrPageSizeOptions]="[3, 5, 10, 15]"
>Items per page</clr-dg-page-size
>
{{ pagination.firstItem + 1 }} -
{{ pagination.lastItem + 1 }} of
{{ pagination.totalItems }} submissions
</clr-dg-pagination>
</clr-dg-footer>
</clr-datagrid>
</div>
}
</div>
}
</div>
}
</div>
}
@if (subReady) {
<div>
<app-approve-details></app-approve-details>
</div>
}
</div>
Legend
Html element with directive