From 775474c39e994c2884c57e817758ef89a32ca7f7 Mon Sep 17 00:00:00 2001 From: Michael Villarruel Date: Wed, 2 Feb 2022 15:51:07 -0500 Subject: [PATCH 01/17] fix: TT-529 sort by date not working correctly on reports (#805) --- .../time-entries-table/time-entries-table.component.ts | 3 ++- src/app/modules/time-clock/store/entry.effects.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/modules/reports/components/time-entries-table/time-entries-table.component.ts b/src/app/modules/reports/components/time-entries-table/time-entries-table.component.ts index 5658a972e..9e6dcb415 100644 --- a/src/app/modules/reports/components/time-entries-table/time-entries-table.component.ts +++ b/src/app/modules/reports/components/time-entries-table/time-entries-table.component.ts @@ -50,7 +50,8 @@ export class TimeEntriesTableComponent implements OnInit, OnDestroy, AfterViewIn text: 'CSV', filename: `time-entries-${formatDate(new Date(), 'MM_dd_yyyy-HH_mm', 'en')}` }, - ] + ], + columnDefs: [{ type: 'date', targets: 2 }] }; dtTrigger: Subject = new Subject(); @ViewChild(DataTableDirective, { static: false }) diff --git a/src/app/modules/time-clock/store/entry.effects.ts b/src/app/modules/time-clock/store/entry.effects.ts index 98527cc58..40c1cb1c9 100644 --- a/src/app/modules/time-clock/store/entry.effects.ts +++ b/src/app/modules/time-clock/store/entry.effects.ts @@ -143,7 +143,7 @@ export class EntryEffects { if (error.status === 404) { return of(new actions.CreateEntry(entry)); } else { - this.toastrService.error('We could not clock in you, try again later.'); + this.toastrService.error('We could not clock you in, try again later.'); return of(new actions.CreateEntryFail('Error')); } }) From 3c07126670c5bcc1bf30eb3e7747315f9fdbe671 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 2 Feb 2022 20:53:25 +0000 Subject: [PATCH 02/17] chore(release): 1.60.7 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7963a9727..1626535f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.60.6", + "version": "1.60.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1601ff24b..eb1fe59aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.60.6", + "version": "1.60.7", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From 0e06a98fedf8e7bf1c15106e905ade2f69c9cbfc Mon Sep 17 00:00:00 2001 From: Michael Villarruel Date: Wed, 9 Feb 2022 11:59:45 -0500 Subject: [PATCH 03/17] feat: TT-536 remove date out in time entries (#806) --- .../details-fields.component.html | 25 ++----------- .../details-fields.component.spec.ts | 35 ------------------- 2 files changed, 2 insertions(+), 58 deletions(-) diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.html b/src/app/modules/shared/components/details-fields/details-fields.component.html index 3b737aab9..2719a149f 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.html +++ b/src/app/modules/shared/components/details-fields/details-fields.component.html @@ -72,7 +72,7 @@
- +
- -
- - -
- +
{ expect(component.projectSelected.emit).toHaveBeenCalledWith(data); }); - it('on selected start_date should change end_date', () => { - const expectedStartDate = '2020-02-05'; - - component.onStartDateChange(expectedStartDate); - fixture.detectChanges(); - const endDateInput: HTMLInputElement = fixture.debugElement.nativeElement.querySelector('#end_date'); - - expect(endDateInput.value).toEqual(expectedStartDate); - }); - - it('on selected end_date should not change start_date', () => { - const expectedStartDate = '2020-02-05'; - const expectedEndDate = '2020-02-06'; - - component.ngOnInit(); - fixture.detectChanges(); - const startDateInput: HTMLInputElement = fixture.debugElement.nativeElement.querySelector('#start_date'); - const endDateInput: HTMLInputElement = fixture.debugElement.nativeElement.querySelector('#end_date'); - startDateInput.value = expectedStartDate; - endDateInput.value = expectedEndDate; - endDateInput.dispatchEvent(new Event('#end_date')); - - expect(endDateInput.value).not.toEqual(startDateInput.value); - expect(startDateInput.value).toEqual(expectedStartDate); - }); - it('on get current date should return expected date', () => { const expectedDate = moment(new Date()).format(DATE_FORMAT_YEAR); @@ -560,15 +534,6 @@ describe('DetailsFieldsComponent', () => { expect(startDateInput.max).toEqual(expectedDate); }); - it('on the input with id #end_date we could get the current Date ', () => { - fixture.detectChanges(); - const expectedDate = moment(new Date()).format(DATE_FORMAT_YEAR); - const endDateInput = fixture.debugElement.nativeElement.querySelector('[id=end_date]'); - - expect(endDateInput.id).toEqual('end_date'); - expect(endDateInput.max).toEqual(expectedDate); - }); - const diffParams = [ { case: 'positive should return correctly diff', From 015a785eb9e660b52e9cdfbb3ff0b37c87ff9a7f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 9 Feb 2022 20:41:11 +0000 Subject: [PATCH 04/17] chore(release): 1.61.0 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1626535f1..eac419d50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.60.7", + "version": "1.61.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index eb1fe59aa..d4b451b0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.60.7", + "version": "1.61.0", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From b0398735f986db9b89164b60b139ef1343dfd867 Mon Sep 17 00:00:00 2001 From: Michael Villarruel Date: Wed, 9 Feb 2022 17:43:58 -0500 Subject: [PATCH 05/17] feat: TT-536 change the disposition of total hours field (#808) --- .../details-fields.component.html | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.html b/src/app/modules/shared/components/details-fields/details-fields.component.html index 2719a149f..f89af7b41 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.html +++ b/src/app/modules/shared/components/details-fields/details-fields.component.html @@ -108,7 +108,13 @@
-
+ +
+ + {{ this.getTimeDifference() }} + +
+
-
- -
- - {{ this.getTimeDifference() }} - -
-
- Date: Wed, 9 Feb 2022 22:45:51 +0000 Subject: [PATCH 06/17] chore(release): 1.62.0 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index eac419d50..0d25d97bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.61.0", + "version": "1.62.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d4b451b0d..1c24931c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.61.0", + "version": "1.62.0", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From 7ce615c0b40013fe38c8bc09ce92c26175767fdb Mon Sep 17 00:00:00 2001 From: Michael Villarruel Date: Thu, 10 Feb 2022 11:04:10 -0500 Subject: [PATCH 07/17] TT-511 containerize time tracker UI (#798) * feat: TT-511 containerize time tracker ui * feat: TT-511 environment variables and tests setup * fix: TT-511 add missing environment variables * fix: TT-511 update .dockerignore * refactor: TT-511 solve comments * feat: TT-511 multi-stage builds in dockerfile and add user to run commands inside docker * feat: TT-511 create build and docker image for production * refactor: TT-511 solve comments * fix: TT-511 changes in makefile to solve comments --- .dockerignore | 8 ++++++ .gitignore | 3 ++ Dockerfile | 42 +++++++++++++++++++++++++++ Makefile | 71 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 31 ++++++++++++++++++++ nginx.conf | 12 ++++++++ package-lock.json | 5 ++++ package.json | 6 ++-- scripts/setenv.ts | 34 ++++++++++++++++++++++ 9 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 docker-compose.yml create mode 100644 nginx.conf create mode 100644 scripts/setenv.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..557f156b4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +.github +dist +coverage +Makefile +.gitignore +*keys.ts +*.keys.json diff --git a/.gitignore b/.gitignore index 93e5cb260..6cf093c1c 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ Thumbs.db # stryker temp files .stryker-tmp + +#ENV VARIABLES +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..57674ee4c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +FROM node:14 AS development + +ENV USERNAME timetracker +ENV HOME /home/${USERNAME} + +RUN useradd -ms /bin/bash ${USERNAME} + +WORKDIR ${HOME}/time-tracker-ui +COPY . . +RUN rm -f .env +RUN chown ${USERNAME}:${USERNAME} -R ${HOME}/time-tracker-ui + +USER ${USERNAME} +RUN npm cache clean --force && npm install +EXPOSE 4200 +EXPOSE 9876 +CMD npm run config && ${HOME}/time-tracker-ui/node_modules/.bin/ng serve --host 0.0.0.0 --disableHostCheck + + + +FROM development as build +COPY .env . +RUN npm run build + + + +FROM nginx:1.21 AS production + +ENV USERNAME app +RUN useradd -ms /bin/bash ${USERNAME} + +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /home/timetracker/time-tracker-ui/dist/time-tracker /usr/share/nginx/html + +RUN chown -R ${USERNAME}:${USERNAME} /var/cache/nginx && \ + chown -R ${USERNAME}:${USERNAME} /var/log/nginx && \ + chown -R ${USERNAME}:${USERNAME} /etc/nginx/conf.d +RUN touch /var/run/nginx.pid && chown -R ${USERNAME}:${USERNAME} /var/run/nginx.pid + +USER ${USERNAME} + +EXPOSE 4200 \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..d86ace915 --- /dev/null +++ b/Makefile @@ -0,0 +1,71 @@ +override SHELL := /bin/bash + +.PHONY: help +help: ## Show this help message. + @echo 'Usage:' + @echo ' make [target] ...' + @echo + @echo 'Targets:' + @grep --no-filename -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ + sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: build +build: ## Create docker image with dependencies needed for development. + docker-compose build + +.PHONY: cleanup +cleanup: ## Delete image timetracker_ui + docker rmi timetracker_ui + +.PHONY: run +run: ## Execute timetracker_ui docker containe. + docker-compose --env-file ./.env up -d + +.PHONY: logs +logs: ## Show logs of timetracker_ui. + docker logs -f timetracker_ui + +.PHONY: stop +stop: ## Stop container timetracker_ui. + docker-compose stop + +.PHONY: restart +restart: ## Restart container timetracker_ui. + docker-compose stop + docker-compose up -d + +.PHONY: remove +remove: ## Delete container timetracker_ui. + docker-compose down --volumes --remove-orphans --rmi local + +.PHONY: test +test: ## Run all tests on docker container timetracker_ui. + docker-compose --env-file ./.env up -d + docker exec -it timetracker_ui bash -c "npm run test" + +.PHONY: publish +publish: ## Publish the container image timetracker_ui. + docker tag timetracker_ui:latest $(registry_url)/timetracker_ui:latest + docker push $(registry_url)/timetracker_ui:latest + +.PHONY: build_prod +build_prod: ## Create docker image with dependencies needed for production. + docker build --target production -t timetracker_ui_prod -f Dockerfile . + +.PHONY: run_prod +run_prod: ## Execute timetracker_ui_prod docker container. + docker run -d -p 4200:4200 --name timetracker_ui_prod timetracker_ui_prod + +.PHONY: remove_prod +remove_prod: ## Delete container timetracker_ui_pro. + docker stop timetracker_ui_prod + docker rm timetracker_ui_prod + +.PHONY: publish_prod +publish_prod: ## Publish the container image timetracker_ui_prod. + docker tag timetracker_ui_prod:latest $(registry_url)/timetracker_ui_prod:latest + docker push $(registry_url)/timetracker_ui_prod:latest + +.PHONY: login +login: ## Login in respository of docker images. + az acr login --name $(container_registry) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..d7516c1a1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.9' +services: + time-tracker-ui: + container_name: timetracker_ui + image: timetracker_ui + build: + target: development + context: . + dockerfile: ./Dockerfile + ports: + - 4200:4200 + - 9876:9876 + environment: + AUTHORITY: ${AUTHORITY} + CLIENT_ID: ${CLIENT_ID} + SCOPES: ${SCOPES} + STACK_EXCHANGE_ID: ${STACK_EXCHANGE_ID} + STACK_EXCHANGE_ACCESS_TOKEN: ${STACK_EXCHANGE_ACCESS_TOKEN} + AZURE_APP_CONFIGURATION_CONNECTION_STRING: ${AZURE_APP_CONFIGURATION_CONNECTION_STRING} + AUTHORITY_JSON: ${AUTHORITY_JSON} + CLIENT_ID_JSON: ${CLIENT_ID_JSON} + SCOPES_JSON: ${SCOPES_JSON} + volumes: + - ./src:/home/timetracker/time-tracker-ui/src/ + - ./scripts:/home/timetracker/time-tracker-ui/scripts/ + - ./e2e:/home/timetracker/time-tracker-ui/e2e/ + - ./coverage:/home/timetracker/time-tracker-ui/coverage + - ./angular.json:/home/timetracker/time-tracker-ui/angular.json + - ./karma.conf.js:/home/timetracker/time-tracker-ui/karma.conf.js + - ./package.json:/home/timetracker/time-tracker-ui/package.json + - ./webpack.config.js:/home/timetracker/time-tracker-ui/webpack.config.js diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 000000000..824374fdc --- /dev/null +++ b/nginx.conf @@ -0,0 +1,12 @@ +server { + listen 4200; + + root /usr/share/nginx/html; + index index.html; + + server_name _; + + location / { + try_files $uri /index.html; + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0d25d97bb..9bdec2159 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7877,6 +7877,11 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.2.0.tgz", + "integrity": "sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw==" + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", diff --git a/package.json b/package.json index 1c24931c6..981249246 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,11 @@ "name": "time-tracker", "version": "1.62.0", "scripts": { + "config": "ts-node ./scripts/setenv.ts", "preinstall": "npx npm-force-resolutions", "ng": "ng", - "start": "ng serve", - "build": "ng build --prod", + "start": "npm run config && ng serve", + "build": "npm run config && ng build --prod", "test": "ng test", "test-headless": "ng test --browsers ChromeHeadless", "ci-test": "ng test --no-watch --no-progress --browsers ChromeHeadless", @@ -44,6 +45,7 @@ "datatables.net-responsive": "2.2.6", "datatables.net-responsive-dt": "2.2.6", "date-fns": "2.22.1", + "dotenv": "^14.2.0", "jquery": "3.5.1", "jszip": "3.7.0", "minimist": "1.2.5", diff --git a/scripts/setenv.ts b/scripts/setenv.ts new file mode 100644 index 000000000..0c07a1b30 --- /dev/null +++ b/scripts/setenv.ts @@ -0,0 +1,34 @@ +const { writeFile } = require('fs'); +require('dotenv').config(); + +const pathJs = `./src/environments/keys.ts` +const contentKeys = +`export const AUTHORITY = '${process.env.AUTHORITY}'; +export const CLIENT_ID = '${process.env.CLIENT_ID}'; +export const SCOPES = ['${process.env.SCOPES}']; +export const STACK_EXCHANGE_ID = '${process.env.STACK_EXCHANGE_ID}'; +export const STACK_EXCHANGE_ACCESS_TOKEN = '${process.env.STACK_EXCHANGE_ACCESS_TOKEN}'; +export const AZURE_APP_CONFIGURATION_CONNECTION_STRING = '${process.env.AZURE_APP_CONFIGURATION_CONNECTION_STRING}'; +`; + +writeFile(pathJs, contentKeys, function (err) { + if (err) { + console.log(err); + } + console.log(`Wrote variables to ${pathJs}`); +}); + +const pathJson = `./src/environments/.keys.json` +const contentKeysJson = +`{ + "authority": "${process.env.AUTHORITY_JSON}", + "client_id": "${process.env.CLIENT_ID_JSON}", + "scopes": ["${process.env.SCOPES_JSON}"] +}`; + +writeFile(pathJson, contentKeysJson, function (err) { + if (err) { + console.log(err); + } + console.log(`Wrote variables to ${pathJson}`); +}); From 5da889232da069761840b28605080192f2d8211c Mon Sep 17 00:00:00 2001 From: Michael Villarruel Date: Thu, 10 Feb 2022 11:16:13 -0500 Subject: [PATCH 08/17] Revert "TT-511 containerize time tracker UI (#798)" (#809) This reverts commit 7ce615c0b40013fe38c8bc09ce92c26175767fdb. --- .dockerignore | 8 ------ .gitignore | 3 -- Dockerfile | 42 --------------------------- Makefile | 71 ---------------------------------------------- docker-compose.yml | 31 -------------------- nginx.conf | 12 -------- package-lock.json | 5 ---- package.json | 6 ++-- scripts/setenv.ts | 34 ---------------------- 9 files changed, 2 insertions(+), 210 deletions(-) delete mode 100644 .dockerignore delete mode 100644 Dockerfile delete mode 100644 Makefile delete mode 100644 docker-compose.yml delete mode 100644 nginx.conf delete mode 100644 scripts/setenv.ts diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 557f156b4..000000000 --- a/.dockerignore +++ /dev/null @@ -1,8 +0,0 @@ -node_modules -.github -dist -coverage -Makefile -.gitignore -*keys.ts -*.keys.json diff --git a/.gitignore b/.gitignore index 6cf093c1c..93e5cb260 100644 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,3 @@ Thumbs.db # stryker temp files .stryker-tmp - -#ENV VARIABLES -.env diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 57674ee4c..000000000 --- a/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -FROM node:14 AS development - -ENV USERNAME timetracker -ENV HOME /home/${USERNAME} - -RUN useradd -ms /bin/bash ${USERNAME} - -WORKDIR ${HOME}/time-tracker-ui -COPY . . -RUN rm -f .env -RUN chown ${USERNAME}:${USERNAME} -R ${HOME}/time-tracker-ui - -USER ${USERNAME} -RUN npm cache clean --force && npm install -EXPOSE 4200 -EXPOSE 9876 -CMD npm run config && ${HOME}/time-tracker-ui/node_modules/.bin/ng serve --host 0.0.0.0 --disableHostCheck - - - -FROM development as build -COPY .env . -RUN npm run build - - - -FROM nginx:1.21 AS production - -ENV USERNAME app -RUN useradd -ms /bin/bash ${USERNAME} - -COPY nginx.conf /etc/nginx/conf.d/default.conf -COPY --from=build /home/timetracker/time-tracker-ui/dist/time-tracker /usr/share/nginx/html - -RUN chown -R ${USERNAME}:${USERNAME} /var/cache/nginx && \ - chown -R ${USERNAME}:${USERNAME} /var/log/nginx && \ - chown -R ${USERNAME}:${USERNAME} /etc/nginx/conf.d -RUN touch /var/run/nginx.pid && chown -R ${USERNAME}:${USERNAME} /var/run/nginx.pid - -USER ${USERNAME} - -EXPOSE 4200 \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index d86ace915..000000000 --- a/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -override SHELL := /bin/bash - -.PHONY: help -help: ## Show this help message. - @echo 'Usage:' - @echo ' make [target] ...' - @echo - @echo 'Targets:' - @grep --no-filename -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ - sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' - -.PHONY: build -build: ## Create docker image with dependencies needed for development. - docker-compose build - -.PHONY: cleanup -cleanup: ## Delete image timetracker_ui - docker rmi timetracker_ui - -.PHONY: run -run: ## Execute timetracker_ui docker containe. - docker-compose --env-file ./.env up -d - -.PHONY: logs -logs: ## Show logs of timetracker_ui. - docker logs -f timetracker_ui - -.PHONY: stop -stop: ## Stop container timetracker_ui. - docker-compose stop - -.PHONY: restart -restart: ## Restart container timetracker_ui. - docker-compose stop - docker-compose up -d - -.PHONY: remove -remove: ## Delete container timetracker_ui. - docker-compose down --volumes --remove-orphans --rmi local - -.PHONY: test -test: ## Run all tests on docker container timetracker_ui. - docker-compose --env-file ./.env up -d - docker exec -it timetracker_ui bash -c "npm run test" - -.PHONY: publish -publish: ## Publish the container image timetracker_ui. - docker tag timetracker_ui:latest $(registry_url)/timetracker_ui:latest - docker push $(registry_url)/timetracker_ui:latest - -.PHONY: build_prod -build_prod: ## Create docker image with dependencies needed for production. - docker build --target production -t timetracker_ui_prod -f Dockerfile . - -.PHONY: run_prod -run_prod: ## Execute timetracker_ui_prod docker container. - docker run -d -p 4200:4200 --name timetracker_ui_prod timetracker_ui_prod - -.PHONY: remove_prod -remove_prod: ## Delete container timetracker_ui_pro. - docker stop timetracker_ui_prod - docker rm timetracker_ui_prod - -.PHONY: publish_prod -publish_prod: ## Publish the container image timetracker_ui_prod. - docker tag timetracker_ui_prod:latest $(registry_url)/timetracker_ui_prod:latest - docker push $(registry_url)/timetracker_ui_prod:latest - -.PHONY: login -login: ## Login in respository of docker images. - az acr login --name $(container_registry) diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index d7516c1a1..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: '3.9' -services: - time-tracker-ui: - container_name: timetracker_ui - image: timetracker_ui - build: - target: development - context: . - dockerfile: ./Dockerfile - ports: - - 4200:4200 - - 9876:9876 - environment: - AUTHORITY: ${AUTHORITY} - CLIENT_ID: ${CLIENT_ID} - SCOPES: ${SCOPES} - STACK_EXCHANGE_ID: ${STACK_EXCHANGE_ID} - STACK_EXCHANGE_ACCESS_TOKEN: ${STACK_EXCHANGE_ACCESS_TOKEN} - AZURE_APP_CONFIGURATION_CONNECTION_STRING: ${AZURE_APP_CONFIGURATION_CONNECTION_STRING} - AUTHORITY_JSON: ${AUTHORITY_JSON} - CLIENT_ID_JSON: ${CLIENT_ID_JSON} - SCOPES_JSON: ${SCOPES_JSON} - volumes: - - ./src:/home/timetracker/time-tracker-ui/src/ - - ./scripts:/home/timetracker/time-tracker-ui/scripts/ - - ./e2e:/home/timetracker/time-tracker-ui/e2e/ - - ./coverage:/home/timetracker/time-tracker-ui/coverage - - ./angular.json:/home/timetracker/time-tracker-ui/angular.json - - ./karma.conf.js:/home/timetracker/time-tracker-ui/karma.conf.js - - ./package.json:/home/timetracker/time-tracker-ui/package.json - - ./webpack.config.js:/home/timetracker/time-tracker-ui/webpack.config.js diff --git a/nginx.conf b/nginx.conf deleted file mode 100644 index 824374fdc..000000000 --- a/nginx.conf +++ /dev/null @@ -1,12 +0,0 @@ -server { - listen 4200; - - root /usr/share/nginx/html; - index index.html; - - server_name _; - - location / { - try_files $uri /index.html; - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9bdec2159..0d25d97bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7877,11 +7877,6 @@ "is-obj": "^2.0.0" } }, - "dotenv": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.2.0.tgz", - "integrity": "sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw==" - }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", diff --git a/package.json b/package.json index 981249246..1c24931c6 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,10 @@ "name": "time-tracker", "version": "1.62.0", "scripts": { - "config": "ts-node ./scripts/setenv.ts", "preinstall": "npx npm-force-resolutions", "ng": "ng", - "start": "npm run config && ng serve", - "build": "npm run config && ng build --prod", + "start": "ng serve", + "build": "ng build --prod", "test": "ng test", "test-headless": "ng test --browsers ChromeHeadless", "ci-test": "ng test --no-watch --no-progress --browsers ChromeHeadless", @@ -45,7 +44,6 @@ "datatables.net-responsive": "2.2.6", "datatables.net-responsive-dt": "2.2.6", "date-fns": "2.22.1", - "dotenv": "^14.2.0", "jquery": "3.5.1", "jszip": "3.7.0", "minimist": "1.2.5", diff --git a/scripts/setenv.ts b/scripts/setenv.ts deleted file mode 100644 index 0c07a1b30..000000000 --- a/scripts/setenv.ts +++ /dev/null @@ -1,34 +0,0 @@ -const { writeFile } = require('fs'); -require('dotenv').config(); - -const pathJs = `./src/environments/keys.ts` -const contentKeys = -`export const AUTHORITY = '${process.env.AUTHORITY}'; -export const CLIENT_ID = '${process.env.CLIENT_ID}'; -export const SCOPES = ['${process.env.SCOPES}']; -export const STACK_EXCHANGE_ID = '${process.env.STACK_EXCHANGE_ID}'; -export const STACK_EXCHANGE_ACCESS_TOKEN = '${process.env.STACK_EXCHANGE_ACCESS_TOKEN}'; -export const AZURE_APP_CONFIGURATION_CONNECTION_STRING = '${process.env.AZURE_APP_CONFIGURATION_CONNECTION_STRING}'; -`; - -writeFile(pathJs, contentKeys, function (err) { - if (err) { - console.log(err); - } - console.log(`Wrote variables to ${pathJs}`); -}); - -const pathJson = `./src/environments/.keys.json` -const contentKeysJson = -`{ - "authority": "${process.env.AUTHORITY_JSON}", - "client_id": "${process.env.CLIENT_ID_JSON}", - "scopes": ["${process.env.SCOPES_JSON}"] -}`; - -writeFile(pathJson, contentKeysJson, function (err) { - if (err) { - console.log(err); - } - console.log(`Wrote variables to ${pathJson}`); -}); From 0d95fb95d1591f3abee01d0c26f143fb1b87d9cf Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 10 Feb 2022 16:18:08 +0000 Subject: [PATCH 09/17] chore(release): 1.62.1 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0d25d97bb..541b34f8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.62.0", + "version": "1.62.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1c24931c6..0277a0826 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.62.0", + "version": "1.62.1", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From 2dafbcdffabb091381f13f043987947312164aed Mon Sep 17 00:00:00 2001 From: Michael Villarruel Date: Fri, 11 Feb 2022 11:44:31 -0500 Subject: [PATCH 10/17] TT 511 containerize time tracker UI (#810) * feat: TT-511 containerize time tracker ui * feat: TT-511 environment variables and tests setup * fix: TT-511 add missing environment variables * fix: TT-511 update .dockerignore * refactor: TT-511 solve comments * feat: TT-511 multi-stage builds in dockerfile and add user to run commands inside docker * feat: TT-511 create build and docker image for production * refactor: TT-511 solve comments * fix: TT-511 changes in makefile to solve comments * fix: TT-511 fix error when build to production --- .dockerignore | 8 ++++++ .gitignore | 3 ++ Dockerfile | 42 +++++++++++++++++++++++++++ Makefile | 71 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 31 ++++++++++++++++++++ nginx.conf | 12 ++++++++ package-lock.json | 5 ++++ package.json | 2 ++ scripts/setenv.ts | 34 ++++++++++++++++++++++ 9 files changed, 208 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 docker-compose.yml create mode 100644 nginx.conf create mode 100644 scripts/setenv.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..557f156b4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +.github +dist +coverage +Makefile +.gitignore +*keys.ts +*.keys.json diff --git a/.gitignore b/.gitignore index 93e5cb260..6cf093c1c 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ Thumbs.db # stryker temp files .stryker-tmp + +#ENV VARIABLES +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..24f6ebb5b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +FROM node:14 AS development + +ENV USERNAME timetracker +ENV HOME /home/${USERNAME} + +RUN useradd -ms /bin/bash ${USERNAME} + +WORKDIR ${HOME}/time-tracker-ui +COPY . . +RUN rm -f .env +RUN chown ${USERNAME}:${USERNAME} -R ${HOME}/time-tracker-ui + +USER ${USERNAME} +RUN npm cache clean --force && npm install +EXPOSE 4200 +EXPOSE 9876 +CMD npm run config && ${HOME}/time-tracker-ui/node_modules/.bin/ng serve --host 0.0.0.0 --disableHostCheck + + + +FROM development as build +COPY .env . +RUN npm run config && npm run build + + + +FROM nginx:1.21 AS production + +ENV USERNAME app +RUN useradd -ms /bin/bash ${USERNAME} + +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /home/timetracker/time-tracker-ui/dist/time-tracker /usr/share/nginx/html + +RUN chown -R ${USERNAME}:${USERNAME} /var/cache/nginx && \ + chown -R ${USERNAME}:${USERNAME} /var/log/nginx && \ + chown -R ${USERNAME}:${USERNAME} /etc/nginx/conf.d +RUN touch /var/run/nginx.pid && chown -R ${USERNAME}:${USERNAME} /var/run/nginx.pid + +USER ${USERNAME} + +EXPOSE 4200 \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..d86ace915 --- /dev/null +++ b/Makefile @@ -0,0 +1,71 @@ +override SHELL := /bin/bash + +.PHONY: help +help: ## Show this help message. + @echo 'Usage:' + @echo ' make [target] ...' + @echo + @echo 'Targets:' + @grep --no-filename -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ + sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: build +build: ## Create docker image with dependencies needed for development. + docker-compose build + +.PHONY: cleanup +cleanup: ## Delete image timetracker_ui + docker rmi timetracker_ui + +.PHONY: run +run: ## Execute timetracker_ui docker containe. + docker-compose --env-file ./.env up -d + +.PHONY: logs +logs: ## Show logs of timetracker_ui. + docker logs -f timetracker_ui + +.PHONY: stop +stop: ## Stop container timetracker_ui. + docker-compose stop + +.PHONY: restart +restart: ## Restart container timetracker_ui. + docker-compose stop + docker-compose up -d + +.PHONY: remove +remove: ## Delete container timetracker_ui. + docker-compose down --volumes --remove-orphans --rmi local + +.PHONY: test +test: ## Run all tests on docker container timetracker_ui. + docker-compose --env-file ./.env up -d + docker exec -it timetracker_ui bash -c "npm run test" + +.PHONY: publish +publish: ## Publish the container image timetracker_ui. + docker tag timetracker_ui:latest $(registry_url)/timetracker_ui:latest + docker push $(registry_url)/timetracker_ui:latest + +.PHONY: build_prod +build_prod: ## Create docker image with dependencies needed for production. + docker build --target production -t timetracker_ui_prod -f Dockerfile . + +.PHONY: run_prod +run_prod: ## Execute timetracker_ui_prod docker container. + docker run -d -p 4200:4200 --name timetracker_ui_prod timetracker_ui_prod + +.PHONY: remove_prod +remove_prod: ## Delete container timetracker_ui_pro. + docker stop timetracker_ui_prod + docker rm timetracker_ui_prod + +.PHONY: publish_prod +publish_prod: ## Publish the container image timetracker_ui_prod. + docker tag timetracker_ui_prod:latest $(registry_url)/timetracker_ui_prod:latest + docker push $(registry_url)/timetracker_ui_prod:latest + +.PHONY: login +login: ## Login in respository of docker images. + az acr login --name $(container_registry) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..d7516c1a1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.9' +services: + time-tracker-ui: + container_name: timetracker_ui + image: timetracker_ui + build: + target: development + context: . + dockerfile: ./Dockerfile + ports: + - 4200:4200 + - 9876:9876 + environment: + AUTHORITY: ${AUTHORITY} + CLIENT_ID: ${CLIENT_ID} + SCOPES: ${SCOPES} + STACK_EXCHANGE_ID: ${STACK_EXCHANGE_ID} + STACK_EXCHANGE_ACCESS_TOKEN: ${STACK_EXCHANGE_ACCESS_TOKEN} + AZURE_APP_CONFIGURATION_CONNECTION_STRING: ${AZURE_APP_CONFIGURATION_CONNECTION_STRING} + AUTHORITY_JSON: ${AUTHORITY_JSON} + CLIENT_ID_JSON: ${CLIENT_ID_JSON} + SCOPES_JSON: ${SCOPES_JSON} + volumes: + - ./src:/home/timetracker/time-tracker-ui/src/ + - ./scripts:/home/timetracker/time-tracker-ui/scripts/ + - ./e2e:/home/timetracker/time-tracker-ui/e2e/ + - ./coverage:/home/timetracker/time-tracker-ui/coverage + - ./angular.json:/home/timetracker/time-tracker-ui/angular.json + - ./karma.conf.js:/home/timetracker/time-tracker-ui/karma.conf.js + - ./package.json:/home/timetracker/time-tracker-ui/package.json + - ./webpack.config.js:/home/timetracker/time-tracker-ui/webpack.config.js diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 000000000..824374fdc --- /dev/null +++ b/nginx.conf @@ -0,0 +1,12 @@ +server { + listen 4200; + + root /usr/share/nginx/html; + index index.html; + + server_name _; + + location / { + try_files $uri /index.html; + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 541b34f8e..ac2ef7a98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7877,6 +7877,11 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.2.0.tgz", + "integrity": "sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw==" + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", diff --git a/package.json b/package.json index 0277a0826..fc71525be 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "time-tracker", "version": "1.62.1", "scripts": { + "config": "ts-node ./scripts/setenv.ts", "preinstall": "npx npm-force-resolutions", "ng": "ng", "start": "ng serve", @@ -44,6 +45,7 @@ "datatables.net-responsive": "2.2.6", "datatables.net-responsive-dt": "2.2.6", "date-fns": "2.22.1", + "dotenv": "^14.2.0", "jquery": "3.5.1", "jszip": "3.7.0", "minimist": "1.2.5", diff --git a/scripts/setenv.ts b/scripts/setenv.ts new file mode 100644 index 000000000..0c07a1b30 --- /dev/null +++ b/scripts/setenv.ts @@ -0,0 +1,34 @@ +const { writeFile } = require('fs'); +require('dotenv').config(); + +const pathJs = `./src/environments/keys.ts` +const contentKeys = +`export const AUTHORITY = '${process.env.AUTHORITY}'; +export const CLIENT_ID = '${process.env.CLIENT_ID}'; +export const SCOPES = ['${process.env.SCOPES}']; +export const STACK_EXCHANGE_ID = '${process.env.STACK_EXCHANGE_ID}'; +export const STACK_EXCHANGE_ACCESS_TOKEN = '${process.env.STACK_EXCHANGE_ACCESS_TOKEN}'; +export const AZURE_APP_CONFIGURATION_CONNECTION_STRING = '${process.env.AZURE_APP_CONFIGURATION_CONNECTION_STRING}'; +`; + +writeFile(pathJs, contentKeys, function (err) { + if (err) { + console.log(err); + } + console.log(`Wrote variables to ${pathJs}`); +}); + +const pathJson = `./src/environments/.keys.json` +const contentKeysJson = +`{ + "authority": "${process.env.AUTHORITY_JSON}", + "client_id": "${process.env.CLIENT_ID_JSON}", + "scopes": ["${process.env.SCOPES_JSON}"] +}`; + +writeFile(pathJson, contentKeysJson, function (err) { + if (err) { + console.log(err); + } + console.log(`Wrote variables to ${pathJson}`); +}); From 13546fe76d4d0235b5c33a0ac89924e55a5e1c41 Mon Sep 17 00:00:00 2001 From: Michael Villarruel Date: Thu, 17 Feb 2022 10:45:48 -0500 Subject: [PATCH 11/17] feat: TT-511 add stop_prod method in makefile (#813) --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d86ace915..a436cf461 100644 --- a/Makefile +++ b/Makefile @@ -56,8 +56,12 @@ build_prod: ## Create docker image with dependencies needed for production. run_prod: ## Execute timetracker_ui_prod docker container. docker run -d -p 4200:4200 --name timetracker_ui_prod timetracker_ui_prod +.PHONY: stop_prod +stop_prod: ## Stop container timetracker_ui_prod. + docker stop timetracker_ui_prod + .PHONY: remove_prod -remove_prod: ## Delete container timetracker_ui_pro. +remove_prod: ## Delete container timetracker_ui_prod. docker stop timetracker_ui_prod docker rm timetracker_ui_prod From e8c8ff98f6166401d51b94503eb85dcf286da1c8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 17 Feb 2022 15:48:00 +0000 Subject: [PATCH 12/17] chore(release): 1.63.0 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac2ef7a98..e67491924 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.62.1", + "version": "1.63.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fc71525be..ee18a666e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.62.1", + "version": "1.63.0", "scripts": { "config": "ts-node ./scripts/setenv.ts", "preinstall": "npx npm-force-resolutions", From 00c620c9c2813273122b968e8d3c96aabecc00f5 Mon Sep 17 00:00:00 2001 From: Bryan Aguilar <47910273+bryanAguilar001@users.noreply.github.com> Date: Fri, 25 Feb 2022 18:03:33 -0500 Subject: [PATCH 13/17] feat: TT-560 implemented new icon to favicon and sidebar (#815) --- .../components/sidebar/sidebar.component.html | 2 +- src/assets/img/time-tracker-off.png | Bin 0 -> 15923 bytes src/favicon.ico | Bin 1150 -> 260894 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/assets/img/time-tracker-off.png diff --git a/src/app/modules/shared/components/sidebar/sidebar.component.html b/src/app/modules/shared/components/sidebar/sidebar.component.html index 164bfc1ec..46804478c 100644 --- a/src/app/modules/shared/components/sidebar/sidebar.component.html +++ b/src/app/modules/shared/components/sidebar/sidebar.component.html @@ -2,7 +2,7 @@