Browse Source

Add users and apps inner search and add HeaderMenu cancel

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
tags/v20.0.0RC1
John Molakvoæ (skjnldsv) 3 years ago
parent
commit
58b19efd74
No account linked to committer's email address
48 changed files with 105 additions and 78 deletions
  1. 2
    2
      apps/settings/js/vue-settings-admin-security.js
  2. 1
    1
      apps/settings/js/vue-settings-admin-security.js.map
  3. 0
    2
      apps/settings/js/vue-settings-apps-61204aaf4b4d6b6e7940.js
  4. 0
    1
      apps/settings/js/vue-settings-apps-61204aaf4b4d6b6e7940.js.map
  5. 2
    0
      apps/settings/js/vue-settings-apps-7d82ca79b672ef6a7e07.js
  6. 1
    0
      apps/settings/js/vue-settings-apps-7d82ca79b672ef6a7e07.js.map
  7. 2
    0
      apps/settings/js/vue-settings-apps-cf832dbe06a0340d4891.js
  8. 1
    0
      apps/settings/js/vue-settings-apps-cf832dbe06a0340d4891.js.map
  9. 2
    2
      apps/settings/js/vue-settings-apps-users-management.js
  10. 1
    1
      apps/settings/js/vue-settings-apps-users-management.js.map
  11. 2
    2
      apps/settings/js/vue-settings-personal-security.js
  12. 1
    1
      apps/settings/js/vue-settings-personal-security.js.map
  13. 2
    2
      apps/settings/js/vue-settings-personal-webauthn.js
  14. 1
    1
      apps/settings/js/vue-settings-personal-webauthn.js.map
  15. 0
    2
      apps/settings/js/vue-settings-users-06b858deaf48603ce7c5.js
  16. 0
    1
      apps/settings/js/vue-settings-users-06b858deaf48603ce7c5.js.map
  17. 2
    0
      apps/settings/js/vue-settings-users-c5e2ef8b045ac76fa60c.js
  18. 1
    0
      apps/settings/js/vue-settings-users-c5e2ef8b045ac76fa60c.js.map
  19. 2
    2
      apps/settings/js/vue-vendors-settings-apps-9ed6b5656537c98aa712.js
  20. 1
    1
      apps/settings/js/vue-vendors-settings-apps-9ed6b5656537c98aa712.js.map
  21. 0
    2
      apps/settings/js/vue-vendors-settings-apps-c6e9416bc06c5686fddf.js
  22. 0
    1
      apps/settings/js/vue-vendors-settings-apps-c6e9416bc06c5686fddf.js.map
  23. 0
    2
      apps/settings/js/vue-vendors-settings-apps-settings-users-7b6984d3f3d3a3aa83a6.js
  24. 0
    1
      apps/settings/js/vue-vendors-settings-apps-settings-users-7b6984d3f3d3a3aa83a6.js.map
  25. 2
    2
      apps/settings/js/vue-vendors-settings-apps-settings-users-a46abafb0fd92a4adad8.js
  26. 1
    1
      apps/settings/js/vue-vendors-settings-apps-settings-users-a46abafb0fd92a4adad8.js.map
  27. 0
    2
      apps/settings/js/vue-vendors-settings-users-8b96ce996f010432adcb.js
  28. 0
    1
      apps/settings/js/vue-vendors-settings-users-8b96ce996f010432adcb.js.map
  29. 0
    2
      apps/settings/js/vue-vendors-settings-users-99510a9fcf468ba3f0fd.js
  30. 0
    1
      apps/settings/js/vue-vendors-settings-users-99510a9fcf468ba3f0fd.js.map
  31. 2
    0
      apps/settings/js/vue-vendors-settings-users-a951808f89e9abc984a1.js
  32. 1
    0
      apps/settings/js/vue-vendors-settings-users-a951808f89e9abc984a1.js.map
  33. 17
    5
      apps/settings/src/components/UserList.vue
  34. 16
    10
      apps/settings/src/views/Apps.vue
  35. 1
    1
      core/js/dist/install.js
  36. 1
    1
      core/js/dist/install.js.map
  37. 1
    1
      core/js/dist/login.js
  38. 1
    1
      core/js/dist/login.js.map
  39. 1
    1
      core/js/dist/main.js
  40. 1
    1
      core/js/dist/main.js.map
  41. 1
    1
      core/js/dist/maintenance.js
  42. 1
    1
      core/js/dist/maintenance.js.map
  43. 1
    1
      core/js/dist/recommendedapps.js
  44. 1
    1
      core/js/dist/recommendedapps.js.map
  45. 1
    1
      core/js/dist/unified-search.js
  46. 1
    1
      core/js/dist/unified-search.js.map
  47. 8
    12
      core/src/components/HeaderMenu.vue
  48. 22
    3
      core/src/views/UnifiedSearch.vue

