forked from MapComplete/MapComplete
Another sanity check, another bunch of fixed layers; add tagrendering-steal possibility, add some styling to TV-theme
This commit is contained in:
parent
10ac6a72e2
commit
746273f594
57 changed files with 602 additions and 940 deletions
|
@ -1,7 +1,6 @@
|
|||
import {UIEventSource} from "../../Logic/UIEventSource";
|
||||
import TagRenderingQuestion from "./TagRenderingQuestion";
|
||||
import Translations from "../i18n/Translations";
|
||||
import State from "../../State";
|
||||
import Combine from "../Base/Combine";
|
||||
import BaseUIElement from "../BaseUIElement";
|
||||
import {VariableUiElement} from "../Base/VariableUIElement";
|
||||
|
@ -14,71 +13,88 @@ import Lazy from "../Base/Lazy";
|
|||
* Generates all the questions, one by one
|
||||
*/
|
||||
export default class QuestionBox extends VariableUiElement {
|
||||
public readonly skippedQuestions: UIEventSource<number[]>;
|
||||
public readonly currentQuestion: UIEventSource<number | undefined>;
|
||||
|
||||
constructor(tagsSource: UIEventSource<any>, tagRenderings: TagRenderingConfig[], units: Unit[]) {
|
||||
constructor(options: { tagsSource: UIEventSource<any>, tagRenderings: TagRenderingConfig[], units: Unit[] }) {
|
||||
|
||||
const skippedQuestions: UIEventSource<number[]> = new UIEventSource<number[]>([])
|
||||
|
||||
tagRenderings = tagRenderings
|
||||
const tagsSource = options.tagsSource
|
||||
const units = options.units
|
||||
const tagRenderings = options.tagRenderings
|
||||
.filter(tr => tr.question !== undefined)
|
||||
.filter(tr => tr.question !== null);
|
||||
.filter(tr => tr.question !== null)
|
||||
|
||||
super(tagsSource.map(tags => {
|
||||
if (tags === undefined) {
|
||||
return undefined;
|
||||
|
||||
const tagRenderingQuestions = tagRenderings
|
||||
.map((tagRendering, i) =>
|
||||
new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering,
|
||||
{
|
||||
units: units,
|
||||
afterSave: () => {
|
||||
// We save and indicate progress by pinging and recalculating
|
||||
skippedQuestions.ping();
|
||||
},
|
||||
cancelButton: Translations.t.general.skip.Clone()
|
||||
.SetClass("btn btn-secondary mr-3")
|
||||
.onClick(() => {
|
||||
skippedQuestions.data.push(i);
|
||||
skippedQuestions.ping();
|
||||
})
|
||||
}
|
||||
)));
|
||||
|
||||
|
||||
const skippedQuestionsButton = Translations.t.general.skippedQuestions
|
||||
.onClick(() => {
|
||||
skippedQuestions.setData([]);
|
||||
})
|
||||
|
||||
const currentQuestion: UIEventSource<number | undefined> = tagsSource.map(tags => {
|
||||
if (tags === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
for (let i = 0; i < tagRenderingQuestions.length; i++) {
|
||||
let tagRendering = tagRenderings[i];
|
||||
|
||||
if (skippedQuestions.data.indexOf(i) >= 0) {
|
||||
continue;
|
||||
}
|
||||
if (tagRendering.IsKnown(tags)) {
|
||||
continue;
|
||||
}
|
||||
if (tagRendering.condition &&
|
||||
!tagRendering.condition.matchesProperties(tags)) {
|
||||
// Filtered away by the condition, so it is kindof known
|
||||
continue;
|
||||
}
|
||||
|
||||
const tagRenderingQuestions = tagRenderings
|
||||
.map((tagRendering, i) =>
|
||||
new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering,
|
||||
{
|
||||
units: units,
|
||||
afterSave: () => {
|
||||
// We save and indicate progress by pinging and recalculating
|
||||
skippedQuestions.ping();
|
||||
},
|
||||
cancelButton: Translations.t.general.skip.Clone()
|
||||
.SetClass("btn btn-secondary mr-3")
|
||||
.onClick(() => {
|
||||
skippedQuestions.data.push(i);
|
||||
skippedQuestions.ping();
|
||||
})
|
||||
}
|
||||
)));
|
||||
|
||||
const skippedQuestionsButton = Translations.t.general.skippedQuestions
|
||||
.onClick(() => {
|
||||
skippedQuestions.setData([]);
|
||||
})
|
||||
// this value is NOT known - this is the question we have to show!
|
||||
return i
|
||||
}
|
||||
return undefined; // The questions are depleted
|
||||
}, [skippedQuestions])
|
||||
|
||||
|
||||
const allQuestions: BaseUIElement[] = []
|
||||
for (let i = 0; i < tagRenderingQuestions.length; i++) {
|
||||
let tagRendering = tagRenderings[i];
|
||||
|
||||
if (tagRendering.IsKnown(tags)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (skippedQuestions.data.indexOf(i) >= 0) {
|
||||
continue;
|
||||
}
|
||||
// this value is NOT known - we show the questions for it
|
||||
if (State.state.featureSwitchShowAllQuestions.data || allQuestions.length == 0) {
|
||||
allQuestions.push(tagRenderingQuestions[i])
|
||||
}
|
||||
|
||||
super(currentQuestion.map(i => {
|
||||
const els: BaseUIElement[] = []
|
||||
if (i !== undefined) {
|
||||
els.push(tagRenderingQuestions[i])
|
||||
}
|
||||
|
||||
if (skippedQuestions.data.length > 0) {
|
||||
allQuestions.push(skippedQuestionsButton)
|
||||
els.push(skippedQuestionsButton)
|
||||
}
|
||||
|
||||
|
||||
return new Combine(allQuestions).SetClass("block mb-8")
|
||||
}, [skippedQuestions])
|
||||
return new Combine(els).SetClass("block mb-8")
|
||||
})
|
||||
)
|
||||
|
||||
this.skippedQuestions = skippedQuestions;
|
||||
this.currentQuestion = currentQuestion
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue