SysFunctions.cshtml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. @using ShwasherSys.Authorization.Permissions
  2. @using ShwasherSys.Models
  3. @using ShwasherSys.Models.Modal
  4. @*@model WisdomRehearsal.Roles.Dto.RoleDto*@
  5. @{
  6. ViewBag.Title = "系统功能菜单";
  7. ViewBag.ActiveMenu = PermissionNames.PagesSystemSysFunction; //The menu item will be active for this page.
  8. CurrentUserViewModel currentUser = ViewBag.CurrentUser;
  9. }
  10. <link href="~/Content/Plugins/bootstrap-table/extensions/treegrid/jquery.treegrid.min.css" rel="stylesheet" />
  11. <div class="table-box mr-4">
  12. @Html.Action("ToolMenu", "Layout", new { pageName = ViewBag.ActiveMenu, SelectList = new { } })
  13. <table id="table"
  14. data-url="/api/services/app/Functions/GetAll"
  15. data-striped="true" data-id-field="id" data-unique-id="id"
  16. data-method="post"
  17. data-side-pagination="server"
  18. data-content-type="application/x-www-form-urlencoded; charset=UTF-8"
  19. data-cache="false"
  20. data-pagination="true"
  21. data-page-size="1000"
  22. data-page-number="1"
  23. data-page-list="[1000]"
  24. data-buttons-class="primary btn-sm"
  25. data-query-params="QueryParams"
  26. data-response-handler="ResponseHandler"
  27. data-row-attributes="RowAttributes"
  28. data-click-to-select="false"
  29. data-single-select="true">
  30. <thead>
  31. <tr class="row" id="header">
  32. <th data-field="state" data-checkbox="true"></th>
  33. <th data-align="" data-field="functionName">菜单名称</th>
  34. <th data-align="center" data-field="functionType" data-formatter="TypeFormatter">菜单类型</th>
  35. @*<th data-align="center" data-field="controller">控制器</th>
  36. <th data-align="center" data-field="action">方法</th>*@
  37. <th data-align="center" data-field="url">URL</th>
  38. <th data-align="center" data-field="icon" data-formatter="IconFormatter">图标</th>
  39. <th data-align="center" data-field="sort">排序序号</th>
  40. <th data-align="center" data-formatter="ActionsFormatter">操作菜单</th>
  41. @*<th data-align="center" data-field="LastModificationTime">@L("LastModificationTime")</th>
  42. <th data-align="center" data-field="LastModifierUserId">@L("LastModifierUserId")</th>*@
  43. </tr>
  44. </thead>
  45. </table>
  46. </div>
  47. @section modal {
  48. <!-- Modal -->
  49. <div class="modal fade" id="modal" role="dialog" tabindex="-1" aria-labelledby="ModalLabel" aria-hidden="true">
  50. <div class="modal-dialog modal-dialog-centered" role="document">
  51. <div class="modal-content">
  52. @Html.Partial("Modals/_ModalHeader", new ModalHeaderViewModel("功能菜单"))
  53. @{
  54. var inputs = new List<InputViewModel>
  55. {
  56. new InputViewModel("id", hide: true),
  57. new InputViewModel("depth", hide: true),
  58. new InputViewModel("permissionName", hide: true),
  59. new InputViewModel("functionPath", hide: true),
  60. new InputViewModel("parentNo",InputTypes.List,"父菜单"),
  61. new InputViewModel("functionNo",displayName:"菜单编号"),
  62. new InputViewModel("functionName",displayName:"菜单名称"),
  63. new InputViewModel("sort",displayName:"排序"),
  64. new InputViewModel("icon",displayName:"菜单图标").SetNotRequired(),
  65. };
  66. if (currentUser.UserName.ToUpper() == "ADMIN"|| currentUser.UserName.ToUpper() == "SYSTEM")
  67. {
  68. inputs.AddRange(new List<InputViewModel>
  69. {
  70. new InputViewModel("functionType",InputTypes.List,"菜单类型").SetSelectOptions((List<SelectListItem>)ViewBag.FunctionType).SetNotRequired(),
  71. new InputViewModel("controller",displayName:"控制器").SetNotRequired(),
  72. new InputViewModel("action",displayName:"方法").SetNotRequired(),
  73. new InputViewModel("url",displayName:"URL").SetNotRequired(),
  74. new InputViewModel("class",displayName:"Class").SetNotRequired(),
  75. new InputViewModel("script",displayName:"Script").SetNotRequired(),
  76. });
  77. }
  78. //var specials = new List<SpecialInputModel>();
  79. }
  80. @Html.Partial("Modals/_ModalBody", new ModalBodyViewModel(inputs))
  81. @Html.Partial("Modals/_ModalFooter", "0")
  82. </div>
  83. </div>
  84. </div>
  85. }
  86. @section scripts
  87. {
  88. <script src="~/Content/Plugins/bootstrap-table/extensions/treegrid/bootstrap-table-treegrid.js"></script>
  89. <script src="~/Content/Plugins/bootstrap-table/extensions/treegrid/jquery.treegrid.min.js"></script>
  90. <script type="text/javascript">
  91. $("#Tool1").css("display", "none");
  92. var $table = $("#table");
  93. var actions = [];
  94. $(function() {
  95. LoadTable();
  96. $("#Tool1").find(".btn[data-type]").each(function (i, e) {
  97. var btnType = $(e).data("type").replace("_", "");
  98. if (btnType !== "btnRefresh") {
  99. var btnUrl = $(e).data("url") || "";
  100. var btnName = $(e).text();
  101. var btnClass = $(e).attr("class");
  102. var btnIcon = $(e).find("i").attr("class");
  103. actions.push({ type: btnType, name: btnName, "class": btnClass, icon: btnIcon, url: btnUrl });
  104. $(e).remove();
  105. } else {
  106. $(e).prop("disabled", false).attr("onclick", "Refresh('" + $(e).data("url")+"')");
  107. }
  108. });
  109. $("#Tool1").css("display", "block");
  110. });
  111. function btnCreate(id,$this){
  112. console.log("Add", id);
  113. var row;
  114. if (typeof id === "string" && id !== "") {
  115. row = $table.bootstrapTable("getRowByUniqueId", id);
  116. }
  117. if (row) {
  118. abp.ajax({
  119. contentType: 'application/x-www-form-urlencoded',
  120. url: "/api/services/app/Functions/GetFunctionSelectStr",
  121. success: function (res) {
  122. $("#parentNo").empty().html(res);
  123. var url = $($this).data("url") + "";
  124. OpenModal({
  125. modaltitle: window.opCreate,
  126. data: { parentNo: row.functionNo, depth: row.depth + 1, functionPath: row.functionPath, permissionName: row.permissionName },
  127. url: url,
  128. disabled: "parentNo"
  129. });
  130. }
  131. });
  132. } else {
  133. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  134. }
  135. }
  136. function btnUpdate(id, $this) {
  137. console.log("Update", id);
  138. var row;
  139. if (typeof id === "string" && id !== "") {
  140. row = $table.bootstrapTable("getRowByUniqueId", id);
  141. }
  142. if (row) {
  143. abp.ajax({
  144. contentType: 'application/x-www-form-urlencoded',
  145. url: "/api/services/app/Functions/GetFunctionSelectStr",
  146. success: function (res) {
  147. $("#parentNo").empty().html(res);
  148. var url = $($this).data("url") + "";
  149. OpenModal({ modaltitle: window.opUpdate, data: row, url: url, disabled: "parentNo,functionNo" });
  150. //var da = formUtil.Serialize($("#form"));
  151. //console.log(da);
  152. }
  153. });
  154. } else {
  155. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  156. }
  157. }
  158. function btnDelete(id,$this) {
  159. console.log("Delete", id);
  160. var row;
  161. if (typeof id === "string" && id !== "") {
  162. row = $table.bootstrapTable("getRowByUniqueId", id);
  163. }
  164. if (row) {
  165. var url = $($this).data("url") + "";
  166. abp.message.confirm(abp.localization.localize("DeleteConfirmMsg"), abp.localization.localize("DeleteConfirmTitle"),function() {
  167. SaveAjax({ url: url, data: { Id: row.id}, isValidate: false });
  168. });
  169. } else {
  170. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  171. }
  172. }
  173. function btnMoveUp(id,$this) {
  174. var row;
  175. if (typeof id === "string" && id !== "") {
  176. row = $table.bootstrapTable("getRowByUniqueId", id);
  177. }
  178. console.log("MoveUp", id);
  179. if (row) {
  180. var url = $($this).data("url") + "";
  181. var tr = $($this).closest("tr");
  182. var funId = tr.data("uniqueid"), parentNo = tr.data("parent");
  183. var prevs = tr.prevAll().filter("[data-parent='" + parentNo + "']");
  184. if (prevs.length > 0) {
  185. var prevId = prevs.first().data("uniqueid");
  186. //console.log(prevId);
  187. SaveAjax({ url: url, data: { Id: funId, PrevId: prevId}, isValidate: false });
  188. } else {
  189. abp.message.warn(abp.localization.localize("RecordAtTop"));
  190. }
  191. } else {
  192. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  193. }
  194. }
  195. function btnMoveDown(id,$this) {
  196. var row;
  197. if (typeof id === "string" && id !== "") {
  198. row = $table.bootstrapTable("getRowByUniqueId", id);
  199. }
  200. console.log("MoveDown", id);
  201. if (row) {
  202. var url = $($this).data("url") + "";
  203. var tr = $($this).closest("tr");
  204. var funId = $(tr).data("uniqueid"), parentNo = $(tr).data("parent");
  205. var nexts = tr.nextAll().filter("[data-parent='" + parentNo + "']");
  206. if (nexts.length > 0) {
  207. var nextId = nexts.first().data("uniqueid");
  208. //console.log(nextId);
  209. SaveAjax({ url: url, data: { Id: funId, NextId: nextId}, isValidate: false });
  210. } else {
  211. abp.message.warn(abp.localization.localize("RecordAtButtom"));
  212. }
  213. } else {
  214. abp.message.warn(abp.localization.localize("ChooseOneToOp"));
  215. }
  216. }
  217. function Refresh(url) {
  218. console.log("Refresh");
  219. SaveAjax({ url: url, isValidate: false });
  220. }
  221. function LoadTable() {
  222. $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales[window.lang]);
  223. $table.bootstrapTable({
  224. idField: 'functionNo',
  225. treeShowField: 'functionName',
  226. parentIdField: 'parentNo',
  227. onLoadSuccess: OnLoadSuccess,
  228. onAll: OnAll
  229. //onClickRow: OnClickRow,
  230. //queryParams: QueryParams
  231. // bootstrap-table-treetreegrid.js 插件配置
  232. });
  233. }
  234. function OnLoadSuccess() {
  235. $table.treegrid({
  236. //initialState: 'collapsed',
  237. treeColumn: 1,
  238. expanderExpandedClass: 'iconfont icon-folder-open-fill',
  239. expanderCollapsedClass: 'iconfont icon-folder-fill',
  240. onChange: function() {
  241. //$table.bootstrapTable('resetWidth');
  242. }
  243. });
  244. $(".level-2").closest("tr").treegrid("collapse");
  245. $("td span.treegrid-expander:not(.iconfont)").addClass("iconfont icon-folder");
  246. abp.ui.clearBusy();
  247. $("td").off("dblclick").on("dblclick",function() { $($(this).closest("tr")).treegrid("toggle"); });
  248. }
  249. //格式化图标
  250. function IconFormatter(v) {
  251. if (v !== "") {
  252. return '<span class="iconfont ' + v + '"></span>';
  253. }
  254. return v;
  255. }
  256. //操作按钮
  257. function ActionsFormatter(v,r) {
  258. var str = '<div class="btn-group btn-group-xs">';
  259. for (var i = 0; i < actions.length; i++) {
  260. str += '<span class="' + actions[i]["class"] + '" data-url="' + actions[i]["url"] + '" onclick="' + actions[i]["type"] + '(\'' + r.id + '\',this)"><i class="' + actions[i]["icon"] + '"></i>' + actions[i]["name"]+' </span>';
  261. }
  262. str += '</div>';
  263. return str;
  264. }
  265. //自定义属性
  266. function RowAttributes(r) {
  267. return {
  268. //"data-level": r._level,
  269. "data-function": r.functionNo,
  270. "data-parent": r.parentNo
  271. };
  272. }
  273. // 格式化类型
  274. function TypeFormatter(v,r) {
  275. switch (v) {
  276. case 0:
  277. return '<span class="label label-info">' + r.functionTypeName +'</span>';
  278. case 1:
  279. return '<span class="label label-danger">' + r.functionTypeName +'</span>';
  280. case 2:
  281. return '<span class="label label-success">' + r.functionTypeName +'</span>';
  282. default:
  283. return v;
  284. }
  285. }
  286. </script>
  287. }