ldc-legaulois/resources/ts/bo/components/MainMenuNodeDataEditor.vue

349 lines
11 KiB
Vue
Raw Normal View History

2024-04-12 10:18:11 +02:00
<template>
2024-04-18 12:05:10 +02:00
<fieldset class="main-menu-node-data-editor-component container-fluid p-4 border mb-3" >
2024-04-12 10:18:11 +02:00
<legend>
<span class="fs-5">{{ trans.methods.__("Modification de données d'un noeud") }}</span>
</legend>
2024-04-18 12:05:10 +02:00
<span class="d-block fs-5">{{ trans.methods.__('Partie gauche') }}</span>
<!-- SUB LABEL -->
<div class="mb-3 row">
<label
for="title-sub-label"
class="col-sm-2 col-form-label"
>
{{ trans.methods.__("Label du sous-menu") }}
</label>
<div class="col-sm-4">
<input
id="title-sub-label"
type="text"
class="form-control"
:value="menuNodeData.sub_label"
@blur="($event) => saveNodeDataInput('sub_label', ($event.target as HTMLInputElement).value)"
>
<small v-if="errors.sub_label" v-for="(message) of errors.sub_label" class="text-danger">"{{ message }}"</small>
</div>
</div>
<hr>
<span class="d-block fs-5">{{ trans.methods.__('Partie droite') }}</span>
2024-04-12 10:18:11 +02:00
<!-- TITLE -->
<div class="mb-3 row">
<label
2024-04-16 16:53:38 +02:00
for="title-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label"
>
{{ trans.methods.__("Titre") }}
</label>
<div class="col-sm-4">
<input
2024-04-16 16:53:38 +02:00
id="title-text"
2024-04-12 10:18:11 +02:00
type="text"
class="form-control"
:value="menuNodeData.title"
2024-04-16 16:53:38 +02:00
@blur="($event) => saveNodeDataInput('title', ($event.target as HTMLInputElement).value)"
2024-04-12 10:18:11 +02:00
>
2024-04-16 16:53:38 +02:00
<small v-if="errors.title" v-for="(message) of errors.title" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
</div>
<!-- TEXT -->
<div class="mb-3 row">
<label
2024-04-16 16:53:38 +02:00
for="text-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label"
>
{{ trans.methods.__("Text") }}
</label>
<div class="col-sm-4">
2024-04-18 12:05:10 +02:00
<textarea
2024-04-16 16:53:38 +02:00
id="text-text"
2024-04-12 10:18:11 +02:00
class="form-control"
2024-04-18 12:05:10 +02:00
@blur="($event) => $nextTick(() => saveNodeDataInput('text', ($event.target as HTMLTextAreaElement).value))"
:value="menuNodeData.text"></textarea>
<small v-if="errors.text" v-for="(message) of errors.text" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
</div>
<!-- LINK -->
<div class="mb-3 row">
<!-- LINK URL -->
<label
2024-04-16 16:53:38 +02:00
for="link-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Link url") }}
</label>
<div class="col-sm-4 p-2">
<input
2024-04-16 16:53:38 +02:00
id="link-text"
2024-04-12 10:18:11 +02:00
type="text"
class="form-control"
:value="menuNodeData.link_url"
2024-04-16 16:53:38 +02:00
@blur="($event) => saveNodeDataInput('link_url', ($event.target as HTMLInputElement).value)"
2024-04-12 10:18:11 +02:00
>
<small v-if="errors.link_url" v-for="(message) of errors.link_url" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
<!-- LINK TITLE -->
<label
2024-04-16 16:53:38 +02:00
for="link-title-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Link title") }}
</label>
<div class="col-sm-4 p-2">
<input
2024-04-16 16:53:38 +02:00
id="link-title-text"
2024-04-12 10:18:11 +02:00
type="text"
class="form-control"
2024-04-16 16:53:38 +02:00
:value="menuNodeData.link_title"
@blur="($event) => saveNodeDataInput('link_title', ($event.target as HTMLInputElement).value)"
2024-04-12 10:18:11 +02:00
>
<small v-if="errors.link_title" v-for="(message) of errors.link_title" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
<!-- LINK TARGET -->
<label
2024-04-16 16:53:38 +02:00
for="link-target-checkbox"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Link target") }}
</label>
<div class="col-sm-4 p-2">
2024-04-16 16:53:38 +02:00
<div class="form-check form-switch">
<input
name="link_target"
class="form-check-input pt-3"
type="checkbox"
role="switch"
id="link-target-checkbox"
:checked="menuNodeData.link_target"
@change="($event) => saveNodeDataInput('link_target', ($event.target as HTMLInputElement).checked)"
>
<small v-if="errors.link_target" v-for="(message) of errors.link_target" class="text-danger">"{{ message }}"</small>
2024-04-16 16:53:38 +02:00
</div>
2024-04-12 10:18:11 +02:00
</div>
<!-- LINK STATUS -->
<label
class="col-sm-2 col-form-label p-2"
2024-04-16 16:53:38 +02:00
for="link-status-checkbox"
2024-04-12 10:18:11 +02:00
>
{{ trans.methods.__("Link status") }}
</label>
<div class="col-sm-4 p-2">
2024-04-16 16:53:38 +02:00
<div class="form-check form-switch">
<input
name="link_status"
class="form-check-input pt-3"
type="checkbox"
role="switch"
id="link-status-checkbox"
:checked="menuNodeData.link_status"
@change="($event) => saveNodeDataInput('link_status', ($event.target as HTMLInputElement).checked)"
>
<small v-if="errors.link_status" v-for="(message) of errors.link_status" class="text-danger">"{{ message }}"</small>
2024-04-16 16:53:38 +02:00
</div>
2024-04-12 10:18:11 +02:00
</div>
</div>
<!-- --- -->
2024-04-18 12:23:05 +02:00
<hr class="col-8 mx-auto">
2024-04-12 10:18:11 +02:00
<!-- PICTURE -->
<div class="mb-3 row">
<!-- PICTURE -->
2024-04-16 16:53:38 +02:00
<label
for="picture-input"
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Picture") }}
</label>
2024-04-12 10:18:11 +02:00
<ImageInputComponent
2024-04-16 16:53:38 +02:00
id="picture-input"
:required="true"
2024-04-12 10:18:11 +02:00
:show-labels="true"
name="picture"
helper="picture"
:width="180"
:height="228"
2024-04-12 10:18:11 +02:00
:value="menuNodeData.picture"
2024-04-16 16:53:38 +02:00
:preview="false"
2024-04-12 10:18:11 +02:00
:browse-event="false"
2024-04-16 16:53:38 +02:00
@image-file="(file) => file ? saveNodeDataInput('picture', file) : null"
2024-04-12 10:18:11 +02:00
/>
<small v-if="errors.picture" v-for="(message) of errors.picture" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
<!-- PICTURE ALT -->
<label
2024-04-16 16:53:38 +02:00
for="picture-alt-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Picture alt") }}
</label>
<div class="col-sm-4 p-2">
<input
2024-04-16 16:53:38 +02:00
id="picture-alt-text"
2024-04-12 10:18:11 +02:00
type="text"
class="form-control"
:value="menuNodeData.picture_alt"
2024-04-16 16:53:38 +02:00
@blur="($event) => saveNodeDataInput('picture_alt', ($event.target as HTMLInputElement).value)"
2024-04-12 10:18:11 +02:00
>
<small v-if="errors.picture_alt" v-for="(message) of errors.picture_alt" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
<!-- PICTURE TITLE -->
<label
2024-04-16 16:53:38 +02:00
for="picture-title-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Picture title") }}
</label>
<div class="col-sm-4 p-2">
<input
2024-04-16 16:53:38 +02:00
id="picture-title-text"
2024-04-12 10:18:11 +02:00
type="text"
class="form-control"
:value="menuNodeData.picture_title"
2024-04-16 16:53:38 +02:00
@blur="($event) => saveNodeDataInput('picture_title', ($event.target as HTMLInputElement).value)"
2024-04-12 10:18:11 +02:00
>
<small v-if="errors.picture_title" v-for="(message) of errors.picture_title" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
<!-- PICTURE STATUS -->
<label
class="col-sm-2 col-form-label p-2"
2024-04-16 16:53:38 +02:00
for="picture-status-checkbox"
2024-04-12 10:18:11 +02:00
>
{{ trans.methods.__("Picture status") }}
</label>
<div class="col-sm-4 p-2">
2024-04-16 16:53:38 +02:00
<div class="form-check form-switch">
<input
name="picture_status"
class="form-check-input pt-3"
type="checkbox"
role="switch"
id="picture-status-checkbox"
:checked="menuNodeData.picture_status"
@change="($event) => saveNodeDataInput('picture_status', ($event.target as HTMLInputElement).checked)"
>
<small v-if="errors.picture_status" v-for="(message) of errors.picture_status" class="text-danger">"{{ message }}"</small>
2024-04-16 16:53:38 +02:00
</div>
2024-04-12 10:18:11 +02:00
</div>
</div>
<!-- --- -->
2024-04-18 12:23:05 +02:00
<hr class="col-8 mx-auto">
2024-04-12 10:18:11 +02:00
2024-04-16 16:53:38 +02:00
<!-- BACKGROUND PICTURE-->
2024-04-12 10:18:11 +02:00
<div class="mb-3 row">
2024-04-16 16:53:38 +02:00
<label
for="background-picture-input"
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Background Picture") }}
</label>
2024-04-12 10:18:11 +02:00
<!-- BACKGROUND PICTURE -->
<ImageInputComponent
2024-04-16 16:53:38 +02:00
id="background-picture-input"
:required="true"
2024-04-12 10:18:11 +02:00
:show-labels="true"
2024-04-16 16:53:38 +02:00
name="background_picture"
helper="background_picture"
:width="500"
:height="231"
2024-04-12 10:18:11 +02:00
:value="menuNodeData.background_picture"
2024-04-16 16:53:38 +02:00
:preview="false"
2024-04-12 10:18:11 +02:00
:browse-event="false"
2024-04-16 16:53:38 +02:00
@image-file="(file) => file ? saveNodeDataInput('background_picture', file) : null"
2024-04-12 10:18:11 +02:00
/>
<small v-if="errors.background_picture" v-for="(message) of errors.background_picture" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
<!-- BACKGROUND PICTURE ALT -->
<label
2024-04-16 16:53:38 +02:00
for="background-picture-alt-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label p-2"
>
2024-04-16 16:53:38 +02:00
{{ trans.methods.__("Background Picture alt") }}
2024-04-12 10:18:11 +02:00
</label>
<div class="col-sm-4 p-2">
<input
2024-04-16 16:53:38 +02:00
id="background-picture-alt-text"
2024-04-12 10:18:11 +02:00
type="text"
class="form-control"
:value="menuNodeData.background_picture_alt"
2024-04-16 16:53:38 +02:00
@blur="($event) => saveNodeDataInput('background_picture_alt', ($event.target as HTMLInputElement).value)"
2024-04-12 10:18:11 +02:00
>
<small v-if="errors.background_picture_alt" v-for="(message) of errors.background_picture_alt" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
<!-- BACKGROUND PICTURE TITLE -->
<label
2024-04-16 16:53:38 +02:00
for="background-picture-title-text"
2024-04-12 10:18:11 +02:00
class="col-sm-2 col-form-label p-2"
>
{{ trans.methods.__("Background picture title") }}
</label>
<div class="col-sm-4 p-2">
<input
2024-04-16 16:53:38 +02:00
id="background-picture-title-text"
2024-04-12 10:18:11 +02:00
type="text"
class="form-control"
:value="menuNodeData.background_picture_title"
2024-04-16 16:53:38 +02:00
@blur="($event) => saveNodeDataInput('background_picture_title', ($event.target as HTMLInputElement).value)"
2024-04-12 10:18:11 +02:00
>
<small v-if="errors.background_picture_title" v-for="(message) of errors.background_picture_title" class="text-danger">"{{ message }}"</small>
2024-04-12 10:18:11 +02:00
</div>
</div>
</fieldset>
</template>
<script lang="ts" setup>
2024-04-18 12:05:10 +02:00
import { defineOptions, onMounted, reactive, watch, type PropType } from "vue";
2024-04-16 16:53:38 +02:00
import type { IMenuNodeDataInputInterface } from "../../interfaces/IMenuNodeDataInputInterface";
2024-04-12 10:18:11 +02:00
import trans from "../../modules/trans";
import type { MenuNodeDataInterface } from "../../types/models/MenuNodeData";
import ImageInputComponent from "./ImageInputComponent.vue";
defineOptions({
name: "MainMenuNodeDataEditor"
});
// * EMITS
const emits = defineEmits<{
2024-04-16 16:53:38 +02:00
updatedNodeData: [prop: string, value: ValueOf<IMenuNodeDataInputInterface> ],
2024-04-12 10:18:11 +02:00
}>();
// * ATTRIBUTES
// const attrs = useAttrs();
// * PROPS
const props = defineProps({
menuNodeData: {
type: Object as PropType<MenuNodeDataInterface>,
required: true
2024-04-16 16:53:38 +02:00
},
errors: {
type: Object as PropType<LaravelValidationErrors>,
required: true
2024-04-12 10:18:11 +02:00
}
});
// * DATA
2024-04-18 12:05:10 +02:00
let menuNodeData = reactive<MenuNodeDataInterface>(Object.assign({}, props.menuNodeData));
2024-04-12 10:18:11 +02:00
// const urlIsValid = ref<boolean>(true);
// * LIFECYCLE
onMounted(() => {});
2024-04-16 16:53:38 +02:00
watch(props, () => {
2024-04-18 12:05:10 +02:00
menuNodeData = Object.assign({}, props.menuNodeData);
2024-04-16 16:53:38 +02:00
})
2024-04-12 10:18:11 +02:00
// * METHODS
2024-04-16 16:53:38 +02:00
function saveNodeDataInput(inputName: string, inputValue: ValueOf<IMenuNodeDataInputInterface>): void {
emits("updatedNodeData", inputName, inputValue);
}
2024-04-12 10:18:11 +02:00
</script>
<style lang="scss" scoped>
.main-menu-node-data-editor-component {
}
</style>