diff options
author | Christopher Ng <chrng8@gmail.com> | 2022-08-12 01:30:42 +0000 |
---|---|---|
committer | Christopher Ng <chrng8@gmail.com> | 2022-09-15 19:09:13 +0000 |
commit | 8eb46c995ed1da3ce334487eecc46ef3eff4ede4 (patch) | |
tree | 06792d5e33dab077028da7a7a60301527685ebd9 /apps/settings/src | |
parent | ca747b91d4aa907b191119f080d213bfb5e60fd2 (diff) | |
download | nextcloud-server-8eb46c995ed1da3ce334487eecc46ef3eff4ede4.tar.gz nextcloud-server-8eb46c995ed1da3ce334487eecc46ef3eff4ede4.zip |
Remake group and quota details section with Vue
Signed-off-by: Christopher Ng <chrng8@gmail.com>
Diffstat (limited to 'apps/settings/src')
-rw-r--r-- | apps/settings/src/components/PersonalInfo/DetailsSection.vue | 124 | ||||
-rw-r--r-- | apps/settings/src/components/PersonalInfo/shared/HeaderBar.vue | 4 | ||||
-rw-r--r-- | apps/settings/src/main-personal-info.js | 3 |
3 files changed, 128 insertions, 3 deletions
diff --git a/apps/settings/src/components/PersonalInfo/DetailsSection.vue b/apps/settings/src/components/PersonalInfo/DetailsSection.vue new file mode 100644 index 00000000000..b3c0133ebf5 --- /dev/null +++ b/apps/settings/src/components/PersonalInfo/DetailsSection.vue @@ -0,0 +1,124 @@ +<!-- + - @copyright 2022 Christopher Ng <chrng8@gmail.com> + - + - @author Christopher Ng <chrng8@gmail.com> + - + - @license AGPL-3.0-or-later + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - +--> + +<template> + <section> + <HeaderBar :readable="t('settings', 'Details')" /> + + <div class="details"> + <div class="details__groups"> + <Account :size="20" /> + <div class="details__groups-info"> + <p>{{ t('settings', 'You are a member of the following groups:') }}</p> + <p class="details__groups-list">{{ groups.join(', ') }}</p> + </div> + </div> + <div class="details__quota"> + <CircleSlice :size="20" /> + <div class="details__quota-info"> + <p class="details__quota-text" v-html="quotaText" /> + <NcProgressBar size="medium" + :value="usageRelative" + :error="usageRelative > 80" /> + </div> + </div> + </div> + </section> +</template> + +<script> +import { loadState } from '@nextcloud/initial-state' +import NcProgressBar from '@nextcloud/vue/dist/Components/NcProgressBar' + +import Account from 'vue-material-design-icons/Account' +import CircleSlice from 'vue-material-design-icons/CircleSlice3' + +import HeaderBar from './shared/HeaderBar.vue' + +/** SYNC to be kept in sync with `lib/public/Files/FileInfo.php` */ +const SPACE_UNLIMITED = -3 + +const { groups, quota, totalSpace, usage, usageRelative } = loadState('settings', 'personalInfoParameters', {}) + +export default { + name: 'DetailsSection', + + components: { + Account, + CircleSlice, + HeaderBar, + NcProgressBar, + }, + + computed: { + quotaText() { + if (quota === SPACE_UNLIMITED) { + return t('settings', 'You are using <strong>{usage}</strong>', { usage }) + } + return t( + 'settings', + 'You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative} %</strong>)', + { usage, totalSpace, usageRelative }, + ) + } + }, + + data() { + return { + groups, + usageRelative, + } + }, +} +</script> + +<style lang="scss" scoped> +.details { + display: flex; + flex-direction: column; + margin: 10px 32px 10px 0; + gap: 16px 0; + color: var(--color-text-lighter); + + &__groups, + &__quota { + display: flex; + gap: 0 10px; + + &-info { + display: flex; + flex-direction: column; + width: 100%; + gap: 4px 0; + } + + &-list { + font-weight: bold; + } + + &::v-deep .material-design-icon { + align-self: flex-start; + margin-top: 2px; + } + } +} +</style> diff --git a/apps/settings/src/components/PersonalInfo/shared/HeaderBar.vue b/apps/settings/src/components/PersonalInfo/shared/HeaderBar.vue index a72e07b4774..541b46fb591 100644 --- a/apps/settings/src/components/PersonalInfo/shared/HeaderBar.vue +++ b/apps/settings/src/components/PersonalInfo/shared/HeaderBar.vue @@ -56,7 +56,6 @@ import FederationControl from './FederationControl.vue' import { ACCOUNT_PROPERTY_READABLE_ENUM, - ACCOUNT_SETTING_PROPERTY_READABLE_ENUM, PROFILE_READABLE_ENUM, } from '../../../constants/AccountPropertyConstants.js' @@ -77,7 +76,6 @@ export default { readable: { type: String, required: true, - validator: (value) => Object.values(ACCOUNT_PROPERTY_READABLE_ENUM).includes(value) || Object.values(ACCOUNT_SETTING_PROPERTY_READABLE_ENUM).includes(value) || value === PROFILE_READABLE_ENUM.PROFILE_VISIBILITY, }, inputId: { type: String, @@ -109,7 +107,7 @@ export default { }, isSettingProperty() { - return Object.values(ACCOUNT_SETTING_PROPERTY_READABLE_ENUM).includes(this.readable) + return !Object.values(ACCOUNT_PROPERTY_READABLE_ENUM).includes(this.readable) && !Object.values(PROFILE_READABLE_ENUM).includes(this.readable) }, }, diff --git a/apps/settings/src/main-personal-info.js b/apps/settings/src/main-personal-info.js index 47af5af8487..077bad3b5f7 100644 --- a/apps/settings/src/main-personal-info.js +++ b/apps/settings/src/main-personal-info.js @@ -27,6 +27,7 @@ import { translate as t } from '@nextcloud/l10n' import '@nextcloud/dialogs/styles/toast.scss' import AvatarSection from './components/PersonalInfo/AvatarSection.vue' +import DetailsSection from './components/PersonalInfo/DetailsSection.vue' import DisplayNameSection from './components/PersonalInfo/DisplayNameSection.vue' import EmailSection from './components/PersonalInfo/EmailSection/EmailSection.vue' import PhoneSection from './components/PersonalInfo/PhoneSection.vue' @@ -52,6 +53,7 @@ Vue.mixin({ }) const AvatarView = Vue.extend(AvatarSection) +const DetailsView = Vue.extend(DetailsSection) const DisplayNameView = Vue.extend(DisplayNameSection) const EmailView = Vue.extend(EmailSection) const PhoneView = Vue.extend(PhoneSection) @@ -61,6 +63,7 @@ const TwitterView = Vue.extend(TwitterSection) const LanguageView = Vue.extend(LanguageSection) new AvatarView().$mount('#vue-avatar-section') +new DetailsView().$mount('#vue-details-section') new DisplayNameView().$mount('#vue-displayname-section') new EmailView().$mount('#vue-email-section') new PhoneView().$mount('#vue-phone-section') |