From c54ae6cb01f5ac1a6700534b6cf75a8abf57e9f9 Mon Sep 17 00:00:00 2001 From: llj Date: Mon, 10 Jun 2019 17:30:10 +0800 Subject: [PATCH] redesigned all 'empty-tip' --- frontend/src/components/empty-tip.js | 17 ++++++++++++++ frontend/src/pages/drafts/draft-content.js | 5 +++-- frontend/src/pages/groups/group-view.js | 13 ++++++----- .../src/pages/invitations/invitations-view.js | 5 +++-- frontend/src/pages/my-libs/my-libs-deleted.js | 21 +++++++++--------- frontend/src/pages/my-libs/my-libs.js | 5 +++-- frontend/src/pages/share-admin/folders.js | 5 +++-- frontend/src/pages/share-admin/libraries.js | 5 +++-- frontend/src/pages/share-admin/share-links.js | 7 +++--- .../src/pages/share-admin/upload-links.js | 5 +++-- frontend/src/pages/shared-libs/shared-libs.js | 5 +++-- .../shared-with-all/public-shared-view.js | 5 +++-- frontend/src/pages/wikis/wikis.js | 5 +++-- media/css/seahub_react.css | 15 ++++++++----- media/img/no-items-tip.png | Bin 0 -> 13703 bytes 15 files changed, 75 insertions(+), 43 deletions(-) create mode 100644 frontend/src/components/empty-tip.js create mode 100644 media/img/no-items-tip.png diff --git a/frontend/src/components/empty-tip.js b/frontend/src/components/empty-tip.js new file mode 100644 index 0000000000..82550e6317 --- /dev/null +++ b/frontend/src/components/empty-tip.js @@ -0,0 +1,17 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { mediaUrl } from '../utils/constants'; + +class EmptyTip extends React.Component { + + render() { + return ( +
+ + {this.props.children} +
+ ); + } +} + +export default EmptyTip; diff --git a/frontend/src/pages/drafts/draft-content.js b/frontend/src/pages/drafts/draft-content.js index 39a99c3b37..6ef09cefed 100644 --- a/frontend/src/pages/drafts/draft-content.js +++ b/frontend/src/pages/drafts/draft-content.js @@ -4,6 +4,7 @@ import editUtilties from '../../utils/editor-utilties'; import { Utils } from '../../utils/utils'; import PropTypes from 'prop-types'; import toaster from '../../components/toast'; +import EmptyTip from '../../components/empty-tip'; import Loading from '../../components/loading'; import DraftListView from '../../components/draft-list-view/draft-list-view'; @@ -57,10 +58,10 @@ class DraftContent extends React.Component { {!this.props.isLoadingDraft && ( {this.props.draftList.length === 0 && ( -
+

{gettext('No draft yet')}

{gettext('Draft is a way to let you collaborate with others on files. You can create a draft from a file, edit the draft and then ask for a review. The original file will be updated only after the draft be reviewed.')}

-
+ )} {this.props.draftList.length !==0 && ( +

{gettext('No library is shared to this group')}

{gettext('You can share libraries by clicking the "New Library" button above or the "Share" icon on your libraries list.')}

{gettext('Libraries shared as writable can be downloaded and synced by other group members. Read only libraries can only be downloaded, updates by others will not be uploaded.')}

- +
); } else { if (currentGroup.admins.indexOf(username) == -1) { // is a member of this group emptyTip = ( -
+

{gettext('No libraries')}

-
+ ); } else { emptyTip = ( -
+

{gettext('No libraries')}

{gettext('You can create libraries by clicking the "New Library" button above.')}

-
+ ); } } diff --git a/frontend/src/pages/invitations/invitations-view.js b/frontend/src/pages/invitations/invitations-view.js index f96504f4d7..bc453082e0 100644 --- a/frontend/src/pages/invitations/invitations-view.js +++ b/frontend/src/pages/invitations/invitations-view.js @@ -8,6 +8,7 @@ import {Table} from 'reactstrap'; import Loading from '../../components/loading'; import moment from 'moment'; import toaster from '../../components/toast'; +import EmptyTip from '../../components/empty-tip'; import '../../css/invitations.css'; @@ -186,9 +187,9 @@ class InvitationsView extends React.Component { emptyTip = () => { return ( -
+

{gettext('You have not invited any people.')}

-
+ ); } diff --git a/frontend/src/pages/my-libs/my-libs-deleted.js b/frontend/src/pages/my-libs/my-libs-deleted.js index 523b30b4da..9baa5f8a7e 100644 --- a/frontend/src/pages/my-libs/my-libs-deleted.js +++ b/frontend/src/pages/my-libs/my-libs-deleted.js @@ -3,10 +3,11 @@ import { Link } from '@reach/router'; import moment from 'moment'; import { gettext, siteRoot, lang } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; -import toaster from '../../components/toast'; -import CommonToolbar from '../../components/toolbar/common-toolbar'; -import Loading from '../../components/loading'; import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; +import Loading from '../../components/loading'; +import EmptyTip from '../../components/empty-tip'; +import CommonToolbar from '../../components/toolbar/common-toolbar'; moment.locale(lang); @@ -46,7 +47,7 @@ class MyLibsDeleted extends Component {
- {gettext("My Libraries")} + {gettext('My Libraries')} / {gettext('Deleted Libraries')}
@@ -54,9 +55,9 @@ class MyLibsDeleted extends Component {
{this.state.isLoading && } {(!this.state.isLoading && this.state.deletedRepoList.length === 0) && -
-

{gettext('No deleted libraries.')}

-
+ +

{gettext('No deleted libraries.')}

+
} {this.state.deletedRepoList.length !== 0 &&
@@ -140,9 +141,9 @@ class DeletedRepoItem extends Component { toaster.success(message); this.props.refreshDeletedRepoList(repoID); }).catch(res => { - let message = gettext('Failed. Please check the network.') - toaster.danger(message); - }) + let message = gettext('Failed. Please check the network.'); + toaster.danger(message); + }); } render() { diff --git a/frontend/src/pages/my-libs/my-libs.js b/frontend/src/pages/my-libs/my-libs.js index 1c6e57bf01..47d6e4eed3 100644 --- a/frontend/src/pages/my-libs/my-libs.js +++ b/frontend/src/pages/my-libs/my-libs.js @@ -6,6 +6,7 @@ import { gettext, loginUrl} from '../../utils/constants'; import { Utils } from '../../utils/utils'; import Repo from '../../models/repo'; import Loading from '../../components/loading'; +import EmptyTip from '../../components/empty-tip'; import CommonToolbar from '../../components/toolbar/common-toolbar'; import RepoViewToolbar from '../../components/toolbar/repo-view-toobar'; import LibDetail from '../../components/dirent-detail/lib-details'; @@ -29,10 +30,10 @@ class MyLibraries extends Component { }; this.emptyMessage = ( -
+

{gettext('You have not created any libraries')}

{gettext('You can create a library to organize your files. For example, you can create one for each of your projects. Each library can be synchronized and shared separately.')}

-
+ ); } diff --git a/frontend/src/pages/share-admin/folders.js b/frontend/src/pages/share-admin/folders.js index b5eea0a0af..3ee74fad72 100644 --- a/frontend/src/pages/share-admin/folders.js +++ b/frontend/src/pages/share-admin/folders.js @@ -3,6 +3,7 @@ import { Link } from '@reach/router'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; +import EmptyTip from '../../components/empty-tip'; import SharePermissionEditor from '../../components/select-editor/share-permission-editor'; import SharedFolderInfo from '../../models/shared-folder-info'; @@ -24,10 +25,10 @@ class Content extends Component { return

{errorMsg}

; } else { const emptyTip = ( -
+

{gettext('You have not shared any folders')}

{gettext('You can share a single folder with a registered user if you don\'t want to share a whole library.')}

-
+ ); // sort diff --git a/frontend/src/pages/share-admin/libraries.js b/frontend/src/pages/share-admin/libraries.js index 04cb3261b5..63ca340e7f 100644 --- a/frontend/src/pages/share-admin/libraries.js +++ b/frontend/src/pages/share-admin/libraries.js @@ -3,6 +3,7 @@ import { Link } from '@reach/router'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; +import EmptyTip from '../../components/empty-tip'; import SharePermissionEditor from '../../components/select-editor/share-permission-editor'; import SharedRepoInfo from '../../models/shared-repo-info'; @@ -24,10 +25,10 @@ class Content extends Component { return

{errorMsg}

; } else { const emptyTip = ( -
+

{gettext('You have not shared any libraries')}

{gettext('You can share libraries with your friends and colleagues by clicking the share icon of your own libraries in your home page or creating a new library in groups you are in.')}

-
+ ); // sort diff --git a/frontend/src/pages/share-admin/share-links.js b/frontend/src/pages/share-admin/share-links.js index 99dba98931..56ea38a54d 100644 --- a/frontend/src/pages/share-admin/share-links.js +++ b/frontend/src/pages/share-admin/share-links.js @@ -2,13 +2,14 @@ import React, { Component, Fragment } from 'react'; import { Link } from '@reach/router'; import moment from 'moment'; import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap'; +import copy from '@seafile/seafile-editor/dist//utils/copy-to-clipboard'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, loginUrl, canGenerateUploadLink } from '../../utils/constants'; import SharedLinkInfo from '../../models/shared-link-info'; import ShareLinksPermissionEditor from '../../components/select-editor/share-links-permission-editor'; -import copy from '@seafile/seafile-editor/dist//utils/copy-to-clipboard'; import toaster from '../../components/toast'; +import EmptyTip from '../../components/empty-tip'; class Content extends Component { @@ -66,10 +67,10 @@ class Content extends Component { return

{errorMsg}

; } else { const emptyTip = ( -
+

{gettext('You don\'t have any share links')}

{gettext('You can generate a share link for a folder or a file. Anyone who receives this link can view the folder or the file online.')}

-
+ ); // sort diff --git a/frontend/src/pages/share-admin/upload-links.js b/frontend/src/pages/share-admin/upload-links.js index e91dfacb78..97d3efb2ae 100644 --- a/frontend/src/pages/share-admin/upload-links.js +++ b/frontend/src/pages/share-admin/upload-links.js @@ -5,6 +5,7 @@ import { gettext, siteRoot, loginUrl, canGenerateShareLink } from '../../utils/c import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import SharedUploadInfo from '../../models/shared-upload-info'; +import EmptyTip from '../../components/empty-tip'; class Content extends Component { @@ -39,10 +40,10 @@ class Content extends Component { return

{errorMsg}

; } else { const emptyTip = ( -
+

{gettext('You don\'t have any upload links')}

{gettext('You can generate an upload link from any folder. Anyone who receives this link can upload files to this folder.')}

-
+ ); const table = ( diff --git a/frontend/src/pages/shared-libs/shared-libs.js b/frontend/src/pages/shared-libs/shared-libs.js index aebda087f5..3af004ca42 100644 --- a/frontend/src/pages/shared-libs/shared-libs.js +++ b/frontend/src/pages/shared-libs/shared-libs.js @@ -8,6 +8,7 @@ import { Utils } from '../../utils/utils'; import Repo from '../../models/repo'; import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; import Loading from '../../components/loading'; +import EmptyTip from '../../components/empty-tip'; import ModalPotal from '../../components/modal-portal'; import ShareDialog from '../../components/dialog/share-dialog'; @@ -38,10 +39,10 @@ class Content extends Component { const { loading, errorMsg, items, sortBy, sortOrder } = this.props; const emptyTip = ( -
+

{gettext('No libraries have been shared with you')}

{gettext('No libraries have been shared directly with you. You can find more shared libraries at "Shared with groups".')}

-
+ ); if (loading) { diff --git a/frontend/src/pages/shared-with-all/public-shared-view.js b/frontend/src/pages/shared-with-all/public-shared-view.js index f9b1fe4665..4af8343a40 100644 --- a/frontend/src/pages/shared-with-all/public-shared-view.js +++ b/frontend/src/pages/shared-with-all/public-shared-view.js @@ -9,6 +9,7 @@ import { Utils } from '../../utils/utils'; import Repo from '../../models/repo'; import toaster from '../../components/toast'; import Loading from '../../components/loading'; +import EmptyTip from '../../components/empty-tip'; import ModalPortal from '../../components/modal-portal'; import CommonToolbar from '../../components/toolbar/common-toolbar'; import CreateRepoDialog from '../../components/dialog/create-repo-dialog'; @@ -162,10 +163,10 @@ class PublicSharedView extends React.Component { render() { let errMessage = this.state.errMessage; let emptyTip = ( -
+

{gettext('No public libraries')}

{gettext('You can create a public library by clicking the "New Library" button, others can view and download this library.')}

-
+ ); return ( diff --git a/frontend/src/pages/wikis/wikis.js b/frontend/src/pages/wikis/wikis.js index e612c8f1fe..2731570d58 100644 --- a/frontend/src/pages/wikis/wikis.js +++ b/frontend/src/pages/wikis/wikis.js @@ -6,6 +6,7 @@ import { seafileAPI } from '../../utils/seafile-api'; import { gettext, loginUrl, canPublishRepo } from '../../utils/constants'; import toaster from '../../components/toast'; import ModalPortal from '../../components/modal-portal'; +import EmptyTip from '../../components/empty-tip'; import CommonToolbar from '../../components/toolbar/common-toolbar'; import NewWikiDialog from '../../components/dialog/new-wiki-dialog'; import WikiSelectDialog from '../../components/dialog/wiki-select-dialog'; @@ -157,10 +158,10 @@ class Wikis extends Component { /> } {(!this.state.loading && this.state.wikis.length === 0) && -
+

{gettext('You do not have any public library')}

{gettext('Public libraries are for publishing your contents in an organized way.')}

-
+ }
diff --git a/media/css/seahub_react.css b/media/css/seahub_react.css index 2ef1d0af76..bc00ed6521 100644 --- a/media/css/seahub_react.css +++ b/media/css/seahub_react.css @@ -1008,13 +1008,16 @@ a.table-sort-op:focus { /* empty-tip */ .empty-tip { - margin: auto 1rem; - padding: 30px 40px; - background-color: #FAFAFA; - border: solid 1px #DDD; + margin: 5.5em 1em; + border: 1px solid #ddd; border-radius: 3px; - box-shadow: inset 0 0 8px #EEE; - margin-top: 5.5em; + padding: 30px 80px; + background-color: #fafafa; + text-align: center; +} +.no-items-img-tip { + display: inline-block; + margin-bottom: 20px; } .empty-tip h2 { font-size: 1.25rem; diff --git a/media/img/no-items-tip.png b/media/img/no-items-tip.png new file mode 100644 index 0000000000000000000000000000000000000000..816fbf0d4c2220ddb7aa4c1ea153ea00e247fab2 GIT binary patch literal 13703 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