From f9dda0e625ed81b66734cdcec9f7bb93624fc34e Mon Sep 17 00:00:00 2001 From: Aditya Thakral Date: Mon, 29 Jun 2020 17:55:12 -0400 Subject: [PATCH 1/3] Dont show add button if additionalProperties is false --- src/vs/workbench/contrib/preferences/browser/settingsTree.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index eba683f1cc5..d938f118cdd 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -1080,7 +1080,7 @@ export class SettingObjectRenderer extends AbstractSettingRenderer implements IT template.objectWidget.setValue(items, { showAddButton: ( - isDefined(dataElement.setting.objectAdditionalProperties) || + typeof dataElement.setting.objectAdditionalProperties === 'object' || isDefined(dataElement.setting.objectPatternProperties) || !areAllPropertiesDefined(Object.keys(dataElement.setting.objectProperties ?? {}), items) ), From 900ee6973c5935768fe1a957edbae3515b123ce5 Mon Sep 17 00:00:00 2001 From: Aditya Thakral Date: Mon, 29 Jun 2020 18:23:05 -0400 Subject: [PATCH 2/3] Optimistic updates for object renderer --- .../contrib/preferences/browser/settingsTree.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index d938f118cdd..cb2ed4ae5b2 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -1035,25 +1035,30 @@ export class SettingObjectRenderer extends AbstractSettingRenderer implements IT const defaultValue: Record = template.context.defaultValue; const scopeValue: Record = template.context.scopeValue; const newValue: Record = {}; + let newItems: IObjectDataItem[] = []; - template.objectWidget.items.forEach(item => { + template.objectWidget.items.forEach((item, idx) => { // Item was updated - if (isDefined(e.item) && e.originalItem.key.data === item.key.data) { + if (isDefined(e.item) && e.targetIndex === idx) { newValue[e.item.key.data] = e.item.value.data; + newItems.push(e.item); } - // All remaining items - else { + // All remaining items, but skip the one that we just updated + else if (isUndefinedOrNull(e.item) || e.item.key.data !== item.key.data) { newValue[item.key.data] = item.value.data; + newItems.push(item); } }); // Item was deleted if (isUndefinedOrNull(e.item)) { delete newValue[e.originalItem.key.data]; + newItems = newItems.filter(item => item.key.data !== e.originalItem.key.data); } // New item was added else if (template.objectWidget.isItemNew(e.originalItem)) { newValue[e.item.key.data] = e.item.value.data; + newItems.push(e.item); } Object.entries(newValue).forEach(([key, value]) => { @@ -1068,6 +1073,8 @@ export class SettingObjectRenderer extends AbstractSettingRenderer implements IT value: Object.keys(newValue).length === 0 ? undefined : newValue, type: template.context.valueType }); + + template.objectWidget.setValue(newItems); } } From 03241524b0aa939925a1ebd9765111129ded01c8 Mon Sep 17 00:00:00 2001 From: Aditya Thakral Date: Mon, 29 Jun 2020 18:40:56 -0400 Subject: [PATCH 3/3] Always show header --- .../preferences/browser/settingsWidgets.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index 142084149e8..70251efd0e1 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -735,19 +735,15 @@ export class ObjectSettingWidget extends AbstractListSettingWidget 0) { - const header = $('.setting-list-row-header'); - const keyHeader = DOM.append(header, $('.setting-list-object-key')); - const valueHeader = DOM.append(header, $('.setting-list-object-value')); - const { keyHeaderText, valueHeaderText } = this.getLocalizedStrings(); + const header = $('.setting-list-row-header'); + const keyHeader = DOM.append(header, $('.setting-list-object-key')); + const valueHeader = DOM.append(header, $('.setting-list-object-value')); + const { keyHeaderText, valueHeaderText } = this.getLocalizedStrings(); - keyHeader.textContent = keyHeaderText; - valueHeader.textContent = valueHeaderText; + keyHeader.textContent = keyHeaderText; + valueHeader.textContent = valueHeaderText; - return header; - } - - return; + return header; } protected renderItem(item: IObjectDataItem): HTMLElement {