src/app/review/submitter/submitter.component.ts

Implements

OnInit AfterViewInit

Metadata

Relationships

Used by

Depends on

Index

Properties
Methods

Constructor

constructor(sasStoreService: SasStoreService, eventService: EventService, router: Router, route: ActivatedRoute, sasService: SasService)
Parameters :
Name Type Optional
sasStoreService SasStoreService No
eventService EventService No
router Router No
route ActivatedRoute No
sasService SasService No

Methods

Public download
download(id: any)
Parameters :
Name Type Optional
id any No
Returns : void
Public getDetails
getDetails(sub: any, index: any)
Parameters :
Name Type Optional
sub any No
index any No
Returns : void
Public goToDetails
goToDetails(table_id: any)
Parameters :
Name Type Optional
table_id any No
Returns : void
Public goToStage
goToStage(table_id: any)
Parameters :
Name Type Optional
table_id any No
Returns : void
ngAfterViewInit
ngAfterViewInit()
Returns : void
Async ngOnInit
ngOnInit()
Returns : any

Properties

Private _backToSub
Type : Subscription
Private _readySub
Type : Subscription
Public detailsOpen
Type : boolean
Default value : false
Public itemsNum
Type : number
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>

./submitter.component.scss

Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""