-
-
-
-
+
+
+
- Data input
-
+
+
-
-
+
+
+
+
+
+
+
+ Category refinement
+ +
+
+
+ Category–card table
+
@@ -322,7 +362,10 @@
resultCount: results.length,
};
for (const result of results) {
- for (const [categoryName, cards] of Object.entries(result)) {
+ for (let [categoryName, cards] of Object.entries(result)) {
+ if (categoryName in mergedCategories) {
+ categoryName = mergedCategories[categoryName];
+ }
if ( ! (categoryName in data.cardCountsByCategory)) {
data.cardCountsByCategory[categoryName] = {};
data.categories.push({
@@ -444,6 +487,9 @@
const categoriesContainer = document.querySelector('.category-refinement .categories');
const categoryTemplate = document.querySelector('.category-template');
const cardTemplate = document.querySelector('.card-template');
+ const recalculateButton = document.querySelector('.category-refinement .button-recalculate');
+
+ recalculateButton.addEventListener('click', () => calculateAndRender());
function renderCategoryRefinement(data) {
const categoryElements = [];
@@ -468,8 +514,20 @@
categoryElement.querySelector('.category-merge-button-end').addEventListener('click', handleMergeEnd);
categoryElement.querySelector('.category-merge-button-cancel').addEventListener('click', handleMergeCancel);
categoryElements.push(categoryElement);
+ const thisCategoryMergedCategories = (
+ Object.entries(mergedCategories)
+ .filter(([sourceName, targetName]) => targetName == category.name)
+ .map(([sourceName, targetName]) => sourceName)
+ );
+ if (thisCategoryMergedCategories.length > 0) {
+ categoryElement.classList.add('has-merged-categories');
+ for (sourceCategoryName of thisCategoryMergedCategories) {
+ renderMergeToolMergedCategory(categoryElement, {name: sourceCategoryName});
+ }
+ }
}
categoriesContainer.replaceChildren(...categoryElements);
+ updateRecalculateButton();
}
function handleMergeStart() {
@@ -493,6 +551,7 @@
targetCategoryElement.classList.add('has-merged-categories');
renderMergeToolMergedCategory(targetCategoryElement, sourceCategory);
mergedCategories[sourceCategory.name] = targetCategory.name;
+ updateRecalculateButton();
}
function handleMergeUndo() {
const undoButton = this;
@@ -500,15 +559,29 @@
const targetCategory = targetCategoryElement._category;
const sourceCategory = undoButton._sourceCategory;
const sourceCategoryElement = sourceCategory.element;
- if (sourceCategoryElement.classList.contains('is-merge-pending')) {
- sourceCategoryElement.classList.remove('is-merge-pending');
+ if (sourceCategoryElement) {
+ if (sourceCategoryElement.classList.contains('is-merge-pending')) {
+ sourceCategoryElement.classList.remove('is-merge-pending');
+ }
+ undoButton.closest('.merged-category').remove();
+ }
+ else {
+ undoButton.closest('.merged-category').classList.add('is-undo-pending');
}
- delete mergedCategories[sourceCategory.name];
const hasMoreMergedCategories = Object.values(mergedCategories).includes(targetCategory.name);
if ( ! hasMoreMergedCategories) {
targetCategoryElement.classList.remove('has-merged-categories');
}
- undoButton.closest('.merged-category').remove();
+ delete mergedCategories[sourceCategory.name];
+ updateRecalculateButton();
+ }
+ function updateRecalculateButton() {
+ if (document.querySelector('.is-merge-pending, .is-undo-pending')) {
+ recalculateButton.disabled = false;
+ }
+ else {
+ recalculateButton.disabled = true;
+ }
}
function renderMergeToolMergedCategory(targetCategoryElement, sourceCategory) {