diff --git a/package-lock.json b/package-lock.json index d1a27a9..17f14a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "deeplink", - "version": "0.0.21", + "version": "0.0.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "deeplink", - "version": "0.0.21", + "version": "0.0.22", "dependencies": { "axios": "^1.7.2", "hasbin": "^1.2.3", @@ -22,13 +22,12 @@ "styled-components": "^5.0.1" }, "devDependencies": { - "@types/jest": "^29.5.12", "@types/marked": "^2.0.2", "@types/mocha": "^10.0.7", "@types/node": "20.x", "@types/react": "^16.9.0", "@types/react-dom": "^16.9.0", - "@types/vscode": "^1.91.0", + "@types/vscode": "^1.19.0", "@typescript-eslint/eslint-plugin": "^7.14.1", "@typescript-eslint/parser": "^7.11.0", "@vscode/test-cli": "^0.0.9", @@ -44,7 +43,7 @@ "webpack-cli": "^3.3.5" }, "engines": { - "vscode": "^1.91.0" + "vscode": "^1.29.0" } }, "node_modules/@ampproject/remapping": { @@ -818,50 +817,6 @@ "node": ">=8" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -959,13 +914,6 @@ "node": ">=14" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", @@ -983,37 +931,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1096,13 +1013,6 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "license": "MIT" }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/vscode": { "version": "1.92.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.92.0.tgz", @@ -1110,23 +1020,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", @@ -2669,22 +2562,6 @@ "node": ">=6.0" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -3424,16 +3301,6 @@ "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -4086,23 +3953,6 @@ "node": ">=0.10.0" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -5908,87 +5758,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7959,34 +7728,6 @@ "node": ">= 0.8.0" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -8268,7 +8009,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/react-redux": { "version": "7.2.9", @@ -9329,29 +9071,6 @@ "figgy-pudding": "^3.5.1" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", diff --git a/package.json b/package.json index ad2c571..440da3c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,23 @@ "categories": [ "Other", "Snippets", - "Debuggers" + "Debuggers", + "Extension Packs", + "Programming Languages" + ], + "keywords": [ + "todo", + "todolist", + "kanban", + "task", + "project", + "management", + "generate", + "generator", + "template", + "webdev", + "snippet", + "file" ], "main": "./out/extension.js", "contributes": { @@ -139,8 +155,157 @@ "category": "MDT", "title": "Open Task Board ✅", "command": "extension.openTaskBoard" + }, + { + "category": "MDT", + "command": "mdt.dispose", + "title": "Remove All Comments" + }, + { + "command": "mdt.createNote", + "title": "Create Note", + "enablement": "!commentIsEmpty" + }, + { + "command": "mdt.replyNote", + "title": "Reply", + "enablement": "!commentIsEmpty" + }, + { + "command": "mdt.editNote", + "title": "Edit", + "icon": { + "dark": "resources/edit_inverse.svg", + "light": "resources/edit.svg" + } + }, + { + "command": "mdt.deleteNote", + "title": "Delete", + "icon": { + "dark": "resources/close_inverse.svg", + "light": "resources/close.svg" + } + }, + { + "command": "mdt.deleteNoteComment", + "title": "Delete", + "icon": { + "dark": "resources/close_inverse.svg", + "light": "resources/close.svg" + } + }, + { + "command": "mdt.saveNote", + "title": "Save" + }, + { + "command": "mdt.cancelsaveNote", + "title": "Cancel" + }, + { + "command": "mdt.startDraft", + "title": "Start Draft", + "enablement": "!commentIsEmpty" + }, + { + "command": "mdt.finishDraft", + "title": "Finish Draft" } - ] + ], + "menus": { + "commandPalette": [ + { + "command": "mdt.createNote", + "when": "false" + }, + { + "command": "mdt.replyNote", + "when": "false" + }, + { + "command": "mdt.editNote", + "when": "false" + }, + { + "command": "mdt.deleteNote", + "when": "false" + }, + { + "command": "mdt.deleteNoteComment", + "when": "false" + }, + { + "command": "mdt.saveNote", + "when": "false" + }, + { + "command": "mdt.cancelsaveNote", + "when": "false" + }, + { + "command": "mdt.startDraft", + "when": "false" + }, + { + "command": "mdt.finishDraft", + "when": "false" + } + ], + "comments/commentThread/title": [ + { + "command": "mdt.deleteNote", + "group": "navigation", + "when": "commentController == comment-mdt && !commentThreadIsEmpty" + } + ], + "comments/commentThread/context": [ + { + "command": "mdt.createNote", + "group": "inline", + "when": "commentController == comment-mdt && commentThreadIsEmpty" + }, + { + "command": "mdt.replyNote", + "group": "inline", + "when": "commentController == comment-mdt && !commentThreadIsEmpty" + }, + { + "command": "mdt.startDraft", + "group": "inline", + "when": "commentController == comment-mdt && commentThreadIsEmpty" + }, + { + "command": "mdt.finishDraft", + "group": "inline", + "when": "commentController == comment-mdt && commentThread == draft" + } + ], + "comments/comment/title": [ + { + "command": "mdt.editNote", + "group": "group@1", + "when": "commentController == comment-mdt" + }, + { + "command": "mdt.deleteNoteComment", + "group": "group@2", + "when": "commentController == comment-mdt && comment == canDelete" + } + ], + "comments/comment/context": [ + { + "command": "mdt.cancelsaveNote", + "group": "inline@1", + "when": "commentController == comment-mdt" + }, + { + "command": "mdt.saveNote", + "group": "inline@2", + "when": "commentController == comment-mdt" + } + ] + } }, "scripts": { "vscode:prepublish": "npm run compile", diff --git a/resources/close.svg b/resources/close.svg new file mode 100644 index 0000000..fde3440 --- /dev/null +++ b/resources/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/close_inverse.svg b/resources/close_inverse.svg new file mode 100644 index 0000000..d88aa12 --- /dev/null +++ b/resources/close_inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/edit.svg b/resources/edit.svg new file mode 100755 index 0000000..ecde924 --- /dev/null +++ b/resources/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/edit_inverse.svg b/resources/edit_inverse.svg new file mode 100755 index 0000000..da956cb --- /dev/null +++ b/resources/edit_inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 590f82d..4550cfc 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -9,6 +9,7 @@ import PushNotificationDelegate from './features/push_notification/push_notifica import DeviceDelegate from './features/device/device_delegate'; import { GistDelegate } from './features/gists/gist_delegate'; import KanbanBoardDelegate from './features/kanban_board/kanban_board_delegate'; +import CommentDelegate from './features/comment/comment_delegate'; export function deactivate() { } @@ -19,6 +20,7 @@ export function activate(context: ExtensionContext) { const deviceDelegate = new DeviceDelegate(); const gistDelegate = new GistDelegate(); const kanbanBoardDelegate = new KanbanBoardDelegate(); + const commentDelegate = new CommentDelegate(); // Deeplink createDeeplinkStatusBarItem().show(); @@ -61,4 +63,7 @@ export function activate(context: ExtensionContext) { // Kanban Board context.subscriptions.push(commands.registerCommand(OPEN_KANBAN_BOARD, async (uri: Uri) => kanbanBoardDelegate.openKanbanBoard(context, uri))); + // Comments + commentDelegate.activate(context); + } \ No newline at end of file diff --git a/src/features/comment/comment_delegate.ts b/src/features/comment/comment_delegate.ts new file mode 100644 index 0000000..9a24a44 --- /dev/null +++ b/src/features/comment/comment_delegate.ts @@ -0,0 +1,149 @@ +import * as vscode from "vscode"; +const { exec, spawn } = require("child_process"); +const fs = require('fs'); +const path = require('path'); + +let commentId = 1; + +export default class CommentDelegate { + + activate(context: vscode.ExtensionContext) { + // A `CommentController` is able to provide comments for documents. + const commentController = vscode.comments.createCommentController('comment-mdt', 'Mobile Dev Tools Comment API'); + context.subscriptions.push(commentController); + + // A `CommentingRangeProvider` controls where gutter decorations that allow adding comments are shown + commentController.commentingRangeProvider = { + provideCommentingRanges: (document: vscode.TextDocument, token: vscode.CancellationToken) => { + const lineCount = document.lineCount; + return [new vscode.Range(0, 0, lineCount - 1, 0)]; + } + }; + + context.subscriptions.push(vscode.commands.registerCommand('mdt.createNote', (reply: vscode.CommentReply) => { + replyNote(reply); + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.replyNote', (reply: vscode.CommentReply) => { + replyNote(reply); + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.startDraft', (reply: vscode.CommentReply) => { + const thread = reply.thread; + thread.contextValue = 'draft'; + const newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'Mobile Dev Tools' }, thread); + newComment.label = 'pending'; + thread.comments = [...thread.comments, newComment]; + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.finishDraft', (reply: vscode.CommentReply) => { + const thread = reply.thread; + + if (!thread) { + return; + } + + thread.contextValue = undefined; + thread.collapsibleState = vscode.CommentThreadCollapsibleState.Collapsed; + if (reply.text) { + const newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'Mobile Dev Tools' }, thread); + thread.comments = [...thread.comments, newComment].map(comment => { + comment.label = undefined; + return comment; + }); + } + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.deleteNoteComment', (comment: NoteComment) => { + const thread = comment.parent; + if (!thread) { + return; + } + + thread.comments = thread.comments.filter(cmt => (cmt as NoteComment).id !== comment.id); + + if (thread.comments.length === 0) { + thread.dispose(); + } + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.deleteNote', (thread: vscode.CommentThread) => { + thread.dispose(); + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.cancelsaveNote', (comment: NoteComment) => { + if (!comment.parent) { + return; + } + + comment.parent.comments = comment.parent.comments.map(cmt => { + if ((cmt as NoteComment).id === comment.id) { + cmt.body = (cmt as NoteComment).savedBody; + cmt.mode = vscode.CommentMode.Preview; + } + + return cmt; + }); + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.saveNote', (comment: NoteComment) => { + if (!comment.parent) { + return; + } + + comment.parent.comments = comment.parent.comments.map(cmt => { + if ((cmt as NoteComment).id === comment.id) { + (cmt as NoteComment).savedBody = cmt.body; + cmt.mode = vscode.CommentMode.Preview; + } + + return cmt; + }); + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.editNote', (comment: NoteComment) => { + if (!comment.parent) { + return; + } + + comment.parent.comments = comment.parent.comments.map(cmt => { + if ((cmt as NoteComment).id === comment.id) { + cmt.mode = vscode.CommentMode.Editing; + } + + return cmt; + }); + })); + + context.subscriptions.push(vscode.commands.registerCommand('mdt.dispose', () => { + commentController.dispose(); + })); + + function replyNote(reply: vscode.CommentReply) { + const thread = reply.thread; + const newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'Mobile Dev Tools' }, thread, thread.comments.length ? 'canDelete' : undefined); + if (thread.contextValue === 'draft') { + newComment.label = 'pending'; + } + + thread.comments = [...thread.comments, newComment]; + } + } + +} + +class NoteComment implements vscode.Comment { + id: number; + label: string | undefined; + savedBody: string | vscode.MarkdownString; // for the Cancel button + constructor( + public body: string | vscode.MarkdownString, + public mode: vscode.CommentMode, + public author: vscode.CommentAuthorInformation, + public parent?: vscode.CommentThread, + public contextValue?: string + ) { + this.id = ++commentId; + this.savedBody = this.body; + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index ead9a30..a9f9835 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "module": "commonjs", "target": "es6", "outDir": "out", - "lib": ["es6"], + "lib": ["es6", "es2020"], "sourceMap": true, "rootDir": "src", "noImplicitAny": false,