Skip to content

Commit

Permalink
feat: better incomplete view (#453)
Browse files Browse the repository at this point in the history
Co-authored-by: Miralem Drek <mek@qlik.com>
  • Loading branch information
stoffeastrom and miralemd committed Jun 29, 2020
1 parent c8a996b commit e9d11e9
Show file tree
Hide file tree
Showing 22 changed files with 332 additions and 86 deletions.
4 changes: 2 additions & 2 deletions apis/locale/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Unvollständige Visualisierung",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
26 changes: 25 additions & 1 deletion apis/locale/locales/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,32 @@
"value": "Select possible",
"comment": "Action text to select possible selections"
},
"Supernova.Incomplete": {
"Visualization.LayoutError": {
"value": "Error",
"comment": "Status text shown when a visualization has layout errors"
},
"Visualization.Incomplete": {
"value": "Incomplete visualization",
"comment": "Status text shown when a visualization is incomplete"
},
"Visualization.Incomplete.Dimensions": {
"value": "{0} of {1} dimensions",
"comment": "Text showing the number of current {0} dimensions over the total {1} number of dimensions"
},
"Visualization.Incomplete.Measures": {
"value": "{0} of {1} measures",
"comment": "Text showing the number of current {0} measures over the total {1} number of measures"
},
"Visualization.Invalid.Dimension": {
"value": "Invalid dimension",
"comment": "Status text shown when a dimension is not valid"
},
"Visualization.UnfulfilledCalculationCondition": {
"value": "The calculation condition is not fulfilled",
"comment": "Message displayed when a calculation condition is not fulfilled"
},
"Visualization.Invalid.Measure": {
"value": "Invalid measure",
"comment": "Status text shown when a measure is not valid"
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Visualización incompleta",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Visualisation incomplète",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Visualizzazione incompleta",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "未完了のビジュアライゼーション",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "완료되지 않은 시각화",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Onvolledige visualisatie",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Niekompletna wizualizacja",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Visualização incompleta",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Незавершенная визуализация",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/sv.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Ofullständig visualisering",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "Tamamlanmamış görselleştirme",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "不完整的可视化",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
4 changes: 2 additions & 2 deletions apis/locale/locales/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@
"comment": "Action text to select possible selections",
"version": "UYEx1K96g9h4HCK3GH/6kg=="
},
"Supernova.Incomplete": {
"Visualization.Incomplete": {
"value": "視覺化未完成",
"comment": "Status text shown when a visualization is incomplete",
"version": "SOyzXWKRgL1+6AqW/QkZOA=="
}
}
}
112 changes: 99 additions & 13 deletions apis/nucleus/src/components/Cell.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -114,26 +114,112 @@ const handleModal = ({ sn, layout, model }) => {

const filterData = (d) => (d.qError ? d.qError.qErrorCode === 7005 : true);

const validateTargets = (translator, layout, { targets }) => {
const validateInfo = (min, info, getDescription, translatedError, translatedCalcCond) => {
return [...Array(min).keys()].map((i) => {
const exists = !!(info && info[i]);
const softError = exists && info[i].qError && info[i].qError.qErrorCode === 7005;
const error = exists && !softError && info[i].qError;
const delimiter = ':';
const calcCondMsg = softError && info[i].qCalcCondMsg;
const label = `${
// eslint-disable-next-line no-nested-ternary
error ? translatedError : softError ? calcCondMsg || translatedCalcCond : (exists && info[i].qFallbackTitle) || ''
}`;
const description = `${getDescription(i)}${label.length ? delimiter : ''}`;

return {
description,
label,
missing: (info && !exists && !error && i >= info.length) || softError,
error,
};
});
};

const validateTarget = (translator, layout, properties, def) => {
const minD = def.dimensions.min();
const minM = def.measures.min();
const hc = def.resolveLayout(layout);

const reqDimErrors = validateInfo(
minD,
hc.qDimensionInfo,
(i) => def.dimensions.description(properties, i),
translator.get('Visualization.Invalid.Dimension'),
translator.get('Visualization.UnfulfilledCalculationCondition')
);
const reqMeasErrors = validateInfo(
minM,
hc.qMeasureInfo,
(i) => def.measures.description(properties, i),
translator.get('Visualization.Invalid.Measure'),
translator.get('Visualization.UnfulfilledCalculationCondition')
);
return {
reqDimErrors,
reqMeasErrors,
};
};

const validateTargets = async (translator, layout, { targets }, model) => {
const layoutErrors = [];
const requirementsError = [];
targets.forEach((def) => {
// Use a flattened requirements structure to combine all targets
const allRequirements = {
hasErrors: false,
d: {
title: '',
descriptions: [],
min: 0,
},
m: {
title: '',
descriptions: [],
min: 0,
},
};
let loopCacheProperties = null;

for (let i = 0; i < targets.length; ++i) {
const def = targets[i];
const minD = def.dimensions.min();
const minM = def.measures.min();
const hc = def.resolveLayout(layout);
const d = (hc.qDimensionInfo || []).filter(filterData);
const m = (hc.qMeasureInfo || []).filter(filterData);
const d = (hc.qDimensionInfo || []).filter(filterData); // Filter out optional calc conditions
const m = (hc.qMeasureInfo || []).filter(filterData); // Filter out optional calc conditions
const path = def.layoutPath;

// layout error
if (hc.qError) {
layoutErrors.push({ path, error: hc.qError });
layoutErrors.push({ title: path, descriptions: [{ message: hc.qError }] });
}
if (d.length < minD || m.length < minM) {
requirementsError.push({ path });
allRequirements.hasErrors = true;
allRequirements.d.min += minD;
allRequirements.m.min += minM;

// eslint-disable-next-line no-await-in-loop
const properties = loopCacheProperties || (await model.getProperties());
loopCacheProperties = properties;

const res = validateTarget(translator, layout, properties, def);
allRequirements.d.descriptions.push(...res.reqDimErrors);
allRequirements.m.descriptions.push(...res.reqMeasErrors);
}
});
const showError = !!(layoutErrors.length || requirementsError.length);
const title = requirementsError.length ? translator.get('Supernova.Incomplete') : 'Error';
const data = requirementsError.length ? requirementsError : layoutErrors;
}
const fulfilledDims = allRequirements.d.descriptions.filter((e) => !(e.missing || e.error)).length;
allRequirements.d.title = translator.get('Visualization.Incomplete.Dimensions', [
fulfilledDims,
allRequirements.d.min,
]);
const fulfilledMeas = allRequirements.m.descriptions.filter((e) => !(e.missing || e.error)).length;
allRequirements.m.title = translator.get('Visualization.Incomplete.Measures', [fulfilledMeas, allRequirements.m.min]);

const showError = !!(layoutErrors.length || allRequirements.hasErrors);
const title = allRequirements.hasErrors
? translator.get('Visualization.Incomplete')
: translator.get('Visualization.LayoutError');
const data = allRequirements.hasErrors ? [allRequirements.d, allRequirements.m] : layoutErrors;

return [showError, { title, data }];
};

Expand Down Expand Up @@ -207,8 +293,8 @@ const Cell = forwardRef(({ halo, model, initialSnOptions, initialError, onMount
if (initialError || !appLayout) {
return undefined;
}
const validate = (sn) => {
const [showError, error] = validateTargets(translator, layout, sn.generator.qae.data);
const validate = async (sn) => {
const [showError, error] = await validateTargets(translator, layout, sn.generator.qae.data, model);
if (showError) {
dispatch({ type: 'ERROR', error });
} else {
Expand Down
Loading

0 comments on commit e9d11e9

Please sign in to comment.