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); } }