cyberfly
2/20/2019 - 3:44 AM

VueJS modal

<!-- Modal Component -->
        <b-modal ref="invoiceItemModal" size="lg" title="New Invoice Item"
                 :modal-class="'block block-themed block-transparent'"
                 :header-text-variant="'light'"
                 :header-class="'bg-primary-dark'"
                 :footer-class="'block-content block-content-full text-right bg-light'"
                 :ok-title="submit_label"
        @ok="handleOk"
        >
            <!--

            <div slot="modal-header">
                <h3 class="block-title">@{{ modal_title }}</h3>
            </div>

            -->

            <form @submit.stop.prevent="handleSubmit">

                <v-validation-alert :submitted="component_submitted"></v-validation-alert>

                <div class="form-row">

                    <div class="form-group col-md-6">
                        <v-text
                                v-model="item_data.item_name"
                                :field_name="'item_name'"
                                :label="'Item Name'"
                                :rules="'required'"
                        ></v-text>
                    </div>

                    <div class="form-group col-md-6">
                        <v-text
                                v-model="item_data.item_description"
                                :field_name="'item_description'"
                                :label="'Item Description'"
                                :rules="'required'"
                        ></v-text>
                    </div>
                </div>

                <div class="form-row">

                    <div class="form-group col-md-4">
                        <v-text
                                v-model="item_data.quantity"
                                :field_name="'quantity'"
                                :label="'Quantity'"
                                :rules="'required|decimal'"
                        ></v-text>
                    </div>

                    <div class="form-group col-md-4">
                        <v-money
                                v-model="item_data.price"
                                :field_name="'price'"
                                :label="'Price'"
                                :rules="'required'"
                        ></v-money>
                    </div>

                    <div class="form-group col-md-4">
                        <label for="amount">Amount</label>
                        <input :value="amount | toMyCurrency"
                               readonly="readonly" type="amount"
                               name="amount" ref="amount"
                               class="form-control"
                               id="amount" >
                    </div>

                </div>

            </form>

            <!--    

            <div slot="modal-footer">
                <button type="button" class="btn btn-sm btn-light">Cancel</button>
                <button type="submit" class="btn btn-sm btn-primary">@{{ submit_label }}</button>
            </div>

            -->


        </b-modal>
<script>

    export default {
        props: {
            
        },
        mounted () {

        },
        methods: {

            /*
            * Reset previous validation error each time open a new Modal form
            * */
            resetValidation() {
                this.$validator.reset();
            },

            showCreateForm() {

                this.current_action = 'create';

                // reset form to initial value

                this.item_data = this.getDefaultItemData();

                this.resetValidation();

                // set submit label and modal title
                this.submit_label = 'Create';
                this.modal_title = 'New Invoice Item';

                this.openModal();
            },

            showEditForm(index) {

                this.current_action = 'edit';

                this.current_index = index;

                // get item data from component invoice items array

                let copied_item_data = Object.assign({}, this.component_invoice_items[index]);

                this.item_data = copied_item_data;

                // reset validation

                this.resetValidation();

                // set submit label and modal title
                this.submit_label = 'Update';
                this.modal_title = 'Edit Invoice Item';

                this.openModal();
            },

            openModal() {
                this.$refs.invoiceItemModal.show();
            },

            closeModal() {
                this.$refs.invoiceItemModal.hide();
            },

            handleOk(event) {

                // prevent modal from closing
//                event.preventDefault();

                this.handleSubmit(event);
            },

            /*
            * Handle modal submission for New and Edit
            * */
            handleSubmit(e) {

                this.component_submitted = true;

                this.$validator.validate().then(valid => {
                    if (valid) {

                        if (this.current_action === 'create') {
                            this.store();
                        }
                        else if (this.current_action === 'edit') {
                            this.update();
                        }
                    }
                    else {
                        // scroll to top

                        window.scrollTo(0,0);
                    }
                });


            },

            /*
            * New row created by v-for must be re-init for tooltip to work
            * */

            reinitTooltip() {
                Vue.nextTick(function () {
                    $('[data-toggle="tooltip"]').tooltip();
                });
            },

            store() {

                this.component_invoice_items.push(this.item_data);

                this.reinitTooltip();

                this.closeModal();

                this.updateParent();
            },

            update() {

                Vue.set(this.component_invoice_items, this.current_index, this.item_data);

                this.closeModal();

                this.updateParent();

            },

            destroy() {

                let deleted_item = this.component_invoice_items[this.current_index];

                // remove item from component_invoice_items array

                this.$delete(this.component_invoice_items, this.current_index);

                // add the item into deleted_invoice_items array

                this.deleted_invoice_items.push(deleted_item);

                this.updateParent();

                this.updateParentDeletedItems();
            },

            /*
            * Update the parent component the value of latest component_invoice_items after Create / Update / Delete operation
            * */
            updateParent() {
                this.$emit('update:invoice_items', this.component_invoice_items);
            },

            /*
            * Update the parent component the value of latest deleted invoice items id
            * */
            updateParentDeletedItems() {

                this.$emit('update:deleted_invoice_item_ids', this.deleted_invoice_item_ids);
            }
        }
    }
</script>