src_js/iconolab-bundle/src/components/editor/AnnotationForm.vue
author Alexandre Segura <mex.zktk@gmail.com>
Mon, 20 Feb 2017 19:05:48 +0100
changeset 327 44a122f0f2de
parent 325 8f158a4c7759
child 333 625ac8b8bb87
permissions -rw-r--r--
Make sure to have a copy of the object.

<template>
    <form v-bind:action="formAction" method="post">
        <slot>
            <!-- CSRF token -->
        </slot>
        <input type="hidden" name="fragment" v-model="fragment">
        <div v-if="!annotation" class="alert alert-warning">
            Aucune annotation sélectionnée.
        </div>
        <div v-if="annotation" class="form-group form-group-sm">
            <label class="control-label">Titre</label>
            <input type="text" class="form-control" name="title" v-model="title">
        </div>
        <div v-if="annotation" class="form-group form-group-sm">
            <label class="control-label">Description</label>
            <textarea class="form-control" name="description" v-model="description"></textarea>
        </div>
        <div v-if="annotation" class="form-group form-group-sm">
            <label class="control-label">Mots-clé</label>
            <tag-list ref="taglist" v-bind:tags="tags" @change="onTagsChange($event.tags)"></tag-list>
            <input type="hidden" name="tags" v-model="serializedTags">
        </div>
        <button type="submit" v-if="annotation" v-bind:class="{ disabled: !hasChanged() }"
            class="btn btn-block btn-sm btn-primary">Sauvegarder</button>
    </form>
</template>

<script>

    import TagList from '../tagform/TagList.vue'

    export default {
        props: ['action', 'annotation'],
        components: {
            'tag-list': TagList
        },
        data() {
            return {
                'title': '',
                'description': '',
                'fragment': '',
                'tags': [],
            }
        },
        watch: {
            annotation: function(annotation) {
                if (annotation) {
                    // Make sure we have an actual copy
                    Object.assign(this, {
                        'title': annotation.title,
                        'description': annotation.description,
                        'fragment': annotation.fragment,
                        'tags': annotation.tags.slice()
                    });
                } else {
                    this.reset();
                }
            }
        },
        computed: {
            formAction: function() {
                if (this.annotation) {
                    return this.action.replace(':annotation_guid', this.annotation.annotation_guid);
                }
            },
            serializedTags: function() {
                var tags = this.tags.map(function(tag) {
                    return {
                        tag_input: (typeof tag.tag_link === "string" && tag.tag_link.length) ? tag.tag_link : tag.tag_label,
                        tag_label: tag.tag_label,
                        accuracy: tag.accuracy,
                        relevancy: tag.relevancy
                    }
                });

                return JSON.stringify(tags);
            }
        },
        methods: {
            onTagsChange: function(tags) {
                this.tags = tags;
            },
            reset: function() {
                Object.assign(this, {
                    'title': '',
                    'description': '',
                    'fragment': '',
                    'tags': []
                });
            },
            hasChanged: function() {
                if (!this.annotation) { return false; }

                return this.title !== this.annotation.title
                    || this.description !== this.annotation.description
                    || this.tags !== this.annotation.tags;
            }
        }
    }

</script>

<style scoped>
form {
    margin-bottom: 20px;
}
</style>