forked from MapComplete/MapComplete
Fix instabilities with complicated opening hours, fix #902
This commit is contained in:
parent
f99685c47d
commit
b5c48f65b0
3 changed files with 26 additions and 9 deletions
|
@ -38,7 +38,8 @@ export default class OpeningHoursInput extends InputElement<string> {
|
||||||
return str.substring(prefix.length, str.length - postfix.length)
|
return str.substring(prefix.length, str.length - postfix.length)
|
||||||
}
|
}
|
||||||
return str
|
return str
|
||||||
}, [], noPrefix => {
|
}, [],
|
||||||
|
noPrefix => {
|
||||||
if (noPrefix === undefined) {
|
if (noPrefix === undefined) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
@ -84,23 +85,30 @@ export default class OpeningHoursInput extends InputElement<string> {
|
||||||
|
|
||||||
// Note: MUST be bound AFTER the leftover rules!
|
// Note: MUST be bound AFTER the leftover rules!
|
||||||
const rulesFromOhPicker: UIEventSource<OpeningHour[]> = valueWithoutPrefix.sync(str => {
|
const rulesFromOhPicker: UIEventSource<OpeningHour[]> = valueWithoutPrefix.sync(str => {
|
||||||
console.log(">> Parsing '"+ str+"'")
|
|
||||||
return OH.Parse(str);
|
return OH.Parse(str);
|
||||||
}, [leftoverRules, phSelector.GetValue()], (rules, oldString) => {
|
}, [leftoverRules, phSelector.GetValue()], (rules, oldString) => {
|
||||||
let str = OH.ToString(rules);
|
// We always add a ';', to easily add new rules. We remove the ';' again at the end of the function
|
||||||
|
// Important: spaces are _not_ allowed after a ';' as it'll destabilize the parsing!
|
||||||
|
let str = OH.ToString(rules) + ";"
|
||||||
const ph = phSelector.GetValue().data;
|
const ph = phSelector.GetValue().data;
|
||||||
if(ph){
|
if(ph){
|
||||||
str += "; "+ph
|
str += ph + ";"
|
||||||
}
|
}
|
||||||
|
|
||||||
str += leftoverRules.data.join("; ")
|
str += leftoverRules.data.join(";") + ";"
|
||||||
if(!str.endsWith(";")){
|
|
||||||
str += ";"
|
str = str.trim()
|
||||||
|
if(str.endsWith(";")){
|
||||||
|
str = str.substring(0, str.length - 1)
|
||||||
}
|
}
|
||||||
|
if(str.startsWith(";")){
|
||||||
|
str = str.substring(1)
|
||||||
|
}
|
||||||
|
str.trim()
|
||||||
|
|
||||||
if(str === oldString){
|
if(str === oldString){
|
||||||
return oldString; // We pass a reference to the old string to stabilize the EventSource
|
return oldString; // We pass a reference to the old string to stabilize the EventSource
|
||||||
}
|
}
|
||||||
console.log("Reconstructed '"+ str+"'")
|
|
||||||
return str;
|
return str;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,14 @@ export default class OpeningHoursPicker extends InputElement<OpeningHour[]> {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* const rules = OH.ParseRule("Jul-Aug Sa closed; Mo,Tu,Th,Fr,PH 12:00-22:30, We 17:00-22:30, Sa 14:00-19:00, Su 10:00-21:00; Dec 24,25,31 off; Jan 1 off")
|
||||||
|
* const v = new UIEventSource(rules)
|
||||||
|
* const ohpicker = new OpeningHoursPicker(v)
|
||||||
|
* const html = ohpicker.InnerConstructElement()
|
||||||
|
* html !== undefined // => true
|
||||||
|
*/
|
||||||
protected InnerConstructElement(): HTMLElement {
|
protected InnerConstructElement(): HTMLElement {
|
||||||
return this._backgroundTable.ConstructElement();
|
return this._backgroundTable.ConstructElement();
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,8 @@ export default class OpeningHoursPickerTable extends InputElement<OpeningHour[]>
|
||||||
|
|
||||||
|
|
||||||
const ranges = new VariableUiElement(
|
const ranges = new VariableUiElement(
|
||||||
this.source.map(ohs => ohs.filter((oh: OpeningHour) => oh.weekday === i))
|
this.source.map(ohs =>
|
||||||
|
(ohs ?? []).filter((oh: OpeningHour) => oh.weekday === i))
|
||||||
.map(ohsForToday => {
|
.map(ohsForToday => {
|
||||||
return new Combine(ohsForToday.map(oh => new OpeningHoursRange(oh, () => {
|
return new Combine(ohsForToday.map(oh => new OpeningHoursRange(oh, () => {
|
||||||
this.source.data.splice(this.source.data.indexOf(oh), 1)
|
this.source.data.splice(this.source.data.indexOf(oh), 1)
|
||||||
|
|
Loading…
Add table
Reference in a new issue