UNPKG

@choerodon/master

Version:
355 lines (309 loc) 15.4 kB
import "choerodon-ui/pro/lib/button/style"; import _Button from "choerodon-ui/pro/lib/button"; import "choerodon-ui/pro/lib/modal/style"; import _Modal from "choerodon-ui/pro/lib/modal"; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } import React, { useMemo, useCallback, useState, useEffect } from 'react'; import { observer } from 'mobx-react-lite'; import ResponsiveReactGridLayout from 'react-grid-layout'; import ResizeObserver from 'resize-observer-polyfill'; import { get, forEach, map } from 'lodash'; import GridBg from "../../components/gridBackground"; import DragCard from "../../components/dragCard"; import AddModal from "../../components/addComponentsModal"; import { Breadcrumb } from "../../../../../index"; import { Content, Page } from "../../../../../components/c7n-page"; import { Permission } from "../../../../../components/permission"; import ServiceInfo from "./components/ServiceInfo"; import EnvInfo from "./components/EnvInfo"; import BurnDownChart from "./components/BurnDownChart"; import DefectTreatment from "./components/DefectTreatment"; import SprintWaterWave from "./components/SprintWaterWave"; import UserList from "./components/UserList"; import SprintCount from "./components/SprintCount"; import DeployChart from "./components/deploy-chart"; import CommitChart from "./components/commit-chart"; import DefectChart from "./components/defect-chart"; import PipelineChart from "./components/pipeline-chart"; import AssigneeChart from "./components/assignee-chart"; import mappings from "./stores/mappings"; import { useProjectOverviewStore } from "./stores"; import "./ProjectOverview.less"; import UserConfirmation from "../../components/UserConfirm"; import EmptyCard from "../../components/EmptyCard"; import PriorityChart from "./components/priority-chart"; import IssueTypeChart from "./components/issue-type-chart"; import IssueTable from "./components/issue-table"; import ProjectDynamic from "./components/project-dynamic"; import PersonalWorkload from "./components/personal-workload"; import Workload from "./components/Workload"; import CustomChart from "./components/custom-chart"; var observerLayout; var ProjectOverview = function ProjectOverview() { var _useProjectOverviewSt = useProjectOverviewStore(), category = _useProjectOverviewSt.AppState.currentMenuType.category, prefixCls = _useProjectOverviewSt.prefixCls, projectOverviewStore = _useProjectOverviewSt.projectOverviewStore, componentsDs = _useProjectOverviewSt.componentsDs, customChartAvailableList = _useProjectOverviewSt.customChartAvailableList, availableServiceList = _useProjectOverviewSt.availableServiceList, allCode = _useProjectOverviewSt.allCode; var isEdit = projectOverviewStore.isEdit, setEdit = projectOverviewStore.setEdit; var _useState = useState(0), _useState2 = _slicedToArray(_useState, 2), layOutWidth = _useState2[0], setWidth = _useState2[1]; useEffect(function () { if (!observerLayout) { var domTem = document.querySelector('.c7n-project-overview-container'); observerLayout = new ResizeObserver(function (entries) { var dom = get(entries[0], 'target'); var width = get(dom, 'offsetWidth'); setWidth(width); }).observe(domTem); } }, []); useEffect(function () { return function () { observerLayout && observerLayout.disconnect(); }; }); var ComponetsObjs = useMemo(function () { return { sprintNotDone: /*#__PURE__*/React.createElement(SprintWaterWave, null), sprintCount: /*#__PURE__*/React.createElement(SprintCount, null), burnDownChart: /*#__PURE__*/React.createElement(BurnDownChart, null), defectTreatment: /*#__PURE__*/React.createElement(DefectTreatment, null), defectChart: /*#__PURE__*/React.createElement(DefectChart, null), appService: /*#__PURE__*/React.createElement(ServiceInfo, null), env: /*#__PURE__*/React.createElement(EnvInfo, null), pipelineChart: /*#__PURE__*/React.createElement(PipelineChart, null), commitChart: /*#__PURE__*/React.createElement(CommitChart, null), deployChart: /*#__PURE__*/React.createElement(DeployChart, null), onlineMember: /*#__PURE__*/React.createElement(UserList, null), assigneeChart: /*#__PURE__*/React.createElement(AssigneeChart, null), priorityChart: /*#__PURE__*/React.createElement(PriorityChart, null), issueTypeChart: /*#__PURE__*/React.createElement(IssueTypeChart, null), issueTable: /*#__PURE__*/React.createElement(IssueTable, null), projectDynamic: /*#__PURE__*/React.createElement(ProjectDynamic, null), workLoad: /*#__PURE__*/React.createElement(Workload, null), personalWorkload: /*#__PURE__*/React.createElement(PersonalWorkload, null) }; }, []); var renderCustomChart = useCallback(function (type) { var chartConfig = projectOverviewStore.getCustomChart(type); // 无敏捷数据获取hook 则返回空 if (!chartConfig || !customChartAvailableList.length) { return undefined; } return /*#__PURE__*/React.createElement(CustomChart, { customChartConfig: chartConfig }); }, [customChartAvailableList, projectOverviewStore]); var renderBg = useCallback(function () { return /*#__PURE__*/React.createElement(GridBg, { rowHeight: (layOutWidth - 11 * 18) / 10, selector: ".".concat(prefixCls, "-container"), cols: 10, style: { padding: '0' } }); }, [layOutWidth]); function handleEditable() { setEdit(true); } function handleCancel() { componentsDs.loadData(projectOverviewStore.initData); setEdit(false); } function addComponent(newTypeArr, deleteArr) { var existData = map(componentsDs.filter(function (record) { return !deleteArr.includes(record.get('i')); }), function (record) { return record.toData(); }); forEach(newTypeArr, function (type) { var _ref = mappings[type] || projectOverviewStore.getCustomChart(type), layout = _ref.layout; var tempCp = _objectSpread(_objectSpread({}, layout), {}, { x: 0, y: Infinity }); existData.push(tempCp); }); componentsDs.loadData(existData); } function openAddComponents() { var subPrefix = 'c7ncd-workbench-addModal'; var typeArr = map(componentsDs.toData(), function (item) { return get(item, 'i'); }); _Modal.open({ title: '添加卡片', key: _Modal.key(), drawer: true, style: { width: '740px' }, bodyStyle: { padding: 0 }, children: /*#__PURE__*/React.createElement(AddModal, { subPrefix: subPrefix, existTypes: typeArr, addComponent: addComponent, mappings: [].concat(_toConsumableArray(allCode.map(function (item) { return mappings[item]; })), _toConsumableArray(projectOverviewStore.customDataList)), isProjects: true }), className: "".concat(subPrefix) }); } function hanldeSave() { var tempData = componentsDs.toData(); projectOverviewStore.setInitData(tempData); projectOverviewStore.saveConfig(tempData); setEdit(false); } function handleReset() { var defaultValues = map(mappings, function (item) { return item.layout; }); componentsDs.loadData(defaultValues); } function handleResetModal() { _Modal.open({ className: 'c7n-reset-modal', title: '重置项目概览页面', children: '确定要重置项目概览页面吗?', onOk: handleReset }); } var renderBtns = function renderBtns() { var btnGroups; if (isEdit) { btnGroups = [/*#__PURE__*/React.createElement(_Button, { onClick: openAddComponents, key: "5", icon: "settings-o" }, "\u5361\u7247\u914D\u7F6E"), /*#__PURE__*/React.createElement(_Button, { onClick: hanldeSave, key: "4" }, "\u4FDD\u5B58"), /*#__PURE__*/React.createElement(_Button, { onClick: handleResetModal, key: "3" }, "\u91CD\u7F6E"), /*#__PURE__*/React.createElement(_Button, { onClick: handleCancel, key: "2", color: "primary" }, "\u53D6\u6D88")]; } else { btnGroups = [/*#__PURE__*/React.createElement(_Button, { onClick: handleEditable, key: "1", icon: "settings-o", color: "primary" }, "\u9879\u76EE\u6982\u89C8\u914D\u7F6E")]; } return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-btnGroups") }, btnGroups); }; function onLayoutChange(layout, layouts) { componentsDs.loadData(layout); } function renderEmptyTitle(groupId, customFlag) { if (!availableServiceList.includes(groupId)) { return groupId === 'devops' ? '未选择【DevOps流程】项目类型,卡片暂不可用' : '未选择【敏捷管理】项目类型,卡片暂不可用'; } if (customFlag === 'agile' && groupId === 'agile') { return customChartAvailableList.length === 0 ? '未安装【敏捷服务】,卡片无法显示' : '当前自定义敏捷图表已被删除,此卡片无法显示'; } return '卡片暂不可用'; } var SwitchComponents = function SwitchComponents(type, title) { var tempComponent = renderCustomChart(type); var hasOwnProperty = tempComponent || Object.prototype.hasOwnProperty.call(ComponetsObjs, type); var hasType = allCode.includes(type) || projectOverviewStore.getCustomChart(type); if (hasOwnProperty && hasType) { tempComponent = tempComponent || ComponetsObjs[type]; } else { var chartConfig = mappings[type] || projectOverviewStore.getCustomChart(type); tempComponent = /*#__PURE__*/React.createElement(EmptyCard, { title: title, emptyTitle: renderEmptyTitle(get(chartConfig, 'groupId'), get(chartConfig, 'layout.customFlag')), index: type, sizeObserver: ['appService', 'env'].includes(type) }); } return tempComponent; }; function handleDelete(record) { componentsDs.remove(record); } var generateDOM = useMemo(function () { return componentsDs.map(function (record) { var key = record.get('i'); var title = get(mappings[key], 'title'); return /*#__PURE__*/React.createElement(DragCard, { record: record, onDelete: function onDelete() { return handleDelete(record); }, isEdit: isEdit, key: record.get('i') }, SwitchComponents(record.get('i'), title)); }); }, [componentsDs, handleDelete, isEdit]); var renderGridLayouts = function renderGridLayouts() { var tempObj = { className: "".concat(prefixCls, "-layout"), onLayoutChange: onLayoutChange, layout: componentsDs.toData(), breakpoints: 1200, margin: [18, 18], resizeHandles: ['se'], cols: 10, measureBeforeMount: true, containerPadding: [0, 0], useCSSTransformss: true, rowHeight: (layOutWidth - 11 * 18) / 10, shouldComponentUpdate: true, width: layOutWidth, isDraggable: isEdit, isResizable: isEdit }; return /*#__PURE__*/React.createElement(ResponsiveReactGridLayout, tempObj, generateDOM); }; function renderConfirm() { return /*#__PURE__*/React.createElement(UserConfirmation, { title: "\u63D0\u793A", content: "\u9879\u76EE\u6982\u89C8\u914D\u7F6E\u672A\u4FDD\u5B58\uFF0C\u786E\u8BA4\u8DF3\u8F6C\u65B0\u9875\u9762\uFF1F", when: isEdit }); } return /*#__PURE__*/React.createElement(Page, { className: prefixCls }, /*#__PURE__*/React.createElement(Breadcrumb, null), /*#__PURE__*/React.createElement(Permission, { service: ['choerodon.code.project.project.overview.edit'] }, renderBtns()), /*#__PURE__*/React.createElement(Content, { className: "".concat(prefixCls, "-content") }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-container") }, isEdit && renderBg(), category && renderGridLayouts())), renderConfirm()); }; export default observer(ProjectOverview);