+ 2
- 2
apps/settings/js/vue-settings-admin-security.js
File diff suppressed because it is too large
View File


+ 1
- 1
apps/settings/js/vue-settings-admin-security.js.map
File diff suppressed because it is too large
View File


+ 0
- 2
apps/settings/js/vue-settings-apps-61204aaf4b4d6b6e7940.js
File diff suppressed because it is too large
View File


+ 0
- 1
apps/settings/js/vue-settings-apps-61204aaf4b4d6b6e7940.js.map
File diff suppressed because it is too large
View File


+ 2
- 0
apps/settings/js/vue-settings-apps-7d82ca79b672ef6a7e07.js
File diff suppressed because it is too large
View File


+ 1
- 0
apps/settings/js/vue-settings-apps-7d82ca79b672ef6a7e07.js.map
File diff suppressed because it is too large
View File


+ 2
- 0
apps/settings/js/vue-settings-apps-cf832dbe06a0340d4891.js
File diff suppressed because it is too large
View File


+ 1
- 0
apps/settings/js/vue-settings-apps-cf832dbe06a0340d4891.js.map
File diff suppressed because it is too large
View File


+ 2
- 2
apps/settings/js/vue-settings-apps-users-management.js
File diff suppressed because it is too large
View File


+ 1
- 1
apps/settings/js/vue-settings-apps-users-management.js.map
File diff suppressed because it is too large
View File


+ 2
- 2
apps/settings/js/vue-settings-personal-security.js
File diff suppressed because it is too large
View File


+ 1
- 1
apps/settings/js/vue-settings-personal-security.js.map
File diff suppressed because it is too large
View File


+ 2
- 2
apps/settings/js/vue-settings-personal-webauthn.js
File diff suppressed because it is too large
View File


+ 1
- 1
apps/settings/js/vue-settings-personal-webauthn.js.map
File diff suppressed because it is too large
View File


+ 0
- 2
apps/settings/js/vue-settings-users-06b858deaf48603ce7c5.js
File diff suppressed because it is too large
View File


+ 0
- 1
apps/settings/js/vue-settings-users-06b858deaf48603ce7c5.js.map
File diff suppressed because it is too large
View File


+ 2
- 0
apps/settings/js/vue-settings-users-c5e2ef8b045ac76fa60c.js
File diff suppressed because it is too large
View File


+ 1
- 0
apps/settings/js/vue-settings-users-c5e2ef8b045ac76fa60c.js.map
File diff suppressed because it is too large
View File


apps/settings/js/vue-vendors-settings-apps-9ed6b5656537c98aa712.js
File diff suppressed because it is too large
View File


apps/settings/js/vue-vendors-settings-apps-9ed6b5656537c98aa712.js.map
File diff suppressed because it is too large
View File


+ 0
- 2
apps/settings/js/vue-vendors-settings-apps-c6e9416bc06c5686fddf.js
File diff suppressed because it is too large
View File


+ 0
- 1
apps/settings/js/vue-vendors-settings-apps-c6e9416bc06c5686fddf.js.map
File diff suppressed because it is too large
View File


+ 0
- 2
apps/settings/js/vue-vendors-settings-apps-settings-users-7b6984d3f3d3a3aa83a6.js
File diff suppressed because it is too large
View File


+ 0
- 1
apps/settings/js/vue-vendors-settings-apps-settings-users-7b6984d3f3d3a3aa83a6.js.map
File diff suppressed because it is too large
View File


apps/settings/js/vue-vendors-settings-apps-settings-users-a46abafb0fd92a4adad8.js
File diff suppressed because it is too large
View File


apps/settings/js/vue-vendors-settings-apps-settings-users-a46abafb0fd92a4adad8.js.map
File diff suppressed because it is too large
View File


+ 0
- 2
apps/settings/js/vue-vendors-settings-users-8b96ce996f010432adcb.js
File diff suppressed because it is too large
View File


+ 0
- 1
apps/settings/js/vue-vendors-settings-users-8b96ce996f010432adcb.js.map
File diff suppressed because it is too large
View File


+ 0
- 2
apps/settings/js/vue-vendors-settings-users-99510a9fcf468ba3f0fd.js
File diff suppressed because it is too large
View File


+ 0
- 1
apps/settings/js/vue-vendors-settings-users-99510a9fcf468ba3f0fd.js.map
File diff suppressed because it is too large
View File


