| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974 | @extends('admin.master')
@section('content')
    <div class="row">
        <div class="col-xl-12">
            <form id="EditForm" class="form-horizontal" method="post"
                  action="{{ url('/backend/dataManagement/track/store') }}" enctype="multipart/form-data">
                {{ csrf_field() }}
                <div class="panel _panel-primary">
                    <div class="panel-heading _panel-heading">
                        <h4 class="panel-title m-0">{{ ($operdata == "") ? "新增 " : "修改 " }}議程資料</h4>
                    </div>
                    <div class="panel-body row">
                        <div>
                            <table class="table" style="border-collapse:collapse;">
                                <tbody class="msgTbody">
                                <input type="hidden" id="operateMode" value="edit"/>
                                <input type="hidden" id="id" value="{{$id}}"/>
                                
                                <!-- 欄位:圖文頭貼設定 -->
                                <tr class="msgTemplate">
                                    <td class="header-require col-xl-2">議程資料設定</td>
                                    <td>
                                        <div id="imgmapcontent-tab1">
                                            <input type="hidden" id="tab1MenuFlag"/>
                                            <input type="hidden" id="tab1ImagemapModelType" value="m1">
                                            <input type="hidden" id="tab1ImagemapImgSize" value='{"width":800,"height":800}'>
                                            
                                            <!-- 表格本體 -->
                                            <table class="table" id="DetailsView1" style="border-collapse:collapse;">
                                                <tbody>
                                                <!-- 序號 -->
                                                @if ($operdata == "")
                                                    <!-- Insert Mode -->
                                                    <input type="hidden" name="mode" value="insert"/>
                                                @else
                                                    <!-- Edit Mode -->
                                                    <input type="hidden" name="mode" value="edit"/>
                                                    <tr>
                                                        <td class="col-xl-2">序號</td>
                                                        <td>
                                                            <input name="id" type="hidden" value="{{ $operdata['id'] }}" id="id"/>
                                                            {{ $operdata['id'] }}
                                                        </td>
                                                    </tr>
                                                @endif                                
                                                    <!-- 欄位:標題 -->
                                                    <!-- ALL Mode -->
                                                    <tr>
                                                        <td class="header-require col-xl-2">trackNo</td>
                                                        <td>
                                                            <div class="col-xl-3 nopadding">
                                                                @if ($operdata == "")
                                                                    <input name="trackNo" type="text" value="" maxlength="100"
                                                                        id="trackNo" class="form-control">
                                                                @else
                                                                    <input name="trackNo" type="text"
                                                                        value="{{ $operdata['trackNo'] }}" maxlength="100"
                                                                        id="trackNo" class="form-control">
                                                                @endif
                                                                <label class="error" for="trackNo"></label>
                                                            </div>
                                                        </td>
                                                    </tr>
                                                    <!-- 欄位:說明 -->
                                                    <!-- ALL Mode -->
                                                    <tr>
                                                        <td class="header-require col-xl-2">trackTitle</td>
                                                        <td>
                                                            <div class="col-xl-3 nopadding">
                                                                @if ($operdata == "")
                                                                    <input name="trackTitle" type="text" value="" maxlength="500"
                                                                        id="trackTitle"
                                                                        class="form-control">
                                                                @else
                                                                    <input name="trackTitle" type="text"
                                                                        value="{{ $operdata['trackTitle'] }}"
                                                                        maxlength="500" id="trackTitle" class="form-control">
                                                                @endif
                                                                <label class="error" for="trackTitle"></label>
                                                            </div>
                                                        </td>
                                                    </tr>
                                                    <!-- 欄位:說明 -->
                                                    <!-- ALL Mode -->
                                                    <tr>
                                                        <td class="header-require col-xl-2">trackLimit</td>
                                                        <td>
                                                            <div class="col-xl-3 nopadding">
                                                                @if ($operdata == "")
                                                                    <input name="trackLimit" type="text" value="" maxlength="500"
                                                                        id="trackLimit"
                                                                        class="form-control">
                                                                @else
                                                                    <input name="trackLimit" type="text"
                                                                        value="{{ $operdata['trackLimit'] }}"
                                                                        maxlength="500" id="trackLimit" class="form-control">
                                                                @endif
                                                                <label class="error" for="trackLimit"></label>
                                                            </div>
                                                        </td>
                                                    </tr>
                                                </tbody>
                                            </table>
                                        
                                            <hr>
                                        </div>
                                    </td>
                                </tr>
                                <!-- 下控制按鈕 -->
                                <tr>
                                    <td> </td>
                                    <td>
                                        <div style="text-align: right">
                                            <input type="button" id="btnSave" value="儲存" class="btn btn-primary" style="margin-right: 5px;">
                                            <input type="button" id="btnBackToList" value="返回" class="btn btn-secondary">
                                        </div>
                                    </td>
                                </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </form>
        </div>
    </div>
    <div id="ajax-spinner" style="display:none;">
        <img src="{{ asset('assets/images/backend_spinner.svg') }}" />
    </div>
    <link rel="stylesheet" href="{{url('assets/resize-controller/project/resizeControl.css')}}">
    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
    <style>
        /* --------------- 全域 --------------- */
        .msgTemplate div.form-group _form-group {
            margin: 0;
        }
        .tab-content {
            -webkit-box-shadow: none;
            -moz-box-shadow: none;
            box-shadow: none;
        }
        /* --------------- Imagemap --------------- */
        .imagemap-model-small-container {
            display: flex;
            flex-wrap: wrap;
        }
        .imagemap-model-small-container .imagemap-model-small {
            width: 80px;
            height: 55px;
            margin: 10px;
        }
        .imagemap-model-small-container .table {
            width: 100%;
            height: 100%;
            cursor: pointer;
        }
        .imagemap-model-small-container .table td {
            background-color: #cecece;
            color: #ffffff;
            border: 1px solid #858484;
        }
        .imagemap-model-small-container > .imagemap-model-small.active td {
            border-color: #6c62f3;
            border-width: 2px;
        }
        /* --------------- imagemap-model --------------- */
        .imagemap-model {
            width: 240px;
            height: 166px;
        }
        .imagemap-model > table {
            width: 100%;
            height: 100%;
            text-align: center;
        }
        .imagemap-model > table > tbody td {
            background-color: #bfbfbf;
            color: #ffffff;
            vertical-align: middle;
        }
        .imagemap-model > table > tbody td.active {
            background-color: #58ae58;
        }
        .imagemap-model > table > tbody td:not(.active):hover {
            background-color: #898989c9;
            cursor: default;
        }
        /* --------------- uri 綁定標籤 ----------------- */
        .select2-container--default .select2-selection--multiple .select2-selection__choice {
            background-color: #5897fb;
            border-radius: 10px;
            color: white;
            padding-top: 5px;
            padding-bottom: 5px;
        }
        .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
            border-right: unset;
            color: #fff;
            font-size: 1.2em;
            left: 1px;
            top: 3px;
        }
        .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover, .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus {
            background-color: #5897fb;
            color: #fff;
        }
        .select2-selection.select2-selection--multiple {
            min-height: 24px;
        }
        .select2-container--default .select2-search--inline .select2-search__field {
            min-height: 24px;
            font-size: 14px;
        }
        /* --------------- AJAX upload --------------- */
        .image-preview-wrapper{
            position: relative;
            cursor: pointer;
        }
        .spinner-wrapper {
            position: absolute;
            opacity: 0;
            margin: 0;
            padding: 0;
            /*left: 50%;*/
            /*top: 50%;*/
            transform: translate(-50%, -50%);
            width: 100px;
            height: 100px;
            background-image: url(/assets/images/backend_spinner.svg);
            background-size: 50px;
            background-repeat: no-repeat;
            background-position: center;
        }
        .opacity-1 {
            opacity: 1;
        }
    </style>
