Form overhaul: Reference Form

This commit is contained in:
Stefan Zermatten
2023-05-16 21:50:50 +02:00
parent bf6fb358e6
commit 4c34986fb7
5 changed files with 77 additions and 44 deletions

View File

@@ -21,7 +21,7 @@ const updateReferenceNode = new ValidatedMethod({
numRequests: 5,
timeInterval: 5000,
},
run({_id}) {
run({ _id }) {
let userId = this.userId;
let node = LibraryNodes.findOne(_id);
assertDocEditPermission(node, userId);
@@ -29,15 +29,15 @@ const updateReferenceNode = new ValidatedMethod({
},
});
function writeCache(_id, cache){
LibraryNodes.update(_id, {$set: {cache}}, {
selector: {type: 'reference'},
function writeCache(_id, cache) {
LibraryNodes.update(_id, { $set: { cache } }, {
selector: { type: 'reference' },
});
}
function updateReferenceNodeWork(node, userId){
function updateReferenceNodeWork(node, userId) {
let cache = {}
if (!node.ref){
if (!node.ref?.collection || !node.ref?.id) {
writeCache(node._id, cache);
return;
}
@@ -45,20 +45,20 @@ function updateReferenceNodeWork(node, userId){
try {
doc = fetchDocByRef(node.ref);
if (doc.removed) throw 'Property has been deleted';
if (doc.ancestors[0].id !== node.ancestors[0].id){
if (doc.ancestors[0].id !== node.ancestors[0].id) {
library = fetchDocByRef(doc.ancestors[0]);
assertViewPermission(library, userId)
}
} catch(e){
cache = {error: e.reason || e.message || e.toString()}
} catch (e) {
cache = { error: e.reason || e.message || e.toString() }
writeCache(node._id, cache);
return;
}
cache = {
node: doc,
};
if (library){
cache.library = {name: library.name};
if (library) {
cache.library = { name: library.name };
}
writeCache(node._id, cache);
}

View File

@@ -59,7 +59,7 @@
>
<v-tab-item :disabled="!!forcedType">
<property-selector
no-library-only-props
:no-library-only-props="!showLibraryOnlyProps"
:parent-type="parentDoc && parentDoc.type"
@select="e => type = e"
/>
@@ -228,6 +228,7 @@ export default {
default: undefined,
},
hideLibraryTab: Boolean,
showLibraryOnlyProps: Boolean,
},
reactiveProvide: {
name: 'context',

View File

@@ -88,7 +88,7 @@
// If the top dialog can't be closed with the backdrop, shake shake
const topDialog = this.dialogs[this.dialogs.length - 1];
if (topDialog.data.noBackdropClose) {
if (topDialog?.data?.noBackdropClose) {
this.shakeTopDialog();
return;
}

View File

@@ -307,6 +307,7 @@ export default {
hideLibraryTab: true,
suggestedType,
noBackdropClose: true,
showLibraryOnlyProps: true,
},
callback(result){
if (!result) return;

View File

@@ -1,34 +1,65 @@
<template lang="html">
<div class="folder-form layout justify-start wrap">
<property-field
<div class="reference-form">
<v-row dense>
<v-col cols="12">
<outlined-input
v-ripple
name="Linked Property"
class="pa-4 mb-6"
data-id="change-ref"
style="cursor: pointer;"
@click="changeReference"
>
<v-input
:label="model.cache && model.cache.node ? '' : 'Linked Property'"
style="overflow: hidden;"
readonly
outlined
persistent-hint
:loading="linkLoading"
:value="
model.cache.node && model.cache.node.name ||
model.ref && model.ref.id
"
:hint="model.cache.library && model.cache.library.name"
:error-messages="model.cache.error || errors.ref"
prepend-icon="mdi-vector-link"
append-icon="mdi-refresh"
@click:append.stop="updateReferenceNode"
<v-progress-circular
v-if="linkLoading"
indeterminate
/>
<div
v-else
class="d-flex align-center"
>
<v-icon class="mr-4">
mdi-vector-link
</v-icon>
<div class="flex-grow-1">
<tree-node-view
v-if="model && model.cache && model.cache.node"
:model="model.cache.node"
/>
</v-input>
</property-field>
<div v-else>
{{ model.cache.node && model.cache.node.name || model.ref && model.ref.id }}
</div>
<div
v-if="model.cache.library && model.cache.library.name"
class="text-caption"
>
{{ model.cache.library && model.cache.library.name }}
</div>
<div
v-if="model.cache.error || errors.ref"
class="error--text"
>
{{ model.cache.error || errors.ref }}
</div>
</div>
<v-btn
class="ml-4"
icon
@click.stop="updateReferenceNode"
>
<v-icon>
mdi-refresh
</v-icon>
</v-btn>
</div>
</outlined-input>
</v-col>
</v-row>
<form-sections
v-if="$slots.default"
>
<slot />
</form-sections>
</div>
</template>
@@ -36,12 +67,12 @@
import TreeNodeView from '/imports/client/ui/properties/treeNodeViews/TreeNodeView.vue';
import propertyFormMixin from '/imports/client/ui/properties/forms/shared/propertyFormMixin.js';
import updateReferenceNode from '/imports/api/library/methods/updateReferenceNode.js';
import PropertyField from '/imports/client/ui/properties/viewers/shared/PropertyField.vue';
import OutlinedInput from '/imports/client/ui/properties/viewers/shared/OutlinedInput.vue';
export default {
components: {
TreeNodeView,
PropertyField,
OutlinedInput,
},
mixins: [propertyFormMixin],
data(){return {