Skip item pane section render when not in selected tab
This commit is contained in:
parent
8b083aa426
commit
4fc8850f1e
2 changed files with 73 additions and 5 deletions
|
@ -178,6 +178,18 @@
|
||||||
this.forceUpdateSideNav();
|
this.forceUpdateSideNav();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get skipRender() {
|
||||||
|
return this._skipRender;
|
||||||
|
}
|
||||||
|
|
||||||
|
set skipRender(val) {
|
||||||
|
this._skipRender = val;
|
||||||
|
let panes = this.getPanes();
|
||||||
|
for (let pane of [this._header, ...panes]) {
|
||||||
|
pane.skipRender = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static get observedAttributes() {
|
static get observedAttributes() {
|
||||||
return ['pinnedPane'];
|
return ['pinnedPane'];
|
||||||
}
|
}
|
||||||
|
@ -198,12 +210,18 @@
|
||||||
});
|
});
|
||||||
this._initIntersectionObserver();
|
this._initIntersectionObserver();
|
||||||
|
|
||||||
this._unregisterID = Zotero.Notifier.registerObserver(this, ['item', 'itempane'], 'ItemDetails');
|
this._unregisterID = Zotero.Notifier.registerObserver(
|
||||||
|
this, ['item', 'itempane', 'tab'], 'ItemDetails');
|
||||||
|
|
||||||
this._disableScrollHandler = false;
|
this._disableScrollHandler = false;
|
||||||
this._pinnedPaneMinScrollHeight = 0;
|
this._pinnedPaneMinScrollHeight = 0;
|
||||||
|
|
||||||
this._lastUpdateCustomSection = 0;
|
this._lastUpdateCustomSection = 0;
|
||||||
|
|
||||||
|
// If true, will render on tab select
|
||||||
|
this._pendingRender = false;
|
||||||
|
// If true, will skip render
|
||||||
|
this._skipRender = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
|
@ -220,6 +238,13 @@
|
||||||
if (!this.initialized || !this.item) {
|
if (!this.initialized || !this.item) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.skipRender) {
|
||||||
|
this._pendingRender = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._pendingRender = false;
|
||||||
|
|
||||||
let item = this.item;
|
let item = this.item;
|
||||||
Zotero.debug('Viewing item');
|
Zotero.debug('Viewing item');
|
||||||
this._isRendering = true;
|
this._isRendering = true;
|
||||||
|
@ -317,6 +342,9 @@
|
||||||
elem.registerSectionButton(buttonOptions);
|
elem.registerSectionButton(buttonOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this._pendingRender) {
|
||||||
|
elem.pendingRender = true;
|
||||||
|
}
|
||||||
this._paneParent.append(elem);
|
this._paneParent.append(elem);
|
||||||
elem.setL10nID(header.l10nID);
|
elem.setL10nID(header.l10nID);
|
||||||
elem.setL10nArgs(header.l10nArgs);
|
elem.setL10nArgs(header.l10nArgs);
|
||||||
|
@ -333,13 +361,17 @@
|
||||||
this._header.renderCustomHead(callback);
|
this._header.renderCustomHead(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
notify = async (action, type, _ids, _extraData) => {
|
notify = async (action, type, ids, _extraData) => {
|
||||||
if (action == 'refresh' && this.item) {
|
if (action == 'refresh' && this.item) {
|
||||||
if (type == 'itempane') {
|
if (type == 'itempane') {
|
||||||
this.renderCustomSections();
|
this.renderCustomSections();
|
||||||
}
|
}
|
||||||
await this.render();
|
await this.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (action == 'select' && type == 'tab') {
|
||||||
|
this._handleTabSelect(ids);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
getPane(id) {
|
getPane(id) {
|
||||||
|
@ -596,6 +628,17 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_handleTabSelect(tabIDs) {
|
||||||
|
if (!this.tabID || typeof Zotero_Tabs === 'undefined') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let isTabSelected = tabIDs.includes(this.tabID);
|
||||||
|
this.skipRender = !isTabSelected;
|
||||||
|
if (isTabSelected && this._pendingRender) {
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("item-details", ItemDetails);
|
customElements.define("item-details", ItemDetails);
|
||||||
|
|
|
@ -60,6 +60,13 @@ class ItemPaneSectionElementBase extends XULElementBase {
|
||||||
this.setAttribute('tabType', tabType);
|
this.setAttribute('tabType', tabType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_syncRenderPending = false;
|
||||||
|
|
||||||
|
_asyncRenderPending = false;
|
||||||
|
|
||||||
|
/** Controlled by parent element */
|
||||||
|
skipRender = false;
|
||||||
|
|
||||||
get open() {
|
get open() {
|
||||||
return this._section?.open || false;
|
return this._section?.open || false;
|
||||||
}
|
}
|
||||||
|
@ -105,11 +112,25 @@ class ItemPaneSectionElementBase extends XULElementBase {
|
||||||
*/
|
*/
|
||||||
_isAlreadyRendered(type = "sync") {
|
_isAlreadyRendered(type = "sync") {
|
||||||
let key = `_${type}RenderItemID`;
|
let key = `_${type}RenderItemID`;
|
||||||
let cachedFlag = this[key];
|
let pendingKey = `_${type}RenderPending`;
|
||||||
if (cachedFlag && this.item?.id == cachedFlag) {
|
|
||||||
|
let renderFlag = this[key];
|
||||||
|
let pendingFlag = this[pendingKey];
|
||||||
|
|
||||||
|
let isRendered = renderFlag && this.item?.id == renderFlag;
|
||||||
|
if (this.skipRender) {
|
||||||
|
if (!isRendered) {
|
||||||
|
this[pendingKey] = true;
|
||||||
|
}
|
||||||
|
// Skip render
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pendingFlag && renderFlag && this.item?.id == renderFlag) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
this[key] = this.item.id;
|
this[key] = this.item.id;
|
||||||
|
this[pendingKey] = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +141,11 @@ class ItemPaneSectionElementBase extends XULElementBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
async _forceRenderAll() {
|
async _forceRenderAll() {
|
||||||
if (this.hidden) return;
|
if (this.hidden || this.skipRender) {
|
||||||
|
this._syncRenderPending = true;
|
||||||
|
this._asyncRenderPending = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
this._resetRenderedFlags();
|
this._resetRenderedFlags();
|
||||||
if (this.render) this.render();
|
if (this.render) this.render();
|
||||||
if (this.asyncRender) await this.asyncRender();
|
if (this.asyncRender) await this.asyncRender();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue