| 2109 | 2107 | formatNavigator: PAGINATION_TEMPLATE, |
| 2110 | 2108 | showNavigator: true, |
| 2111 | 2109 | callback: async function (/** @type {object[]} */ page) { |
| 2112 | | - // We save costly performance by removing all events before emptying. Because we know there are no relevant event handlers reacting on removing elements |
| 2110 | + try { |
| 2113 | | - // This prevents jQuery from actually going through all registered events on the controls for each entry when removing it |
| 2111 | + // Prevent saveWorldInfo from firing timeouts while rendering the list |
| 2114 | | - //worldEntriesList.find('*').off(); |
| 2112 | + isSaveWorldInfoDisabled = true; |
| 2115 | 2113 | clearEntryList(); |
| 2116 | | - //worldEntriesList.empty(); |
| 2114 | + |
| 2117 | | - |
| 2115 | + const keywordHeaders = await renderTemplateAsync('worldInfoKeywordHeaders'); |
| 2118 | | - const keywordHeaders = await renderTemplateAsync('worldInfoKeywordHeaders'); |
| 2116 | + const blocks = []; |
| 2119 | | - const blocksPromises = page.map(async (entry) => await getWorldEntry(name, data, entry)).filter(x => x); |
| 2117 | + |
| 2120 | | - const blocks = await Promise.all(blocksPromises); |
| 2118 | + for (const entry of page) { |
| 2121 | | - const isCustomOrder = $('#world_info_sort_order').find(':selected').data('rule') === 'custom'; |
| 2119 | + try { |
| 2122 | | - if (!isCustomOrder) { |
| 2120 | + const block = await getWorldEntry(name, data, entry); |
| 2123 | | - blocks.forEach(block => { |
| 2121 | + if (block) { |
| 2124 | | - block.find('.drag-handle').remove(); |
| 2122 | + blocks.push(block); |
| 2125 | | - }); |
| 2123 | + } |
| 2124 | + } catch (error) { |
| 2125 | + console.error(`Error while processing entry ${entry.uid}:`, error); |
| 2126 | + } |
| 2127 | + } |
| 2128 | + |
| 2129 | + const isCustomOrder = $('#world_info_sort_order').find(':selected').data('rule') === 'custom'; |
| 2130 | + if (!isCustomOrder) { |
| 2131 | + blocks.forEach(block => { |
| 2132 | + block.find('.drag-handle').remove(); |
| 2133 | + }); |
| 2134 | + } |
| 2135 | + |
| 2136 | + worldEntriesList.append(keywordHeaders); |
| 2137 | + worldEntriesList.append(blocks); |
| 2138 | + } catch (error) { |
| 2139 | + console.error('Error while rendering WI entries:', error); |
| 2140 | + } finally { |
| 2141 | + isSaveWorldInfoDisabled = false; |
| 2126 | 2142 | } |
| 2127 | | - worldEntriesList.append(keywordHeaders); |
| 2128 | | - worldEntriesList.append(blocks); |
| 2129 | 2143 | }, |
| 2130 | 2144 | afterSizeSelectorChange: function (e) { |
| 2131 | 2145 | accountStorage.setItem(storageKey, e.target.value); |