diff --git a/package-lock.json b/package-lock.json
index f5aabc0e..2bb26e24 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "educoder",
+ "name": "forge",
"version": "0.1.0",
"lockfileVersion": 1,
"requires": true,
@@ -3888,11 +3888,6 @@
"randomfill": "^1.0.3"
}
},
- "crypto-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npm.taobao.org/crypto-js/download/crypto-js-4.0.0.tgz",
- "integrity": "sha1-KQSrJnep0EKFai6i74DekuSjbcw="
- },
"crypto-random-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
@@ -20480,6 +20475,16 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
+ "xterm": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npm.taobao.org/xterm/download/xterm-4.8.1.tgz",
+ "integrity": "sha1-FVoXKaQ+Gom0BlJOIsVjQznjnKE="
+ },
+ "xterm-addon-fit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npm.taobao.org/xterm-addon-fit/download/xterm-addon-fit-0.4.0.tgz",
+ "integrity": "sha1-BuDF0KaqrPsAnvVl76HIHpPZAZM="
+ },
"y18n": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
diff --git a/package.json b/package.json
index edc6e18e..5ad75014 100644
--- a/package.json
+++ b/package.json
@@ -111,7 +111,9 @@
"webpack-dev-server": "^3.10.3",
"webpack-manifest-plugin": "^2.2.0",
"whatwg-fetch": "2.0.3",
- "wrap-md-editor": "^0.2.20"
+ "wrap-md-editor": "^0.2.20",
+ "xterm": "4.8.1",
+ "xterm-addon-fit": "0.4.0"
},
"scripts": {
"start": "node --max_old_space_size=15360 scripts/start.js",
diff --git a/src/AppConfig.js b/src/AppConfig.js
index 5f530ce9..bd24bb7d 100644
--- a/src/AppConfig.js
+++ b/src/AppConfig.js
@@ -32,7 +32,7 @@ export function initAxiosInterceptors(props) {
// 判断网络是否连接
initOnlineOfflineListener();
- var proxy = "https://forgeplus.trustie.net";
+ var proxy = "https://testforgeplus.trustie.net";
//响应前的设置
axios.interceptors.request.use(
config => {
diff --git a/src/common/UrlTool.js b/src/common/UrlTool.js
index 329bc81a..07e141eb 100644
--- a/src/common/UrlTool.js
+++ b/src/common/UrlTool.js
@@ -15,7 +15,7 @@ export function getImageUrl(path) {
if (isDev) {
return `${local}/${path}`
}
- return `/${path}`;
+ return `${path}`;
}
export function getImage(path) {
diff --git a/src/forge/Activity/ActivityItem.js b/src/forge/Activity/ActivityItem.js
index 1baa2ce9..b726a4af 100644
--- a/src/forge/Activity/ActivityItem.js
+++ b/src/forge/Activity/ActivityItem.js
@@ -33,7 +33,7 @@ class ActivityItem extends Component {
}
-
+
{item.user_name}
{item.created_at && 创建于{item.created_at}}
diff --git a/src/forge/Component/AddMember.jsx b/src/forge/Component/AddMember.jsx
index a4188229..0548e52d 100644
--- a/src/forge/Component/AddMember.jsx
+++ b/src/forge/Component/AddMember.jsx
@@ -42,7 +42,7 @@ function AddMember({getID,login}){
className="user_img radius"
width="28"
height="28"
- src={getImageUrl(`images/${item && item.image_url}`)}
+ src={getImageUrl(`/${item && item.image_url}`)}
alt=""
/>
diff --git a/src/forge/Component/Cards.jsx b/src/forge/Component/Cards.jsx
index 1c9706c3..498b375c 100644
--- a/src/forge/Component/Cards.jsx
+++ b/src/forge/Component/Cards.jsx
@@ -6,7 +6,7 @@ import './Component.scss';
function Cards({img , title, desc , rightBtn , src}){
return(
- {img &&
}
+ {img &&
}
{title}
diff --git a/src/forge/Component/Contributors.jsx b/src/forge/Component/Contributors.jsx
index 7848f9fc..d64e0d42 100644
--- a/src/forge/Component/Contributors.jsx
+++ b/src/forge/Component/Contributors.jsx
@@ -15,7 +15,7 @@ function Contributors({contributors,owner,projectsId}){
contributors && contributors.total_count > 0 ?
contributors.list.map((item,key)=>{
return(
-
+
)
})
:""
diff --git a/src/forge/Component/MemberCards.jsx b/src/forge/Component/MemberCards.jsx
index c0bd12c1..393ddbb1 100644
--- a/src/forge/Component/MemberCards.jsx
+++ b/src/forge/Component/MemberCards.jsx
@@ -45,7 +45,7 @@ const Div = styled.div`{
export default (({ user , img, name, time, focusStatus, is_current_user, login , successFunc }) => {
return (
-
![]({getImageUrl(`images/${img}`)})
+
{name}
diff --git a/src/forge/Component/SearchUser.jsx b/src/forge/Component/SearchUser.jsx
index 43b45e85..0203d24f 100644
--- a/src/forge/Component/SearchUser.jsx
+++ b/src/forge/Component/SearchUser.jsx
@@ -44,7 +44,7 @@ export default ({ getUser })=>{
className="user_img radius"
width="28"
height="28"
- src={getImageUrl(`images/${item && item.image_url}`)}
+ src={getImageUrl(`/${item && item.image_url}`)}
alt=""
/>
diff --git a/src/forge/DevOps/OpsDetailRightpanel.jsx b/src/forge/DevOps/OpsDetailRightpanel.jsx
index 6998964e..93bf370c 100644
--- a/src/forge/DevOps/OpsDetailRightpanel.jsx
+++ b/src/forge/DevOps/OpsDetailRightpanel.jsx
@@ -2,6 +2,7 @@ import React, { useState, useEffect } from "react";
import { Spin , Menu } from "antd";
import { FlexAJ, AlignCenter } from "../Component/layout";
import axios from "axios";
+import CodeSSH from './ssh/Index';
export default ({
data,
@@ -37,6 +38,7 @@ export default ({
: p[0];
setStep(sub);
+ setNav("0");
if (sub && sub.status !== "skipped") {
getStep(pre.number, sub.number);
}
@@ -67,51 +69,55 @@ export default ({
}
}
return (
-
+
{/* */}
{
nav === "0" &&
-
- {data && data.status !== "error" ? (
-
-
- {step && step.name}
-
- {step && step.duration_time}
-
-
-
+
+
+ {data && data.status !== "error" ? (
- {coders && coders.length > 0 ? (
- coders.map((item, key) => {
- return (
-
-
{key + 1}
-
{item.out}
-
- );
- })
- ) : empty ? (
-
-
1
-
- {stage && stage.name} – {step && step.name}: Skipped
-
-
- ) : (
- ""
- )}
+
+ {step && step.name}
+
+ {step && step.duration_time}
+
+
+
+
+ {coders && coders.length > 0 ? (
+ coders.map((item, key) => {
+ return (
+
+
{key + 1}
+
{item.out}
+
+ );
+ })
+ ) : empty ? (
+
+
1
+
+ {stage && stage.name} – {step && step.name}: Skipped
+
+
+ ) : (
+ ""
+ )}
+
-
- ) : (
- error:{data && data.error}
- )}
-
+ ) : (
+
error:{data && data.error}
+ )}
+
+
}
-
-
+ {
+ nav === "1" &&
+ }
+
);
};
diff --git a/src/forge/DevOps/ssh/Index.jsx b/src/forge/DevOps/ssh/Index.jsx
new file mode 100644
index 00000000..9a896a83
--- /dev/null
+++ b/src/forge/DevOps/ssh/Index.jsx
@@ -0,0 +1,42 @@
+import React, { useState, useEffect } from "react";
+import XmlPanel from "./XmlPanel";
+import mediator from "./mediator";
+import axios from "axios";
+
+// const defaulturl = `http://47.111.130.18:48088`;
+const defaultValue = {
+ host: "106.75.231.63",
+ port: "2021",
+ ws_url: "wss://pre-webssh.educoder.net/ws",
+ username: "root",
+ secret: "Dron_123123",
+};
+function Index() {
+ const [sshConfigData, setSshConfigData] = useState(undefined);
+
+ useEffect(() => {
+ if (!sshConfigData) {
+ init();
+ }
+ setTimeout(() => {
+ mediator.publish("create-socket", 1);
+ }, 300);
+ }, [sshConfigData]);
+
+ // 获取服务器连接信息
+ function init() {
+ const url = `/api/ci/pipelines/ssh_server.json`;
+ axios.get(url).then(result=>{
+ if(result && result.data){
+ setSshConfigData({...result.data})
+ }
+ }).catch(error=>{})
+ }
+ return (
+
+ );
+}
+export default Index;
diff --git a/src/forge/DevOps/ssh/XmlPanel.jsx b/src/forge/DevOps/ssh/XmlPanel.jsx
new file mode 100644
index 00000000..ae642caa
--- /dev/null
+++ b/src/forge/DevOps/ssh/XmlPanel.jsx
@@ -0,0 +1,219 @@
+import React, { useRef, useEffect, useState } from 'react';
+import { Base64 } from 'js-base64';
+
+import { Terminal } from 'xterm';
+import 'xterm/css/xterm.css';
+import mediator from './mediator';
+import ResizeObserver from 'resize-observer-polyfill';
+
+function getColsAndRows(width, height, term) {
+ let w = term._core._renderService.dimensions.actualCellWidth || 9.5;
+ let h = term._core._renderService.dimensions.actualCellHeight || 18;
+ const rows = Math.floor(height / h);
+ const cols = Math.floor(width / w);
+ return [cols, rows];
+}
+
+function onLayout(term, el) {
+ const ro = new ResizeObserver(entries => {
+ console.log(entries);
+ for (let entry of entries) {
+ if (entry.target.offsetHeight > 0 || entry.target.offsetWidth > 0) {
+ const [cols, rows] = getColsAndRows(
+ entry.target.offsetWidth,
+ entry.target.offsetHeight,
+ term,
+ );
+ console.log('cols, rows', cols, rows);
+ term.resize(cols, rows);
+ mediator.publish('ssh-xterm-resize', {
+ columns: cols,
+ rows: rows,
+ width: entry.target.offsetWidth,
+ height: entry.target.offsetHeight,
+ });
+ }
+ }
+ });
+ ro.observe(el);
+ return ro;
+}
+
+const TimeTicket = 30000;
+
+//建立 websockt 来交互
+//根据容器大小计算行数和列数并做到自适应
+//socket 与 term 需要分开初始化 因为socket 可能重置连接
+//mediator 监听消息,如果和id匹配,则建立连接,重置,或关闭连接
+
+export default ({ sshConfigData, sid }) => {
+ const [term, setTerm] = useState(null);
+
+ const { ws_url, password, port, secret } = sshConfigData;
+ const el = useRef();
+ const socket = useRef();
+ const isFirstConnected = useRef(false);
+
+ //term init
+ useEffect(() => {
+ if (el.current && ws_url) {
+ const term = new Terminal({ fontSize: 16, rendererType: 'dom' });
+ term.open(el.current);
+
+ term.onData(data => {
+ if (socket.current) {
+ if (socket.current.readyState === 1) {
+ socket.current.send(JSON.stringify({ tp: 'client', data: data }));
+ mediator.publish('on-operating-ssh'); //有操作则自动延时
+ } else {
+ //断开连接后重连
+ // socket.current = null
+ // mediator.publish('create-socket', sid)
+ }
+ }
+ });
+ term.write('Connecting...');
+ setTerm(term);
+ const ro = onLayout(term, el.current);
+ return () => {
+ term.dispose();
+ ro.unobserve(el.current);
+ };
+ }
+ }, [ws_url, el.current]);
+
+ useEffect(() => {
+ if (term && ws_url) {
+ function createSocket() {
+ const socketInstance = new WebSocket(ws_url);
+ socket.current = socketInstance;
+
+ socketInstance.onopen = () => {
+ let container = term.element.parentElement;
+ if (container) {
+ let width = container.offsetWidth;
+ let height = container.offsetHeight;
+ console.log('init', {
+ tp: 'init',
+ data: {
+ ...sshConfigData,
+ secret: secret,
+ width,
+ height,
+ rows: term.rows,
+ columns: term.cols,
+ },
+ });
+ socketInstance.send(
+ JSON.stringify({
+ tp: 'init',
+ data: {
+ ...sshConfigData,
+ secret: secret,
+ width,
+ height,
+ rows: term.rows,
+ columns: term.cols,
+ },
+ }),
+ );
+ }
+ term.focus();
+ };
+ socketInstance.onerror = error => {
+ console.log(
+ '------in socket error----',
+ error,
+ socketInstance,
+ ws_url,
+ );
+ //连接报错后,重新请求资源
+ // mediator.publish('on-recreate-socket')
+ };
+ socketInstance.onmessage = event => {
+ if (!isFirstConnected.current) {
+ term.write('\r');
+ // term.focus()
+ setTimeout(() => {
+ // term.clear();
+ }, 1000);
+ }
+ isFirstConnected.current = true;
+ console.log('event:', event);
+
+ const data = Base64.decode(event.data.toString());
+ let w = term._core._renderService.dimensions.actualCellWidth || 9.5;
+
+ console.log('data:', data, w, term);
+ term.write(data);
+ };
+
+ socketInstance.onclose = evt => {
+ if (tid) {
+ clearInterval(tid);
+ }
+ term.write('\r\nconnection closed');
+ };
+ }
+
+ const tid = setInterval(() => {
+ if (socket.current) {
+ socket.current.send(JSON.stringify({ tp: 'h' }));
+ }
+ }, TimeTicket);
+
+ const unSubCreate = mediator.subscribe('create-socket', id => {
+ if (sid === id) {
+ if (socket.current && socket.current.readyState === 1) {
+ term.focus();
+ } else {
+ createSocket();
+ }
+ term.focus();
+ }
+ });
+
+ const unSubClose = mediator.subscribe('close-socket', id => {
+ if (sid === id) {
+ if (socket.current) {
+ socket.current.close();
+ isFirstConnected.current = false;
+ term.clear();
+ }
+ socket.current = null;
+ }
+ });
+
+ const unSubResize = mediator.subscribe('ssh-xterm-resize', option => {
+ if (socket.current && socket.current.readyState === 1) {
+ socket.current.send(
+ JSON.stringify({ tp: 'resize', data: { ...option } }),
+ );
+ }
+ });
+
+ const unSubAddTime = mediator.subscribe('ssh-add-connect-time', () => {
+ if (socket.current && socket.current.readyState === 1) {
+ socket.current.send(JSON.stringify({ tp: 'overtime' }));
+ }
+ });
+
+ return () => {
+ unSubClose();
+ unSubCreate();
+ unSubResize();
+ unSubAddTime();
+ if (socket.current) {
+ socket.current.close();
+ isFirstConnected.current = false;
+ }
+ };
+ }
+ }, [term, ws_url, port]);
+
+ return (
+
+ {!ws_url ?
正在连接命令行服务...
: null}
+
+ );
+};
\ No newline at end of file
diff --git a/src/forge/DevOps/ssh/mediator.jsx b/src/forge/DevOps/ssh/mediator.jsx
new file mode 100644
index 00000000..70a4e30f
--- /dev/null
+++ b/src/forge/DevOps/ssh/mediator.jsx
@@ -0,0 +1,46 @@
+function Mediator(obj) {
+ const channels = {};
+
+ const mediator = {
+ subscribe: function(channel, cb) {
+ if (!channels[channel]) {
+ channels[channel] = [];
+ }
+ channels[channel].push(cb);
+ return this.unsubscribe.bind(null, channel, cb);
+ },
+
+ unsubscribe: function(channel, cb) {
+ let rs = channels[channel];
+ let index = -1;
+ if (rs) {
+ for (let i = 0; i < rs.length; i++) {
+ if (rs[i].name === cb.name) {
+ index = i;
+ break;
+ }
+ }
+ if (index >= 0) {
+ channels[channel].splice(index, 1);
+ return true;
+ }
+ }
+ return false;
+ },
+
+ publish: function(channel) {
+ if (!channels[channel]) {
+ return false;
+ }
+ const args = Array.prototype.slice.call(arguments, 1);
+ channels[channel].forEach(subscription => {
+ subscription.apply(null, args);
+ });
+ return this;
+ },
+ };
+
+ return obj ? Object.assign(obj, mediator) : mediator;
+}
+const mediator = new Mediator();
+export default mediator;
\ No newline at end of file
diff --git a/src/forge/Head/Header.js b/src/forge/Head/Header.js
index 05f763ed..7260d114 100644
--- a/src/forge/Head/Header.js
+++ b/src/forge/Head/Header.js
@@ -603,7 +603,7 @@ class NewHeader extends Component {
{
settings && settings.nav_logo_url ?
-
+
:
}
@@ -703,8 +703,7 @@ class NewHeader extends Component {
:
-
+
diff --git a/src/forge/Main/CoderDepot.jsx b/src/forge/Main/CoderDepot.jsx
index 7d10e3e5..15032641 100644
--- a/src/forge/Main/CoderDepot.jsx
+++ b/src/forge/Main/CoderDepot.jsx
@@ -315,7 +315,7 @@ function CoderDepot(props){
{
lastCommit &&
-
+
{lastCommit && lastCommit.message}
{ hideBtn &&
changeHide(hide)}> }
diff --git a/src/forge/Main/CoderDepotReadme.jsx b/src/forge/Main/CoderDepotReadme.jsx
index c4674740..da1435d5 100644
--- a/src/forge/Main/CoderDepotReadme.jsx
+++ b/src/forge/Main/CoderDepotReadme.jsx
@@ -1,13 +1,49 @@
-import React from 'react';
+import React, { useEffect, useState } from 'react';
import RenderHtml from '../../components/render-html';
+import { Dropdown , Menu , Spin } from 'antd';
+import { Link } from 'react-router-dom';
+const $ = window.$;
function CoderDepotReadme({ operate , history , readme , ChangeFile }){
+ const [ menuList ,setMenuList ] = useState(undefined);
+
+ useEffect(()=>{
+ if(readme && readme.content){
+ let path = history.location.pathname;
+ const items = $.map($("#readme").find("h1,h2,h3,h4,h5,h6"), function (el, _) {
+ const anchor = el.id;
+ const level = el.tagName.replace("H", "");
+ const href = `#${anchor}`;
+ return { href:`${path}${href}`,text:el.textContent , level:level }
+ });
+ setMenuList(items);
+ }
+ },[readme])
+
+ function menu(){
+ if(menuList && menuList.length > 0){
+ let hash = history.location.hash;
+ return(
+
+ )
+ }else{
+ return
+ }
+ }
return(
-
-
-
+
+
+
README.md
{
operate ?
diff --git a/src/forge/Main/CoderRootCommit.js b/src/forge/Main/CoderRootCommit.js
index bb4f5ba5..5c509ecd 100644
--- a/src/forge/Main/CoderRootCommit.js
+++ b/src/forge/Main/CoderRootCommit.js
@@ -140,11 +140,11 @@ class CoderRootCommit extends Component{
{
item.id ?
- {item.image_url?
![]({getImageUrl(`images/${item.image_url}`)})
:""}
+ {item.image_url?
![]({getImageUrl(`/${item.image_url}`)})
:""}
:
- {item.image_url?
:""}
+ {item.image_url?
:""}
}
diff --git a/src/forge/Main/CoderRootFileDetail.js b/src/forge/Main/CoderRootFileDetail.js
index 2ee43bee..1455086d 100644
--- a/src/forge/Main/CoderRootFileDetail.js
+++ b/src/forge/Main/CoderRootFileDetail.js
@@ -31,6 +31,18 @@ class CoderRootFileDetail extends Component {
this.languages_total();
};
+ componentDidUpdate=(prevProps)=>{
+ const { content } = this.props && this.props.detail;
+ const prevcontent = prevProps.detail && prevProps.detail.content;
+ if (content && prevcontent) {
+ if (prevcontent !== content){
+ this.setState({
+ description: content
+ });
+ }
+ }
+ }
+
languages_total = () => {
const { detail } = this.props;
const file_name = detail.path.split("/").pop().split(".").pop();
@@ -273,7 +285,7 @@ class CoderRootFileDetail extends Component {
{...this.state}
language={language ? language : "javascript"}
filepath={`/${detail.path}`}
- content={detail.content}
+ content={description}
readOnly={readOnly}
editorType="update"
currentBranch={currentBranch}
diff --git a/src/forge/Main/Diff.jsx b/src/forge/Main/Diff.jsx
index b3645351..d8db5f00 100644
--- a/src/forge/Main/Diff.jsx
+++ b/src/forge/Main/Diff.jsx
@@ -65,7 +65,7 @@ export default ({ match , history }) => {
{committer && committer.time_from_now && - {committer.time_from_now}
}
diff --git a/src/forge/Main/Index.js b/src/forge/Main/Index.js
index f968f14b..64a55ed2 100644
--- a/src/forge/Main/Index.js
+++ b/src/forge/Main/Index.js
@@ -1,7 +1,7 @@
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Menu, Input , Spin, Pagination , Popover , Select } from 'antd';
-import { getUrl } from 'educoder';
+import { getImageUrl } from 'educoder';
import '../css/index.scss'
import './list.css';
import './Index.scss';
@@ -271,7 +271,7 @@ class Index extends Component {
return(
this.getoDetail(item.author && item.author.login,item.identifier)}>
-
![]({getUrl(`/images/${item.author)
+
{item.name}
{item.author && item.author.name}
diff --git a/src/forge/Main/Index.scss b/src/forge/Main/Index.scss
index 331eb03d..1e9a8967 100644
--- a/src/forge/Main/Index.scss
+++ b/src/forge/Main/Index.scss
@@ -286,4 +286,23 @@
.downMenu{
box-shadow: 0px 0px 9px rgba(134, 134, 134,0.4);
background-color: #fff;
+}
+
+.menuslist{
+ max-height: 200px;
+ overflow-y: auto;
+ padding:10px 15px;
+ border-radius: 4px;
+ .ant-dropdown-menu-item{
+ border-radius: 8px;
+ a{
+ width: 350px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ }
+ .ant-dropdown-menu-item.active{
+ background-color: #e6f7ff;
+ }
}
\ No newline at end of file
diff --git a/src/forge/Main/IndexItem.js b/src/forge/Main/IndexItem.js
index a7ea04aa..b3ac2a50 100644
--- a/src/forge/Main/IndexItem.js
+++ b/src/forge/Main/IndexItem.js
@@ -28,7 +28,7 @@ class IndexItem extends Component {
:
-
![]({getImageUrl(`${item.author)
+
![]({getImageUrl(`/${item.author)
}
diff --git a/src/forge/Main/list.css b/src/forge/Main/list.css
index a8143c55..07991f6a 100644
--- a/src/forge/Main/list.css
+++ b/src/forge/Main/list.css
@@ -437,9 +437,6 @@
font-size: 16px;
border-bottom: 1px solid #d9d9d9;
}
-.branchUl{
- padding:0px 30px;
-}
.branchUl li{
display: flex;
flex-wrap: wrap;
diff --git a/src/forge/Main/sub/Contribute.jsx b/src/forge/Main/sub/Contribute.jsx
index c6bd3998..a41cb3ed 100644
--- a/src/forge/Main/sub/Contribute.jsx
+++ b/src/forge/Main/sub/Contribute.jsx
@@ -50,7 +50,7 @@ function Contribute(props){
list.map((item,key)=>{
return(
-
+
{item.name}
提交{item.contributions}次
diff --git a/src/forge/Merge/Commits.jsx b/src/forge/Merge/Commits.jsx
index a7d12073..37c254cc 100644
--- a/src/forge/Merge/Commits.jsx
+++ b/src/forge/Merge/Commits.jsx
@@ -22,7 +22,7 @@ function Commits({ commits , projectsId , owner }){
浏览代码
- :提交于{item.time_from_now}
+ :提交于{item.time_from_now}
diff --git a/src/forge/Merge/MergeItem.js b/src/forge/Merge/MergeItem.js
index dd5f4f45..3b3504da 100644
--- a/src/forge/Merge/MergeItem.js
+++ b/src/forge/Merge/MergeItem.js
@@ -1,6 +1,7 @@
import React, { Component } from "react";
import { Link } from "react-router-dom";
-import { Popconfirm, Tag } from "antd";
+import { Tag } from "antd";
+import { AlignCenter } from '../Component/layout';
import { getImageUrl } from "educoder";
import "./merge.css";
@@ -74,13 +75,13 @@ class MergeItem extends Component {
>
![]({getImageUrl(`images/${item)
-
+
-
+
(
-
+
diff --git a/src/forge/Newfile/m_editor.js b/src/forge/Newfile/m_editor.js
index 862e5f8d..4e2e6851 100644
--- a/src/forge/Newfile/m_editor.js
+++ b/src/forge/Newfile/m_editor.js
@@ -12,6 +12,13 @@ class m_editor extends Component {
editorValue: this.props.content,
};
}
+ componentDidUpdate=(prevProps)=>{
+ if(prevProps && this.props && this.props.content !== prevProps.content){
+ this.setState({
+ editorValue:this.props.content
+ })
+ }
+ }
changeEditor = (editorValue) => {
this.setState({
editorValue,
diff --git a/src/forge/Order/Detail.js b/src/forge/Order/Detail.js
index 87405919..277f5d4a 100644
--- a/src/forge/Order/Detail.js
+++ b/src/forge/Order/Detail.js
@@ -212,7 +212,7 @@ class Detail extends Component {
>
- setNav("1")}>协作者管理
- setNav("2")}>团队管理
+ {setNav("1");setNewId(undefined)}}>协作者管理
+ {setNav("2");setNewId(undefined)}}>团队管理
:
协作者管理
diff --git a/src/forge/Settings/CollaboratorMember.jsx b/src/forge/Settings/CollaboratorMember.jsx
index 9c617f11..86459d87 100644
--- a/src/forge/Settings/CollaboratorMember.jsx
+++ b/src/forge/Settings/CollaboratorMember.jsx
@@ -186,7 +186,7 @@ function CollaboratorMember({projectsId,owner,project_id,author,showNotification
className="show-user-link"
>
- 资源库(18)
+ 资源库{total ? ({total}):""}
{ current_user && current_user.login && (props.projectDetail && props.projectDetail.permission) ?
{setId(undefined);setVisible(true);}}>上传资源:""
}
diff --git a/src/forge/Team/Group/GroupDetailMember.jsx b/src/forge/Team/Group/GroupDetailMember.jsx
index 6a871d75..1e03bd09 100644
--- a/src/forge/Team/Group/GroupDetailMember.jsx
+++ b/src/forge/Team/Group/GroupDetailMember.jsx
@@ -10,6 +10,7 @@ export default (({ data , current_user , successFunc }) => {
data.map((item, key) => {
return (
{
projects.map((item, key) => {
return (
-
-
{item.project.name}
+
+
{item.project.name}
)
})
diff --git a/src/forge/Team/Group/GroupDetails.jsx b/src/forge/Team/Group/GroupDetails.jsx
index 9d27767d..8d1c519b 100644
--- a/src/forge/Team/Group/GroupDetails.jsx
+++ b/src/forge/Team/Group/GroupDetails.jsx
@@ -101,7 +101,7 @@ export default ((props) => {
group ?
- {group.name}
+ {group.nickname}
{group.is_member && !group.is_admin ?
-
+
{groupId ? "基本设置" : "新建团队"}