Browse Source

remove listings folder

Eric Charles 5 years ago
parent
commit
bc7b5d1efe

+ 1 - 3
.eslintignore

@@ -6,7 +6,6 @@ tests/**/coverage
 
 dev_mode/index.js
 dev_mode/schemas
-dev_mode/listings
 !dev_mode/static/index.out.js
 dev_mode/static
 dev_mode/themes
@@ -15,13 +14,12 @@ docs/_build
 docs/api
 examples/app/build
 examples/app/schemas
-examples/app/listings
 examples/app/themes
 examples/chrome-example-test.js
 jupyterlab/chrome-test.js
 jupyterlab/geckodriver
 jupyterlab/schemas
-jupyterlab/listings
+packages/extensionmanager-extension/examples/listings
 jupyterlab/staging/index.js
 jupyterlab/staging/yarn.js
 jupyterlab/themes

+ 0 - 1
.gitignore

@@ -6,7 +6,6 @@ lib
 jupyterlab/imports.css
 jupyterlab/static
 jupyterlab/schemas
-jupyterlab/listings
 jupyterlab/themes
 jupyterlab/geckodriver
 

+ 1 - 3
.prettierignore

@@ -8,7 +8,6 @@ tests/**/coverage
 .eggs
 dev_mode/index.js
 dev_mode/schemas
-dev_mode/listings
 dev_mode/static
 dev_mode/themes
 dev_mode/workspaces
@@ -17,14 +16,13 @@ docs/api
 examples/app/build
 examples/app/themes
 examples/app/schemas
-examples/app/listings
 jupyterlab/schemas
-jupyterlab/listings
 jupyterlab/themes
 jupyterlab/geckodriver
 jupyterlab/staging/yarn.js
 jupyterlab/staging/index.js
 packages/ui-components/src/icon/iconimports.ts
+packages/extensionmanager/examples/listings
 
 # jetbrains IDE stuff
 .idea/

+ 3 - 50
buildutils/src/build.ts

@@ -64,11 +64,6 @@ export namespace Build {
      */
     readonly schemaDir?: string;
 
-    /**
-     * The local listing dir path in the extension package.
-     */
-    readonly listingDir?: string;
-
     /**
      * The local theme file path in the extension package.
      */
@@ -120,7 +115,7 @@ export namespace Build {
       const data = utils.readJSONFile(packageDataPath);
       const extension = normalizeExtension(data);
 
-      const { schemaDir, listingDir, themePath } = extension;
+      const { schemaDir, themePath } = extension;
 
       // Handle styles.
       if (data.style) {
@@ -167,42 +162,6 @@ export namespace Build {
         );
       }
 
-      // Handle listings.
-      if (listingDir) {
-        const listings = glob.sync(
-          path.join(path.join(packageDir, listingDir), '*')
-        );
-        const destination = path.join(output, 'listings', name);
-
-        // Remove the existing directory if necessary.
-        if (fs.existsSync(destination)) {
-          try {
-            const oldPackagePath = path.join(destination, 'package.json.orig');
-            const oldPackageData = utils.readJSONFile(oldPackagePath);
-            if (oldPackageData.version === data.version) {
-              fs.removeSync(destination);
-            }
-          } catch (e) {
-            fs.removeSync(destination);
-          }
-        }
-
-        // Make sure the listing directory exists.
-        fs.mkdirpSync(destination);
-
-        // Copy listings.
-        listings.forEach(listing => {
-          const file = path.basename(listing);
-          fs.copySync(listing, path.join(destination, file));
-        });
-
-        // Write the package.json file for future comparison.
-        fs.copySync(
-          path.join(packageDir, 'package.json'),
-          path.join(destination, 'package.json.orig')
-        );
-      }
-
       if (!themePath) {
         return;
       }
@@ -276,13 +235,7 @@ export namespace Build {
       throw new Error(`Module ${name} does not contain JupyterLab metadata.`);
     }
 
-    let {
-      extension,
-      mimeExtension,
-      schemaDir,
-      listingDir,
-      themePath
-    } = jupyterlab;
+    let { extension, mimeExtension, schemaDir, themePath } = jupyterlab;
 
     extension = extension === true ? main : extension;
     mimeExtension = mimeExtension === true ? main : mimeExtension;
@@ -293,6 +246,6 @@ export namespace Build {
       throw new Error(message);
     }
 
-    return { extension, mimeExtension, schemaDir, listingDir, themePath };
+    return { extension, mimeExtension, schemaDir, themePath };
   }
 }

