1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-27 15:54:39 +00:00

Merge branch 'master' into 13.0

This commit is contained in:
Michael An
2025-03-03 17:15:35 +08:00
10 changed files with 95 additions and 69 deletions

View File

@@ -22,7 +22,7 @@
.dir-content-nav { .dir-content-nav {
position: absolute; position: absolute;
overflow: hidden; overflow: hidden;
width: 24%; width: 25%;
} }
.dir-content-nav:hover { .dir-content-nav:hover {
@@ -45,43 +45,45 @@
.tree-node-inner { .tree-node-inner {
position: relative; position: relative;
display: flex; display: flex;
padding-right: 1rem; padding-right: 0.5rem;
} }
.tree-node-inner i { .tree-node-inner .sf3-font-down {
position: absolute; position: absolute;
top: 20%; top: 15%;
left: 0.3rem; left: 0.3rem;
color: #999; color: #999;
} }
.tree-node-inner-hover { .tree-node-inner-hover {
background-color: #FFEFB2; background-color: #f0f0f0;
border-radius: 0.25rem; border-radius: 0.25rem;
cursor: pointer; cursor: pointer;
} }
.tree-node-hight-light { .tree-node-hight-light {
color: #fff;
border-radius: 4px; border-radius: 4px;
background-color: #feac74 !important; background-color: #f5f5f5 !important;
} }
.tree-node-hight-light i { .tree-node-hight-light::before {
color: #fff; content: '';
position: absolute;
display: block;
width: 4px;
left: -8px;
top: 2px;
bottom: 2px;
border-radius: 2px;
background-color: #ff9800;
z-index: 0;
} }
.tree-node-hight-light .attr-action-icon, .tree-view .tree-node-icon {
.tree-node-hight-light .attr-action-icon:focus,
.tree-node-hight-light .attr-action-icon:hover {
color: #fff !important;
}
.tree-node-icon {
padding-right: 1.5rem; padding-right: 1.5rem;
} }
.tree-node-text { .tree-view .tree-node-text {
width: calc(100% - 2.5rem); width: calc(100% - 2.5rem);
font-size: 14px; font-size: 14px;
white-space: nowrap; white-space: nowrap;
@@ -90,7 +92,18 @@
line-height: 24px; line-height: 24px;
} }
.tree-view { .tree-view .dropdown .right-icon {
padding: 12px 12px 12px 0; width: 20px;
flex: 1 1; height: 20px;
border-radius: 3px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
color: #666;
margin-top: 2px;
}
.tree-view .dropdown .right-icon:hover {
background-color: #dbdbdb;
} }

View File

@@ -22,7 +22,7 @@
.dir-content-nav { .dir-content-nav {
position: absolute; position: absolute;
overflow: hidden; overflow: hidden;
width: 24%; width: 25%;
} }
.dir-content-nav:hover { .dir-content-nav:hover {
@@ -45,43 +45,45 @@
.tree-node-inner { .tree-node-inner {
position: relative; position: relative;
display: flex; display: flex;
padding-right: 1rem; padding-right: 0.5rem;
} }
.tree-node-inner i { .tree-node-inner .sf3-font-down {
position: absolute; position: absolute;
top: 20%; top: 15%;
left: 0.3rem; left: 0.3rem;
color: #999; color: #999;
} }
.tree-node-inner-hover { .tree-node-inner-hover {
background-color: #FFEFB2; background-color: #f0f0f0;
border-radius: 0.25rem; border-radius: 0.25rem;
cursor: pointer; cursor: pointer;
} }
.tree-node-hight-light { .tree-node-hight-light {
color: #fff;
border-radius: 4px; border-radius: 4px;
background-color: #feac74 !important; background-color: #f5f5f5 !important;
} }
.tree-node-hight-light i { .tree-node-hight-light::before {
color: #fff; content: '';
position: absolute;
display: block;
width: 4px;
left: -8px;
top: 2px;
bottom: 2px;
border-radius: 2px;
background-color: #ff9800;
z-index: 0;
} }
.tree-node-hight-light .attr-action-icon, .tree-view .tree-node-icon {
.tree-node-hight-light .attr-action-icon:focus,
.tree-node-hight-light .attr-action-icon:hover {
color: #fff !important;
}
.tree-node-icon {
padding-right: 1.5rem; padding-right: 1.5rem;
} }
.tree-node-text { .tree-view .tree-node-text {
width: calc(100% - 2.5rem); width: calc(100% - 2.5rem);
font-size: 14px; font-size: 14px;
white-space: nowrap; white-space: nowrap;
@@ -90,7 +92,18 @@
line-height: 24px; line-height: 24px;
} }
.tree-view { .tree-view .dropdown .right-icon {
padding: 12px 12px 12px 0; width: 20px;
flex: 1 1; height: 20px;
border-radius: 3px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
color: #666;
margin-top: 2px;
}
.tree-view .dropdown .right-icon:hover {
background-color: #dbdbdb;
} }

View File

@@ -60,6 +60,10 @@ class DingtalkDepartments extends Component {
getDingtalkDepartmentsList = (departmentID) => { getDingtalkDepartmentsList = (departmentID) => {
systemAdminAPI.sysAdminListDingtalkDepartments(departmentID).then((res) => { systemAdminAPI.sysAdminListDingtalkDepartments(departmentID).then((res) => {
if (!res.data.department && res.data.errmsg) {
toaster.danger(res.data.errmsg);
return;
}
if (!departmentID) { if (!departmentID) {
let departmentsTree = this.getDepartmentsTree(res.data.department); let departmentsTree = this.getDepartmentsTree(res.data.department);
this.setState({ this.setState({
@@ -302,7 +306,7 @@ class DingtalkDepartments extends Component {
<div className="cur-view-path"> <div className="cur-view-path">
<h3 className="sf-heading">{'钉钉集成'}</h3> <h3 className="sf-heading">{'钉钉集成'}</h3>
</div> </div>
<div className="cur-view-content d-flex flex-row"> <div className="cur-view-content d-flex flex-row p-0">
<DingtalkDepartmentsTreePanel <DingtalkDepartmentsTreePanel
departmentsTree={this.state.departmentsTree} departmentsTree={this.state.departmentsTree}
isTreeLoading={this.state.isTreeLoading} isTreeLoading={this.state.isTreeLoading}

View File

@@ -115,13 +115,14 @@ class DingtalkDepartmentsTreeNode extends Component {
style={this.state.active ? {} : { opacity: 0 }} style={this.state.active ? {} : { opacity: 0 }}
> >
<DropdownToggle <DropdownToggle
tag='i' tag='span'
className='sf3-font sf3-font-more-vertical cursor-pointer attr-action-icon' className='cursor-pointer right-icon'
title={gettext('More operations')} title={gettext('More operations')}
aria-label={gettext('More operations')} aria-label={gettext('More operations')}
data-toggle="dropdown" data-toggle="dropdown"
aria-expanded={this.state.dropdownOpen} aria-expanded={this.state.dropdownOpen}
> >
<i className="sf3-font sf3-font-more"></i>
</DropdownToggle> </DropdownToggle>
<DropdownMenu className="drop-list"> <DropdownMenu className="drop-list">
<DropdownItem <DropdownItem

View File

@@ -12,19 +12,14 @@ const DingtalkDepartmentsTreePanelPropTypes = {
}; };
class DingtalkDepartmentsTreePanel extends Component { class DingtalkDepartmentsTreePanel extends Component {
constructor(props) {
super(props);
}
render() { render() {
const { departmentsTree } = this.props; const { departmentsTree } = this.props;
return ( return (
<div className="dir-content-nav"> <div className="dir-content-nav">
<div className="tree-view tree"> <div className="tree-view p-4">
{this.props.isTreeLoading ? {this.props.isTreeLoading ?
<Loading/> : <Loading/> :
<div className="tree-node"> <>
{departmentsTree.length > 0 && departmentsTree.map((department, index) => { {departmentsTree.length > 0 && departmentsTree.map((department, index) => {
return ( return (
<DingtalkDepartmentsTreeNode <DingtalkDepartmentsTreeNode
@@ -38,7 +33,7 @@ class DingtalkDepartmentsTreePanel extends Component {
/> />
); );
})} })}
</div> </>
} }
</div> </div>
</div> </div>

View File

@@ -59,6 +59,10 @@ class WorkWeixinDepartments extends Component {
getWorkWeixinDepartmentsList = (departmentID) => { getWorkWeixinDepartmentsList = (departmentID) => {
systemAdminAPI.sysAdminListWorkWeixinDepartments(departmentID).then((res) => { systemAdminAPI.sysAdminListWorkWeixinDepartments(departmentID).then((res) => {
if (!res.data.department && res.data.errmsg) {
toaster.danger(res.data.errmsg);
return;
}
if (!departmentID) { if (!departmentID) {
let departmentsTree = this.getDepartmentsTree(res.data.department); let departmentsTree = this.getDepartmentsTree(res.data.department);
this.setState({ this.setState({
@@ -302,7 +306,7 @@ class WorkWeixinDepartments extends Component {
<div className="cur-view-path"> <div className="cur-view-path">
<h3 className="sf-heading">{'企业微信集成'}</h3> <h3 className="sf-heading">{'企业微信集成'}</h3>
</div> </div>
<div className="cur-view-content d-flex flex-row"> <div className="cur-view-content d-flex flex-row p-0">
<WorkWeixinDepartmentsTreePanel <WorkWeixinDepartmentsTreePanel
departmentsTree={this.state.departmentsTree} departmentsTree={this.state.departmentsTree}
isTreeLoading={this.state.isTreeLoading} isTreeLoading={this.state.isTreeLoading}

View File

@@ -115,13 +115,14 @@ class WorkWeixinDepartmentsTreeNode extends Component {
style={this.state.active ? {} : { opacity: 0 }} style={this.state.active ? {} : { opacity: 0 }}
> >
<DropdownToggle <DropdownToggle
tag='i' tag='span'
className='sf3-font sf3-font-more-vertical cursor-pointer attr-action-icon' className='cursor-pointer right-icon'
title={gettext('More operations')} title={gettext('More operations')}
aria-label={gettext('More operations')} aria-label={gettext('More operations')}
data-toggle="dropdown" data-toggle="dropdown"
aria-expanded={this.state.dropdownOpen} aria-expanded={this.state.dropdownOpen}
> >
<i className="sf3-font sf3-font-more"></i>
</DropdownToggle> </DropdownToggle>
<DropdownMenu className="drop-list"> <DropdownMenu className="drop-list">
<DropdownItem <DropdownItem

View File

@@ -12,19 +12,14 @@ const WorkWeixinDepartmentsTreePanelPropTypes = {
}; };
class WorkWeixinDepartmentsTreePanel extends Component { class WorkWeixinDepartmentsTreePanel extends Component {
constructor(props) {
super(props);
}
render() { render() {
const { departmentsTree } = this.props; const { departmentsTree } = this.props;
return ( return (
<div className="dir-content-nav"> <div className="dir-content-nav">
<div className="tree-view tree"> <div className="tree-view p-4">
{this.props.isTreeLoading ? {this.props.isTreeLoading ?
<Loading/> : <Loading/> :
<div className="tree-node"> <>
{departmentsTree.length > 0 && departmentsTree.map((department, index) => { {departmentsTree.length > 0 && departmentsTree.map((department, index) => {
return ( return (
<WorkWeixinDepartmentsTreeNode <WorkWeixinDepartmentsTreeNode
@@ -38,7 +33,7 @@ class WorkWeixinDepartmentsTreePanel extends Component {
/> />
); );
})} })}
</div> </>
} }
</div> </div>
</div> </div>

View File

@@ -18,5 +18,5 @@ CREATE TABLE IF NOT EXISTS OrgUploadRateLimit (
UNIQUE INDEX(org_id) UNIQUE INDEX(org_id)
) ENGINE=INNODB; ) ENGINE=INNODB;
ALTER TABLE RepoInfo ADD COLUMN IF NOT EXISTS type varchar(10); ALTER TABLE RepoInfo ADD COLUMN type varchar(10);
CREATE INDEX IF NOT EXISTS RepoInfoTypeIndex on RepoInfo (type); CREATE INDEX RepoInfoTypeIndex on RepoInfo (type);

View File

@@ -89,9 +89,9 @@ CREATE TABLE IF NOT EXISTS `wiki_wiki2_publish` (
KEY `ix_wiki2_publish_repo_id` (`repo_id`) KEY `ix_wiki2_publish_repo_id` (`repo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE share_fileshare ADD COLUMN IF NOT EXISTS `user_scope` varchar(225) DEFAULT 'all_users'; ALTER TABLE share_fileshare ADD COLUMN `user_scope` varchar(225) DEFAULT 'all_users';
ALTER TABLE share_fileshare ADD COLUMN IF NOT EXISTS `authed_details` LONGTEXT DEFAULT NULL; ALTER TABLE share_fileshare ADD COLUMN `authed_details` LONGTEXT DEFAULT NULL;
ALTER TABLE share_fileshare ADD INDEX IF NOT EXISTS `idx_ctime` (`ctime`); ALTER TABLE share_fileshare ADD INDEX `idx_ctime` (`ctime`);
ALTER TABLE share_fileshare ADD INDEX IF NOT EXISTS `idx_view_cnt` (`view_cnt`); ALTER TABLE share_fileshare ADD INDEX `idx_view_cnt` (`view_cnt`);
ALTER TABLE profile_profile ADD COLUMN IF NOT EXISTS `is_manually_set_contact_email` tinyint(1) DEFAULT 0; ALTER TABLE profile_profile ADD COLUMN `is_manually_set_contact_email` tinyint(1) DEFAULT 0;