import TabAwareWidget from "./tab_aware_widget.js"; import AttributeDetailWidget from "./attribute_detail.js"; import attributeRenderer from "../services/attribute_renderer.js"; import AttributeEditorWidget from "./attribute_editor.js"; import options from '../services/options.js'; const TPL = `





`; export default class AttributeListWidget extends TabAwareWidget { constructor() { super(); this.attributeDetailWidget = new AttributeDetailWidget().setParent(this); this.attributeEditorWidget = new AttributeEditorWidget(this.attributeDetailWidget).setParent(this); this.child(this.attributeEditorWidget, this.attributeDetailWidget); } doRender() { this.$widget = $(TPL); this.$attrDisplay = this.$widget.find('.attr-display'); this.$attrDisplay.toggle(options.is('attributeListExpanded')); this.$ownedExpander = this.$widget.find('.attr-owned-expander'); this.$ownedExpander.on('click', async () => { const collapse = this.$attrDisplay.is(":visible"); await options.save('attributeListExpanded', !collapse); this.triggerEvent(`attributeListCollapsedStateChanged`, {collapse}); }); this.$ownedExpanderText = this.$ownedExpander.find('.attr-expander-text'); this.$inheritedAttributes = this.$widget.find('.inherited-attributes'); this.$inheritedExpander = this.$widget.find('.attr-inherited-expander'); this.$inheritedExpander.on('click', () => { if (this.$inheritedAttributes.is(":visible")) { this.$inheritedAttributes.slideUp(200); } else { this.$inheritedAttributes.slideDown(200); } }); this.$inheritedExpanderText = this.$inheritedExpander.find('.attr-expander-text'); this.$inheritedEmptyExpander = this.$widget.find('.attr-inherited-empty-expander'); this.$widget.find('.attr-editor-placeholder').replaceWith(this.attributeEditorWidget.render()); this.$widget.append(this.attributeDetailWidget.render()); } async refreshWithNote(note) { const ownedAttributes = note.getOwnedAttributes().filter(attr => !attr.isAutoLink); this.$ownedExpanderText.text(ownedAttributes.length + ' owned ' + this.attrPlural(ownedAttributes.length)); const inheritedAttributes = note.getAttributes().filter(attr => attr.noteId !== this.noteId); if (inheritedAttributes.length === 0) { this.$inheritedExpander.hide(); this.$inheritedEmptyExpander.show(); } else { this.$inheritedExpander.show(); this.$inheritedEmptyExpander.hide(); } this.$inheritedExpanderText.text(inheritedAttributes.length + ' inherited ' + this.attrPlural(inheritedAttributes.length)); this.$inheritedAttributes.empty(); await this.renderInheritedAttributes(inheritedAttributes, this.$inheritedAttributes); } attrPlural(number) { return 'attribute' + (number === 1 ? '' : 's'); } renderInheritedAttributes(attributes, $container) { for (const attribute of attributes) { const $span = $("") .on('click', e => this.attributeDetailWidget.showAttributeDetail({ attribute: { noteId: attribute.noteId, type: attribute.type, name: attribute.name, value: attribute.value }, isOwned: false, x: e.pageX, y: e.pageY })); $container.append($span); attributeRenderer.renderAttribute(attribute, $span, false); } } async saveAttributesCommand() { await this.attributeEditorWidget.save(); } updateAttributeListCommand({attributes}) { this.attributeEditorWidget.updateAttributeList(attributes); } /** * This event is used to synchronize collapsed state of all the tab-cached widgets since they are all rendered * separately but should behave uniformly for the user. */ attributeListCollapsedStateChangedEvent({collapse}) { if (collapse) { this.$attrDisplay.slideUp(200); } else { this.$attrDisplay.slideDown(200); } } }