@@ -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", | "type": "anyComponentStyle", | ||||
"maximumWarning": "2kb", | "maximumWarning": "2kb", | ||||
"maximumError": "4kb" | |||||
"maximumError": "8kb" | |||||
} | } | ||||
], | ], | ||||
"fileReplacements": [ | "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", | "start": "ng serve", | ||||
"build": "ng build", | "build": "ng build", | ||||
"watch": "ng build --watch --configuration development", | "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, | "private": true, | ||||
"dependencies": { | "dependencies": { | ||||
@@ -1,58 +1,5 @@ | |||||
$header-height: 10rem; | $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 { | .page { | ||||
height: calc(100vh - #{$header-height}); | height: calc(100vh - #{$header-height}); | ||||
margin: 0 auto; | margin: 0 auto; | ||||
@@ -101,6 +101,7 @@ | |||||
<app-generic-input | <app-generic-input | ||||
type="text" | type="text" | ||||
label="UEN" | label="UEN" | ||||
placeholder="Partial/full match" | |||||
></app-generic-input> | ></app-generic-input> | ||||
<app-select-input | <app-select-input | ||||
label="Enforcment status" | label="Enforcment status" | ||||
@@ -39,27 +39,37 @@ | |||||
<ng-container *ngIf="formState === 'REGISTER_FORM'"> | <ng-container *ngIf="formState === 'REGISTER_FORM'"> | ||||
<section class="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> | </div> | ||||
</section> | </section> | ||||
@@ -27,35 +27,27 @@ export class RegisterBusinessComponent implements OnInit { | |||||
paymentChild: Window | null = null; | paymentChild: Window | null = null; | ||||
childCheck: number | undefined; | 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<{ | acknowledgementDetails: Array<{ | ||||
@@ -127,6 +119,22 @@ export class RegisterBusinessComponent implements OnInit { | |||||
this.formState = 'REGISTER_FORM'; | 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() { | goBackToFormDetails() { | ||||
if (typeof this.childCheck !== 'undefined') { | if (typeof this.childCheck !== 'undefined') { | ||||
window.clearInterval(this.childCheck); | window.clearInterval(this.childCheck); | ||||
@@ -1,5 +1,5 @@ | |||||
<div class="input-holder"> | <div class="input-holder"> | ||||
<select> | |||||
<select (change)="updateValue($event)"> | |||||
<option *ngFor="let option of options" [value]="option" [selected]="value === option"> {{ option }} </option> | <option *ngFor="let option of options" [value]="option" [selected]="value === option"> {{ option }} </option> | ||||
</select> | </select> | ||||
@@ -23,7 +23,8 @@ export class SelectInputComponent implements OnInit { | |||||
ngOnInit(): void { | ngOnInit(): void { | ||||
} | } | ||||
updateValue(value: string) { | |||||
updateValue(event: any) { | |||||
const value: string = event.target.value; | |||||
this.value = value; | this.value = value; | ||||
this.onChange.emit(value); | this.onChange.emit(value); | ||||
} | } | ||||