fix(xo-web/New VM): template selector won't load (#3565)

Fixes #3265
This commit is contained in:
Rajaa.BARHTAOUI 2019-04-12 14:51:13 +02:00 committed by Pierre Donias
parent a03dcbbf55
commit 875681b8ce
3 changed files with 50 additions and 28 deletions

View File

@ -4,6 +4,8 @@
### Bug fixes
- [Self/New VM] Fix missing templates when refreshing page [#3265](https://github.com/vatesfr/xen-orchestra/issues/3265) (PR [#3565](https://github.com/vatesfr/xen-orchestra/pull/3565))
### Released packages
- xo-server v5.40.0

View File

@ -275,13 +275,13 @@ const _getPermissionsPredicate = invoke(() => {
}
)
return state => {
return (state, props, useResourceSet) => {
const user = getUser(state)
if (!user) {
return false
}
if (user.permission === 'admin') {
if (user.permission === 'admin' || useResourceSet) {
return // No predicate means no filtering.
}

View File

@ -79,14 +79,15 @@ import {
getCoresPerSocketPossibilities,
generateReadableRandomString,
resolveIds,
resolveResourceSet,
} from 'utils'
import {
createFilter,
createSelector,
createFinder,
createGetObject,
createGetObjectsOfType,
createSelector,
getIsPoolAdmin,
getResolvedResourceSets,
getUser,
} from 'selectors'
@ -221,25 +222,39 @@ class Vif extends BaseComponent {
resourceSets: subscribeResourceSets,
user: subscribeCurrentUser,
})
@connectStore(() => ({
isAdmin: createSelector(
@connectStore(() => {
const getIsAdmin = createSelector(
getUser,
user => user && user.permission === 'admin'
),
isPoolAdmin: getIsPoolAdmin,
networks: createGetObjectsOfType('network').sort(),
pool: createGetObject((_, props) => props.location.query.pool),
pools: createGetObjectsOfType('pool'),
templates: createGetObjectsOfType('VM-template').sort(),
userSshKeys: createSelector(
)
const getNetworks = createGetObjectsOfType('network').sort()
const getPool = createGetObject((_, props) => props.location.query.pool)
const getPools = createGetObjectsOfType('pool')
const getSrs = createGetObjectsOfType('SR')
const getTemplates = createGetObjectsOfType('VM-template').sort()
const getUserSshKeys = createSelector(
(_, props) => {
const user = props.user
return user && user.preferences && user.preferences.sshKeys
},
keys => keys
),
srs: createGetObjectsOfType('SR'),
}))
)
return (state, props) => ({
isAdmin: getIsAdmin(state, props),
isPoolAdmin: getIsPoolAdmin(state, props),
networks: getNetworks(state, props),
pool: getPool(state, props),
pools: getPools(state, props),
resolvedResourceSets: getResolvedResourceSets(
state,
props,
props.pool === undefined // to get objects as a self user
),
srs: getSrs(state, props),
templates: getTemplates(state, props),
userSshKeys: getUserSshKeys(state, props),
})
})
@injectIntl
export default class NewVm extends BaseComponent {
static contextTypes = {
@ -259,19 +274,24 @@ export default class NewVm extends BaseComponent {
this._reset()
}
_getResourceSet = () => {
const {
location: {
query: { resourceSet: resourceSetId },
},
resourceSets,
} = this.props
return resourceSets && find(resourceSets, ({ id }) => id === resourceSetId)
}
_getResourceSet = createFinder(
() => this.props.resourceSets,
createSelector(
() => this.props.location.query.resourceSet,
resourceSetId => resourceSet =>
resourceSet !== undefined ? resourceSetId === resourceSet.id : undefined
)
)
_getResolvedResourceSet = createSelector(
this._getResourceSet,
resolveResourceSet
_getResolvedResourceSet = createFinder(
() => this.props.resolvedResourceSets,
createSelector(
this._getResourceSet,
resourceSet =>
resourceSet !== undefined
? resolvedResourceSet => resolvedResourceSet.id === resourceSet.id
: false
)
)
// Utils -----------------------------------------------------------------------