MealPlanRuleForm and add missing evens to QueryBuilder

This commit is contained in:
Kuchenpirat 2025-07-29 23:26:44 +00:00
commit 6dd0666126
2 changed files with 23 additions and 41 deletions

View file

@ -5,12 +5,12 @@
style="gap: 10px" style="gap: 10px"
> >
<v-select <v-select
v-model="inputDay" v-model="day"
:items="MEAL_DAY_OPTIONS" :items="MEAL_DAY_OPTIONS"
:label="$t('meal-plan.rule-day')" :label="$t('meal-plan.rule-day')"
/> />
<v-select <v-select
v-model="inputEntryType" v-model="entryType"
:items="MEAL_TYPE_OPTIONS" :items="MEAL_TYPE_OPTIONS"
:label="$t('meal-plan.meal-type')" :label="$t('meal-plan.meal-type')"
/> />
@ -19,15 +19,15 @@
<div class="mb-5"> <div class="mb-5">
<QueryFilterBuilder <QueryFilterBuilder
:field-defs="fieldDefs" :field-defs="fieldDefs"
:initial-query-filter="queryFilter" :initial-query-filter="props.queryFilter"
@input="handleQueryFilterInput" @input="handleQueryFilterInput"
/> />
</div> </div>
<!-- TODO: proper pluralization of inputDay --> <!-- TODO: proper pluralization of inputDay -->
{{ $t('meal-plan.this-rule-will-apply', { {{ $t('meal-plan.this-rule-will-apply', {
dayCriteria: inputDay === "unset" ? $t('meal-plan.to-all-days') : $t('meal-plan.on-days', [inputDay]), dayCriteria: day === "unset" ? $t('meal-plan.to-all-days') : $t('meal-plan.on-days', [day]),
mealTypeCriteria: inputEntryType === "unset" ? $t('meal-plan.for-all-meal-types') : $t('meal-plan.for-type-meal-types', [inputEntryType]), mealTypeCriteria: entryType === "unset" ? $t('meal-plan.for-all-meal-types') : $t('meal-plan.for-type-meal-types', [entryType]),
}) }} }) }}
</div> </div>
</template> </template>
@ -39,20 +39,17 @@ import { Organizer } from "~/lib/api/types/non-generated";
import type { QueryFilterJSON } from "~/lib/api/types/response"; import type { QueryFilterJSON } from "~/lib/api/types/response";
interface Props { interface Props {
day?: string;
entryType?: string;
queryFilterString?: string;
queryFilter?: QueryFilterJSON | null; queryFilter?: QueryFilterJSON | null;
showHelp?: boolean; showHelp?: boolean;
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
day: "unset",
entryType: "unset",
queryFilterString: "",
queryFilter: null, queryFilter: null,
showHelp: false, showHelp: false,
}); });
const emit = defineEmits(["update:day", "update:entry-type", "update:query-filter-string"]);
const day = defineModel<string>("day", { default: "unset" });
const entryType = defineModel<string>("entryType", { default: "unset" });
const queryFilterString = defineModel<string>("queryFilterString", { default: "" });
const i18n = useI18n(); const i18n = useI18n();
@ -75,35 +72,9 @@ const MEAL_DAY_OPTIONS = [
{ title: i18n.t("meal-plan.day-any"), value: "unset" }, { title: i18n.t("meal-plan.day-any"), value: "unset" },
]; ];
const inputDay = computed({
get: () => {
return props.day;
},
set: (val) => {
emit("update:day", val);
},
});
const inputEntryType = computed({
get: () => {
return props.entryType;
},
set: (val) => {
emit("update:entry-type", val);
},
});
const inputQueryFilterString = computed({
get: () => {
return props.queryFilterString;
},
set: (val) => {
emit("update:query-filter-string", val);
},
});
function handleQueryFilterInput(value: string | undefined) { function handleQueryFilterInput(value: string | undefined) {
inputQueryFilterString.value = value || ""; console.warn("handleQueryFilterInput called with value:", value);
queryFilterString.value = value || "";
} }
const fieldDefs: FieldDefinition[] = [ const fieldDefs: FieldDefinition[] = [

View file

@ -147,7 +147,7 @@
:model-value="field.value" :model-value="field.value"
type="number" type="number"
variant="underlined" variant="underlined"
@:model-value="setFieldValue(field, index, $event)" @update:model-value="setFieldValue(field, index, $event)"
/> />
<v-checkbox <v-checkbox
v-else-if="field.type === 'boolean'" v-else-if="field.type === 'boolean'"
@ -190,6 +190,7 @@
:show-label="false" :show-label="false"
:show-icon="false" :show-icon="false"
variant="underlined" variant="underlined"
@update:model-value="setFieldOrganizers(field, index, $event)"
/> />
<RecipeOrganizerSelector <RecipeOrganizerSelector
v-else-if="field.type === Organizer.Tag" v-else-if="field.type === Organizer.Tag"
@ -199,6 +200,7 @@
:show-label="false" :show-label="false"
:show-icon="false" :show-icon="false"
variant="underlined" variant="underlined"
@update:model-value="setFieldOrganizers(field, index, $event)"
/> />
<RecipeOrganizerSelector <RecipeOrganizerSelector
v-else-if="field.type === Organizer.Tool" v-else-if="field.type === Organizer.Tool"
@ -208,6 +210,7 @@
:show-label="false" :show-label="false"
:show-icon="false" :show-icon="false"
variant="underlined" variant="underlined"
@update:model-value="setFieldOrganizers(field, index, $event)"
/> />
<RecipeOrganizerSelector <RecipeOrganizerSelector
v-else-if="field.type === Organizer.Food" v-else-if="field.type === Organizer.Food"
@ -217,6 +220,7 @@
:show-label="false" :show-label="false"
:show-icon="false" :show-icon="false"
variant="underlined" variant="underlined"
@update:model-value="setFieldOrganizers(field, index, $event)"
/> />
<RecipeOrganizerSelector <RecipeOrganizerSelector
v-else-if="field.type === Organizer.Household" v-else-if="field.type === Organizer.Household"
@ -226,6 +230,7 @@
:show-label="false" :show-label="false"
:show-icon="false" :show-icon="false"
variant="underlined" variant="underlined"
@update:model-value="setFieldOrganizers(field, index, $event)"
/> />
</v-col> </v-col>
<!-- right parenthesis --> <!-- right parenthesis -->
@ -414,6 +419,12 @@ function setFieldValues(field: FieldWithId, index: number, values: FieldValue[])
fields.value[index].values = values; fields.value[index].values = values;
} }
function setFieldOrganizers(field: FieldWithId, index: number, organizers: OrganizerBase[]) {
fields.value[index].organizers = organizers;
// Sync the values array with the organizers array
fields.value[index].values = organizers.map(org => org.id?.toString() || "").filter(id => id);
}
function removeField(index: number) { function removeField(index: number) {
fields.value.splice(index, 1); fields.value.splice(index, 1);
state.datePickers.splice(index, 1); state.datePickers.splice(index, 1);