Merge master

This commit is contained in:
Pieter Vander Vennet 2024-09-28 12:02:56 +02:00
commit 45fe5767e1
6 changed files with 65 additions and 37 deletions

View file

@ -2,6 +2,8 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [0.47.2](https://github.com/pietervdvn/mapcomplete/compare/v0.47.1...v0.47.2) (2024-09-24) ### [0.47.2](https://github.com/pietervdvn/mapcomplete/compare/v0.47.1...v0.47.2) (2024-09-24)
@ -62,6 +64,21 @@ All notable changes to this project will be documented in this file. See [standa
* **waste:** add filter for 'recycling centre' ([5da63bf](https://github.com/pietervdvn/MapComplete/commit/5da63bf83aa7d8b230c8dbc082be3fba33344289)) * **waste:** add filter for 'recycling centre' ([5da63bf](https://github.com/pietervdvn/MapComplete/commit/5da63bf83aa7d8b230c8dbc082be3fba33344289))
### [0.46.11](https://github.com/USERNAME/REPOSITORY_NAME/compare/v0.46.10...v0.46.11) (2024-09-28)
### Features
* check if the image was blurred, attempt to reload if it is done; refactoring of ImageProvider code ([4650170](https://github.com/USERNAME/REPOSITORY_NAME/commits4650170db4bdd3b9e4fbd1900147a7433652dd6f))
### Bug Fixes
* fix tests with some refactoring ([0b992e7](https://github.com/USERNAME/REPOSITORY_NAME/commits0b992e75a481ffa5156f68d9a9fa3495a1fec4c9))
* note themes uses full URL now instead of Panoramax-id ([ce363df](https://github.com/USERNAME/REPOSITORY_NAME/commitsce363dfb59c3237e20aed87ab51da42b9652cb01))
* quickfixes to image upload flow ([ba1eb28](https://github.com/USERNAME/REPOSITORY_NAME/commitsba1eb28f274ac6cc6be4614456ca3d2137d9ba64))
### [0.46.10](https://github.com/USERNAME/REPOSITORY_NAME/compare/v0.46.9...v0.46.10) (2024-09-26) ### [0.46.10](https://github.com/USERNAME/REPOSITORY_NAME/compare/v0.46.9...v0.46.10) (2024-09-26)

View file

@ -1,4 +1,4 @@
import { ImageUploader } from "./ImageUploader" import { ImageUploader, UploadResult } from "./ImageUploader"
import LinkImageAction from "../Osm/Actions/LinkImageAction" import LinkImageAction from "../Osm/Actions/LinkImageAction"
import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore" import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore"
import { OsmId, OsmTags } from "../../Models/OsmFeature" import { OsmId, OsmTags } from "../../Models/OsmFeature"
@ -7,7 +7,6 @@ import { Store, UIEventSource } from "../UIEventSource"
import { OsmConnection } from "../Osm/OsmConnection" import { OsmConnection } from "../Osm/OsmConnection"
import { Changes } from "../Osm/Changes" import { Changes } from "../Osm/Changes"
import Translations from "../../UI/i18n/Translations" import Translations from "../../UI/i18n/Translations"
import NoteCommentElement from "../../UI/Popup/Notes/NoteCommentElement"
import { Translation } from "../../UI/i18n/Translation" import { Translation } from "../../UI/i18n/Translation"
import { IndexedFeatureSource } from "../FeatureSource/FeatureSource" import { IndexedFeatureSource } from "../FeatureSource/FeatureSource"
import { GeoOperations } from "../GeoOperations" import { GeoOperations } from "../GeoOperations"
@ -111,44 +110,40 @@ export class ImageUploadManager {
} }
const tags = tagsStore.data const tags = tagsStore.data
const featureId = <OsmId>tags.id const featureId = <OsmId>tags.id
const author = this._osmConnection.userDetails.data.name const author = this._osmConnection.userDetails.data.name
const action = await this.uploadImageWithLicense( const uploadResult = await this.uploadImageWithLicense(
featureId, featureId,
author, author,
file, file,
targetKey, targetKey,
tags?.data?.["_orig_theme"],
) )
if (!uploadResult) {
return
}
const properties = this._featureProperties.getStore(featureId)
const action = new LinkImageAction(featureId, uploadResult. key, uploadResult . value, properties, {
theme: tags?.data?.["_orig_theme"] ?? this._layout.id,
changeType: "add-image",
})
if (!action) {
return
}
if (!isNaN(Number(featureId))) {
// This is a map note
const url = action._url
await this._osmConnection.addCommentToNote(featureId, url)
NoteCommentElement.addCommentTo(url, <UIEventSource<any>>tagsStore, {
osmConnection: this._osmConnection,
})
return
}
await this._changes.applyAction(action) await this._changes.applyAction(action)
} }
private async uploadImageWithLicense( public async uploadImageWithLicense(
featureId: OsmId, featureId: string,
author: string, author: string,
blob: File, blob: File,
targetKey: string | undefined, targetKey: string | undefined,
theme?: string, ): Promise<UploadResult> {
): Promise<LinkImageAction> {
this.increaseCountFor(this._uploadStarted, featureId) this.increaseCountFor(this._uploadStarted, featureId)
const properties = this._featureProperties.getStore(featureId)
let key: string let key: string
let value: string let value: string
let absoluteUrl: string
let location: [number, number] = undefined let location: [number, number] = undefined
if (this._gps.data) { if (this._gps.data) {
location = [this._gps.data.longitude, this._gps.data.latitude] location = [this._gps.data.longitude, this._gps.data.latitude]
@ -157,7 +152,6 @@ export class ImageUploadManager {
const feature = this._indexedFeatures.featuresById.data.get(featureId) const feature = this._indexedFeatures.featuresById.data.get(featureId)
location = GeoOperations.centerpointCoordinates(feature) location = GeoOperations.centerpointCoordinates(feature)
} }
let absoluteUrl: string
try { try {
;({ key, value, absoluteUrl } = await this._uploader.uploadImage(blob, location, author)) ;({ key, value, absoluteUrl } = await this._uploader.uploadImage(blob, location, author))
} catch (e) { } catch (e) {
@ -179,10 +173,8 @@ export class ImageUploadManager {
value = absoluteUrl value = absoluteUrl
} }
this.increaseCountFor(this._uploadFinished, featureId) this.increaseCountFor(this._uploadFinished, featureId)
return new LinkImageAction(featureId, key, value, properties, { return {key, absoluteUrl, value}
theme: theme ?? this._layout.id,
changeType: "add-image",
})
} }
private getCounterFor(collection: Map<string, UIEventSource<number>>, key: string | "*") { private getCounterFor(collection: Map<string, UIEventSource<number>>, key: string | "*") {

View file

@ -8,5 +8,7 @@ export interface ImageUploader {
blob: File, blob: File,
currentGps: [number,number], currentGps: [number,number],
author: string author: string
): Promise<{ key: string; value: string, absoluteUrl: string }> ): Promise<UploadResult>
} }
export interface UploadResult{ key: string; value: string, absoluteUrl: string }

View file

@ -5,7 +5,7 @@
import type { SpecialVisualizationState } from "../SpecialVisualization" import type { SpecialVisualizationState } from "../SpecialVisualization"
import { ImmutableStore, UIEventSource } from "../../Logic/UIEventSource" import { ImmutableStore, UIEventSource } from "../../Logic/UIEventSource"
import type { OsmTags } from "../../Models/OsmFeature" import type { OsmId, OsmTags } from "../../Models/OsmFeature"
import LoginToggle from "../Base/LoginToggle.svelte" import LoginToggle from "../Base/LoginToggle.svelte"
import Translations from "../i18n/Translations" import Translations from "../i18n/Translations"
import Tr from "../Base/Tr.svelte" import Tr from "../Base/Tr.svelte"
@ -14,11 +14,14 @@
import LoginButton from "../Base/LoginButton.svelte" import LoginButton from "../Base/LoginButton.svelte"
import { Translation } from "../i18n/Translation" import { Translation } from "../i18n/Translation"
import Camera from "@babeard/svelte-heroicons/solid/Camera" import Camera from "@babeard/svelte-heroicons/solid/Camera"
import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
import NoteCommentElement from "../Popup/Notes/NoteCommentElement"
export let state: SpecialVisualizationState export let state: SpecialVisualizationState
export let tags: UIEventSource<OsmTags> export let tags: UIEventSource<OsmTags>
export let targetKey: string = undefined export let targetKey: string = undefined
export let layer: LayerConfig
/** /**
* Image to show in the button * Image to show in the button
* NOT the image to upload! * NOT the image to upload!
@ -30,11 +33,9 @@
export let labelText: string = undefined export let labelText: string = undefined
const t = Translations.t.image const t = Translations.t.image
let licenseStore = state?.userRelatedState?.imageLicense ?? new ImmutableStore("CC0")
let errors = new UIEventSource<Translation[]>([]) let errors = new UIEventSource<Translation[]>([])
function handleFiles(files: FileList) { async function handleFiles(files: FileList) {
const errs = [] const errs = []
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
const file = files.item(i) const file = files.item(i)
@ -45,9 +46,26 @@
errs.push(canBeUploaded.error) errs.push(canBeUploaded.error)
continue continue
} }
state?.imageUploadManager.uploadImageAndApply(file, tags, targetKey)
if(layer?.id === "note"){
const uploadResult = await state?.imageUploadManager.uploadImageWithLicense(tags.data.id,
state.osmConnection.userDetails.data?.name ?? "Anonymous",
file, "image")
if(!uploadResult){
return
}
const url = uploadResult.absoluteUrl
await state.osmConnection.addCommentToNote(tags.data.id, url)
NoteCommentElement.addCommentTo(url, <UIEventSource<any>>tags, {
osmConnection: state.osmConnection,
})
return
}
await state?.imageUploadManager.uploadImageAndApply(file, tags, targetKey)
} catch (e) { } catch (e) {
alert(e) console.error(e)
state.reportError(e, "Could not upload image")
} }
} }
errors.setData(errs) errors.setData(errs)

View file

@ -86,8 +86,8 @@ export interface SpecialVisualizationState {
getMatchingLayer(properties: Record<string, string>); getMatchingLayer(properties: Record<string, string>);
showCurrentLocationOn(map: Store<MlMap>): ShowDataLayer showCurrentLocationOn(map: Store<MlMap>): ShowDataLayer
reportError(message: string | Error | XMLHttpRequest, extramessage?: string): Promise<void>
reportError(message: string): Promise<void>
} }
export interface SpecialVisualization { export interface SpecialVisualization {

View file

@ -1100,11 +1100,10 @@ export default class SpecialVisualizations {
], ],
needsUrls: [Imgur.apiUrl, ...Imgur.supportingUrls], needsUrls: [Imgur.apiUrl, ...Imgur.supportingUrls],
constr: (state, tags, args) => { constr: (state, tags, args, feature, layer) => {
const id = tags.data[args[0] ?? "id"] const id = tags.data[args[0] ?? "id"]
tags = state.featureProperties.getStore(id) tags = state.featureProperties.getStore(id)
console.log("Id is", id) return new SvelteUIElement(UploadImage, { state, tags, layer })
return new SvelteUIElement(UploadImage, { state, tags })
}, },
}, },
{ {