Skip to content

Commit 8dda335

Browse files
Devesh0129Logende
andauthored
Added checkbox UI component to change required props in Schema Diagram (#899)
* Changes made in the parent files * apply formatting changes * css changed , console removed and targeted just the required field * apply formatting changes * final comit * final comit * apply formatting changes * adjust style to avoid linebreak * apply formatting changes --------- Co-authored-by: Devesh0129 <[email protected]> Co-authored-by: Felix Neubauer <[email protected]> Co-authored-by: Logende <[email protected]>
1 parent 1228d9c commit 8dda335

3 files changed

Lines changed: 96 additions & 23 deletions

File tree

meta_configurator/src/components/panels/schema-diagram/SchemaObjectAttribute.vue

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,18 @@ const emit = defineEmits<{
3737
attributeData: SchemaObjectAttributeData,
3838
newType: AttributeTypeChoice
3939
): void;
40+
(
41+
e: 'update_attribute_required',
42+
attributeData: SchemaObjectAttributeData,
43+
required: boolean
44+
): void;
4045
(e: 'delete_element', objectData: SchemaElementData): void;
4146
}>();
4247
48+
function updateRequired() {
49+
emit('update_attribute_required', props.data, props.data.required);
50+
}
51+
4352
const attrName = ref(props.data.name);
4453
const selectedType: Ref<AttributeTypeChoice | undefined> = ref(
4554
determineTypeChoiceBySchema(props.typeChoices, props.data.schema)
@@ -98,7 +107,7 @@ function getHandleTop() {
98107
<span class="vue-flow__node-schemaattribute-type">: {{ props.data.typeDescription }}</span>
99108
</div>
100109

101-
<div v-else>
110+
<div v-else class="vue-flow-attribute-edit-row">
102111
<InputText
103112
type="text"
104113
class="vue-flow-attribute-input-dimensions"
@@ -109,29 +118,40 @@ function getHandleTop() {
109118
@dblclick.stop
110119
@keydown.stop
111120
@keyup.enter="updateAttributeName" />
112-
<span class="text-red-600">{{ props.data.required ? '*' : '' }}</span>
113-
114-
<Select
115-
class="vue-flow-attribute-dropdown"
116-
v-model="selectedType"
117-
:options="typeChoices"
118-
optionLabel="label"
119-
@mousedown.stop
120-
@keydown.stop
121-
@click.stop
122-
@dblclick.stop
123-
placeholder="Select Type" />
124121

125-
<Button
126-
class="vue-flow-attribute-button vue-flow-attribute-input-dimensions"
127-
size="small"
128-
v-tooltip.bottom="'Delete Property'"
129-
@mousedown.stop
130-
@click.stop
131-
@dblclick.stop
132-
@click="_ => deleteAttribute()">
133-
<FontAwesomeIcon :icon="'fa-trash fa-solid'" />
134-
</Button>
122+
<div class="vue-flow-attribute-inline">
123+
<input
124+
type="checkbox"
125+
class="vue-flow-required-checkbox"
126+
v-model="props.data.required"
127+
@change="updateRequired"
128+
@mousedown.stop
129+
@click.stop
130+
@dblclick.stop
131+
@keydown.stop />
132+
133+
<Select
134+
class="vue-flow-attribute-dropdown"
135+
v-model="selectedType"
136+
:options="typeChoices"
137+
optionLabel="label"
138+
@mousedown.stop
139+
@keydown.stop
140+
@click.stop
141+
@dblclick.stop
142+
placeholder="Select Type" />
143+
144+
<Button
145+
class="vue-flow-attribute-button vue-flow-attribute-input-dimensions"
146+
size="small"
147+
v-tooltip.bottom="'Delete Property'"
148+
@mousedown.stop
149+
@click.stop
150+
@dblclick.stop
151+
@click="_ => deleteAttribute()">
152+
<FontAwesomeIcon :icon="'fa-trash fa-solid'" />
153+
</Button>
154+
</div>
135155
</div>
136156

137157
<Handle
@@ -144,6 +164,22 @@ function getHandleTop() {
144164
</template>
145165

146166
<style>
167+
.vue-flow-required-checkbox {
168+
margin: 0 4px;
169+
transform: scale(0.8);
170+
}
171+
172+
.vue-flow-attribute-edit-row {
173+
display: flex;
174+
align-items: center;
175+
}
176+
177+
.vue-flow-attribute-inline {
178+
display: flex;
179+
flex-wrap: nowrap;
180+
align-items: center;
181+
}
182+
147183
.vue-flow__node-schemaattribute {
148184
padding: 0;
149185
}

meta_configurator/src/components/panels/schema-diagram/SchemaObjectNode.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,21 @@ const emit = defineEmits<{
4747
newType: AttributeTypeChoice
4848
): void;
4949
(e: 'add_attribute', objectData: SchemaObjectNodeData): void;
50+
(
51+
e: 'update_attribute_required',
52+
attributeData: SchemaObjectAttributeData,
53+
required: boolean
54+
): void;
5055
}>();
5156
5257
const objectName = ref(props.data.name || '');
5358
5459
const settings = useSettings();
5560
61+
function updateAttributeRequired(attributeData: SchemaObjectAttributeData, required: boolean) {
62+
emit('update_attribute_required', attributeData, required);
63+
}
64+
5665
function isObjectEditable() {
5766
return (isHighlighted() || isAttributeHighlighted()) && settings.value.schemaDiagram.editMode;
5867
}
@@ -212,6 +221,7 @@ function isAttributeHighlighted() {
212221
@select_element="clickedAttribute"
213222
@update_attribute_name="updateAttributeName"
214223
@update_attribute_type="updateAttributeType"
224+
@update_attribute_required="updateAttributeRequired"
215225
@delete_element="deleteElement" />
216226

217227
<div v-if="isObjectEditable()">

meta_configurator/src/components/panels/schema-diagram/VueFlowPanel.vue

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,32 @@ function updateAttributeName(attributeData: SchemaNodeData, oldName: string, new
313313
// TODO: when renaming happens, also force update in the GUI
314314
}
315315
316+
function updateAttributeRequired(attributeData: SchemaObjectAttributeData, required: boolean) {
317+
const attributePath = attributeData.absolutePath;
318+
const attributeName = attributeData.name;
319+
320+
const parentObjectPath = attributePath.slice(0, -2);
321+
const parentObject = structuredClone(schemaData.dataAt(parentObjectPath));
322+
323+
if (!parentObject.required) {
324+
parentObject.required = [];
325+
}
326+
327+
const requiredList = parentObject.required;
328+
329+
const index = requiredList.indexOf(attributeName);
330+
331+
if (required && index === -1) {
332+
requiredList.push(attributeName);
333+
}
334+
335+
if (!required && index !== -1) {
336+
requiredList.splice(index, 1);
337+
}
338+
339+
schemaData.setDataAt(parentObjectPath, parentObject);
340+
}
341+
316342
function updateAttributeType(
317343
attributeData: SchemaObjectAttributeData,
318344
newType: AttributeTypeChoice
@@ -428,6 +454,7 @@ function updateExternalReferenceValue(
428454
@update_object_name="updateObjectOrEnumName"
429455
@update_attribute_name="updateAttributeName"
430456
@update_attribute_type="updateAttributeType"
457+
@update_attribute_required="updateAttributeRequired"
431458
@delete_element="deleteElement"
432459
@add_attribute="addAttribute"
433460
@extract_inlined_element="extractInlinedElement"

0 commit comments

Comments
 (0)