forked from MapComplete/MapComplete
		
	Add rewrite of 'special' clauses, various QOLimprovements on import viewer
This commit is contained in:
		
							parent
							
								
									8df0324572
								
							
						
					
					
						commit
						c47a6d5ea7
					
				
					 22 changed files with 597 additions and 155 deletions
				
			
		|  | @ -139,16 +139,59 @@ class MassAction extends Combine { | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| class NoteTable extends Combine { | ||||
| 
 | ||||
|     constructor(noteStates: NoteState[], state?: UserRelatedState) { | ||||
|         const typicalComment = noteStates[0].props.comments[0].html | ||||
| 
 | ||||
|         const table = new Table( | ||||
|             ["id", "status", "last comment", "last modified by"], | ||||
|             noteStates.map(ns => { | ||||
|                 const link = new Link( | ||||
|                     "" + ns.props.id, | ||||
|                     "https://openstreetmap.org/note/" + ns.props.id, true | ||||
|                 ) | ||||
|                 let last_comment = ""; | ||||
|                 const last_comment_props = ns.props.comments[ns.props.comments.length - 1] | ||||
|                 const before_last_comment = ns.props.comments[ns.props.comments.length - 2] | ||||
|                 if (ns.props.comments.length > 1) { | ||||
|                     last_comment = last_comment_props.text | ||||
|                     if (last_comment === undefined && before_last_comment?.uid === last_comment_props.uid) { | ||||
|                         last_comment = before_last_comment.text | ||||
|                     } | ||||
|                 } | ||||
|                 const statusIcon = BatchView.icons[ns.status]().SetClass("h-4 w-4 shrink-0") | ||||
|                 return [link, new Combine([statusIcon, ns.status]).SetClass("flex"), last_comment, | ||||
|                     new Link(last_comment_props.user, "https://www.openstreetmap.org/user/" + last_comment_props.user, true) | ||||
|                 ] | ||||
|             }), | ||||
|             {sortable: true} | ||||
|         ).SetClass("zebra-table link-underline"); | ||||
| 
 | ||||
| 
 | ||||
|         super([ | ||||
|             new Title("Mass apply an action on " + noteStates.length + " notes below"), | ||||
|             state !== undefined ? new MassAction(state, noteStates.map(ns => ns.props)).SetClass("block") : undefined, | ||||
|             table, | ||||
|             new Title("Example note", 4), | ||||
|             new FixedUiElement(typicalComment).SetClass("literal-code link-underline"), | ||||
| 
 | ||||
|         ]) | ||||
|         this.SetClass("flex flex-col") | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| class BatchView extends Toggleable { | ||||
| 
 | ||||
|     private static icons = { | ||||
|     public static icons = { | ||||
|         open: Svg.compass_svg, | ||||
|         has_comments: Svg.speech_bubble_svg, | ||||
|         imported: Svg.addSmall_svg, | ||||
|         already_mapped: Svg.checkmark_svg, | ||||
|         invalid: Svg.invalid_svg, | ||||
|         closed: Svg.close_svg, | ||||
|         not_found: Svg.not_found_svg, | ||||
|         closed: Svg.close_svg, | ||||
|         invalid: Svg.invalid_svg, | ||||
|     } | ||||
| 
 | ||||
|     constructor(noteStates: NoteState[], state?: UserRelatedState) { | ||||
|  | @ -164,14 +207,44 @@ class BatchView extends Toggleable { | |||
|             statusHist.set(st, c + 1) | ||||
|         } | ||||
| 
 | ||||
|         const badges: (BaseUIElement)[] = [new FixedUiElement(dateStr).SetClass("literal-code rounded-full")] | ||||
|         statusHist.forEach((count, status) => { | ||||
|             const icon = BatchView.icons[status]().SetClass("h-6 m-1") | ||||
|             badges.push(new Combine([icon, count + " " + status]) | ||||
|                 .SetClass("flex ml-1 mb-1 pl-1 pr-3 items-center rounded-full border border-black")) | ||||
|         const unresolvedTotal = (statusHist.get("open") ?? 0) + (statusHist.get("has_comments") ?? 0) | ||||
|         const badges: (BaseUIElement)[] = [ | ||||
|             new FixedUiElement(dateStr).SetClass("literal-code rounded-full"), | ||||
|             new FixedUiElement(noteStates.length + " total").SetClass("literal-code rounded-full ml-1 border-4 border-gray") | ||||
|                 .onClick(() => filterOn.setData(undefined)), | ||||
|             unresolvedTotal === 0 ? | ||||
|                 new Combine([Svg.party_svg().SetClass("h-6 m-1"), "All done!"]) | ||||
|                     .SetClass("flex ml-1 mb-1 pl-1 pr-3 items-center rounded-full border border-black") : | ||||
|                 new FixedUiElement(Math.round(100 - 100 * unresolvedTotal / noteStates.length) + "%").SetClass("literal-code rounded-full ml-1") | ||||
|         ] | ||||
| 
 | ||||
|         const filterOn = new UIEventSource<string>(undefined) | ||||
|         Object.keys(BatchView.icons).forEach(status => { | ||||
|             const count = statusHist.get(status) | ||||
|             if (count === undefined) { | ||||
|                 return undefined | ||||
|             } | ||||
| 
 | ||||
|             const normal = new Combine([BatchView.icons[status]().SetClass("h-6 m-1"), count + " " + status]) | ||||
|                 .SetClass("flex ml-1 mb-1 pl-1 pr-3 items-center rounded-full border border-black") | ||||
|             const selected = new Combine([BatchView.icons[status]().SetClass("h-6 m-1"), count + " " + status]) | ||||
|                 .SetClass("flex ml-1 mb-1 pl-1 pr-3 items-center rounded-full border-4 border-black animate-pulse") | ||||
| 
 | ||||
|             const toggle = new Toggle(selected, normal, filterOn.map(f => f === status, [], (selected, previous) => { | ||||
|                 if (selected) { | ||||
|                     return status; | ||||
|                 } | ||||
|                 if (previous === status) { | ||||
|                     return undefined | ||||
|                 } | ||||
|                 return previous | ||||
|             })).ToggleOnClick() | ||||
| 
 | ||||
|             badges.push(toggle) | ||||
|         }) | ||||
| 
 | ||||
|         const typicalComment = noteStates[0].props.comments[0].html | ||||
| 
 | ||||
|         const fullTable = new NoteTable(noteStates, state); | ||||
| 
 | ||||
| 
 | ||||
|         super( | ||||
|  | @ -179,27 +252,12 @@ class BatchView extends Toggleable { | |||
|                 new Title(theme + ": " + intro, 2), | ||||
|                 new Combine(badges).SetClass("flex flex-wrap"), | ||||
|             ]), | ||||
|             new Combine([ | ||||
|                 new Title("Example note", 4), | ||||
|                 new FixedUiElement(typicalComment).SetClass("literal-code link-underline"), | ||||
|                 new Title("Mass apply an action"), | ||||
|                 state !== undefined ? new MassAction(state, noteStates.map(ns => ns.props)).SetClass("block") : undefined, | ||||
|                 new Table( | ||||
|                     ["id", "status", "last comment"], | ||||
|                     noteStates.map(ns => { | ||||
|                         const link = new Link( | ||||
|                             "" + ns.props.id, | ||||
|                             "https://openstreetmap.org/note/" + ns.props.id, true | ||||
|                         ) | ||||
|                         let last_comment = ""; | ||||
|                         if (ns.props.comments.length > 1) { | ||||
|                             last_comment = ns.props.comments[ns.props.comments.length - 1].text | ||||
|                         } | ||||
|                         const statusIcon = BatchView.icons[ns.status]().SetClass("h-4 w-4 shrink-0") | ||||
|                         return [link, new Combine([statusIcon, ns.status]).SetClass("flex"), last_comment] | ||||
|                     }) | ||||
|                 ).SetClass("zebra-table link-underline") | ||||
|             ]).SetClass("flex flex-col"), | ||||
|             new VariableUiElement(filterOn.map(filter => { | ||||
|                 if (filter === undefined) { | ||||
|                     return fullTable | ||||
|                 } | ||||
|                 return new NoteTable(noteStates.filter(ns => ns.status === filter), state) | ||||
|             })), | ||||
|             { | ||||
|                 closeOnClick: false | ||||
|             }) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue