@@ -0,0 +1,13 @@ | |||
### STAGE 1: Build ### | |||
FROM node:17.2-alpine AS build | |||
WORKDIR /usr/src/app | |||
COPY package.json package-lock.json ./ | |||
RUN npm install | |||
COPY . . | |||
RUN npm run build | |||
### STAGE 2: Run ### | |||
FROM nginx:1.21.4-alpine | |||
COPY ./certificates/ /etc/certificates | |||
COPY ./nginx.conf /etc/nginx/nginx.conf | |||
COPY /dist/bizfile /usr/share/nginx/html |
@@ -49,7 +49,7 @@ | |||
{ | |||
"type": "anyComponentStyle", | |||
"maximumWarning": "2kb", | |||
"maximumError": "4kb" | |||
"maximumError": "8kb" | |||
} | |||
], | |||
"fileReplacements": [ | |||
@@ -0,0 +1,22 @@ | |||
-----BEGIN CERTIFICATE----- | |||
MIIDqDCCApACCQCVkaNcSp8MnjANBgkqhkiG9w0BAQsFADCBlTELMAkGA1UEBhMC | |||
SU4xEjAQBgNVBAgMCUthcm5hdGFrYTESMBAGA1UEBwwJQmVuZ2FsdXJ1MRIwEAYD | |||
VQQKDAlXZWJ0cmlnb24xDDAKBgNVBAsMA0RldjEWMBQGA1UEAwwNd2VidHJpZ29u | |||
LmNvbTEkMCIGCSqGSIb3DQEJARYVYWR3YWl0aEB3ZWJ0cmlnb24uY29tMB4XDTIx | |||
MTIxMjE1NDAxMFoXDTIyMTIxMjE1NDAxMFowgZUxCzAJBgNVBAYTAklOMRIwEAYD | |||
VQQIDAlLYXJuYXRha2ExEjAQBgNVBAcMCUJlbmdhbHVydTESMBAGA1UECgwJV2Vi | |||
dHJpZ29uMQwwCgYDVQQLDANEZXYxFjAUBgNVBAMMDXdlYnRyaWdvbi5jb20xJDAi | |||
BgkqhkiG9w0BCQEWFWFkd2FpdGhAd2VidHJpZ29uLmNvbTCCASIwDQYJKoZIhvcN | |||
AQEBBQADggEPADCCAQoCggEBAK/rFKIaTQrPMo/QDk2+4/J/KnvIQm2mIUB0bngx | |||
b16bw1Od1Km9TWknp+i3fwR0UjfeFx+Sz6O545cte2q4ytaOvuwSY6vLRWk67xSK | |||
TVYJ1puO5vkU5LBT1/uXic/wxKmQq+h5Vcp0MSG2vt8L0Qa0K2+yKDDA/WEMKahL | |||
Mhht/+FHyYoS+mrIKE8YT+2fyw4LB9x9/Ae77Fq08Z6fwpKf25RsjTrQ3MC/rmXE | |||
mh2nzZDF7b7jxUSaLh6iS8GUzyhjP9QaoKlZDgZZ6XKWpca9Lp+BzkRgIosv2uit | |||
WKqLl1knX3SrFO1jHuTIOXBbF/jv35zDkbFXxb4DzhypiyECAwEAATANBgkqhkiG | |||
9w0BAQsFAAOCAQEArRxkrnzjgp+eBIX7bmbPyGm/nKOARXYD5fBRzfKvoYW28ywp | |||
jSyk1YTSPQ40Zt0yAHMM+ximlsdx8SswCxMtIaBanFovE/+ZRMCDFej1OvwKm6uS | |||
yZn0sSLHWT5QG0/VWKPyiH5KQ30NuTanTsj2P7x2lpLBBWDuXoWCMFrsrNxLeg0Z | |||
BwmSkP65jVRZen10lx6MxOONeNJrlQe061V2O2oQkb/PFR3mA/QnXasQ4tb3DHJW | |||
zbXAsxh+OJEPWgPTmmNuP2pvY8HNRNcdsyxH0a/bxTTZ2H+ZoSjCUO9CmLRNrY3Q | |||
KFsotcs65K2EfmXSJGhv93gmhQ4MRySp7AKzHA== | |||
-----END CERTIFICATE----- |
@@ -0,0 +1,28 @@ | |||
-----BEGIN PRIVATE KEY----- | |||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCv6xSiGk0KzzKP | |||
0A5NvuPyfyp7yEJtpiFAdG54MW9em8NTndSpvU1pJ6fot38EdFI33hcfks+jueOX | |||
LXtquMrWjr7sEmOry0VpOu8Uik1WCdabjub5FOSwU9f7l4nP8MSpkKvoeVXKdDEh | |||
tr7fC9EGtCtvsigwwP1hDCmoSzIYbf/hR8mKEvpqyChPGE/tn8sOCwfcffwHu+xa | |||
tPGen8KSn9uUbI060NzAv65lxJodp82Qxe2+48VEmi4eokvBlM8oYz/UGqCpWQ4G | |||
WelylqXGvS6fgc5EYCKLL9rorViqi5dZJ190qxTtYx7kyDlwWxf479+cw5GxV8W+ | |||
A84cqYshAgMBAAECggEAC6kRXQ1RPf4t48puqEiW42P6dOn5PTtdyN/u0pi0QRki | |||
AVDc38NkdivivVIsYSc0q+9UqQsaKEgSBdtF6vUEvOQJU6yEXsbCew8k+b+RELrm | |||
NrlqJeh0oBtunYaV4+qZnoOwYWBph1ncR9fNHwuxdzhKCMVOVKz2HpCn0jfpwiSs | |||
Pv6wdU/MzRDVo2iJNcLEaLzX/177Vw7P4kpa+Ys5V0kCdVsZwH2NSHqzNhGkxjD8 | |||
lTEDoPhy1wPjn/puxbLEn/BhYLbGyxbIkqm3N7hwYdgU3dXuyBY9lm2DqKqgjP9N | |||
4icOblEiNlN8JRb5jLSCrbIALH7R3Chh1Gy37beqgQKBgQDen9sB89+sQ6QBajYd | |||
NNYXvSPzbhR/Qc6to8C2tb0oMAoV5656h25mZwq8DyaHH5E6J6Xgs2cdtcS85Mex | |||
spIgMZiy2pqATj88W0ukVvFoh012O+S2Zk/v/KrbZ1k6ZuYLiGqA9Zv72tGPfnHe | |||
2c7wrOZ3mRXeY9Bnll2Ylkj85QKBgQDKSq5YFmvBX2I5gJJABd9CbofNdvVZh5Ff | |||
psrnO370wa4vYIK46aSY4fVRhuQnRlpNRW+tsauTUSXnzgFVsKD0lG8CxhpSOFsi | |||
rFXR/QVo9WQCh8AuJHxMNiy2iXG/hiFeeEjbWdb2sCuUjUjDCMD+JoQcMuIg+fL6 | |||
ZQYhG9otjQKBgBMs98NSS0jeRqksid64J1zCGO+l4rQXagMA4N+cBeAJS0UZwKij | |||
M7o0U/Ng5rOq32p/8cTKDy668mhG2ICQ3g9R1lJJjBdTJhU/0+Mi7gZP6Tcu74Na | |||
irYkMF9XppLmPBhwNqRHA5mM/pH6lTpZzn5iljNlB0IxnMjfZc5322+VAoGAYbif | |||
7ieumDRms9Z7T/hGOMZCTiwYK87EmEtvmzJvivcBGRvrKj6b58rIAkFCeAKRXuCb | |||
KXI5qym5QPiQRn/T0TLfSZy/XFajF+Xec1liQqjATkSbvu6bKQnGoctVqqq19ffv | |||
Yh9NK9BAzTtPGgBhkqSyjxi5iiqUiQdCZb4ZsIUCgYEAn8UenohLROB/b6cMu35C | |||
0uKQHwla/Rx7al3db4pMHz9o6QBiLdpg/rik7BJYDM2smImpQuDFCbzQ9baRRj6l | |||
r/wqm8kSya9BniCLjq045tsYj5BzhsMIYZalB2k56BKoFcNPzRbdjqyArDB4Rqwu | |||
9VBf2HSssIRVha59ytmZAWQ= | |||
-----END PRIVATE KEY----- |
@@ -0,0 +1,19 @@ | |||
events{} | |||
http { | |||
include /etc/nginx/mime.types; | |||
server { | |||
listen 80; | |||
# listen 443; | |||
# ssl on; | |||
# ssl_certificate /etc/certificates/localhost.crt; | |||
# ssl_certificate_key /etc/certificates/localhost.key; | |||
# ssl_ciphers HIGH:!aNULL:!MD5; | |||
server_name localhost; | |||
root /usr/share/nginx/html; | |||
index index.html; | |||
location / { | |||
try_files $uri $uri/ /index.html; | |||
} | |||
} | |||
} |
@@ -6,7 +6,14 @@ | |||
"start": "ng serve", | |||
"build": "ng build", | |||
"watch": "ng build --watch --configuration development", | |||
"test": "ng test" | |||
"test": "ng test", | |||
"docker-build": "docker build -t b2rs-multi-stage-image .", | |||
"docker-create": "docker run --name b2rs-app-container -d -p 80:80 b2rs-multi-stage-image", | |||
"docker-destroy": "docker container rm b2rs-app-container", | |||
"docker-start": "docker start b2rs-app-container", | |||
"docker-stop": "docker stop b2rs-app-container" | |||
}, | |||
"private": true, | |||
"dependencies": { | |||
@@ -1,58 +1,5 @@ | |||
$header-height: 10rem; | |||
.notifications-window { | |||
position: fixed; | |||
top: calc(#{$header-height} - 1rem); | |||
background-color: white; | |||
width: 40rem; | |||
box-shadow: 0px 0px 15px -3px var(--dark-grey); | |||
z-index: 2; | |||
right: 26rem; | |||
border-radius: 1.5rem; | |||
overflow: hidden; | |||
header { | |||
height: 5rem; | |||
padding: 0 2rem; | |||
display: flex; | |||
align-items: center; | |||
justify-content: flex-start; | |||
width: calc(100% - 2rem); | |||
border-radius: 1rem; | |||
margin: 1rem auto 0; | |||
position: relative; | |||
overflow: hidden; | |||
&::before { | |||
content: ''; | |||
position: absolute; | |||
left: 0; | |||
top: 0; | |||
width: 100%; | |||
height: 100%; | |||
background-color: var(--border-grey); | |||
opacity: 0.7; | |||
} | |||
h4{ | |||
position: relative; | |||
font-size: 1.7rem; | |||
color: var(--primary); | |||
font-weight: 500; | |||
} | |||
} | |||
.backdrop { | |||
position: fixed; | |||
left: 0; | |||
top: 0; | |||
width: 100vw; | |||
height: 100vw; | |||
z-index: 0; | |||
} | |||
} | |||
.page { | |||
height: calc(100vh - #{$header-height}); | |||
margin: 0 auto; | |||
@@ -101,6 +101,7 @@ | |||
<app-generic-input | |||
type="text" | |||
label="UEN" | |||
placeholder="Partial/full match" | |||
></app-generic-input> | |||
<app-select-input | |||
label="Enforcment status" | |||
@@ -39,27 +39,37 @@ | |||
<ng-container *ngIf="formState === 'REGISTER_FORM'"> | |||
<section class="form"> | |||
<div class="input-holder" *ngFor="let registerInput of registerForm"> | |||
<ng-container *ngIf="registerInput.type === 'date'"> | |||
<app-date-input | |||
[label]="registerInput.name" | |||
></app-date-input> | |||
</ng-container> | |||
<ng-container *ngIf="registerInput.type === 'select'"> | |||
<app-select-input | |||
[label]="registerInput.name" | |||
[options]="registerInput.options" | |||
></app-select-input> | |||
</ng-container> | |||
<ng-container *ngIf="registerInput.type === 'text' || registerInput.type === 'email'"> | |||
<app-generic-input | |||
[label]="registerInput.name" | |||
[type]="registerInput.type" | |||
[placeholder]="registerInput.placeholder" | |||
></app-generic-input> | |||
</ng-container> | |||
<div class="input-holder"> | |||
<app-select-input | |||
label="Entity Type" | |||
[options]="entityTypeOptions" | |||
[value]="selectedEntityType" | |||
(onChange)="selectEntityType($event)" | |||
></app-select-input> | |||
</div> | |||
<div class="input-holder"> | |||
<app-select-input | |||
label="Company Category" | |||
[options]="companyCategoryOptions" | |||
[value]="selectedCompanyCategory" | |||
(onChange)="selectCompanyCategory($event)" | |||
></app-select-input> | |||
</div> | |||
<div class="input-holder"> | |||
<app-select-input | |||
label="Company Suffix" | |||
[options]="companySuffixOptions" | |||
[value]="selectedCompanySuffix" | |||
(onChange)="selectCompanySuffix($event)" | |||
></app-select-input> | |||
</div> | |||
<div class="input-holder"> | |||
<app-select-input | |||
label="Drop the Suffix 'Limited' or 'Berhad'?" | |||
[options]="dropSuffixOptions" | |||
[value]="selectedDropSuffix" | |||
(onChange)="selectDropSuffix($event)" | |||
></app-select-input> | |||
</div> | |||
</section> | |||
@@ -27,35 +27,27 @@ export class RegisterBusinessComponent implements OnInit { | |||
paymentChild: Window | null = null; | |||
childCheck: number | undefined; | |||
registerForm: Array<SelectInputProperties|DateInputProperties|GenericInputProperties> = [{ | |||
name: 'Entity Type', | |||
type: 'select', | |||
options: [ | |||
'BUSINESS', | |||
'LOCAL COMPANY', | |||
'LIMITED LIABILITY PARTNERSHIP', | |||
'FOREIGN COMPANY', | |||
'LIMITED PARTNERSHIP', | |||
'PUBLIC ACCOUNTING FIRM' | |||
] | |||
}, { | |||
name: 'Company Category', | |||
type: 'select', | |||
options: [ | |||
'PUBLIC COMPANY LIMITED BY SHARES', | |||
'PUBLIC COMPANY LIMITED BY GUARANTEE', | |||
'PRIVATE COMPANY LIMITED BY SHARES', | |||
'EXEMPT PRIVATE COMPANY LIMITED BY SHARES' | |||
] | |||
}, { | |||
name: 'Company Suffix', | |||
type: 'select', | |||
options: ['LLC', 'LTD', 'PVT LTD', 'INC'] | |||
}, { | |||
name: 'Drop the Suffix "Limited" or "Berhad"?', | |||
type: 'select', | |||
options: ['YES', 'NO'] | |||
}]; | |||
selectedEntityType = 'FOREIGN COMPANY'; | |||
selectedCompanyCategory = ''; | |||
selectedCompanySuffix = ''; | |||
selectedDropSuffix = ''; | |||
entityTypeOptions = [ | |||
'BUSINESS', | |||
'LOCAL COMPANY', | |||
'LIMITED LIABILITY PARTNERSHIP', | |||
'FOREIGN COMPANY', | |||
'LIMITED PARTNERSHIP', | |||
'PUBLIC ACCOUNTING FIRM' | |||
]; | |||
companyCategoryOptions = [ | |||
'PUBLIC COMPANY LIMITED BY SHARES', | |||
'PUBLIC COMPANY LIMITED BY GUARANTEE', | |||
'PRIVATE COMPANY LIMITED BY SHARES', | |||
'EXEMPT PRIVATE COMPANY LIMITED BY SHARES' | |||
]; | |||
companySuffixOptions = ['LLC', 'LTD', 'PVT LTD', 'INC']; | |||
dropSuffixOptions = ['YES', 'NO']; | |||
acknowledgementDetails: Array<{ | |||
@@ -127,6 +119,22 @@ export class RegisterBusinessComponent implements OnInit { | |||
this.formState = 'REGISTER_FORM'; | |||
} | |||
selectEntityType(selectedEntityType: string) { | |||
this.selectedEntityType = selectedEntityType; | |||
} | |||
selectCompanyCategory(selectedCompanyCategory: string) { | |||
this.selectedCompanyCategory = selectedCompanyCategory; | |||
} | |||
selectCompanySuffix(selectedCompanySuffix: string) { | |||
this.selectedCompanySuffix = selectedCompanySuffix; | |||
} | |||
selectDropSuffix(selectedDropSuffix: string) { | |||
this.selectedDropSuffix = selectedDropSuffix; | |||
} | |||
goBackToFormDetails() { | |||
if (typeof this.childCheck !== 'undefined') { | |||
window.clearInterval(this.childCheck); | |||
@@ -1,5 +1,5 @@ | |||
<div class="input-holder"> | |||
<select> | |||
<select (change)="updateValue($event)"> | |||
<option *ngFor="let option of options" [value]="option" [selected]="value === option"> {{ option }} </option> | |||
</select> | |||
@@ -23,7 +23,8 @@ export class SelectInputComponent implements OnInit { | |||
ngOnInit(): void { | |||
} | |||
updateValue(value: string) { | |||
updateValue(event: any) { | |||
const value: string = event.target.value; | |||
this.value = value; | |||
this.onChange.emit(value); | |||
} | |||