Compare commits

..

71 Commits

Author SHA1 Message Date
caishi cacb8c84ae 合并develop分支的个人中心改版-全部 2021-06-10 09:36:03 +08:00
caishi fb8ae3fcdf 小修 2021-06-09 18:08:49 +08:00
caishi a257d832cb issue 2021-06-09 18:08:01 +08:00
caishi ff7d191011 merge 2021-06-09 18:07:39 +08:00
caishi 9a2c3f1754 merge 2021-06-09 18:06:54 +08:00
caishi bcdf506e6c 数据统计三个时间筛选参数值必须是时间戳 2021-06-09 18:06:14 +08:00
caishi ccc6cb5d26 merge 2021-06-09 18:03:52 +08:00
caishi 0661c6b932 添加成员后要清除选中的成员 2021-06-09 18:03:24 +08:00
caishi 99947c0c87 merge 2021-06-09 17:56:51 +08:00
caishi 03cff6ec2e merge 2021-06-09 17:56:02 +08:00
caishi f86acfebdf merge冲突 2021-06-09 17:55:12 +08:00
caishi 9a62d7806e 同上-修改细节 2021-06-09 17:54:06 +08:00
caishi a7df6da5f0 merge 个人中心部分 冲突 2021-06-09 17:53:57 +08:00
caishi eab68ac270 概览页数据绑定完成,只差数据统计页 2021-06-09 17:52:43 +08:00
caishi a9e3513706 year 2021-06-09 17:52:31 +08:00
caishi 6b20391c72 merge 个人中心改版 2021-06-09 17:40:05 +08:00
caishi 3135300fe6 merge d029840874 2021-05-14 11:32:01 +08:00
caishi ecc6387113 no message 2021-05-08 17:22:44 +08:00
caishi 990c4e22b0 编辑合并请求-url地址错误 2021-05-08 14:35:51 +08:00
caishi 7eea9316dd detail+同步镜像type=2的才不需要合并请求 2021-05-07 17:41:01 +08:00
caishi 6a546c79e4 merge 2021-05-07 16:36:22 +08:00
caishi 4c48b6c77a merge 2021-05-07 16:35:17 +08:00
caishi 4d5430c3ed 统一项目简介、项目概览 2021-05-07 16:33:57 +08:00
caishi d49af735f1 merge 2021-05-06 17:21:19 +08:00
caishi 03370e8a07 merge 2021-05-06 17:19:09 +08:00
caishi 0b43fa8952 merge develop 2021-05-06 17:18:30 +08:00
caishi 465c4cc8c7 04-28休假期修改issue --需合并至其它分支(合并请求相关) 2021-04-28 20:23:57 +08:00
caishi 37668ddcd4 组织团队-无数据显示错误 2021-04-27 09:47:10 +08:00
caishi 7102594444 代码库编辑文件-切换到其它目录后要重新将编辑状态改为显示状态 2021-04-25 17:48:58 +08:00
caishi b2f2df65bb 样式覆盖 2021-04-23 18:07:15 +08:00
caishi 8a577fb263 资源库 2021-04-23 17:16:50 +08:00
caishi 5c491071b6 +上 关注后不需要提示 2021-04-23 16:37:16 +08:00
caishi c554237076 +上 贡献者悬浮框里增加的跳转链接不要新开页 2021-04-23 16:37:06 +08:00
caishi d22a741bf7 贡献者-悬浮内容增加跳转链接 2021-04-23 16:36:56 +08:00
caishi 383b3f5d74 imageUrl + / 2021-04-23 16:36:41 +08:00
caishi 63da7adcf9 个人中心关注-关注或者取消关注未更新状态 2021-04-23 16:36:31 +08:00
caishi 3243aeebc6 贡献者-悬浮卡片-测试版1 2021-04-23 16:36:22 +08:00
caishi 1a86a75345 发布评论者头像路径错误 2021-04-23 16:36:11 +08:00
caishi 3b6cc99d49 merge 2021-04-23 16:35:49 +08:00
caishi d872ffc606 merge 2021-04-23 16:31:15 +08:00
caishi 3b69c01ead merge 2021-04-23 16:30:45 +08:00
caishi 1e0608aa14 合并请求-提出申请者头像显示问题 2021-04-23 16:30:07 +08:00
caishi 9b6816e346 团队项目-团队项目管理-显示的name和跳转的login 2021-04-23 16:29:57 +08:00
caishi 6ee257231d 切换左侧目录,选择不同的文件时,文件详情没有更新 2021-04-23 16:29:46 +08:00
caishi 70edb73f6c all-默认头像(首字母加背景颜色) 2021-04-23 16:29:35 +08:00
caishi 5c7553d4aa merge 2021-04-23 16:29:16 +08:00
caishi 278701f24b 上线后的getImageURL也不用在前面加/ + 一些小样式修改 2021-04-23 16:27:56 +08:00
caishi 97ab819bf9 merge 2021-04-23 16:27:37 +08:00
caishi d870f17b85 readme-文件增加一个目录下拉icon 2021-04-23 16:26:02 +08:00
caishi 91ac6c2357 组织团队-新增一个团队标识 2021-04-23 16:25:47 +08:00
caishi 3702d1c1a5 merge 2021-04-23 16:25:35 +08:00
caishi 93d48c359e merge 2021-04-23 16:25:03 +08:00
caishi 80dace18e9 资源库不需要按引用次数排序 2021-04-23 16:24:23 +08:00
caishi 375cbb37df merge 2021-04-23 16:24:02 +08:00
caishi 10d933e037 merge develop 2021-04-23 16:23:29 +08:00
caishi 4fdd3f6f80 组织-团队列表的头像login为undefined 2021-04-23 16:22:36 +08:00
caishi 458b56e33b 去掉悬浮手册按钮 2021-04-23 16:22:22 +08:00
caishi c256887132 注册成功后跳转到首页 2021-03-31 15:13:32 +08:00
caishi 6a588db7f6 清理代码 2021-03-31 15:03:16 +08:00
caishi 6c4e1c6665 Merge branch 'standalone' into dev_local 2021-03-31 14:42:24 +08:00
caishi c554d2c00d 重置settings为undefined 2021-03-31 14:35:23 +08:00
caishi b69bf5974a remove 2021-03-31 14:28:22 +08:00
caishi ecb1691b4d Trustie 2021-03-31 14:17:48 +08:00
caishi 6a9f2b31a6 注册页面logo和底部信息 2021-03-31 14:04:09 +08:00
caishi 4947cd8456 浏览器ico要用trustie的logo 2021-03-31 12:07:11 +08:00
caishi 8429effe16 没logo时会将setting重置为空 2021-03-31 12:02:38 +08:00
caishi 49ebe450be 合并测试版分支 2021-03-31 11:21:07 +08:00
caishi e3c926da77 注册 2021-03-29 17:37:16 +08:00
caishi af48da2eb3 href 2021-03-29 17:14:56 +08:00
caishi 6630309466 Merge branch 'develop' into dev_local 2021-03-29 16:58:48 +08:00
caishi a7c3dee7e3 2020-11-26 10:55:03 +08:00
208 changed files with 4329 additions and 12865 deletions

View File

@ -1,20 +1,294 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="9830c5da-176a-4c72-a301-9f6ce98c82fe" name="Default Changelist" comment="色值修改">
<change beforePath="$PROJECT_DIR$/src/forge/Branch/branch.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Branch/branch.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/Component/Component.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Component/Component.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/Main/Index.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Main/Index.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/Main/list.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Main/list.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/Main/sub/sub.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Main/sub/sub.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/Wiki/Index.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Wiki/Index.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/Wiki/components/Login/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Wiki/components/Login/index.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/Wiki/components/ModalFun/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/Wiki/components/ModalFun/index.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/forge/css/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/src/forge/css/index.css" afterDir="false" />
<list default="true" id="9830c5da-176a-4c72-a301-9f6ce98c82fe" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/build/LICENSE" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/README.md" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/asset-manifest.json" beforeDir="false" afterPath="$PROJECT_DIR$/build/asset-manifest.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/build/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build/service-worker.js" beforeDir="false" afterPath="$PROJECT_DIR$/build/service-worker.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/0.b4e2ef10.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/1.68949f00.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/10.1be71b42.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/100.41f2a409.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/101.8c9ebcb9.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/102.ae5e7930.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/103.71e1260c.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/104.6010b0d8.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/105.d97473e3.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/106.a18d9295.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/107.e4fa8da8.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/108.cb5fa18c.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/109.728021f4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/11.1e6e3f2f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/110.4d60f060.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/111.00847641.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/112.dff32e36.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/113.9321d650.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/114.ab44c57c.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/115.16bc2b0d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/116.acb34db4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/117.c12032ae.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/118.06ac0c97.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/119.09fe7ab0.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/12.c388554b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/120.712692c0.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/121.5542a234.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/122.5434414a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/123.56b5aa50.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/124.4fa3c025.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/125.e90a0e54.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/126.6ac902e8.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/127.382109ca.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/128.f5cab6ce.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/129.a97defb5.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/13.5f9dd754.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/130.dc6cfef3.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/131.e36c51f6.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/132.e86e6598.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/133.cd5b0e41.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/134.a45157f4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/135.219cca2d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/136.792455ab.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/137.d98f1f26.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/138.537d528f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/139.f968f8da.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/14.ae36f994.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/140.d2937c5d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/141.41414563.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/142.085bcaac.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/143.7c7bdefd.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/144.2734eeac.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/145.0567a7a7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/146.6f118df0.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/147.8ad6802f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/148.1509b466.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/149.5a32ad42.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/15.63726bf5.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/150.67b85412.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/151.80c1ff31.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/152.a8ce322f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/153.eb7d58a7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/154.4378c4dc.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/155.fd685811.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/156.2b59a7a3.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/157.2d1b2b40.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/158.809809fb.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/159.6b94727b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/16.cd292edc.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/160.5c01b4fe.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/161.2e3c0cf9.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/162.87f4e888.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/163.0a540ffa.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/164.b22433aa.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/165.2670f91b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/166.ba688344.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/167.c636b766.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/168.96ee0643.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/169.59c6e595.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/17.9b37107f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/170.a0e40916.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/171.c5e14617.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/172.aa2c6247.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/173.f234f2ec.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/174.23eb263b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/175.978237cd.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/176.6a70c7ca.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/177.babfb8a0.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/178.ca78bfb7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/179.d209043e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/18.59166b96.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/180.34e55d7e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/181.dd0e9427.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/182.c133a270.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/183.f43e4007.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/184.3abba332.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/185.c61d56af.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/186.5ca9f085.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/187.99889df3.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/188.9a0c959d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/189.98f6f431.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/19.e9122038.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/190.a972b289.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/191.91c8d4dd.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/192.09b656bb.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/193.2db797e4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/194.570ec7dc.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/195.8bafb8cc.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/196.ebf790e4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/197.e98bbe5e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/198.59eec2cd.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/199.f7a6cf5d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/2.2225a575.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/20.ea1b83ca.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/200.64c98b62.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/201.4dcc10b4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/202.4e8c6091.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/203.d93d18f4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/204.0919cf31.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/205.1d636166.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/206.5c119f09.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/207.147ba6db.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/208.25081b68.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/209.784c19f9.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/21.66ea1441.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/210.ebc5386b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/211.ca304f55.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/212.b5fc6346.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/213.9e5a8f54.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/214.471a7c4b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/215.cf8d392b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/216.8ce08d4e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/217.03e5cde4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/218.c3b4a63d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/219.df96a008.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/22.69d33500.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/220.83a4b3b7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/221.0e7c7b15.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/222.ae23590f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/223.6e1a4ddc.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/224.66c696e0.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/225.86f6de74.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/226.334eacdf.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/227.fded1c54.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/228.081121a3.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/229.fbecdb8f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/23.f3d3a190.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/230.54214923.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/231.78c978ac.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/232.65715f0f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/233.892f3048.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/234.9aa182e7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/235.d81ddb83.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/236.69cf4cf6.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/237.71ab4f1f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/238.8572225b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/239.fcae5847.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/24.2f9ea72c.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/240.e2238e45.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/241.83f72690.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/242.d3cb57dd.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/243.99af0ef6.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/244.38603408.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/245.2d35733a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/246.e8bec9f4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/247.c9b742e0.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/248.9f3a7f5e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/249.a235bfb8.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/25.3253bb14.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/250.89a0ec2e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/251.f94f4795.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/252.614475d7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/253.16b76954.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/254.64d033a9.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/255.d2823d40.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/256.1eca44ce.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/257.7dd534ae.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/258.03522780.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/259.073dfc4a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/26.9902b511.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/260.35044602.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/261.617c2c29.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/262.031490eb.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/263.0713aea5.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/264.72a7fa9b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/265.8136f3c3.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/266.5c84b920.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/267.56ebb248.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/268.21a4574f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/269.28226efe.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/27.4304d4c5.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/270.c5d4fa4b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/271.78c89e20.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/272.c46f7455.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/273.aa76ad67.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/274.42a38d5c.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/275.eab35d6d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/276.ba152567.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/277.8ad1fd18.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/278.82ce41b4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/279.92f86639.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/28.3836fc1f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/280.d787fd18.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/281.8bdfd9de.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/282.2f9ff948.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/283.40367bdd.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/29.b7147766.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/3.31787e19.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/30.a574d03f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/31.df24e028.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/32.c4d7bbea.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/33.a4469f83.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/34.a525a713.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/35.991c6b3a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/36.ca30f366.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/37.b67239f9.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/38.d6220035.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/39.8bbe7e4b.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/4.3c8412d9.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/42.b16613be.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/46.41f6ac73.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/47.b0fb496a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/48.0f00b572.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/49.8b9d29ee.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/5.2b2c8a26.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/50.b42a5752.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/51.37761187.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/52.550fc073.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/53.86605c6d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/54.e91a419f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/55.c6646d9f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/56.b701b846.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/57.7796d2c0.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/58.865fc1eb.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/59.b58d70cd.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/6.625bd454.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/60.f785cede.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/61.f63d91e7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/62.b83b97dc.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/63.5d9d4d43.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/64.d1514b70.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/65.67458d6c.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/66.ab5a4b68.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/67.24cbd43e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/68.26be36d2.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/69.d34e03a8.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/7.45c119ae.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/70.71f3f5e9.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/71.3e0e22a5.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/72.58d589d7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/73.38beeb0e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/74.f0ac65fe.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/75.9f0bfe3e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/76.7bf08411.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/77.cc859ed7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/78.1e7b969f.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/79.d68cadb4.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/8.ce3f8347.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/80.3633279d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/81.13af2c38.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/82.dfb68271.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/83.a2cc3c51.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/84.284aff4a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/85.41f3159a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/86.4e688009.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/87.90d54fab.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/88.03076a1d.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/89.0d2f2ee8.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/9.562a7877.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/90.3b84e0a5.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/91.ad92675e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/92.6abb40b8.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/93.e5666aea.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/94.149f3765.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/95.36a069b7.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/96.c09dc12e.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/97.8ff3af84.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/98.cd3f899c.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/99.07307f5a.chunk.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/build/static/js/main.dda56577.js" beforeDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@ -225,7 +499,6 @@
<option value="$PROJECT_DIR$/src/forge/Main/Detail.js" />
<option value="$PROJECT_DIR$/src/forge/Main/CoderRootCommit.js" />
<option value="$PROJECT_DIR$/src/forge/Activity/ActivityItem.js" />
<option value="$PROJECT_DIR$/src/forge/Main/CoderRootDirectory.js" />
<option value="$PROJECT_DIR$/src/forge/Branch/CloneAddress.js" />
<option value="$PROJECT_DIR$/src/forge/Version/version.js" />
<option value="$PROJECT_DIR$/public/css/css_min_all.css" />
@ -251,7 +524,6 @@
<option name="width" value="1440" />
<option name="height" value="900" />
</component>
<component name="ProjectId" id="1xHteQnKsYu4IEUm8tEsYIEEC5E" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView">
<navigator proportions="" version="1">
@ -277,30 +549,18 @@
<pane id="Scope" />
</panes>
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/forge/Main" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
<property name="node.js.path.for.package.tslint" value="project" />
<property name="node.js.selected.package.eslint" value="E:\file\forgeplus-react\node_modules\eslint" />
<property name="node.js.selected.package.tslint" value="(autodetect)" />
<property name="node.js.selected.package.eslint" value="$PROJECT_DIR$/node_modules/eslint" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="nodejs_package_manager_path" value="npm" />
<property name="ts.external.directory.path" value="$APPLICATION_HOME_DIR$/plugins/JavaScriptLanguage/jsLanguageServicesImpl/external" />
<property name="vue.rearranger.settings.migration" value="true" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="E:\file\forgeplus-react\src\forge\Main" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$" />
<recent name="$PROJECT_DIR$/src/modules/user/usersInfo" />
@ -315,7 +575,18 @@
</list>
</option>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SpringUtil" SPRING_PRE_LOADER_OPTION="true" />
<component name="SvnConfiguration">
<configuration />
@ -364,8 +635,6 @@
<workItem from="1587870344748" duration="138000" />
<workItem from="1587882941476" duration="4365000" />
<workItem from="1587891008299" duration="390000" />
<workItem from="1630023942152" duration="459000" />
<workItem from="1630024424307" duration="17223000" />
</task>
<servers />
</component>
@ -398,7 +667,7 @@
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
<option name="version" value="1" />
</component>
<component name="Vcs.Log.History.Properties">
<option name="COLUMN_ORDER">
@ -415,7 +684,22 @@
<map>
<entry key="MAIN">
<value>
<State />
<State>
<option name="RECENTLY_FILTERED_USER_GROUPS">
<collection />
</option>
<option name="RECENTLY_FILTERED_BRANCH_GROUPS">
<collection />
</option>
<option name="COLUMN_ORDER">
<list>
<option value="0" />
<option value="1" />
<option value="2" />
<option value="3" />
</list>
</option>
</State>
</value>
</entry>
</map>
@ -434,19 +718,6 @@
</entry>
</map>
</option>
<option name="oldMeFiltersMigrated" value="true" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" type="javascript">
<url>file://$PROJECT_DIR$/src/forge/Main/CoderDepot.jsx</url>
<line>409</line>
<properties lambdaOrdinal="-1" />
<option name="timeStamp" value="1" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/modules/user/usersInfo/usersInfo.css">
@ -748,16 +1019,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/forge/Main/CoderRootDirectory.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="153">
<caret line="9" column="50" lean-forward="true" selection-start-line="9" selection-start-column="50" selection-end-line="9" selection-end-column="50" />
<folding>
<element signature="n#CoderRootDirectory#0" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/modules/user/usersInfo/InfosBanner.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="192">

325
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "forge",
"version": "3.0.0",
"name": "educoder",
"version": "0.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -990,18 +990,6 @@
"react-lifecycles-compat": "^3.0.4",
"warning": "^4.0.3"
}
},
"react-slick": {
"version": "0.25.2",
"resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.25.2.tgz",
"integrity": "sha1-VjMbZ9R9i8/i3OtqyrHI/VvR9rw=",
"requires": {
"classnames": "^2.2.5",
"enquire.js": "^2.1.6",
"json2mq": "^0.2.0",
"lodash.debounce": "^4.0.8",
"resize-observer-polyfill": "^1.5.0"
}
}
}
},
@ -1273,7 +1261,7 @@
},
"babel-cli": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
"resolved": "https://registry.npm.taobao.org/babel-cli/download/babel-cli-6.26.0.tgz",
"integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
"dev": true,
"requires": {
@ -1296,7 +1284,7 @@
"dependencies": {
"chokidar": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
"resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz?cache=0&sync_timestamp=1602585438968&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-1.7.0.tgz",
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true,
"optional": true,
@ -1314,7 +1302,7 @@
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
}
@ -1413,7 +1401,7 @@
},
"babel-helper-bindify-decorators": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-helper-bindify-decorators/download/babel-helper-bindify-decorators-6.24.1.tgz",
"integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
"dev": true,
"requires": {
@ -1476,7 +1464,7 @@
},
"babel-helper-explode-class": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-helper-explode-class/download/babel-helper-explode-class-6.24.1.tgz",
"integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
"dev": true,
"requires": {
@ -1676,7 +1664,7 @@
},
"babel-plugin-syntax-async-generators": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
"resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-async-generators/download/babel-plugin-syntax-async-generators-6.13.0.tgz",
"integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
"dev": true
},
@ -1687,7 +1675,7 @@
},
"babel-plugin-syntax-decorators": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
"resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz",
"integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
"dev": true
},
@ -1723,7 +1711,7 @@
},
"babel-plugin-transform-async-generator-functions": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-plugin-transform-async-generator-functions/download/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
"integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
"dev": true,
"requires": {
@ -1755,7 +1743,7 @@
},
"babel-plugin-transform-decorators": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-plugin-transform-decorators/download/babel-plugin-transform-decorators-6.24.1.tgz",
"integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
"dev": true,
"requires": {
@ -2060,7 +2048,7 @@
},
"babel-plugin-transform-runtime": {
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
"resolved": "https://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz",
"integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
"requires": {
"babel-runtime": "^6.22.0"
@ -2077,8 +2065,9 @@
},
"babel-polyfill": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
"resolved": "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz",
"integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
"dev": true,
"requires": {
"babel-runtime": "^6.26.0",
"core-js": "^2.5.0",
@ -2087,8 +2076,9 @@
"dependencies": {
"regenerator-runtime": {
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
"resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz?cache=0&sync_timestamp=1595456367497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.10.5.tgz",
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
"dev": true
}
}
},
@ -2131,7 +2121,7 @@
},
"babel-preset-es2015": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-preset-es2015/download/babel-preset-es2015-6.24.1.tgz",
"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
"dev": true,
"requires": {
@ -2179,7 +2169,7 @@
},
"babel-preset-react": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-preset-react/download/babel-preset-react-6.24.1.tgz",
"integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
"requires": {
"babel-plugin-syntax-jsx": "^6.3.13",
@ -2212,7 +2202,7 @@
},
"babel-preset-stage-2": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-preset-stage-2/download/babel-preset-stage-2-6.24.1.tgz",
"integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
"dev": true,
"requires": {
@ -2224,7 +2214,7 @@
},
"babel-preset-stage-3": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
"resolved": "https://registry.npm.taobao.org/babel-preset-stage-3/download/babel-preset-stage-3-6.24.1.tgz",
"integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
"dev": true,
"requires": {
@ -2377,12 +2367,6 @@
}
}
},
"base16": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/base16/download/base16-1.0.0.tgz",
"integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=",
"dev": true
},
"base64-js": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@ -3507,7 +3491,7 @@
},
"code-prettify": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/code-prettify/-/code-prettify-0.1.0.tgz",
"resolved": "https://registry.npm.taobao.org/code-prettify/download/code-prettify-0.1.0.tgz",
"integrity": "sha1-RocMyMGlDQm61TmzOpg9vUqjSx4="
},
"codemirror": {
@ -3875,23 +3859,6 @@
"warning": "^4.0.3"
}
},
"cross-fetch": {
"version": "3.1.4",
"resolved": "https://registry.nlark.com/cross-fetch/download/cross-fetch-3.1.4.tgz",
"integrity": "sha1-lyPzo6JHv4uJA586OAqSROj6Lzk=",
"dev": true,
"requires": {
"node-fetch": "2.6.1"
},
"dependencies": {
"node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.nlark.com/node-fetch/download/node-fetch-2.6.1.tgz?cache=0&sync_timestamp=1626684741221&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.1.tgz",
"integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=",
"dev": true
}
}
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
@ -3926,6 +3893,11 @@
"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",
@ -4885,7 +4857,7 @@
},
"dom-closest": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-closest/-/dom-closest-0.2.0.tgz",
"resolved": "https://registry.npm.taobao.org/dom-closest/download/dom-closest-0.2.0.tgz",
"integrity": "sha1-69n5HRvyLo1vR3h2u80+yQIWwM8=",
"requires": {
"dom-matches": ">=1.0.1"
@ -4929,7 +4901,7 @@
},
"dom-matches": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-matches/-/dom-matches-2.0.0.tgz",
"resolved": "https://registry.npm.taobao.org/dom-matches/download/dom-matches-2.0.0.tgz",
"integrity": "sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw="
},
"dom-scroll-into-view": {
@ -5091,11 +5063,11 @@
}
},
"echarts": {
"version": "4.9.0",
"resolved": "https://registry.nlark.com/echarts/download/echarts-4.9.0.tgz",
"integrity": "sha1-qbm6oD8Doqcx5jQMVb77V6nhNH0=",
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-4.7.0.tgz",
"integrity": "sha512-NlOTdUcAsIyCCG+N4uh0ZEvXtrPW2jvcuqf03RyqYeCKzyPbiOQ4I3MdKXMhxG3lBdqQNdNXVT71SB4KTQjN0A==",
"requires": {
"zrender": "4.3.2"
"zrender": "4.3.0"
}
},
"echarts-wordcloud": {
@ -5187,7 +5159,7 @@
},
"enquire.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
"resolved": "https://registry.npm.taobao.org/enquire.js/download/enquire.js-2.1.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenquire.js%2Fdownload%2Fenquire.js-2.1.6.tgz",
"integrity": "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ="
},
"entities": {
@ -5706,7 +5678,7 @@
},
"eventlistener": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/eventlistener/-/eventlistener-0.0.1.tgz",
"resolved": "https://registry.npm.taobao.org/eventlistener/download/eventlistener-0.0.1.tgz",
"integrity": "sha1-7Suqu4UiJ68rz4iRUscsY8pTLrg="
},
"events": {
@ -6237,41 +6209,6 @@
"bser": "2.1.1"
}
},
"fbemitter": {
"version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/fbemitter/download/fbemitter-3.0.0.tgz",
"integrity": "sha1-ALKhr1QRJUqrQWzXX55iib7kv/M=",
"dev": true,
"requires": {
"fbjs": "^3.0.0"
},
"dependencies": {
"fbjs": {
"version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/fbjs/download/fbjs-3.0.0.tgz?cache=0&sync_timestamp=1602048313843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffbjs%2Fdownload%2Ffbjs-3.0.0.tgz",
"integrity": "sha1-CQcGf7P1enj0XZXx6s/8rNYjwWU=",
"dev": true,
"requires": {
"cross-fetch": "^3.0.4",
"fbjs-css-vars": "^1.0.0",
"loose-envify": "^1.0.0",
"object-assign": "^4.1.0",
"promise": "^7.1.1",
"setimmediate": "^1.0.5",
"ua-parser-js": "^0.7.18"
}
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz",
"integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
"dev": true,
"requires": {
"asap": "~2.0.3"
}
}
}
},
"fbjs": {
"version": "0.8.17",
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
@ -6301,12 +6238,6 @@
}
}
},
"fbjs-css-vars": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/fbjs-css-vars/download/fbjs-css-vars-1.0.2.tgz",
"integrity": "sha1-IWVRE2rgL+JVkyw+yHdfGOLAeLg=",
"dev": true
},
"fecha": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
@ -6751,42 +6682,6 @@
"readable-stream": "^2.3.6"
}
},
"flux": {
"version": "4.0.1",
"resolved": "https://registry.npm.taobao.org/flux/download/flux-4.0.1.tgz",
"integrity": "sha1-eENQKwKEHUqqU0rws3MDSh917lw=",
"dev": true,
"requires": {
"fbemitter": "^3.0.0",
"fbjs": "^3.0.0"
},
"dependencies": {
"fbjs": {
"version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/fbjs/download/fbjs-3.0.0.tgz?cache=0&sync_timestamp=1602048313843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffbjs%2Fdownload%2Ffbjs-3.0.0.tgz",
"integrity": "sha1-CQcGf7P1enj0XZXx6s/8rNYjwWU=",
"dev": true,
"requires": {
"cross-fetch": "^3.0.4",
"fbjs-css-vars": "^1.0.0",
"loose-envify": "^1.0.0",
"object-assign": "^4.1.0",
"promise": "^7.1.1",
"setimmediate": "^1.0.5",
"ua-parser-js": "^0.7.18"
}
},
"promise": {
"version": "7.3.1",
"resolved": "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz",
"integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
"dev": true,
"requires": {
"asap": "~2.0.3"
}
}
}
},
"flv.js": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/flv.js/-/flv.js-1.5.0.tgz",
@ -8040,7 +7935,7 @@
},
"hammerjs": {
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
"resolved": "https://registry.npm.taobao.org/hammerjs/download/hammerjs-2.0.8.tgz",
"integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE="
},
"handle-thing": {
@ -8881,7 +8776,7 @@
},
"immutable": {
"version": "3.7.6",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz",
"resolved": "https://registry.npm.taobao.org/immutable/download/immutable-3.7.6.tgz",
"integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks="
},
"import-fresh": {
@ -10003,11 +9898,6 @@
"esprima": "^4.0.0"
}
},
"js2wordcloud": {
"version": "1.1.12",
"resolved": "https://registry.npm.taobao.org/js2wordcloud/download/js2wordcloud-1.1.12.tgz",
"integrity": "sha1-8BdC2k5qyzAAsoY1dmQWjvn8o64="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@ -10430,12 +10320,6 @@
"resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz",
"integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU="
},
"lodash.curry": {
"version": "4.1.1",
"resolved": "https://registry.npm.taobao.org/lodash.curry/download/lodash.curry-4.1.1.tgz",
"integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=",
"dev": true
},
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@ -10446,12 +10330,6 @@
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
},
"lodash.flow": {
"version": "3.5.0",
"resolved": "https://registry.npm.taobao.org/lodash.flow/download/lodash.flow-3.5.0.tgz",
"integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=",
"dev": true
},
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
@ -10486,7 +10364,7 @@
},
"lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"resolved": "https://registry.npm.taobao.org/lodash.throttle/download/lodash.throttle-4.1.1.tgz",
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
},
"lodash.uniq": {
@ -11673,7 +11551,7 @@
},
"output-file-sync": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
"resolved": "https://registry.npm.taobao.org/output-file-sync/download/output-file-sync-1.1.2.tgz",
"integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
"dev": true,
"requires": {
@ -14082,12 +13960,6 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"pure-color": {
"version": "1.3.0",
"resolved": "https://registry.npm.taobao.org/pure-color/download/pure-color-1.3.0.tgz",
"integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=",
"dev": true
},
"purgecss": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.1.2.tgz",
@ -14162,9 +14034,9 @@
"integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8="
},
"qrcode.react": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/qrcode.react/download/qrcode.react-1.0.1.tgz",
"integrity": "sha1-KDS7UOXidf/lr2kG7/FTkf6eOKU=",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-1.0.0.tgz",
"integrity": "sha512-jBXleohRTwvGBe1ngV+62QvEZ/9IZqQivdwzo9pJM4LQMoCM2VnvNBnKdjvGnKyDZ/l0nCDgsPod19RzlPvm/Q==",
"requires": {
"loose-envify": "^1.4.0",
"prop-types": "^15.6.0",
@ -14859,18 +14731,6 @@
"prop-types": "^15.6.2"
}
},
"react-base16-styling": {
"version": "0.6.0",
"resolved": "https://registry.npm.taobao.org/react-base16-styling/download/react-base16-styling-0.6.0.tgz",
"integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=",
"dev": true,
"requires": {
"base16": "^1.0.0",
"lodash.curry": "^4.0.1",
"lodash.flow": "^3.3.0",
"pure-color": "^1.2.0"
}
},
"react-beautiful-dnd": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-10.1.1.tgz",
@ -15236,18 +15096,6 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"react-json-view": {
"version": "1.21.3",
"resolved": "https://registry.npm.taobao.org/react-json-view/download/react-json-view-1.21.3.tgz",
"integrity": "sha1-8YQgnujxvzdPsMQbCBPP9UVJxHU=",
"dev": true,
"requires": {
"flux": "^4.0.1",
"react-base16-styling": "^0.6.0",
"react-lifecycles-compat": "^3.0.4",
"react-textarea-autosize": "^8.3.2"
}
},
"react-jss": {
"version": "8.6.1",
"resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.6.1.tgz",
@ -15407,9 +15255,9 @@
}
},
"react-slick": {
"version": "0.28.1",
"resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.28.1.tgz",
"integrity": "sha1-EsGNmRtZQy35w3V7pUCiJ7P7hbk=",
"version": "0.25.2",
"resolved": "https://registry.nlark.com/react-slick/download/react-slick-0.25.2.tgz",
"integrity": "sha1-VjMbZ9R9i8/i3OtqyrHI/VvR9rw=",
"requires": {
"classnames": "^2.2.5",
"enquire.js": "^2.1.6",
@ -15436,34 +15284,6 @@
"prop-types": "^15.5.4"
}
},
"react-textarea-autosize": {
"version": "8.3.3",
"resolved": "https://registry.nlark.com/react-textarea-autosize/download/react-textarea-autosize-8.3.3.tgz?cache=0&sync_timestamp=1622628433420&other_urls=https%3A%2F%2Fregistry.nlark.com%2Freact-textarea-autosize%2Fdownload%2Freact-textarea-autosize-8.3.3.tgz",
"integrity": "sha1-9wkTlFNp2kU/1VTBaPa6rNH6BNg=",
"dev": true,
"requires": {
"@babel/runtime": "^7.10.2",
"use-composed-ref": "^1.0.0",
"use-latest": "^1.0.0"
},
"dependencies": {
"@babel/runtime": {
"version": "7.14.8",
"resolved": "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.14.8.tgz",
"integrity": "sha1-cRmlb0IQGIUmlCkLn5FICXORtEY=",
"dev": true,
"requires": {
"regenerator-runtime": "^0.13.4"
}
},
"regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz",
"integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=",
"dev": true
}
}
},
"react-transition-group": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
@ -17220,11 +17040,6 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
"slick-carousel": {
"version": "1.8.1",
"resolved": "https://registry.npm.taobao.org/slick-carousel/download/slick-carousel-1.8.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslick-carousel%2Fdownload%2Fslick-carousel-1.8.1.tgz",
"integrity": "sha1-pL+ykBSIe7Zs5Si5C9DNomLMj40="
},
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@ -18559,12 +18374,6 @@
"integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
"dev": true
},
"ts-essentials": {
"version": "2.0.12",
"resolved": "https://registry.nlark.com/ts-essentials/download/ts-essentials-2.0.12.tgz",
"integrity": "sha1-yTA/PXT3X6dSjD1JuA4ImrCdh0U=",
"dev": true
},
"tslib": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
@ -19074,33 +18883,9 @@
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
},
"use-composed-ref": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/use-composed-ref/download/use-composed-ref-1.1.0.tgz",
"integrity": "sha1-kiDk6UqXt7AtfSfq6rCzcDRDi7w=",
"dev": true,
"requires": {
"ts-essentials": "^2.0.3"
}
},
"use-isomorphic-layout-effect": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/use-isomorphic-layout-effect/download/use-isomorphic-layout-effect-1.1.1.tgz",
"integrity": "sha1-e7ZYkXDNKYehUgQvkIT57/t1wiU=",
"dev": true
},
"use-latest": {
"version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/use-latest/download/use-latest-1.2.0.tgz",
"integrity": "sha1-pE9lcrgojgly7EEb3QhAraNm8jI=",
"dev": true,
"requires": {
"use-isomorphic-layout-effect": "^1.0.0"
}
},
"user-home": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
"resolved": "https://registry.npm.taobao.org/user-home/download/user-home-1.1.1.tgz",
"integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
"dev": true
},
@ -19157,7 +18942,7 @@
},
"v8flags": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
"resolved": "https://registry.npm.taobao.org/v8flags/download/v8flags-2.1.1.tgz?cache=0&sync_timestamp=1590964281452&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8flags%2Fdownload%2Fv8flags-2.1.1.tgz",
"integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
"dev": true,
"requires": {
@ -20701,16 +20486,6 @@
"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",
@ -20748,9 +20523,9 @@
}
},
"zrender": {
"version": "4.3.2",
"resolved": "https://registry.npm.taobao.org/zrender/download/zrender-4.3.2.tgz",
"integrity": "sha1-7HQy+UFcgsc1hLa3uMR+GwFiCcY="
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.0.tgz",
"integrity": "sha512-Dii6j2bDsPkxQayuVf2DXJeruIB/mKVxxcGRZQ9GExiBd4c3w7+oBuvo1O/JGHeFeA1nCmSDVDs/S7yKZG1nrA=="
}
}
}