+ 0 - 16
buildutils/src/ensure-package.ts

@@ -281,22 +281,6 @@ export async function ensurePackage(
     }
   }
 
-  // Ensure that the `listing` directories match what is in the `package.json`
-  const listingDir = data.jupyterlab && data.jupyterlab.listingDir;
-  const listings = glob.sync(
-    path.join(pkgPath, listingDir || 'listing', '*.json')
-  );
-  if (listingDir && !listings.length) {
-    messages.push(`No listings found in ${path.join(pkgPath, listingDir)}.`);
-  } else if (!listingDir && listings.length) {
-    messages.push(`Schemas found, but no listing indicated in ${pkgPath}`);
-  }
-  for (let listing of listings) {
-    if (!published.has(listing)) {
-      messages.push(`Schema ${listing} not published in ${pkgPath}`);
-    }
-  }
-
   // Ensure that the `style` directories match what is in the `package.json`
   const styles = glob.sync(path.join(pkgPath, 'style', '**/*.*'));
   for (let style of styles) {

+ 136 - 148
docs/source/user/extensions.rst

@@ -12,6 +12,10 @@ extensions to use and can depend on other extensions. In fact, the whole of
 JupyterLab itself is simply a collection of extensions that are no more powerful
 or privileged than any custom extension.
 
+.. contents:: Table of contents
+    :local:
+    :depth: 1
+
 JupyterLab extensions are `npm <https://www.npmjs.com/>`__ packages (the
 standard package format in Javascript development). You can search for the
 keyword `jupyterlab-extension
@@ -157,98 +161,6 @@ performs a free-text search of JupyterLab extensions on the NPM registry.
 
 .. _listings:
 
-Listings
-^^^^^^^^
-
-When searching extensions, JupyterLab displays the complete search result and 
-the user if free to install any extension.
-
-To bring more security, you or your adminstrator can enable ``blacklists`` or ``whitelists``
-mode. JupyterLab will check the extensions against the defined listings.
-
-Only one mode at a time is allowed. The details to enable configure the listings
-can be read :ref:`listings_conf`. The following details the behavior in the different
-modes.
-
-Default mode
-^^^^^^^^^^^^
-
-In the ``default`` mode, no listing is enabled and the search behavior is unchanged and
-is the one described previously.
-
-Blacklist mode
-^^^^^^^^^^^^^^
-
-Extensions can be freely downloaded without going through a vetting process.
-However, users can add malicious extensions to a blacklist. The extension manager 
-will show all extensions except for those that have 
-been explicitly added to the blacklist. Therfore, the extension manager 
-does not allow you to install blacklisted extensions.
-
-If you, or your administrator, has enabled the blacklist mode,
-JupyterLab will use the blacklist and remove all blacklisted
-extensions from your search result.
-
-You will be informed of the number of blacklisted extensions, but will
-not be able to see them. You can click on that message to be driven to 
-this documentation page.
-
-.. figure:: images/listings/searchresult_blacklisted.png
-   :align: center
-   :class: jp-screenshot
-
-   **Figure:** Search result in blacklist mode
-
-
-If you have installed an extension before it has been blacklisted,
-the extension entry in the installed list will be highlighted
-in red. It is recommended that you uninstall it. You can move
-your mouse on the red cross to know more about the reason it
-is blacklisted.
-
-.. figure:: images/listings/installed_blacklisted.png
-   :align: center
-   :class: jp-screenshot
-
-   **Figure:** Blacklisted installed extension
-
-
-Whitelist mode
-^^^^^^^^^^^^^^
-
-A whitelist maintains a set of approved extensions that users can freely 
-search and install. Extensions need to go through some sort of vetting process 
-before they are added to the whitelist. When using a whitelist, the extension manager 
-will highlight extensions that have been explicitly added to the whitelist.
-
-If you, or your administrator, has enabled the whitelist mode
-JupyterLab will use the whitelist and only show extensions present
-in the withelist. The other extensions will not be show in the search result.
-
-You will be informed of the number of non whitelisted extensions, but will
-not be able to see them. You can click on that message to be driven to 
-this documentation page.
-
-.. figure:: images/listings/searchresult_whitelisted.png
-   :align: center
-   :class: jp-screenshot
-
-   **Figure:** Search result in whitelist mode
-
-
-If you have installed an whitelisted extension and at some point
-in time that extension is removed from the whitelist, the extension entry 
-in the installed list will be highlighted in red. It is recommended that 
-you uninstall it. You can move your mouse on the red cross to get
-an explanation message.
-
-.. figure:: images/listings/installed_whitelisted.png
-   :align: center
-   :class: jp-screenshot
-
-   **Figure:** Whitelisted installed extension
-
-
 Installing an Extension
 ^^^^^^^^^^^^^^^^^^^^^^^
 
@@ -337,6 +249,138 @@ will be up to you to take these into account or not.
 
 
 
+Listings
+~~~~~~~~
+
+When searching extensions, JupyterLab displays the complete search result and 
+the user if free to install any extension. This is the :ref:`default_mode`.
+
+To bring more security, you or your administrator can enable ``blacklists`` or ``whitelists``
+mode. JupyterLab will check the extensions against the defined listings.
+
+Only one mode at a time is allowed.
+
+The following details the behavior for the :ref:`blacklist_mode` and the :ref:`whitelist_mode`.
+The details to enable configure the listings can be read :ref:`listings_conf`. 
+
+.. _default_mode:
+
+Default mode
+^^^^^^^^^^^^
+
+In the ``default`` mode, no listing is enabled and the search behavior is unchanged and
+is the one described previously.
+
+.. _blacklist_mode:
+
+Blacklist mode
+^^^^^^^^^^^^^^
+
+Extensions can be freely downloaded without going through a vetting process.
+However, users can add malicious extensions to a blacklist. The extension manager 
+will show all extensions except for those that have 
+been explicitly added to the blacklist. Therfore, the extension manager 
+does not allow you to install blacklisted extensions.
+
+If you, or your administrator, has enabled the blacklist mode,
+JupyterLab will use the blacklist and remove all blacklisted
+extensions from your search result.
+
+If you have installed an extension before it has been blacklisted,
+the extension entry in the installed list will be highlighted
+in red. It is recommended that you uninstall it. You can move
+your mouse on the question mark icon to read the instructions.
+
+.. figure:: images/listings/installed_blacklisted.png
+   :align: center
+   :class: jp-screenshot
+
+   **Figure:** Blacklisted installed extension which should be removed
+
+
+.. _whitelist_mode:
+
+Whitelist mode
+^^^^^^^^^^^^^^
+
+A whitelist maintains a set of approved extensions that users can freely 
+search and install. Extensions need to go through some sort of vetting process 
+before they are added to the whitelist. When using a whitelist, the extension manager 
+will highlight extensions that have been explicitly added to the whitelist.
+
+If you, or your administrator, has enabled the whitelist mode
+JupyterLab will use the whitelist and only show extensions present
+in the withelist. The other extensions will not be show in the search result.
+
+If you have installed an whitelisted extension and at some point
+in time that extension is removed from the whitelist, the extension entry 
+in the installed list will be highlighted in red. It is recommended that 
+you uninstall it. You can move your mouse on the question mark icon to
+read the instructions.
+
+.. figure:: images/listings/installed_whitelisted.png
+   :align: center
+   :class: jp-screenshot
+
+   **Figure:** Whitelisted installed extension which should be removed
+
+.. _listings_conf:
+
+Listing Configuration
+^^^^^^^^^^^^^^^^^^^^^
+
+You or your administrator can use the following traits to define the listings loading.
+
+- ``blacklist_uris``: A list of comma-separated URIs to get the blacklist
+- ``whitelist_uris``: A list of comma-separated URIs to get the whitelist
+- ``listings_refresh_ms``: The interval delay in milliseconds to refresh the lists
+- ``listings_request_options``: The optional kwargs to use for the listings HTTP requests
+
+For example, to enable blacklist, launch the server with ``--LabServerApp.blacklist_uris``.
+
+The details for the listings_request_options are listed
+on the `this page <https://2.python-requests.org/en/v2.7.0/api/#requests.request>`__  
+(for example, you could pass ``{'timeout': 10}`` to change the HTTP request timeout value).
+
+The listings are json files hosted on the URIs you have given.
+
+This is an example of a blacklist file.
+
+.. code:: json
+
+   {
+   "blacklist": [
+      {
+         "name": "@jupyterlab-examples/launcher",
+         "type": "jupyterlab",
+         "reason": "@jupyterlab-examples/launcher is blacklisted for test purpose - Do NOT take this for granted!!!",
+         "creation_date": "2020-03-11T03:28:56.782Z",
+         "last_update_date":  "2020-03-11T03:28:56.782Z"
+      }
+   ]
+   }
+
+The ``name`` attribute support regular expressions.
+
+In the following whitelist example a ``@jupyterlab/*`` will whitelist 
+all jupyterlab organization extensions.
+
+.. code:: json
+
+   {
+   "whitelistlist": [
+      {
+         "name": "@jupyterlab/*",
+         "type": "jupyterlab",
+         "reason": "@jupyterlab-examples/launcher is blacklisted for test purpose - Do NOT take this for granted!!!",
+         "creation_date": "2020-03-11T03:28:56.782Z",
+         "last_update_date":  "2020-03-11T03:28:56.782Z"
+      }
+   ]
+   }
+
+
+
 Using the Terminal
 ~~~~~~~~~~~~~~~~~~~~~
 
@@ -673,59 +717,3 @@ By default, the location is ``~/.jupyter/lab/workspaces/``, where ``~`` is the u
 because these files are typically shared across Python environments.
 The location can be modified using the ``JUPYTERLAB_WORKSPACES_DIR`` environment variable. These files can be imported and exported to create default "profiles",
 using the :ref:`workspace command line tool <url-workspaces-cli>`.
-
-
-.. _listings_conf:
-
-Listing Configuration
-~~~~~~~~~~~~~~~~~~~~~
-
-You or your administrator can use the following traits to define the listings loading.
-
-- ``blacklist_uris``: A list of comma-separated URIs to get the blacklist
-- ``whitelist_uris``: A list of comma-separated URIs to get the whitelist
-- ``listings_refresh_ms``: The interval delay in milliseconds to refresh the lists
-- ``listings_request_options``: The optional kwargs to use for the listings HTTP requests
-
-For example, to enable blacklist, launch the server with ``--LabServerApp.blacklist_uris``.
-
-The details for the listings_request_options are listed
-on the `this page <https://2.python-requests.org/en/v2.7.0/api/#requests.request>`__  
-(for example, you could pass ``{'timeout': 10}`` to change the HTTP request timeout value).
-
-The listings are json files hosted on the URIs you have given.
-
-This is an example of a blacklist file.
-
-.. code:: json
-
-   {
-   "blacklist": [
-      {
-         "name": "@jupyterlab-examples/launcher",
-         "type": "jupyterlab",
-         "reason": "@jupyterlab-examples/launcher is blacklisted for test purpose - Do NOT take this for granted!!!",
-         "creation_date": "2020-03-11T03:28:56.782Z",
-         "last_update_date":  "2020-03-11T03:28:56.782Z"
-      }
-   ]
-   }
-
-The ``name`` attribute support regular expressions.
-
-In the following whitelist example a ``@jupyterlab/*`` will whitelist 
-all jupyterlab organization extensions.
-
-.. code:: json
-
-   {
-   "whitelistlist": [
-      {
-         "name": "@jupyterlab/*",
-         "type": "jupyterlab",
-         "reason": "@jupyterlab-examples/launcher is blacklisted for test purpose - Do NOT take this for granted!!!",
-         "creation_date": "2020-03-11T03:28:56.782Z",
-         "last_update_date":  "2020-03-11T03:28:56.782Z"
-      }
-   ]
-   }

BIN
docs/source/user/images/listings/installed_blacklisted.png


BIN
docs/source/user/images/listings/installed_whitelisted.png


BIN
docs/source/user/images/listings/searchresult_blacklisted.png


BIN
docs/source/user/images/listings/searchresult_whitelisted.png


+ 2 - 2
packages/extensionmanager-extension/examples/listings/Makefile

@@ -1,6 +1,6 @@
-# export BLACK_LIST_URIS="https://raw.githubusercontent.com/datalayer-jupyterlab/jupyterlab-listings-example/master/blacklist_simple.json"
+#export BLACK_LIST_URIS="https://raw.githubusercontent.com/datalayer-jupyterlab/jupyterlab-listings-example/master/blacklist_simple.json"
 export BLACK_LIST_URIS=""
-export WHITE_LIST_URIS="https://raw.githubusercontent.com/datalayer-jupyterlab/jupyterlab-listings-example/master/whitelist_simple.json"
+export WHITE_LIST_URIS="https://raw.githubusercontent.com/datalayer-jupyterlab/jupyterlab-listings-example/master/whitelist_only_jlab.json"
 # export WHITE_LIST_URIS=""
 export LISTINGS_REFRESH_MS=30000
 export LISTINGS_REQUEST_OPTS="{'timeout': 10}"

+ 16 - 2
packages/extensionmanager-extension/examples/listings/README.md

@@ -1,7 +1,21 @@
 # JupyterLab Listings Example
 
+This example allows you to develop the black/white listings features
+
+First build JupyterLab in dev mode.
+
+```bash
+jupyter lab build --dev-mode
+```
+
+For iterative development, launch in `watch` mode.
+
 ```bash
-make dev
-# or...
 make watch
 ```
+
+Otherwise, launch in `dev` mode.
+
+```bash
+make dev
+```

+ 2 - 2
packages/extensionmanager-extension/examples/listings/main.py

@@ -17,7 +17,7 @@ from traitlets import Unicode
 with open(os.path.join(HERE, 'package.json')) as fid:
     version = json.load(fid)['version']
 
-class ExampleApp(LabApp):
+class ListingsApp(LabApp):
     base_url = '/'
     default_url = Unicode('/lab',
                           help='The default URL to redirect to from `/`')
@@ -43,4 +43,4 @@ class ExampleApp(LabApp):
         super().start()
 
 if __name__ == '__main__':
-    ExampleApp.launch_instance()
+    ListingsApp.launch_instance()

+ 0 - 8
packages/extensionmanager-extension/listing/listings.json

@@ -1,8 +0,0 @@
-{
-  "listings": {
-    "blacklist_uris": [""],
-    "whitelist_uris": [""],
-    "blacklist": [],
-    "whitelist": []
-  }
-}

+ 1 - 2
packages/extensionmanager-extension/package.json

@@ -54,7 +54,6 @@
   },
   "jupyterlab": {
     "extension": true,
-    "schemaDir": "schema",
-    "listingDir": "listing"
+    "schemaDir": "schema"
   }
 }

+ 10 - 9
packages/extensionmanager/src/widget.tsx

@@ -11,10 +11,9 @@ import {
   Collapse,
   InputGroup,
   Checkbox,
-  blacklistedIcon,
   jupyterIcon,
-  refreshIcon,
-  whitelistedIcon
+  listingsInfoIcon,
+  refreshIcon
 } from '@jupyterlab/ui-components';
 
 import { Message } from '@lumino/messaging';
@@ -232,8 +231,8 @@ function ListEntry(props: ListEntry.IProperties): React.ReactElement<any> {
         )}
         {entry.blacklistEntry && (
           <ToolbarButtonComponent
-            icon={blacklistedIcon}
-            iconLabel={`${entry.name} is blacklisted since ${entry.blacklistEntry?.creation_date} - Reason: [${entry.blacklistEntry?.reason}]`}
+            icon={listingsInfoIcon}
+            iconLabel={`${entry.name} extension has been blacklisted since install. Please uninstall immediately and contact your blacklist administrator.`}
             onClick={() =>
               window.open(
                 'https://jupyterlab.readthedocs.io/en/stable/user/extensions.html'
@@ -245,8 +244,8 @@ function ListEntry(props: ListEntry.IProperties): React.ReactElement<any> {
           viewType === 'installed' &&
           listMode === 'white' && (
             <ToolbarButtonComponent
-              icon={whitelistedIcon}
-              iconLabel={`${entry.name} is not whitelisted, please contact your administrator.`}
+              icon={listingsInfoIcon}
+              iconLabel={`${entry.name} extension has been removed from the whitelist since installation. Please uninstall immediately and contact your whitelist administrator.`}
               onClick={() =>
                 window.open(
                   'https://jupyterlab.readthedocs.io/en/stable/user/extensions.html'
@@ -434,7 +433,7 @@ export namespace ListView {
     performAction: (action: Action, entry: IEntry) => void;
   }
 }
-
+/*
 function ListingMessage(props: ListingMessage.IProperties) {
   return (
     <div className="jp-extensionmanager-listingmessage">{props.children}</div>
@@ -446,7 +445,7 @@ namespace ListingMessage {
     children: React.ReactNode;
   }
 }
-
+*/
 function ErrorMessage(props: ErrorMessage.IProperties) {
   return (
     <div key="error-msg" className="jp-extensionmanager-error">
@@ -712,6 +711,7 @@ export class ExtensionView extends VDomRenderer<ListModel> {
       } else {
         searchContent.push(
           <>
+            {/*
             {model.listMode === 'black' && model.totalEntries > 0 && (
               <ListingMessage>
                 {
@@ -737,6 +737,7 @@ export class ExtensionView extends VDomRenderer<ListModel> {
                 </a>
               </ListingMessage>
             )}
+            */}
             <ListView
               key="search-items"
               listMode={model.listMode}

+ 2 - 4
packages/ui-components/src/icon/iconimports.ts

@@ -9,7 +9,6 @@ import { LabIcon } from './labicon';
 
 // icon svg import statements
 import addSvgstr from '../../style/icons/toolbar/add.svg';
-import blacklistedSvgstr from '../../style/icons/listing/blacklisted.svg';
 import bugSvgstr from '../../style/icons/toolbar/bug.svg';
 import buildSvgstr from '../../style/icons/sidebar/build.svg';
 import caretDownEmptySvgstr from '../../style/icons/arrow/caret-down-empty.svg';
@@ -49,6 +48,7 @@ import launcherSvgstr from '../../style/icons/filetype/launcher.svg';
 import lineFormSvgstr from '../../style/icons/statusbar/line-form.svg';
 import linkSvgstr from '../../style/icons/toolbar/link.svg';
 import listSvgstr from '../../style/icons/statusbar/list.svg';
+import listingsInfoSvgstr from '../../style/icons/listings/listings-info.svg';
 import markdownSvgstr from '../../style/icons/filetype/markdown.svg';
 import newFolderSvgstr from '../../style/icons/toolbar/new-folder.svg';
 import notTrustedSvgstr from '../../style/icons/statusbar/not-trusted.svg';
@@ -73,12 +73,10 @@ import textEditorSvgstr from '../../style/icons/filetype/text-editor.svg';
 import trustedSvgstr from '../../style/icons/statusbar/trusted.svg';
 import undoSvgstr from '../../style/icons/toolbar/undo.svg';
 import vegaSvgstr from '../../style/icons/filetype/vega.svg';
-import whitelistedSvgstr from '../../style/icons/listing/whitelisted.svg';
 import yamlSvgstr from '../../style/icons/filetype/yaml.svg';
 
 // LabIcon instance construction
 export const addIcon = new LabIcon({ name: 'ui-components:add', svgstr: addSvgstr });
-export const blacklistedIcon = new LabIcon({ name: 'ui-components:blacklisted', svgstr: blacklistedSvgstr });
 export const bugIcon = new LabIcon({ name: 'ui-components:bug', svgstr: bugSvgstr });
 export const buildIcon = new LabIcon({ name: 'ui-components:build', svgstr: buildSvgstr });
 export const caretDownEmptyIcon = new LabIcon({ name: 'ui-components:caret-down-empty', svgstr: caretDownEmptySvgstr });
@@ -118,6 +116,7 @@ export const launcherIcon = new LabIcon({ name: 'ui-components:launcher', svgstr
 export const lineFormIcon = new LabIcon({ name: 'ui-components:line-form', svgstr: lineFormSvgstr });
 export const linkIcon = new LabIcon({ name: 'ui-components:link', svgstr: linkSvgstr });
 export const listIcon = new LabIcon({ name: 'ui-components:list', svgstr: listSvgstr });
+export const listingsInfoIcon = new LabIcon({ name: 'ui-components:listings-info', svgstr: listingsInfoSvgstr });
 export const markdownIcon = new LabIcon({ name: 'ui-components:markdown', svgstr: markdownSvgstr });
 export const newFolderIcon = new LabIcon({ name: 'ui-components:new-folder', svgstr: newFolderSvgstr });
 export const notTrustedIcon = new LabIcon({ name: 'ui-components:not-trusted', svgstr: notTrustedSvgstr });
@@ -142,5 +141,4 @@ export const textEditorIcon = new LabIcon({ name: 'ui-components:text-editor', s
 export const trustedIcon = new LabIcon({ name: 'ui-components:trusted', svgstr: trustedSvgstr });
 export const undoIcon = new LabIcon({ name: 'ui-components:undo', svgstr: undoSvgstr });
 export const vegaIcon = new LabIcon({ name: 'ui-components:vega', svgstr: vegaSvgstr });
-export const whitelistedIcon = new LabIcon({ name: 'ui-components:whitelisted', svgstr: whitelistedSvgstr });
 export const yamlIcon = new LabIcon({ name: 'ui-components:yaml', svgstr: yamlSvgstr });

+ 4 - 8
packages/ui-components/style/deprecated.css

@@ -13,7 +13,6 @@
 
 :root {
   --jp-icon-add: url('icons/toolbar/add.svg');
-  --jp-icon-blacklisted: url('icons/listing/blacklisted.svg');
   --jp-icon-bug: url('icons/toolbar/bug.svg');
   --jp-icon-build: url('icons/sidebar/build.svg');
   --jp-icon-caret-down-empty-thin: url('icons/arrow/caret-down-empty-thin.svg');
@@ -53,6 +52,7 @@
   --jp-icon-line-form: url('icons/statusbar/line-form.svg');
   --jp-icon-link: url('icons/toolbar/link.svg');
   --jp-icon-list: url('icons/statusbar/list.svg');
+  --jp-icon-listings-info: url('icons/listings/listings-info.svg');
   --jp-icon-markdown: url('icons/filetype/markdown.svg');
   --jp-icon-new-folder: url('icons/toolbar/new-folder.svg');
   --jp-icon-not-trusted: url('icons/statusbar/not-trusted.svg');
@@ -77,7 +77,6 @@
   --jp-icon-trusted: url('icons/statusbar/trusted.svg');
   --jp-icon-undo: url('icons/toolbar/undo.svg');
   --jp-icon-vega: url('icons/filetype/vega.svg');
-  --jp-icon-whitelisted: url('icons/listing/whitelisted.svg');
   --jp-icon-yaml: url('icons/filetype/yaml.svg');
 }
 
@@ -86,9 +85,6 @@
 .jp-AddIcon {
   background-image: var(--jp-icon-add);
 }
-.jp-BlacklistedIcon {
-  background-image: var(--jp-icon-blacklisted);
-}
 .jp-BugIcon {
   background-image: var(--jp-icon-bug);
 }
@@ -206,6 +202,9 @@
 .jp-ListIcon {
   background-image: var(--jp-icon-list);
 }
+.jp-ListingsInfoIcon {
+  background-image: var(--jp-icon-listings-info);
+}
 .jp-MarkdownIcon {
   background-image: var(--jp-icon-markdown);
 }
@@ -278,9 +277,6 @@
 .jp-VegaIcon {
   background-image: var(--jp-icon-vega);
 }
-.jp-WhitelistedIcon {
-  background-image: var(--jp-icon-whitelisted);
-}
 .jp-YamlIcon {
   background-image: var(--jp-icon-yaml);
 }

+ 0 - 20
packages/ui-components/style/icons/listing/blacklisted.svg

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
-  <g
-     id="g4"
-     style="fill:#d11d13">
-    <path
-       d="m 12.001,2.085 c -5.478,0 -9.916,4.438 -9.916,9.916 0,5.476 4.438,9.914 9.916,9.914 5.476,0 9.914,-4.438 9.914,-9.914 0,-5.478 -4.438,-9.916 -9.914,-9.916 z m 0.001,18 c -4.465,0 -8.084,-3.619 -8.084,-8.083 0,-4.465 3.619,-8.084 8.084,-8.084 4.464,0 8.083,3.619 8.083,8.084 0,4.464 -3.619,8.083 -8.083,8.083 z"
-       id="path6" />
-    <g
-       id="g9"
-       transform="matrix(0.366025,0,0,0.366025,-12.09664,-11.847823)"
-       style="fill:#000000">
-      <path
-         d="m 57.035,78.88 -0.157,-0.168 -4.395,-4.713 c 0,0 3.116184,-2.904537 9.198,-8.576 l -6.496,-6.966 4.387,-4.09 6.496,6.9655 8.774,-8.1815 4.552,4.882 -8.774,8.231 7.0285,7.7785 -4.012,4.0285 -7.4035,-7.716 z"
-         id="path12" />
-    </g>
-  </g>
-</svg>

+ 0 - 20
packages/ui-components/style/icons/listing/whitelisted.svg

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
-  <g
-     id="g4"
-     style="fill:#00af8b">
-    <path
-       d="m 12.001,2.085 c -5.478,0 -9.916,4.438 -9.916,9.916 0,5.476 4.438,9.914 9.916,9.914 5.476,0 9.914,-4.438 9.914,-9.914 0,-5.478 -4.438,-9.916 -9.914,-9.916 z m 0.001,18 c -4.465,0 -8.084,-3.619 -8.084,-8.083 0,-4.465 3.619,-8.084 8.084,-8.084 4.464,0 8.083,3.619 8.083,8.084 0,4.464 -3.619,8.083 -8.083,8.083 z"
-       id="path6" />
-    <g
-       id="g9"
-       transform="matrix(0.33275,0,0,0.33275,-4.6427888,-6.8567577)"
-       style="fill:#000000">
-      <path
-         d="m 46.135,69.28 -0.157,-0.168 -4.395,-4.713 -6.496,-6.966 4.811,-4.484 6.496,6.965 17.548,-16.363 4.552,4.882 -22.359,20.847 z"
-         id="path12" />
-    </g>
-  </g>
-</svg>

+ 56 - 0
packages/ui-components/style/icons/listings/listings-info.svg

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 50.978 50.978" style="enable-background:new 0 0 50.978 50.978;" xml:space="preserve">
+<g>
+	<g>
+		<g>
+			<path style="fill:#010002;" d="M43.52,7.458C38.711,2.648,32.307,0,25.489,0C18.67,0,12.266,2.648,7.458,7.458
+				c-9.943,9.941-9.943,26.119,0,36.062c4.809,4.809,11.212,7.456,18.031,7.458c0,0,0.001,0,0.002,0
+				c6.816,0,13.221-2.648,18.029-7.458c4.809-4.809,7.457-11.212,7.457-18.03C50.977,18.67,48.328,12.266,43.52,7.458z
+				 M42.106,42.105c-4.432,4.431-10.332,6.872-16.615,6.872h-0.002c-6.285-0.001-12.187-2.441-16.617-6.872
+				c-9.162-9.163-9.162-24.071,0-33.233C13.303,4.44,19.204,2,25.489,2c6.284,0,12.186,2.44,16.617,6.872
+				c4.431,4.431,6.871,10.332,6.871,16.617C48.977,31.772,46.536,37.675,42.106,42.105z"/>
+		</g>
+		<g>
+			<path style="fill:#010002;" d="M23.578,32.218c-0.023-1.734,0.143-3.059,0.496-3.972c0.353-0.913,1.11-1.997,2.272-3.253
+				c0.468-0.536,0.923-1.062,1.367-1.575c0.626-0.753,1.104-1.478,1.436-2.175c0.331-0.707,0.495-1.541,0.495-2.5
+				c0-1.096-0.26-2.088-0.779-2.979c-0.565-0.879-1.501-1.336-2.806-1.369c-1.802,0.057-2.985,0.667-3.55,1.832
+				c-0.301,0.535-0.503,1.141-0.607,1.814c-0.139,0.707-0.207,1.432-0.207,2.174h-2.937c-0.091-2.208,0.407-4.114,1.493-5.719
+				c1.062-1.64,2.855-2.481,5.378-2.527c2.16,0.023,3.874,0.608,5.141,1.758c1.278,1.16,1.929,2.764,1.95,4.811
+				c0,1.142-0.137,2.111-0.41,2.911c-0.309,0.845-0.731,1.593-1.268,2.243c-0.492,0.65-1.068,1.318-1.73,2.002
+				c-0.65,0.697-1.313,1.479-1.987,2.346c-0.239,0.377-0.429,0.777-0.565,1.199c-0.16,0.959-0.217,1.951-0.171,2.979
+				C26.589,32.218,23.578,32.218,23.578,32.218z M23.578,38.22v-3.484h3.076v3.484H23.578z"/>
+		</g>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 1 - 3
setup.py

@@ -30,7 +30,6 @@ ensure_python(['>=3.5'])
 data_files_spec = [
     ('share/jupyter/lab/static', '%s/static' % NAME, '**'),
     ('share/jupyter/lab/schemas', '%s/schemas' % NAME, '**'),
-    ('share/jupyter/lab/listings', '%s/listings' % NAME, '**'),
     ('share/jupyter/lab/themes', '%s/themes' % NAME, '**'),
     ('etc/jupyter/jupyter_notebook_config.d',
      'jupyter-config/jupyter_notebook_config.d', 'jupyterlab.json'),
@@ -39,7 +38,7 @@ data_files_spec = [
 package_data_spec = dict()
 package_data_spec[NAME] = [
     'staging/*', 'staging/templates/*', 'static/**', 'tests/mock_packages/**',
-    'themes/**', 'schemas/**', 'listings/**', '*.js'
+    'themes/**', 'schemas/**', '*.js'
 ]
 
 
@@ -59,7 +58,6 @@ def check_assets():
     targets = [
         'static/package.json',
         'schemas/@jupyterlab/shortcuts-extension/shortcuts.json',
-        'listings/@jupyterlab/extensionmanager-extension/listings.json',
         'themes/@jupyterlab/theme-light-extension/index.css'
     ]