Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/whatsjet-saas/Source/resources/views/bot-reply/bot-flow/
Upload File :
Current File : /home/users/unlimited/www/whatsjet-saas/Source/resources/views/bot-reply/bot-flow/builder.blade.php

@extends('layouts.app', ['title' => __tr('Bot Flow Builder')])
@section('content')
@include('users.partials.header', [
'title' => __tr('Bot Flow Builder'),
'description' => '',
'class' => 'col-lg-7'
])
{!! __yesset([
'static-assets/packages/jquery.flowchart/jquery.flowchart.min.css'
]) !!}
<div class="container-fluid mt-lg--6">
    <div class="row" x-data="{isAdvanceBot:'interactive',botFlowUid:'{{ $botFlowUid }}'}">
        <!-- button -->
        <div class="col-xl-12 mb-3">
            <div class="float-right">
                <a class="lw-btn btn btn-secondary" href="{{ route('vendor.bot_reply.bot_flow.read.list_view') }}">{{
                        __tr('Back to Bot Flows') }}</a>
            </div>
        </div>
        <!--/ button -->
        <div class="col-xl-12" x-data="initialAlpineData">
           <div class="row">
            <div class="card col-12">
                <div class="card-header">
                    <span class="h2">{{ $botFlow->title }}</span>
                    <div class="float-right">
                        <span class="form-group m-0 mr-3">
                            <label for="lwUpdateStatusSwitch">
                                <input data-lw-plugin="lwSwitchery" @click="function() {
                                    __DataRequest.post('{{ route('vendor.bot_reply.bot_flow_data.write.update') }}', {
                                        'botFlowUid' : '{{ $botFlowUid }}',
                                        'bot_flow_status' : (!botFlowStatusValue ? 1 : 0)
                                        }, function() {});
                                }" {{ ($botFlow->status == 1) ? 'checked' : '' }} x-model="botFlowStatusValue" value="1" class="custom-checkbox" id="lwUpdateStatusSwitch" type="checkbox" name="bot_flow_status">
                                {{  __tr('Status') }}
                            </label>
                        </span>
                        <template x-if="isUnsavedContent">
                            <div class="btn-group">
                            <button @click="window.unsavedAlert()" type="button" class="btn btn-primary dropdown-toggle" aria-expanded="false">
                            {{ __tr('Add New Bot Reply') }}
                        </button>
                            </div>
                        </template>
                        <template x-if="!isUnsavedContent">
                            <div class="btn-group">
                                <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"
                                    aria-expanded="false">
                                    {{ __tr('Add New Bot Reply') }}
                                </button>
                                <div class="dropdown-menu dropdown-menu-right">
                                    <button type="button" @click="isAdvanceBot = 'simple'" class="dropdown-item btn"
                                        data-toggle="modal" data-target="#lwAddNewAdvanceBotReply"> {{ __tr('Simple Bot Reply')
                                        }}</button>
                                    <button type="button" @click="isAdvanceBot = 'media'" class="dropdown-item btn"
                                        data-toggle="modal" data-target="#lwAddNewAdvanceBotReply"> {{ __tr('Media Bot Reply')
                                        }}</button>
                                    <button type="button" @click="isAdvanceBot = 'interactive'" class="dropdown-item btn"
                                        data-toggle="modal" data-target="#lwAddNewAdvanceBotReply"> {{ __tr('Advance Interactive Bot Reply') }}</button>
                                </div>
                            </div>
                        </template>
                        <button class="btn btn-warning" @click="saveData"><i class="fa fa-save"></i> {{  __tr('Save') }}</button>
                    </div>
                </div>
                {{-- added just to initialize --}}
                <div class="pl-1 m-1 lw-flow-builder-container-holder" dir="ltr">
                    <template x-text="processedFlowBots"></template>
                    <div class="lw-flow-builder-container p-4 card-body" id="lwBotFlowBuilder"></div>
                </div>
            </div>
           </div>
        </div>
        @include('bot-reply.bot-forms-partial')
    </div>
</div>
  <!-- Bot Reply delete template -->
  <script type="text/template" id="lwDeleteBotReply-template">
    <h2>{{ __tr('Are You Sure!') }}</h2>
    <p>{{ __tr('You want to delete this Bot Reply?') }}</p>
</script>
<!-- /Bot Reply delete template -->
  <!-- Bot Reply duplicate template -->
  <script type="text/template" id="lwDuplicateBotReply-template">
    <h2>{{ __tr('Are You Sure!') }}</h2>
    <p>{{ __tr('Are you sure you want to duplicate this Bot Reply?') }}</p>
</script>
<!-- /Bot Reply duplicate template -->
@push('js')
{!! __yesset([
    'static-assets/packages/jqueryui-1.13.3/jquery-ui.min.js',
    // 'static-assets/packages/others/jquery.mousewheel.min.js',
    'static-assets/packages/others/jquery.panzoom.min.js',
    'static-assets/packages/jquery.flowchart/jquery.flowchart.min.js'
]) !!}
@endpush
<script>
    var data = {
        links : {}
    };
        window.flowchartData = {};
        window.$flowBuilderInstance = null;
        window.__isUnsavedContent = false;
        window.isFlowChatInitialized = false;
