@@ -2,6 +2,7 @@ import { QuickInputButtons, QuickPickItem, QuickPickItemButtonEvent, QuickPickIt
22import { Common , PackageManagement } from '../../common/localize' ;
33import { launchBrowser } from '../../common/env.apis' ;
44import { showInputBoxWithButtons , showQuickPickWithButtons , showTextDocument } from '../../common/window.apis' ;
5+ import { Installable } from './utils' ;
56
67const OPEN_BROWSER_BUTTON = {
78 iconPath : new ThemeIcon ( 'globe' ) ,
@@ -18,50 +19,6 @@ const EDIT_ARGUMENTS_BUTTON = {
1819 tooltip : PackageManagement . editArguments ,
1920} ;
2021
21- export interface Installable {
22- /**
23- * The name of the package, requirements, lock files, or step name.
24- */
25- readonly name : string ;
26-
27- /**
28- * The name of the package, requirements, pyproject.toml or any other project file, etc.
29- */
30- readonly displayName : string ;
31-
32- /**
33- * Arguments passed to the package manager to install the package.
34- *
35- * @example
36- * ['debugpy==1.8.7'] for `pip install debugpy==1.8.7`.
37- * ['--pre', 'debugpy'] for `pip install --pre debugpy`.
38- * ['-r', 'requirements.txt'] for `pip install -r requirements.txt`.
39- */
40- readonly args ?: string [ ] ;
41-
42- /**
43- * Installable group name, this will be used to group installable items in the UI.
44- *
45- * @example
46- * `Requirements` for any requirements file.
47- * `Packages` for any package.
48- */
49- readonly group ?: string ;
50-
51- /**
52- * Description about the installable item. This can also be path to the requirements,
53- * version of the package, or any other project file path.
54- */
55- readonly description ?: string ;
56-
57- /**
58- * External Uri to the package on pypi or docs.
59- * @example
60- * https://pypi.org/project/debugpy/ for `debugpy`.
61- */
62- readonly uri ?: Uri ;
63- }
64-
6522function handleItemButton ( uri ?: Uri ) {
6623 if ( uri ) {
6724 if ( uri . scheme . toLowerCase ( ) . startsWith ( 'http' ) ) {
@@ -118,7 +75,7 @@ async function enterPackageManually(filler?: string): Promise<string[] | undefin
11875}
11976
12077interface GroupingResult {
121- items : QuickPickItem [ ] ;
78+ items : PackageQuickPickItem [ ] ;
12279 installedItems : PackageQuickPickItem [ ] ;
12380}
12481
@@ -132,11 +89,13 @@ function groupByInstalled(items: PackageQuickPickItem[], installed?: string[]):
13289 result . push ( i ) ;
13390 }
13491 } ) ;
135- const installedSeparator : QuickPickItem = {
92+ const installedSeparator : PackageQuickPickItem = {
93+ id : 'installed-sep' ,
13694 label : PackageManagement . installed ,
13795 kind : QuickPickItemKind . Separator ,
13896 } ;
139- const commonPackages : QuickPickItem = {
97+ const commonPackages : PackageQuickPickItem = {
98+ id : 'common-packages-sep' ,
14099 label : PackageManagement . commonPackages ,
141100 kind : QuickPickItemKind . Separator ,
142101 } ;
@@ -171,7 +130,7 @@ export async function selectFromCommonPackagesToInstall(
171130 preSelected ?: PackageQuickPickItem [ ] | undefined ,
172131) : Promise < CommonPackagesResult | undefined > {
173132 const { installedItems, items } = groupByInstalled ( common . map ( installableToQuickPickItem ) , installed ) ;
174- const preSelectedItems = [ ... installedItems , ... ( preSelected ?? [ ] ) ] ;
133+ const preSelectedItems = items . filter ( ( i ) => ( preSelected ?? installedItems ) . some ( ( s ) => s . id === i . id ) ) ;
175134 let selected : PackageQuickPickItem | PackageQuickPickItem [ ] | undefined ;
176135 try {
177136 selected = await showQuickPickWithButtons (
@@ -208,10 +167,8 @@ export async function selectFromCommonPackagesToInstall(
208167
209168 if ( selected && Array . isArray ( selected ) ) {
210169 if ( selected . find ( ( s ) => s . label === PackageManagement . enterPackageNames ) ) {
211- const filler = selected
212- . filter ( ( s ) => s . label !== PackageManagement . enterPackageNames )
213- . map ( ( s ) => s . id )
214- . join ( ' ' ) ;
170+ const filtered = selected . filter ( ( s ) => s . label !== PackageManagement . enterPackageNames ) ;
171+ const filler = filtered . map ( ( s ) => s . id ) . join ( ' ' ) ;
215172 try {
216173 const selections = await enterPackageManually ( filler ) ;
217174 if ( selections ) {
@@ -220,7 +177,7 @@ export async function selectFromCommonPackagesToInstall(
220177 return undefined ;
221178 } catch ( ex ) {
222179 if ( ex === QuickInputButtons . Back ) {
223- return selectFromCommonPackagesToInstall ( common , installed , selected ) ;
180+ return selectFromCommonPackagesToInstall ( common , installed , filtered ) ;
224181 }
225182 return undefined ;
226183 }
0 commit comments