123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- <template>
- <div class="privilege-set">
- <table class="table">
- <colgroup>
- <col width="120" />
- <col width="120" />
- <col width="140" />
- <col width="60" />
- <col width="210" />
- </colgroup>
- <tbody>
- <tr>
- <th v-for="(item, index) in tableHead" :key="index">{{ item }}</th>
- </tr>
- <tr v-for="row in tableData" :key="row.id">
- <td v-for="(col, cindex) in row.columns" :key="cindex">
- <div v-if="col && col.type === 'page'">{{ col.name }}</div>
- <div v-else-if="col && col.type === 'page-checkbox'">
- <el-checkbox
- v-model="row.enable"
- :disabled="row.disabled"
- @change="(enable) => pageSelectChange(row, enable)"
- ></el-checkbox>
- </div>
- <div
- v-else-if="
- row.isPage && col && col.type === 'page-data-permission'
- "
- >
- <el-select
- v-model="row.dataPermissionType"
- class="width-200"
- placeholder="请选择"
- :disabled="row.disabled"
- >
- <el-option
- v-for="(val, key) in DATA_PRIVILEGE_TYPE"
- :key="key"
- :value="key"
- :label="val"
- ></el-option>
- </el-select>
- </div>
- <div v-else-if="col && col.type">
- <div
- class="cell-check-list"
- v-for="item in col.datas"
- :key="item.field"
- >
- <el-checkbox
- v-model="item.enable"
- :disabled="item.disabled"
- @change="(enable) => typeSelectChange(row, enable)"
- >{{ item.name }}</el-checkbox
- >
- </div>
- </div>
- <div v-else></div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </template>
- <script>
- import { DATA_PRIVILEGE_TYPE } from "../../../constants/enumerate";
- export default {
- name: "privilege-set",
- props: {
- menus: {
- type: Array,
- default() {
- return [];
- },
- },
- showPermission: {
- type: Boolean,
- default: true,
- },
- disabledPermissionUrls: {
- type: Array,
- default() {
- return ["TaskApplyManage", "TaskReviewManage"];
- },
- },
- },
- data() {
- return {
- maxDeep: 0,
- tableData: [],
- tableHead: [],
- DATA_PRIVILEGE_TYPE,
- };
- },
- created() {
- this.initData();
- },
- methods: {
- initData() {
- this.maxDeep = this.getNavsDeep();
- this.tableHead = this.buildTableHead();
- // this.buildTableData();
- },
- getNavsDeep() {
- let maxDeep = 0;
- const getDeep = (navs, deep) => {
- ++deep;
- navs.forEach((nav) => {
- if (maxDeep < deep) maxDeep = deep;
- if (nav.children && nav.children.length) getDeep(nav.children, deep);
- });
- };
- getDeep(this.menus, maxDeep);
- return maxDeep;
- },
- buildTableHead() {
- let headers = [];
- let codes = ["一", "二", "三", "四", "五", "六", "七", "八"];
- for (let index = 0; index < this.maxDeep; index++) {
- headers.push(`${codes[index]}级页面`);
- }
- headers = [...headers, "页面"];
- if (this.showPermission) headers.push("数据权限");
- headers = [...headers, "查询条件", "功能按钮", "列表展示", "操作列"];
- return headers;
- },
- buildTableData(
- privilegeIds = [],
- dataPermissionInfo = [],
- disabledIds = []
- ) {
- let tableData = [];
- const privColumnCount = this.showPermission ? 6 : 5;
- let tableColumnCount = this.maxDeep + privColumnCount;
- const pageSetTypes = ["conditions", "buttons", "lists", "links"];
- let datePermissionMap = {};
- dataPermissionInfo.forEach((item) => {
- datePermissionMap[item.privilegeId] = item.dataPermissionType;
- });
- const buildData = (navs, deep) => {
- ++deep;
- navs.forEach((nav) => {
- const isDisabledPermissionUrl = this.disabledPermissionUrls.includes(
- nav.url
- );
- let columns = new Array(tableColumnCount);
- columns[deep - 1] = { type: "page", name: nav.name };
- columns[this.maxDeep] = {
- type: "page-checkbox",
- };
- if (this.showPermission && !isDisabledPermissionUrl) {
- columns[this.maxDeep + 1] = {
- type: "page-data-permission",
- };
- }
- const isPage = pageSetTypes.some(
- (type) => nav[type] && nav[type].length
- );
- const offsetPageSetInd = this.showPermission ? 2 : 1;
- if (isPage) {
- pageSetTypes.forEach((type, index) => {
- const datas = !nav[type]
- ? []
- : nav[type].map((elem) => {
- let data = { ...elem };
- data.enable = privilegeIds.includes(elem.id);
- data.disabled = disabledIds.includes(elem.id);
- return data;
- });
- columns[this.maxDeep + index + offsetPageSetInd] = {
- type,
- datas,
- };
- });
- }
- tableData.push({
- id: nav.id,
- name: nav.name,
- url: nav.url,
- enable: privilegeIds.includes(nav.id),
- disabled: disabledIds.includes(nav.id),
- dataPermissionType:
- isPage && this.showPermission && !isDisabledPermissionUrl
- ? datePermissionMap[nav.id] || "SELF"
- : null,
- type: nav.type,
- parentId: nav.parentId,
- isPage,
- columns,
- });
- if (nav.children && nav.children.length)
- buildData(nav.children, deep);
- });
- };
- buildData(this.menus, 0);
- this.tableData = tableData;
- },
- resetdataPermissionType(val) {
- this.tableData.forEach((item) => {
- if (
- item.isPage &&
- !item.disabled &&
- this.showPermission &&
- !this.disabledPermissionUrls.includes(item.url)
- )
- item.dataPermissionType = val;
- });
- },
- getSelectedPrivileges() {
- let privilegeIds = [];
- let dataPermissionInfo = [];
- this.tableData
- .filter((row) => row.enable)
- .forEach((row) => {
- privilegeIds.push(row.id);
- dataPermissionInfo.push({
- privilegeId: row.id,
- dataPermissionType: row.dataPermissionType,
- });
- row.columns.forEach((column) => {
- if (!column.datas || !column.datas.length) return;
- column.datas.forEach((item) => {
- if (item.enable) privilegeIds.push(item.id);
- });
- });
- });
- return { privilegeIds, dataPermissionInfo };
- },
- // set change
- pageSelectChange(row, enable) {
- this.changRowColumnEnable(row, enable);
- this.changeParentNodeSelected(row.parentId, enable);
- this.changeChildrenNodeSelected(row.id, enable);
- },
- typeSelectChange(row, enable) {
- if (!row.enable && enable) {
- row.enable = enable;
- this.changeParentNodeSelected(row.parentId, enable);
- this.changeChildrenNodeSelected(row.id, enable);
- }
- },
- changRowColumnEnable(row, enable) {
- if (!row.isPage) return;
- row.columns.forEach((column) => {
- if (!column.datas || !column.datas.length) return;
- column.datas.forEach((item) => {
- item.enable = enable;
- });
- });
- },
- changeParentNodeSelected(parentId, enable) {
- if (!parentId) return;
- let curParentId = parentId;
- if (enable) {
- while (curParentId) {
- let curParentNode = this.tableData.find(
- (row) => row.id === curParentId
- );
- curParentNode.enable = enable;
- curParentId = curParentNode.parentId;
- this.changRowColumnEnable(curParentNode, enable);
- }
- } else {
- while (curParentId) {
- let curParentNode = this.tableData.find(
- (row) => row.id === curParentId
- );
- let childrenHasOneSelected = this.tableData
- .filter((row) => row.parentId === curParentId)
- .some((row) => row.enable);
- curParentNode.enable = childrenHasOneSelected;
- curParentId = curParentNode.parentId;
- this.changRowColumnEnable(curParentNode, enable);
- }
- }
- },
- changeChildrenNodeSelected(id, enable) {
- if (!id) return;
- let curIds = [id];
- while (curIds.length) {
- const validNodes = this.tableData.filter((row) =>
- curIds.includes(row.parentId)
- );
- validNodes.forEach((row) => {
- row.enable = enable;
- this.changRowColumnEnable(row, enable);
- });
- curIds = validNodes.map((row) => row.id);
- }
- },
- },
- };
- </script>
|