惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - Tonyyang

【XAF】如何通过前缀或自定义架构将数据库表与内置系统表分开 Power Shell 7 和5.1 批量给pdf添加页码 [XAF] Declare Conditional Appearance Rules in Code DataTableHelper C# 多任务数据同步 【原】 XAF Localization改用百度翻译 C#百度翻译--亲测试可用 SqlQueryDynamic BOM导入 C#上传到FTP Server FREE OFFER - .NET App Security API (Role-based Access Control) 后台管理框架 Model to Model JSON序列化和反序列化日期时间的处理 Asp.net MVC 上传文件 EXT.NET Combox下拉Grid 转 Refresh Excel Pivot Tables Automatically Using SSIS Script Task SQL Server Integration Services SSIS最佳实践 PowerBI
Asp.net MVC bootstrap 穿梭框
Tonyyang · 2021-08-19 · via 博客园 - Tonyyang

0.功能预览

1.前端Html代码:要引入
Vue.js
jquery.min.js

jqueryUi.js

queryUiTouch.js
bootstrap.min.js

 <div class="FormSystem ol-12 col-md-3">
                    @*<label for="lblOperator">保養人員</label>
                    <select id="selOperator" class="form-control" onchange=""></select>*@
                    <label id="lblConcurredApprover1">保養人員</label><span style="color: red" class="start">*</span>
                    <div class="input-group" id="divConcurredApprover1">
                        <input type="text" id="txtDept" disabled="disabled" placeholder="保養人員選擇" aria-label="保養人員選擇" oninput="TestDeptIDs()"
                               aria-describedby="basic-addon1"
                               data-panel="panel1" data-label="lblConcurredApprover1" data-div="divConcurredApprover1"
                               class="form-control mustEnter">
                        <div class="input-group-append">
                            <button type="button" class="btn  btn-primary inputButton concur"
                                    onclick="seletDept('txtDept'); return false;">
                                <i class="fas fa-search"></i>
                            </button>
                        </div>
                        <div style="display: none;">
                            <input type="text" id="selecteditem1" value="[]" />
                        </div>
                    </div>
                </div>    

<!--穿梭框-->
<div class="modal fade" id="transferBox" style="display:none">
    <div class="modal-dialog">
        <div class="modal-content">
            <!-- Modal Header -->
            <div class="modal-header">
                <h4 class="modal-title fontBold" id="modelTitle">{{title}}</h4>
                <button type="button" class="close" data-dismiss="modal">×</button>
            </div>
            <!-- Modal body -->
            <div class="modal-body">
                <div class="modalContent">
                    <div class="mfsTitle" v-show="IsShowSearchBlock">
                        <div class="input-group">
                            <input id="input1" type="text" aria-label="Text input with dropdown button" class="form-control" v-model="searchtext" v-on:keydown="onSearchTextKeyDown">
                            <div class="input-group-append ">
                                <button type="button" class="btn btnBlue inputButton rounded" v-on:click="onBtnSearchClick"><i class="fas fa-search"></i></button>
                            </div>
                        </div>
                    </div>
                    <div class="transferBoxSection">
                        <div>
                            <div class="h4 fontBold clearfix">
                                <button class="btn btnBlue float-right m-0 transferredAll"
                                        data-transfer-from="#transferA" data-transfer-to="#transferB" v-show="IsShowSelectAll" v-on:click="onTransferAllClick">
                                    Select All
                                </button>
                            </div>
                            <ul id="transferA" class="moveable transferSortable">
                                <li class="ui-state-default" v-for="sitem in sourceItems" data-dept-id="sitem.DEPTID">{{sitem.Text}}({{sitem.Value}})</li>
                            </ul>
                        </div>
                        <div class="btnInCenter">
                            <button v-on:click="onTransferClick" data-transfer-from="#transferA" data-transfer-to="#transferB" class="btnBlue" v-show="IsShowRight"><i class="fas fa-arrow-right" style="margin: auto;" data-transfer-from="#transferA" data-transfer-to="#transferB"></i></button>
                            <button v-on:click="onTransferClick" data-transfer-from="#transferB" data-transfer-to="#transferA" class="btnBlue" v-show="IsShowLeft"><i class="fas fa-arrow-left" style="margin: auto;" data-transfer-from="#transferB" data-transfer-to="#transferA"></i></button>
                        </div>
                        <div>
                            <div class="h4 fontBold clearfix">
                                <button class="btn btnBlue float-right m-0 untransferredAll"
                                        data-transfer-from="#transferB" data-transfer-to="#transferA" v-show="IsShowCancelAll" v-on:click="onTransferAllClick">
                                    Delete All
                                </button>
                            </div>
                            <ul id="transferB" class="moveable transferSortable">
                                <li class="ui-state-default" v-for="titem in selectItems" data-dept-id="titem.DEPTID">{{titem.Text}}({{titem.Value}})</li>
                            </ul>
                        </div>
                    </div>
                    <div class="center">

                        <button class="btnBlue okBtn btn" id="btnSelectDeptOk" v-on:click="onBtnOkClick" v-show="IsShowOK">OK</button>
                        <button class="btnWhite btn" data-dismiss="modal">Close</button>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

