forked from MapComplete/MapComplete
		
	Preparation for delete button
This commit is contained in:
		
							parent
							
								
									41341470db
								
							
						
					
					
						commit
						1cd4745c3a
					
				
					 8 changed files with 98 additions and 30 deletions
				
			
		|  | @ -190,15 +190,16 @@ export class FilteredLayer { | ||||||
|                 }); |                 }); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|                 const uiElement = self._showOnPopup(eventSource); |  | ||||||
|                 layer.bindPopup(uiElement.Render()); |  | ||||||
|                 layer.on("click", function (e) { |                 layer.on("click", function (e) { | ||||||
|                     console.log("Selected ", feature) |                     console.log("Selected ", feature) | ||||||
|                     self._selectedElement.setData(feature.properties); |                     self._selectedElement.setData(feature.properties); | ||||||
| 
 |                     const uiElement = self._showOnPopup(eventSource); | ||||||
|  |                     const popup = L.popup() | ||||||
|  |                         .setContent(uiElement.Render()) | ||||||
|  |                         .setLatLng(e.latlng) | ||||||
|  |                         .openOn(self._map.map); | ||||||
|                     uiElement.Update(); |                     uiElement.Update(); | ||||||
|                     uiElement.Activate(); |                     uiElement.Activate(); | ||||||
| 
 |  | ||||||
|                     L.DomEvent.stop(e); // Marks the event as consumed
 |                     L.DomEvent.stop(e); // Marks the event as consumed
 | ||||||
| 
 | 
 | ||||||
|                 }); |                 }); | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ import {ImagesInCategory, Wikidata, Wikimedia} from "./Wikimedia"; | ||||||
| import {WikimediaImage} from "../UI/Image/WikimediaImage"; | import {WikimediaImage} from "../UI/Image/WikimediaImage"; | ||||||
| import {SimpleImageElement} from "../UI/Image/SimpleImageElement"; | import {SimpleImageElement} from "../UI/Image/SimpleImageElement"; | ||||||
| import {UIElement} from "../UI/UIElement"; | import {UIElement} from "../UI/UIElement"; | ||||||
|  | import {Changes} from "./Changes"; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | @ -15,18 +16,20 @@ export class ImageSearcher extends UIEventSource<string[]> { | ||||||
|     private readonly _wdItem = new UIEventSource<string>(""); |     private readonly _wdItem = new UIEventSource<string>(""); | ||||||
|     private readonly _commons = new UIEventSource<string>(""); |     private readonly _commons = new UIEventSource<string>(""); | ||||||
|     private _activated: boolean = false; |     private _activated: boolean = false; | ||||||
|      |     private _changes: Changes; | ||||||
|     constructor(tags: UIEventSource<any>) { | 
 | ||||||
|  |     constructor(tags: UIEventSource<any>, | ||||||
|  |                 changes: Changes) { | ||||||
|         super([]); |         super([]); | ||||||
| 
 | 
 | ||||||
|         this._tags = tags; |         this._tags = tags; | ||||||
| 
 |         this._changes = changes; | ||||||
| 
 | 
 | ||||||
|         const self = this; |         const self = this; | ||||||
|         this._wdItem.addCallback(() => { |         this._wdItem.addCallback(() => { | ||||||
|                 // Load the wikidata item, then detect usage on 'commons'
 |             // Load the wikidata item, then detect usage on 'commons'
 | ||||||
|                 let wikidataId = self._wdItem.data; |             let wikidataId = self._wdItem.data; | ||||||
|                 // @ts-ignore
 |             // @ts-ignore
 | ||||||
|             if (wikidataId.startsWith("Q")) { |             if (wikidataId.startsWith("Q")) { | ||||||
|                     wikidataId = wikidataId.substr(1); |                     wikidataId = wikidataId.substr(1); | ||||||
|                 } |                 } | ||||||
|  | @ -34,6 +37,7 @@ export class ImageSearcher extends UIEventSource<string[]> { | ||||||
|                     self.AddImage(wd.image); |                     self.AddImage(wd.image); | ||||||
|                     Wikimedia.GetCategoryFiles(wd.commonsWiki, (images: ImagesInCategory) => { |                     Wikimedia.GetCategoryFiles(wd.commonsWiki, (images: ImagesInCategory) => { | ||||||
|                         for (const image of images.images) { |                         for (const image of images.images) { | ||||||
|  |                             // @ts-ignore
 | ||||||
|                             if (image.startsWith("File:")) { |                             if (image.startsWith("File:")) { | ||||||
|                                 self.AddImage(image); |                                 self.AddImage(image); | ||||||
|                             } |                             } | ||||||
|  | @ -67,17 +71,48 @@ export class ImageSearcher extends UIEventSource<string[]> { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private AddImage(url: string) { |     private AddImage(url: string) { | ||||||
|         if(url === undefined || url === null){ |         if (url === undefined || url === null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if (this.data.indexOf(url) < 0) { | 
 | ||||||
|             this.data.push(url); |         for (const el of this.data) { | ||||||
|             this.ping(); |             if (el === url) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         this.data.push(url); | ||||||
|  |         this.ping(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private ImageKey(url: string): string { | ||||||
|  |         const tgs = this._tags.data; | ||||||
|  |         for (const key in tgs) { | ||||||
|  |             if (tgs[key] === url) { | ||||||
|  |                 return key; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return undefined; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public IsDeletable(url: string): boolean { | ||||||
|  |         return this.ImageKey(url) !== undefined; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Delete(url: string): void { | ||||||
|  | 
 | ||||||
|  |         const key = this.ImageKey(url); | ||||||
|  |         if(key === undefined){ | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         console.log("Deleting image..."); | ||||||
|  |          | ||||||
|  |         // this._changes.addChange(this._tags.data.id, key, "");
 | ||||||
|  |          | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public Activate() { |     public Activate() { | ||||||
|         if(this._activated){ |         if (this._activated) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         this._activated = true; |         this._activated = true; | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ export class FeatureInfoBox extends UIElement { | ||||||
|         this._userDetails = userDetails; |         this._userDetails = userDetails; | ||||||
|         this.ListenTo(userDetails); |         this.ListenTo(userDetails); | ||||||
| 
 | 
 | ||||||
|         this._imageElement = new ImageCarousel(this._tagsES); |         this._imageElement = new ImageCarousel(this._tagsES, changes); | ||||||
| 
 | 
 | ||||||
|         this._infoboxes = []; |         this._infoboxes = []; | ||||||
|         for (const tagRenderingOption of elementsToShow) { |         for (const tagRenderingOption of elementsToShow) { | ||||||
|  |  | ||||||
|  | @ -3,6 +3,9 @@ import {ImageSearcher} from "../../Logic/ImageSearcher"; | ||||||
| import {UIEventSource} from "../UIEventSource"; | import {UIEventSource} from "../UIEventSource"; | ||||||
| import {SlideShow} from "../SlideShow"; | import {SlideShow} from "../SlideShow"; | ||||||
| import {FixedUiElement} from "../Base/FixedUiElement"; | import {FixedUiElement} from "../Base/FixedUiElement"; | ||||||
|  | import {VerticalCombine} from "../Base/VerticalCombine"; | ||||||
|  | import {Changes} from "../../Logic/Changes"; | ||||||
|  | import {VariableUiElement} from "../Base/VariableUIElement"; | ||||||
| 
 | 
 | ||||||
| export class ImageCarousel extends UIElement { | export class ImageCarousel extends UIElement { | ||||||
|     /** |     /** | ||||||
|  | @ -20,26 +23,54 @@ export class ImageCarousel extends UIElement { | ||||||
| 
 | 
 | ||||||
|     public readonly slideshow: SlideShow; |     public readonly slideshow: SlideShow; | ||||||
| 
 | 
 | ||||||
|     constructor(tags: UIEventSource<any>) { |     private readonly _uiElements: UIEventSource<UIElement[]>; | ||||||
|  | 
 | ||||||
|  |     private readonly _deleteButtonText = new UIEventSource<string>(""); | ||||||
|  |     private readonly _deleteButton: UIElement; | ||||||
|  | 
 | ||||||
|  |     constructor(tags: UIEventSource<any>, changes: Changes) { | ||||||
|         super(tags); |         super(tags); | ||||||
| 
 | 
 | ||||||
|         this.searcher = new ImageSearcher(tags); |         const self = this; | ||||||
|  |         this.searcher = new ImageSearcher(tags, changes); | ||||||
| 
 | 
 | ||||||
|         let uiElements = this.searcher.map((imageURLS: string[]) => { |         this._uiElements = this.searcher.map((imageURLS: string[]) => { | ||||||
|             const uiElements: UIElement[] = []; |             const uiElements: UIElement[] = []; | ||||||
|             for (const url of imageURLS) { |             for (const url of imageURLS) { | ||||||
|                 uiElements.push(ImageSearcher.CreateImageElement(url)); |                 const image = ImageSearcher.CreateImageElement(url); | ||||||
|  |                 uiElements.push(image); | ||||||
|             } |             } | ||||||
|             return uiElements; |             return uiElements; | ||||||
|         }); |         }); | ||||||
|          | 
 | ||||||
|         this.slideshow = new SlideShow( |         this.slideshow = new SlideShow( | ||||||
|             uiElements, |             this._uiElements, | ||||||
|             new FixedUiElement("")).HideOnEmpty(true); |             new FixedUiElement("")).HideOnEmpty(true); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         this._deleteButtonText = this.slideshow._currentSlide.map((i) => { | ||||||
|  |             if(self.searcher.IsDeletable(self.searcher.data[i])){ | ||||||
|  |                 return "DELETE"; | ||||||
|  |             }else{ | ||||||
|  |                 return ""; | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         this._deleteButton = new VariableUiElement(this._deleteButtonText) | ||||||
|  |             .HideOnEmpty(true) | ||||||
|  |             .onClick(() => { | ||||||
|  |                 self.searcher.Delete(self.searcher.data[self.slideshow._currentSlide.data]); | ||||||
|  |             }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     InnerRender(): string { |     InnerRender(): string { | ||||||
|         return this.slideshow.Render(); |         return this.slideshow.Render() ; | ||||||
|  |             // + this._deleteButton.Render();
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     InnerUpdate(htmlElement: HTMLElement) { | ||||||
|  |         super.InnerUpdate(htmlElement); | ||||||
|  |         this._deleteButton.Update(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ export class SlideShow extends UIElement { | ||||||
| 
 | 
 | ||||||
|     private readonly _embeddedElements: UIEventSource<UIElement[]> |     private readonly _embeddedElements: UIEventSource<UIElement[]> | ||||||
| 
 | 
 | ||||||
|     private readonly _currentSlide: UIEventSource<number> = new UIEventSource<number>(0); |     public readonly _currentSlide: UIEventSource<number> = new UIEventSource<number>(0); | ||||||
|     private readonly _noimages: UIElement; |     private readonly _noimages: UIElement; | ||||||
|     private _prev: FixedUiElement; |     private _prev: FixedUiElement; | ||||||
|     private _next: FixedUiElement; |     private _next: FixedUiElement; | ||||||
|  | @ -84,6 +84,8 @@ export class SlideShow extends UIElement { | ||||||
|         for (const embeddedElement of this._embeddedElements.data) { |         for (const embeddedElement of this._embeddedElements.data) { | ||||||
|             embeddedElement.Activate(); |             embeddedElement.Activate(); | ||||||
|         } |         } | ||||||
|  |         this._next.Update(); | ||||||
|  |         this._prev.Update(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| import {UIEventSource} from "./UIEventSource"; | import {UIEventSource} from "./UIEventSource"; | ||||||
| import {Playground} from "../Layers/Playground"; |  | ||||||
| 
 | 
 | ||||||
| export abstract class UIElement { | export abstract class UIElement { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -457,14 +457,15 @@ body { | ||||||
|     text-align: center; |     text-align: center; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | .slide > span { | ||||||
| 
 |     max-height: 40vh; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| .slide > span img { | .slide > span img { | ||||||
|     height: auto; |     height: auto; | ||||||
|     width: auto; |     width: auto; | ||||||
|     max-width: 100%; |     max-width: 100%; | ||||||
|     max-height: 50vh; |     max-height: 30vh; | ||||||
|     border-radius: 1em; |     border-radius: 1em; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -497,7 +498,7 @@ body { | ||||||
| 
 | 
 | ||||||
|     position: absolute; |     position: absolute; | ||||||
|     bottom: 0; |     bottom: 0; | ||||||
|     left: 5em; /* Offset for the go left button*/ |     left: 6em; /* Offset for the go left button*/ | ||||||
|     padding: 0.25em; |     padding: 0.25em; | ||||||
|     margin-bottom: 0.25em; |     margin-bottom: 0.25em; | ||||||
|     border-radius: 0.5em; |     border-radius: 0.5em; | ||||||
|  |  | ||||||
|  | @ -9,7 +9,6 @@ | ||||||
|           integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" |           integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" | ||||||
|           crossorigin=""/> |           crossorigin=""/> | ||||||
|     <link rel="stylesheet" href="./index.css"/> |     <link rel="stylesheet" href="./index.css"/> | ||||||
|     <link rel="stylesheet" href="node_modules/@splidejs/splide/dist/css/splide.min.css"> |  | ||||||
| 
 | 
 | ||||||
| </head> | </head> | ||||||
| <body> | <body> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue