Skip to content

Commit

Permalink
enh: clean up
Browse files Browse the repository at this point in the history
Signed-off-by: Cleopatra Enjeck M <patrathewhiz@gmail.com>
  • Loading branch information
enjeck committed Apr 19, 2024
1 parent 9eff365 commit 2f8a70e
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 61 deletions.
1 change: 0 additions & 1 deletion lib/Service/PermissionsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@ public function canManageContextById(int $contextId, ?string $userId = null): bo
}

return $context->getOwnerId() === $userId || $this->canManageContext($context, $userId);
;
}

/**
Expand Down
20 changes: 4 additions & 16 deletions src/modules/modals/CreateContext.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
</div>
<NcContextResource :resources.sync="resources" :receivers.sync="receivers" />
</div>
<div class="row space-R">
<div class="row space-R row space-T">
<div class="fix-col-4 end">
<NcButton type="primary" :aria-label="t('tables', 'Create application')" @click="submit">
{{ t('tables', 'Create application') }}
Expand All @@ -57,7 +57,7 @@ import '@nextcloud/dialogs/dist/index.css'
import NcContextResource from '../../shared/components/ncContextResource/NcContextResource.vue'
import NcIconPicker from '../../shared/components/ncIconPicker/NcIconPicker.vue'
import svgHelper from '../../shared/components/ncIconPicker/mixins/svgHelper.js'
import { PERMISSION_READ, PERMISSION_CREATE, PERMISSION_UPDATE, PERMISSION_DELETE } from '../../shared/constants.js'
import permissionBitmask from '../../shared/components/ncContextResource/mixins/permissionBitmask.js'
export default {
name: 'CreateContext',
Expand All @@ -68,7 +68,7 @@ export default {
NcIconSvgWrapper,
NcContextResource,
},
mixins: [svgHelper],
mixins: [svgHelper, permissionBitmask],
props: {
showModal: {
type: Boolean,
Expand All @@ -88,10 +88,6 @@ export default {
description: '',
resources: [],
receivers: [],
PERMISSION_READ,
PERMISSION_CREATE,
PERMISSION_UPDATE,
PERMISSION_DELETE,
}
},
watch: {
Expand Down Expand Up @@ -131,20 +127,12 @@ export default {
}
}
},
getPermissionBitmaskFromBools(permissionRead, permissionCreate, permissionUpdate, permissionDelete) {
const read = permissionRead ? PERMISSION_READ : 0
const create = permissionCreate ? PERMISSION_CREATE : 0
const update = permissionUpdate ? PERMISSION_UPDATE : 0
const del = permissionDelete ? PERMISSION_DELETE : 0
return read | create | update | del
},
async sendNewContextToBE() {
const dataResources = this.resources.map(resource => {
return {
id: parseInt(resource.id),
type: parseInt(resource.nodeType),
// TODO get right permissions for the node
permissions: this.getPermissionBitmaskFromBools(true /* ensure permission is always true */, resource.permissionCreate, resource.permissionUpdate, resource.permissionDelete),
permissions: this.getPermissionBitmaskFromBools(true /* ensure read permission is always true */, resource.permissionCreate, resource.permissionUpdate, resource.permissionDelete),
}
})
const data = {
Expand Down
24 changes: 9 additions & 15 deletions src/modules/modals/EditContext.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
<NcContextResource :resources.sync="resources" :receivers.sync="receivers" />
</div>

<div class="row space-R">
<div class="row space-R row space-T">
<div class="fix-col-4 end">
<NcButton type="primary" @click="submit">
{{ t('tables', 'Save') }}
Expand All @@ -50,12 +50,14 @@
<script>
import { NcModal, NcButton, NcIconSvgWrapper } from '@nextcloud/vue'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { getCurrentUser } from '@nextcloud/auth'
import '@nextcloud/dialogs/dist/index.css'
import { mapGetters, mapState } from 'vuex'
import NcContextResource from '../../shared/components/ncContextResource/NcContextResource.vue'
import NcIconPicker from '../../shared/components/ncIconPicker/NcIconPicker.vue'
import { NODE_TYPE_TABLE, NODE_TYPE_VIEW, PERMISSION_READ, PERMISSION_CREATE, PERMISSION_UPDATE, PERMISSION_DELETE } from '../../shared/constants.js'
import svgHelper from '../../shared/components/ncIconPicker/mixins/svgHelper.js'
import permissionBitmask from '../../shared/components/ncContextResource/mixins/permissionBitmask.js'
export default {
name: 'EditContext',
Expand All @@ -66,7 +68,7 @@ export default {
NcIconSvgWrapper,
NcContextResource,
},
mixins: [svgHelper],
mixins: [svgHelper, permissionBitmask],
props: {
showModal: {
type: Boolean,
Expand All @@ -92,6 +94,7 @@ export default {
PERMISSION_CREATE,
PERMISSION_UPDATE,
PERMISSION_DELETE,
}
},
computed: {
Expand Down Expand Up @@ -128,7 +131,6 @@ export default {
this.reset()
this.$emit('close')
},
// TODO show edited changes without having to reload
async submit() {
if (this.title === '') {
showError(t('tables', 'Cannot update context. Title is missing.'))
Expand All @@ -138,8 +140,7 @@ export default {
return {
id: parseInt(resource.id),
type: parseInt(resource.nodeType),
// TODO get right permissions for the node
permissions: this.getPermissionBitmaskFromBools(true /* ensure permission is always true */, resource.permissionCreate, resource.permissionUpdate, resource.permissionDelete),
permissions: this.getPermissionBitmaskFromBools(true /* ensure read permission is always true */, resource.permissionCreate, resource.permissionUpdate, resource.permissionDelete),
}
})
const data = {
Expand Down Expand Up @@ -167,26 +168,19 @@ export default {
this.receivers = context ? this.getContextReceivers(context) : []
},
getContextReceivers(context) {
const sharing = Object.values(context.sharing)
let sharing = Object.values(context.sharing)
sharing = sharing.filter((share) => getCurrentUser().uid !== share.receiver)
const receivers = sharing.map((share) => {
return {
user: share.receiver,
displayName: share.receiver,
icon: 'icon-user',
icon: share.receiver_type === 'user' ? 'icon-user' : 'icon-group',
isUser: share.receiver_type === 'user',
key: share.receiver_type + '-' + share.receiver,
}
})
return receivers
},
// TODO use mixin or similar for reusability
getPermissionBitmaskFromBools(permissionRead, permissionCreate, permissionUpdate, permissionDelete) {
const read = permissionRead ? PERMISSION_READ : 0
const create = permissionCreate ? PERMISSION_CREATE : 0
const update = permissionUpdate ? PERMISSION_UPDATE : 0
const del = permissionDelete ? PERMISSION_DELETE : 0
return read | create | update | del
},
getPermissionFromBitmask(bitmask, permission) {
return !!(bitmask & permission)
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<template>
<div>
<h3>{{ t('tables', 'Shared resources permissions') }}</h3>
<div class="col-4">
{{ t('tables', 'Shared resources permissions') }}
</div>
<ul v-if="resources && resources.length > 0" class="shares-list">
<div v-for="resource in resources" :key="resource.key" class="row">
<div class="fix-col-2">
Expand All @@ -17,18 +19,18 @@
{{ t('tables', 'Read resource') }}
</NcActionCheckbox>
<NcActionCheckbox :checked.sync="resource.permissionCreate"
@check="updatePermission(resource, 'create', true)"
@uncheck="updatePermission(resource, 'create', false)">
@check="updatePermission(resource, 'permissionCreate', true)"
@uncheck="updatePermission(resource, 'permissionCreate', false)">
{{ t('tables', 'Create resource') }}
</NcActionCheckbox>
<NcActionCheckbox :checked.sync="resource.permissionUpdate"
@check="updatePermission(resource, 'update', true)"
@uncheck="updatePermission(resource, 'update', false)">
@check="updatePermission(resource, 'permissionUpdate', true)"
@uncheck="updatePermission(resource, 'permissionUpdate', false)">
{{ t('tables', 'Update resource') }}
</NcActionCheckbox>
<NcActionCheckbox :checked.sync="resource.permissionDelete"
@check="updatePermission(resource, 'delete', true)"
@uncheck="updatePermission(resource, 'delete', false)">
@check="updatePermission(resource, 'permissionDelete', true)"
@uncheck="updatePermission(resource, 'permissionDelete', false)">
{{ t('tables', 'Delete resource') }}
</NcActionCheckbox>
</NcActions>
Expand Down
4 changes: 3 additions & 1 deletion src/shared/components/ncContextResource/ResourceSharees.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<template>
<div class="row space-B">
<h3>{{ t('tables', 'Share with accounts or groups') }}</h3>
<div class="col-4">
{{ t('tables', 'Share with accounts') }}
</div>
<NcSelect v-model="preExistingSharees" style="width: 100%;" :loading="loading" :options="options"
:placeholder="getPlaceholder()"
:searchable="true" :get-option-key="(option) => option.key"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { PERMISSION_READ, PERMISSION_CREATE, PERMISSION_UPDATE, PERMISSION_DELETE } from '../../../constants.js'

export default {
data() {
return {
PERMISSION_READ,
PERMISSION_CREATE,
PERMISSION_UPDATE,
PERMISSION_DELETE,
}
},
methods: {
getPermissionBitmaskFromBools(permissionRead, permissionCreate, permissionUpdate, permissionDelete) {
const read = permissionRead ? PERMISSION_READ : 0
const create = permissionCreate ? PERMISSION_CREATE : 0
const update = permissionUpdate ? PERMISSION_UPDATE : 0
const del = permissionDelete ? PERMISSION_DELETE : 0
return read | create | update | del
},
},
}
44 changes: 23 additions & 21 deletions src/store/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -328,26 +328,32 @@ export default new Vuex.Store({
nodeId: id,
displayMode: 2,
}
// TODO use try catch
for (const receiver of receivers) {
share.receiverType = receiver.isUser ? 'user' : 'group'
share.receiver = receiver.user
// Avoid duplicate shares by checking if share exists first
const existingShare = previousReceivers.find((p) => p.receiver === share.receiver && p.receiver_type === share.receiverType)
if (!existingShare) {
await axios.post(generateUrl('/apps/tables/share'), share)
try {
for (const receiver of receivers) {
share.receiverType = receiver.isUser ? 'user' : 'group'
share.receiver = receiver.user
// Avoid duplicate shares by checking if share exists first
const existingShare = previousReceivers.find((p) => p.receiver === share.receiver && p.receiver_type === share.receiverType)
if (!existingShare) {
await axios.post(generateUrl('/apps/tables/share'), share)
}
}
} catch (e) {
displayError(e, t('tables', 'Could not add context share.'))
}

// If there's a previous share that wasn't maintained, delete it
for (const previousReceiver of previousReceivers) {
const currentShare = receivers.find((r) => {
const receiverType = r.isUser ? 'user' : 'group'
return r.user === previousReceiver.receiver && receiverType === previousReceiver.receiver_type
})
if (!currentShare) {
await axios.delete(generateUrl('/apps/tables/share/' + previousReceiver.share_id))
try {
// If there's a previous share that wasn't maintained, delete it
for (const previousReceiver of previousReceivers) {
const currentShare = receivers.find((r) => {
const receiverType = r.isUser ? 'user' : 'group'
return r.user === previousReceiver.receiver && receiverType === previousReceiver.receiver_type
})
if (!currentShare) {
await axios.delete(generateUrl('/apps/tables/share/' + previousReceiver.share_id))
}
}
} catch (e) {
displayError(e, t('tables', 'Could not remove context share.'))
}
},
async insertNewContext({ commit, state, dispatch }, { data, receivers }) {
Expand Down Expand Up @@ -493,10 +499,6 @@ export default new Vuex.Store({
return true
},

// TODO, maybe. For shared contexts, need to fetch and store associated context resources
async loadContextResources({ state, commit, dispatch }, { id }) {
},

async removeTable({ state, commit }, { tableId }) {
try {
await axios.delete(generateUrl('/apps/tables/table/' + tableId))
Expand Down

0 comments on commit 2f8a70e

Please sign in to comment.