@jupyterlab/extensionmanager 0.17.2 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/model.d.ts CHANGED
@@ -13,6 +13,10 @@ export interface IEntry {
13
13
  * A short description of the extension.
14
14
  */
15
15
  description: string;
16
+ /**
17
+ * A representative link of the package.
18
+ */
19
+ url: string;
16
20
  /**
17
21
  * Whether the extension is currently installed.
18
22
  */
@@ -46,6 +50,10 @@ export interface IInstalledEntry {
46
50
  * A short description of the extension.
47
51
  */
48
52
  description: string;
53
+ /**
54
+ * A representative link of the package.
55
+ */
56
+ url: string;
49
57
  /**
50
58
  * Whether the extension is currently installed.
51
59
  */
@@ -104,7 +112,8 @@ export declare class ListModel extends VDomModel {
104
112
  */
105
113
  readonly searchResult: ReadonlyArray<IEntry>;
106
114
  /**
107
- * Translate search results from an npm repository query into entries.
115
+ * Translate search results from an npm repository query into entries
116
+ * and remove entries with 'deprecated' in the keyword list
108
117
  *
109
118
  * @param res Promise to an npm query result.
110
119
  */
package/lib/model.js CHANGED
@@ -88,7 +88,8 @@ class ListModel extends apputils_1.VDomModel {
88
88
  return this._searchResult;
89
89
  }
90
90
  /**
91
- * Translate search results from an npm repository query into entries.
91
+ * Translate search results from an npm repository query into entries
92
+ * and remove entries with 'deprecated' in the keyword list
92
93
  *
93
94
  * @param res Promise to an npm query result.
94
95
  */
@@ -97,9 +98,15 @@ class ListModel extends apputils_1.VDomModel {
97
98
  let entries = {};
98
99
  for (let obj of (yield res).objects) {
99
100
  let pkg = obj.package;
101
+ if (pkg.keywords.indexOf('deprecated') >= 0) {
102
+ continue;
103
+ }
100
104
  entries[pkg.name] = {
101
105
  name: pkg.name,
102
106
  description: pkg.description,
107
+ url: 'homepage' in pkg.links
108
+ ? pkg.links.homepage
109
+ : 'repository' in pkg.links ? pkg.links.repository : pkg.links.npm,
103
110
  installed: false,
104
111
  enabled: false,
105
112
  status: null,
@@ -124,6 +131,7 @@ class ListModel extends apputils_1.VDomModel {
124
131
  entries[pkg.name] = {
125
132
  name: pkg.name,
126
133
  description: pkg.description,
134
+ url: pkg.url,
127
135
  installed: pkg.installed !== false,
128
136
  enabled: pkg.enabled,
129
137
  status: pkg.status,
package/lib/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../extensionmanager/src/model.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n\nimport { VDomModel } from '@jupyterlab/apputils';\n\nimport { ServerConnection, ServiceManager, Kernel } from '@jupyterlab/services';\n\nimport * as semver from 'semver';\n\nimport { doBuild } from './build-helper';\n\nimport {\n presentCompanions,\n IKernelInstallInfo,\n KernelCompanion\n} from './companions';\n\nimport { reportInstallError } from './dialog';\n\nimport { Searcher, ISearchResult, isJupyterOrg } from './query';\n\n/**\n * Information about an extension.\n */\nexport interface IEntry {\n /**\n * The name of the extension.\n */\n name: string;\n\n /**\n * A short description of the extension.\n */\n description: string;\n\n /**\n * Whether the extension is currently installed.\n */\n installed: boolean;\n\n /**\n * Whether the extension is currently enabled.\n */\n enabled: boolean;\n\n /**\n * A flag indicating the status of an installed extension.\n */\n status: 'ok' | 'warning' | 'error' | 'deprecated' | null;\n\n /**\n * The latest version of the extension.\n */\n latest_version: string;\n\n /**\n * The installed version of the extension.\n */\n installed_version: string;\n}\n\n/**\n * Wire format for installed extensions.\n */\nexport interface IInstalledEntry {\n /**\n * The name of the extension.\n */\n name: string;\n\n /**\n * A short description of the extension.\n */\n description: string;\n\n /**\n * Whether the extension is currently installed.\n */\n installed?: boolean;\n\n /**\n * Whether the extension is currently enabled.\n */\n enabled: boolean;\n\n /**\n * The latest version of the extension.\n */\n latest_version: string;\n\n /**\n * The installed version of the extension.\n */\n installed_version: string;\n\n /**\n * A flag indicating the status of an installed extension.\n */\n status: 'ok' | 'warning' | 'error' | 'deprecated' | null;\n}\n\n/**\n * An object representing a server reply to performing an action.\n */\nexport interface IActionReply {\n /**\n * The status category of the reply.\n */\n status: 'ok' | 'warning' | 'error' | null;\n\n /**\n * An optional message when the status is not 'ok'.\n */\n message?: string;\n}\n\n/**\n * The server API path for querying/modifying installed extensions.\n */\nconst EXTENSION_API_PATH = 'lab/api/extensions';\n\n/**\n * Extension actions that the server API accepts\n */\nexport type Action = 'install' | 'uninstall' | 'enable' | 'disable';\n\n/**\n * Model for an extension list.\n */\nexport class ListModel extends VDomModel {\n constructor(serviceManager: ServiceManager) {\n super();\n this._installed = [];\n this._searchResult = [];\n this.serviceManager = serviceManager;\n this.serverConnectionSettings = ServerConnection.makeSettings();\n }\n\n /**\n * Utility function to check whether an entry can be updated.\n *\n * @param entry The entry to check.\n */\n static entryHasUpdate(entry: IEntry): boolean {\n if (!entry.installed || !entry.latest_version) {\n return false;\n }\n return semver.lt(entry.installed_version, entry.latest_version);\n }\n\n /**\n * A readonly array of the installed extensions.\n */\n get installed(): ReadonlyArray<IEntry> {\n return this._installed;\n }\n\n /**\n * A readonly array containing the latest search result\n */\n get searchResult(): ReadonlyArray<IEntry> {\n return this._searchResult;\n }\n\n /**\n * Translate search results from an npm repository query into entries.\n *\n * @param res Promise to an npm query result.\n */\n protected async translateSearchResult(\n res: Promise<ISearchResult>\n ): Promise<{ [key: string]: IEntry }> {\n let entries: { [key: string]: IEntry } = {};\n for (let obj of (await res).objects) {\n let pkg = obj.package;\n entries[pkg.name] = {\n name: pkg.name,\n description: pkg.description,\n installed: false,\n enabled: false,\n status: null,\n latest_version: pkg.version,\n installed_version: ''\n };\n }\n return entries;\n }\n\n /**\n * Translate installed extensions information from the server into entries.\n *\n * @param res Promise to the server reply data.\n */\n protected async translateInstalled(\n res: Promise<IInstalledEntry[]>\n ): Promise<{ [key: string]: IEntry }> {\n const promises = [];\n const entries: { [key: string]: IEntry } = {};\n for (let pkg of await res) {\n promises.push(\n res.then(info => {\n entries[pkg.name] = {\n name: pkg.name,\n description: pkg.description,\n installed: pkg.installed !== false,\n enabled: pkg.enabled,\n status: pkg.status,\n latest_version: pkg.latest_version,\n installed_version: pkg.installed_version\n };\n })\n );\n }\n return Promise.all(promises).then(() => {\n return entries;\n });\n }\n\n /**\n * The current NPM repository search query.\n *\n * Setting its value triggers a new search.\n */\n get query(): string {\n return this._query;\n }\n set query(value: string) {\n this._query = value;\n this.update();\n }\n\n /**\n * The current NPM repository search page.\n *\n * The npm repository search is paginated by the `pagination` attribute.\n * The `page` value selects which page is used.\n *\n * Setting its value triggers a new search.\n */\n get page(): number {\n return this._page;\n }\n set page(value: number) {\n this._page = value;\n this.update();\n }\n\n /**\n * The NPM repository search pagination.\n *\n * The npm repository search is paginated by the `pagination` attribute.\n * The `page` value selects which page is used.\n *\n * Setting its value triggers a new search.\n */\n get pagination(): number {\n return this._pagination;\n }\n set pagination(value: number) {\n this._pagination = value;\n this.update();\n }\n\n /**\n * The total number of results in the current search.\n */\n get totalEntries(): number {\n return this._totalEntries;\n }\n\n /**\n * Make a request to the server for info about its installed extensions.\n */\n protected fetchInstalled(\n refreshInstalled = false\n ): Promise<IInstalledEntry[]> {\n const url = new URL(\n EXTENSION_API_PATH,\n this.serverConnectionSettings.baseUrl\n );\n if (refreshInstalled) {\n url.searchParams.append('refresh', '1');\n }\n const request = ServerConnection.makeRequest(\n url.toString(),\n {},\n this.serverConnectionSettings\n ).then(response => {\n handleError(response);\n return response.json() as Promise<IInstalledEntry[]>;\n });\n request.then(\n () => {\n this.serverConnectionError = null;\n },\n reason => {\n this.serverConnectionError = reason.toString();\n }\n );\n return request;\n }\n\n /**\n * Initialize the model.\n */\n initialize() {\n this.update()\n .then(() => {\n this.initialized = true;\n this.stateChanged.emit(undefined);\n })\n .catch(() => {\n this.initialized = true;\n this.stateChanged.emit(undefined);\n });\n }\n\n /**\n * Update the current model.\n *\n * This will query the NPM repository, and the notebook server.\n *\n * Emits the `stateChanged` signal on successful completion.\n */\n protected async update(refreshInstalled = false) {\n let search = this.searcher.searchExtensions(\n this.query,\n this.page,\n this.pagination\n );\n let searchMapPromise = this.translateSearchResult(search);\n let installedMap = await this.translateInstalled(\n this.fetchInstalled(refreshInstalled)\n );\n let searchMap;\n try {\n searchMap = await searchMapPromise;\n this.searchError = null;\n } catch (reason) {\n searchMap = {};\n this.searchError = reason.toString();\n }\n let installed: IEntry[] = [];\n for (let key of Object.keys(installedMap)) {\n installed.push(installedMap[key]);\n }\n this._installed = installed.sort(Private.comparator);\n\n let searchResult: IEntry[] = [];\n for (let key of Object.keys(searchMap)) {\n if (installedMap[key] === undefined) {\n searchResult.push(searchMap[key]);\n } else {\n searchResult.push(installedMap[key]);\n }\n }\n this._searchResult = searchResult.sort(Private.comparator);\n try {\n this._totalEntries = (await search).total;\n } catch (error) {\n this._totalEntries = 0;\n }\n this.stateChanged.emit(undefined);\n }\n\n /**\n * Send a request to the server to perform an action on an extension.\n *\n * @param action A valid action to perform.\n * @param entry The extension to perform the action on.\n */\n protected _performAction(\n action: string,\n entry: IEntry\n ): Promise<IActionReply> {\n const url = new URL(\n EXTENSION_API_PATH,\n this.serverConnectionSettings.baseUrl\n );\n let request: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n cmd: action,\n extension_name: entry.name\n })\n };\n const completed = ServerConnection.makeRequest(\n url.toString(),\n request,\n this.serverConnectionSettings\n ).then(response => {\n handleError(response);\n this.triggerBuildCheck();\n return response.json() as Promise<IActionReply>;\n });\n completed.then(\n () => {\n this.serverConnectionError = null;\n },\n reason => {\n this.serverConnectionError = reason.toString();\n }\n );\n this._addPendingAction(completed);\n return completed;\n }\n\n /**\n * Add a pending action.\n *\n * @param pending A promise that resolves when the action is completed.\n */\n protected _addPendingAction(pending: Promise<any>): void {\n // Add to pending actions collection\n this._pendingActions.push(pending);\n\n // Ensure action is removed when resolved\n const remove = () => {\n const i = this._pendingActions.indexOf(pending);\n this._pendingActions.splice(i, 1);\n this.stateChanged.emit(undefined);\n };\n pending.then(remove, remove);\n\n // Signal changed state\n this.stateChanged.emit(undefined);\n }\n\n /**\n * Whether there are currently any actions pending.\n */\n hasPendingActions(): boolean {\n return this._pendingActions.length > 0;\n }\n\n /**\n * Install an extension.\n *\n * @param entry An entry indicating which extension to install.\n */\n install(entry: IEntry) {\n if (entry.installed) {\n // Updating\n return this._performAction('install', entry).then(data => {\n if (data.status !== 'ok') {\n reportInstallError(entry.name, data.message);\n }\n this.update();\n });\n }\n this.checkCompanionPackages(entry).then(shouldInstall => {\n if (shouldInstall) {\n return this._performAction('install', entry).then(data => {\n if (data.status !== 'ok') {\n reportInstallError(entry.name, data.message);\n }\n this.update();\n });\n }\n });\n }\n\n /**\n * Uninstall an extension.\n *\n * @param entry An entry indicating which extension to uninstall.\n */\n uninstall(entry: IEntry) {\n if (!entry.installed) {\n throw new Error(`Not installed, cannot uninstall: ${entry.name}`);\n }\n this._performAction('uninstall', entry).then(data => {\n this.update();\n });\n }\n\n /**\n * Enable an extension.\n *\n * @param entry An entry indicating which extension to enable.\n */\n enable(entry: IEntry) {\n if (entry.enabled) {\n throw new Error(`Already enabled: ${entry.name}`);\n }\n this._performAction('enable', entry).then(data => {\n this.update();\n });\n }\n\n /**\n * Disable an extension.\n *\n * @param entry An entry indicating which extension to disable.\n */\n disable(entry: IEntry) {\n if (!entry.enabled) {\n throw new Error(`Already disabled: ${entry.name}`);\n }\n this._performAction('disable', entry).then(data => {\n this.update();\n });\n }\n\n /**\n * Check for companion packages in kernels or server.\n *\n * @param entry An entry indicating which extension to check.\n */\n checkCompanionPackages(entry: IEntry): Promise<boolean> {\n return this.searcher\n .fetchPackageData(entry.name, entry.latest_version)\n .then(data => {\n if (!data || !data.jupyterlab || !data.jupyterlab.discovery) {\n return true;\n }\n let discovery = data.jupyterlab.discovery;\n let kernelCompanions: KernelCompanion[] = [];\n if (discovery.kernel) {\n // match specs\n for (let kernelInfo of discovery.kernel) {\n let matches = matchSpecs(kernelInfo, this.serviceManager.specs);\n kernelCompanions.push({ kernelInfo, kernels: matches });\n }\n }\n if (kernelCompanions.length < 1 && !discovery.server) {\n return true;\n }\n return presentCompanions(kernelCompanions, discovery.server);\n });\n }\n\n /**\n * Trigger a build check to incorporate actions taken.\n */\n triggerBuildCheck(): void {\n let builder = this.serviceManager.builder;\n if (builder.isAvailable && !this.promptBuild) {\n const completed = builder.getStatus().then(response => {\n if (response.status === 'building') {\n // Piggy-back onto existing build\n // TODO: Can this cause dialog collision on build completion?\n return doBuild(builder);\n }\n if (response.status !== 'needed') {\n return;\n }\n if (!this.promptBuild) {\n this.promptBuild = true;\n this.stateChanged.emit(undefined);\n }\n });\n this._addPendingAction(completed);\n }\n }\n\n /**\n * Perform a build on the server\n */\n performBuild(): void {\n if (this.promptBuild) {\n this.promptBuild = false;\n this.stateChanged.emit(undefined);\n }\n const completed = doBuild(this.serviceManager.builder);\n this._addPendingAction(completed);\n }\n\n /**\n * Ignore a build recommendation\n */\n ignoreBuildRecommendation(): void {\n if (this.promptBuild) {\n this.promptBuild = false;\n this.stateChanged.emit(undefined);\n }\n }\n\n /**\n * Ignore a build recommendation\n */\n refreshInstalled(): void {\n const refresh = this.update(true);\n this._addPendingAction(refresh);\n }\n\n /**\n * Contains an error message if an error occurred when updating the model.\n */\n searchError: string | null = null;\n\n /**\n * Contains an error message if an error occurred when querying the server extension.\n */\n serverConnectionError: string | null = null;\n\n /**\n * Whether the model has finished async initialization.\n */\n initialized: boolean = false;\n\n /**\n * Whether a fresh build should be considered due to actions taken.\n */\n promptBuild: boolean = false;\n\n /**\n * Settings for connecting to the notebook server.\n */\n protected serverConnectionSettings: ServerConnection.ISettings;\n\n /**\n * A helper for performing searches of jupyterlab extensions on the NPM repository.\n */\n protected searcher = new Searcher();\n\n /**\n * The service manager to use for building.\n */\n protected serviceManager: ServiceManager;\n\n private _query: string = '';\n private _page: number = 0;\n private _pagination: number = 250;\n private _totalEntries: number = 0;\n\n private _installed: IEntry[];\n private _searchResult: IEntry[];\n private _pendingActions: Promise<any>[] = [];\n}\n\n/**\n * Match kernel specs against kernel spec regexps\n *\n * @param kernelInfo The info containing the regexp patterns\n * @param specs The available kernel specs.\n */\nfunction matchSpecs(\n kernelInfo: IKernelInstallInfo,\n specs: Kernel.ISpecModels | null\n): Kernel.ISpecModel[] {\n if (!specs) {\n return [];\n }\n let matches: Kernel.ISpecModel[] = [];\n let reLang: RegExp | null = null;\n let reName: RegExp | null = null;\n if (kernelInfo.kernel_spec.language) {\n reLang = new RegExp(kernelInfo.kernel_spec.language);\n }\n if (kernelInfo.kernel_spec.display_name) {\n reName = new RegExp(kernelInfo.kernel_spec.display_name);\n }\n for (let key of Object.keys(specs.kernelspecs)) {\n let spec = specs.kernelspecs[key];\n let match = false;\n if (reLang) {\n match = reLang.test(spec.language);\n }\n if (!match && reName) {\n match = reName.test(spec.display_name);\n }\n if (match) {\n matches.push(spec);\n continue;\n }\n }\n return matches;\n}\n\n/**\n * Convert a response to an exception on error.\n *\n * @param response The response to inspect.\n */\nfunction handleError(response: Response): Response {\n if (!response.ok) {\n throw new Error(`${response.status} (${response.statusText})`);\n }\n return response;\n}\n\n/**\n * A namespace for private functionality.\n */\nnamespace Private {\n /**\n * A comparator function that sorts whitelisted orgs to the top.\n */\n export function comparator(a: IEntry, b: IEntry): number {\n if (a.name === b.name) {\n return 0;\n }\n\n let testA = isJupyterOrg(a.name);\n let testB = isJupyterOrg(b.name);\n\n if (testA === testB) {\n return a.name.localeCompare(b.name);\n } else if (testA && !testB) {\n return -1;\n } else {\n return 1;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../extensionmanager/src/model.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n\nimport { VDomModel } from '@jupyterlab/apputils';\n\nimport { ServerConnection, ServiceManager, Kernel } from '@jupyterlab/services';\n\nimport * as semver from 'semver';\n\nimport { doBuild } from './build-helper';\n\nimport {\n presentCompanions,\n IKernelInstallInfo,\n KernelCompanion\n} from './companions';\n\nimport { reportInstallError } from './dialog';\n\nimport { Searcher, ISearchResult, isJupyterOrg } from './query';\n\n/**\n * Information about an extension.\n */\nexport interface IEntry {\n /**\n * The name of the extension.\n */\n name: string;\n\n /**\n * A short description of the extension.\n */\n description: string;\n\n /**\n * A representative link of the package.\n */\n url: string;\n\n /**\n * Whether the extension is currently installed.\n */\n installed: boolean;\n\n /**\n * Whether the extension is currently enabled.\n */\n enabled: boolean;\n\n /**\n * A flag indicating the status of an installed extension.\n */\n status: 'ok' | 'warning' | 'error' | 'deprecated' | null;\n\n /**\n * The latest version of the extension.\n */\n latest_version: string;\n\n /**\n * The installed version of the extension.\n */\n installed_version: string;\n}\n\n/**\n * Wire format for installed extensions.\n */\nexport interface IInstalledEntry {\n /**\n * The name of the extension.\n */\n name: string;\n\n /**\n * A short description of the extension.\n */\n description: string;\n\n /**\n * A representative link of the package.\n */\n url: string;\n\n /**\n * Whether the extension is currently installed.\n */\n installed?: boolean;\n\n /**\n * Whether the extension is currently enabled.\n */\n enabled: boolean;\n\n /**\n * The latest version of the extension.\n */\n latest_version: string;\n\n /**\n * The installed version of the extension.\n */\n installed_version: string;\n\n /**\n * A flag indicating the status of an installed extension.\n */\n status: 'ok' | 'warning' | 'error' | 'deprecated' | null;\n}\n\n/**\n * An object representing a server reply to performing an action.\n */\nexport interface IActionReply {\n /**\n * The status category of the reply.\n */\n status: 'ok' | 'warning' | 'error' | null;\n\n /**\n * An optional message when the status is not 'ok'.\n */\n message?: string;\n}\n\n/**\n * The server API path for querying/modifying installed extensions.\n */\nconst EXTENSION_API_PATH = 'lab/api/extensions';\n\n/**\n * Extension actions that the server API accepts\n */\nexport type Action = 'install' | 'uninstall' | 'enable' | 'disable';\n\n/**\n * Model for an extension list.\n */\nexport class ListModel extends VDomModel {\n constructor(serviceManager: ServiceManager) {\n super();\n this._installed = [];\n this._searchResult = [];\n this.serviceManager = serviceManager;\n this.serverConnectionSettings = ServerConnection.makeSettings();\n }\n\n /**\n * Utility function to check whether an entry can be updated.\n *\n * @param entry The entry to check.\n */\n static entryHasUpdate(entry: IEntry): boolean {\n if (!entry.installed || !entry.latest_version) {\n return false;\n }\n return semver.lt(entry.installed_version, entry.latest_version);\n }\n\n /**\n * A readonly array of the installed extensions.\n */\n get installed(): ReadonlyArray<IEntry> {\n return this._installed;\n }\n\n /**\n * A readonly array containing the latest search result\n */\n get searchResult(): ReadonlyArray<IEntry> {\n return this._searchResult;\n }\n\n /**\n * Translate search results from an npm repository query into entries\n * and remove entries with 'deprecated' in the keyword list\n *\n * @param res Promise to an npm query result.\n */\n protected async translateSearchResult(\n res: Promise<ISearchResult>\n ): Promise<{ [key: string]: IEntry }> {\n let entries: { [key: string]: IEntry } = {};\n for (let obj of (await res).objects) {\n let pkg = obj.package;\n if (pkg.keywords.indexOf('deprecated') >= 0) {\n continue;\n }\n entries[pkg.name] = {\n name: pkg.name,\n description: pkg.description,\n url:\n 'homepage' in pkg.links\n ? pkg.links.homepage\n : 'repository' in pkg.links ? pkg.links.repository : pkg.links.npm,\n installed: false,\n enabled: false,\n status: null,\n latest_version: pkg.version,\n installed_version: ''\n };\n }\n return entries;\n }\n\n /**\n * Translate installed extensions information from the server into entries.\n *\n * @param res Promise to the server reply data.\n */\n protected async translateInstalled(\n res: Promise<IInstalledEntry[]>\n ): Promise<{ [key: string]: IEntry }> {\n const promises = [];\n const entries: { [key: string]: IEntry } = {};\n for (let pkg of await res) {\n promises.push(\n res.then(info => {\n entries[pkg.name] = {\n name: pkg.name,\n description: pkg.description,\n url: pkg.url,\n installed: pkg.installed !== false,\n enabled: pkg.enabled,\n status: pkg.status,\n latest_version: pkg.latest_version,\n installed_version: pkg.installed_version\n };\n })\n );\n }\n return Promise.all(promises).then(() => {\n return entries;\n });\n }\n\n /**\n * The current NPM repository search query.\n *\n * Setting its value triggers a new search.\n */\n get query(): string {\n return this._query;\n }\n set query(value: string) {\n this._query = value;\n this.update();\n }\n\n /**\n * The current NPM repository search page.\n *\n * The npm repository search is paginated by the `pagination` attribute.\n * The `page` value selects which page is used.\n *\n * Setting its value triggers a new search.\n */\n get page(): number {\n return this._page;\n }\n set page(value: number) {\n this._page = value;\n this.update();\n }\n\n /**\n * The NPM repository search pagination.\n *\n * The npm repository search is paginated by the `pagination` attribute.\n * The `page` value selects which page is used.\n *\n * Setting its value triggers a new search.\n */\n get pagination(): number {\n return this._pagination;\n }\n set pagination(value: number) {\n this._pagination = value;\n this.update();\n }\n\n /**\n * The total number of results in the current search.\n */\n get totalEntries(): number {\n return this._totalEntries;\n }\n\n /**\n * Make a request to the server for info about its installed extensions.\n */\n protected fetchInstalled(\n refreshInstalled = false\n ): Promise<IInstalledEntry[]> {\n const url = new URL(\n EXTENSION_API_PATH,\n this.serverConnectionSettings.baseUrl\n );\n if (refreshInstalled) {\n url.searchParams.append('refresh', '1');\n }\n const request = ServerConnection.makeRequest(\n url.toString(),\n {},\n this.serverConnectionSettings\n ).then(response => {\n handleError(response);\n return response.json() as Promise<IInstalledEntry[]>;\n });\n request.then(\n () => {\n this.serverConnectionError = null;\n },\n reason => {\n this.serverConnectionError = reason.toString();\n }\n );\n return request;\n }\n\n /**\n * Initialize the model.\n */\n initialize() {\n this.update()\n .then(() => {\n this.initialized = true;\n this.stateChanged.emit(undefined);\n })\n .catch(() => {\n this.initialized = true;\n this.stateChanged.emit(undefined);\n });\n }\n\n /**\n * Update the current model.\n *\n * This will query the NPM repository, and the notebook server.\n *\n * Emits the `stateChanged` signal on successful completion.\n */\n protected async update(refreshInstalled = false) {\n let search = this.searcher.searchExtensions(\n this.query,\n this.page,\n this.pagination\n );\n let searchMapPromise = this.translateSearchResult(search);\n let installedMap = await this.translateInstalled(\n this.fetchInstalled(refreshInstalled)\n );\n let searchMap;\n try {\n searchMap = await searchMapPromise;\n this.searchError = null;\n } catch (reason) {\n searchMap = {};\n this.searchError = reason.toString();\n }\n let installed: IEntry[] = [];\n for (let key of Object.keys(installedMap)) {\n installed.push(installedMap[key]);\n }\n this._installed = installed.sort(Private.comparator);\n\n let searchResult: IEntry[] = [];\n for (let key of Object.keys(searchMap)) {\n if (installedMap[key] === undefined) {\n searchResult.push(searchMap[key]);\n } else {\n searchResult.push(installedMap[key]);\n }\n }\n this._searchResult = searchResult.sort(Private.comparator);\n try {\n this._totalEntries = (await search).total;\n } catch (error) {\n this._totalEntries = 0;\n }\n this.stateChanged.emit(undefined);\n }\n\n /**\n * Send a request to the server to perform an action on an extension.\n *\n * @param action A valid action to perform.\n * @param entry The extension to perform the action on.\n */\n protected _performAction(\n action: string,\n entry: IEntry\n ): Promise<IActionReply> {\n const url = new URL(\n EXTENSION_API_PATH,\n this.serverConnectionSettings.baseUrl\n );\n let request: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n cmd: action,\n extension_name: entry.name\n })\n };\n const completed = ServerConnection.makeRequest(\n url.toString(),\n request,\n this.serverConnectionSettings\n ).then(response => {\n handleError(response);\n this.triggerBuildCheck();\n return response.json() as Promise<IActionReply>;\n });\n completed.then(\n () => {\n this.serverConnectionError = null;\n },\n reason => {\n this.serverConnectionError = reason.toString();\n }\n );\n this._addPendingAction(completed);\n return completed;\n }\n\n /**\n * Add a pending action.\n *\n * @param pending A promise that resolves when the action is completed.\n */\n protected _addPendingAction(pending: Promise<any>): void {\n // Add to pending actions collection\n this._pendingActions.push(pending);\n\n // Ensure action is removed when resolved\n const remove = () => {\n const i = this._pendingActions.indexOf(pending);\n this._pendingActions.splice(i, 1);\n this.stateChanged.emit(undefined);\n };\n pending.then(remove, remove);\n\n // Signal changed state\n this.stateChanged.emit(undefined);\n }\n\n /**\n * Whether there are currently any actions pending.\n */\n hasPendingActions(): boolean {\n return this._pendingActions.length > 0;\n }\n\n /**\n * Install an extension.\n *\n * @param entry An entry indicating which extension to install.\n */\n install(entry: IEntry) {\n if (entry.installed) {\n // Updating\n return this._performAction('install', entry).then(data => {\n if (data.status !== 'ok') {\n reportInstallError(entry.name, data.message);\n }\n this.update();\n });\n }\n this.checkCompanionPackages(entry).then(shouldInstall => {\n if (shouldInstall) {\n return this._performAction('install', entry).then(data => {\n if (data.status !== 'ok') {\n reportInstallError(entry.name, data.message);\n }\n this.update();\n });\n }\n });\n }\n\n /**\n * Uninstall an extension.\n *\n * @param entry An entry indicating which extension to uninstall.\n */\n uninstall(entry: IEntry) {\n if (!entry.installed) {\n throw new Error(`Not installed, cannot uninstall: ${entry.name}`);\n }\n this._performAction('uninstall', entry).then(data => {\n this.update();\n });\n }\n\n /**\n * Enable an extension.\n *\n * @param entry An entry indicating which extension to enable.\n */\n enable(entry: IEntry) {\n if (entry.enabled) {\n throw new Error(`Already enabled: ${entry.name}`);\n }\n this._performAction('enable', entry).then(data => {\n this.update();\n });\n }\n\n /**\n * Disable an extension.\n *\n * @param entry An entry indicating which extension to disable.\n */\n disable(entry: IEntry) {\n if (!entry.enabled) {\n throw new Error(`Already disabled: ${entry.name}`);\n }\n this._performAction('disable', entry).then(data => {\n this.update();\n });\n }\n\n /**\n * Check for companion packages in kernels or server.\n *\n * @param entry An entry indicating which extension to check.\n */\n checkCompanionPackages(entry: IEntry): Promise<boolean> {\n return this.searcher\n .fetchPackageData(entry.name, entry.latest_version)\n .then(data => {\n if (!data || !data.jupyterlab || !data.jupyterlab.discovery) {\n return true;\n }\n let discovery = data.jupyterlab.discovery;\n let kernelCompanions: KernelCompanion[] = [];\n if (discovery.kernel) {\n // match specs\n for (let kernelInfo of discovery.kernel) {\n let matches = matchSpecs(kernelInfo, this.serviceManager.specs);\n kernelCompanions.push({ kernelInfo, kernels: matches });\n }\n }\n if (kernelCompanions.length < 1 && !discovery.server) {\n return true;\n }\n return presentCompanions(kernelCompanions, discovery.server);\n });\n }\n\n /**\n * Trigger a build check to incorporate actions taken.\n */\n triggerBuildCheck(): void {\n let builder = this.serviceManager.builder;\n if (builder.isAvailable && !this.promptBuild) {\n const completed = builder.getStatus().then(response => {\n if (response.status === 'building') {\n // Piggy-back onto existing build\n // TODO: Can this cause dialog collision on build completion?\n return doBuild(builder);\n }\n if (response.status !== 'needed') {\n return;\n }\n if (!this.promptBuild) {\n this.promptBuild = true;\n this.stateChanged.emit(undefined);\n }\n });\n this._addPendingAction(completed);\n }\n }\n\n /**\n * Perform a build on the server\n */\n performBuild(): void {\n if (this.promptBuild) {\n this.promptBuild = false;\n this.stateChanged.emit(undefined);\n }\n const completed = doBuild(this.serviceManager.builder);\n this._addPendingAction(completed);\n }\n\n /**\n * Ignore a build recommendation\n */\n ignoreBuildRecommendation(): void {\n if (this.promptBuild) {\n this.promptBuild = false;\n this.stateChanged.emit(undefined);\n }\n }\n\n /**\n * Ignore a build recommendation\n */\n refreshInstalled(): void {\n const refresh = this.update(true);\n this._addPendingAction(refresh);\n }\n\n /**\n * Contains an error message if an error occurred when updating the model.\n */\n searchError: string | null = null;\n\n /**\n * Contains an error message if an error occurred when querying the server extension.\n */\n serverConnectionError: string | null = null;\n\n /**\n * Whether the model has finished async initialization.\n */\n initialized: boolean = false;\n\n /**\n * Whether a fresh build should be considered due to actions taken.\n */\n promptBuild: boolean = false;\n\n /**\n * Settings for connecting to the notebook server.\n */\n protected serverConnectionSettings: ServerConnection.ISettings;\n\n /**\n * A helper for performing searches of jupyterlab extensions on the NPM repository.\n */\n protected searcher = new Searcher();\n\n /**\n * The service manager to use for building.\n */\n protected serviceManager: ServiceManager;\n\n private _query: string = '';\n private _page: number = 0;\n private _pagination: number = 250;\n private _totalEntries: number = 0;\n\n private _installed: IEntry[];\n private _searchResult: IEntry[];\n private _pendingActions: Promise<any>[] = [];\n}\n\n/**\n * Match kernel specs against kernel spec regexps\n *\n * @param kernelInfo The info containing the regexp patterns\n * @param specs The available kernel specs.\n */\nfunction matchSpecs(\n kernelInfo: IKernelInstallInfo,\n specs: Kernel.ISpecModels | null\n): Kernel.ISpecModel[] {\n if (!specs) {\n return [];\n }\n let matches: Kernel.ISpecModel[] = [];\n let reLang: RegExp | null = null;\n let reName: RegExp | null = null;\n if (kernelInfo.kernel_spec.language) {\n reLang = new RegExp(kernelInfo.kernel_spec.language);\n }\n if (kernelInfo.kernel_spec.display_name) {\n reName = new RegExp(kernelInfo.kernel_spec.display_name);\n }\n for (let key of Object.keys(specs.kernelspecs)) {\n let spec = specs.kernelspecs[key];\n let match = false;\n if (reLang) {\n match = reLang.test(spec.language);\n }\n if (!match && reName) {\n match = reName.test(spec.display_name);\n }\n if (match) {\n matches.push(spec);\n continue;\n }\n }\n return matches;\n}\n\n/**\n * Convert a response to an exception on error.\n *\n * @param response The response to inspect.\n */\nfunction handleError(response: Response): Response {\n if (!response.ok) {\n throw new Error(`${response.status} (${response.statusText})`);\n }\n return response;\n}\n\n/**\n * A namespace for private functionality.\n */\nnamespace Private {\n /**\n * A comparator function that sorts whitelisted orgs to the top.\n */\n export function comparator(a: IEntry, b: IEntry): number {\n if (a.name === b.name) {\n return 0;\n }\n\n let testA = isJupyterOrg(a.name);\n let testB = isJupyterOrg(b.name);\n\n if (testA === testB) {\n return a.name.localeCompare(b.name);\n } else if (testA && !testB) {\n return -1;\n } else {\n return 1;\n }\n }\n}\n"]}
package/lib/widget.js CHANGED
@@ -83,7 +83,8 @@ function ListEntry(props) {
83
83
  }
84
84
  return (React.createElement("li", { className: `jp-extensionmanager-entry ${flagClasses.join(' ')}`, title: title },
85
85
  React.createElement("div", { className: "jp-extensionmanager-entry-title" },
86
- React.createElement("div", { className: "jp-extensionmanager-entry-name" }, entry.name),
86
+ React.createElement("div", { className: "jp-extensionmanager-entry-name" },
87
+ React.createElement("a", { href: entry.url, target: "_blank" }, entry.name)),
87
88
  React.createElement("div", { className: "jp-extensionmanager-entry-jupyter-org" })),
88
89
  React.createElement("div", { className: "jp-extensionmanager-entry-content" },
89
90
  React.createElement("div", { className: "jp-extensionmanager-entry-description" }, entry.description),
@@ -160,9 +161,9 @@ class ExtensionView extends apputils_1.VDomRenderer {
160
161
  else if (!model.query && model.installed.length) {
161
162
  elements.push(React.createElement("header", { key: "installed-header" },
162
163
  "Installed",
163
- React.createElement("button", { className: "jp-extensionmanager-refresh", onClick: () => {
164
+ React.createElement(apputils_1.ToolbarButtonComponent, { iconClassName: "jp-RefreshIcon jp-Icon jp-Icon-16", onClick: () => {
164
165
  model.refreshInstalled();
165
- } }, "\u21BB")));
166
+ }, tooltip: "Refresh extension list" })));
166
167
  content.push(React.createElement(ListView, { key: "installed", entries: model.installed, numPages: 1, onPage: value => {
167
168
  /* no-op */
168
169
  }, performAction: this.onAction.bind(this) }));
package/lib/widget.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../../../extensionmanager/src/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n\nimport { VDomRenderer } from '@jupyterlab/apputils';\n\nimport { ServiceManager } from '@jupyterlab/services';\n\nimport { Message } from '@phosphor/messaging';\n\nimport * as React from 'react';\n\nimport ReactPaginate from 'react-paginate';\n\nimport { ListModel, IEntry, Action } from './model';\n\nimport { isJupyterOrg } from './query';\n\n// TODO: Replace pagination with lazy loading of lower search results\n\n/**\n * Search bar VDOM component.\n */\nexport class SearchBar extends React.Component<\n SearchBar.IProperties,\n SearchBar.IState\n> {\n constructor(props: SearchBar.IProperties) {\n super(props);\n this.state = {\n value: ''\n };\n }\n\n /**\n * Render the list view using the virtual DOM.\n */\n render(): React.ReactElement<any> {\n return (\n <div className=\"jp-extensionmanager-search-bar\">\n <div className=\"jp-extensionmanager-search-wrapper\">\n <input\n type=\"text\"\n className=\"jp-extensionmanager-input\"\n placeholder={this.props.placeholder}\n onChange={this.handleChange.bind(this)}\n value={this.state.value}\n />\n </div>\n </div>\n );\n }\n\n /**\n * Handler for search input changes.\n */\n handleChange(e: KeyboardEvent) {\n let target = e.target as HTMLInputElement;\n this.setState({\n value: target.value\n });\n }\n}\n\n/**\n * The namespace for search bar statics.\n */\nexport namespace SearchBar {\n /**\n * React properties for search bar component.\n */\n export interface IProperties {\n /**\n * The placeholder string to use in the search bar input field when empty.\n */\n placeholder: string;\n }\n\n /**\n * React state for search bar component.\n */\n export interface IState {\n /**\n * The value of the search bar input field.\n */\n value: string;\n }\n}\n\n/**\n * Create a build prompt as a react element.\n *\n * @param props Configuration of the build prompt.\n */\nfunction BuildPrompt(props: BuildPrompt.IProperties): React.ReactElement<any> {\n return (\n <div className=\"jp-extensionmanager-buildprompt\">\n <div className=\"jp-extensionmanager-buildmessage\">\n A build is needed to include the latest changes\n </div>\n <button\n className=\"jp-extensionmanager-rebuild\"\n onClick={props.performBuild}\n >\n Rebuild\n </button>\n <button\n className=\"jp-extensionmanager-ignorebuild\"\n onClick={props.ignoreBuild}\n >\n Ignore\n </button>\n </div>\n );\n}\n\n/**\n * The namespace for build prompt statics.\n */\nnamespace BuildPrompt {\n /**\n * Properties for build prompt react component.\n */\n export interface IProperties {\n /**\n * Callback for when a build is requested.\n */\n performBuild: () => void;\n\n /**\n * Callback for when a build notice is dismissed.\n */\n ignoreBuild: () => void;\n }\n}\n\n/**\n * VDOM for visualizing an extension entry.\n */\nfunction ListEntry(props: ListEntry.IProperties): React.ReactElement<any> {\n const { entry } = props;\n const flagClasses = [];\n if (entry.installed) {\n flagClasses.push('jp-extensionmanager-entry-installed');\n }\n if (entry.enabled) {\n flagClasses.push('jp-extensionmanager-entry-enabled');\n }\n if (ListModel.entryHasUpdate(entry)) {\n flagClasses.push('jp-extensionmanager-entry-update');\n }\n if (entry.status && ['ok', 'warning', 'error'].indexOf(entry.status) !== -1) {\n flagClasses.push(`jp-extensionmanager-entry-${entry.status}`);\n }\n let title = entry.name;\n if (isJupyterOrg(entry.name)) {\n flagClasses.push(`jp-extensionmanager-entry-mod-whitelisted`);\n title = `${entry.name} (Developed by Project Jupyter)`;\n }\n return (\n <li\n className={`jp-extensionmanager-entry ${flagClasses.join(' ')}`}\n title={title}\n >\n <div className=\"jp-extensionmanager-entry-title\">\n <div className=\"jp-extensionmanager-entry-name\">{entry.name}</div>\n <div className=\"jp-extensionmanager-entry-jupyter-org\" />\n </div>\n <div className=\"jp-extensionmanager-entry-content\">\n <div className=\"jp-extensionmanager-entry-description\">\n {entry.description}\n </div>\n <div className=\"jp-extensionmanager-entry-buttons\">\n <button\n className=\"jp-extensionmanager-install\"\n onClick={() => props.performAction('install', entry)}\n >\n Install\n </button>\n <button\n className=\"jp-extensionmanager-update\"\n // An install action will update the extension:\n onClick={() => props.performAction('install', entry)}\n >\n Update\n </button>\n <button\n className=\"jp-extensionmanager-uninstall\"\n onClick={() => props.performAction('uninstall', entry)}\n >\n Uninstall\n </button>\n <button\n className=\"jp-extensionmanager-enable\"\n onClick={() => props.performAction('enable', entry)}\n >\n Enable\n </button>\n <button\n className=\"jp-extensionmanager-disable\"\n onClick={() => props.performAction('disable', entry)}\n >\n Disable\n </button>\n </div>\n </div>\n </li>\n );\n}\n\n/**\n * The namespace for extension entry statics.\n */\nexport namespace ListEntry {\n export interface IProperties {\n /**\n * The entry to visualize.\n */\n entry: IEntry;\n\n /**\n * Callback to use for performing an action on the entry.\n */\n performAction: (action: Action, entry: IEntry) => void;\n }\n}\n\n/**\n * List view widget for extensions\n */\nexport function ListView(props: ListView.IProperties): React.ReactElement<any> {\n const entryViews = [];\n for (let entry of props.entries) {\n entryViews.push(\n <ListEntry\n entry={entry}\n key={entry.name}\n performAction={props.performAction}\n />\n );\n }\n let pagination;\n if (props.numPages > 1) {\n pagination = (\n <div className=\"jp-extensionmanager-pagination\">\n <ReactPaginate\n previousLabel={'<'}\n nextLabel={'>'}\n breakLabel={<a href=\"\">...</a>}\n breakClassName={'break-me'}\n pageCount={props.numPages}\n marginPagesDisplayed={2}\n pageRangeDisplayed={5}\n onPageChange={(data: { selected: number }) =>\n props.onPage(data.selected)\n }\n containerClassName={'pagination'}\n activeClassName={'active'}\n />\n </div>\n );\n }\n const listview = (\n <ul className=\"jp-extensionmanager-listview\">{entryViews}</ul>\n );\n return (\n <div className=\"jp-extensionmanager-listview-wrapper\">\n {entryViews.length > 0 ? (\n listview\n ) : (\n <div key=\"message\" className=\"jp-extensionmanager-listview-message\">\n No entries\n </div>\n )}\n {pagination}\n </div>\n );\n}\n\n/**\n * The namespace for list view widget statics.\n */\nexport namespace ListView {\n export interface IProperties {\n /**\n * The extension entries to display.\n */\n entries: ReadonlyArray<IEntry>;\n\n /**\n * The number of pages that can be viewed via pagination.\n */\n numPages: number;\n\n /**\n * The callback to use for changing the page\n */\n onPage: (page: number) => void;\n\n /**\n * Callback to use for performing an action on an entry.\n */\n performAction: (action: Action, entry: IEntry) => void;\n }\n}\n\n/**\n * The main view for the discovery extension.\n */\nexport class ExtensionView extends VDomRenderer<ListModel> {\n constructor(serviceManager: ServiceManager) {\n super();\n this.model = new ListModel(serviceManager);\n this.addClass('jp-extensionmanager-view');\n }\n\n /**\n * The search input node.\n */\n get inputNode(): HTMLInputElement {\n return this.node.getElementsByClassName(\n 'jp-extensionmanager-input'\n )[0] as HTMLInputElement;\n }\n\n /**\n * Render the extension view using the virtual DOM.\n */\n protected render(): React.ReactElement<any>[] {\n const model = this.model!;\n let pages = Math.ceil(model.totalEntries / model.pagination);\n let elements = [<SearchBar key=\"searchbar\" placeholder=\"SEARCH\" />];\n if (model.promptBuild) {\n elements.push(\n <BuildPrompt\n key=\"buildpromt\"\n performBuild={() => {\n model.performBuild();\n }}\n ignoreBuild={() => {\n model.ignoreBuildRecommendation();\n }}\n />\n );\n }\n // Indicator element for pending actions:\n elements.push(\n <div\n key=\"pending\"\n className={`jp-extensionmanager-pending ${\n model.hasPendingActions() ? 'jp-mod-hasPending' : ''\n }`}\n />\n );\n const content = [];\n if (!model.initialized) {\n model.initialize();\n content.push(\n <div key=\"loading-placeholder\" className=\"jp-extensionmanager-loader\">\n Updating extensions list\n </div>\n );\n } else if (!model.query && model.serverConnectionError !== null) {\n content.push(\n <div key=\"error-msg\" className=\"jp-extensionmanager-error\">\n <p>\n Error communicating with server extension. Consult the documentation\n for how to ensure that it is enabled.\n </p>\n\n <p>Reason given:</p>\n <pre>{model.serverConnectionError}</pre>\n </div>\n );\n } else if (!model.query && model.installed.length) {\n elements.push(\n <header key=\"installed-header\">\n Installed<button\n className=\"jp-extensionmanager-refresh\"\n onClick={() => {\n model.refreshInstalled();\n }}\n >\n &#8635;\n </button>\n </header>\n );\n content.push(\n <ListView\n key=\"installed\"\n entries={model.installed}\n numPages={1}\n onPage={value => {\n /* no-op */\n }}\n performAction={this.onAction.bind(this)}\n />\n );\n } else if (model.searchError === null) {\n elements.push(<header key=\"installable-header\">Search results</header>);\n content.push(\n <ListView\n key=\"installable\"\n entries={model.searchResult}\n numPages={pages}\n onPage={value => {\n this.onPage(value);\n }}\n performAction={this.onAction.bind(this)}\n />\n );\n } else {\n content.push(\n <div key=\"error-msg\" className=\"jp-extensionmanager-error\">\n Error searching for extensions{model.searchError\n ? `: ${model.searchError}`\n : '.'}\n </div>\n );\n }\n elements.push(\n <div key=\"content\" className=\"jp-extensionmanager-content\">\n {content}\n </div>\n );\n return elements;\n }\n\n /**\n * Callback handler for the user specifies a new search query.\n *\n * @param value The new query.\n */\n onSearch(value: string) {\n this.model!.query = value;\n }\n\n /**\n * Callback handler for the user changes the page of the search result pagination.\n *\n * @param value The pagination page number.\n */\n onPage(value: number) {\n this.model!.page = value;\n }\n\n /**\n * Callback handler for when the user wants to perform an action on an extension.\n *\n * @param action The action to perform.\n * @param entry The entry to perform the action on.\n */\n onAction(action: Action, entry: IEntry) {\n switch (action) {\n case 'install':\n return this.model!.install(entry);\n case 'uninstall':\n return this.model!.uninstall(entry);\n case 'enable':\n return this.model!.enable(entry);\n case 'disable':\n return this.model!.disable(entry);\n default:\n throw new Error(`Invalid action: ${action}`);\n }\n }\n\n /**\n * Handle the DOM events for the command palette.\n *\n * @param event - The DOM event sent to the command palette.\n *\n * #### Notes\n * This method implements the DOM `EventListener` interface and is\n * called in response to events on the command palette's DOM node.\n * It should not be called directly by user code.\n */\n handleEvent(event: Event): void {\n switch (event.type) {\n case 'input':\n this.onSearch(this.inputNode.value);\n break;\n case 'focus':\n case 'blur':\n this._toggleFocused();\n break;\n default:\n break;\n }\n }\n\n /**\n * A message handler invoked on a `'before-attach'` message.\n */\n protected onBeforeAttach(msg: Message): void {\n this.node.addEventListener('input', this);\n this.node.addEventListener('focus', this, true);\n this.node.addEventListener('blur', this, true);\n }\n\n /**\n * A message handler invoked on an `'after-detach'` message.\n */\n protected onAfterDetach(msg: Message): void {\n this.node.removeEventListener('input', this);\n this.node.removeEventListener('focus', this, true);\n this.node.removeEventListener('blur', this, true);\n }\n\n /**\n * A message handler invoked on an `'activate-request'` message.\n */\n protected onActivateRequest(msg: Message): void {\n if (this.isAttached) {\n let input = this.inputNode;\n input.focus();\n input.select();\n }\n }\n\n /**\n * Toggle the focused modifier based on the input node focus state.\n */\n private _toggleFocused(): void {\n let focused = document.activeElement === this.inputNode;\n this.toggleClass('p-mod-focused', focused);\n }\n}\n"]}
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../../../extensionmanager/src/widget.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n\nimport { VDomRenderer, ToolbarButtonComponent } from '@jupyterlab/apputils';\n\nimport { ServiceManager } from '@jupyterlab/services';\n\nimport { Message } from '@phosphor/messaging';\n\nimport * as React from 'react';\n\nimport ReactPaginate from 'react-paginate';\n\nimport { ListModel, IEntry, Action } from './model';\n\nimport { isJupyterOrg } from './query';\n\n// TODO: Replace pagination with lazy loading of lower search results\n\n/**\n * Search bar VDOM component.\n */\nexport class SearchBar extends React.Component<\n SearchBar.IProperties,\n SearchBar.IState\n> {\n constructor(props: SearchBar.IProperties) {\n super(props);\n this.state = {\n value: ''\n };\n }\n\n /**\n * Render the list view using the virtual DOM.\n */\n render(): React.ReactElement<any> {\n return (\n <div className=\"jp-extensionmanager-search-bar\">\n <div className=\"jp-extensionmanager-search-wrapper\">\n <input\n type=\"text\"\n className=\"jp-extensionmanager-input\"\n placeholder={this.props.placeholder}\n onChange={this.handleChange.bind(this)}\n value={this.state.value}\n />\n </div>\n </div>\n );\n }\n\n /**\n * Handler for search input changes.\n */\n handleChange(e: KeyboardEvent) {\n let target = e.target as HTMLInputElement;\n this.setState({\n value: target.value\n });\n }\n}\n\n/**\n * The namespace for search bar statics.\n */\nexport namespace SearchBar {\n /**\n * React properties for search bar component.\n */\n export interface IProperties {\n /**\n * The placeholder string to use in the search bar input field when empty.\n */\n placeholder: string;\n }\n\n /**\n * React state for search bar component.\n */\n export interface IState {\n /**\n * The value of the search bar input field.\n */\n value: string;\n }\n}\n\n/**\n * Create a build prompt as a react element.\n *\n * @param props Configuration of the build prompt.\n */\nfunction BuildPrompt(props: BuildPrompt.IProperties): React.ReactElement<any> {\n return (\n <div className=\"jp-extensionmanager-buildprompt\">\n <div className=\"jp-extensionmanager-buildmessage\">\n A build is needed to include the latest changes\n </div>\n <button\n className=\"jp-extensionmanager-rebuild\"\n onClick={props.performBuild}\n >\n Rebuild\n </button>\n <button\n className=\"jp-extensionmanager-ignorebuild\"\n onClick={props.ignoreBuild}\n >\n Ignore\n </button>\n </div>\n );\n}\n\n/**\n * The namespace for build prompt statics.\n */\nnamespace BuildPrompt {\n /**\n * Properties for build prompt react component.\n */\n export interface IProperties {\n /**\n * Callback for when a build is requested.\n */\n performBuild: () => void;\n\n /**\n * Callback for when a build notice is dismissed.\n */\n ignoreBuild: () => void;\n }\n}\n\n/**\n * VDOM for visualizing an extension entry.\n */\nfunction ListEntry(props: ListEntry.IProperties): React.ReactElement<any> {\n const { entry } = props;\n const flagClasses = [];\n if (entry.installed) {\n flagClasses.push('jp-extensionmanager-entry-installed');\n }\n if (entry.enabled) {\n flagClasses.push('jp-extensionmanager-entry-enabled');\n }\n if (ListModel.entryHasUpdate(entry)) {\n flagClasses.push('jp-extensionmanager-entry-update');\n }\n if (entry.status && ['ok', 'warning', 'error'].indexOf(entry.status) !== -1) {\n flagClasses.push(`jp-extensionmanager-entry-${entry.status}`);\n }\n let title = entry.name;\n if (isJupyterOrg(entry.name)) {\n flagClasses.push(`jp-extensionmanager-entry-mod-whitelisted`);\n title = `${entry.name} (Developed by Project Jupyter)`;\n }\n return (\n <li\n className={`jp-extensionmanager-entry ${flagClasses.join(' ')}`}\n title={title}\n >\n <div className=\"jp-extensionmanager-entry-title\">\n <div className=\"jp-extensionmanager-entry-name\">\n <a href={entry.url} target=\"_blank\">\n {entry.name}\n </a>\n </div>\n <div className=\"jp-extensionmanager-entry-jupyter-org\" />\n </div>\n <div className=\"jp-extensionmanager-entry-content\">\n <div className=\"jp-extensionmanager-entry-description\">\n {entry.description}\n </div>\n <div className=\"jp-extensionmanager-entry-buttons\">\n <button\n className=\"jp-extensionmanager-install\"\n onClick={() => props.performAction('install', entry)}\n >\n Install\n </button>\n <button\n className=\"jp-extensionmanager-update\"\n // An install action will update the extension:\n onClick={() => props.performAction('install', entry)}\n >\n Update\n </button>\n <button\n className=\"jp-extensionmanager-uninstall\"\n onClick={() => props.performAction('uninstall', entry)}\n >\n Uninstall\n </button>\n <button\n className=\"jp-extensionmanager-enable\"\n onClick={() => props.performAction('enable', entry)}\n >\n Enable\n </button>\n <button\n className=\"jp-extensionmanager-disable\"\n onClick={() => props.performAction('disable', entry)}\n >\n Disable\n </button>\n </div>\n </div>\n </li>\n );\n}\n\n/**\n * The namespace for extension entry statics.\n */\nexport namespace ListEntry {\n export interface IProperties {\n /**\n * The entry to visualize.\n */\n entry: IEntry;\n\n /**\n * Callback to use for performing an action on the entry.\n */\n performAction: (action: Action, entry: IEntry) => void;\n }\n}\n\n/**\n * List view widget for extensions\n */\nexport function ListView(props: ListView.IProperties): React.ReactElement<any> {\n const entryViews = [];\n for (let entry of props.entries) {\n entryViews.push(\n <ListEntry\n entry={entry}\n key={entry.name}\n performAction={props.performAction}\n />\n );\n }\n let pagination;\n if (props.numPages > 1) {\n pagination = (\n <div className=\"jp-extensionmanager-pagination\">\n <ReactPaginate\n previousLabel={'<'}\n nextLabel={'>'}\n breakLabel={<a href=\"\">...</a>}\n breakClassName={'break-me'}\n pageCount={props.numPages}\n marginPagesDisplayed={2}\n pageRangeDisplayed={5}\n onPageChange={(data: { selected: number }) =>\n props.onPage(data.selected)\n }\n containerClassName={'pagination'}\n activeClassName={'active'}\n />\n </div>\n );\n }\n const listview = (\n <ul className=\"jp-extensionmanager-listview\">{entryViews}</ul>\n );\n return (\n <div className=\"jp-extensionmanager-listview-wrapper\">\n {entryViews.length > 0 ? (\n listview\n ) : (\n <div key=\"message\" className=\"jp-extensionmanager-listview-message\">\n No entries\n </div>\n )}\n {pagination}\n </div>\n );\n}\n\n/**\n * The namespace for list view widget statics.\n */\nexport namespace ListView {\n export interface IProperties {\n /**\n * The extension entries to display.\n */\n entries: ReadonlyArray<IEntry>;\n\n /**\n * The number of pages that can be viewed via pagination.\n */\n numPages: number;\n\n /**\n * The callback to use for changing the page\n */\n onPage: (page: number) => void;\n\n /**\n * Callback to use for performing an action on an entry.\n */\n performAction: (action: Action, entry: IEntry) => void;\n }\n}\n\n/**\n * The main view for the discovery extension.\n */\nexport class ExtensionView extends VDomRenderer<ListModel> {\n constructor(serviceManager: ServiceManager) {\n super();\n this.model = new ListModel(serviceManager);\n this.addClass('jp-extensionmanager-view');\n }\n\n /**\n * The search input node.\n */\n get inputNode(): HTMLInputElement {\n return this.node.getElementsByClassName(\n 'jp-extensionmanager-input'\n )[0] as HTMLInputElement;\n }\n\n /**\n * Render the extension view using the virtual DOM.\n */\n protected render(): React.ReactElement<any>[] {\n const model = this.model!;\n let pages = Math.ceil(model.totalEntries / model.pagination);\n let elements = [<SearchBar key=\"searchbar\" placeholder=\"SEARCH\" />];\n if (model.promptBuild) {\n elements.push(\n <BuildPrompt\n key=\"buildpromt\"\n performBuild={() => {\n model.performBuild();\n }}\n ignoreBuild={() => {\n model.ignoreBuildRecommendation();\n }}\n />\n );\n }\n // Indicator element for pending actions:\n elements.push(\n <div\n key=\"pending\"\n className={`jp-extensionmanager-pending ${\n model.hasPendingActions() ? 'jp-mod-hasPending' : ''\n }`}\n />\n );\n const content = [];\n if (!model.initialized) {\n model.initialize();\n content.push(\n <div key=\"loading-placeholder\" className=\"jp-extensionmanager-loader\">\n Updating extensions list\n </div>\n );\n } else if (!model.query && model.serverConnectionError !== null) {\n content.push(\n <div key=\"error-msg\" className=\"jp-extensionmanager-error\">\n <p>\n Error communicating with server extension. Consult the documentation\n for how to ensure that it is enabled.\n </p>\n\n <p>Reason given:</p>\n <pre>{model.serverConnectionError}</pre>\n </div>\n );\n } else if (!model.query && model.installed.length) {\n elements.push(\n <header key=\"installed-header\">\n Installed<ToolbarButtonComponent\n iconClassName=\"jp-RefreshIcon jp-Icon jp-Icon-16\"\n onClick={() => {\n model.refreshInstalled();\n }}\n tooltip=\"Refresh extension list\"\n />\n </header>\n );\n content.push(\n <ListView\n key=\"installed\"\n entries={model.installed}\n numPages={1}\n onPage={value => {\n /* no-op */\n }}\n performAction={this.onAction.bind(this)}\n />\n );\n } else if (model.searchError === null) {\n elements.push(<header key=\"installable-header\">Search results</header>);\n content.push(\n <ListView\n key=\"installable\"\n entries={model.searchResult}\n numPages={pages}\n onPage={value => {\n this.onPage(value);\n }}\n performAction={this.onAction.bind(this)}\n />\n );\n } else {\n content.push(\n <div key=\"error-msg\" className=\"jp-extensionmanager-error\">\n Error searching for extensions{model.searchError\n ? `: ${model.searchError}`\n : '.'}\n </div>\n );\n }\n elements.push(\n <div key=\"content\" className=\"jp-extensionmanager-content\">\n {content}\n </div>\n );\n return elements;\n }\n\n /**\n * Callback handler for the user specifies a new search query.\n *\n * @param value The new query.\n */\n onSearch(value: string) {\n this.model!.query = value;\n }\n\n /**\n * Callback handler for the user changes the page of the search result pagination.\n *\n * @param value The pagination page number.\n */\n onPage(value: number) {\n this.model!.page = value;\n }\n\n /**\n * Callback handler for when the user wants to perform an action on an extension.\n *\n * @param action The action to perform.\n * @param entry The entry to perform the action on.\n */\n onAction(action: Action, entry: IEntry) {\n switch (action) {\n case 'install':\n return this.model!.install(entry);\n case 'uninstall':\n return this.model!.uninstall(entry);\n case 'enable':\n return this.model!.enable(entry);\n case 'disable':\n return this.model!.disable(entry);\n default:\n throw new Error(`Invalid action: ${action}`);\n }\n }\n\n /**\n * Handle the DOM events for the command palette.\n *\n * @param event - The DOM event sent to the command palette.\n *\n * #### Notes\n * This method implements the DOM `EventListener` interface and is\n * called in response to events on the command palette's DOM node.\n * It should not be called directly by user code.\n */\n handleEvent(event: Event): void {\n switch (event.type) {\n case 'input':\n this.onSearch(this.inputNode.value);\n break;\n case 'focus':\n case 'blur':\n this._toggleFocused();\n break;\n default:\n break;\n }\n }\n\n /**\n * A message handler invoked on a `'before-attach'` message.\n */\n protected onBeforeAttach(msg: Message): void {\n this.node.addEventListener('input', this);\n this.node.addEventListener('focus', this, true);\n this.node.addEventListener('blur', this, true);\n }\n\n /**\n * A message handler invoked on an `'after-detach'` message.\n */\n protected onAfterDetach(msg: Message): void {\n this.node.removeEventListener('input', this);\n this.node.removeEventListener('focus', this, true);\n this.node.removeEventListener('blur', this, true);\n }\n\n /**\n * A message handler invoked on an `'activate-request'` message.\n */\n protected onActivateRequest(msg: Message): void {\n if (this.isAttached) {\n let input = this.inputNode;\n input.focus();\n input.select();\n }\n }\n\n /**\n * Toggle the focused modifier based on the input node focus state.\n */\n private _toggleFocused(): void {\n let focused = document.activeElement === this.inputNode;\n this.toggleClass('p-mod-focused', focused);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jupyterlab/extensionmanager",
3
- "version": "0.17.2",
3
+ "version": "0.18.4",
4
4
  "description": "JupyterLab - Extension Manager",
5
5
  "homepage": "https://github.com/jupyterlab/jupyterlab",
6
6
  "bugs": {
@@ -30,8 +30,8 @@
30
30
  "watch": "tsc -w"
31
31
  },
32
32
  "dependencies": {
33
- "@jupyterlab/apputils": "^0.17.2",
34
- "@jupyterlab/services": "^3.0.3",
33
+ "@jupyterlab/apputils": "^0.18.4",
34
+ "@jupyterlab/services": "^3.1.4",
35
35
  "@phosphor/messaging": "^1.2.2",
36
36
  "react": "~16.4.0",
37
37
  "react-paginate": "^5.2.3",
package/style/index.css CHANGED
@@ -11,6 +11,10 @@
11
11
  font-size: var(--jp-ui-font-size1);
12
12
  }
13
13
 
14
+ .jp-extensionmanager-view > header > .jp-ToolbarButtonComponent {
15
+ padding: 0px 16px;
16
+ }
17
+
14
18
  .jp-extensionmanager-content {
15
19
  overflow: auto;
16
20
  }
@@ -28,17 +32,6 @@
28
32
  flex: 0 0 auto;
29
33
  }
30
34
 
31
- .jp-extensionmanager-view header {
32
- flex: 0 0 auto;
33
- margin: 4px 0px;
34
- padding: 12px 0 4px 12px;
35
- font-weight: 600;
36
- text-transform: uppercase;
37
- border-bottom: var(--jp-border-width) solid var(--jp-border-color2);
38
- letter-spacing: 1px;
39
- font-size: var(--jp-ui-font-size0);
40
- }
41
-
42
35
  .jp-extensionmanager-listview {
43
36
  list-style-type: none;
44
37
  margin: 0;
@@ -58,10 +51,8 @@
58
51
  */
59
52
 
60
53
  .jp-extensionmanager-search-bar {
61
- padding: 8px;
62
- background-color: var(--jp-layout-color2);
63
- border-bottom: 1px solid var(--jp-border-color1);
64
- box-shadow: var(--jp-toolbar-box-shadow);
54
+ padding: 8px 8px 0px 8px;
55
+ background-color: var(--jp-layout-color1);
65
56
  z-index: 2;
66
57
  flex: 0 0 auto;
67
58
  }
@@ -95,7 +86,7 @@
95
86
  height: 32px;
96
87
  width: 12px;
97
88
  padding: 0px 12px;
98
- background-image: var(--jp-icon-search);
89
+ background-image: var(--jp-icon-search-white);
99
90
  background-size: 20px;
100
91
  background-repeat: no-repeat;
101
92
  background-position: center;
@@ -132,6 +123,16 @@
132
123
  .jp-extensionmanager-view header {
133
124
  display: flex;
134
125
  justify-content: space-between;
126
+ flex: 0 0 auto;
127
+ margin: 0px;
128
+ padding: 8px 12px;
129
+ font-weight: 600;
130
+ text-transform: uppercase;
131
+ border-bottom: var(--jp-border-width) solid var(--jp-border-color2);
132
+ letter-spacing: 1px;
133
+ font-size: var(--jp-ui-font-size0);
134
+ line-height: 24px;
135
+ height: 24px;
135
136
  }
136
137
 
137
138
  .jp-extensionmanager-view header button.jp-extensionmanager-refresh {
@@ -198,7 +199,7 @@
198
199
  width: 1em;
199
200
  display: none;
200
201
  position: relative;
201
- top: 3px;
202
+ top: 1px;
202
203
  }
203
204
 
204
205
  .jp-extensionmanager-entry.jp-extensionmanager-entry-mod-whitelisted
@@ -224,8 +225,24 @@
224
225
  font-size: var(--jp-ui-font-size1);
225
226
  font-weight: 600;
226
227
  padding: 0 8px 0 0;
227
- margin-bottom: 3px;
228
+ margin-bottom: 4px;
228
229
  }
230
+
231
+ .jp-extensionmanager-entry-name a:link {
232
+ color: var(--jp-content-link-color);
233
+ text-decoration: none;
234
+ }
235
+
236
+ .jp-extensionmanager-entry-name a:visited {
237
+ color: var(--jp-content-link-color);
238
+ text-decoration: none;
239
+ }
240
+
241
+ .jp-extensionmanager-entry-name a:hover {
242
+ color: var(--jp-content-link-color);
243
+ text-decoration: underline;
244
+ }
245
+
229
246
  .jp-extensionmanager-entry-description {
230
247
  font-size: var(--jp-ui-font-size1);
231
248
  color: var(--jp-ui-font-color2);