diff --git a/app/components/CrsSelector.vue b/app/components/CrsSelector.vue
index 023c5b11b..9e4de11ef 100644
--- a/app/components/CrsSelector.vue
+++ b/app/components/CrsSelector.vue
@@ -1,63 +1,45 @@
+ >
+
+
+
+ {{ value }}
+
+
+
+
diff --git a/app/components/FeedBack/Snackers.vue b/app/components/FeedBack/Snackers.vue
index d132da425..ca42955ae 100644
--- a/app/components/FeedBack/Snackers.vue
+++ b/app/components/FeedBack/Snackers.vue
@@ -10,6 +10,15 @@ const show = ref(true);
function calc_margin(index: number): string {
return `${index * MARGIN_BETWEEN_SNACKERS + FIRST_SNACKER_MARGIN}px`;
}
+
+function runAction(feedback: (typeof feedbackStore.feedbacks)[number]): void {
+ try {
+ feedback.action?.onClick();
+ } finally {
+ // The snackbar closes even when the action fails
+ feedbackStore.delete_feedback(feedback.id);
+ }
+}
@@ -62,9 +71,27 @@ function calc_margin(index: number): string {
+
+
+
+
+
+
+
+
+
+import { formatCrs, formatCrsCode } from "@ogw_front/utils/crs";
+import { useCrsStore } from "@ogw_front/stores/crs";
+
+const crsStore = useCrsStore();
+const label = computed(() =>
+ crsStore.projectCrs
+ ? `CRS: ${formatCrsCode(crsStore.projectCrs)} · ${crsStore.projectCrs.name}`
+ : "No CRS",
+);
+
+
+
+
+
+ {{ label }}
+
+
+
+
diff --git a/app/components/Viewer/ContextMenu/InfoCard.vue b/app/components/Viewer/ContextMenu/InfoCard.vue
index fb88aaf55..d4f9751c8 100644
--- a/app/components/Viewer/ContextMenu/InfoCard.vue
+++ b/app/components/Viewer/ContextMenu/InfoCard.vue
@@ -1,9 +1,12 @@
@@ -168,6 +178,26 @@ const formattedId = computed(() => formatId(metaData.id));
class="ml-1"
/>
+
+ CRS
+ {{ formatCrsCode(liveCrs) }}
+ {{ formatCrs(liveCrs) }}
+
+
diff --git a/app/components/Viewer/ObjectTree/Base/ItemLabel.vue b/app/components/Viewer/ObjectTree/Base/ItemLabel.vue
index 246a93ca7..b27dbc6c9 100644
--- a/app/components/Viewer/ObjectTree/Base/ItemLabel.vue
+++ b/app/components/Viewer/ObjectTree/Base/ItemLabel.vue
@@ -1,9 +1,12 @@