diff --git a/package-lock.json b/package-lock.json index f0a4ed0fc..be7f27fb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -172,7 +172,7 @@ "dependencies": { "jsesc": { "version": "2.5.2", - "resolved": "http://173.15.15.82:8081/repository/npm-all/jsesc/-/jsesc-2.5.2.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" } } @@ -245,7 +245,7 @@ "dependencies": { "chalk": { "version": "2.4.2", - "resolved": "http://173.15.15.82:8081/repository/npm-all/chalk/-/chalk-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", @@ -341,12 +341,12 @@ }, "globals": { "version": "11.12.0", - "resolved": "http://173.15.15.82:8081/repository/npm-all/globals/-/globals-11.12.0.tgz", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "ms": { "version": "2.1.2", - "resolved": "http://173.15.15.82:8081/repository/npm-all/ms/-/ms-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } @@ -7248,7 +7248,7 @@ }, "promise": { "version": "7.3.1", - "resolved": "http://173.15.15.82:8081/repository/npm-all/promise/-/promise-7.3.1.tgz", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "~2.0.3" @@ -9677,7 +9677,7 @@ }, "chalk": { "version": "2.4.2", - "resolved": "http://173.15.15.82:8081/repository/npm-all/chalk/-/chalk-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", diff --git a/src/forge/About/Index.jsx b/src/forge/About/Index.jsx index 7f1222de1..7d544f78d 100644 --- a/src/forge/About/Index.jsx +++ b/src/forge/About/Index.jsx @@ -14,9 +14,10 @@ function Index(props){ const [ content , setContent ] = useState(undefined); const [ edit , setEdit ] = useState(false); const [ fileList , setFileList ] = useState(undefined); - const [ editOpration , setEditOpration ] = useState(false); + // const [ editOpration , setEditOpration ] = useState(false); const { owner , projectsId } = props.match.params; const { isManager , isDeveloper , current_user, projectDetail } = props; + const editOpration = current_user && current_user.login && isManager useEffect(()=>{ if(owner && projectsId && projectDetail){ @@ -25,11 +26,11 @@ function Index(props){ } },[owner,projectsId, projectDetail]) - useEffect(()=>{ - if( (current_user && current_user.login) && (isManager === true || isDeveloper === true)){ - setEditOpration(true); - } - },[isManager , isDeveloper]) + // useEffect(()=>{ + // if( (current_user && current_user.login) && (isManager === true || isDeveloper === true)){ + // setEditOpration(true); + // } + // },[isManager , isDeveloper]) function Init(){ const url = `/${owner}/${projectsId}/about.json`; axios.get(url).then(result=>{ diff --git a/src/forge/Information/Component/mobile/accessory.jsx b/src/forge/Information/Component/mobile/accessory.jsx index a505727f6..28d04bd37 100644 --- a/src/forge/Information/Component/mobile/accessory.jsx +++ b/src/forge/Information/Component/mobile/accessory.jsx @@ -1,5 +1,7 @@ import React from 'react'; import './index.scss'; +import publicImg from '../../img/gitlink-gz.png'; +import qqImg from '../../img/gitlink-qq.png'; function acce({type}){ return( @@ -14,11 +16,11 @@ function acce({type}){

欢迎加入GitLink!

diff --git a/src/forge/Information/Component/mobile/index.scss b/src/forge/Information/Component/mobile/index.scss index 24dd816f5..da7ae84e2 100644 --- a/src/forge/Information/Component/mobile/index.scss +++ b/src/forge/Information/Component/mobile/index.scss @@ -50,6 +50,7 @@ width: 7em; height: 7em; margin-bottom: 0.8em; + border-radius: 3px; } span{ display: block; diff --git a/src/forge/Information/img/gitlink-gz-old.png b/src/forge/Information/img/gitlink-gz-old.png new file mode 100644 index 000000000..4553490ac Binary files /dev/null and b/src/forge/Information/img/gitlink-gz-old.png differ diff --git a/src/forge/Information/img/gitlink-gz.png b/src/forge/Information/img/gitlink-gz.png index 4553490ac..56ab54589 100644 Binary files a/src/forge/Information/img/gitlink-gz.png and b/src/forge/Information/img/gitlink-gz.png differ diff --git a/src/forge/Information/img/gitlink-qq-old.png b/src/forge/Information/img/gitlink-qq-old.png new file mode 100644 index 000000000..bc243e433 Binary files /dev/null and b/src/forge/Information/img/gitlink-qq-old.png differ diff --git a/src/forge/Information/img/gitlink-qq.png b/src/forge/Information/img/gitlink-qq.png index bc243e433..d3c3bd579 100644 Binary files a/src/forge/Information/img/gitlink-qq.png and b/src/forge/Information/img/gitlink-qq.png differ diff --git a/src/forge/Issues/Component/newPanel.jsx b/src/forge/Issues/Component/newPanel.jsx index 67a02943f..babab11dc 100644 --- a/src/forge/Issues/Component/newPanel.jsx +++ b/src/forge/Issues/Component/newPanel.jsx @@ -16,8 +16,8 @@ function NewPanel(props,ref){ const { form: { getFieldDecorator, validateFields , setFieldsValue } } = props; useState(()=>{ - title && setTimeout(()=>{ - setFieldsValue({subject:title}); + setTimeout(()=>{ + title && setFieldsValue({subject:title}); desc && onContentChange(desc); },100) files && setAttachments(files); diff --git a/src/forge/Main/tree/Index.jsx b/src/forge/Main/tree/Index.jsx index 0faf9fd36..8b6a1b473 100644 --- a/src/forge/Main/tree/Index.jsx +++ b/src/forge/Main/tree/Index.jsx @@ -3,7 +3,7 @@ import CopyTool from '../../Component/CopyTool'; import { truncateCommitId } from '../../common/util'; import { Link } from 'react-router-dom'; import { getImageUrl , turnbar } from 'educoder'; -import { Button, Dropdown , Input, Menu , message, Modal, Select, Spin, Table, Tooltip , Radio } from 'antd'; +import { Button, Dropdown , Input, Menu , message, Modal, Select, Spin, Table, Tooltip , Radio , Popover } from 'antd'; import Modals from '../../Component/PublicModal/Index'; import './Index.scss'; @@ -34,7 +34,7 @@ function Index(props) { const { projectsId , owner } = props.match.params; const { isManager , isDeveloper , projectDetail , defaultBranch, getDetail } = props; useEffect(()=>{ - getList(chooseStatus); + getList(); },[name, reload, pageSize, current,chooseStatus]) useEffect(()=>{ @@ -131,9 +131,13 @@ function Index(props) { width: "300px", className: "branchActionColumn", render: (txt, item,key) => { - console.log("-----:",item.is_deleted); return ( - item.is_deleted ?
: + item.is_deleted ? +
+ 将基于 Commits{truncateCommitId(item.commit_id)}创建分支}> + + +
:
{ (isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) && @@ -166,7 +170,7 @@ function Index(props) { }) } - function getList(state) { + function getList() { const url = `/v1/${owner}/${projectsId}/branches.json`; Axios.get(url,{ params:{ @@ -303,7 +307,13 @@ function Index(props) { className='branchListTable' dataSource={list} columns={columns} - pagination={{current: current, pageSize: pageSize, total: total, showSizeChanger: true, onShowSizeChange:onShowSizeChange, showQuickJumper: true, onChange: changePage}} + pagination={{current: current, + pageSize: pageSize, + total: total, + showSizeChanger: true, + onShowSizeChange:onShowSizeChange, + showQuickJumper: true, onChange: changePage,hideOnSinglePage:true + }} > {/* { @@ -386,7 +396,7 @@ function Index(props) { >
-

确定删除{visible.name}分支?

+

删除分支,本操作将会关闭已开启的Pull Request

{ if (!err) { - let regEn = /[\\/:*?"<>|[\]-]/g; - if (regEn.test(values.title)) { - message.error('文件名不能有特殊字符: \\ / : * ? \" < > | [ \] -'); - setOperateFlag(false); - return; - } const {md_content, title} = values; if (wikiName && search!== "?copy") { updateWiki({ @@ -130,7 +124,7 @@ export default Form.create()(({ form, history, showNotification, projectDetail, projectId: project.id, pageName: wikiName, title, - commit_message: '', + message: '', content_base64: Base64.encode(md_content) }).then(res => dealRes(res, title)); } else { @@ -223,7 +217,7 @@ export default Form.create()(({ form, history, showNotification, projectDetail, projectId: project.id, pageName: '_Sidebar', title: '_Sidebar', - commit_message: '', + message: '', content_base64: Base64.encode(content) }).then(res => { if (res && res.message === "200") { @@ -333,7 +327,7 @@ export default Form.create()(({ form, history, showNotification, projectDetail, "title", [ { required: true, message: "请输入标题" }, - // { pattern: /[^`\[\]\/:*?''<>|%-+_]/g, message: '不允许部分特殊字符' } + { pattern: /^(?!-).*$/, message: '不能以-开头' } ], { project && checkItem.name && getWiki({ owner: owner, repo: projectsId, - pageName: checkItem.name, + pageName: checkItem.sub_url, projectId: project.id }).then(res => { if (res && res.message === "200") { @@ -190,11 +190,6 @@ export default (props) => { setAddMenuError("不能仅输入空格"); return; } - const regEn = /[\\/:*?"<>|[\]-]/g; - if (regEn.test(menuName)) { - setAddMenuError("不能有特殊字符: \\ / : * ? \" < > | [ \] -"); - return; - } // 校验一级目录中是否有相同名称 const oneMenuList = fileList.filter(item=>!item.title.trim().startsWith('[[')).map(i=>i.title.trim()) if(oneMenuList.includes(`- ${menuName}`)){ @@ -215,7 +210,7 @@ export default (props) => { projectId: project.id, pageName: '_Sidebar', title: '_Sidebar', - commit_message: '', + message: '', content_base64: Base64.encode(treeToMd(sidebarList)) }).then(res => { if (res && res.message === "200") { @@ -233,7 +228,7 @@ export default (props) => { } function goEdit(params) { - history.push(`/${owner}/${projectsId}/wiki/${encodeURI(checkItem.name)}/${checkItem.key}/edit${params}`); + history.push(`/${owner}/${projectsId}/wiki/${encodeURI(checkItem.sub_url)}/${checkItem.key}/edit${params}`); } function preview() { diff --git a/src/forge/Wiki/Preview.jsx b/src/forge/Wiki/Preview.jsx index b36b1946f..2b700f60c 100644 --- a/src/forge/Wiki/Preview.jsx +++ b/src/forge/Wiki/Preview.jsx @@ -63,7 +63,7 @@ export default (props) => { projectsId && checkItem.name && getWiki({ owner: owner, repo: projectsId, - pageName: checkItem.name, + pageName: checkItem.sub_url, projectId: projectId, }).then(res => { if (res && res.message === "200") { diff --git a/src/forge/Wiki/api.js b/src/forge/Wiki/api.js index 66425e0fb..2250ec5f4 100644 --- a/src/forge/Wiki/api.js +++ b/src/forge/Wiki/api.js @@ -116,13 +116,16 @@ export function markdownToTree(markdownText){ lines.map((item, index) =>{ const title = item.trim(); const isFile = title.startsWith('[[') && title.endsWith(']]'); + const titleStr = isFile ? title.substring(2, title.length - 2) : title.substring(2, title.length) const node = { // 带空格+[[]]或者- 标识 title: item, children: [], key: undefined, // 纯内容 - titleStr: isFile ? title.substring(2, title.length - 2) : title.substring(2, title.length), + titleStr, + // 编码后的title,获取wiki内容用title_sub + title_sub: encodeURIComponent(titleStr), // 是否是wiki文件 isFile: isFile } diff --git a/src/forge/Wiki/components/sidebar/index.jsx b/src/forge/Wiki/components/sidebar/index.jsx index 794ecbabc..d7046edb0 100644 --- a/src/forge/Wiki/components/sidebar/index.jsx +++ b/src/forge/Wiki/components/sidebar/index.jsx @@ -163,7 +163,7 @@ export default function Sidebar(props) { const {node, children, key} = item; if(isFile){ // 删除页面 - deleteWiki({owner: owner, repo: projectsId, projectId: project.id, pageName: title}).then(res => { + deleteWiki({owner: owner, repo: projectsId, projectId: project.id, pageName: item.title_sub}).then(res => { if(res && res.message === "204"){ // 递归过滤相同key值的节点,执行删除操作 const menuListByDel = findSameKeyByDel(menuList, key); @@ -267,7 +267,7 @@ export default function Sidebar(props) { projectId: project.id, pageName: '_Sidebar', title: '_Sidebar', - commit_message: '', + message: '', content_base64: Base64.encode(content) }).then(res => { if (res && res.message === "200") { @@ -303,20 +303,18 @@ export default function Sidebar(props) { e.stopPropagation(); setVisible(item); setIsEditName(type); - let title = item.title.trim(); - const isFile = title.startsWith('[[') && title.endsWith(']]'); - title = isFile ? title.substring(2,title.length-2) : title.substring(2, title.length); + const {titleStr, title_sub} = item; type === 2 && getWiki({ owner: owner, repo: projectsId, - pageName: title, + pageName: title_sub, projectId: project.id }).then(res => { if (res && res.message === "200") { setWikiContent(res.data.md_content); } }) - setMenuName(title); + setMenuName(titleStr); } // 新增子目录 或者 重命名目录 @@ -329,9 +327,8 @@ export default function Sidebar(props) { setAddMenuError("不能仅输入空格"); return; } - const regEn = /[\\/:*?"<>|[\]-]/g; - if (regEn.test(menuName)) { - setAddMenuError('不能有特殊字符: \\ / : * ? \" < > | [ \] -'); + if (isEditName === 2 && /^-/.test(menuName)) { + setAddMenuError('不能以-开头'); return; } if(!isEditName){ @@ -356,14 +353,15 @@ export default function Sidebar(props) { }else{ // isEditName 1 编辑目录名称 2编辑页面名称 const titleToJudge = isEditName === 2 ? `[[${menuName}]]` : `- ${menuName}`; - const {title, key} = visible; - if(title.trim() === titleToJudge){ + const {key, titleStr, title_sub} = visible; + // 判断是否有修改名称 + if(titleStr === menuName){ setAddMenuError("请修改名称"); return } // 找兄弟节点 const list = findBrotherNodesByKey(menuList, key) || []; - if(list.map(item=>item.title.trim()).includes(titleToJudge)){ + if(list.map(item=>item.titleStr).includes(menuName)){ setAddMenuError("不能与同级目录名称相同"); return } @@ -381,17 +379,16 @@ export default function Sidebar(props) { }) if(isEditName === 2){ // 编辑页面名称-> 修改wiki - const oldTitle = title.substring(title.indexOf('[[')+2, title.indexOf(']]')) updateWiki({ owner, repo: projectsId, projectId: project.id, // 原名称 - pageName: oldTitle, + pageName: title_sub, // 现名称 title: menuName, content_base64: wikiContent, - commit_message: '', + message: '', }).then(res=>{ if(res && res.message === '200'){ // 修改wiki名称接口请求成功,更新sidebar diff --git a/src/forge/Wiki/components/uploadWiki/index.jsx b/src/forge/Wiki/components/uploadWiki/index.jsx index 4113752dd..30cfe492c 100644 --- a/src/forge/Wiki/components/uploadWiki/index.jsx +++ b/src/forge/Wiki/components/uploadWiki/index.jsx @@ -59,10 +59,8 @@ export default function UploadWiki(props) { message.error('只能上传md、txt文件'); return false; } - - let regEn = /[\\/:*?"<>|[\]-]/g; - if (regEn.test(file.name)) { - message.error('文件名不能有特殊字符: \\ / : * ? \" < > | [ \] -'); + if (/^-/.test(file.name)) { + message.error('文件名不能以-开头'); return false; } @@ -86,7 +84,7 @@ export default function UploadWiki(props) { projectId: project.id, pageName: '_Sidebar', title: '_Sidebar', - commit_message: '', + message: '', content_base64: Base64.encode(treeToMd(sidebarList)) }).then(res => { if (res && res.message === "200") { diff --git a/src/modules/courses/css/Courses.css b/src/modules/courses/css/Courses.css index d46ec88e9..002ec1313 100644 --- a/src/modules/courses/css/Courses.css +++ b/src/modules/courses/css/Courses.css @@ -2139,7 +2139,8 @@ input.ant-input-number-input:focus { } /* md代码类样式渲染 */ -.new_li .markdown-body ul>li ,.markdown-body ul>li { +/* issues/3984: ,.markdown-body ul>li */ +.new_li .markdown-body ul>li { list-style-type: disc !important; margin-bottom: 0 !important; white-space: pre-wrap;