+ 2
- 0
apps/settings/js/vue-vendors-settings-users-a951808f89e9abc984a1.js
File diff suppressed because it is too large
View File


+ 1
- 0
apps/settings/js/vue-vendors-settings-users-a951808f89e9abc984a1.js.map
File diff suppressed because it is too large
View File


+ 17
- 5
apps/settings/src/components/UserList.vue View File

</template> </template>


<script> <script>
import userRow from './UserList/UserRow'
import { Multiselect, Actions, ActionButton } from '@nextcloud/vue'
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
import InfiniteLoading from 'vue-infinite-loading' import InfiniteLoading from 'vue-infinite-loading'
import Vue from 'vue' import Vue from 'vue'


import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import Actions from '@nextcloud/vue/dist/Components/Actions'
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'

import userRow from './UserList/UserRow'

const unlimitedQuota = { const unlimitedQuota = {
id: 'none', id: 'none',
label: t('settings', 'Unlimited'), label: t('settings', 'Unlimited'),
} }
}, },
}, },

mounted() { mounted() {
if (!this.settings.canChangePassword) { if (!this.settings.canChangePassword) {
OC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled')) OC.Notification.showTemporary(t('settings', 'Password change is disabled because the master key is disabled'))
/** /**
* Register search * Register search
*/ */
this.userSearch = new OCA.Search(this.search, this.resetSearch)
subscribe('nextcloud:unified-search:search', this.search)
subscribe('nextcloud:unified-search:reset', this.resetSearch)


/** /**
* If disabled group but empty, redirect * If disabled group but empty, redirect
*/ */
this.redirectIfDisabled() this.redirectIfDisabled()
}, },
beforeDestroy() {
unsubscribe('nextcloud:unified-search:search', this.search)
unsubscribe('nextcloud:unified-search:reset', this.resetSearch)
},

methods: { methods: {
onScroll(event) { onScroll(event) {
this.scrolled = event.target.scrollTo > 0 this.scrolled = event.target.scrollTo > 0
}, },


/* SEARCH */ /* SEARCH */
search(query) {
search({ query }) {
this.searchQuery = query this.searchQuery = query
this.$store.commit('resetUsers') this.$store.commit('resetUsers')
this.$refs.infiniteLoading.stateChanger.reset() this.$refs.infiniteLoading.stateChanger.reset()
}, },
resetSearch() { resetSearch() {
this.search('')
this.search({ query: '' })
}, },


resetForm() { resetForm() {

+ 16
- 10
apps/settings/src/views/Apps.vue View File

</template> </template>


<script> <script>
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
import Vue from 'vue'
import VueLocalStorage from 'vue-localstorage'

import AppContent from '@nextcloud/vue/dist/Components/AppContent' import AppContent from '@nextcloud/vue/dist/Components/AppContent'
import AppNavigation from '@nextcloud/vue/dist/Components/AppNavigation' import AppNavigation from '@nextcloud/vue/dist/Components/AppNavigation'
import AppNavigationCounter from '@nextcloud/vue/dist/Components/AppNavigationCounter' import AppNavigationCounter from '@nextcloud/vue/dist/Components/AppNavigationCounter'
import AppSidebar from '@nextcloud/vue/dist/Components/AppSidebar' import AppSidebar from '@nextcloud/vue/dist/Components/AppSidebar'
import AppSidebarTab from '@nextcloud/vue/dist/Components/AppSidebarTab' import AppSidebarTab from '@nextcloud/vue/dist/Components/AppSidebarTab'
import Content from '@nextcloud/vue/dist/Components/Content' import Content from '@nextcloud/vue/dist/Components/Content'
import Vue from 'vue'
import VueLocalStorage from 'vue-localstorage'


import AppList from '../components/AppList' import AppList from '../components/AppList'
import AppDetails from '../components/AppDetails' import AppDetails from '../components/AppDetails'
}, },


watch: { watch: {
category(val, old) {
this.setSearch('')
category() {
this.searchQuery = ''
}, },


app() { app() {
this.$store.dispatch('getGroups', { offset: 0, limit: 5 }) this.$store.dispatch('getGroups', { offset: 0, limit: 5 })
this.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount) this.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)
}, },

mounted() { mounted() {
/**
* Register search
*/
this.appSearch = new OCA.Search(this.setSearch, this.resetSearch)
subscribe('nextcloud:unified-search:search', this.setSearch)
subscribe('nextcloud:unified-search:reset', this.resetSearch)
},
beforeDestroy() {
unsubscribe('nextcloud:unified-search:search', this.setSearch)
unsubscribe('nextcloud:unified-search:reset', this.resetSearch)
}, },


methods: { methods: {
setSearch(query) {
setSearch({ query }) {
this.searchQuery = query this.searchQuery = query
}, },
resetSearch() { resetSearch() {
this.setSearch('')
this.searchQuery = ''
}, },

hideAppDetails() { hideAppDetails() {
this.$router.push({ this.$router.push({
name: 'apps-category', name: 'apps-category',

+ 1
- 1
core/js/dist/install.js
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/install.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/login.js
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/login.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/main.js
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/main.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/maintenance.js
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/maintenance.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/recommendedapps.js
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/recommendedapps.js.map
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/unified-search.js
File diff suppressed because it is too large
View File


+ 1
- 1
core/js/dist/unified-search.js.map
File diff suppressed because it is too large
View File


+ 8
- 12
core/src/components/HeaderMenu.vue View File



<script> <script>
import { directive as ClickOutside } from 'v-click-outside' import { directive as ClickOutside } from 'v-click-outside'
import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
import excludeClickOutsideClasses from '@nextcloud/vue/dist/Mixins/excludeClickOutsideClasses' import excludeClickOutsideClasses from '@nextcloud/vue/dist/Mixins/excludeClickOutsideClasses'


export default { export default {
mounted() { mounted() {
document.addEventListener('keydown', this.onKeyDown) document.addEventListener('keydown', this.onKeyDown)
}, },

beforeMount() {
subscribe(`header-menu-${this.id}-close`, this.closeMenu)
subscribe(`header-menu-${this.id}-open`, this.openMenu)
},

beforeDestroy() { beforeDestroy() {
unsubscribe(`header-menu-${this.id}-close`, this.closeMenu)
unsubscribe(`header-menu-${this.id}-open`, this.openMenu)
document.removeEventListener('keydown', this.onKeyDown)
}, },


methods: { methods: {
this.opened = false this.opened = false
this.$emit('close') this.$emit('close')
this.$emit('update:open', false) this.$emit('update:open', false)
emit(`header-menu-${this.id}-close`)
}, },


/** /**
this.opened = true this.opened = true
this.$emit('open') this.$emit('open')
this.$emit('update:open', true) this.$emit('update:open', true)
emit(`header-menu-${this.id}-open`)
}, },


onKeyDown(event) { onKeyDown(event) {
// If opened and escape pressed, close // If opened and escape pressed, close
if (event.key === 'Escape' && this.opened) { if (event.key === 'Escape' && this.opened) {
event.preventDefault() event.preventDefault()
this.closeMenu()

/** user cancelled the menu by pressing escape */
this.$emit('cancel')

/** we do NOT fire a close event to differentiate cancel and close */
this.opened = false
this.$emit('update:open', false)
} }
}, },
}, },

+ 22
- 3
core/src/views/UnifiedSearch.vue View File

type="search" type="search"
:placeholder="t('core', 'Search {types} …', { types: typesNames.join(', ').toLowerCase() })" :placeholder="t('core', 'Search {types} …', { types: typesNames.join(', ').toLowerCase() })"
@input="onInputDebounced" @input="onInputDebounced"
@keypress.enter.prevent.stop="onInputEnter">
@keypress.enter.prevent.stop="onInputEnter"
@search="onSearch">
<!-- Search filters --> <!-- Search filters -->
<Actions v-if="availableFilters.length > 1" class="unified-search__filters" placement="bottom"> <Actions v-if="availableFilters.length > 1" class="unified-search__filters" placement="bottom">
<ActionButton v-for="type in availableFilters" <ActionButton v-for="type in availableFilters"
this.types = await getTypes() this.types = await getTypes()
}, },
onClose() { onClose() {
this.resetState()
this.query = ''
emit('nextcloud:unified-search:close') emit('nextcloud:unified-search:close')
}, },


/**
* Reset the search state
*/
resetSearch() {
emit('nextcloud:unified-search:reset')
this.query = ''
this.resetState()
},
resetState() { resetState() {
this.cursors = {} this.cursors = {}
this.limits = {} this.limits = {}
}) })
}, },


/**
* Watch the search event on the input
* Used to detect the reset button press
* @param {Event} event the search event
*/
onSearch(event) {
// If value is empty, the reset button has been pressed
if (event.target.value === '') {
this.resetSearch()
}
},

/** /**
* If we have results already, open first one * If we have results already, open first one
* If not, trigger the search again * If not, trigger the search again

Loading…
Cancel
Save