mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-02 07:27:04 +00:00
added 'empty tip' for 'groups', linked devices', and 'favourites' pages
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import React, { Fragment } from 'react';
|
import React, { Fragment } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { gettext, siteRoot, loginUrl } from '../../utils/constants';
|
import { gettext, siteRoot, loginUrl, canAddGroup } from '../../utils/constants';
|
||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import Loading from '../../components/loading';
|
import Loading from '../../components/loading';
|
||||||
import Group from '../../models/group';
|
import Group from '../../models/group';
|
||||||
@@ -10,6 +10,7 @@ import GroupsToolbar from '../../components/toolbar/groups-toolbar';
|
|||||||
import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view';
|
import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view';
|
||||||
import CreateGroupDialog from '../../components/dialog/create-group-dialog';
|
import CreateGroupDialog from '../../components/dialog/create-group-dialog';
|
||||||
import LibDetail from '../../components/dirent-detail/lib-details';
|
import LibDetail from '../../components/dirent-detail/lib-details';
|
||||||
|
import EmptyTip from '../../components/empty-tip';
|
||||||
|
|
||||||
import '../../css/groups.css';
|
import '../../css/groups.css';
|
||||||
|
|
||||||
@@ -55,11 +56,11 @@ class RepoListViewPanel extends React.Component {
|
|||||||
});
|
});
|
||||||
this.setState({repoList: repoList});
|
this.setState({repoList: repoList});
|
||||||
let name = repo.repo_name;
|
let name = repo.repo_name;
|
||||||
var msg = gettext("Successfully deleted {name}.").replace('{name}', name);
|
var msg = gettext('Successfully deleted {name}.').replace('{name}', name);
|
||||||
toaster.success(msg);
|
toaster.success(msg);
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
let name = repo.repo_name;
|
let name = repo.repo_name;
|
||||||
var msg = gettext("Failed to delete {name}.").replace('{name}', name);
|
var msg = gettext('Failed to delete {name}.').replace('{name}', name);
|
||||||
toaster.danger(msg);
|
toaster.danger(msg);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -187,6 +188,16 @@ class GroupsView extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
const emptyTip = (
|
||||||
|
<EmptyTip>
|
||||||
|
<h2>{gettext('You are not in any groups')}</h2>
|
||||||
|
{canAddGroup ?
|
||||||
|
<p>{gettext('Groups allow multiple people to collaborate on libraries. You can create a group by clicking the "New Group" button.')}</p> :
|
||||||
|
<p>{gettext('Groups allow multiple people to collaborate on libraries. Groups you join will be listed here.')}</p>
|
||||||
|
}
|
||||||
|
</EmptyTip>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<GroupsToolbar
|
<GroupsToolbar
|
||||||
@@ -201,8 +212,8 @@ class GroupsView extends React.Component {
|
|||||||
</div>
|
</div>
|
||||||
<div className="cur-view-content cur-view-content-groups">
|
<div className="cur-view-content cur-view-content-groups">
|
||||||
{this.state.isLoading && <Loading />}
|
{this.state.isLoading && <Loading />}
|
||||||
{(!this.state.isLoading && this.state.errorMsg !== '') && this.state.errorMsg}
|
{(!this.state.isLoading && this.state.errorMsg) && this.state.errorMsg}
|
||||||
{/* {(!this.state.isLoading && this.state.groupList.length === 0 ) && emptyTip} //todo */}
|
{(!this.state.isLoading && !this.state.errorMsg && this.state.groupList.length == 0) && emptyTip}
|
||||||
{!this.state.isLoading && this.state.groupList.map((group, index) => {
|
{!this.state.isLoading && this.state.groupList.map((group, index) => {
|
||||||
return (
|
return (
|
||||||
<RepoListViewPanel
|
<RepoListViewPanel
|
||||||
|
@@ -3,6 +3,7 @@ import moment from 'moment';
|
|||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { gettext, loginUrl } from '../../utils/constants';
|
import { gettext, loginUrl } from '../../utils/constants';
|
||||||
import toaster from '../../components/toast';
|
import toaster from '../../components/toast';
|
||||||
|
import EmptyTip from '../../components/empty-tip';
|
||||||
|
|
||||||
class Content extends Component {
|
class Content extends Component {
|
||||||
|
|
||||||
@@ -14,6 +15,13 @@ class Content extends Component {
|
|||||||
} else if (errorMsg) {
|
} else if (errorMsg) {
|
||||||
return <p className="error text-center">{errorMsg}</p>;
|
return <p className="error text-center">{errorMsg}</p>;
|
||||||
} else {
|
} else {
|
||||||
|
const emptyTip = (
|
||||||
|
<EmptyTip>
|
||||||
|
<h2>{gettext("You do not have connected devices")}</h2>
|
||||||
|
<p>{gettext("Your clients (Desktop/Android/iOS) will be listed here.")}</p>
|
||||||
|
</EmptyTip>
|
||||||
|
);
|
||||||
|
|
||||||
const desktopThead = (
|
const desktopThead = (
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -35,12 +43,12 @@ class Content extends Component {
|
|||||||
</thead>
|
</thead>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return items.length ? (
|
||||||
<table>
|
<table>
|
||||||
{window.innerWidth >= 768 ? desktopThead : mobileThead}
|
{window.innerWidth >= 768 ? desktopThead : mobileThead}
|
||||||
<TableBody items={items} />
|
<TableBody items={items} />
|
||||||
</table>
|
</table>
|
||||||
);
|
): emptyTip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,7 @@ import moment from 'moment';
|
|||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
import { gettext, siteRoot, loginUrl } from '../../utils/constants';
|
import { gettext, siteRoot, loginUrl } from '../../utils/constants';
|
||||||
|
import EmptyTip from '../../components/empty-tip';
|
||||||
|
|
||||||
class Content extends Component {
|
class Content extends Component {
|
||||||
|
|
||||||
@@ -15,6 +16,12 @@ class Content extends Component {
|
|||||||
} else if (errorMsg) {
|
} else if (errorMsg) {
|
||||||
return <p className="error text-center">{errorMsg}</p>;
|
return <p className="error text-center">{errorMsg}</p>;
|
||||||
} else {
|
} else {
|
||||||
|
const emptyTip = (
|
||||||
|
<EmptyTip>
|
||||||
|
<h2>{gettext('You don\'t have any favorite items yet')}</h2>
|
||||||
|
</EmptyTip>
|
||||||
|
);
|
||||||
|
|
||||||
const desktopThead = (
|
const desktopThead = (
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -36,12 +43,12 @@ class Content extends Component {
|
|||||||
</thead>
|
</thead>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return items.length ? (
|
||||||
<table className="table-hover">
|
<table className="table-hover">
|
||||||
{window.innerWidth >= 768 ? desktopThead : mobileThead}
|
{window.innerWidth >= 768 ? desktopThead : mobileThead}
|
||||||
<TableBody items={items} />
|
<TableBody items={items} />
|
||||||
</table>
|
</table>
|
||||||
);
|
) : emptyTip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,7 @@ export const name = window.app.pageOptions.name;
|
|||||||
export const contactEmail = window.app.pageOptions.contactEmail;
|
export const contactEmail = window.app.pageOptions.contactEmail;
|
||||||
export const username = window.app.pageOptions.username;
|
export const username = window.app.pageOptions.username;
|
||||||
export const canAddRepo = window.app.pageOptions.canAddRepo;
|
export const canAddRepo = window.app.pageOptions.canAddRepo;
|
||||||
|
export const canAddGroup = window.app.pageOptions.canAddGroup;
|
||||||
export const canGenerateShareLink = window.app.pageOptions.canGenerateShareLink;
|
export const canGenerateShareLink = window.app.pageOptions.canGenerateShareLink;
|
||||||
export const canGenerateUploadLink = window.app.pageOptions.canGenerateUploadLink ? true : false;
|
export const canGenerateUploadLink = window.app.pageOptions.canGenerateUploadLink ? true : false;
|
||||||
export const canViewOrg = window.app.pageOptions.canViewOrg === 'True';
|
export const canViewOrg = window.app.pageOptions.canViewOrg === 'True';
|
||||||
|
@@ -51,6 +51,7 @@
|
|||||||
contactEmail: "{{request.user.username|email2contact_email|escapejs}}",
|
contactEmail: "{{request.user.username|email2contact_email|escapejs}}",
|
||||||
username: "{{request.user.username|escapejs}}",
|
username: "{{request.user.username|escapejs}}",
|
||||||
canAddRepo: {% if user.permissions.can_add_repo %} true {% else %} false {% endif %},
|
canAddRepo: {% if user.permissions.can_add_repo %} true {% else %} false {% endif %},
|
||||||
|
canAddGroup: {% if user.permissions.can_add_group %} true {% else %} false {% endif %},
|
||||||
canGenerateShareLink: {% if user.permissions.can_generate_share_link %} true {% else %} false {% endif %},
|
canGenerateShareLink: {% if user.permissions.can_generate_share_link %} true {% else %} false {% endif %},
|
||||||
canGenerateUploadLink: {% if user.permissions.can_generate_upload_link %} true {% else %} false {% endif %},
|
canGenerateUploadLink: {% if user.permissions.can_generate_upload_link %} true {% else %} false {% endif %},
|
||||||
canViewOrg:'{{ user.permissions.can_view_org }}',
|
canViewOrg:'{{ user.permissions.can_view_org }}',
|
||||||
|
@@ -1268,7 +1268,3 @@ def react_fake_view(request, **kwargs):
|
|||||||
'folder_perm_enabled': folder_perm_enabled,
|
'folder_perm_enabled': folder_perm_enabled,
|
||||||
'file_audit_enabled' : FILE_AUDIT_ENABLED
|
'file_audit_enabled' : FILE_AUDIT_ENABLED
|
||||||
})
|
})
|
||||||
|
|
||||||
@login_required
|
|
||||||
def react_group(request, group_id):
|
|
||||||
return render(request, "react_app.html")
|
|
||||||
|
Reference in New Issue
Block a user