src/app/shared/terms/terms.component.ts
| encapsulation | ViewEncapsulation.None |
| selector | app-terms |
| styleUrls | ./terms.component.scss |
| templateUrl | ./terms.component.html |
Properties |
|
Methods |
constructor(sasService: SasService)
|
||||||
|
Defined in src/app/shared/terms/terms.component.ts:28
|
||||||
|
Parameters :
|
| ngAfterViewInit |
ngAfterViewInit()
|
|
Defined in src/app/shared/terms/terms.component.ts:37
|
|
Returns :
void
|
| ngOnInit |
ngOnInit()
|
|
Defined in src/app/shared/terms/terms.component.ts:32
|
|
Returns :
void
|
| onCardBlockScroll | ||||||
onCardBlockScroll(event: any)
|
||||||
|
Defined in src/app/shared/terms/terms.component.ts:81
|
||||||
|
Parameters :
Returns :
void
|
| termsAgreeChange |
termsAgreeChange()
|
|
Defined in src/app/shared/terms/terms.component.ts:46
|
|
Returns :
void
|
| Public agreeBoxLocked |
Type : boolean
|
Default value : true
|
|
Defined in src/app/shared/terms/terms.component.ts:25
|
| Public agreeChecked |
Type : boolean
|
Default value : false
|
|
Defined in src/app/shared/terms/terms.component.ts:24
|
| Public agreeClicked |
Type : boolean
|
Default value : false
|
|
Defined in src/app/shared/terms/terms.component.ts:26
|
| Public eula_markdown |
Type : unknown
|
Default value : EULA
|
|
Defined in src/app/shared/terms/terms.component.ts:28
|
| markdownCard |
Type : ElementRef
|
Decorators :
@ViewChild('markdownCard')
|
|
Defined in src/app/shared/terms/terms.component.ts:22
|
import {
AfterViewInit,
Component,
ElementRef,
OnInit,
ViewChild,
ViewEncapsulation
} from '@angular/core'
import { SasService } from '../../services/sas.service'
import * as marked from 'marked'
import { EULA } from 'src/environments/_eula'
import { RequestWrapperResponse } from 'src/app/models/request-wrapper/RequestWrapperResponse'
@Component({
selector: 'app-terms',
templateUrl: './terms.component.html',
styleUrls: ['./terms.component.scss'],
encapsulation: ViewEncapsulation.None,
standalone: false
})
export class TermsComponent implements OnInit, AfterViewInit {
@ViewChild('markdownCard') markdownCard!: ElementRef
public agreeChecked: boolean = false
public agreeBoxLocked: boolean = true
public agreeClicked: boolean = false
public eula_markdown = EULA
constructor(private sasService: SasService) {}
ngOnInit(): void {
const md = marked.marked.setOptions({})
this.eula_markdown = md.parse(this.eula_markdown)
}
ngAfterViewInit(): void {
// We will fire SCROLL event that will recalculate and enable checkbox in case when
// licence is short and no scroll is present
setTimeout(() => {
if (this.markdownCard)
this.markdownCard.nativeElement.dispatchEvent(new CustomEvent('scroll'))
})
}
termsAgreeChange() {
if (!this.agreeChecked) {
return
}
this.agreeBoxLocked = true
this.agreeClicked = true
let table = { SASControlTable: [{ ACCEPTED: 'yes' }] }
this.sasService
.request(`public/registeruser`, table)
.then((res: RequestWrapperResponse) => {
if (
res.adapterResponse.return &&
res.adapterResponse.return[0] &&
res.adapterResponse.return[0].MSG === 'SUCCESS'
) {
location.reload()
}
})
.catch((err: any) => err)
.finally(() => {
//Timeout is added to improve UX
//Without it, spinner would stop, and after one second app is reloaded
//at that point it gives false impresion that accepting didn't work
//with timeout spinner is visible all the time until page reloads
setTimeout(() => {
this.agreeBoxLocked = false
this.agreeClicked = false
this.agreeChecked = false
}, 1000)
})
}
onCardBlockScroll(event: any) {
if (!this.agreeClicked) {
let card_block_el: any = event.target
if (card_block_el) {
let pos = card_block_el.scrollTop + card_block_el.offsetHeight
let max = card_block_el.scrollHeight - 20
if (pos >= max) {
this.agreeBoxLocked = false
} else {
this.agreeBoxLocked = true
}
}
}
}
}
<div class="card">
<div class="card-header">
End User License Agreement
<p>
Welcome to Data Controller for SAS! Please review and accept agreement
below in order to proceed.
</p>
</div>
<div
#markdownCard
class="card-block"
(scroll)="onCardBlockScroll($event)"
[innerHTML]="eula_markdown"
></div>
<div class="d-flex clr-align-items-center">
<clr-checkbox-wrapper
[class.disabled]="agreeBoxLocked"
class="accept-checkbox"
>
<input
clrCheckbox
type="checkbox"
[(ngModel)]="agreeChecked"
[disabled]="agreeBoxLocked"
(change)="termsAgreeChange()"
/>
<label>I have read and agree to the terms of above.</label>
</clr-checkbox-wrapper>
@if (agreeBoxLocked && agreeClicked) {
<clr-spinner clrInline="small"></clr-spinner>
}
</div>
</div>
./terms.component.scss