diff --git a/WebDisplay/Dockerfile b/WebDisplay/Dockerfile new file mode 100644 index 0000000..9e13381 --- /dev/null +++ b/WebDisplay/Dockerfile @@ -0,0 +1,14 @@ +# build stage +FROM node:lts-alpine as build-stage +RUN corepack enable && corepack prepare pnpm@latest --activate +WORKDIR /app +COPY package*.json ./ +RUN pnpm install +COPY . . +RUN pnpm run build + +# production stage +FROM nginx:stable-alpine as production-stage +COPY --from=build-stage /app/dist /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/WebDisplay/components.d.ts b/WebDisplay/components.d.ts index 7f11273..dc572b9 100644 --- a/WebDisplay/components.d.ts +++ b/WebDisplay/components.d.ts @@ -12,7 +12,6 @@ declare module 'vue' { CurrentPower: typeof import('./src/components/CurrentPower.vue')['default'] CurrentWeather: typeof import('./src/components/CurrentWeather.vue')['default'] DashboardItem: typeof import('./src/components/DashboardItem.vue')['default'] - HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] Indoor: typeof import('./src/components/Indoor.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] diff --git a/WebDisplay/deploy/azure-pipelines.yml b/WebDisplay/deploy/azure-pipelines.yml new file mode 100644 index 0000000..a4a9022 --- /dev/null +++ b/WebDisplay/deploy/azure-pipelines.yml @@ -0,0 +1,68 @@ +name: $(Rev:r) + +pr: none + +trigger: + batch: 'true' + branches: + include: + - master + paths: + include: + - WebDisplay + +stages: +- stage: Build + jobs: + - job: Build + pool: + vmImage: 'ubuntu-latest' + steps: + - task: Docker@0 + displayName: 'Build an image' + inputs: + containerregistrytype: 'Container Registry' + dockerRegistryConnection: 'Docker Hub' + dockerFile: 'WebDisplay/Dockerfile' + imageName: 'ckaczor/home-monitor-web-display:$(Build.BuildNumber)' + includeLatestTag: true + - task: Docker@0 + displayName: 'Push an image' + inputs: + containerregistrytype: 'Container Registry' + dockerRegistryConnection: 'Docker Hub' + action: 'Push an image' + imageName: 'ckaczor/home-monitor-web-display:$(Build.BuildNumber)' + includeLatestTag: true + - task: Bash@3 + inputs: + targetType: 'inline' + script: 'sed -i s/#BUILD_BUILDNUMBER#/$BUILD_BUILDNUMBER/ WebDisplay/deploy/manifest.yaml' + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: 'WebDisplay/deploy/manifest.yaml' + ArtifactName: 'Manifest' + publishLocation: 'Container' + +- stage: Deploy + jobs: + - job: Deploy + pool: + vmImage: 'ubuntu-latest' + steps: + - task: DownloadBuildArtifacts@0 + inputs: + artifactName: 'Manifest' + buildType: 'current' + downloadType: 'single' + downloadPath: '$(System.ArtifactsDirectory)' + - task: Kubernetes@1 + inputs: + connectionType: 'Kubernetes Service Connection' + kubernetesServiceEndpoint: 'Kubernetes' + namespace: 'home-monitor' + command: 'apply' + useConfigurationFile: true + configuration: '$(System.ArtifactsDirectory)/Manifest/manifest.yaml' + secretType: 'dockerRegistry' + containerRegistryType: 'Container Registry' diff --git a/WebDisplay/deploy/manifest.yaml b/WebDisplay/deploy/manifest.yaml new file mode 100644 index 0000000..abcd807 --- /dev/null +++ b/WebDisplay/deploy/manifest.yaml @@ -0,0 +1,76 @@ +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: display + namespace: home-monitor + labels: + app: display +spec: + replicas: 1 + selector: + matchLabels: + app: display + template: + metadata: + labels: + app: display + spec: + containers: + - name: display + image: ckaczor/home-monitor-web-display:#BUILD_BUILDNUMBER# + terminationMessagePath: "/dev/termination-log" + terminationMessagePolicy: File + imagePullPolicy: Always + securityContext: + privileged: true + restartPolicy: Always + terminationGracePeriodSeconds: 30 + dnsPolicy: ClusterFirst + nodeSelector: + kubernetes.io/hostname: kubernetes + schedulerName: default-scheduler +--- +kind: Service +apiVersion: v1 +metadata: + name: display +spec: + ports: + - name: client + port: 80 + selector: + app: display + type: ClusterIP +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + annotations: + kubernetes.io/ingress.class: traefik + creationTimestamp: null + name: display + namespace: home-monitor +spec: + routes: + - kind: Rule + match: PathPrefix(`/`) + middlewares: + - name: display + namespace: home-monitor + services: + - kind: Service + name: display + namespace: home-monitor + port: 80 +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: Middleware +metadata: + creationTimestamp: null + name: display + namespace: home-monitor +spec: + stripPrefix: + prefixes: + - / diff --git a/WebDisplay/package.json b/WebDisplay/package.json index 687f5e2..2fe49cd 100644 --- a/WebDisplay/package.json +++ b/WebDisplay/package.json @@ -1,6 +1,6 @@ { - "name": "WebDisplay", - "version": "0.0.0", + "name": "web-display", + "version": "1.0.0", "scripts": { "dev": "cross-env NODE_OPTIONS='--no-warnings' vite", "build": "vue-tsc --noEmit && vite build", diff --git a/WebDisplay/src/components/CurrentWeather.vue b/WebDisplay/src/components/CurrentWeather.vue index 58d832f..920d4e9 100644 --- a/WebDisplay/src/components/CurrentWeather.vue +++ b/WebDisplay/src/components/CurrentWeather.vue @@ -45,7 +45,7 @@
+ className="weather-current-header ml-8"> Feels like
diff --git a/WebDisplay/src/components/DashboardItem.vue b/WebDisplay/src/components/DashboardItem.vue index d52505a..7de58f2 100644 --- a/WebDisplay/src/components/DashboardItem.vue +++ b/WebDisplay/src/components/DashboardItem.vue @@ -14,15 +14,9 @@ diff --git a/WebDisplay/src/components/ValueChart.vue b/WebDisplay/src/components/ValueChart.vue index 6cd8f9d..6ebb434 100644 --- a/WebDisplay/src/components/ValueChart.vue +++ b/WebDisplay/src/components/ValueChart.vue @@ -16,7 +16,9 @@ yAxisMaximum: { type: Number, required: false, default: undefined }, tickAmount: { type: Number, required: false, default: undefined }, lineSize: { type: Number, required: false, default: 2 }, - markerSize: { type: Number, required: false, default: 0 } + markerSize: { type: Number, required: false, default: 0 }, + yAxisLabelFormatter: { type: Function, required: false, default: undefined }, + yAxisValueFormatter: { type: Function, required: false, default: undefined } }); var chartOptions: ApexOptions = { @@ -48,6 +50,10 @@ }, y: { formatter: (value) => { + if (props.yAxisValueFormatter) { + return props.yAxisValueFormatter(value); + } + return `${value.toFixed(props.valueDecimalPoints)}${props.unit}`; } } @@ -69,6 +75,10 @@ yaxis: { labels: { formatter: (value) => { + if (props.yAxisLabelFormatter) { + return props.yAxisLabelFormatter(value); + } + return `${value.toFixed(props.yAxisDecimalPoints)}${props.unit}`; } }, @@ -94,7 +104,7 @@