2.JS代码

<script type="text/javascript">
    function seletDept(controlName) {
        var txtObj = $('#' + controlName);//txt obj
        var selectJsonObj = (txtObj.data('obj') ? txtObj.data('obj') : '[]');//已經選定的人員,第一次時為空
        var title = txtObj.attr('placeholder'); //要顯示的彈跳視窗title
        var datasource = "";
        var deptName = $('#input1').val();
        $.ajax({
            url: '@Url.Action("GetQStaffList")',
            type: 'post',
            data: {
                deptName: deptName
            },
            dataType: "text",
            async: false,
            success: function (data) {
                var obj = JSON.parse(data);
                datasource = JSON.stringify(obj);
            }
        });
        $transfervm.Init(title, '', function (item) {
            var txt = "";
            //選擇框內容
            $("#transferB li").each(function () {
                var self= $(this);
                txt += self.text() + ";";
            });
            txtObj.val(txt);
            return true;
        }, null, datasource, selectJsonObj, false)
    }

    var $transfervm = new Vue({
        el: "#transferBox",
        mounted: function () {
            $("#transferA, #transferB").sortable({
                connectWith: ".transferSortable"
            }).disableSelection();
            $("#transferA, #transferB").on("sortreceive", this.onSortReceiveEvent);
            $("#transferB").on("sortstop", this.refreshData);
            $(".transferSortable").on("click", "li", function () {
                $(this).toggleClass("selected");
            });
        },
        data: function () {
            return {
                title: "",
                searchtext: "",
                IsShowSelectAll: true,
                IsShowCancelAll: true,
                IsShowLeft: true,
                IsShowRight: true,
                IsShowSearchBlock: true,
                IsShowOK: true,
                IsDisableSearch: false,
                Single: false,
                ButtonOKClick: null,
                ButtonSearchClick: null,
                sourceItems: [],
                selectItems: []
            }
        },
        watch: {
            Single: function () {
                this.IsShowSelectAll = this.IsShowCancelAll = !this.Single;
            },
            selectItems: function (value) {
            }
        },
        methods: {
            onBtnOkClick: function () {
                try {
                    if (typeof this.ButtonOKClick === "function") {
                        if (this.ButtonOKClick(this.selectItems))
                            $("#transferBox").modal('hide');
                    }
                    else {
                        $("#transferBox").modal('hide');
                    }
                    //TestDeptIDs()
                }
                catch (e) {
                    alertError('Run OK Button', e.message);
                }
                return setReturnFalse();
            },
            onSearchTextKeyDown: function (event) {
                if (event.keyCode === 13) {
                    this.onBtnSearchClick();
                    return setReturnFalse();
                }
            },
            onBtnSearchClick: function () {
                //$("#transferBox").modal('hide');
                this.IsDisableSearch = false;
                if (!this.IsDisableSearch) {
                    this.IsDisableSearch = !this.IsDisableSearch;
                    var deptName = $('#input1').val();
                    var datasource = "";
                    //部門
                    $.ajax({
                        url: '@Url.Action("GetQStaffList")',
                        type: 'post',
                        data: {
                            deptName: deptName
                        },
                        dataType: "text",
                        async: false,
                        success: function (data) {
                            this.sourceItems = [];
                            this.selectItems = [];
                            var obj = JSON.parse(data);
                            datasource = JSON.stringify(obj);

                            //this.IsDisableSearch = !this.IsDisableSearch;
                        }
                    });
                    this.sourceItems = JSON.parse(datasource);
                    //this.selectItems = JSON.parse([]);
                    //$("#transferBox").modal('hide');
                    //$("#transferBox").modal('show');
                }
                return setReturnFalse();
            },
            onSortReceiveEvent: function (event, ui) {
                var from;
                var to;
                if (ui.sender[0].id === "transferA") { from = "#transferA"; to = "#transferB"; }
                else { from = "#transferB"; to = "#transferA" }
                //單選檢查
                if (!this.IsCanSelect(from)) {
                    $("#transferA").sortable("cancel");
                    ui.item.removeClass("selected");
                }
                // 判斷是否存在TO
                if ($(to).find('li[data-dept-id="' + ui.item.data("deptID") + '"]').length === 2) {
                    //如果B->A 就移除B
                    if (from === "#transferB")
                        ui.item.remove();
                    else
                        $(from).sortable("cancel");
                }
                this.refreshData();
            },
            onTransferAllClick: function (e) {
                e.preventDefault();
                var from = $(e.target).data('transferFrom');
                var to = $(e.target).data('transferTo');
                $(from).find('li').each(function () {
                    if ($(to).find('li[data-dept-id="' + this.dataset.DeptID + '"]').length === 0) {
                        $(to).append($(this).removeClass("selected"));
                    }
                    else {
                        if (from === "#transferB") $(this).remove();
                    }
                });
                this.refreshData();
            },
            onTransferClick: function (e) {
                e.preventDefault();
                var from = $(e.target).data('transferFrom');
                var selitem;
                var temp;
                var to = $(e.target).data('transferTo')
                // 判斷單選
                //if (!this.IsCanSelect(from)) return;//from === "#transferA" && !this.IsCanSelect() && $(from).find('.selected').length === 1) return;
                // 判斷是否存在TO 如果B->A 就移除B
                $(from).find('.selected').each(function () {
                    $(to).append($(this).removeClass("selected"));
                });
                this.refreshData();
            },
            refreshData: function () {
                var v = this;
                var Aitems = $('#transferA li');
                var Atemp = [];
                var Bitems = $('#transferB li');
                var Btemp = []; //var s = 'po'; s.format('{0}{1}', 's', 't');
                alertError(s);
                $.each(Aitems, function (ndex, item) {
                    var aitemValue = getParenthesesStr(item.innerText);
                    Atemp.push(v.sourceItems.filter(x=> x.Value == aitemValue)[0]);

                });
                v.sourceItems = Atemp;
                //if (v.selectItems.length > 0) {
                $.each(Bitems, function (ndex, item) {
                    var bitemValue = getParenthesesStr(item.innerText);
                    Btemp.push(v.selectItems.filter(x=> x.Value == bitemValue)[0]);
                });
                v.selectItems = [];
                v.selectItems = Btemp;
                //}
            },
            IsCanSelect: function (from) {
                if (from === "#transferA") {
                    if (this.Single && this.selectItems.length === 1) {
                        alertError("Only Select One");
                        return false;
                    }
                    if (this.Single && $(from).find('.selected').length > 1) {
                        alertError("Select Too Many");
                        return false;
                    }
                }

                return true;
            },
            Init: function (strtitle, strsearchtext, okfn, searchfn, sourcedata, selectdata, issingle) {
                if (strtitle)
                    this.title = strtitle;

                this.IsDisableSearch = false;

                if (typeof issingle === "boolean")
                    this.Single = issingle;
                if (typeof okfn === "function") {
                    this.ButtonOKClick = okfn;
                }

                if (typeof searchfn === "function") {
                    this.ButtonSearchClick = searchfn;
                }
                else {
                    //預設查詢 先用CC的
                }
                if (strsearchtext)
                    this.searchtext = strsearchtext;
                else
                    this.searchtext = "";

                this.sourceItems = [];
                this.selectItems = [];
                try {
                    this.sourceItems = JSON.parse(sourcedata)
                }
                catch (e) {
                }
                try {
                    this.selectItems = JSON.parse(selectdata)
                }
                catch (e) {
                }

                $("#transferBox").modal('show');
            }
        }

    });

    //獲取部門id 測試demo
    function TestDeptIDs() {
        var tempdeptids = $('#txtDept').val().split(';');
        var deptids = [];
        $.each(tempdeptids, function (ndex, item) {
            if (item != '') {
                deptids.push(getParenthesesStr(item));
            }
        });
        alertError(deptids.length);
    }



    var setReturnFalse = function () {
        if (event) {
            if (event.preventDefault) { event.preventDefault(); }
            try { event.returnValue = false; } catch (e) { }
        }
        return false;
    };
    //獲取小括號內的字符串
    function getParenthesesStr(text) {
        var re = /\([^\)]+\)/g
        var s = text;
        s = s.match(re)[0];
       return s = s.substring(1, s.length - 1);
    }
    String.prototype.format = function (args) {
        if (arguments.length > 0) {
            var result = this;
            if (arguments.length == 1 && typeof (args) == "object") {
                for (var key in args) {
                    var reg = new RegExp("({" + key + "})", "g");
                    result = result.replace(reg, args[key]);
                }
            } else {
                for (var i = 0; i < arguments.length; i++) {
                    if (arguments[i] == undefined) {
                        return "";
                    } else {
                        var reg = new RegExp("({[" + i + "]})", "g");
                        result = result.replace(reg, arguments[i]);
                    }
                }
            }
            return result;
        } else {
            return this;
        }
    }