View File

@ -193,7 +193,6 @@
"babel-core": "^6.26.0",
"babel-plugin-import": "^1.13.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-polyfill": "^6.26.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
@ -204,7 +203,6 @@
"node-sass": "^4.12.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"purgecss": "^2.1.2",
"react-json-view": "^1.21.3",
"reqwest": "^2.0.5",
"resize-observer-polyfill": "^1.5.1",
"terser-webpack-plugin": "^2.3.5",

View File

@ -114,6 +114,14 @@ a:visited {
color: #898989;
}
a:hover {
color: #FF7500;
}
a:hover.fa {
color: #FF7500;
}
input,
textarea,
select {

View File

@ -97,6 +97,10 @@ a:visited {
color: #05101a;
}
a:hover {
color: #459be5;
}
ol,
ul,
li {

View File

@ -1363,9 +1363,9 @@ a:visited {
color: #05101a;
}
/*a:hover {*/
/* color: #2A61FF!important;*/
/*}*/
a:hover {
color: #459be5;
}
ol,
ul,
@ -1473,7 +1473,7 @@ a.edu-txt-w80,
/*隐藏*/
.none {
display: none!important;
display: none
}
.block {
@ -1609,7 +1609,7 @@ a.decoration {
}
.mt6 {
margin-top: 3px;
margin-top: 6px;
}
.mt7 {
@ -1753,7 +1753,7 @@ a.decoration {
}
.mb15 {
margin-bottom: 15px!important;
margin-bottom: 15px;
}
.mb16 {
@ -2424,19 +2424,13 @@ input::-ms-clear {
.color-grey-c {
color: #ccc !important;
}
a.hoverLine:hover{
text-decoration: underline;
}
.color-grey-cd {
color: #cdcdcd !important;
}
.color-grey-d {
color: #ddd;
}
.color-grey-9 {
color: #333333 !important;
color: #999999 !important;
}
.color-grey-98 {
@ -2471,24 +2465,33 @@ a.hoverLine:hover{
a.color-grey-name:hover,
a.color-dark:hover,
a.color-grey-6:hover,
a.color-grey-3:hover,a.color-ooo span:hover{
color: #466AFF !important;
a.color-grey-3:hover {
color: #4cacff !important;
}
a.color-grey-9:hover,
a.color-grey-8:hover,
a.color-grey-c:hover {
color: #111C24 !important;
}
/*蓝色*/
.color-blue, .color-blue-file{
.color-blue {
color: #4CACFF !important;
}
.color-blue {
color: #2A61FF !important;
}
/* 绿色 */
.color-green-file{
color: #28BD6C;
}
/*主*/
.color-blue_4C {
color: #4CACFF !important;
}
a.color-blue:hover,
a.color-blue_4C:hover {
color: #459BE6 !important;
}
/*橙色*/
.color-orange {
@ -3406,7 +3409,7 @@ a.user_bluebg_btn {
}
.cdefault {
cursor: default!important;
cursor: default
}
@ -3581,6 +3584,42 @@ a.user_bluebg_btn {
margin-right: 5px;
}
/*-------------------个人主页:右侧提示区域--------------------------*/
.-task-sidebar {
position: fixed;
width: 40px;
height: 180px;
right: 0;
bottom: 80px;
z-index: 10;
}
.-task-sidebar div {
height: 40px;
line-height: 40px;
box-sizing: border-box;
width: 40px;
background: #4CACFF;
color: #fff;
font-size: 20px;
text-align: center;
margin-bottom: 5px;
border-radius: 4px;
}
.-task-sidebar div i {
color: #fff;
}
.-task-sidebar div i:hover {
color: #fff !important;
}
.gotop {
background-color: rgba(208, 207, 207, 0.5) !important;
padding: 0px !important;
}
/***** loading ******/
/*****载入中******/
@ -3905,21 +3944,11 @@ html>body #ajax-indicator {
max-height: 340px;
}/*头部导航条样式---2018-03-19--by-cs*/
.privateTag{
display: block;
padding:0px 6px;
border-radius: 12px;
border:1px solid #2FC25B;
height: 18px;
line-height: 18px;
font-size: 12px;
margin-left: 10px;
color: #2FC25B;
}
.head-nav {
text-align: center;
height: 70px;
box-sizing: border-box;
min-width: 780px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@ -6682,10 +6711,4 @@ p{
right: 0px;
top:4px;
color: #999;
}
.ant-input, .ant-input .ant-input-suffix{
background-color: #fff!important;
}
.has-error .ant-input{
background-color: #FEF1F0!important;
}

View File

@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 2340181 */
src: url('iconfont.woff2?t=1629875571487') format('woff2'),
url('iconfont.woff?t=1629875571487') format('woff'),
url('iconfont.ttf?t=1629875571487') format('truetype');
src: url('iconfont.woff2?t=1622517296245') format('woff2'),
url('iconfont.woff?t=1622517296245') format('woff'),
url('iconfont.ttf?t=1622517296245') format('truetype');
}
.iconfont {
@ -13,334 +13,6 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-xiangmugonggao:before {
content: "\e8c2";
}
.icon-chengguo:before {
content: "\e8c3";
}
.icon-chengjiaogonggao:before {
content: "\e8c0";
}
.icon-jishuzichan:before {
content: "\e8c1";
}
.icon-feibiaogonggao:before {
content: "\e8bc";
}
.icon-zhongbiaogonggao:before {
content: "\e8bd";
}
.icon-gengzhenggonggao:before {
content: "\e8be";
}
.icon-zhaobiaogonggao:before {
content: "\e8bf";
}
.icon-wenjian6:before {
content: "\e8ba";
}
.icon-wenjianjia4:before {
content: "\e8bb";
}
.icon-quxiaoguanzhu:before {
content: "\e89a";
}
.icon-dianzan_icon:before {
content: "\e8a2";
}
.icon-wenjian5:before {
content: "\e896";
}
.icon-wenjianjia3:before {
content: "\e8a9";
}
.icon-fuzhiicon:before {
content: "\e886";
}
.icon-zhuye-fill:before {
content: "\e876";
}
.icon-daimakuicon:before {
content: "\e884";
}
.icon-xinjian2:before {
content: "\e8b0";
}
.icon-xieyiicon:before {
content: "\e870";
}
.icon-neicunicon:before {
content: "\e891";
}
.icon-zishuwenjian_icon:before {
content: "\e8a6";
}
.icon-biaoqianicon:before {
content: "\e882";
}
.icon-a-bianji:before {
content: "\e883";
}
.icon-cangkushezhiicon:before {
content: "\e885";
}
.icon-lianjieicon:before {
content: "\e887";
}
.icon-hebingqingqiuicon:before {
content: "\e888";
}
.icon-lichengbeiicon:before {
content: "\e889";
}
.icon-gongzuoliuicon:before {
content: "\e88a";
}
.icon-dongtaiicon:before {
content: "\e88b";
}
.icon-morendianzan_icon:before {
content: "\e88e";
}
.icon-muluicon:before {
content: "\e894";
}
.icon-a-shezhi:before {
content: "\e899";
}
.icon-tijiaoicon:before {
content: "\e89e";
}
.icon-morenguanzhu_ICON:before {
content: "\e89f";
}
.icon-xialaanniu1:before {
content: "\e8a4";
}
.icon-zuohuaicon:before {
content: "\e8b5";
}
.icon-master_icon:before {
content: "\e8b6";
}
.icon-morenfuke_icon:before {
content: "\e8b7";
}
.icon-a-wikiicon:before {
content: "\e8b8";
}
.icon-yixiuicon:before {
content: "\e8b9";
}
.icon-suofang:before {
content: "\e87f";
}
.icon-fangdaicon:before {
content: "\e881";
}
.icon-sousuo_icon1:before {
content: "\e873";
}
.icon-huanying_icon:before {
content: "\e878";
}
.icon-wenjianjia2:before {
content: "\e879";
}
.icon-shanchuicon1:before {
content: "\e87a";
}
.icon-qingqiuicon:before {
content: "\e871";
}
.icon-xiangyingicon:before {
content: "\e87c";
}
.icon-duoxuanxuanzhong:before {
content: "\e88f";
}
.icon-cuowuicon:before {
content: "\e890";
}
.icon-chenggongicon:before {
content: "\e892";
}
.icon-weixuanzhongxiangyingicon:before {
content: "\e893";
}
.icon-bitianicon:before {
content: "\e895";
}
.icon-weixuanzhongxiangmubiaoqianicon:before {
content: "\e897";
}
.icon-liebiaoicon:before {
content: "\e898";
}
.icon-weixuanzhongqingqiuicon:before {
content: "\e89b";
}
.icon-xiezuozheguanliicon:before {
content: "\e8a1";
}
.icon-xuanzhongfenzhiicon:before {
content: "\e8a3";
}
.icon-xuanzhongjibenshezhiicon:before {
content: "\e8a5";
}
.icon-xuanzhongxiangmubiaoqianicon:before {
content: "\e8aa";
}
.icon-a-xuanzhongwebhookicon:before {
content: "\e8af";
}
.icon-shanchu_tc_icon:before {
content: "\e88c";
}
.icon-wiki_icon:before {
content: "\e88d";
}
.icon-daorumoban_icon:before {
content: "\e86f";
}
.icon-cuowu:before {
content: "\e872";
}
.icon-gengduo_icon:before {
content: "\e874";
}
.icon-fucengguanbi_icon:before {
content: "\e875";
}
.icon-shanchuicon:before {
content: "\e877";
}
.icon-sousuo_shanchuicon:before {
content: "\e87b";
}
.icon-sousuo_icon:before {
content: "\e87d";
}
.icon-wendangyulan_icon:before {
content: "\e87e";
}
.icon-xialaanniu:before {
content: "\e880";
}
.icon-erciqueren_icon:before {
content: "\e867";
}
.icon-xuanzhongssh_icon:before {
content: "\e868";
}
.icon-weixuanzhonganquanshezhi_icon:before {
content: "\e869";
}
.icon-weixuanzhongssh_icon:before {
content: "\e86a";
}
.icon-xuanzhonganquanshezhi_icon:before {
content: "\e86b";
}
.icon-shanchu_icon:before {
content: "\e86c";
}
.icon-liebiaossh_icon:before {
content: "\e86e";
}
.icon-file-submodule:before {
content: "\e866";
}
.icon-nv1:before {
content: "\e864";
}
.icon-nan1:before {
content: "\e865";
}
.icon-youxiang:before {
content: "\e8b2";
}

BIN
public/css/iconfont.eot Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -5,580 +5,6 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "23791639",
"name": "项目公告",
"font_class": "xiangmugonggao",
"unicode": "e8c2",
"unicode_decimal": 59586
},
{
"icon_id": "23791640",
"name": "成果",
"font_class": "chengguo",
"unicode": "e8c3",
"unicode_decimal": 59587
},
{
"icon_id": "23791410",
"name": "成交公告",
"font_class": "chengjiaogonggao",
"unicode": "e8c0",
"unicode_decimal": 59584
},
{
"icon_id": "23791411",
"name": "技术资产",
"font_class": "jishuzichan",
"unicode": "e8c1",
"unicode_decimal": 59585
},
{
"icon_id": "23790928",
"name": "废标公告",
"font_class": "feibiaogonggao",
"unicode": "e8bc",
"unicode_decimal": 59580
},
{
"icon_id": "23790929",
"name": "中标公告",
"font_class": "zhongbiaogonggao",
"unicode": "e8bd",
"unicode_decimal": 59581
},
{
"icon_id": "23790930",
"name": "更正公告",
"font_class": "gengzhenggonggao",
"unicode": "e8be",
"unicode_decimal": 59582
},
{
"icon_id": "23790931",
"name": "招标公告",
"font_class": "zhaobiaogonggao",
"unicode": "e8bf",
"unicode_decimal": 59583
},
{
"icon_id": "23732532",
"name": "文件",
"font_class": "wenjian6",
"unicode": "e8ba",
"unicode_decimal": 59578
},
{
"icon_id": "23732533",
"name": "文件夹",
"font_class": "wenjianjia4",
"unicode": "e8bb",
"unicode_decimal": 59579
},
{
"icon_id": "23642443",
"name": "取消关注",
"font_class": "quxiaoguanzhu",
"unicode": "e89a",
"unicode_decimal": 59546
},
{
"icon_id": "23642444",
"name": "点赞_icon",
"font_class": "dianzan_icon",
"unicode": "e8a2",
"unicode_decimal": 59554
},
{
"icon_id": "23639530",
"name": "文件",
"font_class": "wenjian5",
"unicode": "e896",
"unicode_decimal": 59542
},
{
"icon_id": "23639533",
"name": "文件夹",
"font_class": "wenjianjia3",
"unicode": "e8a9",
"unicode_decimal": 59561
},
{
"icon_id": "23639440",
"name": "复制icon",
"font_class": "fuzhiicon",
"unicode": "e886",
"unicode_decimal": 59526
},
{
"icon_id": "23639422",
"name": "主页-fill",
"font_class": "zhuye-fill",
"unicode": "e876",
"unicode_decimal": 59510
},
{
"icon_id": "23639423",
"name": "代码库icon",
"font_class": "daimakuicon",
"unicode": "e884",
"unicode_decimal": 59524
},
{
"icon_id": "23572260",
"name": "新建",
"font_class": "xinjian2",
"unicode": "e8b0",
"unicode_decimal": 59568
},
{
"icon_id": "23567674",
"name": "协议icon",
"font_class": "xieyiicon",
"unicode": "e870",
"unicode_decimal": 59504
},
{
"icon_id": "23567675",
"name": "内存icon",
"font_class": "neicunicon",
"unicode": "e891",
"unicode_decimal": 59537
},
{
"icon_id": "23567676",
"name": "自述文件_icon",
"font_class": "zishuwenjian_icon",
"unicode": "e8a6",
"unicode_decimal": 59558
},
{
"icon_id": "23472253",
"name": "标签icon",
"font_class": "biaoqianicon",
"unicode": "e882",
"unicode_decimal": 59522
},
{
"icon_id": "23472254",
"name": "编 辑",
"font_class": "a-bianji",
"unicode": "e883",
"unicode_decimal": 59523
},
{
"icon_id": "23472256",
"name": "仓库设置icon",
"font_class": "cangkushezhiicon",
"unicode": "e885",
"unicode_decimal": 59525
},
{
"icon_id": "23472258",
"name": "链接icon",
"font_class": "lianjieicon",
"unicode": "e887",
"unicode_decimal": 59527
},
{
"icon_id": "23472259",
"name": "合并请求icon",
"font_class": "hebingqingqiuicon",
"unicode": "e888",
"unicode_decimal": 59528
},
{
"icon_id": "23472260",
"name": "里程碑icon",
"font_class": "lichengbeiicon",
"unicode": "e889",
"unicode_decimal": 59529
},
{
"icon_id": "23472261",
"name": "工作流icon",
"font_class": "gongzuoliuicon",
"unicode": "e88a",
"unicode_decimal": 59530
},
{
"icon_id": "23472262",
"name": "动态icon",
"font_class": "dongtaiicon",
"unicode": "e88b",
"unicode_decimal": 59531
},
{
"icon_id": "23472263",
"name": "默认点赞_icon",
"font_class": "morendianzan_icon",
"unicode": "e88e",
"unicode_decimal": 59534
},
{
"icon_id": "23472265",
"name": "目录icon",
"font_class": "muluicon",
"unicode": "e894",
"unicode_decimal": 59540
},
{
"icon_id": "23472267",
"name": "设 置",
"font_class": "a-shezhi",
"unicode": "e899",
"unicode_decimal": 59545
},
{
"icon_id": "23472269",
"name": "提交icon",
"font_class": "tijiaoicon",
"unicode": "e89e",
"unicode_decimal": 59550
},
{
"icon_id": "23472270",
"name": "默认关注_ICON",
"font_class": "morenguanzhu_ICON",
"unicode": "e89f",
"unicode_decimal": 59551
},
{
"icon_id": "23472272",
"name": "下拉按钮",
"font_class": "xialaanniu1",
"unicode": "e8a4",
"unicode_decimal": 59556
},
{
"icon_id": "23472276",
"name": "左滑icon",
"font_class": "zuohuaicon",
"unicode": "e8b5",
"unicode_decimal": 59573
},
{
"icon_id": "23472277",
"name": "master_icon",
"font_class": "master_icon",
"unicode": "e8b6",
"unicode_decimal": 59574
},
{
"icon_id": "23472278",
"name": "默认复刻_icon",
"font_class": "morenfuke_icon",
"unicode": "e8b7",
"unicode_decimal": 59575
},
{
"icon_id": "23472279",
"name": "wiki icon",
"font_class": "a-wikiicon",
"unicode": "e8b8",
"unicode_decimal": 59576
},
{
"icon_id": "23472280",
"name": "易修icon",
"font_class": "yixiuicon",
"unicode": "e8b9",
"unicode_decimal": 59577
},
{
"icon_id": "23436350",
"name": "缩放",
"font_class": "suofang",
"unicode": "e87f",
"unicode_decimal": 59519
},
{
"icon_id": "23436351",
"name": "放大icon",
"font_class": "fangdaicon",
"unicode": "e881",
"unicode_decimal": 59521
},
{
"icon_id": "23384231",
"name": "搜索_icon",
"font_class": "sousuo_icon1",
"unicode": "e873",
"unicode_decimal": 59507
},
{
"icon_id": "23384232",
"name": "欢迎_icon",
"font_class": "huanying_icon",
"unicode": "e878",
"unicode_decimal": 59512
},
{
"icon_id": "23384233",
"name": "文件夹",
"font_class": "wenjianjia2",
"unicode": "e879",
"unicode_decimal": 59513
},
{
"icon_id": "23384234",
"name": "删除icon",
"font_class": "shanchuicon1",
"unicode": "e87a",
"unicode_decimal": 59514
},
{
"icon_id": "23261798",
"name": "请求icon",
"font_class": "qingqiuicon",
"unicode": "e871",
"unicode_decimal": 59505
},
{
"icon_id": "23261799",
"name": "响应icon",
"font_class": "xiangyingicon",
"unicode": "e87c",
"unicode_decimal": 59516
},
{
"icon_id": "23144143",
"name": "多选选中",
"font_class": "duoxuanxuanzhong",
"unicode": "e88f",
"unicode_decimal": 59535
},
{
"icon_id": "23144144",
"name": "错误icon",
"font_class": "cuowuicon",
"unicode": "e890",
"unicode_decimal": 59536
},
{
"icon_id": "23144146",
"name": "成功icon",
"font_class": "chenggongicon",
"unicode": "e892",
"unicode_decimal": 59538
},
{
"icon_id": "23144147",
"name": "未选中响应icon",
"font_class": "weixuanzhongxiangyingicon",
"unicode": "e893",
"unicode_decimal": 59539
},
{
"icon_id": "23144149",
"name": "必填icon",
"font_class": "bitianicon",
"unicode": "e895",
"unicode_decimal": 59541
},
{
"icon_id": "23144151",
"name": "未选中项目标签icon",
"font_class": "weixuanzhongxiangmubiaoqianicon",
"unicode": "e897",
"unicode_decimal": 59543
},
{
"icon_id": "23144152",
"name": "列表icon",
"font_class": "liebiaoicon",
"unicode": "e898",
"unicode_decimal": 59544
},
{
"icon_id": "23144155",
"name": "未选中请求icon",
"font_class": "weixuanzhongqingqiuicon",
"unicode": "e89b",
"unicode_decimal": 59547
},
{
"icon_id": "23144158",
"name": "协作者管理icon",
"font_class": "xiezuozheguanliicon",
"unicode": "e8a1",
"unicode_decimal": 59553
},
{
"icon_id": "23144160",
"name": "选中分支icon",
"font_class": "xuanzhongfenzhiicon",
"unicode": "e8a3",
"unicode_decimal": 59555
},
{
"icon_id": "23144162",
"name": "选中基本设置icon",
"font_class": "xuanzhongjibenshezhiicon",
"unicode": "e8a5",
"unicode_decimal": 59557
},
{
"icon_id": "23144165",
"name": "选中项目标签icon",
"font_class": "xuanzhongxiangmubiaoqianicon",
"unicode": "e8aa",
"unicode_decimal": 59562
},
{
"icon_id": "23144167",
"name": "选中webhook icon",
"font_class": "a-xuanzhongwebhookicon",
"unicode": "e8af",
"unicode_decimal": 59567
},
{
"icon_id": "23046290",
"name": "shanchu_tc_icon",
"font_class": "shanchu_tc_icon",
"unicode": "e88c",
"unicode_decimal": 59532
},
{
"icon_id": "23046293",
"name": "wiki_icon",
"font_class": "wiki_icon",
"unicode": "e88d",
"unicode_decimal": 59533
},
{
"icon_id": "23046244",
"name": "导入模版_icon",
"font_class": "daorumoban_icon",
"unicode": "e86f",
"unicode_decimal": 59503
},
{
"icon_id": "23046252",
"name": "错误",
"font_class": "cuowu",
"unicode": "e872",
"unicode_decimal": 59506
},
{
"icon_id": "23046255",
"name": "更多_icon",
"font_class": "gengduo_icon",
"unicode": "e874",
"unicode_decimal": 59508
},
{
"icon_id": "23046258",
"name": "复层关闭_icon",
"font_class": "fucengguanbi_icon",
"unicode": "e875",
"unicode_decimal": 59509
},
{
"icon_id": "23046268",
"name": "删除icon",
"font_class": "shanchuicon",
"unicode": "e877",
"unicode_decimal": 59511
},
{
"icon_id": "23046273",
"name": "搜索_删除icon",
"font_class": "sousuo_shanchuicon",
"unicode": "e87b",
"unicode_decimal": 59515
},
{
"icon_id": "23046275",
"name": "搜索_icon",
"font_class": "sousuo_icon",
"unicode": "e87d",
"unicode_decimal": 59517
},
{
"icon_id": "23046276",
"name": "文档预览_icon",
"font_class": "wendangyulan_icon",
"unicode": "e87e",
"unicode_decimal": 59518
},
{
"icon_id": "23046278",
"name": "下拉按钮",
"font_class": "xialaanniu",
"unicode": "e880",
"unicode_decimal": 59520
},
{
"icon_id": "22906287",
"name": "二次确认_icon",
"font_class": "erciqueren_icon",
"unicode": "e867",
"unicode_decimal": 59495
},
{
"icon_id": "22906288",
"name": "选中ssh_icon",
"font_class": "xuanzhongssh_icon",
"unicode": "e868",
"unicode_decimal": 59496
},
{
"icon_id": "22906289",
"name": "未选中安全设置_icon",
"font_class": "weixuanzhonganquanshezhi_icon",
"unicode": "e869",
"unicode_decimal": 59497
},
{
"icon_id": "22906290",
"name": "未选中ssh_icon",
"font_class": "weixuanzhongssh_icon",
"unicode": "e86a",
"unicode_decimal": 59498
},
{
"icon_id": "22906291",
"name": "选中安全设置_icon",
"font_class": "xuanzhonganquanshezhi_icon",
"unicode": "e86b",
"unicode_decimal": 59499
},
{
"icon_id": "22906292",
"name": "删除_icon",
"font_class": "shanchu_icon",
"unicode": "e86c",
"unicode_decimal": 59500
},
{
"icon_id": "22906293",
"name": "列表ssh_icon",
"font_class": "liebiaossh_icon",
"unicode": "e86e",
"unicode_decimal": 59502
},
{
"icon_id": "17575494",
"name": "file-submodule",
"font_class": "file-submodule",
"unicode": "e866",
"unicode_decimal": 59494
},
{
"icon_id": "7539612",
"name": "nv",
"font_class": "nv1",
"unicode": "e864",
"unicode_decimal": 59492
},
{
"icon_id": "7539613",
"name": "nan",
"font_class": "nan1",
"unicode": "e865",
"unicode_decimal": 59493
},
{
"icon_id": "21936935",
"name": "邮箱",

1874
public/css/iconfont.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 733 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
public/favicon-.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="zh-CN" class="notranslate translated-ltr" translate="no">
<html lang="en">
<head>
<meta charset="utf-8">
<meta name=”Keywords” Content=”trustie,trustieforge,forge,确实让创建更美好,协同开发平台″>

View File

@ -60,13 +60,12 @@ body {
.ant-progress-textno {
color: #f5222d;
}
.CodeMirror pre.CodeMirror-line{
font-size: 16px!important;
}
/* md多空格 */
.markdown-body p {
margin:10px 0px!important;
font-size: 16px !important;
line-height: 2 !important;
white-space: pre-wrap;
}
@ -88,10 +87,6 @@ body {
border-left: 1px solid rgb(221, 221, 221);
/* 某些情况下被cm盖住了 */
z-index: 99;
padding:8px 8px 50px;
}
.editormd-preview .markdown-body{
padding:0px !important;
}
/* 图片点击放大的场景,隐藏图片链接 */

View File

@ -10,14 +10,15 @@ import {
import axios from 'axios';
import LoginDialog from './modules/login/LoginDialog';
import 'babel-polyfill';
import Loading from './Loading'
import Loading from './Loading';
import Loadable from 'react-loadable';
import marked from './common/marked';
import moment from 'moment'
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles';
import SiderBar from './forge/Component/SiderBar'
import history from './history';
import { SnackbarHOC } from 'educoder'
import { initAxiosInterceptors } from './AppConfig'
@ -39,11 +40,6 @@ const Projects = Loadable({
loader: () => import('./forge/Index'),
loading: Loading,
})
//forge安全设置
const Security = Loadable({
loader: () => import('./forge/SecuritySetting/Index'),
loading: Loading,
})
//forge项目-devOps详情
const OpsDetail = Loadable({
loader: () => import('./forge/DevOps/opsDetail'),
@ -78,19 +74,7 @@ const EducoderLogin = Loadable({
loader: () => import('./modules/login/EducoderLogin'),
loading: Loading,
})
const Search = Loadable({
loader: () => import('./modules/search/'),
loading: Loading,
})
const WikiPreview = Loadable({
loader: () => import('./forge/Wiki/Preview'),
loading: Loading,
})
const ProjectIndex = Loadable({
loader: () => import("./forge/Index"),
loading: Loading,
});
class App extends Component {
constructor(props) {
super(props);
@ -116,9 +100,36 @@ class App extends Component {
Addcoursestypes: false
})
};
ModalCancelsy = () => {
this.setState({
mydisplay: false,
})
window.location.href = "/";
};
ModalshowCancelsy = () => {
this.setState({
mydisplay: true,
})
};
disableVideoContextMenu = () => {
window.$("body").on("mousedown", "video", function (event) {
if (event.which === 3) {
window.$('video').bind('contextmenu', function () { return false; });
} else {
window.$('video').unbind('contextmenu');
}
});
}
componentDidMount() {
document.title = "loading...";
this.disableVideoContextMenu();
history.listen(() => {
this.forceUpdate()
const $ = window.$
$("html").animate({ scrollTop: $('html').scrollTop() - 0 })
});
initAxiosInterceptors(this.props);
this.getAppdata();
@ -196,23 +207,13 @@ class App extends Component {
};
render() {
const { mygetHelmetapi } = this.state;
let personal = mygetHelmetapi && mygetHelmetapi.personal;
return (
<Provider store={store}>
<ConfigProvider locale={zhCN}>
<MuiThemeProvider theme={theme}>
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
<SiderBar />
<Router>
<Switch>
{/* wiki预览 */}
<Route path="/projects/:owner/:projectsId/wiki/preview/:projectName/:projectId" render={
(props) => {
return (<WikiPreview {...this.props} {...props} {...this.state} />)
}
} />
{/*项目*/}
<Route
path={"/projects/:owner/:projectId/devops/:opsId/detail"}
@ -222,14 +223,6 @@ class App extends Component {
}
}>
</Route>
<Route
path={"/settings"}
render={
(props) => {
return (<Security {...this.props} {...props} {...this.state} />)
}
}>
</Route>
{/*项目*/}
<Route
path={"/projects"}
@ -260,25 +253,17 @@ class App extends Component {
</Route>
{/*404*/}
<Route path="/nopage" component={Shixunnopage} />
{/* 查询 */}
<Route path="/search" component={Search} />
{/* 个人主页 */}
<Route path="/users/:username"
render={
(props) => {
return (<InfosIndex {...this.props} {...this.state} />)
}
}></Route>
}></Route>
<Route exact path="/"
render={
(props) => (
personal && personal.length > 0 ?
<InfosIndex {...this.props} {...props} />
:
<ProjectIndex {...this.props} {...props} />
<Projects {...this.props} {...props} {...this.state}></Projects>
)
}
/>

View File

@ -9,7 +9,20 @@ class Loading extends Component {
}
render() {
return ""
return (
<div className="App" style={{ minHeight: '800px', width: "100%" }}>
<style>
{
`
.margintop{
margin-top:20%;
}
`
}
</style>
<Spin size="large" className={"margintop"} />
</div>
);
}
}

View File

@ -218,7 +218,7 @@ a:hover {
}
.color-blue {
color: #2A61FF;
color: #4CACFF;
}
.color-huang {

View File

@ -1,5 +1,4 @@
import moment from "moment";
import { number } from "prop-types";
// 处理整点 半点
// 取传入时间往后的第一个半点
@ -98,40 +97,3 @@ export function formatDuring(mss){
}
return days + "天" + hours + "小时" + minutes + "分";
}
/*
返回多久以前
backDate以前的某个日期
*/
export function timeAgo(backDate) {
try {
moment(backDate);
} catch (e) {
return;
}
if(typeof backDate ==='number'){
backDate=backDate*1000
}else{
backDate= moment(backDate);
}
let time = new Date() - backDate;
var days = Math.floor(time / (1000 * 60 * 60 * 24));
var hours = Math.floor((time % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((time % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((time % (1000 * 60 * 60)) / 1000);
if (time <= 0) {
return "刚刚";
}
if (days) {
return days + "天前";
}
if (hours) {
return hours + "小时前";
}
if (minutes) {
return minutes + "分前";
}
if (seconds) {
return seconds + "秒前";
}
}

View File

@ -18,23 +18,6 @@ export function getImageUrl(path) {
return `${path}`;
}
export function numFormat(num, digits){
let d = digits || 1;
var si = [
{ value: 1, symbol: "" },
{ value: 1E3, symbol: "k" },
{ value: 1E4, symbol: "W" }
];
var rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
var i;
for (i = si.length - 1; i > 0; i--) {
if (num >= si[i].value) {
break;
}
}
return (num / si[i].value).toFixed(d).replace(rx, "$1") + si[i].symbol;
}
export function getImage(path) {
// https://www.educoder.net
// https://testbdweb.trustie.net
@ -179,28 +162,28 @@ export function getmyUrl(geturl) {
}
export function getUploadActionUrl(path, goTest) {
return `${getUrl()}/api/attachments.json${isDev ?`${isDev ?`?debug=${window._debugType || 'admin'}` : ""}` : ""}`;
return `${getUrl()}/api/attachments.json?debug=${window._debugType || 'admin'}`;
}
export function getUploadLogoActionUrl() {
return `${getUrl()}/api/resumes/logo.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`;
return `${getUrl()}/api/resumes/logo.json?debug=${window._debugType || 'admin'}`;
}
export function getUploadActionUrltwo(id) {
return `${getUrlmys()}/api/shixuns/${id}/upload_data_sets.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
return `${getUrlmys()}/api/shixuns/${id}/upload_data_sets.json?debug=${window._debugType || 'admin'}`
}
export function getUploadActionUrlthree() {
return `${getUrlmys()}/api/jupyters/import_with_tpm.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
return `${getUrlmys()}/api/jupyters/import_with_tpm.json?debug=${window._debugType || 'admin'}`
}
export function getupload_git_file(id) {
return `${getUrlmys()}/api/shixuns/${id}/upload_git_file.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
return `${getUrlmys()}/api/shixuns/${id}/upload_git_file.json?debug=${window._debugType || 'admin'}`
}
export function getUploadActionUrlOfAuth(id) {
return `${getUrl()}/api/users/accounts/${id}/auth_attachment.json${isDev ?`?debug=${window._debugType || 'admin'}` : ""}`
return `${getUrl()}/api/users/accounts/${id}/auth_attachment.json?debug=${window._debugType || 'admin'}`
}
export function getRandomNumber(type) {

View File

@ -3,7 +3,7 @@
// export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil';
export {
getUploadLogoActionUrl as getUploadLogoActionUrl,numFormat as numFormat,
getUploadLogoActionUrl as getUploadLogoActionUrl,
getImageUrl as getImageUrl,getImage as getImage, getmyUrl as getmyUrl, getRandomNumber as getRandomNumber, getUrl as getUrl, publicSearchs as publicSearchs, getRandomcode as getRandomcode, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
, getUploadActionUrl as getUploadActionUrl, getUploadActionUrltwo as getUploadActionUrltwo, getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
, getTaskUrlById as getTaskUrlById, TEST_HOST, htmlEncode as htmlEncode, getupload_git_file as getupload_git_file, getcdnImageUrl as getcdnImageUrl
@ -27,7 +27,7 @@ export {
markdownToHTML, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll, isImageExtension,
downloadFile, sortDirections, validateLength, mdJSONParse, exportMdtoHtml
} from './TextUtil'
export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds ,timeAgo} from './DateUtil'
export { handleDateString, getNextHalfHourOfMoment, formatDuring, formatSeconds } from './DateUtil'
export { configShareForIndex, configShareForPaths, configShareForShixuns, configShareForCourses, configShareForCustom } from './util/ShareUtil'

View File

@ -46,18 +46,18 @@ export default ({
let id = decodeURIComponent(u.split("#")[1]);
let ele = document.getElementById(id);
if(ele){
window.scrollTo(0, ele.offsetTop + 120);
window.scrollTo(0, ele.offsetTop + 220);
}
}
}
},[url,html])
},[url])
const el = useRef();
function onAncherHandler(e) {
let target = e.target;
let target = e.target
if (target.tagName.toUpperCase() === 'A') {
let ancher = target.getAttribute('href');
if (ancher && ancher.startsWith('#')) {
let ancher = target.getAttribute('href')
if (ancher.startsWith('#')) {
e.preventDefault()
let viewEl = document.getElementById(ancher.replace('#', ''))
if (viewEl) {

View File

@ -1,7 +1,7 @@
import React , { Component } from 'react';
import { Dropdown , Menu , Icon , Pagination , Spin } from 'antd';
import '../css/index.scss';
import '../Branch/branch.scss';
import '../Branch/branch.css';
import './activity.css';
import NoneData from '../Nodata';

View File

@ -1,35 +1,39 @@
import React, { useState } from 'react';
import { Dropdown, Menu, Tooltip } from 'antd';
import "./branch.scss";
import React, { Component } from 'react';
import { Dropdown, Icon, Tooltip } from 'antd';
import "./branch.css";
function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
const [ key , setKey ] = useState("HTTP");
class CloneAddress extends Component {
// 点击按钮复制功能
function jsCopy(){
jsCopy = () => {
var e = document.getElementById("copy_rep_content");
e.select();
document.execCommand("Copy");
}
return (
<div className="downMenu">
<div style={{borderBottom:"1px solid #eee"}}>
<Menu className="urlMenu" selectedKeys={[key]} mode={"horizontal"}>
<Menu.Item key="HTTP" onClick={(e)=>{setKey(e.key)}}>HTTP</Menu.Item>
<Menu.Item key="SSH" onClick={(e)=>{setKey(e.key)}}>SSH</Menu.Item>
</Menu>
<div className="gitAddressClone">
<input type="text" id="copy_rep_content" value={key==="HTTP" ? http_url:ssh_url} />
<Tooltip title="复制链接">
<span className="color-blue" onClick={jsCopy}><i className="iconfont icon-fuzhi"></i></span>
</Tooltip>
</div>
render() {
const { http_url, downloadUrl } = this.props;
return (
<div className="gitAddressClone">
{/* <p className="addressTips"><span>版本库地址已变更,请基于新地址提交代码</span></p> */}
{
http_url && <span>HTTP</span>
}
<input type="text" id="copy_rep_content" value={http_url} />
<Tooltip title="复制链接">
<span className="color-blue" onClick={() => this.jsCopy()}><i className="iconfont icon-fuzhi"></i></span>
</Tooltip>
{
downloadUrl &&
<span>
<Dropdown overlay={downloadUrl} trigger={['click']} placement="bottomRight">
<a className="ant-dropdown-link">
<Icon type="cloud-download" className="font-18 fl color-blue" />
</a>
</Dropdown>
</span>
}
</div>
<Menu className="edu-txt-center">
<Menu.Item><a href={zip_url}>下载 ZIP</a></Menu.Item>
<Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>
</Menu>
</div>
)
)
}
}
export default CloneAddress;

View File

@ -1,36 +1,116 @@
import React , { useState , useEffect } from 'react';
import { Popover , Dropdown , Input , Spin } from 'antd';
import './branch.scss';
import { Popover , Input , Spin } from 'antd';
import './branch.css';
import { getBranch , getTag } from '../GetData/getData';
import SelectOverlay from './SelectOverlay';
export default (({ projectsId , branch , owner , changeBranch , branchList , tagflag = true })=>{
const [ showValue , setShowValue ] = useState(branch);
const [ inputValue , setInputValue] = useState(undefined);
const [ nav , setNav ] = useState(0);
const [ isSpin , setIsSpin ] = useState(true);
const [ flag , setFlag ] = useState(false);
const [ data , setData ] = useState(undefined);
const [ datas , setDatas ] = useState(undefined);
useEffect(()=>{
setShowValue(branch);
},[branch])
useEffect(()=>{
document.body.addEventListener('click', e => {
let name = e.target.className;
let turn = name === "ant-input OptionsInput" || name === "navli active"|| name === "navli" || name === "padding10 bor-bottom-greyE";
if(turn){
return;
}else{
setFlag(false);
}
})
})
useEffect(()=>{
if(branchList){
setData(branchList);
setDatas(branchList);
setIsSpin(false);
}
},[branchList])
async function getBranchs(id,owner){
let result = await getBranch(id,owner);
setData(result);
setDatas(result);
setIsSpin(false);
}
async function getTags(id,owner){
let result = await getTag(id,owner);
setData(result);
setDatas(result);
setIsSpin(false);
}
function changeInputValue(e){
setInputValue(e.target.value);
let filter = e.target.value ? data && data.length>0 && data.filter(item=>item.name.indexOf(e.target.value)>-1) : data;
setDatas(filter);
}
function changeNav(nav){
setNav(nav);
setIsSpin(true);
if(nav === 0){
getBranchs(projectsId,owner);
}else{
getTags(projectsId,owner);
}
}
function chooseitem(value){
// setShowValue(value);
changeBranch(value);
}
const menu = (
<SelectOverlay
changeBranch={changeBranch}
tagflag={tagflag}
projectsId={projectsId}
owner={owner}
branchList={branchList}
/>
<div>
<div className="padding10 bor-bottom-greyE">
<Input
placeholder="请输入分支或标签名称搜索"
autocomplete="off" className="OptionsInput" value={inputValue}
onChange={changeInputValue} style={{width:"220px"}}
/>
<ul className="navUl">
<li className={nav === 0?"navli active":"navli"} onClick={()=>changeNav(0)}><i className="iconfont icon-fenzhi1 font-14 mr3"></i>分支列表</li>
{ tagflag && <li className={nav === 1?"navli active":"navli"} onClick={()=>changeNav(1)}><i className="iconfont icon-biaoqian3 font-14 mr3"></i>标签列表</li> }
</ul>
</div>
<Spin spinning={isSpin}>
<ul className="OptionsUl" id="ul-btn">
{
datas && datas.length>0 ?
datas.map((item,key)=>{
return(
<li key={key} onClick={()=>chooseitem(item.name)}><a className="task-hide ulALink">{item.name}</a></li>
)
}):
<p className="listTips">暂无{inputValue}{nav === 0 ?"分支":"标签"}~</p>
}
</ul>
</Spin>
</div>
);
return(
<Dropdown placement='bottomLeft' overlay={menu} overlayClassName="branch-tagBox-list" trigger={['click']} >
<Popover placement="bottom" visible={flag} content={menu} onClick={()=>setFlag(!flag)} overlayClassName="branch-tagBox-list">
<div className="branch-tagBox">
{/* {nav === 0 ?"分支":"标签"} */}
<span className="color-grey-9 mr3 ml8"><i className="iconfont icon-fenzhi2 font-18"></i></span>
<a className="ant-dropdown-link task-hide">
<a className="ant-dropdown-link">
{showValue}
</a>
<i className="showtag iconfont icon-sanjiaoxing-down font-15 color-grey-9 mr5 ml5 mt1" />
<i className="showtag iconfont icon-xiajiantou font-14 color-grey-9 mr8" />
</div>
</Dropdown>
</Popover>
)
})

View File

@ -1,84 +0,0 @@
import React , { useState , useEffect } from 'react';
import { Input , Spin , Menu } from 'antd';
import { getBranch , getTag } from '../GetData/getData';
function SelectOverlay({ changeBranch , tagflag , branchList , projectsId , owner }) {
const [ inputValue , setInputValue] = useState(undefined);
const [ nav , setNav ] = useState(0);
const [ isSpin , setIsSpin ] = useState(true);
const [ data , setData ] = useState(undefined);
const [ datas , setDatas ] = useState(undefined);
const [ keys ,setKeys] = useState("branch");
useEffect(()=>{
if(branchList){
setData(branchList);
setDatas(branchList);
setIsSpin(false);
}
},[branchList])
async function getBranchs(id,owner){
let result = await getBranch(id,owner);
setData(result);
setDatas(result);
setIsSpin(false);
}
async function getTags(id,owner){
let result = await getTag(id,owner);
setData(result);
setDatas(result);
setIsSpin(false);
}
function chooseitem(value){
changeBranch(value);
}
function changeInputValue(e){
setInputValue(e.target.value);
let filter = e.target.value ? data && data.length>0 && data.filter(item=>item.name.indexOf(e.target.value)>-1) : data;
setDatas(filter);
}
function changeNav(e){
setKeys(e.key);
setIsSpin(true);
if(e.key === "branch"){
getBranchs(projectsId,owner);
}else{
getTags(projectsId,owner);
}
}
return(
<div className="overlayBranch">
<div className="padding15" style={{paddingBottom:"0px"}}>
<Input
prefix={<i className="iconfont icon-sousuo_icon1 font-14"></i>}
placeholder="请输入分支或标签名称搜索"
autocomplete="off" className="OptionsInput"
value={inputValue}
onChange={changeInputValue}
/>
</div>
<Menu mode="horizontal" className="navUl" selectedKeys={[keys]} onClick={changeNav}>
<Menu.Item key={"branch"}>分支</Menu.Item>
{ tagflag && <Menu.Item key={"tag"}>标签</Menu.Item> }
</Menu>
<Spin spinning={isSpin}>
<ul className="OptionsUl" id="ul-btn">
{
datas && datas.length>0 ?
datas.map((item,key)=>{
return(
<li key={key} onClick={()=>chooseitem(item.name)}><a className="task-hide ulALink">{item.name}</a></li>
)
}):
<p className="listTips">暂无{inputValue}{nav === 0 ?"分支":"标签"}~</p>
}
</ul>
</Spin>
</div>
)
}
export default SelectOverlay;

View File

@ -1,5 +1,5 @@
.branchDropdown {
border: 1px solid #eee;
.branchDropdown{
border:1px solid #eee;
border-radius: 4px;
display: flex;
justify-content: center;
@ -7,126 +7,78 @@
line-height: 40px;
min-width: 220px;
}
.branchDropdown .ant-dropdown-trigger {
.branchDropdown .ant-dropdown-trigger{
width: 100%;
padding: 0px 15px;
padding:0px 15px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
}
.branchOptions {
.branchOptions{
width: 220px;
box-shadow: 0px 0px 3px 1px rgba(134, 134, 134, 0.4);
border-radius: 3px;
background: #fff;
max-height: 300px;
}
.OptionsUl {
.OptionsUl{
max-height: 220px;
overflow-y: auto;
}
.OptionsUl li {
height: 30px;
line-height: 30px;
.OptionsUl li{
height: 35px;
line-height: 35px;
cursor: pointer;
padding: 0px 20px;
margin: 5px 0px;
padding:0px 10px;
}
.OptionsUl li:hover {
background-color: #F0F0F0;
.OptionsUl li:hover{
background-color: #F0F0F0;
}
.OptionsUl li a {
.OptionsUl li a{
display: block;
}
.OptionsInput {
.OptionsInput{
height: 32px;
padding-left: 4px;
line-height: 32px;
width: 100%;
}
.branch-tagBox {
border: 1px solid #D0D0D0;
.branch-tagBox{
border:1px solid #eee;
border-radius: 3px;
height: 36px;
height: 40px;
display: flex;
align-items: center;
cursor: pointer;
min-width: 104px;
min-width: 140px;
}
.branch-tagBox:hover {
background-color: #F3F4F6;
}
.branch-tagBox-list {
background: #FFFFFF;
box-shadow: 0px 4px 8px 2px rgba(212, 212, 212, 0.5);
border-radius: 4px;
}
.branch-tagBox-list .ant-popover-arrow {
.branch-tagBox-list .ant-popover-arrow{
display: none;
}
.branch-tagBox-list.ant-popover.ant-popover-placement-bottom {
padding-top: 0px;
.branch-tagBox-list.ant-popover.ant-popover-placement-bottom{
padding-top:0px;
}
.branch-tagBox-list .branch-tagBox .ant-dropdown-link {
.branch-tagBox .ant-dropdown-link{
display: block;
flex: 1;
max-width: 105px;
flex:1;
}
.branch-tagBox-list .ant-popover-inner-content {
padding: 0px;
.branch-tagBox-list .ant-popover-inner-content{
padding:0px;
}
.overlayBranch {
width: 325px;
.navUl{
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 5px;
}
.overlayBranch .navUl {
margin-top: 8px;
height: 30px;
line-height: 30px;
.navUl li{
cursor: pointer;
}
.overlayBranch .navUl li {
height: 30px;
line-height: 30px;
padding: 0px 5px;
margin-left: 20px !important;
.navUl li.active{
color:#5091FF;
}
.listTips {
padding: 20px 0px;
.listTips{
padding:20px 0px;
text-align: center;
}
.urlMenu {
line-height: 30px;
margin-bottom: 10px;
padding: 15px 20px 0px 20px;
border-bottom: none;
}
.urlMenu li.ant-menu-item {
height: 30px;
line-height: 30px;
padding: 0px 5px;
margin-right: 20px !important;
}
.urlMenu li.ant-menu-item.ant-menu-item-selected, .urlMenu li.ant-menu-item.ant-menu-item-active {
color: #333;
}
.urlMenu li.ant-menu-item.ant-menu-item-selected {
border-color: #1890ff !important;
}
.urlMenu li.ant-menu-item.ant-menu-item-active {
border-color: transparent;
}
/*# sourceMappingURL=branch.css.map */
}

View File

@ -1 +0,0 @@
{"version":3,"sourceRoot":"","sources":["branch.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACG;;;AAEH;EACE;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;;;AAGJ;EACE;;AACA;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;;AAIN;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE","file":"branch.css"}

View File

@ -1,118 +0,0 @@
.branchDropdown{
border:1px solid #eee;
border-radius: 4px;
display: flex;
justify-content: center;
height: 40px;
line-height: 40px;
min-width: 220px;
}
.branchDropdown .ant-dropdown-trigger{
width: 100%;
padding:0px 15px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
}
.branchOptions{
width: 220px;
box-shadow: 0px 0px 3px 1px rgba(134, 134, 134, 0.4);
border-radius: 3px;
background: #fff;
max-height: 300px;
}
.OptionsUl{
max-height: 220px;
overflow-y: auto;
}
.OptionsUl li{
height: 30px;
line-height: 30px;
cursor: pointer;
padding:0px 20px;
margin:5px 0px;
}
.OptionsUl li:hover{
background-color: #F0F0F0;
}
.OptionsUl li a{
display: block;
}
.OptionsInput{
height: 32px;
padding-left: 4px;
line-height: 32px;
width: 100%;
}
.branch-tagBox{
border:1px solid #D0D0D0;
border-radius: 3px;
height: 36px;
display: flex;
align-items: center;
cursor: pointer;
min-width: 104px;
}
.branch-tagBox:hover{
background-color: #F3F4F6;
}
.branch-tagBox-list{
background: #FFFFFF;
box-shadow: 0px 4px 8px 2px rgba(212, 212, 212, 0.5);
border-radius: 4px;
.ant-popover-arrow{
display: none;
}
&.ant-popover.ant-popover-placement-bottom{
padding-top:0px;
}
.branch-tagBox .ant-dropdown-link{
display: block;
flex:1;
max-width: 105px;
}
.ant-popover-inner-content{
padding:0px;
}
}
.overlayBranch{
width: 325px;
.navUl{
margin-top: 8px;
height: 30px;
line-height: 30px;
li{
height: 30px;
line-height: 30px;
padding:0px 5px;
margin-left: 20px!important;
}
}
}
.listTips{
padding:20px 0px;
text-align: center;
}
.urlMenu{
line-height: 30px;
margin-bottom: 10px;
padding:15px 20px 0px 20px;
border-bottom: none;
li.ant-menu-item{
height: 30px;
line-height: 30px;
padding:0px 5px;
margin-right: 20px!important;
&.ant-menu-item-selected,&.ant-menu-item-active{
color: #333;
}
&.ant-menu-item-selected{
border-color:#1890ff!important;
}
&.ant-menu-item-active{
border-color:transparent ;
}
}
}

View File

@ -4,7 +4,7 @@ import axios from 'axios';
import { getImageUrl } from 'educoder';
const { Option } = AutoComplete;
function AddMember({getID,login,showNotification}){
function AddMember({getID,login}){
const [ id , setID ] = useState(undefined);
const [ source , setSource ] = useState(undefined);
const [ searchKey , setSearchKey ] = useState(undefined);
@ -66,12 +66,8 @@ function AddMember({getID,login,showNotification}){
};
function addCollaborator(){
if(source && source.length>0){
getID && getID(id);
setSearchKey(undefined);
}else{
showNotification("请选择存在的用户!");
}
getID && getID(id);
setSearchKey(undefined);
}
return(

View File

@ -3,7 +3,7 @@ import { getImageUrl } from 'educoder';
import { Link } from 'react-router-dom';
import './Component.scss';
function Cards({img , title, desc , rightBtn , src , bottomInfos}){
function Cards({img , title, desc , rightBtn , src}){
return(
<div className="cards">
{img &&<div className="img"><img src={getImageUrl(`/${img}`)} alt=""/></div>}
@ -15,7 +15,6 @@ function Cards({img , title, desc , rightBtn , src , bottomInfos}){
<div className="desc">
{desc}
</div>
{bottomInfos}
</div>
</div>
)

View File

@ -1,432 +0,0 @@
@charset "UTF-8";
ul.ant-menu {
border-right: none;
}
ul.ant-menu li:last-child {
border-bottom: none;
}
li.ant-menu-item {
margin: 0px !important;
border-bottom: 1px solid #eee;
}
.flags {
border: 1px solid red;
border-radius: 5px;
}
.cards {
display: flex;
align-items: center;
padding: 20px 34px;
background-color: #fff;
margin-bottom: 18px;
min-height: 130px;
border: 1px solid #eee;
}
.cards .img {
margin-right: 20px;
width: 190px;
height: 90px;
border: 1px solid #eeeeee;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
.cards .img img {
max-width: 100%;
max-height: 100%;
}
.cards .content {
flex: 1;
width: 0;
}
.cards .content .titles {
display: flex;
justify-content: space-between;
margin-bottom: 10px !important;
align-items: center;
height: 22px;
line-height: 22px;
}
.cards .content .titles > a {
font-size: 18px;
color: #333;
}
.cards .content .desc {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-height: 20px;
}
.tabsStyle {
border: 1px solid #eee;
}
.tabsStyle .ant-tabs-bar.ant-tabs-top-bar {
padding-left: 35px;
margin-bottom: 0px;
}
.tabsStyle .ant-tabs-nav .ant-tabs-tab {
padding: 19px 0px;
margin-right: 40px;
}
.tabsStyle .ant-tabs-ink-bar {
width: 25px !important;
bottom: 10px;
}
.statusColor {
display: inline-block;
padding: 0px 10px;
height: 20px;
line-height: 20px;
border-radius: 11px;
color: #fff;
margin-left: 5px;
font-size: 12px;
}
.statusColor.running {
background: #5091FF;
color: #F1F8FF;
}
.statusColor.Preparing {
background: #ff6e21;
color: #fff8f4;
}
.statusColor.pass {
background: #28BD6C;
color: #EEFDF5;
}
.statusColor.failed {
background: #F73030;
color: #FCEEEE;
}
.statusColor.killed {
background: #eee;
color: #999;
}
.handleBox {
position: fixed;
top: 45%;
right: 240px;
z-index: 10000;
}
.laterest {
background-color: #EF3131;
color: #fff;
font-size: 12px;
margin-left: 10px;
padding: 0px 5px;
border-radius: 2px;
height: 18px;
line-height: 18px;
}
@media screen and (max-width: 1800px) {
.handleBox {
right: 190px;
}
}
@media screen and (max-width: 1700px) {
.handleBox {
right: 140px;
}
}
@media screen and (max-width: 1600px) {
.handleBox {
right: 90px;
}
}
@media screen and (max-width: 1450px) {
.handleBox {
right: 10px;
}
}
@media screen and (max-width: 1380px) {
.handleBox {
right: 0px;
}
}
.ant-drawer {
z-index: 10000 !important;
}
.ant-drawer-body {
padding: 0px !important;
}
.ant-drawer-body .drawerHead {
background-color: #333;
color: #fff;
padding: 15px 20px;
}
.ant-drawer-body .ant-tree {
margin: 0px 20px !important;
}
.menuPanels {
width: 295px;
}
.menuPanels .leftline {
position: relative;
color: #666;
height: 16px;
}
.menuPanels .leftline::before {
position: absolute;
left: -10px;
top: 3px;
height: 12px;
width: 1px;
background-color: #666666;
content: "";
}
.menuPanels .ant-btn {
height: 36px;
line-height: 34px;
width: 83px;
text-align: center;
padding: 0px;
font-weight: 500;
font-size: 14px;
}
.menuPanels .ant-btn.currentBtn {
cursor: default;
color: #333;
}
.menuPanels .ant-btn.currentBtn:hover {
color: #333;
border-color: #d0d0d0;
}
.menuPanels .ant-btn-default {
color: #333;
border-color: #d0d0d0;
}
.menuPanels .ant-btn-default:hover {
background: #F3F4F6;
}
.menuPanels .ant-btn-primary {
color: #fff;
background-color: #2A61FF;
}
.menuPanels .focusPanelHeadInfo {
padding: 14px 16px;
border-bottom: 1px solid #eee;
}
.menuPanels .ant-popover-content, .menuPanels .ant-popover-inner {
height: 100%;
width: 100%;
}
.menuPanels .ant-popover-inner-content {
padding: 0px;
}
.halfs {
margin-top: 24px;
padding: 24px 0px 0px 0px;
border-top: 1px solid #e8e8e8;
}
.aboutSubTitle {
display: flex;
align-items: center;
}
.menuinfos {
padding: 10px 20px;
}
.menuinfos > a {
display: flex;
flex-direction: column;
align-items: center;
flex: 1;
}
.menuinfos > a > span:first-child {
font-size: 16px;
font-weight: 500;
color: #333;
line-height: 22px;
}
.menuinfos > a > span:last-child {
color: #666;
font-weight: 400;
line-height: 20px;
margin-top: 6px;
}
/*-------------------个人主页:右侧提示区域--------------------------*/
.-task-sidebar {
position: fixed;
width: 40px;
right: 0;
bottom: 80px;
z-index: 10;
}
@media screen and (max-width: 1920px) {
.-task-sidebar {
right: 220px;
}
}
@media screen and (max-width: 1750px) {
.-task-sidebar {
right: 160px;
}
}
@media screen and (max-width: 1650px) {
.-task-sidebar {
right: 115px;
}
}
@media screen and (max-width: 1550px) {
.-task-sidebar {
right: 90px;
}
}
@media screen and (max-width: 1450px) {
.-task-sidebar {
right: 45px;
}
}
@media screen and (max-width: 1200px) {
.-task-sidebar {
right: 0px;
display: none;
}
}
.-task-sidebar > div {
height: 40px;
line-height: 40px;
box-sizing: border-box;
width: 40px;
color: #999;
font-size: 20px;
text-align: center;
margin-bottom: 20px;
border-radius: 50%;
background: #FFFFFF;
box-shadow: 0px 0px 10px 1px #F1F1F1;
}
.-task-sidebar > div i {
color: #999;
}
.-task-sidebar > div:hover i {
color: #fff !important;
}
.-task-sidebar > div:hover {
background: #1890FF;
box-shadow: 0px 0px 10px 2px #B6D0FC;
}
.helpBox {
width: 260px;
z-index: 103;
}
.helpBox.shareContent {
width: 200px;
}
.helpBox .ant-popover-inner-content {
padding: 0px;
}
.helpBox p.titlecontent {
font-size: 18px;
color: #333;
line-height: 20px;
padding: 15px 20px;
}
.helpBox .faqUl {
padding: 0px 20px 10px;
max-height: 230px;
overflow-y: auto;
}
.helpBox .faqUl li {
background: #F5F5F5;
border-radius: 20px;
padding: 0px 20px;
color: #333;
height: 34px;
line-height: 34px;
margin-bottom: 10px;
}
.helpBox .faqUl li a {
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.helpBox .faqUl li:hover {
background-color: #D1E9FF;
}
.helpBox .faqUl li:hover a {
color: #333 !important;
}
.helpBox .shareUl {
padding: 10px 0px;
display: flex;
align-items: center;
}
.helpBox .shareUl .titlecontent {
margin-right: 20px;
}
.helpBox .shareUl li > i {
font-size: 32px !important;
}
.-task-desc {
background: #494949;
width: 90px;
line-height: 36px;
text-align: center;
position: absolute;
color: #fff;
font-size: 13px;
z-index: 999999;
opacity: 0;
}
.-task-desc div {
position: absolute;
top: 10px;
right: -7px;
height: 13px;
}
.-task-desc div img {
float: left;
}
.-task-sidebar .scan_ewm {
position: absolute !important;
right: 45px !important;
bottom: 0px !important;
background-color: #494949 !important;
-webkit-box-sizing: border-box !important;
box-sizing: border-box !important;
font-size: 14px !important;
line-height: 16px !important;
display: none;
height: 213px !important;
}
.trangle_right {
position: absolute;
right: -5px;
bottom: 15px;
width: 0;
height: 0px;
border-top: 6px solid transparent;
border-left: 5px solid #494949;
border-bottom: 6px solid transparent;
}
/*# sourceMappingURL=Component.css.map */

View File

@ -1 +0,0 @@
{"version":3,"sourceRoot":"","sources":["Component.scss"],"names":[],"mappings":";AAAA;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAGJ;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKN;EACE;;AACA;EACE;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;;;AAEF;EACE;;AACA;EACE;EACA;EACA;;AAEF;EACE;;;AAIJ;EACE;;AACA;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AACA;EACE;EACA;;AAIN;EACE;EACA;;AACA;EACE;;AAGJ;EACE;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;AAEF;EACE;;;AAGJ;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;AACA;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;;AAKN;AACA;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;;;AAGJ;EACE;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAEF;EACE;;AACA;EACE;;AAKR;EACE;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAON;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"Component.css"}

View File

@ -112,16 +112,6 @@ li.ant-menu-item{
right:240px;
z-index: 10000;
}
.laterest{
background-color: #EF3131;
color: #fff;
font-size: 12px;
margin-left: 10px;
padding:0px 5px;
border-radius: 2px;
height: 18px;
line-height: 18px;
}
@media screen and (max-width: 1800px){
.handleBox{
@ -164,256 +154,39 @@ li.ant-menu-item{
}
.menuPanels{
width: 295px;
.leftline{
position: relative;
color: #666;
height: 16px;
&::before{
position: absolute;
left: -10px;
top:3px;
height: 12px;
width: 1px;
background-color: #666666;
content: "";
}
}
.ant-btn{
height: 36px;
line-height: 34px;
width: 83px;
text-align: center;
padding:0px ;
font-weight: 500;
font-size: 14px;
&.currentBtn{
cursor: default;
color: #333;
&:hover{
color: #333;
border-color: #d0d0d0;
}
}
}
.ant-btn-default{
color: #333;
border-color: #d0d0d0;
&:hover{
background: #F3F4F6;
}
}
.ant-btn-primary{
color: #fff;
background-color: #2A61FF;
}
.focusPanelHeadInfo{
padding:14px 16px;
border-bottom: 1px solid #eee;
}
width: 240px;
height: 180px;
.ant-popover-content,.ant-popover-inner{
height: 100%;
width: 100%;
}
.ant-popover-inner-content{
padding:0px;
}
}
.halfs{
margin-top: 24px;
padding:24px 0px 0px 0px;
border-top: 1px solid #e8e8e8;
}
.aboutSubTitle{
display: flex;
align-items: center;
.attrPerson{
padding-bottom: 24px;
}
}
.menuinfos{
padding:10px 20px;
padding:15px 0px;
&>a{
display: flex;
flex-direction: column;
align-items: center;
border-right: 1px solid #eee;
flex: 1;
& >span:first-child{
font-size: 16px;
font-weight: 500;
font-size: 18px;
font-weight: 400;
color: #333;
line-height: 22px;
}
& >span:last-child{
color: #666;
font-weight: 400;
line-height: 20px;
margin-top: 6px;
}
&:last-child{
border-right: none;
}
}
}
/*-------------------个人主页:右侧提示区域--------------------------*/
.-task-sidebar {
position: fixed;
width: 40px;
right: 0;
bottom: 80px;
z-index: 10;
}
@media screen and (max-width: 1920px){
.-task-sidebar{
right:220px;
}
}
@media screen and (max-width: 1750px){
.-task-sidebar{
right:160px;
}
}
@media screen and (max-width: 1650px){
.-task-sidebar{
right:115px;
}
}
@media screen and (max-width: 1550px){
.-task-sidebar{
right:90px;
}
}
@media screen and (max-width: 1450px){
.-task-sidebar{
right:45px;
}
}
@media screen and (max-width: 1200px){
.-task-sidebar{
right:0px;
display: none;
}
}
.-task-sidebar>div {
height: 40px;
line-height: 40px;
box-sizing: border-box;
width: 40px;
color: #999;
font-size: 20px;
text-align: center;
margin-bottom: 20px;
border-radius: 50%;
background: #FFFFFF;
box-shadow: 0px 0px 10px 1px #F1F1F1;
}
.-task-sidebar>div i {
color: #999;
}
.-task-sidebar>div:hover i {
color: #fff !important;
}
.-task-sidebar>div:hover{
background: #1890FF;
box-shadow: 0px 0px 10px 2px #B6D0FC;
}
.helpBox{
width: 260px;
z-index: 103;
&.shareContent{
width: 200px;
}
.ant-popover-inner-content{
padding:0px;
}
p.titlecontent{
font-size: 18px;
color: #333;
line-height: 20px;
padding:15px 20px;
}
.faqUl{
padding:0px 20px 10px;
max-height: 230px;
overflow-y: auto;
li{
background: #F5F5F5;
border-radius: 20px;
padding:0px 20px;
color: #333;
height: 34px;
line-height: 34px;
margin-bottom: 10px;
a{
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
&:hover{
background-color: #D1E9FF;
a{
color: #333!important;
}
}
}
}
.shareUl{
padding:10px 0px;
display: flex;
align-items: center;
.titlecontent{
margin-right: 20px;
}
li > i{
font-size: 32px!important;
}
}
}
.-task-desc {
background: #494949;
width: 90px;
line-height: 36px;
text-align: center;
position: absolute;
color: #fff;
font-size: 13px;
z-index: 999999;
opacity: 0;
}
.-task-desc div {
position: absolute;
top: 10px;
right: -7px;
height: 13px;
}
.-task-desc div img {
float: left
}
.-task-sidebar .scan_ewm {
position: absolute !important;
right: 45px !important;
bottom: 0px !important;
background-color: #494949 !important;
-webkit-box-sizing: border-box !important;
box-sizing: border-box !important;
font-size: 14px !important;
line-height: 16px !important;
display: none;
height: 213px !important;
}
.trangle_right {
position: absolute;
right: -5px;
bottom: 15px;
width: 0;
height: 0px;
border-top: 6px solid transparent;
border-left: 5px solid #494949;
border-bottom: 6px solid transparent
}
}

View File

@ -1,13 +1,13 @@
import React, { useEffect, useState } from 'react';
import { AlignCenter , FlexAJ } from '../Component/layout';
import { Link } from 'react-router-dom';
import { Popover , Spin , Button } from 'antd';
import { Popover , Spin } from 'antd';
import { getImageUrl } from 'educoder';
import './Component.scss';
import { getUser } from '../GetData/getData';
import axios from 'axios';
function Contributors({contributors,owner,projectsId,currentLogin}){
function Contributors({contributors,owner,projectsId}){
const [ menuList ,setMenuList ]= useState([]);
const [ list , setList ]= useState(undefined);
const [ total , setTotal ]= useState(0);
@ -50,28 +50,15 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
if(data){
let ele = (
<Spin spinning={isSpin}>
<AlignCenter className="focusPanelHeadInfo">
<Link to={`/users/${data.login}`}><img src={getImageUrl(`/${data.image_url}`)} alt="" className="radius" width="38px" height="38px"/></Link>
<div className="flex1 ml10" style={{width:"0"}}>
<AlignCenter>
<Link to={`/users/${data.login}`} className="font-16">{data.name}</Link>
{
data.location &&
<span className="ml20 font-12 leftline">{data.location}</span>
}
</AlignCenter>
{
data.organizations && data.organizations.length > 0 ?
<AlignCenter className="font-12 mt5">
<span>所属组织</span>
<div className="task-hide flex1">
{renderArray(data.organizations)}
</div>
</AlignCenter>
:""
}
</div>
</AlignCenter>
<FlexAJ>
<AlignCenter>
<Link to={`/users/${data.login}`}><img src={getImageUrl(`/${data.image_url}`)} alt="" className="radius" width="38px" height="38px"/></Link>
<Link to={`/users/${data.login}`} className="ml10">{data.name}</Link>
</AlignCenter>
{
data.is_watch ? <a className="color-grey-9" onClick={()=>FocusFunc(false,data.login)}>取消关注</a>:<a className="color-blue" onClick={()=>FocusFunc(true,data.login)}>关注</a>
}
</FlexAJ>
<AlignCenter className="menuinfos">
<a href={data.projects_url}>
<span>{data.projects_count}</span>
@ -86,18 +73,19 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
<span>关注数</span>
</a>
</AlignCenter>
<div className={"pb20"} style={{display:"flex",justifyContent:'center'}}>
{
currentLogin && (currentLogin === data.login)
?
<Button className="currentBtn">当前用户</Button>
:
data.is_watch ?
<Button type={"default"} onClick={()=>FocusFunc(false,data.login)}>已关注</Button>
:
<Button type={"primary"} onClick={()=>FocusFunc(true,data.login)}>关注TA</Button>
}
</div>
{
data.organizations && data.organizations.length > 0 ?
<AlignCenter className="font-12 pt4 pb4">
<span>所属组织</span>
<div className="task-hide flex1">
{renderArray(data.organizations)}
</div>
</AlignCenter>
:""
}
{
data.location && <AlignCenter className="font-12 pt4 pb4"><span>所在地址:</span><span className="ml5">{data.location}</span></AlignCenter>
}
</Spin>
)
setMenu(ele);
@ -147,10 +135,10 @@ function Contributors({contributors,owner,projectsId,currentLogin}){
return(
<div className="halfs">
<Link to={`/projects/${owner}/${projectsId}/contribute`} className="font-16 color-ooo aboutSubTitle">
<span>贡献者</span>
{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>}
</Link>
<FlexAJ>
<AlignCenter><span className="font-16 color-grey-6">贡献者</span>{ contributors && contributors.total_count > 0 && <span className="infoCount">{contributors.total_count}</span>}</AlignCenter>
<Link className="font-12 color-grey-9" to={`/projects/${owner}/${projectsId}/contribute`}>全部</Link>
</FlexAJ>
<div className="attrPerson" onMouseLeave={()=>setVisibleFunc(false)}>
{
total > 0 ?

View File

@ -1,35 +0,0 @@
import React from 'react';
import { AlignCenter } from '../layout';
import { Modal , Button } from 'antd';
import './Index.scss';
function DeleteBox({
visible ,
onCancel ,
onSuccess ,
title ,
subTitle,
content
}) {
return(
<Modal
visible={visible}
onCancel={onCancel}
title={title}
width="600px"
className="deleteBox"
footer={
<div>
<Button size={'large'} onClick={onCancel}>取消</Button>
<Button type={"danger"} size={"large"} onClick={onSuccess}>确认删除</Button>
</div>
}
>
<div className="desc">
<AlignCenter className="descMain"><i className="iconfont icon-shanchu_tc_icon mr10"></i>{content}</AlignCenter>
<p>{subTitle}</p>
</div>
</Modal>
)
}
export default DeleteBox;

View File

@ -1,45 +0,0 @@
.deleteBox{
.ant-modal-header{
background-color: #f8f8f8;
border-bottom: none;
.ant-modal-title{
text-align: left;
font-size: 20px;
}
}
.ant-modal-body{
padding:30px 50px;
p{
font-size: 16px;
line-height: 26px;
color:#666;
word-break: break-all;
}
.desc{
.descMain{
align-items: center;
justify-content: center;
font-size: 20px;
margin-bottom: 10px;
i{
font-size: 38px!important;
color:#DF0002
}
}
}
}
.ant-modal-footer{
border-top: none;
text-align: center;
padding-bottom: 40px;
button{
width: 120px;
margin:0px 20px;
&.ant-btn-danger{
background-color: #fff;
color: #DF0002;
border-color: #D0D0D0;
}
}
}
}

View File

@ -4,12 +4,6 @@ import './Component.scss';
import axios from 'axios';
const { TreeNode , DirectoryTree } = Tree;
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , list}){
const [ treeData , setTreeData ] = useState(undefined);
const [ isSpin , setIsSpin ] = useState(true);
@ -77,8 +71,7 @@ function DrawerPanel({visible,onClose,branch,owner,projectsId,history, name , li
let dataref = event.node.props.dataRef;
if(dataref.type==="file"){
onClose();
let value = turnbar(branch);
history.push(`/projects/${owner}/${projectsId}/tree/${value}/${dataref.path}`);
history.push(`/projects/${owner}/${projectsId}/tree/${branch}/${dataref.path}`);
}
}

View File

@ -1,9 +0,0 @@
.ant-modal-mask {
z-index: 1001;
}
.ant-modal-wrap {
z-index: 1002;
}
/*# sourceMappingURL=EAccount.css.map */

View File

@ -1 +0,0 @@
{"version":3,"sourceRoot":"","sources":["EAccount.scss"],"names":[],"mappings":"AAAA;EACE;;;AAEF;EACE","file":"EAccount.css"}

View File

@ -1,6 +0,0 @@
.ant-modal-mask{
z-index: 1001;
}
.ant-modal-wrap{
z-index: 1002;
}

View File

@ -1,60 +0,0 @@
import React , {forwardRef, useEffect} from 'react';
import { Modal , Form , Input , Button } from 'antd';
import './EAccount.scss';
function EducoderAccount({form , visible , onOk , email}){
const { getFieldDecorator, validateFields , setFieldsValue } = form;
useEffect(()=>{
if(email){
setFieldsValue({email})
}
},[email])
function onSure(){
validateFields((error,values)=>{
if(!error){
onOk(values);
}
})
}
const layout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
return(
<Modal
visible={visible}
title="提示"
width="500px"
closable={false}
footer={
<Button type="primary" onClick={onSure}>确定</Button>
}
centered
>
<div>
<p className="mb15 edu-txt-center" style={{maxWidth:"350px",margin:"0px auto"}}>
为确保您能正常使用平台功能请确认以下信息:
</p>
<Form {...layout}>
<Form.Item label="邮箱">
{getFieldDecorator("email",{
rules:[{required:true,message:"请输入邮箱账号"}]
})(
<Input placeholder="请输入您的邮箱账号" width="220px"/>
)}
</Form.Item>
<Form.Item label="密码">
{getFieldDecorator("password",{
rules:[{required:true,message:"请输入邮箱密码"}]
})(
<Input.Password placeholder="请输入您的邮箱密码" width="220px"/>
)}
</Form.Item>
</Form>
</div>
</Modal>
)
}
export default Form.create()(forwardRef(EducoderAccount));

View File

@ -1,41 +0,0 @@
import React, { useState } from "react";
import { Input ,notification} from "antd";
const { Search } = Input;
export default ({history}) => {
const [openSearch, setOpenSearch] = useState(false);
function onGlobalSearch(value) {
history.push('/search?value=' + value);
// window.location.href = `search?value=` + value;
// history.push({
// pathname:'/search',
// state:value
// })
}
return (
<React.Fragment>
{
openSearch ?
<div
onBlur={() => {
setTimeout(() => {
setOpenSearch(false)
}, 500)
}}
>
<Search placeholder="请输入搜索关键字"
className={`search-input mr20`}
onSearch={onGlobalSearch}
autoFocus={true}
style={{width:'260px'}}
/>
</div>
:
<i className="iconfont icon-sousuo font-18 color-grey-6 ml30" onClick={() => {
setOpenSearch(true)
}} />
}
</React.Fragment>
)
};

View File

@ -25,7 +25,7 @@ function LanguagePower({languages}){
}
return(
<div>
<p className="font-16 color-ooo aboutSubTitle">开发语言</p>
<p className="font-16 color-grey-6">开发语言</p>
<div className="progress">
{
array && array.map((item,key)=>{

View File

@ -1,62 +0,0 @@
import React, {useEffect, useRef, useState} from 'react';
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
import './Component.scss';
function Monaco(props) {
const {
style = { // dom
height: '400px',
},
value = '', //
onChange = () => { //
},
fontSize = 14, //
monacoOptions = {
scrollBeyondLastLine: false,
lineNumbers: "off",
wordWrap: true,
overviewRulerBorder: true,
lineHeight: 24,
readOnly:true
}, // monaco
language = 'html', // js ts sql css json html
} = props;
const editOrRef = useRef();
const ThisEditor = useRef();
useEffect(() => {
ThisEditor.current = monaco.editor.create(editOrRef.current, {
value: value || '',
language,
theme: "vs-grey",
fontSize: fontSize + 'px',
minimap: { //
enabled: false,
},
...monacoOptions,
});
ThisEditor.current.onDidChangeModelContent((e) => {
let newValue = ThisEditor.current.getValue();
onChange(newValue);
});
return () => {
ThisEditor.current.dispose();
ThisEditor.current = undefined; //
}
}, []);
useEffect(() => {
if (ThisEditor.current) {
ThisEditor.current.updateOptions({
fontSize: fontSize + 'px',
})
}
}, [fontSize]);
return (
<div style={style} ref={editOrRef}>
</div>
);
}
export default Monaco;

View File

@ -2,33 +2,37 @@ import React from 'react';
import { AlignCenter , AlignTop , FlexAJ } from '../Component/layout';
import { Link } from 'react-router-dom';
function Releases({owner,projectsId,releaseVersions , baseOperate , projectType}){
function Releases({owner,projectsId,releaseVersions}){
return(
<div>
<Link to={`/projects/${owner}/${projectsId}/releases`} className="font-16 color-ooo aboutSubTitle">
<span>发行版</span>
{ releaseVersions && releaseVersions.total_count > 0 && <span className="infoCount">{releaseVersions.total_count}</span>}
</Link>
<FlexAJ>
<AlignCenter><span className="font-16 color-grey-6">发行版</span>
{ releaseVersions && releaseVersions.total_count > 0 && <span className="infoCount">{releaseVersions.total_count}</span>}
</AlignCenter>
{ releaseVersions && releaseVersions.total_count > 0 ?
<Link className="font-12 color-grey-9" to={`/projects/${owner}/${projectsId}/releases`}>全部</Link>
:
<Link className="font-12 color-blue" to={`/projects/${owner}/${projectsId}/releases/new`}>新建</Link>
}
</FlexAJ>
{
releaseVersions && releaseVersions.total_count>0 ?
releaseVersions.list.map((item,key)=>{
return(
key === 0 &&<AlignTop className="mt10">
<i className="iconfont icon-biaoqian3 color-grey-6 font-18 mr10"></i>
<div>
<p className="font-16">
<Link to={`/projects/${owner}/${projectsId}/releases`} className="color-grey-3">发布{item.name}版本</Link>
<span className="laterest">最新</span>
<p className="font-16 color-grey-6">
<Link to={`/projects/${owner}/${projectsId}/releases`}>{item.name}</Link>
<span className="font-12 laterest ml5">最新</span>
</p>
<p className="color-grey-3 font-12">{item.created_at}</p>
<p className="color-grey-9 font-13">{item.created_at}</p>
</div>
</AlignTop>
)
})
:
<div className="mt8">
您暂未发布任何版本{baseOperate && projectType !==2 && <Link className="color-blue ml20" to={`/projects/${owner}/${projectsId}/releases/new`}>创建新版本</Link>}
</div>
:""
}
</div>

View File

@ -1,49 +1,45 @@
import React , { useState , useEffect } from 'react';
import React , { useState } from 'react';
import { AutoComplete } from 'antd';
import { getImageUrl } from "educoder";
import axios from 'axios';
const Option = AutoComplete.Option;
export default ({ getUser , placeholder, width ,value })=>{
const [ source , setSource ] = useState(undefined);
export default ({ getUser })=>{
const [ searchKey , setSearchKey ] = useState(undefined);
useEffect(()=>{
if(!value){
setSearchKey(undefined);
}
},[value])
useEffect(()=>{
getUserList();
},[searchKey])
const [ userDataSource , setUserDataSource ] = useState(undefined);
function getUserList(e){
const url = `/users/list.json`;
axios.get(url, {
params: {
search: searchKey,
search: e,
},
}).then((result) => {
})
.then((result) => {
if (result) {
sourceOptions(result.data.users);
setUserDataSource(result.data.users);
}
})
.catch((error) => {
console.log(error);
});
};
function changeInputUser(value){
setSearchKey(value);
getUserList(value);
}
function sourceOptions(userDataSource){
const s = userDataSource && userDataSource.map((item, key) => {
function selectInputUser(id, option){
setSearchKey(option.props.value);
getUserList(option.props.value);
getUser && getUser(id);
}
const source =
userDataSource && userDataSource.map((item, key) => {
return (
<Option
key={key}
value={`${item.user_id}`}
login={`${item.login}`}
name={item.username}
>
<Option key={key} value={`${item.login}`}>
<img
className="user_img radius"
width="28"
@ -58,31 +54,14 @@ export default ({ getUser , placeholder, width ,value })=>{
</Option>
);
});
setSource(s);
}
function changeInputUser(e){
setSearchKey(e);
};
//
function selectInputUser(e, option){
setSearchKey(option.props.name);
getUser(option.props.login);
};
return(
<div className="addPanel">
<AutoComplete
getPopupContainer={trigger => trigger.parentNode}
dataSource={source}
value={searchKey}
style={{ width: width || 300 }}
onChange={changeInputUser}
onSelect={selectInputUser}
placeholder={placeholder || "搜索需要添加的用户..."}
allowClear
/>
</div>
<AutoComplete
dataSource={source}
value={searchKey}
style={{ width: 300 }}
onChange={changeInputUser}
onSelect={selectInputUser}
placeholder="搜索需要添加的用户..."
/>
)
}

View File

@ -1,91 +0,0 @@
import React, { useEffect, useState } from 'react';
import { Popover , Tooltip } from 'antd';
import './Component.scss';
import axios from 'axios';
import ShareModal from './SiderBarShareModal';
const $ = window.$;
$(window).scroll(function () {
if ($(".gotop").length > 0) {
if ($(document).scrollTop() > 0) {
$(".-task-sidebar .gotop").show();
$(".gotop").click(function () {
$("html,body").scrollTop(0);
});
}
if ($(document).scrollTop() === 0) {
$(".-task-sidebar .gotop").hide();
}
}
});
function SiderBar() {
const [ data , setData ] = useState([]);
const [ visible , setVisible ] = useState(false);
useEffect(()=>{
getFAQ();
},[])
function getFAQ(){
const url = `/faqs.json`;
axios.get(url).then(result=>{
if(result && result.data){
setData(result.data);
}
}).catch(error=>{})
}
function content(list){
return <div>
<p className="titlecontent">帮助</p>
<ul className="faqUl">
{
list && list.map((i,k)=>{
return(
<li key={i.question+k}><a href={`${i.url}`} title={i.question} target="_blank">{i.question}</a></li>
)
})
}
</ul>
</div>
}
function shareContent(){
return <div>
<ul className="shareUl">
<p className="titlecontent">分享到</p>
<li onClick={()=>setVisible(true)}><i className="iconfont icon-weixin2" style={{color:"#62b900"}}></i></li>
</ul>
</div>
}
return (
<div className={"-task-sidebar"} >
<ShareModal visible={visible} urlValue={window.location.href} onCancel={()=>setVisible(false)}/>
{
data && data.length > 0 && (data[0] && data[0].question) ?
<Popover content={content(data)} overlayClassName="helpBox" placement={"left"}>
<div className="feedback">
<i className="iconfont icon-bangzhu font-22"></i>
</div>
</Popover>
:""
}
{/* <div className="scan pr" title="">
<span className="inline erweima"><i className="iconfont icon-erweima color-white font-22 fl"></i></span>
</div>*/}
<Popover content={shareContent()} overlayClassName="helpBox shareContent" placement={"left"}>
<div className="consult">
<i className="iconfont icon-fenxiang1"></i>
</div>
</Popover>
<div className="gotop">
<Tooltip title="返回顶部" placement={"right"}>
<a><i className="iconfont icon-huidaodingbu1"></i></a>
</Tooltip>
</div>
</div>
)
}
export default SiderBar;

View File

@ -1,27 +0,0 @@
import React from 'react';
import { Modal } from 'antd';
import QRCode from 'qrcode.react';
function SiderBarShareModal({visible,urlValue,onCancel}) {
return(
<Modal
title={"分享到微信"}
visible={visible}
width="500px"
closable={true}
footer={false}
onCancel={onCancel}
>
<div style={{textAlign:"center"}}>
{urlValue &&<QRCode
value={urlValue}
size={200}
fgColor="#000000"
style={{margin:"20px"}}
/>}
<p>打开微信扫一扫,点击右上角菜单即可将网页分享至朋友圈</p>
</div>
</Modal>
)
}
export default SiderBarShareModal;

View File

@ -1,8 +1,8 @@
import React from 'react';
import styled from 'styled-components';
import { Link } from 'react-router-dom';
export default ({ url , name , column , id , login })=>{
export default ({ url , name , column })=>{
const Img = styled.span`
display:flex;
${column && "flex-direction: column;text-align:center;"}
@ -19,14 +19,6 @@ export default ({ url , name , column , id , login })=>{
}
`;
return(
id?
<Link to={`/users/${login}`}>
<Img>
{ url && <img src={url} alt=""/> }
<span>{name}</span>
</Img>
</Link>
:
<Img>
{ url && <img src={url} alt=""/> }
<span>{name}</span>

View File

@ -36,7 +36,8 @@ function About(props, ref) {
const [ disabled, setDisabled ] = useState(false);
const [ typeFlag, setTypeFlag] = useState(false);
const AuthorLogin = props.projectDetail && props.projectDetail.author && props.projectDetail.author.login;
const AuthorLogin = props.author && props.author.login;
const CurrentLogin = props.current_user && props.current_user.login;
useEffect(()=>{
if(CurrentLogin === AuthorLogin){
@ -55,6 +56,11 @@ function About(props, ref) {
setIsSpining(false);
if(result && result.data ){
setStep(result.data.step);
// setStep(0);
// setFieldsValue({...result.data.cloud_account});
// if(result.data.cloud_account){
// setDisabled(true);
// }
}
}).catch(error=>{
setIsSpining(false);

View File

@ -10,12 +10,6 @@ import { Link } from 'react-router-dom';
// killed:"",
// pending:""
// }
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function renderTableStatus(status) {
switch (status) {
case "running":
@ -71,9 +65,8 @@ function List({ list, operate , projectsId , owner , showModal , deleteFunc }){
width:"15%",
ellipsis:true,
render:(value,item)=>{
let v = turnbar(item.branch);
return(
<Link to={`/projects/${owner}/${projectsId}/tree/${v}/${value}`} className="color-blue">{value}</Link>
<Link to={`/projects/${owner}/${projectsId}/tree/${item.branch}/${value}`} className="color-blue">{value}</Link>
)
}
},

View File

@ -42,7 +42,7 @@ function PipelineName({visible,onCancel,onOk,value ,branchList}){
</div>
<div className="choosenList mt20">
<span>触发条件:</span>
<Select value={branchValue} style={{width:"150px"}} dropdownClassName="chooseCon" onChange={(e)=>setBranchValue(e)}>
<Select value={branchValue} style={{width:"150px"}} onChange={(e)=>setBranchValue(e)}>
{
branchList && branchList.length>0 && branchList.map((item,key)=>{
return(
@ -51,7 +51,7 @@ function PipelineName({visible,onCancel,onOk,value ,branchList}){
})
}
</Select>
<Select mode="multiple" allowClear value={eventValue} dropdownClassName="chooseCon" style={{width:"180px",marginLeft:"10px"}} onChange={(e)=>{console.log(e);setEventValue(e)}}>
<Select mode="multiple" allowClear value={eventValue} style={{width:"180px",marginLeft:"10px"}} onChange={(e)=>{console.log(e);setEventValue(e)}}>
{
EVENT.map((item,key)=>{
return(

View File

@ -1,8 +1,7 @@
import React, { useState, useEffect } from "react";
import { Spin , Menu } from "antd";
import { Spin } from "antd";
import { FlexAJ, AlignCenter } from "../Component/layout";
import axios from "axios";
import CodeSSH from './ssh/Index';
export default ({
data,
@ -18,8 +17,6 @@ export default ({
const [spining, setSpining] = useState(true);
const [stage, setStage] = useState(undefined);
const [step, setStep] = useState(undefined);
const [nav, setNav] = useState("0");
useEffect(() => {
setSpining(rightSpin);
}, [rightSpin]);
@ -38,7 +35,6 @@ export default ({
: p[0];
setStep(sub);
setNav("0");
if (sub && sub.status !== "skipped") {
getStep(pre.number, sub.number);
}
@ -69,55 +65,43 @@ export default ({
}
}
return (
<React.Fragment>
{/* <Menu className="devopsNav" onClick={(e)=>{setNav(e.key)}} selectedKeys={[nav]} mode="horizontal">
<Menu.Item key={'0'} value="0">开发流水线</Menu.Item>
<Menu.Item key={'1'} value="1">命令行</Menu.Item>
</Menu> */}
{
nav === "0" &&
<Spin spinning={spining}>
<div className="rightMainContent">
{data && data.status !== "error" ? (
<div>
<FlexAJ className="items">
<span>{step && step.name}</span>
<AlignCenter>
{step && step.duration_time}
<i className="iconfont icon-sanjiaoxing-down"></i>
</AlignCenter>
</FlexAJ>
<div>
{coders && coders.length > 0 ? (
coders.map((item, key) => {
return (
<div className="opsDetailOut">
<span>{key + 1}</span>
<p>{item.out}</p>
</div>
);
})
) : empty ? (
<Spin spinning={spining}>
<div className="rightMainContent">
{data && data.status !== "error" ? (
<div>
<FlexAJ className="items">
<span>{step && step.name}</span>
<AlignCenter>
{step && step.duration_time}
<i className="iconfont icon-sanjiaoxing-down"></i>
</AlignCenter>
</FlexAJ>
<div>
{coders && coders.length > 0 ? (
coders.map((item, key) => {
return (
<div className="opsDetailOut">
<span>1</span>
<p>
{stage && stage.name} {step && step.name}: Skipped
</p>
<span>{key + 1}</span>
<p>{item.out}</p>
</div>
) : (
""
)}
);
})
) : empty ? (
<div className="opsDetailOut">
<span>1</span>
<p>
{stage && stage.name} {step && step.name}: Skipped
</p>
</div>
</div>
) : (
<div style={{ color: "red" }}>error:{data && data.error}</div>
)}
) : (
""
)}
</div>
</div>
</Spin>
}
{
nav === "1" && <CodeSSH />
}
</React.Fragment>
) : (
<div style={{ color: "red" }}>error:{data && data.error}</div>
)}
</div>
</Spin>
);
};

View File

@ -2,7 +2,7 @@ import React, { useState, useEffect , useImperativeHandle ,forwardRef } from "re
import { FlexAJ, AlignCenter , Banner } from "../Component/layout";
import { Table, Pagination, Popconfirm } from "antd";
import { truncateCommitId } from "../common/util";
import { getImageUrl } from 'educoder';
import {getUrl} from 'educoder';
import axios from "axios";
import { Link } from 'react-router-dom';
@ -58,7 +58,6 @@ function Structure(props,ref){
return {
...item,
author:item.author && item.author.name,
image_url:item.author && item.author.image_url,
message: {
branch: item.branch_target,
message: item.message,
@ -245,7 +244,7 @@ function Structure(props,ref){
{meg.sha && <span className="color-orange">{meg.sha}</span>}
</div>
<AlignCenter>
<img style={{borderRadius:"50%",marginRight:"10px",width:"25px",height:"25px"}} alt="" src={`${item.image_url && getImageUrl(`/${item.image_url}`)}`} />
<img style={{borderRadius:"50%",marginRight:"10px",width:"25px",height:"25px"}} src={`${current_user && getUrl(`/images/${current_user.image_url}`)}`} />
<div className="task-hide ml5" style={{ maxWidth: "300px" }}>
{meg.message}
</div>

View File

@ -194,18 +194,6 @@
&.rightSection{
width:100%;
background-color: #081930;
.devopsNav{
background-color: #111c24;
border-bottom: none;
.ant-menu-item{
color: #ccc;
padding:0px;
margin:0px 20px!important;
}
.ant-menu-item.ant-menu-item-selected{
color: #1890ff;
}
}
.rightMainContent{
padding:24px 30px;
height:100vh;
@ -391,9 +379,6 @@
}
}
}
.chooseCon.ant-select-dropdown{
z-index: 100001;
}
.choosenList{
display: flex;

View File

@ -1,42 +0,0 @@
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 (
<XmlPanel
sshConfigData={sshConfigData||{}}
sid={1}
/>
);
}
export default Index;

View File

@ -1,219 +0,0 @@
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 (
<div ref={el} className="xterm-panel" style={{height:"100%"}}>
{!ws_url ? <p style={{ color: '#fff' }}>正在连接命令行服务...</p> : null}
</div>
);
};

View File

@ -1,46 +0,0 @@
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;

View File

@ -152,21 +152,20 @@ function DivertModal({form , visible , onSuccess , onCancel,owner,repo}){
</Form.Item>
}
<Form.Item label="仓库标识:" style={{marginBottom:"0px"}}>
<Form.Item label="仓库名称:">
{getFieldDecorator("identifier",
{
rules:[
{required:true,message:"请输入仓库标识!"},
{required:true,message:"请输入仓库名称"},
{
validator:checkIdentifier
}
]
}
)(
<Input placeholder="请输入仓库标识" autoComplete={"off"}/>
<Input placeholder="请输入仓库名称" autoComplete={"off"}/>
)}
</Form.Item>
<span className="color-grey-9" style={{marginLeft:"120px"}}>请输入当前项目的标识<span className="ml5 mr5 color-grey-3">{repo}</span>进行确认</span>
</Form>
</div>
</Modal>

View File

@ -1,12 +0,0 @@
.diverModal{
.descUl{
background-color: #fffae6;
border-radius: 4px;
padding:10px 15px;
color: #efc16b;
border:1px solid #efc16b;
}
.ant-form-item-required::before{
content: "";
}
}

View File

@ -1,84 +0,0 @@
import React, { useState , forwardRef, useEffect } from 'react';
import { Form , Modal , Input , Radio } from 'antd';
import Axios from 'axios';
export default Form.create()(
forwardRef((props)=>{
const { getFieldDecorator, validateFields , setFieldsValue } = props && props.form;
const [ visible , setVisible ] = useState(false);
useEffect(()=>{
if(!visible){
setFieldsValue({
code:undefined,
role:"developer"
})
}
},[visible])
function onOk() {
validateFields((error,values)=>{
if(!error){
const url = `/applied_projects.json`;
Axios.post(url,{
applied_project:{
...values
}
}).then(result=>{
if(result && result.data){
setVisible(false);
props.showNotification("申请加入项目成功,等待审核!");
}
}).catch(error=>{})
}
})
}
function checkValue(rule, value, callback){
if(!value){
callback();
}
if(value.length < 6 || value.length > 6){
callback("请输入6位数的邀请码");
}
callback();
}
return(
<React.Fragment>
<Modal
title="加入项目"
width="480px"
visible={visible}
centered={true}
onOk={onOk}
onCancel={()=>setVisible(false)}
>
<Form layout={'inline'} className="inviteForm">
<Form.Item label="项目邀请码">
{getFieldDecorator("code",{
rules:[
{required:true,message:"请输入6位项目邀请码"},
{validator:checkValue}
]
})(
<Input placeholder="请输入6位项目邀请码" autoComplete={"off"} maxLength="6" style={{width:"300px"}}/>
)}
</Form.Item>
<Form.Item label="选择角色">
{getFieldDecorator("role",{
rules:[{required:true,message:"请选择角色"}]
})(
<Radio.Group defaultValue={"developer"}>
<Radio value="manager">管理员</Radio>
<Radio value="developer">开发者</Radio>
<Radio value="reporter">报告者</Radio>
</Radio.Group>
)}
</Form.Item>
</Form>
</Modal>
<a onClick={()=>setVisible(true)}>加入项目</a>
</React.Fragment>
)
})
)

View File

@ -19,7 +19,7 @@ function Footer(){
return(
<div>
<div style={{height:"497px"}}></div>
<div style={{height:"483px"}}></div>
<div className="newFooter edu-txt-center">
{value && showhtml(value)}
{/* <div className="footerInfos">

View File

@ -3,12 +3,10 @@ import AccountProfile from "../../modules/user/AccountProfile";
import { getImageUrl } from 'educoder'
import axios from 'axios';
import { Input , notification , Dropdown , Menu } from 'antd';
import { Link } from 'react-router-dom';
import LoginDialog from '../../modules/login/LoginDialog';
import HeadSearch from '../Component/HeadSearch';
import GotoQQgroup from '../../modal/GotoQQgroup'
import AddProjectModal from './AddProjectModal';
import '../../modules/tpm/TPMIndex.css';
import './header.scss';
@ -79,6 +77,36 @@ class NewHeader extends Component {
} catch (e) {}
}
SearchInput = (open,item)=>{
if(open){
return(
<div
onBlur={() => {
setTimeout(() => {
this.setState({
openSearch:false
})
}, 300)
}}
>
<Search placeholder="实践课程/教学课堂/实践项目/交流问答"
className={`search-input mr20`}
onSearch={(value)=>this.onGlobalSearch(value,item)}
autoFocus={true}
/>
</div>
)
}else{
return <i className="iconfont icon-sousuo font-18 color-grey-6 ml30" onClick={() => {
this.setState({openSearch:true})
}} />
}
}
onGlobalSearch=(value,item)=>{
window.location.href=`${item}?value=` + value;
}
openNotification = (messge) => {
notification.open({
message: "提示",
@ -87,6 +115,8 @@ class NewHeader extends Component {
});
};
componentWillReceiveProps(newProps, oldProps) {
this.setState({
user: newProps.user
@ -96,6 +126,7 @@ class NewHeader extends Component {
}
}
educoderlogin = () => {
//登录账号
this.setState({
@ -133,11 +164,13 @@ class NewHeader extends Component {
})
};
// 关闭
cancelModulationModels = () => {
this.setState({ isRenders: false })
}
setevaluatinghides = () => {
this.setState({
setevaluatinghides: true
@ -231,15 +264,15 @@ class NewHeader extends Component {
{
list.map((item,key)=>{
return(
(item.name !=="加入课堂" && item.name !=="加入开发项目") && <Menu.Item key={item.name+key}><a href={item.url}>{item.name}</a></Menu.Item>
(item.name !=="加入课堂" && item.name !=="加入开发项目") && <Menu.Item><a href={item.url}>{item.name}</a></Menu.Item>
)
})
}
<Menu.Item><AddProjectModal showNotification={this.props.showNotification}/></Menu.Item>
</Menu>
</div>
)
}
renderMenu=(personal)=>{
const { current_user } = this.props;
return(
@ -254,7 +287,6 @@ class NewHeader extends Component {
)
})
}
<li><Link to={`/settings/SSH`}>设置</Link></li>
<Menu.Item><a onClick={() => this.educoderloginysl()}>退出</a></Menu.Item>
</Menu>
)
@ -263,13 +295,17 @@ class NewHeader extends Component {
render() {
const { match} = this.props;
let current_user = this.props.user;
let {
let { Addcoursestypes,
tojoinitemtype,
tojoinclasstitle,
code_notice,
AccountProfiletype,
user,
isRender,
headtypesonClickbool,
headtypess,
settings,
openSearch,
} = this.state;
/*用户名称 用户头像url*/
let activeIndex = false;
@ -347,7 +383,7 @@ class NewHeader extends Component {
})
}
// let search_url = settings && settings.common && settings.common.search;
let search_url = settings && settings.common && settings.common.search;
let notice_url = settings && settings.common && settings.common.notice;
return (
<div className="newHeaders" id="nHeader">
@ -411,8 +447,7 @@ class NewHeader extends Component {
}
</div>
<div className="head-right">
{/* {search_url ? this.SearchInput(openSearch,search_url):""} */}
<HeadSearch {...this.props}/>
{search_url ? this.SearchInput(openSearch,search_url):""}
{
current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)?
<Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight">

View File

@ -1,6 +1,7 @@
.dropdownFlex{
display:flex;
padding:5px;
background:#fff;
border-radius: 3px;
.ant-menu-vertical > .ant-menu-item{
@ -8,13 +9,6 @@
height: 35px;
line-height: 35px;
margin:0px;
&.ant-menu-item-selected{
background-color: #fff;
a{color: rgba(0, 0, 0, 0.65)!important;}
}
&.ant-menu-item-active{
a{color: #4cacff!important;}
}
}
.ant-menu-vertical{
border:none;
@ -33,7 +27,7 @@
li{
height: 40px;
line-height: 40px;
padding:0px!important;
padding:0px;
cursor: default;
&:hover{
background-color: #fff;
@ -110,13 +104,4 @@
}
}
}
}
.inviteForm{
.ant-form-item{
margin-right: 0px;
}
.ant-form-item-label{
width: 110px;
text-align: right;
}
}

View File

@ -26,15 +26,11 @@ const ProjectDetail = Loadable({
loading: Loading,
});
const Infos = Loadable({
loader: () => import("./users/Infos"),
loading: Loading,
});
class Index extends Component {
componentDidUpdate=()=>{
this.props.history.listen(()=>{
if (document.body.scrollTop || document.documentElement.scrollTop > 0) {
window.scrollTo(0, 0)
}
})
}
render() {
return (
<div className="newMain clearfix">
@ -70,8 +66,12 @@ class Index extends Component {
)}
></Route>
<Route
exact
path="/"
render={(props) => (
this.props.current_user && this.props.current_user.login ?
<Infos {...this.props} {...props} />
:
<ProjectIndex {...this.props} {...props} />
)}
></Route>

View File

@ -1,6 +1,6 @@
import React , { useEffect , useState } from 'react';
import { WhiteBack , Box , LongWidth , ShortWidth , Gap , AlignCenter , FlexAJ } from '../Component/layout';
import { Dropdown , Menu , Divider , Spin, Button , Typography } from 'antd';
import { Dropdown , Menu , Divider , Spin, Button } from 'antd';
import { getImageUrl } from "educoder";
import { Link } from 'react-router-dom';
import CloneAddress from '../Branch/CloneAddress';
@ -19,27 +19,12 @@ import LanguagePower from '../Component/LanguagePower';
import DrawerPanel from '../Component/DrawerPanel';
import UpdateDescModal from './sub/UpdateDescModal';
import Nodata from '../Nodata';
import Invite from './sub/Invite';
/**
* projectDetail.type:0是托管项目1是镜像项目2是同步镜像项目(为2时不支持在线创建在线上传在线修改在线删除创建合并请求等功能)
*/
const { Paragraph } = Typography;
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
function returnbar(str){
if(str && str.length>0 && str.indexOf("%2F")>-1){
return str.replaceAll('%2F','/');
}
return str;
}
function CoderDepot(props){
const [ projectDetail , setProjectDetail ]= useState(undefined);
const [ inviteCode , setInviteCode ] = useState(undefined);
const [ treeValue , setTreeValue ] = useState(undefined);
const [ treeValuePath , setTreeValuePath ] = useState(undefined);
const [ lastCommit,setLastCommit ] = useState(undefined);
@ -61,33 +46,13 @@ function CoderDepot(props){
const [ website , setWebsite ] = useState(undefined);
const [ lesson_url , setLessonUrl ] = useState(undefined);
const [ readme , setReadme ] = useState(undefined);
const [ defaultBranch , setDefaultBranch ] = useState(undefined);
const [ editReadme , setEditReadme ] = useState(false);
const [ pullsFlag , setPullsFlag ] = useState(true);
const [ issuesFlag , setIssuesFlag ] = useState(true);
const [ defaultBranch , setDefaultBranch ] = useState(undefined)
const owner = props.match.params.owner;
const projectsId = props.match.params.projectsId;
let branchName = props.match.params.branchName;
branchName = returnbar(branchName);
const branchName = props.match.params.branchName;
const details = props.projectDetail;
let pathname = props.history.location.pathname;
const { bannerList } = props;
useEffect(()=>{
if(bannerList && bannerList.length>0){
let a = bannerList.filter(i=>i.menu_name === "pulls");
let i = bannerList.filter(i=>i.menu_name === "issues");
if(a && a.length === 0){
setPullsFlag(false);
}
if(i && i.length === 0){
setIssuesFlag(false);
}
}
},[bannerList])
useEffect(()=>{
if(details){
@ -96,7 +61,6 @@ function CoderDepot(props){
setWebsite(details.website);
setLessonUrl(details.lesson_url);
setDefaultBranch(details.default_branch);
setInviteCode(details.invite_code);
}
},[details])
@ -111,16 +75,13 @@ function CoderDepot(props){
useEffect(()=>{
if (projectsId && owner && defaultBranch){
let b = turnbar(branchName) ;
if(pathname.indexOf(`/projects/${owner}/${projectsId}`) > -1 && pathname.indexOf(`/tree/${b}/`) > -1) {
let url = pathname.split(`/tree/${b}/`)[1];
if(pathname.indexOf(`/projects/${owner}/${projectsId}`) > -1 && pathname.indexOf(`/tree/${branchName}/`) > -1) {
let url = pathname.split(`/tree/${branchName}/`)[1];
setTreeValue(url);
getFileInfo(url,branchName);
setType("file");
}else{
setTreeValue(undefined);
getDirInfo(branchName || defaultBranch);
setType("dir");
}
}
},[projectsId,owner,pathname,defaultBranch])
@ -129,7 +90,6 @@ function CoderDepot(props){
function getDirInfo(branch){
setIsSpin(true);
const url = `/${owner}/${projectsId}/entries.json`;
axios.get(url, {
params: { ref: branch }
}).then((result) => {
@ -145,8 +105,6 @@ function CoderDepot(props){
setMainFlag(true);
setReadOnly(true);
setReadme(result.data.readme);
setEditReadme(false);
setHide(true);
}
setTimeout(function(){setIsSpin(false);},500);
}).catch(error=>{setIsSpin(false);})
@ -158,7 +116,7 @@ function CoderDepot(props){
let ele = document.getElementById("ptxt");
if(ele){
let h = ele.offsetHeight;
if( h > 18 ) setHideBtn(true);
if( h > 18 ) setHideBtn(true)
}
}
},[projectDetail,lastCommit])
@ -188,8 +146,7 @@ function CoderDepot(props){
setLastCommit(c && c.commit);
setLastCommitAuthor(c && c.committer);
setMainFlag(false);
setReadOnly(!editReadme);
setHide(true);
setReadOnly(true);
}
setTimeout(function(){setIsSpin(false);},500)
}).catch(error=>{setIsSpin(false);})
@ -197,22 +154,17 @@ function CoderDepot(props){
//
function changeBranch(value){
let checkvalue = turnbar(value);
let url = `/projects/${owner}/${projectsId}${value && `/tree/${checkvalue}`}${treeValue ? `/${treeValue}`:""}`;
let url = `/projects/${owner}/${projectsId}${value && `/tree/${value}`}${treeValue ? `/${treeValue}`:""}`;
props.history.push(url);
}
//
function fileMenu(){
let b = branchName || defaultBranch;
let checkvalue = turnbar(b);
return (
const fileMenu =(
<Menu>
<Menu.Item><a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/${checkvalue}/uploadfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>上传文件</a></Menu.Item>
<Menu.Item><a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/${checkvalue}/newfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>新建文件</a></Menu.Item>
<Menu.Item><a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/${branchName || defaultBranch}/uploadfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>上传文件</a></Menu.Item>
<Menu.Item><a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/${branchName || defaultBranch}/newfile${treeValue === undefined ? "" : `/${treeValue}`}`)}>新建文件</a></Menu.Item>
</Menu>
)
}
)
function getPathUrl(array,index){
if(array && array.length>0 && index){
@ -227,35 +179,26 @@ function CoderDepot(props){
function returnMain(){
setTreeValue(undefined);
let branch = branchName || defaultBranch;
let checkvalue = turnbar(branch);
props.history.push(`/projects/${owner}/${projectsId}/tree/${checkvalue}`);
props.history.push(`/projects/${owner}/${projectsId}/tree/${branch}`);
};
//
function returnUlr(url){
let enBranch = turnbar(branchName);
props.history.push(`/projects/${owner}/${projectsId}/tree${enBranch?`/${enBranch}`:""}/${url}`);
props.history.push(`/projects/${owner}/${projectsId}/tree${branchName?`/${branchName}`:""}/${url}`);
}
//
function goToSubRoot(path,type,filename){
if(type!=="submodule"){
let enBranch = branchName || defaultBranch;
let checkvalue = turnbar(enBranch);
setType(type);
props.history.push(`/projects/${owner}/${projectsId}${`/tree/${checkvalue}`}${path?`/${path}`:""}`);
}
setType(type);
props.history.push(`/projects/${owner}/${projectsId}${`/tree/${branchName || defaultBranch}`}${path?`/${path}`:""}`);
}
function onEdit(readOnly){
setReadOnly(readOnly);
setEditReadme(false);
}
function ChangeFile(path, readOnly){
//
let enBranch = branchName || defaultBranch;
let checkvalue = turnbar(enBranch);
props.history.push(`/projects/${owner}/${projectsId}/tree/${checkvalue}/${path}`);
props.history.push(`/projects/${owner}/${projectsId}/tree/${branchName || defaultBranch}/${path}`);
setType("file");
setEditReadme(true);
setReadOnly(readOnly);
};
function changeHide(hide){
@ -271,12 +214,17 @@ function CoderDepot(props){
}
const downloadMenu = (
<CloneAddress
http_url={projectDetail && projectDetail.clone_url}
ssh_url = {projectDetail && projectDetail.ssh_url}
zip_url={zip_url}
tar_url={tar_url}
showNotification={props.showNotification}/>
<div className="downMenu">
<div style={{padding:"20px",borderBottom:"1px solid #eee"}}>
<CloneAddress
http_url={projectDetail && projectDetail.clone_url}
showNotification={props.showNotification}/>
</div>
<Menu className="edu-txt-center">
<Menu.Item><a href={zip_url}>下载 ZIP</a></Menu.Item>
<Menu.Item><a href={tar_url}>下载 TAR.GZ</a></Menu.Item>
</Menu>
</div>
)
// website
function okUpdate(d,w,l){
@ -291,12 +239,10 @@ function CoderDepot(props){
}
})
}
let n = fileInfo && fileInfo.name;
const mdFlag = n && n.substring(n.length-3,n.length) === ".md";
const { current_user } = props;
const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter";
const fileOperate = type === "dir" && projectDetail && projectDetail.type !== 2 && ((projectDetail.permission && projectDetail.permission !=="Reporter") || (current_user && current_user.admin));
return(
<WhiteBack>
<UpdateDescModal desc={desc} website={website} lesson_url={lesson_url} visible={openModal} onCancel={()=>setOpenModal(false)} onOk={okUpdate}/>
@ -315,7 +261,7 @@ function CoderDepot(props){
list = {mainFlag ? dirInfo : undefined}
/>
<div className="drawerBtn" onClick={()=>setVisible(true)}>
<i className="iconfont icon-zuohuaicon font-14"></i>
<i className="iconfont icon-youjiantou font-16"></i>
<span>目录</span>
</div>
</React.Fragment>
@ -328,7 +274,7 @@ function CoderDepot(props){
<div className="panelmenu">
<FlexAJ>
<AlignCenter>
<div className="mr30">
<div className="mr20">
{
props && props.platform ?
<SelectBranch
@ -345,37 +291,34 @@ function CoderDepot(props){
}
</div>
<AlignCenter className="mr20">
<Link to={`/projects/${owner}/${projectsId}/branchs`} className="depotNum">
<i className="iconfont icon-master_icon font-14 mr3"></i>
<span className="mr3">分支</span>
<span>{projectDetail && projectDetail.branches && projectDetail.branches.total_count}</span>
<Link to={`/projects/${owner}/${projectsId}/branchs`} className="color-grey-9">
<i className="iconfont icon-fenzhi2 font-18 color-grey-9 mr3"></i>
<span className="color-grey-6 mr3">{projectDetail && projectDetail.branches && projectDetail.branches.total_count}</span>分支
</Link>
</AlignCenter>
<AlignCenter className="mr20">
<Link to={`/projects/${owner}/${projectsId}/tag`} className="depotNum">
<i className="iconfont icon-biaoqianicon font-14 mr3"></i>
<span className="mr3">标签</span>
<span>{projectDetail && projectDetail.tags && projectDetail.tags.total_count}</span>
<Link to={`/projects/${owner}/${projectsId}/tag`} className="color-grey-9">
<i className="iconfont icon-biaoqian3 font-16 color-grey-9 mr3"></i>
<span className="color-grey-6 mr3">{projectDetail && projectDetail.tags && projectDetail.tags.total_count}</span>标签
</Link>
</AlignCenter>
</AlignCenter>
<AlignCenter className="depotBtn">
{
baseOperate && projectDetail.type !== 2 && pullsFlag &&
<Button type="default" onClick={()=>urlLink(`/projects/${owner}/${projectsId}/pulls/new`)} className="mr10"><i className="iconfont icon-xinjian2 font-12 mr3"></i> 合并请求</Button>
}
{
baseOperate && issuesFlag &&
<Button type="default" onClick={()=>urlLink(`/projects/${owner}/${projectsId}/issues/new`)} className="mr10"><i className="iconfont icon-xinjian2 font-12 mr3"></i> 任务</Button>
}
{ fileOperate &&
<Dropdown overlay={fileMenu()} className="mr10" trigger={['click']}>
<Button type="default">文件 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-grey-6 mr-5"></i></Button>
<AlignCenter>
<div className="mr20 addOptionBtn">
{
projectDetail.type !== 2 &&
<a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/pulls/new`)} >+ 合并请求</a>
}
<a onClick={()=>urlLink(`/projects/${owner}/${projectsId}/issues/new`)} >+ 任务</a>
</div>
{ type === "dir" && projectDetail.type !== 2 &&
<Dropdown overlay={fileMenu} className="mr20" trigger={['click']}>
<Button type="default">文件 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-grey-9"></i></Button>
</Dropdown>
}
<Dropdown overlay={downloadMenu} placement="bottomRight" trigger={['click']}>
<Button type={'primary'}>下载 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-white mr-3"></i></Button>
<Button type={'primary'}>下载 <i className="iconfont icon-sanjiaoxing-down ml3 font-14 color-white"></i></Button>
</Dropdown>
</AlignCenter>
</FlexAJ>
@ -386,18 +329,11 @@ function CoderDepot(props){
lastCommit &&
<div className="listtablehead">
<User url={getImageUrl(`/${lastCommitAuthor && lastCommitAuthor.image_url}`)} name={lastCommitAuthor && lastCommitAuthor.name} id={lastCommitAuthor && lastCommitAuthor.id} login={lastCommitAuthor && lastCommitAuthor.login}/>
<div className={hideBtn && hide ? "ellipsistxt hidetxt" :"ellipsistxt"}>
<pre id="ptxt">{lastCommit && lastCommit.message}</pre>
</div>
<div className={hideBtn && hide ? "ellipsistxt hide" :"ellipsistxt"}><pre id="ptxt">{lastCommit && lastCommit.message}</pre></div>
{ hideBtn && <span className="ellipsis" onClick={()=>changeHide(hide)}><i className="iconfont icon-shenglvehao"></i></span> }
<span className="ml20 color-grey-9 mt1">{lastCommit && lastCommit.time_from_now}</span>
{
commitCount ?
<Link to={`/projects/${owner}/${projectsId}/commits/branch/${turnbar(branchName || defaultBranch)}`} className="ml20 color-grey-9" style={{height:"30px",lineHeight:"30px"}}>
<i className="iconfont icon-tijiaoicon mr3 font-16"></i>{commitCount}次提交
</Link>:""
}
<span className="ml12 color-grey-9 mt3">{lastCommit && lastCommit.time_from_now}</span>
{ commitCount ? <Link to={`/projects/${owner}/${projectsId}/commits`} className="ml12 color-grey-9"><i className="iconfont icon-tijiao mr3 font-17 color-grey-9"></i>{commitCount}次提交</Link>:"" }
</div>
}
<ul className="listtablebody">
@ -434,7 +370,7 @@ function CoderDepot(props){
onEdit={onEdit}
currentBranch={branchName || defaultBranch}
type={projectDetail.type}
></CoderRootFileDetail>[[]]
></CoderRootFileDetail>
}
</ul>
</div>
@ -452,48 +388,39 @@ function CoderDepot(props){
<ShortWidth>
<Gap style={{paddingLeft:"30px"}}>
<div className="panelmenu">
<FlexAJ className="font-16 color-ooo mb10" style={{lineHeight:"22px"}}>关于
{projectDetail.permission && (projectDetail.permission==="Admin" || projectDetail.permission==="Owner") &&
<a className="color-grey-6" href="javascript:void(0)"><i onClick={()=>setOpenModal(true)} className="iconfont icon-a-shezhi font-15"></i></a>
}
<FlexAJ className="font-18 color-grey-6 mb20" style={{lineHeight:"28px"}}>简介
{projectDetail.permission && (projectDetail.permission==="Admin" || projectDetail.permission==="Owner") && <i onClick={()=>setOpenModal(true)} className="iconfont icon-anquanshezhi color-grey-9 font-15"></i>}
</FlexAJ>
{desc && <p className="font-14 color-grey-3 mb15 task-hide-2" style={{lineHeight:"24px",WebkitLineClamp:"4",textAlign:"justify",wordBreak:"break-all"}}>{desc}</p>}
{desc && <p className="font-14 color-grey-9 mb15 task-hide-2" style={{lineHeight:"22px",WebkitLineClamp:"4",textAlign:"justify",wordBreak:"break-all"}}>{desc}</p>}
{
website &&
<div className="color-grey-6 df pinfos mb5">
<i className="iconfont icon-lianjie2 font-15 mr10"></i>
<a href={website} target="_blank" style={{wordBreak:"break-all",lineHeight:"20px",marginTop:"5px",textDecoration:"underline"}}>{website}</a>
</div>
<p className="color-grey-6 df">
<i className="iconfont icon-lianjie2 font-15 mr10 color-grey-9"></i>
<a href={website} className="color-grey-6" target="_blank" style={{wordBreak:"break-all",lineHeight:"20px",marginTop:"5px",textDecoration:"underline"}}>{website}</a>
</p>
}
<div className="pinfos mb5">
<i className="iconfont icon-zishuwenjian_icon font-15 mr10"></i>
<a href="#readme">README.md</a>
</div>
<div className="color-grey-6 mb5">
<i className="iconfont icon-neicunicon font-15 mr10"></i>
<p>
<i className="iconfont icon-wenjian4 font-15 mr10 color-grey-9"></i>
<a href="#readme" className="color-grey-6">README.md</a>
</p>
<p className="color-grey-6">
<i className="iconfont icon-dataBase font-15 mr10 color-grey-6"></i>
<span>{projectDetail && projectDetail.size}</span>
</div>
</p>
{
projectDetail && projectDetail.license_name &&
<div>
<i className="iconfont icon-xieyiicon font-16 mr10 color-grey-6"></i>
<span className="color-grey-6">{projectDetail.license_name}</span>
</div>
<p className="color-grey-6">
<i className="iconfont icon-tianping font-16 mr10 color-grey-3"></i>
<span>{projectDetail.license_name}</span>
</p>
}
</div>
{
inviteCode &&
<div>
<Divider />
<Invite code={inviteCode}/>
</div>
}
{
lesson_url &&
<div>
<Divider />
<p className="font-16 color-ooo">实践课程</p>
<a href={lesson_url} target="_blank" className="color-grey-6" style={{textDecoration:"underline",wordBreak:"break-all"}}>{lesson_url}</a>
<p className="font-16 color-grey-6">实践课程</p>
<a href={lesson_url} target="_blank" className="color-grey-6" style={{textDecoration:"underline"}}>{lesson_url}</a>
</div>
}
{/* 发布 */}
@ -501,25 +428,13 @@ function CoderDepot(props){
projectDetail && projectDetail.release_versions &&
<React.Fragment>
<Divider />
<Releases
owner={owner}
projectsId={projectsId}
releaseVersions={projectDetail.release_versions}
history={props.history}
baseOperate={baseOperate}
projectType={projectDetail.type}
/>
<Releases owner={owner} projectsId={projectsId} releaseVersions={projectDetail.release_versions} history={props.history}/>
</React.Fragment>
}
{/* 贡献者 */}
{
projectDetail && projectDetail.contributors &&
<Contributors
contributors={projectDetail && projectDetail.contributors}
owner={owner}
projectsId={projectsId}
currentLogin={current_user && current_user.login}
/>
<Contributors contributors={projectDetail && projectDetail.contributors} owner={owner} projectsId={projectsId} />
}
{/* 语言 */}
{ projectDetail && projectDetail.languages &&

View File

@ -2,18 +2,12 @@ import React from 'react';
import { Link } from 'react-router-dom';
import { truncateCommitId } from '../common/util';
const typeIco = {
"submodule":"icon-file-submodule font-17",
"file":'icon-wenjian6 font-15',
"dir":"icon-wenjianjia4 font-15"
}
function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId }){
return(
<li>
<span>
<a onClick={()=>goToSubRoot(item.path,item.type,item.name)} className={item.type === "submodule" && "submoduleStyle"}>
<i className={`iconfont ${typeIco[`${item.type}`]} color-blue-file mr8`}></i>{item.name}
<a onClick={()=>goToSubRoot(item.path,item.type,item.name)}>
<i className={item.type === 'dir' ? "iconfont icon-wenjianjia1 color-green-file font-15 mr5":"iconfont icon-wenjia color-green-file font-15 mr5"}></i>{item.name}
</a>
</span>
<span title="init project">

View File

@ -1,9 +1,7 @@
import React, { useEffect, useState } from 'react';
import RenderHtml from '../../components/render-html';
import { AlignCenter } from '../Component/layout';
import { Dropdown , Anchor , Spin } from 'antd';
import ReadmeCatelogue from './sub/ReadmeCatelogue';
import { Dropdown , Menu , Spin } from 'antd';
import { Link } from 'react-router-dom';
const $ = window.$;
function CoderDepotReadme({ operate , history , readme , ChangeFile }){
@ -24,43 +22,44 @@ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
const anchor = el.id;
const level = el.tagName.replace("H", "");
const href = `#${anchor}`;
return { href:`${href}`,text:el.textContent , level:level }
return { href:`${path}${href}`,text:el.textContent , level:level }
});
setMenuList(items);
},[content])
function menu(){
if(menuList && menuList.length > 0){
let hash = history.location.hash;
return(
<ReadmeCatelogue menuList={menuList} hash={history.location.hash}/>
<Menu className="menuslist">
{
menuList.map((item,key)=>{
return(
<Menu.Item key={item.id} className={decodeURI(hash).indexOf(item.text)>-1 ?"active":""}><Link to={`${item.href}`} style={{paddingLeft:`${item.level *10}px`}} title={item.text}>{item.text}</Link></Menu.Item>
)
})
}
</Menu>
)
}else{
return <Spin />
}
}
return(
<div className="commonBox readBox" id="readme">
<Anchor offsetTop={70} targetOffset={160}>
<div className="commonBox-title boxTitle">
<AlignCenter>
<Dropdown overlay={menu()} trigger={['hover']} overlayClassName="menuslist">
<span className="catelogue">
<i className="iconfont icon-muluicon font-12 mr5"></i>
<span>目录</span>
</span>
</Dropdown>
<span className="commonBox-title-read">README.md</span>
</AlignCenter>
{
operate ?
<a className="ml20 pull-right" onClick={() =>ChangeFile(readme && readme.path, false)}>
<i className="iconfont icon-a-bianji font-17 color-grey-6"></i>
</a>
:""
}
</div>
</Anchor>
<div className="commonBox" id="readme">
<div className="commonBox-title">
<Dropdown overlay={menu()}>
<i className="iconfont icon-zhangjie1 font-16 color-grey-3 mr10"></i>
</Dropdown>
<span className="commonBox-title-read">README.md</span>
{
operate ?
<a className="ml20 pull-right" onClick={() =>ChangeFile(readme && readme.path, false)}>
<i className="iconfont icon-bianji6 font-16 color-blue"></i>
</a>
:""
}
</div>
{
content &&
<div className="commonBox-info">

View File

@ -4,20 +4,14 @@ import { Dropdown , Menu , Icon , Tooltip , Spin } from 'antd';
import { truncateCommitId } from '../common/util';
import { getBranch } from '../GetData/getData';
import Nodata from '../Nodata';
import './list.scss';
import './list.css';
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
export default ((props)=>{
const [ data , setData ] =useState(undefined);
const [ isSpin , setIsSpin ] =useState(true);
const { projectsId , owner } = props.match.params;
const { isManager , isDeveloper , projectDetail } = props;
useEffect(()=>{
getBranchs(projectsId, owner);
},[projectsId])
@ -38,7 +32,7 @@ export default ((props)=>{
return(
<li key={key}>
<div>
<Link to={`/projects/${owner}/${projectsId}/tree/${turnbar(item.name)}`} className="color-blue font-15" style={{"maxWidth":"100px"}}>{item.name}</Link>
<Link to={`/projects/${owner}/${projectsId}/tree/${item.name}`} className="color-blue font-15" style={{"maxWidth":"100px"}}>{item.name}</Link>
<p className="f-wrap-alignCenter mt15">
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.last_commit.sha}`)}`} className="mr5 commitKey" style={{marginLeft:0}}>{item.last_commit && truncateCommitId(item.last_commit.sha)}</Link>
<span className="color-grey-3 hide-1 messages leftPoint">{item.last_commit && item.last_commit.message}</span>
@ -46,10 +40,7 @@ export default ((props)=>{
</p>
</div>
<span>
{
(isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) &&
<Link to={`/projects/${owner}/${projectsId}/pulls/new/${item.name}`} className="mr20 color-blue mr30">创建合并请求</Link>
}
<Link to={`/projects/${owner}/${projectsId}/pulls/new/${item.name}`} className="mr20 color-blue mr30">创建合并请求</Link>
<Dropdown overlay={menu(item.zip_url,item.tar_url)} trigger={['click']} placement="bottomRight" className="color-green-file">
<a className="ant-dropdown-link">
<Tooltip title={`下载分支${item.name}`}><Icon type="cloud-download" className="font-18"/></Tooltip>
@ -73,7 +64,6 @@ export default ((props)=>{
<Menu.Item key={'1'}><a href={tar_url}>TAR.GZ</a></Menu.Item>
</Menu>
)
return(
<React.Fragment>
<div className="main">

View File

@ -2,19 +2,12 @@ import React , { Component } from 'react';
import { Spin , Pagination } from 'antd';
import { getImageUrl } from 'educoder';
import { truncateCommitId } from '../common/util';
import { AlignTop } from '../Component/layout';
import SelectBranch from '../Branch/Select';
import Nodata from '../Nodata';
import axios from 'axios';
import {Link} from "react-router-dom";
function returnbar(str){
if(str && str.length>0 && str.indexOf("%2F")>-1){
return str.replaceAll('%2F','/');
}
return str;
}
class CoderRootCommit extends Component{
constructor(props){
super(props)
@ -63,12 +56,11 @@ class CoderRootCommit extends Component{
this.setState({
isSpining:true
})
console.log(returnbar(branch));
const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/commits.json`;
axios.get(url,{
params:{
sha:returnbar(branch),
sha:branch,
page,
limit
}
@ -113,7 +105,7 @@ class CoderRootCommit extends Component{
const { commitDatas , dataCount , limit , page , isSpining , branchList } = this.state;
const { projectDetail, commit_class , defaultBranch } = this.props;
const { projectsId , owner , branchName } = this.props.match.params;
let branch = returnbar(branchName || defaultBranch);
let branch = branchName || defaultBranch;
return(
<React.Fragment>
<div className={"main"}style={{padding:"0px",border:"none"}}>
@ -140,10 +132,10 @@ class CoderRootCommit extends Component{
commitDatas && commitDatas.length > 0 && commitDatas.map((item,k)=>{
return(
<div key={k}>
<AlignTop>
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitKey" style={{marginLeft:0,marginTop:"3px"}}>{truncateCommitId(`${item.sha}`)}</Link>
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitDesc">{item.message}</Link>
</AlignTop>
<p className="f-wrap-alignCenter">
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="commitKey" style={{marginLeft:0}}>{truncateCommitId(`${item.sha}`)}</Link>
<Link to={`/projects/${owner}/${projectsId}/commits/${truncateCommitId(`${item.sha}`)}`} className="flex1 ml20 font-16 color-grey-3">{item.message}</Link>
</p>
<p className="f-wrap-alignCenter mt15">
{
item.id ?

View File

@ -1,6 +1,6 @@
import React, { Component } from "react";
import { Popconfirm , Select } from "antd";
import "./list.scss";
import "./list.css";
import axios from "axios";
import Meditor from "../Newfile/m_editor";
import RenderHtml from "../../components/render-html";
@ -285,7 +285,6 @@ class CoderRootFileDetail extends Component {
readOnly={readOnly}
editorType="update"
currentBranch={currentBranch}
descName={detail && `Update ${detail.name}`}
></Meditor>
)}
</div>

View File

@ -102,11 +102,6 @@ class CoderRootIndex extends Component{
(props) => (<FileNew {...this.props} {...props} {...this.state} getTopCount={this.getTopCount} />)
}
></Route>
<Route path="/projects/:owner/:projectsId/commits/branch/:branchName"
render={
() => (<CoderRootCommit {...this.props} {...this.state} commit_class="main" getTopCount={this.getTopCount} />)
}
></Route>
<Route path="/projects/:owner/:projectsId/commits/:sha"
render={
(props) => (<Diff {...this.props} {...props} {...this.state}/>)

View File

@ -26,7 +26,7 @@ export default (( props, { projectDetail }) => {
}, [owner, projectsId]);
return (
<div className="main" style={{padding:"0px",border:"none"}}>
<div className="main">
<Spin spinning={isSpin}>
<div style={{minHeight:"400px"}}>
{

View File

@ -1,11 +1,10 @@
import React, { Component } from 'react';
import { Spin, Tooltip, Button } from 'antd';
import { Spin, Tooltip } from 'antd';
import { Link, Route, Switch } from 'react-router-dom';
import { Content , AlignTop, AlignCenter } from '../Component/layout';
import { Content } from '../Component/layout';
import DetailBanner from './sub/DetailBanner';
import { numFormat } from 'educoder';
import '../css/index.scss'
import './list.scss';
import './list.css';
import Loadable from 'react-loadable';
import Loading from '../../Loading';
@ -128,15 +127,7 @@ const Source = Loadable({
const DevIndex = Loadable({
loader: () => import('../DevOps/Index'),
loading: Loading,
});
const Wiki = Loadable({
loader: () => import('../Wiki/Index'),
loading: Loading,
});
const WikiEdit = Loadable({
loader: () => import('../Wiki/EditWiki'),
loading: Loading,
});
})
/**
* permissionManager:管理员Reporter报告人员(只有读取权限)Developer开发人员除不能设置仓库信息外
*/
@ -160,8 +151,6 @@ function checkPathname(projectsId,owner,pathname){
name="devops"
}else if(url.indexOf(`/source`)>-1){
name="source"
}else if(url.indexOf(`/wiki`)>-1){
name="wiki"
}
}
return name;
@ -187,7 +176,6 @@ class Detail extends Component {
firstSync:false,
secondSync:false,
open_devops:false,
forkSpin:false,
// 默认分支
defaultBranch:undefined,
@ -226,7 +214,7 @@ class Detail extends Component {
if(num){
this.setState({
secondSync:true,
firstSync:false
firsrtSync:false
})
}else{
this.setState({
@ -237,7 +225,7 @@ class Detail extends Component {
}else{
this.getDetail();
this.setState({
firstSync:false,
firsrtSync:false,
secondSync:false
})
}
@ -258,7 +246,7 @@ class Detail extends Component {
var cable = actioncable.createConsumer(`wss://${name}/cable`);
this.canvasChannel1 = cable.subscriptions.create({
channel: `MirrorProjectChannel`,
id: project && project.id
id: project && project.identifier
}, {
connected: () => {
console.log("###### channel connected! ######");
@ -268,10 +256,6 @@ class Detail extends Component {
console.log(`###### ---received data--- ######`);
if (data) {
this.getDetail();
this.setState({
firstSync:false,
secondSync:false
});
cable.subscriptions.consumer.disconnect();
}
}
@ -374,9 +358,6 @@ class Detail extends Component {
forkFunc = () => {
const { platform } = this.state;
if(!platform)return;
this.setState({
forkSpin:true
})
const { current_user } = this.props
const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/forks.json`;
@ -385,13 +366,8 @@ class Detail extends Component {
this.props.history.push(`/projects/${current_user && current_user.login}/${result.data.identifier}`);
this.props.showNotification(result.data.message);
}
this.setState({
forkSpin:false
})
}).catch(error => {
this.setState({
forkSpin:false
})
console.log(error);
})
}
@ -413,23 +389,13 @@ class Detail extends Component {
})
}
textFunc = (forked_from_project_id,fork_info)=>{
let type = fork_info && fork_info.fork_project_user_type;
return forked_from_project_id && fork_info ?
<div className="color-grey-9 df">
<span>复刻自</span>
<Link to={`${type ==="Organization" ? "/organize":'/users'}/${fork_info.fork_project_user_login}`} className="show-user-link color-grey-6 ml5">{fork_info.fork_project_user_name}</Link>
<span> / </span>
<Link to={`/projects/${fork_info.fork_project_user_login}/${fork_info.fork_project_identifier}`} className="color-grey-6 task-hide flex1" style={{maxWidth:"400px"}} title={fork_info.fork_form_name}>{fork_info.fork_form_name}</Link>
</div> : ""
}
render() {
const { projectDetail, watchers_count, praises_count,
forked_count, firstSync , secondSync ,
isManager, watched, praised,
project , open_devops , platform , defaultBranch , bannerList , forkSpin } = this.state;
project , open_devops , platform , defaultBranch , bannerList } = this.state;
const url = this.props.history.location.pathname;
const urlArr = url.split("/");
const urlFlag = (urlArr.length === 3);
@ -440,6 +406,16 @@ class Detail extends Component {
const { state } = this.props.history.location;
const text = (
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
<React.Fragment>
<span>forked from </span>
<Link to={`/users/${projectDetail.fork_info.fork_project_user_login}`} className="show-user-link color-grey-ccc">{projectDetail.fork_info.fork_project_user_name}</Link>
<span> / </span>
<Link to={`/projects/${projectDetail.fork_info.fork_project_user_login}/${projectDetail.fork_info.fork_project_identifier}`} className="color-grey-ccc">{projectDetail.fork_info.fork_form_name}</Link>
</React.Fragment> : ""
);
const common = {
getDetail: this.getDetail,
changeOpenDevops:this.changeOpenDevops,
@ -449,96 +425,98 @@ class Detail extends Component {
<div>
<div className="detailHeader-wrapper">
<div className="normal">
<AlignCenter style={{paddingTop:"20px",justifyContent:"space-between"}}>
<AlignTop>
<div className="projectallName">
{project && project.author &&
<Link to={`${project.author.type ==="Organization" ? "/organize":'/users'}/${project.author.login}`} title={project.author.name}>{project.author.name}</Link>
}
<span className="ml5 mr5">/</span>
<Link to={`/projects/${owner}/${projectsId}`} className="projectN" title={projectDetail && projectDetail.name}>{projectDetail && projectDetail.name}</Link>
</div>
{ projectDetail && projectDetail.private && <span className="privateTag">私有</span>}
</AlignTop>
<div>
{
firstSync ? "":
<span className="df">
{
((current_user && current_user.admin) || isManager) && (projectDetail && projectDetail.type && projectDetail.type === 2) ?
<a size="middle" className="synchronism ml30" onClick={this.synchronismMirror}>同步镜像</a> : ""
}
<span className="detail_tag_btn">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={() => this.focusFunc(watched)}>
<i className={watched ? "iconfont icon-quxiaoguanzhu color-blue font-14 mr3":"iconfont icon-morenguanzhu_ICON color-grey-9 font-14 mr3"}></i>
<span>{watched ? '取消关注' : '关注'}</span>
</a>
{
watchers_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" to={platform?{ pathname: `/projects/${owner}/${projectsId}/watchers`, state }:""}>
{numFormat(watchers_count)}
</Link>
:
<span className="detail_tag_btn_count">{watchers_count}</span>
:""
}
</span>
<span className="detail_tag_btn">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={() => this.pariseFunc(praised)}>
<i className={praised ? "iconfont icon-dianzan_icon color-blue font-14 mr3":"iconfont icon-guanzhu color-grey-9 font-14 mr3"}></i>
<span>{praised ? '取消点赞' : '点赞'}</span>
</a>
{
praises_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" to={{ pathname: `/projects/${owner}/${projectsId}/stargazers`, state }}>
{numFormat(praises_count)}
</Link>:
<span className="detail_tag_btn_count">{praises_count}</span>
:""
}
</span>
<span className="detail_tag_btn" loading={forkSpin}>
<Tooltip title="复刻是fork的中文名即复制代码仓库" placement="bottom">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={this.forkFunc}>
<i className="iconfont icon-fork color-grey-9 mr3 font-16"></i>
<span>复刻</span>
</a>
</Tooltip>
{
forked_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" to={{ pathname: `/projects/${owner}/${projectsId}/fork_users`, state }}>
{numFormat(forked_count)}
</Link>
:
<span className="detail_tag_btn_count">{forked_count}</span>
:""
}
</span>
</span>
<div className="f-wrap-between pb15" style={{ position: "relative" }}>
<p className="font-22 df flex-1 lineH2 mt15" style={{ alignItems: "center" }}>
{project && project.author &&
<Link to={`${project.author.type ==="Organization" ? "/organize":'/users'}/${project.author.login}`} className="show-user-link">
{project.author.name}
</Link>
}
</div>
</AlignCenter>
<div className="mt6" style={{minHeight:"20px"}}>
<span className="ml5 mr5">/</span>
<span className="hide-1 flex-1 df">
<Link to={`/projects/${owner}/${projectsId}`} className="font-22">{project && project.name}</Link>
{
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
<Tooltip placement={'right'} title={text}>
<Link to={`/projects/${projectDetail.fork_info.fork_project_user_login}/${projectDetail.fork_info.fork_project_identifier}`}
className="ml10" >
<i className="iconfont icon-fork font-18 fl mt6" style={{ color: "#8D90E3" }}></i>
</Link>
</Tooltip> : ""
}
{
projectDetail && projectDetail.type && projectDetail.type !== 0 ?
projectDetail.type === 2 ?
<Tooltip title={"镜像自: " + projectDetail.mirror_url} className="ml5" placement={'right'}>
<i className="iconfont icon-banbenku font-18 mt6" style={{ color: "#8D90E3" }}/>
</Tooltip>
:
<Tooltip title={"镜像自: " + projectDetail.mirror_url} className="ml5" placement={'right'}>
<i className="iconfont icon-jingxiang font-18 color-green mt6" />
</Tooltip>
:""
}
</span>
</p>
{
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
this.textFunc(projectDetail.forked_from_project_id,projectDetail.fork_info)
:""
}
{
projectDetail && projectDetail.type && projectDetail.type !== 0 ?
<span className="color-grey-9">镜像自 <a className="color-blue hoverLine" target="_blank" href={projectDetail.mirror_url}>{projectDetail.mirror_url}</a></span>
:""
firstSync ? "":
<span className="df mt25">
{
((current_user && current_user.admin) || isManager) && (projectDetail && projectDetail.type && projectDetail.type === 2) ?
<a className="synchronism ml30" onClick={this.synchronismMirror}>同步镜像</a> : ""
}
<span className="detail_tag_btn">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={() => this.focusFunc(watched)}>
<i className={watched ? "iconfont icon-shixing color-orange font-16 mr3":"iconfont icon-kongxing color-grey-9 font-16 mr3"}></i>
<span>{watched ? '取消关注' : '关注'}</span>
</a>
{
watchers_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" style={{color:`${watched?"#2878FF":"#666"}`}} to={platform?{ pathname: `/projects/${owner}/${projectsId}/watchers`, state }:""}>
{watchers_count}
</Link>
:
<span className="detail_tag_btn_count">{watchers_count}</span>
:""
}
</span>
<span className="detail_tag_btn">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={() => this.pariseFunc(praised)}>
<i className={praised ? "iconfont icon-weibiaoti105 color-orange font-14 mr3":"iconfont icon-guanzhu color-grey-9 font-14 mr3"}></i>
<span>{praised ? '取消点赞' : '点赞'}</span>
</a>
{
praises_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" style={{color:`${praised?"#2878FF":"#666"}`}} to={{ pathname: `/projects/${owner}/${projectsId}/stargazers`, state }}>
{praises_count}
</Link>:
<span className="detail_tag_btn_count">{praises_count}</span>
:""
}
</span>
<span className="detail_tag_btn">
<a className="detail_tag_btn_name" style={{cursor:platform?"pointer":"default"}} onClick={this.forkFunc}>
<i className="iconfont icon-fork color-grey-9 mr3"></i> (Fork)
</a>
{
forked_count > 0 ?
platform ?
<Link className="detail_tag_btn_count" to={{ pathname: `/projects/${owner}/${projectsId}/fork_users`, state }}>
{forked_count}
</Link>
:
<span className="detail_tag_btn_count">{forked_count}</span>
:""
}
</span>
</span>
}
</div>
{
firstSync ? "" :
<DetailBanner
history={this.props.history}
list={bannerList}
owner={owner}
projectsId={projectsId}
@ -573,24 +551,6 @@ class Detail extends Component {
() => (<DevAbout {...this.props} {...this.state} {...common} />)
}
></Route>
{/* wiki新增文件 */}
<Route path="/projects/:owner/:projectsId/wiki/add"
render={
() => (<WikiEdit {...this.props} {...this.state} {...common} />)
}
></Route>
{/* wiki编辑文件 */}
<Route path="/projects/:owner/:projectsId/wiki/edit/:wikiName"
render={
() => (<WikiEdit {...this.props} {...this.state} {...common} />)
}
></Route>
{/* wiki */}
<Route path="/projects/:owner/:projectsId/wiki"
render={
() => (<Wiki {...this.props} {...this.state} {...common} />)
}
></Route>
{/* 工作流 */}
<Route path="/projects/:owner/:projectsId/devops"
render={

View File

@ -51,7 +51,7 @@ export default ({ match , history }) => {
}
}, [projectsId , owner, sha]);
return (
<div className="main" style={{padding:"0px",border:"none"}}>
<div className="main">
<Spin spinning={isSpin}>
<Infos>
<div className="commitinfos">

View File

@ -1,420 +0,0 @@
.recommandOri.slick-slider {
width: 1300px;
margin: 20px auto 40px;
}
.recommandOri.slick-slider .slick-track {
margin-left: 0px;
}
.recommandOri.slick-slider .slick-slide li > a {
display: flex;
align-items: center;
justify-content: center;
}
/* recommandProjects */
.recommandProjects.slick-slider {
width: 1230px;
margin: 20px auto 40px;
}
.recommandProjects.slick-slider .slick-track {
margin-left: 0px;
}
.recommandProjects.slick-slider .slick-arrow.slick-prev:before, .recommandProjects.slick-slider .slick-arrow.slick-next:before {
color: #999;
}
.recommandProjects.slick-slider .slick-arrow.slick-prev li.slick-active button:before, .recommandProjects.slick-slider .slick-arrow.slick-next li.slick-active button:before {
color: #999;
}
.recommandProjects.slick-slider .slick-dots {
bottom: -29px;
}
.recommandProjects.slick-slider .slick-dots li button:before {
color: #909090;
}
.recommandProjects.slick-slider .slick-slide {
padding: 0px 15px;
box-sizing: border-box;
}
.recommandProjects.slick-slider .slick-slide > div {
background-color: #fff;
border-radius: 10px;
width: 100%;
cursor: pointer;
border: 1px solid #eee;
}
.recommandProjects.slick-slider .slick-slide > div:hover {
box-shadow: 0px 2px 20px 0px rgba(0, 0, 0, 0.1);
}
.recommandProjects.slick-slider .baseInfo {
padding: 18px 15px;
display: flex;
font-size: 12px;
color: #888;
}
.recommandProjects.slick-slider .baseInfo .look {
margin-right: 10px;
}
.recommandProjects.slick-slider .baseInfo .look i {
margin-right: 5px;
}
.recommandProjects.slick-slider .baseInfo .type {
flex: 1;
width: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-align: right;
}
.recommandProjects.slick-slider .mainInfo {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 160px;
border-bottom: 1px solid #eee;
padding: 20px;
box-sizing: border-box;
}
.recommandProjects.slick-slider .mainInfo img {
height: 50px;
width: 50px;
border-radius: 50%;
}
.recommandProjects.slick-slider .mainInfo .name {
font-size: 13px;
color: #666;
height: 18px;
line-height: 18px;
margin-top: 12px;
}
.recommandProjects.slick-slider .mainInfo .school {
margin-top: 12px;
color: #333;
font-size: 16px;
height: 22px;
line-height: 22px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 100%;
}
.Panels {
max-width: 1200px;
margin: 0 auto;
}
.Panels .panelmenu {
padding-top: 30px;
}
.Panels .panelmenu .depotBtn .mr-5 {
margin-right: -5px;
}
.Panels .panelmenu .depotBtn .ant-btn {
height: 36px;
line-height: 34px;
width: 83px;
text-align: center;
padding: 0px;
font-weight: 500;
font-size: 14px;
}
.Panels .panelmenu .depotBtn .ant-btn-default {
color: #333;
border-color: #d0d0d0;
}
.Panels .panelmenu .depotBtn .ant-btn-default:hover {
background: #F3F4F6;
}
.Panels .panelmenu .depotBtn .ant-btn-primary {
color: #fff;
background-color: #466AFF;
opacity: 0.8;
}
.Panels .addOptionBtn {
height: 32px;
line-height: 30px;
display: flex;
border: 1px solid #d9d9d9;
border-radius: 2px;
}
.Panels .addOptionBtn a {
padding: 0px 13px;
color: rgba(0, 0, 0, 0.65);
cursor: pointer;
}
.Panels .addOptionBtn > a:first-child {
border-right: 1px solid #d9d9d9;
}
.Panels .addOptionBtn > a:last-child {
border-right: none;
}
.Panels .infoCount {
display: inline-block;
width: 24px;
text-align: center;
height: 24px;
line-height: 24px;
background-color: rgba(153, 153, 153, 0.13);
color: #666;
border-radius: 12px;
margin-left: 6px;
font-size: 12px;
}
.Panels .attrPerson {
padding-top: 12px;
display: flex;
flex-wrap: wrap;
padding-bottom: 2px;
}
.Panels .attrPerson a {
margin: 0px 17px 0px 0px;
}
.Panels .attrPerson a img {
border-radius: 50%;
width: 40px;
height: 40px;
}
.Panels .attrPerson a:nth-child(6) {
margin-right: 0px;
}
.Panels .progress {
display: flex;
border-radius: 10px;
height: 7px;
margin-top: 12px;
}
.Panels .progress span:first-child {
border-radius: 10px 0px 0px 10px;
}
.Panels .progress span:last-child {
border-radius: 0px 10px 10px 0px;
}
.Panels .progresstip {
margin-top: 15px;
flex-wrap: wrap;
}
.Panels .progresstip i.zero {
position: absolute;
display: block;
border-radius: 50%;
height: 8px;
width: 8px;
left: 0px;
top: 10px;
}
.Panels .progresstip > span {
padding-left: 15px;
position: relative;
min-width: 33.5%;
font-size: 12px;
font-weight: 400;
color: #666;
}
.Panels .progresstip > span span:last-child {
margin-left: 5px;
}
.Panels .listtable {
margin-top: 20px;
}
.Panels .listtable .listtablehead {
height: 55px;
display: flex;
justify-content: space-between;
align-items: flex-start;
border-bottom: 1px solid #d9d9d9;
padding: 13px 20px;
border-radius: 4px 4px 0px 0px;
border: 1px solid rgba(42, 97, 255, 0.23);
background-color: #FAFCFF;
}
.Panels .listtable .listtablehead .ellipsistxt {
margin-top: 6px;
margin-left: 13px;
line-height: 18px;
flex: 1;
width: 0;
color: #666;
}
.Panels .listtable .listtablehead .ellipsistxt #ptxt {
margin-bottom: 0px;
word-break: break-all;
overflow: unset;
white-space: pre-wrap;
/* css3.0 */
white-space: -moz-pre-wrap;
/* Firefox */
white-space: -pre-wrap;
/* Opera 4-6 */
white-space: -o-pre-wrap;
/* Opera 7 */
word-wrap: break-word;
}
.Panels .listtable .listtablehead .ellipsistxt.hidetxt {
height: 18px;
overflow: hidden;
position: relative;
padding-right: 8px;
}
.Panels .listtable .listtablehead .ellipsis {
margin-left: 8px;
cursor: pointer;
border-radius: 2px;
height: 16px;
background: rgba(153, 153, 153, 0.2);
border-radius: 2px;
padding: 0px 4px;
height: 14px;
line-height: 14px;
margin-top: 9px;
}
.Panels .listtable .listtablehead .ellipsis i {
font-size: 15px !important;
color: #333;
height: 14px;
line-height: 14px;
}
.Panels .listtable .listtablebody {
border-radius: 0px 0px 4px 4px;
border: 1px solid #D0D0D0;
border-top: none;
}
.Panels .listtable .listtablebody li.listtablepath a {
color: #40a9ff;
}
.Panels .listtable .listtablebody li.listtablepath p {
margin-bottom: 0px !important;
}
.Panels .listtable .listtablebody > li {
height: 38px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #d9d9d9;
padding: 0px 20px 0px 24px;
}
.Panels .listtable .listtablebody > li:hover {
background-color: #F3F4F6;
}
.Panels .listtable .listtablebody > li > span:first-child {
width: 30%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.Panels .listtable .listtablebody > li > span:nth-child(2) {
width: 60%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.Panels .listtable .listtablebody > li > span:nth-child(3) {
width: 10%;
text-align: right;
}
.Panels .listtable .listtablebody > li:last-child {
border-bottom: none;
}
.drawerBtn {
position: fixed;
left: -13px;
width: 33px;
background: #FFFFFF;
box-shadow: 0px 0px 8px 3px rgba(0, 0, 0, 0.09);
border: 1px solid #666666;
border-radius: 0px 12px 12px 0px;
height: 70px;
top: 50%;
margin-top: -35px;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding-left: 7px;
}
.drawerBtn:hover {
box-shadow: 0px 0px 8px 3px rgba(0, 0, 0, 0.09);
}
.drawerBtn span {
writing-mode: vertical-lr;
color: #333;
width: 25px;
font-size: 14px;
}
.drawerBtn i {
color: #333;
height: 14px;
line-height: 14px;
width: 14px;
margin-left: 2px;
margin-bottom: 3px;
}
.downMenu {
width: 329px;
background-color: #fff;
box-shadow: 0px 1px 8px 1px rgba(212, 212, 212, 0.5);
padding-bottom: 14px;
}
.downMenu .ant-menu-item {
height: 50px;
line-height: 50px;
}
.catelogue {
cursor: pointer;
background: #FAFBFC;
border-radius: 4px;
border: 1px solid #D0D0D0;
font-size: 15px;
font-weight: normal;
margin-right: 12px;
padding: 0px 10px;
height: 30px;
line-height: 30px;
color: #666 !important;
display: flex;
align-items: center;
}
.catelogue:hover {
background-color: #F3F4F6;
}
.catelogue span {
margin-top: 1px;
}
.submoduleStyle {
cursor: default;
}
.submoduleStyle i {
cursor: default;
}
.submoduleStyle:hover {
color: #05101a;
}
.pinfos i, .pinfos a {
color: #666;
}
.pinfos:hover i, .pinfos:hover a {
color: #466AFF;
}
.graph {
flex: 1;
margin: 0px 12px;
}
.graph .ant-typography {
white-space: pre-wrap;
margin-bottom: 0px;
}
.ant-anchor-wrapper {
padding-left: 2px;
}
.ant-anchor-wrapper .ant-anchor-ink::before {
background-color: #fff;
}
/*# sourceMappingURL=Index.css.map */

View File

@ -1 +0,0 @@
{"version":3,"sourceRoot":"","sources":["Index.scss"],"names":[],"mappings":"AAAA;EACE;EACA;;AACA;EACE;;AAGA;EAEE;EACA;EACA;;;AAIN;AACA;EACE;EACA;;AACA;EACE;;AAGA;EACE;;AAEF;EACE;;AAGJ;EACE;;AACA;EACE;;AAGJ;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAIN;EACE;EACA;EACA;EACA;;AACA;EAIE;;AAHA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKN;EACE;EACA;;AACA;EACE;;AAEE;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AACA;EACE;;AAGJ;EACE;EACA;EACA;;AAIN;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;;AAEF;EACE;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AACA;EACE;;AACA;EACE;EACA;EACA;;AAEF;EACE;;AAIN;EACE;EACA;EACA;EACA;;AAEE;EACE;;AAEF;EACE;;AAIN;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEE;EACE;;AAKR;EACE;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EAWA;EACA;EACA;EACA;EACA;;AAdA;EACE;EACA;EACA;EACA;AAAsB;EACtB;AAA2B;EAC3B;AAAuB;EACvB;AAAyB;EACzB;;AAOF;EACE;EACA;EACA;EACA;;AASJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAIN;EACE;EACA;EACA;;AAEE;EAAE;;AACF;EACE;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAGJ;EACE;;;AAKR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAGJ;EACE;;AACA;EACE;;AAEF;EACE;;;AAIF;EAAI;;AACJ;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;EACA;;;AAGJ;EACE;;AACA;EACE","file":"Index.css"}

View File

@ -1,12 +1,9 @@
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Menu, Input , Spin, Pagination , Popover , Select } from 'antd';
import Slider from "react-slick";
import { getImageUrl } from 'educoder';
import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";
import '../css/index.scss'
import './list.scss';
import './list.css';
import './Index.scss';
import ListItem from './IndexItem'
import axios from 'axios';
@ -33,8 +30,6 @@ class Index extends Component {
categoryList: undefined,
recommendList:undefined,
recommendOriList:undefined,
languageList:undefined,
languageId:undefined
}
@ -52,8 +47,6 @@ class Index extends Component {
this.getRecommand();
this.getLanguage();
// this.getRecommandOri();
}
// 获取语言列表
@ -79,17 +72,6 @@ class Index extends Component {
}).catch(error=>{})
}
getRecommandOri=()=>{
const url = `/organizations/recommend.json`;
axios.get(url).then(result=>{
if(result){
this.setState({
recommendOriList:result.data.organizations
})
}
}).catch(error=>{})
}
// 获取列表
getListData = (page, limit, search, sort, project_type, category_id,languageId) => {
const { current_user } = this.props;
@ -274,56 +256,22 @@ class Index extends Component {
const { current_user } = this.props;
const { projectsList , recommendList , languageList , languageId ,
isSpin, total, search, limit, page, typeList, categoryList , recommendOriList } = this.state;
const setting={
dots: true,
infinite: true,
speed: 500,
slidesToShow: 5,
slidesToScroll: 5,
autoplay:false,
arrows:false,
adaptiveHeight:true
}
const settings={
dots: true,
infinite: true,
speed: 500,
slidesToShow: 6,
slidesToScroll: 6,
autoplay:false,
arrows:false,
adaptiveHeight:true
}
isSpin, total, search, limit, page, typeList, categoryList } = this.state;
return (
<div>
<p className="t_project_banner">
<img src={banner} width="100%" alt=""/>
</p>
{/* {
recommendOriList && recommendOriList.length>0?
<Slider {...settings} className="recommandOri">
{
recommendOriList.map((i,k)=>{
return(
<li><Link to={''}><img src={getImageUrl(`/${i.avatar_url}`)} alt={i.name} title={i.name} width="80px"/></Link></li>
)
})
}
</Slider>
:""
} */}
{
recommendList && recommendList.length>0 &&
<Slider {...setting} className={recommendList.length>5 ? "recommandProjects":"recommandProjects mb20"}>
<div className="recommandProjects">
{
recommendList.map((item,key)=>{
return(
<div className="items" onClick={()=>this.getoDetail(item.author && item.author.login,item.identifier)}>
<div onClick={()=>this.getoDetail(item.author && item.author.login,item.identifier)}>
<div className="mainInfo">
<img src={getImageUrl(`/${item.author && item.author.image_url}`)} width="50px" height="50px"alt=""/>
<img src={getImageUrl(`/${item.author && item.author.image_url}`)} alt=""/>
<p className="school">{item.name}</p>
<p className="name">{item.author && item.author.name}</p>
</div>
@ -335,8 +283,9 @@ class Index extends Component {
)
})
}
</Slider>
</div>
}
<div className="ProjectListIndex">
<div className="list-left">
<ul className="list-l-Menu">

View File

@ -1,53 +1,57 @@
.recommandOri.slick-slider{
width: 1300px;
margin:20px auto 40px;
.slick-track{
margin-left: 0px;
}
.slick-slide{
li > a{
display: flex;
align-items: center;
justify-content: center;
}
/* recommandProjects */
.recommandProjects{
display: flex;
max-width: 1200px;
margin:20px auto;
}
.recommandProjects >div{
background-color: #fff;
border-radius: 10px;
width: 220px;
margin-right: 25px;
cursor: pointer;
border: 1px solid #eee;
&:last-child{
margin-right: 0px;
}
}
/* recommandProjects */
.recommandProjects.slick-slider{
width: 1230px;
margin:20px auto 40px;
.slick-track{
margin-left: 0px;
.recommandProjects > div:hover{
box-shadow: 0px 2px 20px 0px rgba(0, 0, 0, 0.1);
}
.recommandProjects > div .mainInfo{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 160px;
border-bottom: 1px solid #eee;
padding:20px;
box-sizing: border-box;
img{
height: 50px;
width:50px;
border-radius: 50%;
}
.slick-arrow.slick-prev,.slick-arrow.slick-next{
&:before{
color: #999;
}
li.slick-active button:before{
color: #999;
}
.name{
font-size: 13px;
color: #666;
height: 18px;
line-height: 18px;
margin-top:12px;
}
.slick-dots{
bottom: -29px;
li button:before{
color: #909090;
}
}
.slick-slide{
padding:0px 15px;
box-sizing: border-box;
& > div{
background-color: #fff;
border-radius: 10px;
width: 100%;
cursor: pointer;
border: 1px solid #eee;
&:hover{
box-shadow: 0px 2px 20px 0px rgba(0, 0, 0, 0.1);
}
}
.school{
margin-top:12px;
color: #333;
font-size: 16px;
height: 22px;
line-height: 22px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width:100%;
}
}
.recommandProjects{
.baseInfo{
padding:18px 15px;
display: flex;
@ -68,79 +72,21 @@
text-align: right;
}
}
.mainInfo{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 160px;
border-bottom: 1px solid #eee;
padding:20px;
box-sizing: border-box;
img{
height: 50px;
width:50px;
border-radius: 50%;
}
.name{
font-size: 13px;
color: #666;
height: 18px;
line-height: 18px;
margin-top:12px;
}
.school{
margin-top:12px;
color: #333;
font-size: 16px;
height: 22px;
line-height: 22px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width:100%;
}
}
}
// coderDepot
.Panels{
max-width: 1200px;
margin: 0 auto;
.panelmenu{
padding-top:30px;
.depotBtn{
.mr-5{
margin-right: -5px;
}
.ant-btn{
height: 36px;
line-height: 34px;
width: 83px;
text-align: center;
padding:0px ;
font-weight: 500;
font-size: 14px;
}
.ant-btn-default{
color: #333;
border-color: #d0d0d0;
&:hover{
background: #F3F4F6;
}
}
.ant-btn-primary{
color: #fff;
background-color: #466AFF;
opacity: 0.8;
}
}
}
.addOptionBtn{
height: 32px;
line-height: 30px;
line-height: 32px;
display: flex;
border:1px solid #d9d9d9;
border-radius: 2px;
border-radius: 4px;
a{
padding:0px 13px;
color: rgba(0, 0, 0, 0.65);
@ -149,33 +95,28 @@
& > a:first-child{
border-right: 1px solid #d9d9d9;
}
& > a:last-child{
border-right: none;
}
}
.infoCount{
display: inline-block;
width: 24px;
text-align: center;
height: 24px;
line-height: 24px;
background-color:rgba(153, 153, 153, 0.13);;
color:#666;
padding:0px 5px;
height: 16px;
line-height: 16px;
background-color: #eee;
color:#999;
border-radius: 12px;
margin-left: 6px;
margin-left: 10px;
font-size: 12px;
}
.attrPerson{
padding-top: 12px;
padding-top: 15px;
display: flex;
flex-wrap: wrap;
padding-bottom: 2px;
a{
margin: 0px 17px 0px 0px;
margin: 10px 10px 0px 0px;
img{
border-radius: 50%;
width: 40px;
height: 40px;
width: 35px;
height: 35px;
}
&:nth-child(6){
margin-right: 0px;
@ -212,11 +153,10 @@
padding-left: 15px;
position: relative;
min-width: 33.5%;
font-size: 12px;
font-weight: 400;
color: #666;
span{
color: #666;
&:last-child{
color: #999;
margin-left: 5px;
}
}
@ -224,69 +164,58 @@
}
.listtable{
margin-top: 20px;
border:1px solid #d9d9d9;
border-radius: 4px;
.listtablehead{
height: 55px;
display: flex;
justify-content: space-between;
align-items: flex-start;
border-bottom: 1px solid #d9d9d9;
padding:13px 20px;
padding:7px 20px;
border-radius: 4px 4px 0px 0px;
border: 1px solid rgba(42, 97, 255, 0.23);
background-color: #FAFCFF;
background-color: #FAFBFC;
.ellipsistxt{
margin-top: 6px;
#ptxt{
margin-bottom: 0px;
word-break: break-all;
overflow: unset;
white-space:pre-wrap; /* css3.0 */
white-space:-moz-pre-wrap; /* Firefox */
white-space:-pre-wrap; /* Opera 4-6 */
white-space:-o-pre-wrap; /* Opera 7 */
word-wrap:break-word;
}
margin-left: 13px;
line-height:18px;
margin-top:6px;
flex:1;
width: 0;
color: #666;
&.hidetxt{
&>p{
word-break:break-all;
}
&.hide{
height: 18px;
overflow: hidden;
position: relative;
padding-right:8px;
// &::after{
// position: absolute;
// right: 0px;
// bottom: 0px;
// content:"...";
// }
}
&.hide::after{
position: absolute;
right: 0px;
bottom: 0px;
content:"...";
}
}
.ellipsis{
margin-left: 8px;
cursor: pointer;
border-radius: 2px;
height: 16px;
background: rgba(153, 153, 153, 0.2);
border-radius: 2px;
background-color: #c1c1c1;
padding:0px 4px;
height: 14px;
line-height: 14px;
margin-top: 9px;
i{
font-size: 15px!important;
color: #333;
color: #fff;
height: 14px;
line-height: 14px;
}
}
}
.listtablebody{
border-radius:0px 0px 4px 4px ;
border: 1px solid #D0D0D0;
border-top: none;
li.listtablepath{
a{color: #40a9ff;}
p{
@ -294,15 +223,12 @@
}
}
& > li{
height: 38px;
height: 42px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #d9d9d9;
padding:0px 20px 0px 24px;
&:hover{
background-color: #F3F4F6;
}
& > span:first-child{
width: 30%;
overflow: hidden;
@ -329,96 +255,46 @@
.drawerBtn{
position: fixed;
left: -13px;
width: 33px;
background: #FFFFFF;
box-shadow: 0px 0px 8px 3px rgba(0, 0, 0, 0.09);
border: 1px solid #666666;
border:1px solid #d9d9d9;
width: 34px;
border-radius: 0px 12px 12px 0px;
text-align: right;
height: 70px;
line-height: 70px;
top:50%;
margin-top: -35px;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding-left: 7px;
&:hover{
box-shadow: 0px 0px 8px 3px rgba(0, 0, 0, 0.09);
}
span{
writing-mode: vertical-lr;
color: #333;
width: 25px;
font-size: 14px;
box-shadow: 1px 0px 7px rgba(0,0,0,0.1);
}
i{
color: #333;
height: 14px;
line-height: 14px;
width: 14px;
margin-left: 2px;
margin-bottom: 3px;
color: #d9d9d9;
}
}
.downMenu{
width: 329px;
box-shadow: 0px 0px 9px rgba(134, 134, 134,0.4);
background-color: #fff;
box-shadow: 0px 1px 8px 1px rgba(212, 212, 212, 0.5);
padding-bottom: 14px;
.ant-menu-item{
height: 50px;
line-height: 50px;
.ant-menu-vertical .ant-menu-item:hover{
background-color: #e6f7ff;
}
}
.catelogue{
cursor: pointer;
background: #FAFBFC;
.menuslist{
max-height: 200px;
overflow-y: auto;
padding:10px 15px;
border-radius: 4px;
border: 1px solid #D0D0D0;
font-size: 15px;
font-weight: normal;
margin-right: 12px;
padding:0px 10px;
height: 30px;
line-height: 30px;
color: #666!important;
display: flex;
align-items: center;
&:hover{
background-color: #F3F4F6;
.ant-dropdown-menu-item{
border-radius: 8px;
text-align: left!important;
a{
width: 350px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
span{
margin-top: 1px;
}
}
.submoduleStyle{
cursor: default;
i{
cursor: default;
}
&:hover{
color: #05101a;
}
}
.pinfos{
i,a{color: #666;}
&:hover i,&:hover a{
color: #466AFF;
}
}
.graph{
flex:1;
margin:0px 12px;
.ant-typography{
white-space: pre-wrap;
margin-bottom: 0px;
}
}
.ant-anchor-wrapper{
padding-left: 2px;
.ant-anchor-ink::before{
background-color: #fff;
.ant-dropdown-menu-item.active{
background-color: #e6f7ff;
}
}

View File

@ -5,7 +5,7 @@ import { AlignCenter } from '../Component/layout';
import { Link } from 'react-router-dom';
import '../css/index.scss';
import Nodata from '../Nodata';
import './list.scss';
import './list.css';
import img_parise from '../Images/parise.png';
class IndexItem extends Component {
@ -18,7 +18,7 @@ class IndexItem extends Component {
render() {
const { projects } = this.props;
return (
<div className="project-list minH-670" style={{padding:"0px 20px"}}>
<div className="project-list minH-670">
{ projects && projects.length > 0 ? projects.map((item, key) => {
return (
<div className="p-r-Item" key={key}>
@ -35,10 +35,9 @@ class IndexItem extends Component {
<div className="p-r-Infos">
<div className="p-r-name">
<AlignCenter>
<Link to={`/projects/${item.author.login}/${item.identifier}`} title={`${item.author.name}/${item.name}`} className="color-grey-3 font-18 task-hide " style={{maxWidth: 470 }}>
<Link to={`/projects/${item.author.login}/${item.identifier}`} className="color-grey-3 font-18 task-hide " style={{maxWidth: 490 }}>
{item.author.name}/{item.name}
</Link>
{ !item.is_public && <span className="privateTag">私有</span> }
{
item.forked_from_project_id ?
<span className="ml5">
@ -47,37 +46,27 @@ class IndexItem extends Component {
: ""
}
{
item.type && item.type === 2 ?
item.type && item.type !== 0 ?
item.type === 2 ?
<Tooltip title="该项目是一个镜像" className="ml5">
<i className="iconfont icon-banbenku font-18 color-green" />
</Tooltip>:""
}
{
item.type && item.type === 1 ?
</Tooltip>:
<span className="ml5">
<i className="iconfont icon-jingxiang font-18 color-green" />
</span>:""
}
</AlignCenter>
<span className="p-r-tags">
{
item.praises_count && item.praises_count>0 ?
<span className="pariseTag">
<img src={img_parise} alt="" className="pariseImg" /> {item.praises_count}
</span>:""
}
{
item.forked_count && item.forked_count>0 ?
<span>
<i className="iconfont icon-fork mr3 font-16" style={{ color: "#1B8FFF" }} />fork {item.forked_count}
</span>:""
}
<span className="pariseTag"><img src={img_parise} alt="" className="pariseImg" /> {item.praises_count}</span>
<span><i className="iconfont icon-fork mr3 font-16" style={{ color: "#1B8FFF" }} />fork {item.forked_count}</span>
</span>
</div>
<p className="break_word task-hide-2 mt10" style={{ maxHeight: "44px",lineHeight:"22px" }}>{item.description}</p>
<div className="p-r-about">
<span className="p-r-detail">
{/* <span><label>浏览量:</label>{item.visits}</span> */}
{/* {item.category && item.category.id && <span>{item.category.name}</span>} */}
{item.last_update_time ? <span><label>更新于</label>{item.time_ago}</span> : ""}
{item.language && item.language.id ? <span className="color-grey-3">{item.language.name}</span> : ""}
</span>

View File

@ -1,5 +1,5 @@
import React, { Component } from 'react';
import "../Branch/branch.scss"
import "../Branch/branch.css"

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
{"version":3,"sourceRoot":"","sources":["list.scss"],"names":[],"mappings":";AACA;EAAQ;;;AACR;AACE;AAAA;EAEA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;;;AAIF;AACA;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EAAsC;;;AACtC;EAAwC;;;AACxC;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;AACA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;AACA;EACE;EACA;;;AAEF;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;;;AAIN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACE;;;AAEF;EACE;;;AAEF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EAAkB;EAAmB;;;AACrC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;AACA;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;AACE;EACA;;;AAEF;EACE;;;AAKF;EACE;IACE;;;EAEF;IACE;IACA;;;AAIJ;EACE;IACE;;;EAEF;IACE;IACA;;;EAEF;IACE;;;EAEF;IACE;IACA;;;EAEF;IACE;;;EAEF;IACE;;;AAGJ;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;AAAoB;EACpB;EACA;EACA;EACA;EACA;;;AAEF;EACE;;AACA;EACE;EACA;EACA;EACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAGA;EACE;;;AAGJ;EACE;EACA;EACA;;;AAGF;EACE;IACE;IACA;;;EAEF;IACE;;;EAEF;IACE;;;EAEF;IACE;;;AAGJ;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACA;;;AAEA;EAAc;;;AAEd;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EAAa;;;AACb;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EAAY;;;AAEZ;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAIF;AACA;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;AACA;EACE;;AAEF;EACE","file":"list.css"}

View File

@ -1,783 +0,0 @@
.lineH2{line-height:2}
.t_project_banner {
/* height: 260px;
background: url(../Images/banner_list.jpg) no-repeat center; */
background-color: #050d34;
}
.ProjectListIndex{
width: 1200px;
margin:20px auto;
display: flex;
align-items: flex-start;
flex-wrap:wrap;
}
.list-left{
width: 26%;
padding-right: 20px;
box-sizing: border-box;
margin-bottom: 20px;
}
.list-left > div{
border:1px solid #eee;
}
.list-left > div.bgcF{
border:none;
}
.list-right{
width:74%;
background: #fff;
padding:10px;
border:1px solid #eee;
}
/* 首页列表的新建和排序的下拉列表 */
.ant-menu-inline, .ant-menu-vertical, .ant-menu-vertical-left{
border-right: none!important;
}
.ant-menu-vertical > .ant-menu-item{
margin:0px!important;
height: 35px;
line-height: 35px;
border-bottom: 1px solid #eee;
font-size: 14px!important;
}
.ant-menu-vertical > .ant-menu-item:last-child{
border-bottom: none;
}
.list-r-operation{
display: flex;
justify-content: space-between;
flex-wrap: wrap;
align-items: center;
padding:25px 30px;
border-bottom: 1px solid #E0E0E0;
}
.list-r-Search{
width: 400px;
}
.padding0-25{
padding:0px 25px;
}
.list-r-Search .ant-btn-lg{
height: 38px;
}
.list-r-Search .ant-input-group-addon{border: none !important;}
.list-r-Search .ant-input-search-button{height: 40px !important;}
.createBtn{
border-radius: 4px;
margin-left: 20px;
display: inline-block;
padding:3px 15px;
background-color: #4CACFF;
color: #fff!important;
}
/* 列表 */
.project-list{
padding:0px 30px;
}
.border-top-grey{
border-top: 1px solid rgba(238,238,238,1);
}
.p-r-Item:last-child{
border-bottom: none !important;
}
.p-r-Item{
display: flex;
border-bottom:1px solid rgba(238,238,238,1);
padding:22px 0px;
justify-content: flex-start;
}
.boxShandow{
box-shadow:0px 2px 20px 10px rgba(0,0,0,0.03);
}
.p-r-photo{
width: 60px;
height: 60px;
border-radius: 50%;
margin-right: 22px;
margin-top: 8px;
}
.p-r-Infos{
flex: 1;
width: 0;
}
.p-r-name{
display: flex;
justify-content: space-between;
align-items: center;
}
.p-r-name > p{
flex: 1;
width: 0;
}
.p-r-btn{
display: flex;
align-items: center;
}
.p-r-btn > span{
height: 35px;
line-height: 35px;
border:1px solid #f4f4f4;
border-radius: 5px;
display: block;
margin-left: 20px;
background-color: #fff;
display: flex;
}
.p-r-btn > span > a{
display: flex;
align-items: center;
padding:0px 12px;
background:#ececec;
}
.p-r-btn > span > a:active{
background: #f4f4f4;
}
.p-r-btn > span > span{
padding:0px 8px;
}
.p-r-tags{
display: flex;
opacity: 1;
}
.p-r-tags.large > span{
height: 30px;
line-height: 30px;
font-size: 14px;
}
.p-r-tags > span{
margin-left: 15px;
padding:0px 10px;
border-radius:15px;
background: #EBF4FE;
color: #333;
height: 24px;
line-height: 24px;
display: block;
font-size: 12px;
display: flex;
}
.p-r-tags > span.pariseTag{
background: #FFF3DC;
}
.p-r-tags.large > span >label{
padding:0px 12px;
}
.p-r-tags > span >label{
padding:0px 8px;
}
.p-r-tags.large > span >span{
padding:0px 6px;
}
.pariseImg{
width: 14px;
height: 12px;
margin-top: 6px;
margin-right: 3px;
}
.p-r-tags > span >span{
display: block;
background: #fff;
border-left: #efefef;
padding:0px 4px;
border-radius: 0px 4px 4px 0px;
color: #999;
}
.p-r-content{
margin-top:10px;
color: #666;
display: flex;
}
.p-r-detail > span{
margin-right: 22px;
color: #888;
}
.p-r-detail > span > label{
color: #999;
}
.p-r-about{
display: flex;
justify-content: space-between;
flex-wrap: nowrap;
margin-top: 8px;
color: #666;
}
.spincontent{
height:400px;
}
.spinstyle .ant-spin-text{
margin-top:30px;
color: #888;
}
/* -----------详情------------ */
.detailHeader-wrapper{
background-color:#FBFCFF;
border-bottom:1px solid #e2e2e2;
}
.headerMenu-wrapper{
display: flex;
flex-direction: row;
cursor: pointer;
li{
position: relative;
text-align: center;
padding:0px;
& > a{
font-size: 14px;
height: 40px;
line-height: 28px;
padding:0px 20px;
display: block;
color: #666;
&> img{
margin-right: 8px;
}
&> span.num{
line-height: 24px;
margin-left: 5px;
margin-top: 2px;
font-size: 12px;
float: right;
color: #666!important;
background-color: rgba(153, 153, 153, 0.13);;
border-radius: 50%;
width: 24px;
height: 24px;
}
}
&.active a,&.active a i{
color: #466AFF!important;
}
&.active::after,&:hover::after{
position: absolute;
bottom:0px;
height:2px;
background-color:rgba(153, 153, 153, 0.2);
content:'';
left: 0px;
width:100%;
}
&.active::after{
background-color: #466AFF;
}
}
}
.detail_tag_btn{
height:34px;
line-height: 32px;
border-radius:5px;
border:1px solid #D0D0D0;
display: flex;
align-items: center;
margin-left: 10px;
padding:0px;
background-color:#FAFBFC;
box-shadow: none;
&:hover{
background-color: #F3F4F6;
}
.detail_tag_btn_name{
padding:0px 18px;
min-width: 82px;
text-align: center;
&:hover>span{
color: #333!important;
}
img{
margin-right: 10px;
}
}
.detail_tag_btn_count{
width: 42px;
text-align: center;
background: #fff;
border-radius: 0px 4px 4px 0px;
height:100%;
border-left: 1px solid #D0D0D0;
}
}
.ant-tooltip {
max-width: fit-content!important;
}
.files-md{
padding:20px;
}
/* 详情-代码 */
.branch-wrapper{
border:1px solid #eee;
border-radius: 4px;
display: flex;
align-items: center;
height: 60px;
padding:0px 30px;
width: 1200px;
margin:0px auto;
background-color: #fff;
margin-top: 20px;
justify-content: space-between;
}
.branch-wrapper > a >i{
color: #5091FF;
margin-right: 5px;
cursor: default;
}
.branch-wrapper a{
display: flex;
align-items: center;
justify-content: center;
text-align: center;
height: 30px;
line-height: 30px;
cursor: pointer;
font-size: 16px;
color: #333333;
}
.branch-wrapper a > span{
position: relative;
min-height: 20px;
display: block;
}
.branch-wrapper a.active > span::after{
position: absolute;
content: '';
bottom: -5px;
width: 30px;
height: 3px;
left: 0px;
background-color:#5091FF;
}
.gitAddressClone{
margin:0px 20px 14px 20px!important;
display: flex;
height: 40px;
align-items: center;
border-radius: 4px;
border:1px solid #eee;
background: #fff;
margin-left: 20px;
position: relative;
}
.gitAddressClone > span{
display: flex;
line-height: 40px;
height: 40px;
padding:0px 12px;
cursor: pointer;
align-items: center;
}
.addressTips{
position: absolute;
font-size: 12px;
color: #FF6E21;
top:-34px;
left: 30px;
background-color: #fff;
border:1px solid #FE881D;
padding:0px 5px;
height: 28px;
line-height: 28px;
}
.addressTips>span{position: relative;display: block;}
.addressTips>span::before{
box-sizing: content-box;
width: 0px;
height: 0px;
position: absolute;
top: 25px;
left:50%;
margin-left: -4px;
padding:0;
border-top:8px solid #FFFFFF;
border-bottom:8px solid transparent;
border-left:8px solid transparent;
border-right:8px solid transparent;
display: block;
content:'';
z-index: 12;
}
.addressTips>span::after{
box-sizing: content-box;
width: 0px;
height: 0px;
position: absolute;
top: 26px;
left:50%;
margin-left: -4px;
padding:0;
border-top:8px solid #FE881D;
border-bottom:8px solid transparent;
border-left:8px solid transparent;
border-right:8px solid transparent;
display: block;
content:'';
z-index: 11;
}
.gitAddressClone > span.addressType{
color: #4CACFF;
}
.gitAddressClone > span:last-child{
border-right: none;
}
.gitAddressClone > input{
border:none;
outline: none;
padding:0px 8px;
height: 40px;
line-height: 40px;
border-radius: 0px;
border: 1px solid #eee;
flex:1;
}
.wrap-commit-table .ant-table-small > .ant-table-content > .ant-table-body{
margin:0px;
}
.wrap-commit-table .ant-table-title{
background-color: rgba(241,248,255,1);
padding: 13px 16px!important;
}
.commitKey{
cursor: pointer;
border:1px solid #FD7700;
background-color:#FFF3DC;
color: #FD7700!important;
padding:0px 12px;
height: 20px;
line-height: 20px;
margin-left:15px;
border-radius: 18px;
max-width: 100%;
}
/* 分支 */
.branchTitle{
padding:8px 10px;
color: #333;
font-size: 16px;
border-bottom: 1px solid #d9d9d9;
}
.branchUl li{
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
padding:20px 0px;
border-bottom: 1px solid #eee;
}
.branchUl li:last-child{
border-bottom: none;
}
.operationBtn{
border:1px solid #f4f4f4;
border-radius: 3px;
padding:0px 6px;
background-color:#fff;
color:#666!important;
display: inline-block;
}
.messages{
max-width: 700px;
}
.leftPoint{
margin-left: 20px;
position: relative;
}
.leftPoint::before{
position: absolute;
left: -10px;
top:8px;
border-radius: 50%;
width: 4px;
height: 4px;
background-color: #dadada;
content: '';
}
/* 文件目录、文件内容 */
.subFileName{
position: relative;
margin-left: 15px;
height: 22px;
}
.subFileName::before{
position: absolute;
content: '/';
left: -10px;
top: 0px;
color: #999;
height: 22px;
line-height: 22px;
}
.addFile{
display: flex;
}
.addFile a{
display: block;
background-color: rgba(76, 172, 255,0.8);
color: #fff;
cursor: pointer;
height: 32px;
line-height: 32px;
padding: 0px 10px;
}
.addFile a:first-child{
border-radius: 4px;
}
.addFile a:last-child{
/* border-radius: 0px 4px 4px 0px; */
border-left: 1px solid rgba(247, 247, 247, 0.3);
}
.addFile a:active{
background-color: rgba(76, 172, 255,1);
}
@media screen and (max-width: 750px){
.list-r-Search{
flex: 1;
}
.list-left,.list-right{
width: 100%;
padding: 0px;
}
}
@media screen and (max-width: 400px){
.list-r-Search{
width: 100%;
}
.headerMenu-wrapper{
flex-direction: column;
width: 100%;
}
.headerMenu-wrapper li{
width: 100%;
}
.gitAddressClone{
width:100%;
margin-left: 0px;
}
.gitAddressClone > span{
padding:0px;
}
.messages{
max-width: 100%;
}
}
.commonBox{
border:1px solid #ddd;
margin-top: 30px;
border-radius: 4px;
}
.commonBox .commonBox-title{
padding:0px 20px;
box-sizing: border-box;
font-size: 16px;
background: #FAFBFC;/* F1F8FF */
font-weight: bold;
height: 45px;
line-height: 45px;
border-bottom: 1px solid #d9d9d9;
border-radius: 4px 4px 0px 0px;
}
.readBox{
border:none;
&.commonBox .commonBox-info{
border:1px solid #D0D0D0;
border-top: none;
border-radius: 0px 0px 4px 4px;
padding:20px 38px;
}
}
.commonBox .commonBox-title.boxTitle{
display: flex;
justify-content: space-between;
height: 55px;
line-height: 55px;
background: #FAFCFF;
border-radius: 4px 4px 0px 0px;
border: 1px solid rgba(42, 97, 255, 0.23);
}
.synchronism{
display: block;
height: 34px;
line-height: 34px;
padding:0px 15px;
color: #fff!important;
background-color: #28BD6C;
border-radius: 4px;
}
.files_info{
cursor: pointer;
}
.commonBox {
.commonBox-info{
padding:20px 15px;
}
}
.commonBox-title-read{
vertical-align: middle;
color: #000;
font-size: 14px;
}
@media screen and (max-width: 370px){
.p-r-tags,.p-r-btn{
opacity: 0;
display: none;
}
.p-r-about{
flex-wrap: wrap;
}
.commitKey{
margin-right: 0px;
}
.list-r-Search{
width: 100%;
}
}
.null_data_box{
width: 100%;
border: 1px solid #d4d4d5;
border-radius:3px ;
}
.title{
font-weight: bold;
background: #f4f4f4;
padding: 10px 15px;
box-sizing: border-box;
border-bottom: 1px solid #d4d4d5;
}
.item_title{
font-size:18px;
font-weight: bold;
margin-bottom: 15px;
}
.item{
padding: 15px;
border-bottom: 1px solid #dededf;
}
.item:last-child{
border-bottom:none;
}
.item_title small{
font-weight: 400;
margin-left: 10px;
}
.item_title small a{
color: #4183c6;
}
.Markdown{
background: #f7f7f7;
padding: 10px 20px;
}
.item .gitAddressClone input:focus{
border: 1px solid #2185d0;
}
.content-file{margin-top: 8px;}
.content-file .CodeMirror{
background-color: #f7f7f7;
border: 1px solid #e4e4e4;
border-radius: 4px;
height: auto;
}
.content-file.edit .CodeMirror{
background-color: #fff;
}
.content-file .CodeMirror .CodeMirror-scroll{
min-height: 450px;
}
.text-center{text-align: center;}
.fork-css{
position: absolute;
left: 0;
top: 50px;
width: 100%;
}
.color-grey-ccc{
color: #ccc !important;
}
a.color-grey-ccc:hover{
color: #4cacff !important;
}
.pull-right{float: right;}
.commitList{
padding:0px 30px;
min-height: 400px;
}
.commitList > div{
border-bottom: 1px solid #EEEEEE;
padding:16px 0px;
}
.commitList > div:last-child{
border-bottom: none;
}
/* 标签列表 */
.div_table{
border:1px solid #eee;
border-radius: 2px;
}
.ul_thead{
padding:0px 30px;
box-sizing: border-box;
background: #FAFAFA;
border-bottom: 1px solid #eee;
height: 50px;
line-height: 50px;
}
.ul_tbody{
padding:0px 30px;
}
.ul_thead li, .ul_tbody li{
display: flex;
align-items: center;
text-align: left
}
.ul_tbody li{
padding:18px 0px;
border-bottom: 1px solid #eee;
}
.ul_tbody li:last-child{
border-bottom: none;
}
.ul_thead li > span , .ul_tbody li > span{
width: 20%;
padding-right: 20px;
}
.ul_thead li > span:nth-child(2), .ul_tbody li > span:nth-child(2){
flex:1;
}
.ul_tbody_third{
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: left;
}
.ul_tbody_forth{
text-align: center;
display: flex;
justify-content: center;
}
.depotNum{
color: #666!important;
span:last-child{
color: #333;
}
&:hover span:last-child{
color: #2A61FF;
}
}

View File

@ -42,7 +42,7 @@ function Contribute(props){
<WhiteBack>
<Spin spinning={isSpin}>
<div className="boxPanel">
<p className="font-18 padding10-20" style={{borderBottom:"1px solid #eee"}}>贡献者列表</p>
<p className="font-18 mb20">贡献者列表</p>
{
list && list.length > 0 ?
<div className="contrbuteList">

View File

@ -1,36 +1,28 @@
import React, { useEffect, useState } from 'react';
import { Skeleton , Tooltip} from 'antd';
import { Skeleton } from 'antd';
import { Link } from 'react-router-dom';
import { numFormat } from 'educoder';
function DetailBanner({ history,list , owner , projectsId , isManager , url , pathname , state , urlFlag , projectDetail , platform ,open_devops }){
function DetailBanner({ list , owner , projectsId , isManager , url , pathname , state , urlFlag , projectDetail , platform ,open_devops }){
const [ menuName , setMenuName ] = useState(undefined);
useEffect(()=>{
if(list){
// banner
if(pathname && pathname==="source"){
let a = list.filter(item=>item.menu_name === "resources");
if(a && a.length === 0){
history.push(`/projects/${owner}/${projectsId}`);
}
}
setMenuName(list);
}
},[list]);
return(
<div className="f-wrap-between mt25">
<div className="f-wrap-between mt15">
{
menuName && projectDetail ?
<ul className="headerMenu-wrapper">
{
Array.isArray(menuName)&& menuName.map((item,key)=>{
menuName.map((item,key)=>{
return(
<React.Fragment key={item.menu_name}>
<React.Fragment>
{
item.menu_name === "home" &&
<li className={pathname==="about" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/about`, state }}>
<i className={(pathname==="" || urlFlag) ? "iconfont icon-zhuyeicon color-grey-3 mr5 font-14":"iconfont icon-zhuyeicon color-grey-6 font-14 mr5"}></i>
<i className={(pathname==="" || urlFlag) ? "iconfont icon-zhuye1 color-grey-3 mr5 font-14":"iconfont icon-zhuye1 color-grey-6 font-14 mr5"}></i>
<span>主页</span>
</Link>
</li>
@ -39,7 +31,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
item.menu_name === "code" &&
<li className={(pathname==="" || urlFlag) ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}`, state }}>
<i className={(pathname==="" || urlFlag) ? "iconfont icon-daimakuicon color-grey-3 mr5 font-14":"iconfont icon-daimakuicon color-grey-6 font-14 mr5"}></i>
<i className={(pathname==="" || urlFlag) ? "iconfont icon-daimaku color-grey-3 mr5 font-14":"iconfont icon-daimaku color-grey-6 font-14 mr5"}></i>
<span>代码库</span>
</Link>
</li>
@ -47,61 +39,50 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
{
item.menu_name === "issues" &&
<li className={pathname==="issues" ? "active" : ""}>
<Tooltip title="易修是Issue的中文名即问题列表" placement="bottom">
<Link to={{ pathname: `/projects/${owner}/${projectsId}/issues`, state }}>
<i className={pathname==="issues" ? "iconfont icon-yixiuicon color-grey-3 mr5 font-14":"iconfont icon-yixiuicon color-grey-6 font-14 mr5"}></i>
<span>易修</span>
{projectDetail && projectDetail.issues_count ? <span className="num">{numFormat(projectDetail.issues_count)}</span> : ""}
</Link>
</Tooltip>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/issues`, state }}>
<i className={pathname==="issues" ? "iconfont icon-renwu color-grey-3 mr5 font-14":"iconfont icon-renwu color-grey-6 font-14 mr5"}></i>
<span>易修 (Issue)</span>
{projectDetail && projectDetail.issues_count ? <span className="num">{projectDetail.issues_count}</span> : ""}
</Link>
</li>
}
{
item.menu_name === "pulls" && projectDetail && parseInt(projectDetail.type) !== 2 && platform ?
<li className={pathname==="pulls" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/pulls`, state }}>
<i className={pathname==="pulls" ? "iconfont icon-hebingqingqiuicon color-grey-3 mr5 font-14":"iconfont icon-hebingqingqiuicon color-grey-6 font-14 mr5"}></i>
<i className={pathname==="pulls" ? "iconfont icon-hebingqingqiu1 color-grey-3 mr5 font-14":"iconfont icon-hebingqingqiu1 color-grey-6 font-14 mr5"}></i>
<span>合并请求</span>
{projectDetail && projectDetail.pull_requests_count ? <span className="num">{numFormat(projectDetail.pull_requests_count)}</span> : ""}
{projectDetail && projectDetail.pull_requests_count ? <span className="num">{projectDetail.pull_requests_count}</span> : ""}
</Link>
</li>:""
}
{
item.menu_name === "wiki" &&
<li className={pathname === "wiki" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/wiki`, state }}>
<i className={pathname==="wiki" ? "iconfont icon-wiki_icon color-grey-3 mr5 font-14":"iconfont icon-wiki_icon color-grey-6 font-14 mr5"}></i>
<span>Wiki</span>
</Link>
</li>
}
{
item.menu_name === "devops" && platform ?
<li className={pathname==="devops" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/devops${open_devops ? `/dispose`:""}`, state }}>
<i className="iconfont icon-gongzuoliuicon font-13 mr8"></i>工作流(beta版)
{projectDetail && projectDetail.ops_count ? <span>{numFormat(projectDetail.ops_count)}</span> : ""}
<i className="iconfont icon-gongzuoliu font-13 mr8"></i>工作流(beta版)
{projectDetail && projectDetail.ops_count ? <span>{projectDetail.ops_count}</span> : ""}
</Link>
</li>
:""
}
{/* {
item.menu_name === "resources" &&
{
item.menu_name === "source" &&
<li className={pathname==="source" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/source`, state }}>
<i className={pathname==="source" ? "iconfont icon-ziyuanpaihanghetuijian color-grey-3 mr5 font-14":"iconfont icon-ziyuanpaihanghetuijian color-grey-6 font-14 mr5"}></i>
<span>资源库</span>
{projectDetail && projectDetail.source_count ? <span className="num">{numFormat(projectDetail.source_count)}</span> :""}
{projectDetail && projectDetail.source_count ? <span className="num">{projectDetail.source_count}</span> :""}
</Link>
</li>
} */}
}
{
item.menu_name === "versions" &&
<li className={pathname==="milestones" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/milestones`, state }}>
<i className={pathname==="milestones" ? "iconfont icon-lichengbeiicon color-grey-3 mr5 font-14":"iconfont icon-lichengbeiicon color-grey-6 font-14 mr5"}></i>
<i className={pathname==="milestones" ? "iconfont icon-lichengbei color-grey-3 mr5 font-14":"iconfont icon-lichengbei color-grey-6 font-14 mr5"}></i>
<span>里程碑</span>
{projectDetail && projectDetail.versions_count ? <span className="num">{numFormat(projectDetail.versions_count)}</span> :""}
{projectDetail && projectDetail.versions_count ? <span className="num">{projectDetail.versions_count}</span> :""}
</Link>
</li>
}
@ -109,24 +90,24 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
item.menu_name === "activity" &&
<li className={pathname==="activity" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/activity`, state }}>
<i className={pathname==="activity" ? "iconfont icon-dongtaiicon color-grey-3 mr5 font-14":"iconfont icon-dongtaiicon color-grey-6 font-14 mr5"}></i>
<i className={pathname==="activity" ? "iconfont icon-tongzhi color-grey-3 mr5 font-14":"iconfont icon-tongzhi color-grey-6 font-14 mr5"}></i>
<span>动态</span>
</Link>
</li>
}
{
item.menu_name === "setting" &&
<li className={pathname === "setting" ? "active" : ""}>
<Link to={`/projects/${owner}/${projectsId}/setting`}>
<i className={url && url.indexOf("/setting") > 0 ? "iconfont icon-cangkushezhiicon color-grey-3 mr5 font-14":"iconfont icon-cangkushezhiicon color-grey-6 font-14 mr5"}></i>
<span>仓库设置</span>
</Link>
</li>
}
</React.Fragment>
)
})
}
{
isManager && platform ?
<li className={pathname === "setting" ? "active" : ""}>
<Link to={`/projects/${owner}/${projectsId}/setting`}>
<i className={url && url.indexOf("/setting") > 0 ? "iconfont icon-cangku color-grey-3 mr5 font-14":"iconfont icon-cangku color-grey-6 font-14 mr5"}></i>
<span>仓库设置</span>
</Link>
</li>:""
}
</ul>
:
<Skeleton paragraph={false} active={true}/>

View File

@ -1,28 +0,0 @@
import React from 'react';
import { Tooltip , message } from 'antd';
import './sub.scss';
function Invite({code,className}) {
function jsCopy(id) {
const copyEle = document.querySelector(id); //
const range = document.createRange(); // range
window.getSelection().removeAllRanges(); //selection
range.selectNode(copyEle); //
window.getSelection().addRange(range); //
document.execCommand("Copy"); // copy
message.success('复制成功');
}
return(
<div className={className}>
<span className="font-16 color-ooo">邀请码</span>
<div>
<span id="devitecode">{code}</span>
<Tooltip title={<p className="edu-txt-center">可以通过邀请码邀请成员加入项目<br/>点击复制邀请码</p>} placement={"bottom"}>
<i className="iconfont icon-fuzhi2 font-16 color-blue ml8" onClick={()=>jsCopy("#devitecode")}></i>
</Tooltip>
</div>
</div>
)
}
export default Invite;

View File

@ -1,57 +0,0 @@
import React , { useState , useEffect } from 'react';
import { Anchor , Input } from 'antd';
import './sub.scss';
import { Base64 } from 'js-base64';
const { Link } = Anchor;
function ReadmeCatelogue({ menuList , hash }) {
const [ goHref , setGoHref ] = useState("");
const [ value , setValue ] = useState("");
const [ menu , setMenu] = useState(menuList);
function onChange(link){
setGoHref(link);
};
function changeValue(e) {
setValue(e.target.value);
if(e.target.value){
let m = menuList.filter(i=>i.text.indexOf(e.target.value)>-1);
setMenu(m);
}else{
setMenu(menuList);
}
}
return(
<div>
<div className="searchBox">
<Input
placeholder={"请输入关键字"}
value={value}
onChange={changeValue}
prefix={<i className="iconfont icon-sousuo_icon1 font-14"></i>}/>
</div>
{
menu && menu.length>0?
<div className="anchorBox">
<Anchor affix={false} onChange={onChange}>
{
menu.map((item,key)=>{
return(
<div style={{paddingLeft:`${item.level *10}px`}} className={goHref===item.href?"items active":"items"}>
<Link href={`#${item.text}`} title={item.text} />
</div>
)
})
}
</Anchor>
</div>
:""
}
</div>
)
}
export default ReadmeCatelogue;

View File

@ -2,13 +2,13 @@ import React , { forwardRef, useEffect } from 'react';
import {Form , Modal , Input } from 'antd';
import "./sub.scss";
const { TextArea } = Input;
function UpdateDescModal({form , visible , onCancel , onOk,desc,website,lesson_url}){
function UpdateDescModal({form , visible , onCancel , onOk,desc,website}){
const { getFieldDecorator, validateFields , setFieldsValue } = form;
useEffect(()=>{
if(desc || website){
setFieldsValue({
website,desc,lesson_url
website,desc
})
}
},[desc,website])
@ -17,7 +17,7 @@ function UpdateDescModal({form , visible , onCancel , onOk,desc,website,lesson_u
validateFields((err,values)=>{
if(!err){
onCancel();
onOk(values.desc,values.website,values.lesson_url)
onOk(values.desc,values.website)
}
})
}
@ -49,13 +49,6 @@ function UpdateDescModal({form , visible , onCancel , onOk,desc,website,lesson_u
<Input placeholder="website链接"/>
)}
</Form.Item>
<Form.Item label="实践课程">
{getFieldDecorator("lesson_url",{
rules:[]
})(
<Input placeholder="实践课程链接" />
)}
</Form.Item>
</Form>
</Modal>
)

View File

@ -1,68 +0,0 @@
.boxPanel {
width: 1200px;
margin: 20px auto;
border-radius: 4px;
border: 1px solid #eee;
min-height: 500px;
}
.boxPanel .contrbuteList {
display: flex;
flex-wrap: wrap;
padding: 20px;
align-items: flex-start;
}
.boxPanel .contrbuteList > div {
width: 20%;
}
.descmodal .ant-row.ant-form-item {
margin-bottom: 10px;
}
.descmodal .ant-col.ant-form-item-label {
height: 20px;
line-height: 20px;
}
.menuslist {
z-index: 100;
width: 297px;
background: #FFFFFF;
box-shadow: 0px 4px 8px 2px rgba(212, 212, 212, 0.5);
border-radius: 4px;
}
.menuslist .searchBox {
padding: 15px;
border-bottom: 1px solid #eee;
}
.menuslist .ant-anchor-wrapper {
margin-left: 0px;
padding: 5px 15px;
max-height: 255px !important;
}
.menuslist .ant-anchor-wrapper .items {
border-radius: 4px;
margin-bottom: 5px;
cursor: pointer;
}
.menuslist .ant-anchor-wrapper .items .ant-anchor-link-title {
color: #333333 !important;
}
.menuslist .ant-anchor-wrapper .items:hover {
background-color: #F3F4F6;
}
.menuslist .ant-anchor-wrapper .items.active {
background-color: #2A61FF;
}
.menuslist .ant-anchor-wrapper .items.active .ant-anchor-link-title {
color: #fff !important;
}
.menuslist .ant-anchor-wrapper .ant-anchor-link {
padding: 0px;
height: 30px;
line-height: 30px;
}
.menuslist .ant-anchor-wrapper .ant-anchor-ink::before {
background-color: #fff;
}
/*# sourceMappingURL=sub.css.map */

View File

@ -1 +0,0 @@
{"version":3,"sourceRoot":"","sources":["sub.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EAIA;;AAHA;EACE;;;AAMJ;EACE;;AAEF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAEF;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;;AACA;EACE;;AAIN;EACE;EACA;EACA;;AAEF;EACE","file":"sub.css"}

View File

@ -1,13 +1,11 @@
.boxPanel{
width: 1200px;
margin:20px auto;
border-radius: 4px;
border:1px solid #eee;
margin:0px auto;
padding:20px 0px;
min-height: 500px;
.contrbuteList{
display: flex;
flex-wrap: wrap;
padding:20px;
& > div{
width: 20%;
}
@ -22,46 +20,4 @@
height: 20px;
line-height: 20px;
}
}
.menuslist{
z-index: 100;
width: 297px;
background: #FFFFFF;
box-shadow: 0px 4px 8px 2px rgba(212, 212, 212, 0.5);
border-radius: 4px;
.searchBox{
padding:15px;
border-bottom: 1px solid #eee;
}
.ant-anchor-wrapper{
margin-left: 0px;
padding:5px 15px;
max-height: 255px!important;
.items{
border-radius: 4px;
margin-bottom: 5px;
cursor: pointer;
.ant-anchor-link-title{
color: #333333!important;
}
&:hover{
background-color: #F3F4F6;
}
&.active{
background-color: #2A61FF;
.ant-anchor-link-title{
color: #fff!important;
}
}
}
.ant-anchor-link{
padding:0px;
height: 30px;
line-height: 30px;
}
.ant-anchor-ink::before{
background-color: #fff;
}
}
}

View File

@ -1,21 +0,0 @@
.i_open{
color: #28BD6C!important;
}
.i_merged{
color: #4C9ED3!important;
}
.i_closed{
color: #FA6400!important;
}
.pr_tags_open{
border:1px solid #28BD6C;
color: #28BD6C;
}
.pr_tags_merged{
border:1px solid #4C9ED3;
color: #4C9ED3;
}
.pr_tags_closed{
border:1px solid #FA6400;
color: #FA6400;
}

View File

@ -5,12 +5,6 @@ import { AlignCenter } from '../Component/layout';
import { getImageUrl } from "educoder";
import "./merge.css";
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
class MergeItem extends Component {
constructor(props) {
super(props);
@ -49,18 +43,16 @@ class MergeItem extends Component {
};
render() {
const { issues, project_name, project_author_name , user_admin_or_member} = this.props;
const { issues, project_name, project_author_name } = this.props;
const { projectsId , owner } = this.props.match.params;
const { current_user } = this.props;
const renderList = () => {
if (issues && issues.length > 0) {
return issues.map((item, key) => {
let status = item.pull_request_staus;
return (
<div className="issueItem">
<div className="flex-1">
<p className="mb15 df" style={{ alignItems: "center" }}>
<i className={`iconfont icon-hebingqingqiu1 font-14 mr3 i_${status}`}></i>
<Link
to={`/projects/${owner}/${projectsId}/pulls/${item.pull_request_id}/Messagecount`}
className="hide-1 font-15 color-grey-3 fwb lineh-30 mr10"
@ -68,10 +60,10 @@ class MergeItem extends Component {
>
{item.name}
</Link>
<Tag className={`pr_tags_${status}`}>
{status === "merged"
<Tag className={`pr_tags_${item.pull_request_staus}`}>
{item.pull_request_staus === "merged"
? "已合并"
: status === "closed"
: item.pull_request_staus === "closed"
? "已拒绝"
: "开启的"}
</Tag>
@ -105,43 +97,33 @@ class MergeItem extends Component {
</span>
<span className="color-grey-8">{item.pr_time}</span>
<span className="ml15">
{
item.pull_request_head &&
<Tag className="pr-branch-tag">
<Link
to={`/projects/${item.is_original ? item.fork_project_user : owner}/${ item.is_original ? item.fork_project_identifier : projectsId }/tree/${turnbar(item.pull_request_head)}`}
className="maxW200px hide-1 ver-middle"
>
{item.is_original
? item.fork_project_user
: project_author_name}
:{item.pull_request_head}
</Link>
</Tag>
}
{
item.pull_request_base &&
<span className="mr8 ver-middle">
<i
className={
"iconfont icon-youjiang color-grey-c font-16"
}
></i>
</span>
}
{
item.pull_request_base &&
<Tag className="pr-branch-tag">
<Link
to={`/projects/${owner}/${projectsId}/tree/${turnbar(item.pull_request_base)}`}
className="maxW200px hide-1 ver-middle"
>
{/* {item.is_fork ? item.pull_request_base : `${item.author_name}:${item.pull_request_base}`} */}
{project_author_name}:{item.pull_request_base}
</Link>
</Tag>
}
<Tag className="pr-branch-tag">
<Link
to={`/projects/${item.is_original ? item.fork_project_user : owner}/${ item.is_original ? item.fork_project_identifier : projectsId }/tree/${item.pull_request_head}`}
className="maxW200px hide-1 ver-middle"
>
{item.is_original
? item.fork_project_user
: project_author_name}
:{item.pull_request_head}
</Link>
</Tag>
<span className="mr8 ver-middle">
<i
className={
"iconfont icon-youjiang color-grey-c font-16"
}
></i>
</span>
<Tag className="pr-branch-tag">
<Link
to={`/projects/${owner}/${projectsId}/tree/${item.pull_request_base}`}
className="maxW200px hide-1 ver-middle"
>
{/* {item.is_fork ? item.pull_request_base : `${item.author_name}:${item.pull_request_base}`} */}
{project_author_name}:{item.pull_request_base}
</Link>
</Tag>
</span>
</AlignCenter>
</p>
@ -183,7 +165,7 @@ class MergeItem extends Component {
) : (
""
)}
{user_admin_or_member && item.pull_request_status === 0 ? (
{current_user && current_user.login ? (
<div
className="milepostleft"
style={{

View File

@ -24,12 +24,6 @@ import MergeFooter from "./merge_footer";
const Option = Select.Option;
const TextArea = Input.TextArea;
function turnbar(str){
if(str && str.length>0 && str.indexOf("/")>-1){
return str.replaceAll('/','%2F');
}
return str;
}
class MessageCount extends Component {
constructor(props) {
super(props);
@ -47,7 +41,6 @@ class MessageCount extends Component {
edit_spin: false,
pr_status: undefined,
pull_request:undefined,
conflict_files:[],
copyVisible:false,
};
@ -82,8 +75,7 @@ class MessageCount extends Component {
data: result.data,
SpinFlag: false,
pr_status: result.data.pull_request && result.data.pull_request.status,
pull_request:result.data.pull_request,
conflict_files:result.data.conflict_files
pull_request:result.data.pull_request
});
} else {
this.setState({ SpinFlag: false });
@ -110,8 +102,6 @@ class MessageCount extends Component {
isSpin: false,
pr_status: 2,
});
const { getDetail } = this.props;
getDetail && getDetail();
} else {
this.setState({
isSpin: false,
@ -148,8 +138,6 @@ class MessageCount extends Component {
SpinMerge: false,
pr_status: 1,
});
const { getDetail } = this.props;
getDetail && getDetail();
} else {
this.setState({ SpinMerge: false });
}
@ -253,49 +241,6 @@ class MessageCount extends Component {
)
}
// 点击按钮复制功能
jsCopy = () => {
const copyEle = document.querySelector('#descContent') // 获取要复制的节点
const range = document.createRange(); // 创造range
window.getSelection().removeAllRanges(); //清除页面中已有的selection
range.selectNode(copyEle); // 选中需要复制的节点
window.getSelection().addRange(range); // 执行选中元素
document.execCommand("Copy"); // 执行copy操作
}
mergeabledMes=()=>{
return(
<div className="clearfix">
<p className="fl">该分支存在冲突无法自动合并你可以尝试通过如下命令手动合并</p>
<i className="iconfont icon-fuzhi font-16 fr" onClick={()=>this.jsCopy()}></i>
</div>
)
}
mergeabledDesc=(base,head,conflict_files)=>{
return(
<div>
<ul id="descContent">
<li>git fetch origin</li>
<li>git checkout -b {`${base}`} origin/{`${base}`}</li>
<li>git merge {`${head}`}</li>
</ul>
{
conflict_files && conflict_files.length>0 &&
<div>
<p className="mt10 font-16 pt10" style={{borderTop:"1px solid #f9d7d5"}}>如下文件有代码冲突</p>
<p>
{
conflict_files.map((i,k)=>{
return <p>{i}</p>
})
}
</p>
</div>
}
</div>
)
}
render() {
const { projectsId, mergeId , owner } = this.props.match.params;
@ -307,8 +252,7 @@ class MessageCount extends Component {
ismesrge,
SpinFlag,
copyVisible,
pull_request,
conflict_files
pull_request
} = this.state;
const { current_user, projectDetail } = this.props;
const menu = (
@ -361,10 +305,10 @@ class MessageCount extends Component {
<div className="mt15">
<Tag className="pr-branch-tag">
<Link
to={`/projects/${data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}/${data.pull_request.is_original?data.project_identifier:projectsId}/tree/${turnbar(data.pull_request && data.pull_request.head)}`}
to={`/projects/${owner}/${data.pull_request.is_original?data.project_identifier:projectsId}/tree/${data.pull_request.head}`}
className="ver-middle"
>
{data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}: {turnbar(data.pull_request && data.pull_request.head)}
{data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}:{data.pull_request.head}
</Link>
</Tag>
<span className="mr8 ver-middle">
@ -379,6 +323,7 @@ class MessageCount extends Component {
to={`/projects/${owner}/${projectsId}/tree/${data.pull_request.base}`}
className="ver-middle"
>
{/* {data.pull_request.is_fork ? data.pull_request.base : `${data.pull_request.pull_request_user}:${data.pull_request.base}`} */}
{data.issue.project_author_name}:{data.pull_request.base}
</Link>
</Tag>
@ -443,6 +388,12 @@ class MessageCount extends Component {
</div>
<div className="ml10">
<div className="mt15 text-right" style={{display:"flex",justifyContent:"flex-end"}}>
{/* <span className="composeButton">
<Dropdown overlay={this.copyItem()} visible={copyVisible} onClick={(e)=>this.setCopyVisible(e)}>
<span>复制</span>
</Dropdown>
<span>下载为<i className="iconfont icon-sanjiaoxing-down color-blue"></i></span>
</span> */}
{operate && (
<Button
type="green"
@ -489,40 +440,35 @@ class MessageCount extends Component {
type="success"
/>
)}
{operate && (
{pr_status === 0 && projectDetail && projectDetail.permission !=="Reporter" && (
<Spin spinning={SpinFlag}>
<div
style={{
display:
this.state.mergekey === "rebase"
? this.state.buttonshow === "none" ? "block" : "none"
: !ismesrge ? "block" : "none",
? this.state.buttonshow === "none"
? "block"
: "none"
: !ismesrge
? "block"
: "none",
}}
>
<Dropdown.Button
overlay={menu}
type="primary"
onClick={this.submitmerge}
className="mb15"
icon={<Icon type="caret-down" />}
disabled={!pull_request || (pull_request && !pull_request.mergeable) }
>
{this.state.mergename}
</Dropdown.Button>
{pull_request && pull_request.mergeable
?
<Alert
message="该合并请求可以进行自动合并操作"
type="success"
showIcon
/>:
<Alert
message={this.mergeabledMes()}
type="error"
description={this.mergeabledDesc(pull_request.base,pull_request.head,conflict_files)}
showIcon
/>
}
<p className="mb15">
<Dropdown.Button
overlay={menu}
type="primary"
onClick={this.submitmerge}
icon={<Icon type="caret-down" />}
>
{this.state.mergename}
</Dropdown.Button>
</p>
<Alert
message="该合并请求可以进行自动合并操作"
type="success"
showIcon
/>
</div>
<div>
<div

View File

@ -42,10 +42,9 @@ class NewMerge extends Component {
componentDidUpdate=(preProps)=>{
const { project } = this.props;
const { pull } = this.state;
let oldProject = preProps.project;
if(project && oldProject && (oldProject.id !== project.id)){
this.compareProject(this.state.id,pull,"master");
this.compareProject(this.state.id,"master","master");
}
}
// 页面销毁取消监听
@ -79,8 +78,7 @@ class NewMerge extends Component {
this.set_default_pull(result.data.branches);
this.set_default_merge(result.data.merge_projects);
}
const { pull } = this.state;
this.compareProject(result.data.id,pull||"master","master");
this.compareProject(result.data.id,"master","master");
this.setState({isSpin: false})
})
.catch((error) => {
@ -107,18 +105,6 @@ class NewMerge extends Component {
}
axios.get(url).then(result=>{
if(result){
if (result.data.status === 0) {
this.setState({
isSpin: false,
show_message: false,
});
} else {
this.setState({
isSpin: false,
show_message: true,
default_message: result.data.message,
});
}
this.setState({
comparesData:result.data
})
@ -157,7 +143,7 @@ class NewMerge extends Component {
merge:"master"
})
}
// this.ischeckmerge();
this.ischeckmerge();
}
}
@ -183,7 +169,7 @@ class NewMerge extends Component {
selectBrach = (type, value) => {
const { projectsId , owner } = this.props.match.params;
this.state[type] = value;
// this.ischeckmerge();
this.ischeckmerge();
let { id ,merge , pull } = this.state;
if(type==="pull"){
this.props.history.push(`/projects/${owner}/${projectsId}/pulls/new/${pull}`)
@ -213,6 +199,7 @@ class NewMerge extends Component {
};
//判断2分支是否可以合并
ischeckmerge = () => {
this.setState({ isSpin: true });
const { projectsId , owner } = this.props.match.params;

Some files were not shown because too many files have changed in this diff Show More