diff --git a/images/icons/launchpad-view-filled.svg b/images/icons/launchpad-view-filled.svg new file mode 100644 index 0000000000000..9d3fb65ab6576 --- /dev/null +++ b/images/icons/launchpad-view-filled.svg @@ -0,0 +1 @@ + diff --git a/images/icons/launchpad-view.svg b/images/icons/launchpad-view.svg new file mode 100644 index 0000000000000..6ccdf36c57826 --- /dev/null +++ b/images/icons/launchpad-view.svg @@ -0,0 +1 @@ + diff --git a/images/icons/template/mapping.json b/images/icons/template/mapping.json index 5d0006dfb4ca2..59174b8aa8e57 100644 --- a/images/icons/template/mapping.json +++ b/images/icons/template/mapping.json @@ -62,5 +62,7 @@ "search-view-filled": 61755, "stashes-view-filled": 61756, "tags-view-filled": 61757, - "worktrees-view-filled": 61758 + "worktrees-view-filled": 61758, + "launchpad-view": 61759, + "launchpad-view-filled": 61760 } \ No newline at end of file diff --git a/package.json b/package.json index 65fa5b623212c..a56d3e1aeb5e4 100644 --- a/package.json +++ b/package.json @@ -1427,7 +1427,8 @@ "worktrees", "contributors", "repositories", - "searchAndCompare" + "searchAndCompare", + "launchpad" ], "enumDescriptions": [ "Commits view", @@ -1438,7 +1439,8 @@ "Worktrees view", "Contributors view", "Repositories view", - "Search & Compare view" + "Search & Compare view", + "Launchpad view" ], "markdownDescription": "Specifies the default view to show when the _GitLens_ view is opened", "scope": "window", @@ -1454,8 +1456,9 @@ "tags": true, "worktrees": true, "contributors": true, - "repositories": true, - "searchAndCompare": true + "repositories": false, + "searchAndCompare": true, + "launchpad": false }, "properties": { "commits": { @@ -1495,13 +1498,18 @@ }, "repositories": { "type": "boolean", - "default": true, + "default": false, "description": "Group the Repositories view" }, "searchAndCompare": { "type": "boolean", "default": true, "description": "Group the Search & Compare view" + }, + "launchpad": { + "type": "boolean", + "default": false, + "description": "Group the Launchpad view" } }, "additionalProperties": false, @@ -1658,16 +1666,9 @@ }, { "id": "launchpad-view", - "title": "Launchpad View (ᴇxᴘᴇʀɪᴍᴇɴᴛᴀʟ)", + "title": "Launchpad View (ᴘʀᴏ)", "order": 101, "properties": { - "gitlens.views.launchpad.enabled": { - "type": "boolean", - "default": false, - "markdownDescription": "(Experimental) Specifies whether to enable an experimental _Launchpad_ view", - "scope": "window", - "order": 10 - }, "gitlens.views.launchpad.files.layout": { "type": "string", "default": "auto", @@ -8266,6 +8267,24 @@ "command": "gitlens.views.scm.grouped.contributors.setAsDefault", "title": "Set as Default View" }, + { + "command": "gitlens.views.scm.grouped.launchpad", + "title": "Launchpad", + "icon": "$(gitlens-launchpad-view)" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.detach", + "title": "Detach Launchpad View", + "icon": "$(gitlens-launchpad-view)" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.regroup", + "title": "Regroup Launchpad View" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.setAsDefault", + "title": "Set as Default View" + }, { "command": "gitlens.views.scm.grouped.remotes", "title": "Remotes", @@ -8391,6 +8410,12 @@ "category": "GitLens", "icon": "$(info)" }, + { + "command": "gitlens.views.launchpad.regroup", + "title": "Regroup with GitLens View", + "category": "GitLens", + "icon": "$(close)" + }, { "command": "gitlens.views.launchpad.refresh", "title": "Refresh", @@ -10163,6 +10188,20 @@ "fontPath": "dist/glicons.woff2", "fontCharacter": "\\f13e" } + }, + "gitlens-launchpad-view": { + "description": "launchpad-view icon", + "default": { + "fontPath": "dist/glicons.woff2", + "fontCharacter": "\\f13f" + } + }, + "gitlens-launchpad-view-filled": { + "description": "launchpad-view-filled icon", + "default": { + "fontPath": "dist/glicons.woff2", + "fontCharacter": "\\f140" + } } }, "menus": { @@ -11939,6 +11978,22 @@ "command": "gitlens.views.scm.grouped.contributors.setAsDefault", "when": "false" }, + { + "command": "gitlens.views.scm.grouped.launchpad", + "when": "false" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.detach", + "when": "false" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.regroup", + "when": "false" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.setAsDefault", + "when": "false" + }, { "command": "gitlens.views.scm.grouped.remotes", "when": "false" @@ -12047,6 +12102,10 @@ "command": "gitlens.views.launchpad.info", "when": "false" }, + { + "command": "gitlens.views.launchpad.regroup", + "when": "false" + }, { "command": "gitlens.views.launchpad.refresh", "when": "false" @@ -14045,6 +14104,22 @@ "when": "view == gitlens.views.scm.grouped && !config.gitlens.views.scm.grouped.views.searchAndCompare", "group": "2_gitlens@9" }, + { + "command": "gitlens.views.scm.grouped.launchpad", + "when": "view == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.launchpad && gitlens:views:scm:grouped:view != launchpad", + "group": "navigation@10", + "alt": "gitlens.views.scm.grouped.launchpad.detach" + }, + { + "submenu": "gitlens/views/grouped/launchpad", + "when": "view == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.launchpad && gitlens:views:scm:grouped:view == launchpad", + "group": "navigation@10" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.regroup", + "when": "view == gitlens.views.scm.grouped && !config.gitlens.views.scm.grouped.views.launchpad", + "group": "2_gitlens@10" + }, { "command": "gitlens.views.scm.grouped.refresh", "when": "view == gitlens.views.scm.grouped", @@ -14058,6 +14133,11 @@ { "command": "gitlens.views.launchpad.refresh", "when": "view == gitlens.views.launchpad", + "group": "navigation@98" + }, + { + "command": "gitlens.views.launchpad.regroup", + "when": "view == gitlens.views.launchpad && config.gitlens.views.scm.grouped.enabled", "group": "navigation@99" }, { @@ -17774,6 +17854,23 @@ "group": "2_gitlens_actions@1" } ], + "gitlens/views/grouped/launchpad": [ + { + "command": "gitlens.views.scm.grouped.launchpad.detach", + "when": "gitlens:views:scm:grouped:view == launchpad", + "group": "2_gitlens@1" + }, + { + "command": "gitlens.views.scm.grouped.launchpad.setAsDefault", + "when": "gitlens:views:scm:grouped:view == launchpad && config.gitlens.views.scm.grouped.default != launchpad", + "group": "2_gitlens@2" + }, + { + "submenu": "gitlens/views/grouped/more", + "when": "gitlens:views:scm:grouped:view == launchpad", + "group": "2_gitlens@3" + } + ], "gitlens/views/grouped/remotes": [ { "command": "gitlens.views.scm.grouped.remotes.detach", @@ -18122,6 +18219,36 @@ "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == contributors", "group": "9_gitlens@1" }, + { + "command": "gitlens.views.launchpad.setFilesLayoutToAuto", + "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == launchpad && config.gitlens.views.launchpad.files.layout == tree", + "group": "3_gitlens@1" + }, + { + "command": "gitlens.views.launchpad.setFilesLayoutToList", + "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == launchpad && config.gitlens.views.launchpad.files.layout == auto", + "group": "3_gitlens@1" + }, + { + "command": "gitlens.views.launchpad.setFilesLayoutToTree", + "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == launchpad && config.gitlens.views.launchpad.files.layout == list", + "group": "3_gitlens@1" + }, + { + "command": "gitlens.views.launchpad.setShowAvatarsOn", + "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == launchpad && !config.gitlens.views.launchpad.avatars", + "group": "5_gitlens@0" + }, + { + "command": "gitlens.views.launchpad.setShowAvatarsOff", + "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == launchpad && config.gitlens.views.launchpad.avatars", + "group": "5_gitlens@0" + }, + { + "command": "gitlens.views.launchpad.info", + "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == launchpad", + "group": "8_info@1" + }, { "command": "gitlens.views.remotes.setLayoutToList", "when": "view == gitlens.views.scm.grouped && gitlens:views:scm:grouped:view == remotes && config.gitlens.views.remotes.branches.layout == tree", @@ -18443,6 +18570,11 @@ "label": "Contributors", "icon": "$(gitlens-contributors-view-filled)" }, + { + "id": "gitlens/views/grouped/launchpad", + "label": "Launchpad", + "icon": "$(gitlens-launchpad-view-filled)" + }, { "id": "gitlens/views/grouped/remotes", "label": "Remotes", @@ -18934,47 +19066,52 @@ { "command": "gitlens.views.scm.grouped.commits", "key": "1", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.commits" }, { "command": "gitlens.views.scm.grouped.branches", "key": "2", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.branches" }, { "command": "gitlens.views.scm.grouped.remotes", "key": "3", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.remotes" }, { "command": "gitlens.views.scm.grouped.stashes", "key": "4", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.stashes" }, { "command": "gitlens.views.scm.grouped.tags", "key": "5", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.tags" }, { "command": "gitlens.views.scm.grouped.worktrees", "key": "6", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.worktrees" }, { "command": "gitlens.views.scm.grouped.contributors", "key": "7", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.contributors" }, { "command": "gitlens.views.scm.grouped.repositories", "key": "8", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.repositories" }, { "command": "gitlens.views.scm.grouped.searchAndCompare", "key": "9", - "when": "focusedView == gitlens.views.scm.grouped" + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.searchAndCompare" + }, + { + "command": "gitlens.views.scm.grouped.launchpad", + "key": "0", + "when": "focusedView == gitlens.views.scm.grouped && config.gitlens.views.scm.grouped.views.launchpad" } ], "customEditors": [ @@ -19077,13 +19214,112 @@ }, { "view": "gitlens.views.launchpad", + "contents": "[Launchpad](command:gitlens.views.launchpad.info \"Learn about Launchpad\") — organizes your pull requests into actionable groups to help you focus and keep your team unblocked." + }, + { + "view": "gitlens.views.scm.grouped", "contents": "[Launchpad](command:gitlens.views.launchpad.info \"Learn about Launchpad\") — organizes your pull requests into actionable groups to help you focus and keep your team unblocked.", - "when": "config.gitlens.views.launchpad.enabled" + "when": "gitlens:views:scm:grouped:view == launchpad" }, { "view": "gitlens.views.launchpad", "contents": "[Connect an Integration...](command:gitlens.showLaunchpad?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nAllows Launchpad to organize your pull requests into actionable groups and keep your team unblocked.", - "when": "config.gitlens.views.launchpad.enabled && gitlens:launchpad:connect" + "when": "gitlens:launchpad:connect" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "[Connect an Integration...](command:gitlens.showLaunchpad?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nAllows Launchpad to organize your pull requests into actionable groups and keep your team unblocked.", + "when": "gitlens:launchpad:connect && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "[Resend Verification Email](command:gitlens.plus.resendVerification?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nYou must verify your email before you can continue or [recheck Status](command:gitlens.plus.validate?%7B%22source%22%3A%22launchpad-view%22%7D).", + "when": "!gitlens:launchpad:connect && gitlens:plus:state == -1" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "[Resend Verification Email](command:gitlens.plus.resendVerification?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nYou must verify your email before you can continue or [recheck Status](command:gitlens.plus.validate?%7B%22source%22%3A%22launchpad-view%22%7D).", + "when": "!gitlens:launchpad:connect && gitlens:plus:state == -1 && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "[Continue](command:gitlens.plus.startPreviewTrial?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nContinuing gives you 3 days to preview Launchpad and other local Pro features for 3 days. [Start 7-day Pro trial](command:gitlens.plus.signUp?%7B%22source%22%3A%22launchpad-view%22%7D) or [sign in](command:gitlens.plus.login?%7B%22source%22%3A%22launchpad-view%22%7D) for full access to Pro features.", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 0" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "[Continue](command:gitlens.plus.startPreviewTrial?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nContinuing gives you 3 days to preview Launchpad and other local Pro features for 3 days. [Start 7-day Pro trial](command:gitlens.plus.signUp?%7B%22source%22%3A%22launchpad-view%22%7D) or [sign in](command:gitlens.plus.login?%7B%22source%22%3A%22launchpad-view%22%7D) for full access to Pro features.", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 0 && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "[Start Pro Trial](command:gitlens.plus.signUp?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nStart your free 7-day Pro trial to try Launchpad and other Pro features, or [sign in](command:gitlens.plus.login?%7B%22source%22%3A%22launchpad-view%22%7D).", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 2" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "[Start Pro Trial](command:gitlens.plus.signUp?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nStart your free 7-day Pro trial to try Launchpad and other Pro features, or [sign in](command:gitlens.plus.login?%7B%22source%22%3A%22launchpad-view%22%7D).", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 2 && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "[Upgrade to Pro](command:gitlens.plus.upgrade?%7B%22source%22%3A%22launchpad-view%22%7D)", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "[Upgrade to Pro](command:gitlens.plus.upgrade?%7B%22source%22%3A%22launchpad-view%22%7D)", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "Limited-time sale: Save 33% or more on your 1st seat of Pro.", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4 && (gitlens:promo == pro50 || !gitlens:promo)" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "Limited-time sale: Save 33% or more on your 1st seat of Pro.", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4 && (gitlens:promo == pro50 || !gitlens:promo) && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "Limited-time sale: Save up to 80% on GitLens Pro", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo == devexdays" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "Limited-time sale: Save up to 80% on GitLens Pro", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:promo == devexdays && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "Your Pro trial has ended. Please upgrade for full access to Launchpad and other Pro features.", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "Your Pro trial has ended. Please upgrade for full access to Launchpad and other Pro features.", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 4 && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "[Continue](command:gitlens.plus.reactivateProTrial?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nReactivate your Pro trial and experience Launchpad and all the new Pro features — free for another 7 days!", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 5" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "[Continue](command:gitlens.plus.reactivateProTrial?%7B%22source%22%3A%22launchpad-view%22%7D)\n\nReactivate your Pro trial and experience Launchpad and all the new Pro features — free for another 7 days!", + "when": "!gitlens:launchpad:connect && gitlens:plus:required && gitlens:plus:state == 5 && gitlens:views:scm:grouped:view == launchpad" + }, + { + "view": "gitlens.views.launchpad", + "contents": "Pro feature — requires a paid plan for use on privately-hosted repos.", + "when": "!gitlens:launchpad:connect" + }, + { + "view": "gitlens.views.scm.grouped", + "contents": "Pro feature — requires a paid plan for use on privately-hosted repos.", + "when": "!gitlens:launchpad:connect && gitlens:views:scm:grouped:view == launchpad" }, { "view": "gitlens.views.workspaces", @@ -19226,9 +19462,9 @@ { "id": "gitlens.views.launchpad", "name": "Launchpad", - "when": "config.gitlens.views.launchpad.enabled", + "when": "!(config.gitlens.views.scm.grouped.enabled && gitlens:views:scm:grouped:view == launchpad) && !gitlens:views:scm:grouped:refresh", "contextualTitle": "GitLens", - "icon": "$(rocket)", + "icon": "$(gitlens-launchpad-view)", "initialSize": 2, "visibility": "visible" }, @@ -19239,7 +19475,7 @@ "contextualTitle": "GitLens", "icon": "$(gitlens-cloud-patch)", "initialSize": 2, - "visibility": "visible" + "visibility": "collapsed" }, { "id": "gitlens.views.workspaces", @@ -19248,7 +19484,7 @@ "contextualTitle": "GitLens", "icon": "$(gitlens-workspaces-view)", "initialSize": 2, - "visibility": "visible" + "visibility": "collapsed" } ], "gitlensInspect": [ @@ -19410,7 +19646,7 @@ { "id": "gitlens.views.scm.grouped", "name": "GitLens", - "when": "!gitlens:disabled && config.gitlens.views.scm.grouped.enabled && (config.gitlens.views.scm.grouped.views.branches || config.gitlens.views.scm.grouped.views.commits || config.gitlens.views.scm.grouped.views.contributors || config.gitlens.views.scm.grouped.views.remotes || config.gitlens.views.scm.grouped.views.repositories || config.gitlens.views.scm.grouped.views.searchAndCompare || config.gitlens.views.scm.grouped.views.stashes || config.gitlens.views.scm.grouped.views.tags || config.gitlens.views.scm.grouped.views.worktrees) && !gitlens:views:scm:grouped:refresh", + "when": "!gitlens:disabled && config.gitlens.views.scm.grouped.enabled && (config.gitlens.views.scm.grouped.views.branches || config.gitlens.views.scm.grouped.views.commits || config.gitlens.views.scm.grouped.views.contributors || config.gitlens.views.scm.grouped.views.launchpad || config.gitlens.views.scm.grouped.views.remotes || config.gitlens.views.scm.grouped.views.repositories || config.gitlens.views.scm.grouped.views.searchAndCompare || config.gitlens.views.scm.grouped.views.stashes || config.gitlens.views.scm.grouped.views.tags || config.gitlens.views.scm.grouped.views.worktrees) && !gitlens:views:scm:grouped:refresh", "contextualTitle": "GitLens", "icon": "$(gitlens-gitlens)", "visibility": "visible" diff --git a/src/constants.views.ts b/src/constants.views.ts index 8de8cd0e14a92..0abe8f8c00916 100644 --- a/src/constants.views.ts +++ b/src/constants.views.ts @@ -26,6 +26,7 @@ export type GroupableTreeViewTypes = Extract< | 'branches' | 'commits' | 'contributors' + | 'launchpad' | 'remotes' | 'repositories' | 'searchAndCompare' diff --git a/src/views/branchesView.ts b/src/views/branchesView.ts index cc8107e673f0f..886601096349e 100644 --- a/src/views/branchesView.ts +++ b/src/views/branchesView.ts @@ -48,7 +48,7 @@ export class BranchesRepositoryNode extends RepositoryFolderNode { async getChildren(): Promise { - this.view.description = this.getViewDescription(); + this.view.description = this.view.getViewDescription(); this.view.message = undefined; if (this.children == null) { @@ -91,7 +91,7 @@ export class BranchesViewNode extends RepositoriesSubscribeableNode { async getChildren(): Promise { if (this.children == null) { - this.view.description = this.getViewDescription(); + this.view.description = this.view.getViewDescription(); this.view.message = undefined; const repositories = this.view.container.git.openRepositories; diff --git a/src/views/contributorsView.ts b/src/views/contributorsView.ts index 585b917ee62a5..7c412aadba4eb 100644 --- a/src/views/contributorsView.ts +++ b/src/views/contributorsView.ts @@ -53,7 +53,7 @@ export class ContributorsRepositoryNode extends RepositoryFolderNode { async getChildren(): Promise { - this.view.description = this.getViewDescription(); + this.view.description = this.view.getViewDescription(); this.view.message = undefined; if (this.children == null) { @@ -106,7 +106,7 @@ export class ContributorsViewNode extends RepositoriesSubscribeableNode { + this.view.description = this.view.grouped + ? `${this.view.name.toLocaleLowerCase()}\u00a0\u2022\u00a0 ${proBadge}` + : proBadge; + this.view.message = undefined; + if (this.children == null) { - const children: (GroupingNode | LaunchpadItemNode)[] = []; + const access = await this.view.container.git.access(PlusFeatures.Launchpad); + if (!access.allowed) return []; - this.view.message = undefined; + const children: (GroupingNode | LaunchpadItemNode)[] = []; const hasIntegrations = await this.view.container.launchpad.hasConnectedIntegration(); if (!hasIntegrations) { @@ -206,10 +224,8 @@ export class LaunchpadView extends ViewBase<'launchpad', LaunchpadViewNode, Laun protected readonly configKey = 'launchpad'; private _disposable: Disposable | undefined; - constructor(container: Container) { - super(container, 'launchpad', 'Launchpad', 'launchpadView'); - - this.description = experimentalBadge; + constructor(container: Container, grouped?: boolean) { + super(container, 'launchpad', 'Launchpad', 'launchpadView', grouped); } override dispose() { @@ -217,6 +233,11 @@ export class LaunchpadView extends ViewBase<'launchpad', LaunchpadViewNode, Laun super.dispose(); } + override getViewDescription(count?: number): string { + const description = super.getViewDescription(count); + return description ? `${description} \u00a0\u2022\u00a0 ${proBadge}` : proBadge; + } + protected getRoot() { return new LaunchpadViewNode(this); } @@ -233,24 +254,7 @@ export class LaunchpadView extends ViewBase<'launchpad', LaunchpadViewNode, Laun } override async show(options?: { preserveFocus?: boolean | undefined }): Promise { - if (!configuration.get('views.launchpad.enabled')) { - const confirm: MessageItem = { title: 'Enable' }; - const cancel: MessageItem = { title: 'Cancel', isCloseAffordance: true }; - const result = await window.showInformationMessage( - 'Would you like to try the new experimental Launchpad view?', - { - modal: true, - detail: 'Launchpad organizes your pull requests into actionable groups to help you focus and keep your team unblocked.', - }, - confirm, - cancel, - ); - - if (result !== confirm) return; - - await configuration.updateEffective('views.launchpad.enabled', true); - } - + if (!(await ensurePlusFeaturesEnabled())) return; return super.show(options); } diff --git a/src/views/nodes/abstract/repositoriesSubscribeableNode.ts b/src/views/nodes/abstract/repositoriesSubscribeableNode.ts index 9d8773918ffbf..eaa9164670a93 100644 --- a/src/views/nodes/abstract/repositoriesSubscribeableNode.ts +++ b/src/views/nodes/abstract/repositoriesSubscribeableNode.ts @@ -31,12 +31,6 @@ export abstract class RepositoriesSubscribeableNode< return szudzikPairing(this.view.container.git.etag, this.view.container.subscription.etag); } - protected getViewDescription(count?: number) { - return `${this.view.grouped ? `${this.view.name.toLocaleLowerCase()} ` : ''}${ - count != null ? `(${count})` : '' - }`; - } - @debug() protected subscribe(): Disposable | Promise { return Disposable.from( diff --git a/src/views/remotesView.ts b/src/views/remotesView.ts index 7b5bb4a48052e..39295a3bd51d7 100644 --- a/src/views/remotesView.ts +++ b/src/views/remotesView.ts @@ -48,7 +48,7 @@ export class RemotesRepositoryNode extends RepositoryFolderNode { async getChildren(): Promise { - this.view.description = this.getViewDescription(); + this.view.description = this.view.getViewDescription(); this.view.message = undefined; if (this.children == null) { @@ -83,7 +83,7 @@ export class RemotesViewNode extends RepositoriesSubscribeableNode this.setView('branches')), - registerCommand('gitlens.views.scm.grouped.commits', () => this.setView('commits')), - registerCommand('gitlens.views.scm.grouped.contributors', () => this.setView('contributors')), - registerCommand('gitlens.views.scm.grouped.remotes', () => this.setView('remotes')), - registerCommand('gitlens.views.scm.grouped.repositories', () => this.setView('repositories')), - registerCommand('gitlens.views.scm.grouped.searchAndCompare', () => this.setView('searchAndCompare')), - registerCommand('gitlens.views.scm.grouped.stashes', () => this.setView('stashes')), - registerCommand('gitlens.views.scm.grouped.tags', () => this.setView('tags')), - registerCommand('gitlens.views.scm.grouped.worktrees', () => this.setView('worktrees')), + registerCommand('gitlens.views.scm.grouped.branches', () => this.setView('branches', true)), + registerCommand('gitlens.views.scm.grouped.commits', () => this.setView('commits', true)), + registerCommand('gitlens.views.scm.grouped.contributors', () => this.setView('contributors', true)), + registerCommand('gitlens.views.scm.grouped.launchpad', () => this.setView('launchpad', true)), + registerCommand('gitlens.views.scm.grouped.remotes', () => this.setView('remotes', true)), + registerCommand('gitlens.views.scm.grouped.repositories', () => this.setView('repositories', true)), + registerCommand('gitlens.views.scm.grouped.searchAndCompare', () => this.setView('searchAndCompare', true)), + registerCommand('gitlens.views.scm.grouped.stashes', () => this.setView('stashes', true)), + registerCommand('gitlens.views.scm.grouped.tags', () => this.setView('tags', true)), + registerCommand('gitlens.views.scm.grouped.worktrees', () => this.setView('worktrees', true)), ); this._view = this.setView(this.views.lastSelectedScmGroupedView!); @@ -49,7 +51,7 @@ export class ScmGroupedView implements Disposable { this._view?.dispose(); } - setView(type: T): TreeViewByType[T] { + setView(type: T, focus?: boolean): TreeViewByType[T] { if (!this.views.scmGroupedViews.has(type)) { type = first(this.views.scmGroupedViews) as T; } @@ -61,7 +63,9 @@ export class ScmGroupedView implements Disposable { this._view?.dispose(); this._view = this.getView(type); - void this._view.show({ preserveFocus: false }); + if (focus) { + void this._view.show({ preserveFocus: false }); + } this.views.lastSelectedScmGroupedView = type; return this._view as TreeViewByType[T]; @@ -75,6 +79,8 @@ export class ScmGroupedView implements Disposable { return new CommitsView(this.container, true); case 'contributors': return new ContributorsView(this.container, true); + case 'launchpad': + return new LaunchpadView(this.container, true); case 'remotes': return new RemotesView(this.container, true); case 'repositories': diff --git a/src/views/stashesView.ts b/src/views/stashesView.ts index 41460495cff5a..c0eaa2b44f7ad 100644 --- a/src/views/stashesView.ts +++ b/src/views/stashesView.ts @@ -34,7 +34,7 @@ export class StashesRepositoryNode extends RepositoryFolderNode { async getChildren(): Promise { - this.view.description = this.getViewDescription(); + this.view.description = this.view.getViewDescription(); this.view.message = undefined; if (this.children == null) { @@ -69,7 +69,7 @@ export class StashesViewNode extends RepositoriesSubscribeableNode export class TagsViewNode extends RepositoriesSubscribeableNode { async getChildren(): Promise { - this.view.description = this.getViewDescription(); + this.view.description = this.view.getViewDescription(); this.view.message = undefined; if (this.children == null) { @@ -70,7 +70,7 @@ export class TagsViewNode extends RepositoriesSubscribeableNode { return node.resolveTreeItem?.(item, token) ?? item; } diff --git a/src/views/views.ts b/src/views/views.ts index 4f4336dffc3df..3b38da370275a 100644 --- a/src/views/views.ts +++ b/src/views/views.ts @@ -97,6 +97,7 @@ export class Views implements Disposable { this._branchesView?.dispose(); this._commitsView?.dispose(); this._contributorsView?.dispose(); + this._launchpadView?.dispose(); this._remotesView?.dispose(); this._repositoriesView?.dispose(); this._searchAndCompareView?.dispose(); @@ -151,6 +152,16 @@ export class Views implements Disposable { registerCommand('gitlens.views.scm.grouped.contributors.setAsDefault', () => this.setAsScmGroupedDefaultView('contributors'), ), + registerCommand('gitlens.views.launchpad.regroup', () => this.toggleScmViewGrouping('launchpad', true)), + registerCommand('gitlens.views.scm.grouped.launchpad.detach', () => + this.toggleScmViewGrouping('launchpad', false), + ), + registerCommand('gitlens.views.scm.grouped.launchpad.regroup', () => + this.toggleScmViewGrouping('launchpad', true), + ), + registerCommand('gitlens.views.scm.grouped.launchpad.setAsDefault', () => + this.setAsScmGroupedDefaultView('launchpad'), + ), registerCommand('gitlens.views.remotes.regroup', () => this.toggleScmViewGrouping('remotes', true)), registerCommand('gitlens.views.scm.grouped.remotes.detach', () => this.toggleScmViewGrouping('remotes', false), @@ -218,7 +229,6 @@ export class Views implements Disposable { return [ (this._draftsView = new DraftsView(this.container)), (this._fileHistoryView = new FileHistoryView(this.container)), - (this._launchpadView = new LaunchpadView(this.container)), (this._lineHistoryView = new LineHistoryView(this.container)), (this._pullRequestView = new PullRequestView(this.container)), (this._workspacesView = new WorkspacesView(this.container)), @@ -244,20 +254,20 @@ export class Views implements Disposable { private async toggleScmViewGrouping(type: GroupableTreeViewTypes, grouped: boolean) { if (grouped) { if (!this._scmGroupedViews.has(type)) { - this.lastSelectedScmGroupedView = type; this._scmGroupedViews.add(type); + this.lastSelectedScmGroupedView = type; } } else if (this._scmGroupedViews.has(type)) { + this._scmGroupedViews.delete(type); if (type === this.lastSelectedScmGroupedView) { - this.lastSelectedScmGroupedView = undefined; + this.lastSelectedScmGroupedView = first(this._scmGroupedViews); } - this._scmGroupedViews.delete(type); } await updateScmGroupedViewsInConfig(this._scmGroupedViews); // Show the view after the configuration change has been applied - setTimeout(() => executeCoreCommand(`gitlens.views.${type}.focus`), 1); + setTimeout(() => executeCoreCommand(`gitlens.views.${grouped ? 'scm.grouped' : type}.focus`), 1); } private updateScmGroupedViewsRegistration() { @@ -303,6 +313,13 @@ export class Views implements Disposable { this._contributorsView = undefined; } + if (!groupingEnabled || !this._scmGroupedViews.has('launchpad')) { + this._launchpadView ??= new LaunchpadView(this.container); + } else { + this._launchpadView?.dispose(); + this._launchpadView = undefined; + } + if (!groupingEnabled || !this._scmGroupedViews.has('remotes')) { this._remotesView ??= new RemotesView(this.container); } else { @@ -398,9 +415,9 @@ export class Views implements Disposable { return this._homeView; } - private _launchpadView!: LaunchpadView; + private _launchpadView!: LaunchpadView | undefined; get launchpad(): LaunchpadView { - return this._launchpadView; + return this._launchpadView ?? this._scmGroupedView.setView('launchpad'); } private _lineHistoryView!: LineHistoryView; @@ -595,8 +612,9 @@ const defaultScmGroupedViews: Record = Object.f tags: true, worktrees: true, contributors: true, - repositories: true, + repositories: false, searchAndCompare: true, + launchpad: false, }); function getScmGroupedViewsFromConfig() { @@ -622,5 +640,6 @@ async function updateScmGroupedViewsInConfig(groupedViews: Set { - protected override getViewDescription(count?: number): string { - const description = super.getViewDescription(count); - return description ? `${description} \u00a0\u2022\u00a0 ${proBadge}` : proBadge; - } - async getChildren(): Promise { - this.view.description = this.getViewDescription(); + this.view.description = this.view.getViewDescription(); this.view.message = undefined; if (this.children == null) { @@ -84,7 +79,7 @@ export class WorktreesViewNode extends RepositoriesSubscribeableNode diff --git a/src/webviews/apps/home/home.html b/src/webviews/apps/home/home.html index fb67e5dda8841..106a5ae2b626e 100644 --- a/src/webviews/apps/home/home.html +++ b/src/webviews/apps/home/home.html @@ -11,7 +11,7 @@ @font-face { font-family: 'glicons'; font-display: block; - src: url('#{root}/dist/glicons.woff2?526ab4b01522255557001d936894ca47') format('woff2'); + src: url('#{root}/dist/glicons.woff2?888557bf00e2cc234c92d4643f1f0051') format('woff2'); } diff --git a/src/webviews/apps/plus/graph/graph.html b/src/webviews/apps/plus/graph/graph.html index 0eb5bd552aff9..f66fe86c163e7 100644 --- a/src/webviews/apps/plus/graph/graph.html +++ b/src/webviews/apps/plus/graph/graph.html @@ -11,7 +11,7 @@ @font-face { font-family: 'glicons'; font-display: block; - src: url('#{root}/dist/glicons.woff2?526ab4b01522255557001d936894ca47') format('woff2'); + src: url('#{root}/dist/glicons.woff2?888557bf00e2cc234c92d4643f1f0051') format('woff2'); }