Skip to content

Commit

Permalink
feat(survey): cereal psm and unify some psm parts
Browse files Browse the repository at this point in the history
  • Loading branch information
lukashroch committed Oct 8, 2022
1 parent 4bbe843 commit 39a0db6
Show file tree
Hide file tree
Showing 32 changed files with 714 additions and 753 deletions.
5 changes: 5 additions & 0 deletions apps/survey/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ declare module '@vue/runtime-core' {
PromptsCustomYesNoPrompt: typeof import('./src/components/prompts/custom/yes-no-prompt.vue')['default']
PromptsDynamicHandlersCustomPromptHandler: typeof import('./src/components/prompts/dynamic/handlers/CustomPromptHandler.vue')['default']
PromptsDynamicHandlersPortionSizeAsServedPromptHandler: typeof import('./src/components/prompts/dynamic/handlers/portion-size/AsServedPromptHandler.vue')['default']
PromptsDynamicHandlersPortionSizeCerealPromptHandler: typeof import('./src/components/prompts/dynamic/handlers/portion-size/CerealPromptHandler.vue')['default']
PromptsDynamicHandlersPortionSizeDrinkScalePromptHandler: typeof import('./src/components/prompts/dynamic/handlers/portion-size/DrinkScalePromptHandler.vue')['default']
PromptsDynamicHandlersPortionSizeGuideImagePromptHandler: typeof import('./src/components/prompts/dynamic/handlers/portion-size/GuideImagePromptHandler.vue')['default']
PromptsDynamicHandlersPortionSizeMilkInAHotDrinkPromptHandler: typeof import('./src/components/prompts/dynamic/handlers/portion-size/MilkInAHotDrinkPromptHandler.vue')['default']
Expand All @@ -55,10 +56,14 @@ declare module '@vue/runtime-core' {
PromptsPortionGuideImagePrompt: typeof import('./src/components/prompts/portion/GuideImagePrompt.vue')['default']
PromptsPortionMilkCerealPrompt: typeof import('./src/components/prompts/portion/MilkCerealPrompt.vue')['default']
PromptsPortionMilkInAHotDrinkPrompt: typeof import('./src/components/prompts/portion/MilkInAHotDrinkPrompt.vue')['default']
PromptsPortionMilkOnCerealPrompt: typeof import('./src/components/prompts/portion/MilkOnCerealPrompt.vue')['default']
PromptsPortionPizzaPrompt: typeof import('./src/components/prompts/portion/PizzaPrompt.vue')['default']
PromptsPortionPortionSizeOptionPrompt: typeof import('./src/components/prompts/portion/PortionSizeOptionPrompt.vue')['default']
PromptsPortionSelectorsAsServedSelector: typeof import('./src/components/prompts/portion/selectors/AsServedSelector.vue')['default']
PromptsPortionSelectorsAsServedWeight: typeof import('./src/components/prompts/portion/selectors/AsServedWeight.vue')['default']
PromptsPortionSelectorsDrinkScalePanel: typeof import('./src/components/prompts/portion/selectors/DrinkScalePanel.vue')['default']
PromptsPortionSelectorsImageMapSelector: typeof import('./src/components/prompts/portion/selectors/ImageMapSelector.vue')['default']
PromptsPortionSelectorsQuantityCard: typeof import('./src/components/prompts/portion/selectors/QuantityCard.vue')['default']
PromptsPortionStandardPortionPrompt: typeof import('./src/components/prompts/portion/StandardPortionPrompt.vue')['default']
PromptsStandardAssociatedFoodsPrompt: typeof import('./src/components/prompts/standard/AssociatedFoodsPrompt.vue')['default']
PromptsStandardEditableFoodList: typeof import('./src/components/prompts/standard/EditableFoodList.vue')['default']
Expand Down
151 changes: 0 additions & 151 deletions apps/survey/src/components/elements/GuideImagePanel.vue

This file was deleted.

4 changes: 0 additions & 4 deletions apps/survey/src/components/elements/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
export { default as AsServedWeight } from './AsServedWeight.vue';
export { default as CategoryContentsView } from './CategoryContentsView.vue';
export { default as ContextMenu } from './ContextMenu.vue';
export { default as DrinkScalePanel } from './DrinkScalePanel.vue';
export { default as ErrorAlert } from './ErrorAlert.vue';
export { default as FoodBrowser } from './FoodBrowser.vue';
export { default as FoodSearchResults } from './FoodSearchResults.vue';
export { default as GuideImagePanel } from './GuideImagePanel.vue';
export { default as ImagePlaceholder } from './ImagePlaceholder.vue';
export { default as InfoAlert } from './InfoAlert.vue';
export { default as QuantityCard } from './QuantityCard.vue';
export { default as SurveyProgressBar } from './SurveyProgressBar.vue';
export { default as ValidInvalidIcon } from './ValidInvalidIcon.vue';
11 changes: 5 additions & 6 deletions apps/survey/src/components/mixins/expansionPanelControls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,16 @@ import { defineComponent } from 'vue';
export default defineComponent({
data() {
return {
panelOpenId: 0,
panel: 0,
};
},

methods: {
// We don't track # of panels per prompt, so if newPanelId beyond # panels, all will be closed
setPanelOpen(newPanelId: number) {
this.panelOpenId = newPanelId;
setPanel(panel: number) {
this.panel = panel;
},
closeAllPanels() {
this.panelOpenId = -1;
closePanels() {
this.panel = -1;
},
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,24 @@ export default defineComponent({
getInitialState(): AsServedPromptState {
return {
activePanel: 0,
panel: 0,
servingImage: null,
servingImageSelected: false,
leftoversConfirmed: null,
leftoversImageSelected: false,
servingImageConfirmed: false,
leftoversPrompt: undefined,
leftoversImage: null,
leftoversImageConfirmed: false,
};
},
isValid(state: AsServedPromptState): boolean {
const servingValid = state.servingImage !== null && state.servingImageSelected;
const leftoversConfirmedAndValid =
state.leftoversConfirmed === true &&
state.leftoversImage !== null &&
state.leftoversImageSelected;
const leftoversSkipped = state.leftoversConfirmed === false;
const servingValid = !!state.servingImage && state.servingImageConfirmed;
const leftoversValid =
state.leftoversPrompt === false ||
(!!state.leftoversImage && state.leftoversImageConfirmed);
const noLeftovers = !this.parameters['leftovers-image-set'];
return servingValid && (noLeftovers || leftoversSkipped || leftoversConfirmedAndValid);
return servingValid && (noLeftovers || leftoversValid);
},
async commitAnswer() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<template>
<cereal-prompt
v-bind="{ continueEnabled, parameters, promptComponent, promptProps }"
:food-name="foodName()"
:initial-state="initialStateNotNull"
@continue="$emit('continue')"
@update="onUpdate"
></cereal-prompt>
</template>

<script lang="ts">
import type { PropType } from 'vue';
import { mapActions } from 'pinia';
import { defineComponent } from 'vue';
import type { CerealPromptProps, PortionSizeComponentType } from '@intake24/common/prompts';
import type { CerealParameters } from '@intake24/common/types/http';
import type { CerealPromptState } from '@intake24/survey/components/prompts/portion/CerealPrompt.vue';
import {
createPromptHandlerStoreMixin,
foodPromptUtils,
} from '@intake24/survey/components/prompts/dynamic/handlers/mixins';
import { CerealPrompt } from '@intake24/survey/components/prompts/portion';
import { useSurvey } from '@intake24/survey/stores';
export default defineComponent({
name: 'CerealPromptHandler',
components: { CerealPrompt },
mixins: [foodPromptUtils, createPromptHandlerStoreMixin<CerealPromptState>('cereal-prompt')],
props: {
promptProps: {
type: Object as PropType<CerealPromptProps>,
required: true,
},
promptComponent: {
type: String as PropType<PortionSizeComponentType>,
required: true,
},
},
computed: {
parameters(): CerealParameters {
if (this.selectedPortionSize().method !== 'cereal')
throw new Error('Selected portion size method must be "cereal"');
return this.selectedPortionSize().parameters as unknown as CerealParameters;
},
},
methods: {
...mapActions(useSurvey, ['updateFood']),
getFoodOrMealId(): number {
return this.selectedFood().id;
},
getInitialState(): CerealPromptState {
return {
panel: 0,
objectIdx: undefined,
objectConfirmed: false,
servingImage: null,
servingImageConfirmed: false,
leftoversPrompt: undefined,
leftoversImage: null,
leftoversImageConfirmed: false,
};
},
isValid(state: CerealPromptState): boolean {
const objectValid = state.objectIdx !== undefined && state.objectConfirmed;
const servingValid = !!state.servingImage && state.servingImageConfirmed;
const leftoversValid =
state.leftoversPrompt === false ||
(!!state.leftoversImage && state.leftoversImageConfirmed);
return objectValid && servingValid && leftoversValid;
},
async commitAnswer() {
const currentState = this.currentStateNotNull;
this.updateFood({
foodId: this.selectedFood().id,
update: {
portionSize: {
method: 'cereal',
serving: currentState.servingImage,
leftovers: currentState.leftoversImage,
servingWeight: currentState.servingImage?.weight || 0,
leftoversWeight: currentState.leftoversImage?.weight || 0,
},
},
});
},
},
});
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import type { DrinkScalePromptState } from '@intake24/survey/components/prompts/
import { createPromptHandlerStoreMixin } from '@intake24/survey/components/prompts/dynamic/handlers/mixins';
import { DrinkScalePrompt } from '@intake24/survey/components/prompts/portion';
import { useSurvey } from '@intake24/survey/stores';
import { useFoodGuideImageState } from '@intake24/survey/stores/guide-image';
import foodPromptUtils from '../mixins/food-prompt-utils';
Expand Down Expand Up @@ -67,7 +66,6 @@ export default defineComponent({
methods: {
...mapActions(useSurvey, ['updateFood']),
...mapActions(useFoodGuideImageState, ['updateFoodState', 'clearFoodState']),
getInitialState(): DrinkScalePromptState {
return (
Expand All @@ -93,7 +91,7 @@ export default defineComponent({
objectIdx: undefined,
drinkOverlayUrl: '',
maxDrinkSliderValue: 100,
panelOpen: 0,
panel: 0,
minDrinkSliderValue: 0,
originalImageUrlHeight: 0,
originalImageUrlWidth: 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export default defineComponent({
objectConfirmed: false,
quantityConfirmed: false,
objectIdx: undefined,
panelOpen: 0,
panel: 0,
}
);
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import AsServedPromptHandler from './AsServedPromptHandler.vue';
import CerealPromptHandler from './CerealPromptHandler.vue';
import DrinkScalePromptHandler from './DrinkScalePromptHandler.vue';
import GuideImagePromptHandler from './GuideImagePromptHandler.vue';
import MilkInAHotDrinkPromptHandler from './MilkInAHotDrinkPromptHandler.vue';
Expand All @@ -7,6 +8,7 @@ import StandardPortionPromptHandler from './StandardPortionPromptHandler.vue';

export default {
AsServedPromptHandler,
CerealPromptHandler,
DrinkScalePromptHandler,
GuideImagePromptHandler,
MilkInAHotDrinkPromptHandler,
Expand Down

0 comments on commit 39a0db6

Please sign in to comment.