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
 | 
			
		||||
            }, [], noPrefix => {
 | 
			
		||||
            }, [], 
 | 
			
		||||
                    noPrefix => {
 | 
			
		||||
                if (noPrefix === undefined) {
 | 
			
		||||
                    return undefined;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -84,23 +85,30 @@ export default class OpeningHoursInput extends InputElement<string> {
 | 
			
		|||
        
 | 
			
		||||
        // Note: MUST be bound AFTER the leftover rules!
 | 
			
		||||
        const rulesFromOhPicker: UIEventSource<OpeningHour[]> = valueWithoutPrefix.sync(str => {
 | 
			
		||||
            console.log(">> Parsing '"+ str+"'")
 | 
			
		||||
            return OH.Parse(str);
 | 
			
		||||
        }, [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;
 | 
			
		||||
            if(ph){
 | 
			
		||||
               str += "; "+ph 
 | 
			
		||||
               str += ph + ";"
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            str += leftoverRules.data.join("; ")
 | 
			
		||||
            if(!str.endsWith(";")){
 | 
			
		||||
                str += ";"
 | 
			
		||||
            str += leftoverRules.data.join(";") + ";"
 | 
			
		||||
            
 | 
			
		||||
            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){
 | 
			
		||||
                return oldString; // We pass a reference to the old string to stabilize the EventSource
 | 
			
		||||
            }
 | 
			
		||||
            console.log("Reconstructed '"+ str+"'")
 | 
			
		||||
            return str;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,14 @@ export default class OpeningHoursPicker extends InputElement<OpeningHour[]> {
 | 
			
		|||
        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 {
 | 
			
		||||
        return this._backgroundTable.ConstructElement();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,7 +68,8 @@ export default class OpeningHoursPickerTable extends InputElement<OpeningHour[]>
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
            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 => {
 | 
			
		||||
                        return new Combine(ohsForToday.map(oh => new OpeningHoursRange(oh, () => {
 | 
			
		||||
                            this.source.data.splice(this.source.data.indexOf(oh), 1)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue