Browse Source

Feature: Convert to Markdown button at editor of Card Description and Comment. Useful when there is no WYSIWYG editor.

Thanks to BabyFnord and xet7 !

Fixes #5012,
fixes #3003,
fixes #3399,
fixes #2968,
fixes #2933
Lauri Ojansivu 1 year ago
parent
commit
069e2c69b2

+ 7 - 0
client/components/main/editor.css

@@ -1,3 +1,10 @@
+.new-comment a.fa.fa-brands.fa-markdown,
+.inlined-form a.fa.fa-brands.fa-markdown {
+  float: right;
+  position: relative;
+  top: 20px;
+  right: 56px;
+}
 .new-comment a.fa.fa-copy,
 .inlined-form a.fa.fa-copy {
   float: right;

+ 1 - 0
client/components/main/editor.jade

@@ -1,4 +1,5 @@
 template(name="editor")
+  a.fa.fa-brands.fa-markdown(title="{{_ 'convert-to-markdown'}}")
   a.fa.fa-copy(title="{{_ 'copy-text-to-clipboard'}}")
   span.copied-tooltip {{_ 'copied'}}
   textarea.editor(

+ 9 - 1
client/components/main/editor.js

@@ -1,4 +1,5 @@
 import { ReactiveCache } from '/imports/reactiveCache';
+var converter = require('@wekanteam/html-to-markdown');
 
 const specialHandles = [
   {userId: 'board_members', username: 'board_members'},
@@ -49,7 +50,8 @@ BlazeComponent.extendComponent({
       autosize($textarea);
       $textarea.escapeableTextComplete(mentions);
     };
-    if (Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR !== false) {
+/*
+    if (Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR === true || Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR === 'true') {
       const isSmall = Utils.isMiniScreen();
       const toolbar = isSmall
         ? [
@@ -269,6 +271,8 @@ BlazeComponent.extendComponent({
     } else {
       enableTextarea();
     }
+*/
+    enableTextarea();
   },
   events() {
     return [
@@ -280,6 +284,10 @@ BlazeComponent.extendComponent({
           const $tooltip = this.$('.copied-tooltip');
           Utils.showCopied(promise, $tooltip);
         },
+        'click a.fa.fa-brands.fa-markdown'(event) {
+          const $editor = this.$('textarea.editor');
+          $editor[0].value = converter.convert($editor[0].value);
+        },
       }
     ]
   }

+ 2 - 1
imports/i18n/data/en.i18n.json

@@ -1241,5 +1241,6 @@
   "translation-text": "Translation text",
   "show-at-minicard": "Show at minicard",
   "show-checklist-at-minicard": "Show checklist at minicard",
-  "show-subtasks-field": "Show subtasks field"
+  "show-subtasks-field": "Show subtasks field",
+  "convert-to-markdown": "Convert to markdown"
 }

+ 5 - 72
package-lock.json

@@ -108,6 +108,11 @@
       "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.58.tgz",
       "integrity": "sha512-Y8ETZc8afYf6lQ/mVp096phIVsgD/GmDxtm3YaPcc+71jmi/J6zdwbwaUU4JvS56mq6aSfbpkcKhQ5WugrWFPw=="
     },
+    "@wekanteam/html-to-markdown": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@wekanteam/html-to-markdown/-/html-to-markdown-1.0.2.tgz",
+      "integrity": "sha512-PxeGIu/HMjmL84N2Dj5qp4lFlBP4jV/y6WU/JhDiFPx6gfGEWXgDcc9sShTPNvECtToGAA0SCD6T/k50CMHi8Q=="
+    },
     "@wekanteam/meteor-globals": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/@wekanteam/meteor-globals/-/meteor-globals-1.1.4.tgz",
@@ -261,12 +266,6 @@
       "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
     },
-    "assertion-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
-      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
-      "dev": true
-    },
     "async": {
       "version": "3.2.4",
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
@@ -402,30 +401,6 @@
         "get-intrinsic": "^1.0.2"
       }
     },
-    "chai": {
-      "version": "4.3.8",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz",
-      "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==",
-      "dev": true,
-      "requires": {
-        "assertion-error": "^1.1.0",
-        "check-error": "^1.0.2",
-        "deep-eql": "^4.1.2",
-        "get-func-name": "^2.0.0",
-        "loupe": "^2.3.1",
-        "pathval": "^1.1.1",
-        "type-detect": "^4.0.5"
-      }
-    },
-    "chai-as-promised": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
-      "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
-      "dev": true,
-      "requires": {
-        "check-error": "^1.0.2"
-      }
-    },
     "chainsaw": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
@@ -434,12 +409,6 @@
         "traverse": ">=0.3.0 <0.4"
       }
     },
-    "check-error": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
-      "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
-      "dev": true
-    },
     "cheerio": {
       "version": "1.0.0-rc.10",
       "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
@@ -566,15 +535,6 @@
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
       "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="
     },
-    "deep-eql": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
-      "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
-      "dev": true,
-      "requires": {
-        "type-detect": "^4.0.0"
-      }
-    },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -878,12 +838,6 @@
         "wide-align": "^1.1.2"
       }
     },
-    "get-func-name": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
-      "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
-      "dev": true
-    },
     "get-intrinsic": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
@@ -1320,15 +1274,6 @@
       "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
       "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
     },
-    "loupe": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
-      "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
-      "dev": true,
-      "requires": {
-        "get-func-name": "^2.0.0"
-      }
-    },
     "lru-cache": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -2478,12 +2423,6 @@
         }
       }
     },
-    "pathval": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
-      "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
-      "dev": true
-    },
     "peek-readable": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
@@ -2668,12 +2607,6 @@
         "supports-color": "^7.2.0"
       }
     },
-    "sinon-chai": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz",
-      "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==",
-      "dev": true
-    },
     "slick": {
       "version": "1.12.2",
       "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz",

+ 2 - 4
package.json

@@ -13,16 +13,14 @@
   },
   "homepage": "https://wekan.github.io",
   "devDependencies": {
-    "chai": "^4.3.8",
-    "chai-as-promised": "^7.1.1",
     "flatted": "^3.2.2",
-    "sinon": "^13.0.2",
-    "sinon-chai": "^3.7.0"
+    "sinon": "^13.0.2"
   },
   "dependencies": {
     "@babel/runtime": "^7.22.11",
     "@mapbox/node-pre-gyp": "^1.0.10",
     "@rwap/jquery-ui-touch-punch": "^1.0.11",
+    "@wekanteam/html-to-markdown": "^1.0.2",
     "@wekanteam/meteor-globals": "^1.1.4",
     "@wekanteam/meteor-reactive-cache": "^1.0.6",
     "ajv": "^6.12.6",