([])
@@ -47,7 +52,15 @@
errs.push(canBeUploaded.error)
continue
}
- await state?.imageUploadManager?.uploadImageAndApply(
+
+ if (isNote) {
+ if (!noteIsOpened.data) {
+ await state.osmConnection.reopenNote(tags.data.id)
+ NoteCommentElement.mimickStatusChange(tags, true)
+ }
+ }
+
+ state?.imageUploadManager?.uploadImageAndApply(
file,
tags,
targetKey,
@@ -72,7 +85,7 @@
{#if maintenanceBusy}
- Due to maintenance, uploading images is currently not possible. Sorry about this!
+
{:else}
@@ -109,6 +122,9 @@
{/if}
+ {#if isNote && !$noteIsOpened}
+
+ {/if}
@@ -150,14 +166,20 @@
{/if}
+ {#if isNote && !$noteIsOpened}
+
+ {/if}
+
—
+
+
{/if}
diff --git a/src/UI/Popup/ImportButtons/PointImportFlowState.ts b/src/UI/Popup/ImportButtons/PointImportFlowState.ts
index 5814c76b5..ffb54a7be 100644
--- a/src/UI/Popup/ImportButtons/PointImportFlowState.ts
+++ b/src/UI/Popup/ImportButtons/PointImportFlowState.ts
@@ -7,6 +7,7 @@ import Maproulette from "../../../Logic/Maproulette"
import { GeoOperations } from "../../../Logic/GeoOperations"
import { Tag } from "../../../Logic/Tags/Tag"
import { SpecialVisualizationState } from "../../SpecialVisualization"
+import NoteCommentElement from "../Notes/NoteCommentElement"
export interface PointImportFlowArguments extends ImportFlowArguments {
max_snap_distance?: string
@@ -74,8 +75,7 @@ export class PointImportFlowState extends ImportFlow {
if (note_id !== undefined) {
await this.state.osmConnection.closeNote(note_id, "imported")
- originalFeatureTags.data["closed_at"] = new Date().toISOString()
- originalFeatureTags.ping()
+ NoteCommentElement.mimickStatusChange(originalFeatureTags, false)
}
const maproulette_id = originalFeatureTags.data[this.args.maproulette_id]
diff --git a/src/UI/Popup/Notes/AddNoteComment.svelte b/src/UI/Popup/Notes/AddNoteComment.svelte
index c8e152af1..09e0dfb9e 100644
--- a/src/UI/Popup/Notes/AddNoteComment.svelte
+++ b/src/UI/Popup/Notes/AddNoteComment.svelte
@@ -43,6 +43,7 @@
if (isClosed.data) {
await state.osmConnection.reopenNote(id, txt.data)
await state.osmConnection.closeNote(id)
+ NoteCommentElement.mimickStatusChange(tags, false)
} else {
await state.osmConnection.addCommentToNote(id, txt.data)
}
@@ -54,16 +55,15 @@
async function closeNote() {
isProcessing.set(true)
await state.osmConnection.closeNote(id, txt.data)
- isProcessing.set(false)
- tags.data["closed_at"] = new Date().toISOString()
NoteCommentElement.addCommentTo(txt.data, tags, state)
- tags.ping()
+ NoteCommentElement.mimickStatusChange(tags, false) // Will ping
+ isProcessing.set(false)
}
async function reopenNote() {
isProcessing.set(true)
await state.osmConnection.reopenNote(id, txt.data)
- tags.data["closed_at"] = undefined
+ NoteCommentElement.mimickStatusChange(tags, true)
NoteCommentElement.addCommentTo(txt.data, tags, state)
tags.ping()
txt.set(undefined)
diff --git a/src/UI/Popup/Notes/CloseNoteButton.svelte b/src/UI/Popup/Notes/CloseNoteButton.svelte
index ca972551d..558c53dac 100644
--- a/src/UI/Popup/Notes/CloseNoteButton.svelte
+++ b/src/UI/Popup/Notes/CloseNoteButton.svelte
@@ -26,8 +26,7 @@
const id = tags.data[idkey]
await state.osmConnection.closeNote(id, message)
NoteCommentElement.addCommentTo(message, tags, state)
- tags.data["closed_at"] = new Date().toISOString()
- tags.ping()
+ NoteCommentElement.mimickStatusChange(tags, false)
}
diff --git a/src/UI/Popup/Notes/NoteCommentElement.ts b/src/UI/Popup/Notes/NoteCommentElement.ts
index d8a69e624..065cc069f 100644
--- a/src/UI/Popup/Notes/NoteCommentElement.ts
+++ b/src/UI/Popup/Notes/NoteCommentElement.ts
@@ -1,6 +1,17 @@
import { Store, UIEventSource } from "../../../Logic/UIEventSource"
export default class NoteCommentElement {
+
+ public static mimickStatusChange(tags: UIEventSource>, opened: boolean) {
+ if (opened) {
+ tags.data.status = "open"
+ tags.data.closed_at = undefined
+ } else {
+ tags.data.status = "closed"
+ tags.data.closed_at = new Date().toISOString()
+ }
+ tags.ping()
+ }
/**
* Adds the comment to the _visualisation_ of the given note; doesn't _actually_ upload
* @param txt
@@ -16,9 +27,9 @@ export default class NoteCommentElement {
const username = state.osmConnection.userDetails.data.name
const urlRegex = /(https?:\/\/[^\s]+)/g
- const html = txt.replace(urlRegex, function (url) {
+ const html = txt?.replace(urlRegex, function(url) {
return '' + url + ""
- })
+ }) ?? ""
comments.push({
date: new Date().toISOString(),
diff --git a/src/UI/SpecialVisualisations/NoteVisualisations.ts b/src/UI/SpecialVisualisations/NoteVisualisations.ts
index 62aecc77f..76de6eae6 100644
--- a/src/UI/SpecialVisualisations/NoteVisualisations.ts
+++ b/src/UI/SpecialVisualisations/NoteVisualisations.ts
@@ -1,8 +1,4 @@
-import {
- SpecialVisualisationParams,
- SpecialVisualization,
- SpecialVisualizationSvelte,
-} from "../SpecialVisualization"
+import { SpecialVisualisationParams, SpecialVisualization, SpecialVisualizationSvelte } from "../SpecialVisualization"
import Constants from "../../Models/Constants"
import { UIEventSource } from "../../Logic/UIEventSource"
import { Feature } from "geojson"
@@ -126,10 +122,10 @@ class AddImageToNote extends SpecialVisualizationSvelte {
group = "notes"
needsUrls = []
- constr({ state, tags, args, feature }: SpecialVisualisationParams) {
- const id = tags.data[args[0] ?? "id"]
- tags = state.featureProperties.getStore(id)
- return new SvelteUIElement(UploadImage, { state, tags, feature })
+ constr(params: SpecialVisualisationParams) {
+ const id = params.tags.data[params.args[0] ?? "id"]
+ const tags = params.state.featureProperties.getStore(id)
+ return new SvelteUIElement(UploadImage, { ...params, tags })
}
}
diff --git a/src/UI/SpecialVisualisations/TagApplyViz.ts b/src/UI/SpecialVisualisations/TagApplyViz.ts
index d07eba57a..b1a406e75 100644
--- a/src/UI/SpecialVisualisations/TagApplyViz.ts
+++ b/src/UI/SpecialVisualisations/TagApplyViz.ts
@@ -1,9 +1,5 @@
import { AutoAction } from "../Popup/AutoApplyButtonVis"
-import {
- SpecialVisualisationParams,
- SpecialVisualization,
- SpecialVisualizationState,
-} from "../SpecialVisualization"
+import { SpecialVisualisationParams, SpecialVisualization, SpecialVisualizationState } from "../SpecialVisualization"
import { Utils } from "../../Utils"
import { Store, UIEventSource } from "../../Logic/UIEventSource"
import { Tag } from "../../Logic/Tags/Tag"
@@ -47,6 +43,11 @@ export default class TagApplyViz extends SpecialVisualization implements AutoAct
defaultValue: undefined,
doc: "If specified, this maproulette-challenge will be closed when the tags are applied. This should be the `id` of the individual task, _not_ the task_id (which corresponds with the challenge).",
},
+ {
+ name: "changeset_type",
+ defaultValue: "answer",
+ doc: "If set, this attribute will be set on the changeset. A typical example is `answer` if it answers a question or `import:attribute` if attributes are copied"
+ }
]
public readonly example =
"`{tag_apply(survey_date=$_now:date, Surveyed today!)}`, `{tag_apply(addr:street=$addr:street, Apply the address, apply_icon.svg, _closest_osm_id)"
@@ -133,7 +134,8 @@ export default class TagApplyViz extends SpecialVisualization implements AutoAct
_: Feature,
state: SpecialVisualizationState,
tags: UIEventSource,
- args: string[]
+ args: string[],
+ changesetMetaattribute: string = "change"
): Promise {
const tagsToApply = TagApplyViz.generateTagsToApply(args[0], tags)
const targetIdKey = args[3]
@@ -145,7 +147,7 @@ export default class TagApplyViz extends SpecialVisualization implements AutoAct
tags.data, // We pass in the tags of the selected element, not the tags of the target element!
{
theme: state.theme.id,
- changeType: "answer",
+ changeType: changesetMetaattribute
}
)
await state.changes.applyAction(changeAction)
@@ -184,12 +186,13 @@ export default class TagApplyViz extends SpecialVisualization implements AutoAct
let image = args[2]?.trim()
const targetIdKey = args[3]
const maprouletteId = args[4]
+ const changeType = args[5]
if (image === "" || image === "undefined") {
image = undefined
}
const onApply = async () => {
- await this.applyActionOn(feature, state, tags, args)
+ await this.applyActionOn(feature, state, tags, args, changeType)
}
return new SvelteUIElement(TagApplyButton, {