</script>
var tempdeptids = $('#txtDept').val().split(';');         
            var operData = [];
            $.each(tempdeptids, function (ndex, item) {
                if (item != '') {
                    operData.push(getParenthesesStr(item));
                }
            });
            $.ajax({
                url: '@Url.Action("Action")',
                data: {operData:operData},
                dataType: "json",
                type: "post",
                async: false,
                success: function (data) {
                    if (data.errorMsg) {
                        flag = false;
                        alertError(data.errorMsg);
                    }
                    else {
                        var msgs = (data.okMsg);
                        flag = true;
                        alertError(msgs);
                    }
                },
                error: function (data) {
                    if (data.errorMsg) {
                        flag = false;
                        alertError(data.errorMsg);
                    }
                    else { alertError("請重新打開或刷新本頁面後重試!"); }
                },
                complete: function () {
                }
            });

3.后端代码

 [HttpPost]
        public ActionResult Action(List<string> operData)
        {          
            try
            {
                bool result = mtWorkTimeBLL.Save(operData);
                string okMsg = string.Empty;
                if (result)
                {
                    okMsg = "保存成功!";
                }
                else
                { okMsg = "保存失敗!"; }
                var jsonOK = new
                {
                    okMsg
                };
                return Json(jsonOK);
            }
            catch (Exception ex)
            {
                var jsonEx = new
                {
                    errorMsg = ex.ToString()
                };
                return Json(jsonEx);
            }          
        }