diff --git a/client/components/main/editor.css b/client/components/main/editor.css index 6883f903c..1b829d3e8 100644 --- a/client/components/main/editor.css +++ b/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; diff --git a/client/components/main/editor.jade b/client/components/main/editor.jade index 2bedac612..4d7117ca3 100644 --- a/client/components/main/editor.jade +++ b/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( diff --git a/client/components/main/editor.js b/client/components/main/editor.js index 250c7ee1a..2830b4d95 100644 --- a/client/components/main/editor.js +++ b/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); + }, } ] } diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json index 8f977e6ee..68121aefa 100644 --- a/imports/i18n/data/en.i18n.json +++ b/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" } diff --git a/package-lock.json b/package-lock.json index 8312372b2..44bfe6d6c 100644 --- a/package-lock.json +++ b/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", diff --git a/package.json b/package.json index 11bd0c524..80f1a7398 100644 --- a/package.json +++ b/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",