@endsection
@section('extjs')
    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
    <script src="{{url('assets/js/jquery.mousewheel-3.0.6.min.js')}}"></script>
    <script src="{{url('assets/js/jquery.mCustomScrollbar.min.js')}}"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.18.1/babel.min.js"></script>
    <script src="{{url('assets/resize-controller/project/index.js')}}"></script>
    <script>
        var imagemapBoxes = {};
        $(document).ready(function () {
            // 下控制按鈕 儲存
            $("#btnSave").click(function () {
                
                finishEdit();
            });
            // 下控制按鈕 返回
            $("#btnBackToList").click(function () {
                location.href = '/backend/dataManagement/track';
            });
            // 註冊事件
            eventImagemap();
            eventUriAction();
        });
        function restoreMsgInfo(msgInfo) {
            // 初始化
            var tabId = 'tab1';
            var menuInfoObj = JSON.parse(msgInfo).menuInfo;
            // console.log(menuInfoObj);
            // var menuFlag = menuInfoObj.menuFlag;
            // var modelType = menuInfoObj.modelType;
            // var chatBarText = menuInfoObj.chatBarText;
            // var displayByDefault = menuInfoObj.displayByDefault;
            var imgUrl = menuInfoObj.imgUrl;
            // var imgSize = menuInfoObj.imgSize;
            // var imagemapActions = menuInfoObj.actions;
            // 還原內容
            $('#'+tabId+'MenuFlag').val(menuFlag);
            $("#"+tabId+"ImagemapModelType").val(modelType);
            $("#chatBarText").val(chatBarText);
            if (!displayByDefault) {
                $("input[name='displayByDefault']").filter('[value="0"]').prop('checked', true);
            }
            $("img[data-target='"+tabId+"-image-preview-imagemapImg']").attr("src", imgUrl);
            // 點擊 選擇的版型
            // trigger: $('.imagemap-model-small').click()
            var $chosen_model = $("#imgmapcontent-"+tabId).find('.imagemap-model-small').filter("[data-model_type='"+modelType+"']");
            if (modelType === 'mcustom') {
                $chosen_model.trigger('click', [menuInfoObj]);
            } else {
                $chosen_model.click();
            }
            if (modelType == 'mjson') {
                // todo 重新組合 ImagemapJson
                var imagemapJson = '';
                $("#"+tabId+"ImagemapJson").val(imagemapJson);
            } else {
                // 還原 每個按鈕的值
                $.each(imagemapActions, function(i, actionObj) {
                    var btnNum = i + 1;
                    $("#"+tabId+"Imagemapbtn"+btnNum+"Act").val(actionObj.type);
                    $("#"+tabId+"Imagemapbtn"+btnNum+"Act").trigger('change'); // 觸發事件切換按鈕N動作
                    $("#"+tabId+"Imagemapbtn"+btnNum+"Content").val(actionObj.content);
                    // 前往選單
                    if (actionObj.type == 'richmenu') {
                        $("#"+tabId+"Imagemapbtn"+btnNum+"Submenu").val(actionObj.content);
                        $("#"+tabId+"Imagemapbtn"+btnNum+"Submenu").trigger('change');
                        if ('keywordValue' in actionObj) {
                            $("#"+tabId+"Imagemapbtn"+btnNum+"Content").attr('data-keyword_value', actionObj.keywordValue);
                        }
                    }
                    // 貼標 (開啟連結)
                    if ('tags' in actionObj) {
                        $("#"+tabId+"Imagemapbtn"+btnNum+"Tags").val(actionObj.tags);
                        $("#"+tabId+"Imagemapbtn"+btnNum+"Tags").trigger('change');
                    }
                });
            }
        }
        
        // 完成編輯
        function finishEdit() {
            var msgInfoObj = msgInfo();
            // console.log(msgInfoObj);
            // return;
            if ('err' in msgInfoObj) {
                alert("有錯誤:\n" + msgInfoObj.err.join("\n"));
                return;
            }
            $.blockUI({
                message: $('#ajax-spinner'),
                css: {
                    backgroundColor: 'transparent',
                    border: '0'
                },
            });
            $.ajax({
                type: "POST",
                url: '/backend/dataManagement/track/store',
                data: {
                    "operateMode": $("#operateMode").val(),
                    "trackNo": $("#trackNo").val(),
                    "trackTitle": $("#trackTitle").val(),
                    "trackLimit": $("#trackLimit").val(),
                    "_token":"{{ csrf_token() }}",
                    "id": $("#id").val(),
                },
                success: function(result) {
                    
                    if (result.code === 0) {
                        alert('儲存成功');
                        location.href = '/backend/dataManagement/track';
                    } else {
                        alert(result.message);
                        alert('123');
                    }
                },
                fail: function(jqXHR, textStatus) {
                    console.log(jqXHR);
                    console.log(textStatus);
                },
                complete: function() {
                    $.unblockUI();
                }
            });
        }
        function eventImagemap() {
            // 選擇版型
            $('.imagemap-model-small').unbind("click");
            $('.imagemap-model-small').click(function (event, imagemapContent) {
                var $model_small = $(this);
                var $model_small_container = $model_small.parent('.imagemap-model-small-container');
                var $imagemap_content = $model_small.closest('div[id^="imgmapcontent-tab"]');
                var $imagemap_btns = $imagemap_content.children('.imagemap-btn'); // 此頁籤下所有按鈕區域
                var tabNum = 1;
                var tabId = 'tab'+tabNum;
                var modelType = $model_small.attr('data-model_type');
                var imgSizeObj = JSON.parse($('#'+tabId+'ImagemapImgSize').val());
                // 三種版型類型的容器
                var $imagemap_model = $imagemap_content.find('.imagemap-model');
                var $custom_container = $('#'+tabId+'ImagemapBoxContainer');
                var $json_container = $('#'+tabId+'ImagemapJson').closest('div.row');
                if ($model_small.hasClass('active')) {
                    return;
                }
                // 設定選擇的 active
                $model_small_container.find('.imagemap-model-small').removeClass('active');
                $model_small.addClass('active');
                // 設定 model type
                $('#'+tabId+'ImagemapModelType').val(modelType);
                imagemapClearBtns($imagemap_btns, tabId);
                if (modelType == 'mjson') {
                    $imagemap_model.hide();
                    $custom_container.hide();
                    $json_container.show();
                    $imagemap_btns.hide();
                }
                else if (modelType == 'mcustom') {
                    $imagemap_model.hide();
                    $custom_container.show();
                    $json_container.hide();
                    var boxNum = 1; // ImagemapBox1
                    // 要等 ImagemapBox HTML 完全顯示才能繪製,所以等 300ms 才初始化
                    setTimeout(function() {
                        imagemapInitBox(tabNum, boxNum, imgSizeObj, imagemapContent);
                        // 設定背景圖案 (initImagemapBox 後才能設定)
                        var imagemapUrl = $('img[data-target="'+tabId+'-image-preview-imagemapImg"]').attr('src');
                        $('#ImagemapBox'+boxNum).css('background-image', 'url(' + imagemapUrl + ')');
                    }, 300);
                }
                else {
                    $imagemap_model.show();
                    $custom_container.hide();
                    $json_container.hide();
                    // 建立對應的 imagemap-model
                    $imagemap_model.children('.table').remove();
                    $model_small.children('.table').clone(false).appendTo($imagemap_model);
                    $imagemap_model.find('td').each(function (index) {
                        var btnNum = index + 1;
                        if (btnNum === 1) $(this).addClass('active');
                        $(this).html('按鈕'+btnNum);
                        $(this).attr('data-btn', btnNum);
                    });
                }
            });
            // 編輯按鈕區域
            $('.imagemap-model').unbind("click");
            $('.imagemap-model').on('click', 'td', function () {
                var $clicked_td = $(this);
                var $table = $clicked_td.closest('.table');
                var $imagemap_content = $clicked_td.closest('div[id^="imgmapcontent-tab"]');
                var tabNum = '1';
                var btnNum = $clicked_td.attr('data-btn');
                // 設定選擇的 active
                $table.find('td').removeClass('active');
                $clicked_td.addClass('active');
                // 顯示對應按鈕
                $imagemap_content.find('.imagemap-btn').hide();
                $('#tab'+'1'+'Imagemapbtn'+btnNum).show();
            });
            // 切換 按鈕N動作
            $('.imagemap-btn').find('select.imagemapBtnAct').unbind("change");
            $('.imagemap-btn').find('select.imagemapBtnAct').change(function () {
                var tabNum = 1;
                var btnNum = $(this).attr('id').split('Imagemapbtn')[1].replace(/\D/g, ''); // tab1Imagemapbtn1Act
                var type = $(this).val();
                var $btnContent = $('#tab1Imagemapbtn'+btnNum+'Content');
                var $btnSubmenu = $('#tab1Imagemapbtn'+btnNum+'Submenu');
                var $btnTags = $('#tab1Imagemapbtn'+btnNum+'Tags');
                // 清空
                $btnContent.val('');
                $btnSubmenu.val(0);
                $btnTags.val(null).trigger('change');
                // 顯示按鈕對應的元件
                imagemapShowBtnInputsByAction(type, $btnContent, $btnTags, $btnSubmenu);
            });
        }
        function eventUriAction() {
            $('.js-example-basic-multiple').select2({
                placeholder: '請選擇或輸入以搜尋標籤'
            });
        }
        function msgInfo() {
            var result = {
                menuInfo: {},
                err: []
            };
            var msgObj = {};
            var tabNum = '1';
            var tabId = 'tab' + tabNum;
            // 取資料
            var menuFlag = $('#'+tabId+'MenuFlag').val();
            var modelType = $("#"+tabId+"ImagemapModelType").val();
            var imgUrl = $("img[data-target$='"+tabId+"-image-preview-imagemapImg']").attr("src");
            var json = $("#"+tabId+"ImagemapJson").val();
            var menuTitle = $("#menuTitle").val();
            var chatBarText = $("#chatBarText").val();
            var displayByDefault = $("input[name='displayByDefault']:checked").val();
            // 檢查
            if (menuTitle === '') result.err.push('標題內容為空');
            if (imgUrl === '/assets/images/placeholder_upload_380_260.png') result.err.push('圖片沒上傳');
            if (modelType == 'mjson' && json === '') result.err.push('JSON內容為空');
            if (chatBarText === '') result.err.push('選單顯示名稱為空');
            var imagemapActions = '';
            if (modelType == 'mjson') {
                // todo msgInfoImagemapActionsFromJson(json)
                imagemapActions = '';
            } else if (modelType == 'mcustom') {
                imagemapActions = msgInfoImagemapActions(tabNum, modelType, result);
            } else { // 預設版型
                imagemapActions = msgInfoImagemapActions(tabNum, modelType, result);
            }
            msgObj = {
                // menuFlag: menuFlag,
                // modelType: modelType,
                // name: menuTitle,
                // chatBarText: chatBarText,
                // displayByDefault: !!parseInt(displayByDefault),
                imgUrl: imgUrl,
                // imgSize: {
                //     "width": 800,
                //     "height": 800
                // },
                // actions: imagemapActions,
            };
            result.menuInfo = msgObj;
            if (result.err.length === 0) {
                delete result.err;
            }
            return result;
        }
        function msgInfoImagemapActions(tabNum, modelType, result) {
            var tabId = 'tab'+tabNum;
            var areas = [];
            if (modelType == 'mcustom') {
                areas = imagemapBoxes[tabNum].getResultPos();
            } else if (modelType != 'mjson') {
                // 樣板按鈕區域定義 (依照頁面顯示的按鈕順序)
                var modelAreaMap = {
                    "m1": [
                        {"x": 0, "y": 0, "width": 833, "height": 843},
                        {"x": 833, "y": 0, "width": 833, "height": 843},
                        {"x": 1666, "y": 0, "width": 834, "height": 843},
                        {"x": 0, "y": 843, "width": 833, "height": 843},
                        {"x": 833, "y": 843, "width": 833, "height": 843},
                        {"x": 1666, "y": 843, "width": 834, "height": 843},
                    ],
                    "m2": [
                        {"x": 0, "y": 0, "width": 1250, "height": 843},
                        {"x": 1250, "y": 0, "width": 1250, "height": 843},
                        {"x": 0, "y": 843, "width": 1250, "height": 843},
                        {"x": 1250, "y": 843, "width": 1250, "height": 843},
                    ],
                    "m3": [
                        {"x": 0, "y": 0, "width": 2500, "height": 843},
                        {"x": 0, "y": 843, "width": 833, "height": 843},
                        {"x": 833, "y": 843, "width": 833, "height": 843},
                        {"x": 1666, "y": 843, "width": 834, "height": 843},
                    ],
                    "m4": [
                        {"x": 0, "y": 0, "width": 1250, "height": 1686},
                        {"x": 1250, "y": 0, "width": 1250, "height": 843},
                        {"x": 1250, "y": 843, "width": 1250, "height": 843},
                    ],
                    "m5": [
                        {"x": 0, "y": 0, "width": 2500, "height": 843},
                        {"x": 0, "y": 843, "width": 2500, "height": 843},
                    ],
                    "m6": [
                        {"x": 0, "y": 0, "width": 1250, "height": 1686},
                        {"x": 1250, "y": 0, "width": 1250, "height": 1686},
                    ],
                    "m7": [
                        {"x": 0, "y": 0, "width": 2500, "height": 1686},
                    ]
                };
                areas = modelAreaMap[modelType];
            }
            var actions = [];
            for (var btnNum = 1; btnNum <= areas.length; btnNum++) {
                var btnId = 'btn'+btnNum;
                var type = $("#"+tabId+"Imagemap"+btnId+"Act").val();
                var content = $("#"+tabId+"Imagemap"+btnId+"Content").val();
                var submenuId = $("#"+tabId+"Imagemap"+btnId+"Submenu").val();
                var tagsData = $("#"+tabId+"Imagemap"+btnId+"Tags").select2('data');
                var area = areas[btnNum-1];
                if (type != 'richmenu' && content === '') result.err.push('按鈕'+btnNum+'的內容為空');
                if (type == 'uri'
                    && !content.startsWith('https://')
                    && !content.startsWith('tel:')
                    && !content.startsWith('line://')
                ) {
                    result.err.push('按鈕'+btnNum+'的連結網址須為 https:// 或 tel:// 或 line://');
                }
                var action = {
                    "type": type,
                    "content": content,
                    "area": {
                        "x": area.x,
                        "y": area.y,
                        "width": area.width,
                        "height": area.height
                    }
                };
                if (type == 'uri' && tagsData.length !== 0) { // uri 貼標
                    var tags = [];
                    $.each(tagsData, function(i, item) {
                        tags.push(item.id);
                    });
                    action.tags = tags;
                } else if (type == 'richmenu') { // 前往子選單
                    action.content = submenuId;
                    var keywordValue = $("#"+tabId+"Imagemapbtn"+btnNum+"Content").attr('data-keyword_value');
                    if (typeof keywordValue === 'undefined') {
                        var menuFlag = $('#tab1MenuFlag').val();
                        keywordValue = 'richmenu-' + menuFlag.replace(/menu-/g, '') + '-' + Date.now();
                    }
                    action.keywordValue = keywordValue;
                }
                actions.push(action);
            }
            // console.log(actions);
            return actions
        }
        function generateFlag(length) {
            var result = '';
            var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
            var charactersLength = characters.length;
            for ( var i = 0; i < length; i++ ) {
                result += characters.charAt(Math.floor(Math.random() * charactersLength));
            }
            return result;
        }
        function imagemapInitBox(tabNum, boxNum, imgSizeObj, imagemapContent) {
            let imagemapBox;
            var mapData = null;
            // console.log(imagemapContent);
            if (typeof imagemapContent !== 'undefined') {
                mapData = imagemapContent;
            }
            imagemapBox = new resizer({
                container: '#ImagemapBox'+boxNum,
                wrap: imgSizeObj,
                wrapperWidth: 380,
                itemDefaultSize: 380,
                add: '#AddImagemapBox'+boxNum,
                delete: {
                    selector: '#DeleteImagemapBox'+boxNum,
                    getDelete: function(res) {
                        // console.log(res);
                        var btnNum = res.index + 1;
                        var tabId = 'tab'+tabNum;
                        // 重設按鈕的值 (從刪除的下一個的開始往前遞補)
                        for (btnNum; btnNum < 12; btnNum++) {
                            var nextNum = btnNum + 1;
                            var $currentAct = $('#'+tabId+'Imagemapbtn'+btnNum+'Act');
                            var $currentContent = $('#'+tabId+'Imagemapbtn'+btnNum+'Content');
                            var $currentSubmenu = $('#'+tabId+'Imagemapbtn'+btnNum+'Submenu');
                            var $currentTags = $('#'+tabId+'Imagemapbtn'+btnNum+'Tags');
                            var $nextAct = $('#'+tabId+'Imagemapbtn'+nextNum+'Act');
                            var $nextContent = $('#'+tabId+'Imagemapbtn'+nextNum+'Content');
                            var $nextSubmenu = $('#'+tabId+'Imagemapbtn'+nextNum+'Submenu');
                            var $nextTags = $('#'+tabId+'Imagemapbtn'+nextNum+'Tags');
                            // 內容
                            $currentAct.val($nextAct.val());
                            $currentContent.val($nextContent.val());
                            $currentSubmenu.val($nextSubmenu.val());
                            // 標籤
                            var nextTagsData = $nextTags.select2('data');
                            if (nextTagsData.length !== 0) {
                                var nextTags = [];
                                $.each(nextTagsData, function(i, item) {
                                    nextTags.push(item.id);
                                });
                                $currentTags.val(nextTags);
                                $currentTags.trigger('change');
                            }
                            // 顯示按鈕對應的元件
                            imagemapShowBtnInputsByAction($currentAct.val(), $currentContent, $currentTags, $currentSubmenu);
                        }
                        // 清除最後一個按鈕
                        $('#'+tabId+'Imagemapbtn12Act').val('postback'); // richmenu 預設
                        $('#'+tabId+'Imagemapbtn12Content').val('');
                        $('#'+tabId+'Imagemapbtn12Submenu').val(0);
                        $('#'+tabId+'Imagemapbtn12Tags').val(null).trigger('change');
                        // 顯示最後一個按鈕對應的元件
                        imagemapShowBtnInputsByAction('postback', $('#'+tabId+'Imagemapbtn12Content'), $('#'+tabId+'Imagemapbtn12Tags'), $('#'+tabId+'Imagemapbtn12Submenu'));
                    }
                },
                get: '#GetImagemapBox'+boxNum,
                map: mapData,
                getActive: function(res) {
                    // console.log(res);
                    var $imagemapContent = $('#imgmapcontent-tab'+tabNum);
                    var btnNum = res.index + 1;
                    // 顯示對應按鈕
                    $imagemapContent.find('.imagemap-btn').hide();
                    $('#tab'+tabNum+'Imagemapbtn'+btnNum).show();
                }
            });
            imagemapBoxes[tabNum] = imagemapBox;
        }
        function imagemapShowBtnInputsByAction(action, $btnContent, $btnTags, $btnSubmenu) {
            if (action == 'uri') {
                $btnContent.closest('div[class="row"]').show();
                $btnTags.closest('div[class="row"]').show();
                $btnSubmenu.closest('div[class="row"]').hide();
            } else if (action == 'richmenu') {
                $btnContent.closest('div[class="row"]').hide();
                $btnTags.closest('div[class="row"]').hide();
                $btnSubmenu.closest('div[class="row"]').show();
            } else {
                $btnContent.closest('div[class="row"]').show();
                $btnTags.closest('div[class="row"]').hide();
                $btnSubmenu.closest('div[class="row"]').hide();
            }
        }
        function imagemapClearBtns($imagemap_btns, tabId) {
            var $btnContents = $imagemap_btns.find('.imagemapBtnContent');
            var $btnActs = $imagemap_btns.find('.imagemapBtnAct');
            var $btnSubmenus = $imagemap_btns.find('select.imagemapBtnSubmenu');
            var $btnTags = $imagemap_btns.find('.imagemapBtnTags');
            // 清除按鈕區域內容
            $btnContents.val('');
            $btnActs.val('postback'); // richmenu 預設
            $btnSubmenus.val(0)
            $btnTags.val(null).trigger('change');
            // 顯示按鈕對應的元件 (這邊是一次設定所有按鈕下所有元件)
            imagemapShowBtnInputsByAction('postback', $btnContents, $btnTags, $btnSubmenus);
            // 顯示按鈕1
            $imagemap_btns.hide();
            $('#'+tabId+'Imagemapbtn1').show();
        }
        // AJAX 上傳圖片/影片
        // http://arsee88.blogspot.com/2020_09_20_archive.html
        var imagePreview = [];
        var spinner = [];
        var fileUploader = [];
        // 註冊上傳圖片的功能(可以重複註冊)
        var imagemapImgId = 'imagemapImg' + '1';
        imagePreview[imagemapImgId] = document.querySelector('[data-target="tab'+'1'+'-image-preview-imagemapImg"]');
        spinner[imagemapImgId] = document.querySelector('[data-target="tab'+'1'+'-spinner-imagemapImg"]');
        fileUploader[imagemapImgId] = document.querySelector('[data-target="tab'+'1'+'-file-uploader-imagemapImg"]');
        fileUploader[imagemapImgId].addEventListener("change", handleFileUpload);
        // File input 上傳檔案時綁定的處理函式
        async function handleFileUpload(e) {
            e.preventDefault();
            var $file_uploader = $(this);
            var splitItems = $file_uploader.attr('id').split('-');
            // tab1-file-uploader-imagemapImg
            var msgType = splitItems[splitItems.length-1]; // lastItem
            console.log(msgType);
            var msgNum = '1';
            var itemId = msgType + msgNum;
            console.log(itemId);
            try {
                const file = e.target.files[0];
                if (!file) {
                    return;
                }
                setUploading(true, itemId);
                // 檢查
                const beforeUploadCheck = await checkBeforeUpload(file, msgType, msgNum);
                if (!beforeUploadCheck.isValid) throw beforeUploadCheck.errorMessages;
                // 上傳
                const arrayBuffer = await getArrayBuffer(file);
                var response = await uploadFileAJAX(arrayBuffer);
                alert("上傳成功");
                setUploading(false, itemId);
                showPreviewImage(response.url, itemId);
                // 更新 ImagemapBox
                var $imgPreview = $(imagePreview[itemId]);
                if ($imgPreview.attr('data-target').indexOf('imagemap') !== -1) {
                    $imgPreview.closest('#imgmapcontent-tab1').find('.imagemapBox').css('background-image', 'url(' + response.url + ')');
                }
            } catch (error) {
                setUploading(false, itemId);
                alert(error);
                console.log("上傳失敗: ", error);
            } finally {
                e.target.value = '';
            }
        }
        // If you prefer Base64 image, use "FileReader.readAsDataURL"
        function showPreviewImage(url, itemId) {
            imagePreview[itemId].src = url;
        }
        // Change file object into ArrayBuffer
        function getArrayBuffer(fileObj) {
            return new Promise((resolve, reject) => {
                const reader = new FileReader();
                // Get ArrayBuffer when FileReader on load
                reader.addEventListener("load", () => {
                    resolve(reader.result);
                });
                // Get Error when FileReader on error
                reader.addEventListener("error", () => {
                    reject("error occurred in getArrayBuffer");
                });
                // read the blob object as ArrayBuffer
                // if you nedd Base64, use reader.readAsDataURL
                reader.readAsArrayBuffer(fileObj);
            });
        }
        // Use "new Uint8Array()"" to change ArrayBuffer into TypedArray (TypedArray is not a truly Array)
        // Use "Array.from()" to change it into Array
        function uploadFileAJAX(arrayBuffer) {
            return fetch("{{ env('APP_URL') }}/backend/dataManagement/eLecturerTeachersList/saveImg", {
                headers: {
                    version: 1,
                    "content-type": "application/json"
                },
                method: "POST",
                body: JSON.stringify({
                    image: Array.from(new Uint8Array(arrayBuffer))
                })
            })
                .then(res => {
                    if (!res.ok) {
                        throw res.statusText;
                    }
                    return res.json();
                })
                .then(data => data)
                .catch(err => console.log("err", err));
        }
        function checkBeforeUpload(fileObject, msgType, msgNum) {
            return new Promise(resolve => {
                let errorMessages = [];
                // isValidFileType
                const validFileTypes = ["image/jpeg", "image/png" ];
                const isValidFileType = validFileTypes.includes(fileObject.type);
                if (!isValidFileType) {
                    errorMessages.push("只支援 JPG / PNG 格式圖片");
                    resolve({
                        isValid: isValidFileType,
                        errorMessages: errorMessages.join("\n")
                    });
                    return;
                }
                // isValidFileSize
                const isValidFileSize = (fileObject.size / 1024 / 1024) < 1; // 1 MB
                if (!isValidFileSize) {
                    errorMessages.push("圖片最大 1MB");
                }
                
                // isValidDimension
                var isValidDimension = true;
                const dim = Promise.resolve(getImageSize(fileObject));
                dim.then(function(result) {
                    switch (msgType)
                    {
                        case "imagemapImg":
                            if (result.width != 800 || result.height != 800) {
                                errorMessages.push("圖片尺寸必須為 800x800");
                                isValidDimension = false;
                            }
                            break;
                    }
                    resolve({
                        isValid: isValidFileType && isValidFileSize && isValidDimension,
                        errorMessages: errorMessages.join("\n")
                    });
                });
            });
        }
        function setUploading(isUploading, itemId) {
            if (isUploading === true) {
                spinner[itemId].classList.add("opacity-1");
            } else {
                spinner[itemId].classList.remove("opacity-1");
            }
        }
        function getImageSize(file) {
            return new Promise((resolve, reject) => {
                var _URL = window.URL || window.webkitURL;
                var img = new Image();
                img.onload = () => resolve({ height: img.height, width: img.width });
                img.onerror = reject;
                img.src = _URL.createObjectURL(file);
            });
        }
    </script>
@endsection
 |