</script>
@push('appScripts')
<script>
    $(document).ready(function() {
       'use strict';
        window.$flowBuilderInstance = $('#lwBotFlowBuilder').flowchart({
            data: {},
            defaultSelectedLinkColor: '#000055',
            grid: 10,
            multipleLinksOnInput: true,
            multipleLinksOnOutput: true,
            linkWidth:5,
            defaultLinkColor:'green',
            defaultSelectedLinkColor:'skyblue',
            onOperatorSelect : function(elementUid) {
                return true;
            },
            onLinkCreate : function(linkId, linkData) {
                data.links[linkId] = linkData;
                if(window.isFlowChatInitialized) {
                    window.updateDraft();
                };
                return true;
            },
            onLinkSelect : function(linkId, linkData) {
                $('.lw-operator-link-'+data.links[linkId]['toOperator']).show();
                return true;
            },
            onLinkUnselect : function(linkId) {
                $('.lw-delete-link-btn').hide();
                return true;
            },
            onLinkDelete : function(linkId) {
                delete data.links[linkId];
                window.updateDraft();
                return true;
            },
            onOperatorMoved : function(operatorId, position) {
                window.updateDraft();
            },
        });
         // Panzoom initialization...
        /*
        @link https://github.com/timmywil/panzoom/tree/v3.2.2
        */
        window.$flowBuilderInstance.panzoom({
            contain: 'automatic',
            cursor: "grab"
        });
    // required to trigger default flow
    __DataRequest.updateModels({
        tempClick : '{{ uniqid() }}'
    });
    window.onBotReplyDeleted = function(response) {
        window.$flowBuilderInstance.flowchart('deleteOperator', response.data.botReplyUid);
        _.defer(function() {
            window.saveFlowChartData();
        });
        appFuncs.modelSuccessCallback(response);
    };
    window.unsavedAlert = function() {
        showConfirmation('{{ __tr('You have unsaved changes. You need to save it first, Do you want to save it now?') }}', function() {
            window.saveFlowChartData();
        });
    };
    window.updateDraft = function(response) {
        window.__isUnsavedContent = true;
        __DataRequest.updateModels({
            isUnsavedContent : true
        });
        return true;
    };
    window.saveFlowChartData = function() {
        window.isFlowChatInitialized = false;
        var flowchartDataInstance = window.$flowBuilderInstance.flowchart('getData');
        // Loop through each operator key
        Object.keys(flowchartDataInstance.operators).forEach(function(operatorId) {
            var operator = flowchartDataInstance.operators[operatorId];
            // Check if 'properties' exists and has 'body'
            if (operator.properties && 'body' in operator.properties) {
                delete operator.properties.body; // Remove 'body' safely
            }
        });
        __DataRequest.post("{{ route('vendor.bot_reply.bot_flow_data.write.update') }}", {
            'botFlowUid' : '{{ $botFlowUid }}',
            'flow_chart_data' : flowchartDataInstance
            }, function() {
                window.__isUnsavedContent = false;
        });
    };
    window.onbeforeunload = function (e) {
        if(window.__isUnsavedContent) {
            var message = "{{ __tr('Changes that you made may not be saved.') }}",
            e = e || window.event;
            // For IE and Firefox
            if (e) {
                e.returnValue = message;
            }
            // For Safari
            return message;
        };
    };
    _.defer(function() {
        window.isFlowChatInitialized = true;
    });
});
</script>
@endpush
<script>
(function() {
    'use strict';
    document.addEventListener('alpine:init', () => {
        Alpine.data('initialAlpineData', () => ({
            tempClick:false,
            isUnsavedContent:false,
            botFlowStatusValue:{{ $botFlow->status == 1 ?: 0 }},
            saveData:function() {
                if(window.$flowBuilderInstance) {
                    window.saveFlowChartData();
                };
                return {};
            },
            flowBots: @json($flowBots),
            botFlowData: @json($botFlow->__data['flow_builder_data'] ?? []),
            processedFlowBots: function () {
                var xyz = this.tempClick;
                _.merge(data, this.botFlowData, {
                    operators : {
                        start : {
                            top: 10,
                            left: 10,
                            properties: {
                                title: "{{ __tr('Start') }} →",
                                outputs: {
                                    start_output : {
                                        label : '{{ $botFlow->start_trigger }}'
                                    }
                                }
                            }
                        }
                    }
                });
                var index = 1;
                for (const flowBotIndex in this.flowBots) {
                    if (Object.hasOwnProperty.call(this.flowBots, flowBotIndex)) {
                        const element = this.flowBots[flowBotIndex];
                        data.operators[element._uid] = {
                            top: _.get(data.operators[element._uid],'top', _.random(150, 200)),
                            left: _.get(data.operators[element._uid],'left', _.random(20, 100)),
                            properties: {
                                title: element.name,
                                body: `<div class="btn-group btn-group-sm"><a class="btn btn-default lw-mobile-view-none" style="padding: 1px;"></a> <a style="display:none;" x-show="isUnsavedContent" @click.prevent="window.unsavedAlert()" title="{{  __tr('Edit') }}" class="btn btn-default btn-sm" href="#"><i class="fa fa-edit"></i> {{  __tr('Edit') }}</a> <a x-show="!isUnsavedContent" data-pre-callback="appFuncs.clearContainer" title="{{  __tr('Edit') }}" class="btn btn-default lw-ajax-link-action" data-response-template="#lwEditBotReplyBody" href="`+__Utils.apiURL("{{ route('vendor.bot_reply.read.update.data', [ 'botReplyIdOrUid']) }}", {'botReplyIdOrUid': element._uid})+`" data-toggle="modal" data-target="#lwEditBotReply"><i class="fa fa-edit"></i> {{  __tr('Edit') }}</a> <a style="display:none;" x-show="isUnsavedContent" @click.prevent="window.unsavedAlert()" title="{{  __tr('Delete') }}" class="btn btn-danger btn-sm" href="#"><i class="fa fa-trash"></i> {{  __tr('Delete') }} </a>
                                    <a x-show="!isUnsavedContent" data-method="post" href="`+ __Utils.apiURL("{{ route('vendor.bot_reply.write.delete', [ 'botReplyIdOrUid']) }}", {'botReplyIdOrUid': element._uid}) +`" class="btn btn-danger lw-ajax-link-action" data-confirm="#lwDeleteBotReply-template" title="{{ __tr('Delete') }}" data-callback="onBotReplyDeleted"><i class="fa fa-trash"></i> {{  __tr('Delete') }}</a> <a style="display:none;" x-show="isUnsavedContent" @click.prevent="window.unsavedAlert()" title="{{  __tr('Duplicate') }}" class="btn btn-light btn-sm" href="#"><i class="fa fa-copy"></i></a> <a x-show="!isUnsavedContent" data-method="post" href="`+ __Utils.apiURL("{{ route('vendor.bot_reply.write.duplicate', [ 'botReplyIdOrUid']) }}", {'botReplyIdOrUid': element._uid}) +`" class="btn btn-light lw-ajax-link-action" data-confirm="#lwDuplicateBotReply-template" title="{{ __tr('Duplicate') }}"><i class="fa fa-copy"></i></a>
                                    <a class="btn btn-light lw-mobile-view-none" style="padding: 1px;"></a></div><button style="display:none;" class="lw-delete-link-btn lw-operator-link-`+element._uid+` btn btn-warning btn-block btn-sm" @click="window.$flowBuilderInstance.flowchart('deleteSelected');"><i class="fas fa-unlink"></i> {{  __tr('Delete Link') }}</button>`,
                                inputs: {
                                    input: {
                                        label: "→"
                                    },
                                },
                                outputs: {}
                            }
                        };
                        if(_.get(element.__data, 'interaction_message')) {
                            if(_.get(element.__data, 'interaction_message.buttons')) {
                                for (const interactiveButtonIndex in element.__data.interaction_message.buttons) {
                                    if (Object.hasOwnProperty.call(element.__data.interaction_message.buttons, interactiveButtonIndex)) {
                                        const buttonElement = element.__data.interaction_message.buttons[interactiveButtonIndex];
                                        data.operators[element._uid]['properties']['outputs'][interactiveButtonIndex] = {
                                            label: buttonElement
                                        };
                                    };
                                };
                            };
                            if(_.get(element.__data, 'interaction_message.list_data.sections')) {
                                for (const interactiveListSectionIndex in element.__data.interaction_message.list_data.sections) {
                                    if (Object.hasOwnProperty.call(element.__data.interaction_message.list_data.sections, interactiveListSectionIndex)) {
                                        const sectionElement = element.__data.interaction_message.list_data.sections[interactiveListSectionIndex];
                                        if(_.get(sectionElement, 'rows')) {
                                            for (const rowIndex in sectionElement.rows) {
                                                if (Object.hasOwnProperty.call(sectionElement.rows, rowIndex)) {
                                                    const rowElement = sectionElement.rows[rowIndex];
                                                        data.operators[element._uid]['properties']['outputs']['sections___' + interactiveListSectionIndex + '___rows___' + rowIndex + '___title'] = {
                                                        label: rowElement['title']
                                                    };
                                                };
                                            };
                                        };
                                    };
                                };
                            };
                        };
                        index++;
                    };
                };
                if(window.$flowBuilderInstance) {
                    window.$flowBuilderInstance.flowchart('setData', data);
                };
            }
        }));
    });
})();
</script>
@endsection()