From 9e5ec4eeb813c9633d556d9d7398ab6a6769c6c0 Mon Sep 17 00:00:00 2001
From: Matt J <matthieu@probabl.ai>
Date: Thu, 16 Jan 2025 14:36:05 +0100
Subject: [PATCH] clear note button

---
 skore-ui/src/assets/styles/_variables.css |  2 +
 skore-ui/src/views/project/ItemNote.vue   | 55 +++++++++++++++++------
 2 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/skore-ui/src/assets/styles/_variables.css b/skore-ui/src/assets/styles/_variables.css
index 22fa25f06..b49e3e2ba 100644
--- a/skore-ui/src/assets/styles/_variables.css
+++ b/skore-ui/src/assets/styles/_variables.css
@@ -60,6 +60,7 @@ body[data-vscode-theme-kind="vscode-dark"],
   --color-text-branding: #f08b30;
   --color-text-button-primary: #fff;
   --color-text-logo: #fff;
+  --color-text-danger: #ff3b00;
 
   /* icons */
   --color-icon-primary: #f08b30;
@@ -98,6 +99,7 @@ body[data-vscode-theme-kind="vscode-light"],
   --color-text-branding: #3043f0;
   --color-text-button-primary: #fff;
   --color-text-logo: #000;
+  --color-text-danger: #ff3b00;
 
   /* icons */
   --color-icon-primary: #f08b30;
diff --git a/skore-ui/src/views/project/ItemNote.vue b/skore-ui/src/views/project/ItemNote.vue
index 76b780bde..dcf2aef62 100644
--- a/skore-ui/src/views/project/ItemNote.vue
+++ b/skore-ui/src/views/project/ItemNote.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { ref, useTemplateRef, watch } from "vue";
+import { nextTick, ref, useTemplateRef, watch } from "vue";
 
 import MarkdownWidget from "@/components/MarkdownWidget.vue";
 import RichTextEditor from "@/components/RichTextEditor.vue";
@@ -23,11 +23,23 @@ const debouncedSetNote = debounce(
   true
 );
 
-function onEditorBlurred() {
+function onEdit() {
+  isEditing.value = true;
+  nextTick(() => {
+    editor.value?.focus();
+  });
+}
+
+function onEditionEnd() {
   debouncedSetNote();
   isEditing.value = false;
 }
 
+function onClear() {
+  richText.value = "";
+  onEditionEnd();
+}
+
 watch(richText, () => {
   debouncedSetNote();
 });
@@ -36,7 +48,18 @@ watch(richText, () => {
 <template>
   <div class="item-note">
     <div class="header">
-      <div>Note</div>
+      <div class="info">
+        <div>Note</div>
+        <Transition name="fade">
+          <SimpleButton
+            v-if="isEditing && richText && richText.length > 0"
+            label="clear"
+            class="clear"
+            :is-inline="true"
+            @click="onClear"
+          />
+        </Transition>
+      </div>
       <Transition name="fade">
         <div class="edit-actions" v-if="isEditing">
           <SimpleButton :is-inline="true" icon="icon-bold" @click="editor?.markBold()" />
@@ -50,19 +73,12 @@ watch(richText, () => {
         ref="editor"
         v-model:value="richText"
         :rows="4"
-        @keyup.esc="onEditorBlurred"
-        @keydown.shift.enter="onEditorBlurred"
-        @keydown.meta.enter="onEditorBlurred"
+        @keyup.esc="onEditionEnd"
+        @keydown.shift.enter="onEditionEnd"
+        @keydown.meta.enter="onEditionEnd"
       />
     </div>
-    <div
-      class="preview"
-      v-if="!isEditing"
-      @click="
-        isEditing = true;
-        editor?.focus();
-      "
-    >
+    <div class="preview" v-if="!isEditing" @click="onEdit">
       <MarkdownWidget :source="richText" v-if="richText && richText.length > 0" />
       <div class="placeholder" v-else>Click to annotate {{ props.item.name }}.</div>
     </div>
@@ -83,6 +99,17 @@ watch(richText, () => {
     border-bottom: solid var(--stroke-width-md) var(--color-stroke-background-primary);
     background-color: var(--color-background-secondary);
 
+    .info {
+      display: flex;
+      gap: var(--spacing-8);
+
+      .clear {
+        padding: 0;
+        color: var(--color-text-danger);
+        font-size: var(--font-size-xs);
+      }
+    }
+
     .edit-actions {
       display: flex;
       flex-direction: row;