diff --git a/src/components/SavingGoal/SavingGoalRoadmap.vue b/src/components/SavingGoal/SavingGoalRoadmap.vue index 65bbfb8876c1ed6f2b076ee56cbed0621f3a187f..4b4c2344c490ac2ae76a698fc610d55709be5ba9 100644 --- a/src/components/SavingGoal/SavingGoalRoadmap.vue +++ b/src/components/SavingGoal/SavingGoalRoadmap.vue @@ -1,8 +1,9 @@ <script lang="ts"> import {CategoryScale, Chart as ChartJS, Legend, LinearScale, LineElement, PointElement, Title, Tooltip} from 'chart.js' import {Line} from 'vue-chartjs' -import type {ChallengeDTO, GoalDTO, MarkChallengeDTO} from "@/api"; +import type {ChallengeDTO, CreateGoalDTO, GoalDTO, MarkChallengeDTO} from "@/api"; import {GoalService} from '@/api' +import {useUserInfoStore} from "@/stores/UserStore"; ChartJS.register( CategoryScale, @@ -23,6 +24,8 @@ export default { return { image: 'https://th.bing.com/th/id/OIG3.NMbdxmKYKVnxYGLOa0Z0?w=1024&h=1024&rs=1&pid=ImgDetMain' as string, altImage: 'https://th.bing.com/th/id/OIG4.gVWUC.rwCb8faTNx31yU?w=1024&h=1024&rs=1&pid=ImgDetMain' as string, + failedImage: 'https://cdn-icons-png.flaticon.com/512/6659/6659895.png' as string, + successImage: 'https://static-00.iconduck.com/assets.00/checkmark-running-icon-1024x1024-aakqv1qi.png' as string, title: 'Spain trip' as string, bluePanelMaxHeight: 'auto' as string, roadmapSelected: true as boolean, @@ -50,12 +53,14 @@ export default { newPrice: 0, savedSoFar: 0 as number, currentChallengeIndex: 0, + feedback: "" as string, }; }, async mounted() { setTimeout(() => { this.findCurrentChallenge() this.disableAllChecksThatNotCurrent() + this.checkIfToAmbitious() this.togglePanel(this.selectedGoal.challenges[this.currentChallengeIndex]) this.calculateSavedSoFar() this.onLoadDisableChecks(this.selectedGoal) @@ -65,8 +70,18 @@ export default { }, computed: { computeImageFilter() { - return (challenge: ChallengeDTO) => { - return challenge ? 'none' : 'grayscale(100%)'; + return (challenge: any) => { + const today = new Date() + const startDate = new Date(challenge.startDate) + + // Check if the challenge is in the past or future + if (today < startDate) { + // Challenge is in the future, apply grayscale + return 'grayscale(100%)' + } else { + // Challenge is currently active, no grayscale + return 'none'; + } }; } }, @@ -115,7 +130,7 @@ export default { convertTemplateTextToChallengeText(challenge: ChallengeDTO) { let challengeText: any challengeText = challenge.challengeTemplate?.text - challengeText = challengeText.replace('{unit_amount}', challenge.challengeTemplate?.amount?.toString()) + challengeText = challengeText.replace('{unit_amount}', challenge.amount?.toString()) challengeText = challengeText.replace('{checkDays}', challenge.checkDays?.toString()) challengeText = challengeText.replace('{totalDays}', challenge.totalDays?.toString()) let totalAmount: any @@ -132,7 +147,7 @@ export default { calculateTotalAmountFromChallenges() { let totalAmountFromChallenges = 0 for (const challenge of this.selectedGoal.challenges) { - totalAmountFromChallenges += challenge.amount + totalAmountFromChallenges += challenge.amount * challenge.checkDays } return totalAmountFromChallenges }, @@ -231,6 +246,12 @@ export default { if (today >= startDate && today <= endDate) { this.currentChallengeIndex = index + } else { + if (today >= endDate) { + console.log("In the past") + } else { + console.log("In the future") + } } }) }, @@ -251,15 +272,10 @@ export default { }, calculateSavedSoFarPerChallengeInPercent(challenge: ChallengeDTO) { - let savedSoFarOnChallenge = 0 + let savedSoFarOnChallenge = this.calculateSavedSoFarPerChallenge(challenge) let targetAmount = 1 - challenge.progressList?.forEach(progress => { - if(progress.amount) { - savedSoFarOnChallenge += progress.amount - } - }) - if(challenge.amount) { - targetAmount = challenge.amount + if(challenge.amount && challenge.checkDays) { + targetAmount = challenge.amount * challenge.checkDays } return (savedSoFarOnChallenge / targetAmount) * 100 @@ -273,7 +289,54 @@ export default { } }) return savedSoFar - } + }, + + async updateUnitPrice (challenge: ChallengeDTO) { + const createGoalPayload: MarkChallengeDTO = { + id: challenge.id, + amount: this.newPrice + }; + try { + await GoalService.updateChallengeAmount({requestBody: createGoalPayload}) + } catch (e) { + console.log(e.message) + } + }, + + checkIfToAmbitious() { + let possibleSaving = this.calculateTotalAmountFromChallenges() + let wantedSaving = this.selectedGoal.targetAmount + + console.log(possibleSaving + "," + wantedSaving) + if(wantedSaving > possibleSaving) { + this.feedback = "Vi beundrer din ambisjon, men å oppnå den ettertraktede" + + " summen er ikke lett. Men disse utfordringene tar deg på god vei!" + } + }, + + getImageSource(challenge: ChallengeDTO) { + const today = new Date(); + const endDate = new Date(challenge.endDate as any); + + // Check if the challenge is in the past + if (today > endDate) { + // Challenge is in the past, return alternative image source + if(challenge.progressList) { + if(challenge.checkDays == challenge.progressList.length) { + return this.successImage + } else { + return this.failedImage; + } + } + } else { + // Challenge is currently active or in the future, return default image source + return this.image; + } + }, + + transferMoney(amount: number) { + //need users bank accounts + }, }, }; </script> @@ -298,17 +361,19 @@ export default { <ul class="timeline"> <li v-for="(challenge, index) in selectedGoal.challenges" :key="index" :class="{ 'timeline-inverted': index % 2 !== 0 }"> <div class="timeline-image z-1" @click="togglePanel(challenge)"> - <img class="circular-image" :src="challenge.showPanel ? altImage : image" :style="{ filter: computeImageFilter(challenge) }" alt=""> + <img class="circular-image" :src="challenge.showPanel ? altImage : getImageSource(challenge)" :style="{ filter: computeImageFilter(challenge) }" alt=""> </div> <div class="timeline-panel z-3" :id="'panel-' + index" v-show="challenge.showPanel"> <div class="timeline-heading"> + <h5 style="margin-top: 12px">{{challenge.points}}<img src="../../assets/items/pigcoin.png" alt="pig coint" style="width: 2rem"></h5> <h4>Utfordring {{ index +1 }}</h4> + <p style="font-size: 12px">{{formatDate(challenge.startDate)}} til {{formatDate(challenge.endDate)}}</p> <h4 class="subheading">{{convertTemplateTextToChallengeText(challenge)}}</h4> </div> <div class="timeline-body"> <br> <p> - Pris per enhet: {{challenge.challengeTemplate.amount}} kr <img src="../../assets/icons/edit-button.svg" alt="editIcon" data-bs-toggle="collapse" href="#collapseExample" role="button" aria-expanded="false" aria-controls="exampleModal"> + Pris per enhet: {{challenge.amount}} kr <img src="../../assets/icons/edit-button.svg" alt="editIcon" data-bs-toggle="collapse" href="#collapseExample" role="button" aria-expanded="false" aria-controls="exampleModal"> </p> <br> <div class="collapse" id="collapseExample" style="background-color: white; padding: 12px; border-radius: 5px"> @@ -319,11 +384,12 @@ export default { </div> </div> <br> - <button class="btn btn-success">Bekreft endring</button> + <button @click="updateUnitPrice(challenge)" class="btn btn-success">Bekreft endring</button> </div> <br> + <p>Spart: {{ calculateSavedSoFarPerChallenge(challenge)}} Kr</p> <div class="progress"> - <div class="progress-bar" role="progressbar" :style="{ width: calculateSavedSoFarPerChallengeInPercent(challenge) + '%' }" :aria-valuenow="calculateSavedSoFarPerChallengeInPercent(challenge)" aria-valuemin="0" aria-valuemax="100">{{ calculateSavedSoFarPerChallenge(challenge)}} Kr</div> + <div class="progress-bar" role="progressbar" :style="{ width: calculateSavedSoFarPerChallengeInPercent(challenge) + '%' }" :aria-valuenow="calculateSavedSoFarPerChallengeInPercent(challenge)" aria-valuemin="0" aria-valuemax="100"></div> </div> <br> <div class="checkbox-row"> @@ -341,6 +407,10 @@ export default { <div v-else> <div class="row"> + <div v-if="feedback != ''" class="feedbackBox"> + <h3>Oops!</h3> + <h5 class="">{{ feedback }}</h5> + </div> <div class="col-sm-3"> <div class="card-box tilebox-one"><i class="icon-layers float-right text-muted"></i> <h6 class="text-muted text-uppercase mt-0">Du ønsker å spare</h6> @@ -384,7 +454,7 @@ export default { margin-bottom:40px; padding-bottom: 10px; color: white; - border-radius: 1em; + border-radius: 20px; background-color: #003A58; } @@ -393,6 +463,7 @@ export default { padding:4px 0 0 0; margin-top:22px; list-style: none; + margin-bottom: 300px; } .timeline>li:nth-child(even) { @@ -428,7 +499,8 @@ export default { text-align: right; background-color: #003A58; border-radius: 1em; - margin-left: 110px; + margin-left: 100px; + color: white; } .timeline>li .timeline-panel:before { @@ -451,7 +523,6 @@ export default { left: 50%; border: 7px solid #003A58; border-radius: 100%; - background-color: #00ffff; box-shadow: 0 0 5px #00e1ff; width: 100px; height: 100px; @@ -469,7 +540,7 @@ export default { float: right; padding: 0 30px 20px 20px; text-align: left; - margin-right: 110px; + margin-right: 100px; } .timeline>li.timeline-inverted>.timeline-panel:before { @@ -491,7 +562,7 @@ export default { } .timeline .timeline-heading h4 { - margin-top:22px; + margin-top:0px; margin-bottom: 4px; padding:0; color: white; @@ -704,4 +775,11 @@ export default { margin-right: 10px; /* Adjust as needed */ } +.feedbackBox { + box-shadow: rgba(255, 0, 0, 0.2) 0px 7px 29px 0px; + border-radius: 1em; + margin-bottom: 40px; + margin-top: 10px; + padding: 12px; +} </style> \ No newline at end of file