You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by dg...@apache.org on 2020/04/14 08:14:15 UTC

[incubator-dlab] branch DLAB-1551 updated (bf11f35 -> 470a2d7)

This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a change to branch DLAB-1551
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git.


 discard bf11f35  [DLAB-1551]: Added bucket dialog
     add a72d83d  [DLAB-1546]: added name convention changes
     add d1d33c1  [DLAB-1546]: added name convention changes
     add 1a91f08  [DLAB-1546]: added name convention changes
     add 438ef06  [DLAB-1546]: added name convention changes
     add 4eccb95  [DLAB-1546]: added name convention changes
     add d43e92f  [DLAB-1546]: added name convention changes
     add a319ef9  [DLAB-1546]: added name convention changes
     add 88b7c21  [DLAB-1546]: added name convention changes
     add e22fed8  [DLAB-1546]: added name convention changes
     add 054af0f  [DLAB-1546]: added name convention changes
     add dcef057  [DLAB-1546]: added name convention changes
     add e8dc4ad  [DLAB-1546]: added name convention changes
     add f20f25d  [DLAB-1553]: [GCP] project local backet termination fixed
     add fbcfdb9  Merge pull request #616 from apache/DLAB-1553
     add d03b40b  DLAB-1531 returned Name tag to azure service_account
     add 8db78f5  Merge pull request #617 from apache/DLAB-1531
     add d02f4c0  [DLAB-1587]: Added value of service (#618)
     add 4e8eae2  DLAB-1517 added usage of ssn_nginx.conf file
     add 1345909  DLAB-1517 added nginx user creation
     add 2239cca  DLAB-1517 changed cp path for nginx.conf
     add 7ce3069  Merge pull request #619 from apache/DLAB-1517
     add 868e4b0  [DLAB-625] Created Jupyterlab template for Azure
     add acd8932  [DLAB-625] Bugfix
     add 04399b8  [DLAB-625] Fixed minor bug and updated jupyterlab version
     add 0e8c625  Merge pull request #620 from apache/DLAB-625
     add a4798b1  Merge branch 'develop' of github.com:apache/incubator-dlab into DLAB-1546
     add 4bf39e9  [DLAB-1546]: added name convention changes
     add faa4f12  [DLAB-1546]: added name convention changes
     add feba37c  [DLAB-1546]: added name convention changes
     add c098a7a  [DLAB-1546]: added name convention changes
     add 2ef159f  [DLAB-1546]: added name convention changes
     add 52b6642  [DLAB-1546]: added name convention changes
     add 30389c9  [DLAB-1546]: added name convention changes
     add 881bb4e  [DLAB-1546]: added name convention changes
     add defd3d5  [DLAB-1546]: added name convention changes
     add eb4f7f7  [DLAB-1546]: added name convention changes
     add d609425  [DLAB-1546]: added name convention changes
     add 812c8c8  [DLAB-1546]: added name convention changes
     add 5375125  [DLAB-1546]: added name convention changes
     add 0d58ec2  [DLAB-1546]: added name convention changes
     add 1cf6c14  [DLAB-1546]: added name convention changes
     add e7399ab  [DLAB-1546]: added name convention changes
     add 7465e6d  [DLAB-1546]: added name convention changes
     add 66778c7  [DLAB-1546]: added name convention changes
     add 0742f2c  [DLAB-1546]: added name convention changes
     add 40fdff7  [DLAB-1546]: added name convention changes
     add bbea296  [DLAB-1546]: added name convention changes
     add 749b31d  [DLAB-1546]: added name convention changes
     add fa9bafb  [DLAB-1546]: added name convention changes
     add bdda302  [DLAB-1546]: added name convention changes
     add 5c64fa1  Added endpoint name while stopping dataengine
     add 77ac1ef  Added endpoint name for some action
     add 5ac08a0  small style fix (#622)
     add b214927  [DLAB-1570]: Rarely notebook creation fails on stage of 'npm' installation fixed
     add f67b8b1  [DLAB-1570]: Rarely notebook creation fails on stage of 'npm' installation fixed
     add 68b9825  Merge pull request #623 from apache/DLAB-1570
     add bb069fe  [DLAB-1570]: returned name of the function
     add 8eb6f29  Merge pull request #624 from apache/DLAB-1570
     add 31b5cc2  [DLAB-1570]: 'npm' fixes updated
     add 8c2548f  Merge pull request #625 from apache/DLAB-1570
     add 5a644ac  'npm' install fixes
     add c031f1a  [DLAB-1468]: disables shared image enabled variable in dlab.ini and deploy dlab script
     add 1e5e8cc  [DLAB-1468]: disables shared image enabled variable in ssn_configure
     add 88572a5  [DLAB-1468]: removed usage of shared_image_enabled during ssn creation
     add 5b55d74  [DLAB-1468]: removed shared_image_enabled from README.md
     add e9400ca  Merge pull request #627 from apache/DLAB-1468
     add 76a0970  [DLAB-1595]: added features block
     add fd8506d  [DLAB-1595]: added endpoint network interface to security group association
     add dcbb778  [DLAB-1595]: added dependency for nif-sg association
     add 32f4456  [DLAB-1595]: changed nif-sg dependency
     add 8fb14dd  [DLAB-1595]: added additional dependencies for testing
     add 87cd4da3 [DLAB-1595]: removed dependencies
     add ec72a18  [DLAB-1595]: added dependency for testing
     add 6975cf0  Merge pull request #628 from apache/DLAB-1595
     add d2eb326  [DLAB-11485]: test commit for ssn fail
     add f51318f  [DLAB-11485]: test commit for ssn fail
     add e1a5989  [DLAB-11485]: [GCP] - SSN creation deletes predefined VPC/subnet in case of SSN creation fails fixed
     add 3b14af2  [DLAB-11485]: [GCP] - SSN fail for test
     add 01780c1  [DLAB-11485]: [GCP] - SSN fail for test 1
     add e3e9ace  [DLAB-11485]: [GCP] - SSN fail for test 2
     add 55a99a2  [DLAB-11485]: [GCP] - SSN fail for test 2
     add 017ddd0  [DLAB-11485]: [GCP] - SSN fail for test 3
     add 132ea90  [DLAB-11485]: [GCP] - SSN creation deletes predefined VPC/subnet in case of SSN creation fails fixed
     add 99adcb0  [DLAB-11485]: final changes
     add 8e734ea  Merge pull request #629 from apache/DLAB-1485
     add cfff604  [DLAB-1579]: Added confirmation dialog with information about termina… (#630)
     add 6129baf  [DLAB-1539]: changed user tag for notebooks
     add 907fcd6  [DLAB-1539]: added user tag and custom tag to notebook labels
     add ccdb2f6  [DLAB-1539]: removed prints from get_index... function in gcp meta_lib
     add c3a6c49  [DLAB-1539]: added user_tag for dataengine
     add 51afde3  Merge pull request #631 from apache/DLAB-1539
     add d37f095  Merge branch 'develop' of github.com:apache/incubator-dlab into DLAB-1546
     add dbd4a08  [DLAB-1546]: added name convention changes
     add 866c6d9  Merge remote-tracking branch 'origin/DLAB-1546' into DLAB-1546
     add 71520e1  [DLAB-1546]: added name convention changes
     add 78ee925  [DLAB-1546]: added name convention changes
     add 93d85d0  [DLAB-1546]: added name convention changes
     add ee708a2  [DLAB-1546]: added name convention changes
     add 790de25  [DLAB-1546]: added name convention changes
     add 8dca3f4  [DLAB-1546]: added name convention changes
     add 557ac99  [DLAB-1546]: added name convention changes
     add 323087b  [DLAB-1546]: added name convention changes
     add e7aeca5  [DLAB-1546]: added name convention changes
     add a3112d0  [DLAB-1546]: added name convention changes
     add 8f04434  [DLAB-1546]: added name convention changes
     add 87d4897  [DLAB-1546]: added name convention changes
     add cad6bee  [DLAB-1546]: added name convention changes
     add e7b0448  [DLAB-1546]: added name convention changes
     add 1910739  [DLAB-1546]: added name convention changes
     add 8b2f231  [DLAB-1546]: added name convention changes
     add 538862f  [DLAB-1546]: added name convention changes
     add a946003  [DLAB-1546]: added name convention changes
     add a1c7dc9  [DLAB-1546]: added name convention changes
     add 1bfc7b6  [DLAB-1604] Make Cluster name unique per project
     add 865f70e  Merge remote-tracking branch 'origin/DLAB-1546' into DLAB-1546
     add 7bfdc29  [DLAB-1546]: added name convention changes
     add 21e893b  Made cluster name unique per project
     add 3819859  Merge remote-tracking branch 'origin/DLAB-1546' into DLAB-1546
     add 3e5b854  Merge remote-tracking branch 'origin/DLAB-1546' into DLAB-1546
     add 6ebf686  [DLAB-1546]: added name convention changes
     add 14f0044  [DLAB-1599]: Adjusted billing acording to multicloud support (#632)
     add 79ca168  [DLAB-1510] All resources are stopped with project (#611)
     add 532573c  [DLAB-1606]: Fixed small css bugs (#634)
     add 30045cd  [DLAB-1609]: Conveyed 'Resource Type' value to UI (#635)
     add f778f0c  [DlAB-1520] Filter the projects with terminated nodes (#633)
     add a7c9a81  DLAB-1539 added check if custom tag is defined
     add 1a0355b  [DLAB-1539]: changed if statement for custom tag
     add 96f901f  [DLAB-1539]: changed how additional labels are assigned
     add 1e1d4fa  Merge pull request #636 from apache/DLAB-1539
     add 23ec629  Merge branch 'develop' of github.com:apache/incubator-dlab into DLAB-1546
     add 4d38f8a  [DLAB-1546]: added name convention changes
     add a01a871  [DLAB-1546]: added name convention changes
     add 83eda03  [DLAB-1546]: added name convention changes
     add cce0632  [DLAB-1546]: added name convention changes
     add 908dde5  [DLAB-1546]: added name convention changes
     add ab54d3d  [DLAB-1546]: added name convention changes
     add 5f36ea7  [DLAB-1546]: added name convention changes
     add 5b16989  [DLAB-1546]: added name convention changes
     add bfd561e  [DLAB-1546]: added name convention changes
     add 1127431  [DLAB-1546]: added name convention changes
     add 29ba942  [DLAB-1612]: added replacement of uppercase letters and underscores in additional tags
     add da9034c  [DLAB-1612]: changed formatting
     add 30887f7  [DLAB-1612]: changed formatting and removed unnecessary if statement
     add 64c9828  Merge pull request #637 from apache/DLAB-1612
     add c6d35ee  [DLAB-1615]: Added some billing values on UI (#640)
     add 71c38dc  [DLAB-1524] The endpoints field verification (#639)
     add 01927e5  [DLAB-1541] Added project name as a unique part of the exploratory
     add 349897e  [DLAB-1541]: Changed routes on UI
     add 08f1dc3  [DLAB-1541] Fixed bugs with libs and comp resource statuses
     add 6695fe7  [DLAB-1586] Stopping/starting/terminating statuses of notebook conveyed to DLab UI
     add b04499f  [DLAB-1585]: Fixed creation computational resources with the same name for second project
     add 082e5f4  Merge remote-tracking branch 'origin/DLAB-1541' into DLAB-1541
     add 37f9cdf  Merge branch 'DLAB-1541' into develop
     add 6c04b0d  Fixed tests
     add e2aa6f9  [DLAB-384]: Grouped roles (#642)
     add df0024a  Merge branch 'develop' of github.com:apache/incubator-dlab into DLAB-1546
     add d2ba8b7  Merge pull request #643 from apache/DLAB-1546
     add cfe31ee  fixed issue with edge node creation
     add b875ef8  Merge pull request #644 from apache/azure-edge-fix
     add c320d80  [DLAB-1555] The warning message is adjusted (#641)
     add d8dda87  [DLAB-1622]: Fixed issue with storage and container name in Azure
     add c532673  Merge pull request #645 from apache/DLAB-1622
     add b214643  Dlab 1618 (#646)
     add 152dde0  [DLAB-1618]: Adjusted role page according to requirements (#648)
     add 7918b69  [DLAB-1615]: Added service value to billing Azure (#650)
     add 40e15a2  [DLAB-1627]: changed shared images names
     add 726456d  Merge pull request #651 from apache/DLAB-1627
     add ad6958e  [DLAB-1524] Endpoints fields verification (#647)
     add 809881c  [DLAB-384]: Add category names for roles (#652)
     add 8799340  [DLAB-1629]: Luarocks version updated
     add b58da76  [DLAB-1629]: Project creation fails fixed
     add 307879c  Merge pull request #653 from apache/DLAB-1629
     add c583287  [DLAB-1631]: fixed bug
     add 3b09e5e  Merge pull request #654 from apache/DLAB-1631
     add 48bcba2  [DLAB-1630]: made bucket name lover case for FE
     add 09a0504  [DLAB-1630]: fixed typo
     add 60aaf85  [DLAB-1630]: returned typo
     add e908b6a  Merge pull request #656 from apache/DLAB-1630
     add 60bb073  [DLAB-1632]: Fixed 'Cancel'/'Install' buttons are cut on 'Library management' popup (#658)
     add 944fe1a  [DLAB-1629]: Project creation fails fixed
     add 6ef7249  Merge pull request #660 from apache/DLAB-1629
     add d379e6a  [DLAB-1628]: made bucket name lover case when prep emr
     add a4ea0d8  [DLAB-1628]: made variable lower-case
     add 2180e7f  [DLAB-1628]: made variable lower-case
     add 34d156c  [DLAB-1628]: made bucket name variable lower-case everywhere for aws
     add d1c862c  [DLAB-1628]: changed for testing
     add 02f647f  [DLAB-1628]: added replace _ - for bucket names
     add 2d1b9b4  Merge pull request #661 from apache/DLAB-1628
     add 08b1d87  [DLAB-1624]: fixed bug
     add 0fcde11  Merge pull request #662 from apache/DLAB-1624
     add 064ed88  [DLAB-1625]: fixed starting edge node
     add 326aad1  Merge pull request #663 from apache/DLAB-1625
     add b82af34  [DLAB-1635] Fixed issue with notebook stopping by scheduler
     add 904c6cb  Dlab 1633 (#664)
     add 75a07fd  [DLAB-1623] Stopping of the Edge node (#659)
     add 3639d24  [DLAB-1642]: added removal of project specific image during project termination
     add 952268d  [DLAB-1642]: made some changes
     add 93008a9  Merge pull request #665 from apache/DLAB-1642
     add a8c09c6  [DLAB-1643]: changed SA and roles termination during project termination
     add f704965  [DLAB-1643]: made some changes
     add 8e24787  [DLAB-1643]: made some changes
     add 2ed3dff  Merge pull request #666 from apache/DLAB-1643
     add 4d3aefd  [DLAB-1457] Removed 'Allow to' from 'Roles' drop down list
     add d0c7fdb  [DLAB-1641] made redirectUris lower-case
     add 144def1  Merge pull request #667 from apache/DLAB-1641
     add b8ef951  Merge remote-tracking branch 'origin/develop' into develop
     add 3f5451e  [DLAB-1638]: Done set of tasks after improvement for roles (#668)
     add 5e03cd4  [DLAB-1647]: Action for notebook depend on edge node status. (#669)
     add 0e3d531  [DLAB-1648]: Conveyed all resources which will be terminated during edge deletion (#670)
     add bf0e539  [DLAB-1657]: added endpoint name to notebook image name
     add 0f5b520  [DLAB-1657]: formatted code
     add c5fb923  Merge pull request #671 from apache/DLAB-1657
     add 658dfef  [Dlab 1661]: Grouped Compute/Notebook shapes by clouds (#673)
     add 239eb05  [DLAB-1654]: Made modal windows static if user is not assigned to a project (#674)
     add 23ee18a  [DLAB-1663]: [GCP] - Notebook termination does not delete related Data Engine fixed
     add dab906f  Merge pull request #675 from apache/DLAB-1663
     add 1b29d3d  [DLAB-1655]: changed gcs-connector version and added to dlab.ini
     add 404353a  Merge pull request #677 from apache/DLAB-1655
     add 4013242  [DLAB-1666]: made user_storage_account_name lower-case
     add d356399  Merge pull request #679 from apache/DLAB-1666
     add 5641cc7  [DLAB-1668]: made container name lower-case
     add 7b407cf  Merge pull request #680 from apache/DLAB-1668
     add b78fed1  [DLAB-1672]: Provided mandatory field for library installation (#681)
     add 3cd0bad  [DLAB-1665]: added removal of project specific images during project termination on azure
     add 84d86dd  [DLAB-1665]: added removal of project specific images during project termination on aws
     add c1a1c1a  [DLAB-1665]: changed removal of project specific images during project termination on azure
     add 5ad38d1  Merge pull request #682 from apache/DLAB-1665
     add f75a6f0  [DLAB-1676]: Fixed bugs for set of rules libraries installation (#683)
     new 34a4662  [DLAB-1551]: Created bucket browser window
     new 2a6e5bc  [DLAB-1551]: Added folder tree
     new 084a9ec  [DLAB-1551]: Added folders menu
     new 1c50ce1  Styling bucket browser
     new 470a2d7  Bucket browser for video

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (bf11f35)
            \
             N -- N -- N   refs/heads/DLAB-1551 (470a2d7)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 README.md                                          |   3 -
 infrastructure-provisioning/scripts/deploy_dlab.py |   1 -
 .../scripts/deploy_repository/deploy_repository.py |   2 +-
 .../scripts/configure_deep_learning_node.py        |   4 +-
 infrastructure-provisioning/src/edge/fabfile.py    |  76 --
 .../src/general/conf/dlab.ini                      |   6 +-
 .../{jupyter_Dockerfile => jupyterlab_Dockerfile}  |   4 +-
 ...escription.json => jupyterlab_description.json} |   6 +-
 .../general/files/gcp/jupyterlab_description.json  |   2 +-
 .../src/general/lib/aws/actions_lib.py             |  60 +-
 .../src/general/lib/azure/actions_lib.py           |  45 +-
 .../src/general/lib/gcp/actions_lib.py             |  18 +-
 .../src/general/lib/gcp/meta_lib.py                |  23 +-
 .../src/general/lib/os/debian/common_lib.py        |   1 +
 .../src/general/lib/os/debian/edge_lib.py          |  27 +-
 .../src/general/lib/os/debian/ssn_lib.py           |   4 +
 .../src/general/lib/os/fab.py                      |  42 +-
 .../scripts/aws/common_create_notebook_image.py    |  48 +-
 .../general/scripts/aws/common_create_policy.py    |  14 +-
 .../general/scripts/aws/common_create_subnet.py    |   2 +-
 .../scripts/aws/common_download_git_certfile.py    |   2 +-
 ...common_notebook_configure_dataengine-service.py | 110 ++-
 .../aws/common_notebook_configure_dataengine.py    |  73 +-
 .../general/scripts/aws/common_prepare_notebook.py | 173 ++--
 .../general/scripts/aws/common_start_notebook.py   |  39 +-
 .../general/scripts/aws/common_stop_notebook.py    |  47 +-
 .../scripts/aws/common_terminate_notebook.py       |  38 +-
 .../scripts/aws/common_terminate_notebook_image.py |  17 +-
 .../scripts/aws/dataengine-service_configure.py    | 198 ++--
 .../scripts/aws/dataengine-service_prepare.py      | 257 +++---
 .../scripts/aws/dataengine-service_terminate.py    |  37 +-
 .../general/scripts/aws/dataengine_configure.py    | 254 +++---
 .../src/general/scripts/aws/dataengine_prepare.py  | 156 ++--
 .../src/general/scripts/aws/dataengine_start.py    |  44 +-
 .../src/general/scripts/aws/dataengine_stop.py     |  28 +-
 .../general/scripts/aws/dataengine_terminate.py    |  39 +-
 .../general/scripts/aws/deeplearning_configure.py  | 318 +++----
 .../src/general/scripts/aws/edge_configure.py      | 279 +++---
 .../src/general/scripts/aws/edge_start.py          |  31 +-
 .../src/general/scripts/aws/edge_status.py         |  23 +-
 .../src/general/scripts/aws/edge_stop.py           |  26 +-
 .../src/general/scripts/aws/jupyter_configure.py   | 316 +++----
 .../general/scripts/aws/jupyterlab_configure.py    | 306 ++++---
 .../src/general/scripts/aws/project_prepare.py     | 432 ++++-----
 .../src/general/scripts/aws/project_terminate.py   | 118 ++-
 .../src/general/scripts/aws/rstudio_configure.py   | 314 +++----
 .../src/general/scripts/aws/ssn_configure.py       | 432 ++++-----
 .../src/general/scripts/aws/ssn_prepare.py         | 713 ++++++++-------
 .../src/general/scripts/aws/ssn_terminate.py       |  33 +-
 .../scripts/aws/ssn_terminate_aws_resources.py     | 100 ++-
 .../scripts/aws/tensor-rstudio_configure.py        | 338 +++----
 .../src/general/scripts/aws/tensor_configure.py    | 324 +++----
 .../src/general/scripts/aws/zeppelin_configure.py  | 326 +++----
 .../scripts/azure/common_create_instance.py        |   2 +-
 .../scripts/azure/common_create_notebook_image.py  |  78 +-
 .../scripts/azure/common_download_git_certfile.py  |   6 +-
 .../azure/common_notebook_configure_dataengine.py  |  84 +-
 .../scripts/azure/common_prepare_notebook.py       | 103 ++-
 .../general/scripts/azure/common_start_notebook.py |  53 +-
 .../general/scripts/azure/common_stop_notebook.py  |  43 +-
 .../scripts/azure/common_terminate_notebook.py     |  41 +-
 .../azure/common_terminate_notebook_image.py       |  18 +-
 .../general/scripts/azure/dataengine_configure.py  | 224 ++---
 .../general/scripts/azure/dataengine_prepare.py    | 103 +--
 .../src/general/scripts/azure/dataengine_start.py  |  52 +-
 .../src/general/scripts/azure/dataengine_stop.py   |  44 +-
 .../general/scripts/azure/dataengine_terminate.py  |  48 +-
 .../scripts/azure/deeplearning_configure.py        | 173 ++--
 .../src/general/scripts/azure/edge_configure.py    | 357 +++-----
 .../src/general/scripts/azure/edge_prepare.py      |   6 +-
 .../src/general/scripts/azure/edge_start.py        |  36 +-
 .../src/general/scripts/azure/edge_status.py       |  23 +-
 .../src/general/scripts/azure/edge_stop.py         |  26 +-
 .../src/general/scripts/azure/edge_terminate.py    |  86 +-
 .../src/general/scripts/azure/jupyter_configure.py | 204 ++---
 ...tensor_configure.py => jupyterlab_configure.py} | 259 +++---
 .../src/general/scripts/azure/project_prepare.py   | 372 ++++----
 .../src/general/scripts/azure/project_terminate.py | 104 ++-
 .../src/general/scripts/azure/rstudio_configure.py | 183 ++--
 .../src/general/scripts/azure/ssn_configure.py     | 232 ++---
 .../src/general/scripts/azure/ssn_prepare.py       | 170 ++--
 .../src/general/scripts/azure/ssn_terminate.py     |  93 +-
 .../src/general/scripts/azure/tensor_configure.py  | 181 ++--
 .../general/scripts/azure/zeppelin_configure.py    | 187 ++--
 ...common_notebook_configure_dataengine-service.py |  87 +-
 .../gcp/common_notebook_configure_dataengine.py    |  84 +-
 .../general/scripts/gcp/common_prepare_notebook.py | 262 +++---
 .../general/scripts/gcp/common_start_notebook.py   |  30 +-
 .../general/scripts/gcp/common_stop_notebook.py    |  52 +-
 .../scripts/gcp/common_terminate_notebook.py       |  44 +-
 .../scripts/gcp/dataengine-service_configure.py    | 142 +--
 .../scripts/gcp/dataengine-service_create.py       |   2 +-
 .../scripts/gcp/dataengine-service_prepare.py      | 161 ++--
 .../scripts/gcp/dataengine-service_terminate.py    |  43 +-
 .../general/scripts/gcp/dataengine_configure.py    | 199 ++---
 .../src/general/scripts/gcp/dataengine_prepare.py  | 286 +++---
 .../src/general/scripts/gcp/dataengine_start.py    |  57 +-
 .../src/general/scripts/gcp/dataengine_stop.py     |  47 +-
 .../general/scripts/gcp/dataengine_terminate.py    |  53 +-
 .../general/scripts/gcp/deeplearning_configure.py  | 288 +++---
 .../src/general/scripts/gcp/edge_configure.py      | 331 ++++---
 .../src/general/scripts/gcp/edge_start.py          |  35 +-
 .../src/general/scripts/gcp/edge_stop.py           |  28 +-
 .../src/general/scripts/gcp/edge_terminate.py      |  92 +-
 .../src/general/scripts/gcp/jupyter_configure.py   | 262 +++---
 .../general/scripts/gcp/jupyterlab_configure.py    | 299 +++----
 .../src/general/scripts/gcp/project_prepare.py     | 442 ++++-----
 .../src/general/scripts/gcp/project_terminate.py   | 124 +--
 .../src/general/scripts/gcp/rstudio_configure.py   | 275 +++---
 .../src/general/scripts/gcp/ssn_configure.py       | 236 ++---
 .../src/general/scripts/gcp/ssn_prepare.py         | 234 ++---
 .../src/general/scripts/gcp/ssn_terminate.py       |  28 +-
 .../src/general/scripts/gcp/superset_configure.py  | 303 ++++---
 .../scripts/gcp/tensor-rstudio_configure.py        | 287 +++---
 .../src/general/scripts/gcp/tensor_configure.py    | 277 +++---
 .../src/general/scripts/gcp/zeppelin_configure.py  | 261 +++---
 .../general/scripts/os/common_clean_instance.py    |  24 +-
 .../general/scripts/os/dataengine_install_libs.py  |   2 +-
 .../src/general/scripts/os/dataengine_list_libs.py |   2 +-
 .../scripts/os/dataengine_reconfigure_spark.py     |   2 +-
 .../src/general/scripts/os/notebook_git_creds.py   |   4 +-
 .../scripts/os/notebook_inactivity_check.py        |   4 +-
 .../general/scripts/os/notebook_install_libs.py    |   4 +-
 .../src/general/scripts/os/notebook_list_libs.py   |   4 +-
 .../scripts/os/notebook_reconfigure_spark.py       |   2 +-
 .../jenkins_jobs/create_notebook_image/config.xml  |   1 +
 .../jenkins_jobs/create_notebook_server/config.xml |   1 +
 .../jenkins_jobs/manage_git_credentials/config.xml |   1 +
 .../jenkins_jobs/start_notebook_server/config.xml  |   1 +
 .../jenkins_jobs/stop_notebook_server/config.xml   |   1 +
 .../terminate_notebook_image/config.xml            |   1 +
 .../terminate_notebook_server/config.xml           |   1 +
 .../src/general/templates/os/renew_certificates.sh |   2 +-
 .../src/jupyter/scripts/configure_jupyter_node.py  |   4 +-
 .../src/jupyterlab/Dockerfile_jupyterlab           |   8 +-
 .../scripts/configure_jupyterlab_node.py           |  11 +-
 infrastructure-provisioning/src/project/fabfile.py |   7 -
 .../src/project/scripts/configure_keycloak.py      |   5 +-
 .../src/rstudio/scripts/configure_rstudio_node.py  |   4 +-
 .../src/ssn/files/azure/mongo_roles.json           |   2 +-
 .../src/ssn/scripts/configure_ui.py                |   2 +-
 .../superset/scripts/configure_superset_node.py    |   4 +-
 .../scripts/configure_tensor-rstudio_node.py       |   4 +-
 .../src/tensor/scripts/configure_tensor_node.py    |   4 +-
 .../zeppelin/scripts/configure_zeppelin_node.py    |   4 +-
 .../aws/computational_resources/modules/ami/ami.tf |   2 +-
 .../computational_resources/modules/common/iam.tf  |   2 +-
 .../modules/common/network.tf                      |   4 +-
 .../modules/data_engine/instance.tf                |   4 +-
 .../modules/emr/instance.tf                        |   2 +-
 .../modules/notebook/instance.tf                   |   2 +-
 .../terraform/aws/endpoint/main/bucket.tf          |  37 +
 .../terraform/aws/endpoint/main/iam.tf             |   2 +-
 .../terraform/aws/endpoint/main/instance.tf        |   2 +-
 .../terraform/aws/endpoint/main/network.tf         |  18 +-
 .../terraform/aws/project/main/iam.tf              |   4 +-
 .../terraform/aws/project/main/instance.tf         |   2 +-
 .../terraform/aws/project/main/network.tf          |   8 +-
 .../aws/ssn-k8s/main/auto_scaling_groups.tf        |   8 +-
 .../terraform/aws/ssn-k8s/main/lb.tf               |   6 +-
 .../terraform/aws/ssn-k8s/main/role_policy.tf      |   2 +-
 .../terraform/aws/ssn-k8s/main/s3.tf               |   2 +-
 .../terraform/aws/ssn-k8s/main/security_groups.tf  |   2 +-
 .../terraform/aws/ssn-k8s/main/vpc.tf              |  18 +-
 .../modules/data_engine/instance.tf                |   4 +-
 .../modules/notebook/instance.tf                   |   4 +-
 .../terraform/azure/endpoint/main/bucket.tf        |  53 ++
 .../terraform/azure/endpoint/main/instance.tf      |   4 +-
 .../terraform/azure/endpoint/main/main.tf          |   8 +-
 .../terraform/azure/endpoint/main/network.tf       |  17 +-
 .../terraform/azure/endpoint/main/outputs.tf       |   8 +
 .../terraform/azure/project/main/instance.tf       |   2 +-
 .../terraform/bin/deploy/endpoint_fab.py           |   3 +-
 infrastructure-provisioning/terraform/bin/dlab.py  |   4 +-
 .../terraform/gcp/endpoint/main/bucket.tf          |  36 +
 .../terraform/gcp/endpoint/main/network.tf         |   4 +-
 .../terraform/gcp/ssn-gke/main/modules/gke/gke.tf  |   2 +-
 .../terraform/gcp/ssn-gke/main/modules/gke/vpc.tf  |   4 +-
 .../dlab/automation/cloud/aws/AmazonHelper.java    |   2 +-
 .../java/com/epam/dlab/dto/StatusEnvBaseDTO.java   |  14 +
 .../handlers/ComputationalCallbackHandler.java     |   5 +-
 .../ComputationalConfigureCallbackHandler.java     |   1 +
 .../handlers/ExploratoryCallbackHandler.java       |   8 +-
 .../handlers/LibInstallCallbackHandler.java        |   5 +-
 .../resources/base/ExploratoryService.java         |   2 +-
 .../aws/dataengine-service_configure.json          |   2 +-
 .../resources/mock_response/aws/edge_create.json   |   2 +-
 .../mock_response/aws/notebook_start.json          |   2 +-
 .../resources/mock_response/aws/notebook_stop.json |   2 +-
 .../mock_response/aws/notebook_terminate.json      |   2 +-
 .../azure/dataengine-service_configure.json        |   2 +-
 .../resources/mock_response/azure/edge_create.json |   2 +-
 .../mock_response/azure/notebook_start.json        |   2 +-
 .../mock_response/azure/notebook_stop.json         |   2 +-
 .../mock_response/azure/notebook_terminate.json    |   2 +-
 .../gcp/dataengine-service_configure.json          |   2 +-
 .../core/commands/CommandExecutorMockTest.java     |   2 +-
 .../epam/dlab/backendapi/dao/ComputationalDAO.java | 182 ++--
 .../java/com/epam/dlab/backendapi/dao/EnvDAO.java  |  74 +-
 .../epam/dlab/backendapi/dao/ExploratoryDAO.java   | 158 +---
 .../dlab/backendapi/dao/ExploratoryLibDAO.java     |  60 +-
 .../com/epam/dlab/backendapi/dao/IndexCreator.java |   7 +-
 .../epam/dlab/backendapi/dao/SchedulerJobDAO.java  |  38 +-
 .../epam/dlab/backendapi/dao/UserRoleDaoImpl.java  |   4 +
 .../dlab/backendapi/domain/CreateProjectDTO.java   |   2 +-
 .../epam/dlab/backendapi/domain/EndpointDTO.java   |   6 +-
 .../epam/dlab/backendapi/domain/ProjectDTO.java    |   2 +-
 .../backendapi/resources/EnvironmentResource.java  |  34 +-
 .../backendapi/resources/ExploratoryResource.java  |  29 +-
 .../resources/ImageExploratoryResource.java        |  18 +-
 .../resources/LibExploratoryResource.java          |  31 +-
 .../dlab/backendapi/resources/ProjectResource.java |  23 +-
 .../backendapi/resources/SchedulerJobResource.java |  31 +-
 .../resources/aws/ComputationalResourceAws.java    |  36 +-
 .../azure/ComputationalResourceAzure.java          |  58 +-
 .../callback/CheckInactivityCallback.java          |   5 +-
 .../resources/callback/ComputationalCallback.java  |  15 +-
 .../callback/EnvironmentStatusCallback.java        |   4 +-
 .../resources/callback/ExploratoryCallback.java    |  26 +-
 ...tePopUp.java => ComputationalTemplatesDTO.java} |  14 +-
 .../dto/ExploratoryImageCreateFormDTO.java         |  16 +-
 .../resources/dto/LibInstallFormDTO.java           |   3 +
 .../resources/dto/SearchLibsFormDTO.java           |   4 +
 .../dlab/backendapi/resources/dto/UserRoleDto.java |  12 +-
 .../resources/gcp/ComputationalResourceGcp.java    |  44 +-
 .../backendapi/service/ComputationalService.java   |  21 +-
 .../backendapi/service/EnvironmentService.java     |  10 +-
 .../backendapi/service/ExploratoryService.java     |  26 +-
 .../service/ImageExploratoryService.java           |  10 +-
 .../dlab/backendapi/service/InactivityService.java |   8 +-
 .../dlab/backendapi/service/LibraryService.java    |  10 +-
 .../dlab/backendapi/service/ProjectService.java    |   2 +-
 .../backendapi/service/SchedulerJobService.java    | 106 +--
 .../service/impl/ComputationalServiceImpl.java     | 158 ++--
 .../service/impl/EnvironmentServiceImpl.java       |  24 +-
 .../service/impl/ExploratoryServiceImpl.java       | 115 +--
 .../service/impl/ImageExploratoryServiceImpl.java  |  10 +-
 .../service/impl/InactivityServiceImpl.java        |   4 +-
 .../service/impl/LibraryServiceImpl.java           |  50 +-
 .../service/impl/ProjectServiceImpl.java           |  30 +-
 .../service/impl/ReuploadKeyServiceImpl.java       |  66 +-
 .../service/impl/SchedulerJobServiceImpl.java      |  81 +-
 .../epam/dlab/backendapi/util/RequestBuilder.java  |  35 +-
 .../src/main/resources/mongo/aws/mongo_roles.json  |  56 ++
 .../main/resources/mongo/azure/mongo_roles.json    |  48 +-
 .../src/main/resources/mongo/gcp/mongo_roles.json  |  52 ++
 .../management/endpoints/endpoints.component.ts    |  31 +-
 .../manage-environment-dilog.component.html        |   2 +-
 .../management-grid/management-grid.component.html |   7 +-
 .../management-grid/management-grid.component.scss |  26 +-
 .../management/management.component.html           |   2 +-
 .../management/management.component.ts             |  71 +-
 .../administration/project/project-data.service.ts |  11 +-
 .../project-list/project-list.component.html       |   6 +-
 .../project-list/project-list.component.scss       |   8 +-
 .../administration/project/project.component.html  |   3 +-
 .../administration/project/project.component.ts    |  37 +-
 .../app/administration/roles/roles.component.html  |  84 +-
 .../app/administration/roles/roles.component.scss  |  29 +-
 .../app/administration/roles/roles.component.ts    |  97 +-
 .../services/applicationServiceFacade.service.ts   |  15 +-
 .../app/core/services/bucket-browser.service.ts    | 121 +++
 .../services/dataengineConfiguration.service.ts    |  16 +-
 .../core/services/librariesInstallation.service.ts |  12 +-
 .../services/managementEnvironments.service.ts     |   4 +-
 .../src/app/core/services/project.service.ts       |   9 -
 .../src/app/core/services/scheduler.service.ts     |   8 +-
 .../src/app/core/services/userResource.service.ts  |  12 +-
 .../reporting-grid/reporting-grid.component.html   |  14 +-
 .../reporting-grid/reporting-grid.component.scss   |  29 +-
 .../src/app/reporting/reporting.component.ts       |  11 +-
 .../bucket-browser/bucket-browser.component.html   |  88 ++
 .../bucket-browser/bucket-browser.component.scss   | 230 +++++
 .../bucket-browser/bucket-browser.component.ts     | 142 +++
 .../folder-tree/folder-tree.component.html         |  32 +
 .../folder-tree/folder-tree.component.scss         |  38 +
 .../folder-tree/folder-tree.component.ts           | 181 ++++
 .../cluster-details/cluster-details.component.ts   |   4 +-
 ...utational-resource-create-dialog.component.html |   9 +-
 ...mputational-resource-create-dialog.component.ts |  30 +-
 .../computational-resources-list.component.scss    |  25 +-
 .../computational-resources-list.component.ts      |   2 +-
 .../ami-create-dialog.component.html               |   4 +-
 .../ami-create-dialog.component.ts                 |   8 +-
 .../bucket-dialog/bucket-dialog.component.html     |  55 --
 .../bucket-dialog/bucket-dialog.component.scss     |  32 -
 .../bucket-dialog/bucket-dialog.component.ts       |  94 --
 .../resources/exploratory/bucket-dialog/index.ts   |  39 -
 .../detail-dialog/detail-dialog.component.html     |  18 +-
 .../detail-dialog/detail-dialog.component.scss     |   4 +-
 .../detail-dialog/detail-dialog.component.ts       |  17 +-
 .../install-libraries.component.html               |  18 +-
 .../install-libraries.component.scss               |  21 +
 .../install-libraries.component.ts                 |  29 +-
 .../install-libraries/install-libraries.model.ts   |   8 +-
 .../src/app/resources/resources-grid/index.ts      |   4 +-
 .../resources-grid/resources-grid.component.html   |  10 +-
 .../resources-grid/resources-grid.component.scss   |  13 +
 .../resources-grid/resources-grid.component.ts     |  18 +-
 .../src/app/resources/resources.component.html     |   5 +-
 .../src/app/resources/resources.component.ts       |   6 +
 .../webapp/src/app/resources/resources.module.ts   |  12 +-
 .../app/resources/scheduler/scheduler.component.ts |  23 +-
 .../src/app/resources/scheduler/scheduler.model.ts |  12 +-
 .../webapp/src/app/shared/form-controls/index.ts   |   5 +-
 .../multi-level-select-dropdown.component.html     |  94 ++
 .../multi-level-select-dropdown.component.scss}    |  82 +-
 .../multi-level-select-dropdown.component.ts       | 139 +++
 .../confirmation-dialog-type.enum.ts               |   3 +-
 .../confirmation-dialog.component.html             |  15 +-
 .../confirmation-dialog.component.scss             |   3 +
 .../confirmation-dialog.model.ts                   |   6 +-
 .../notification-dialog.component.ts               |  50 +-
 .../webapp/src/assets/styles/_dialogs.scss         |  10 +-
 .../resources/webapp/src/assets/styles/_theme.scss |   8 +-
 .../webapp/src/dictionary/azure.dictionary.ts      |   6 +-
 .../resources/EnvironmentResourceTest.java         |  89 +-
 .../resources/ExploratoryResourceTest.java         |  57 +-
 .../resources/ImageExploratoryResourceTest.java    |  25 +-
 .../resources/LibExploratoryResourceTest.java      | 602 +++++++------
 .../backendapi/resources/ProjectResourceTest.java  |  32 +-
 .../resources/SchedulerJobResourceTest.java        | 383 ++++----
 .../service/impl/ComputationalServiceImplTest.java | 993 +++++++++++----------
 .../service/impl/EnvironmentServiceImplTest.java   |  74 +-
 .../service/impl/ExploratoryServiceImplTest.java   | 586 ++++++------
 .../impl/ImageExploratoryServiceImplTest.java      |  61 +-
 .../service/impl/LibraryServiceImplTest.java       | 464 +++++-----
 .../service/impl/ReuploadKeyServiceImplTest.java   |  49 +-
 .../service/impl/SchedulerJobServiceImplTest.java  | 250 +++---
 329 files changed, 12667 insertions(+), 10901 deletions(-)
 copy infrastructure-provisioning/src/general/files/azure/{jupyter_Dockerfile => jupyterlab_Dockerfile} (96%)
 copy infrastructure-provisioning/src/general/files/azure/{rstudio_description.json => jupyterlab_description.json} (84%)
 copy infrastructure-provisioning/src/general/scripts/azure/{tensor_configure.py => jupyterlab_configure.py} (62%)
 create mode 100644 infrastructure-provisioning/terraform/aws/endpoint/main/bucket.tf
 create mode 100644 infrastructure-provisioning/terraform/azure/endpoint/main/bucket.tf
 create mode 100644 infrastructure-provisioning/terraform/gcp/endpoint/main/bucket.tf
 copy services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/{ExploratoryCreatePopUp.java => ComputationalTemplatesDTO.java} (73%)
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
 delete mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/exploratory/bucket-dialog/bucket-dialog.component.html
 delete mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/exploratory/bucket-dialog/bucket-dialog.component.scss
 delete mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/exploratory/bucket-dialog/bucket-dialog.component.ts
 delete mode 100644 services/self-service/src/main/resources/webapp/src/app/resources/exploratory/bucket-dialog/index.ts
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html
 copy services/self-service/src/main/resources/webapp/src/app/shared/form-controls/{dropdowns.component.scss => multi-level-select-dropdown/multi-level-select-dropdown.component.scss} (78%)
 create mode 100644 services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org


[incubator-dlab] 02/05: [DLAB-1551]: Added folder tree

Posted by dg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch DLAB-1551
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit 2a6e5bc4bfca0390a730f41ccaa70f2014b87eae
Author: Dmytro Gnatyshyn <di...@ukr.net>
AuthorDate: Mon Apr 6 18:10:04 2020 +0300

    [DLAB-1551]: Added folder tree
---
 .../app/core/services/bucket-browser.service.ts    |  92 +++++++++++
 .../bucket-browser/bucket-browser.component.html   |  62 ++++++++
 .../bucket-browser/bucket-browser.component.scss   | 123 +++++++++++++++
 .../bucket-browser/bucket-browser.component.ts     | 110 +++++++++++++
 .../folder-tree/folder-tree.component.html         |  32 ++++
 .../folder-tree/folder-tree.component.scss         |   7 +
 .../folder-tree/folder-tree.component.ts           | 171 +++++++++++++++++++++
 .../webapp/src/app/resources/resources.module.ts   |  10 +-
 8 files changed, 604 insertions(+), 3 deletions(-)

diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
new file mode 100644
index 0000000..0c334a1
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
@@ -0,0 +1,92 @@
+import { Injectable } from '@angular/core';
+import {BehaviorSubject} from 'rxjs';
+
+export class TodoItemNode {
+  children: TodoItemNode[];
+  item: string;
+}
+
+/** Flat to-do item node with expandable and level information */
+export class TodoItemFlatNode {
+  item: string;
+  level: number;
+  expandable: boolean;
+}
+
+/**
+ * The Json object for to-do list data.
+ */
+const TREE_DATA = {
+  FirsrFolder: {
+    folder: {
+      folder: ['file1', 'file2'],
+      file1: null,
+      file2: null
+    },
+    'file': null,
+    'file2': null,
+    'file3': null,
+  },
+  SecondFolder: [
+    'file1',
+    'file2',
+    'file3'
+  ]
+};
+
+@Injectable({
+  providedIn: 'root'
+})
+export class BucketBrowserService {
+  dataChange = new BehaviorSubject<TodoItemNode[]>([]);
+
+  get data(): TodoItemNode[] { return this.dataChange.value; }
+
+  constructor() {
+    this.initialize();
+  }
+
+  initialize() {
+    // Build the tree nodes from Json object. The result is a list of `TodoItemNode` with nested
+    //     file node as children.
+    const data = this.buildFileTree(TREE_DATA, 0);
+
+    // Notify the change.
+    this.dataChange.next(data);
+  }
+
+  /**
+   * Build the file structure tree. The `value` is the Json object, or a sub-tree of a Json object.
+   * The return value is the list of `TodoItemNode`.
+   */
+  buildFileTree(obj: {[key: string]: any}, level: number): TodoItemNode[] {
+    return Object.keys(obj).reduce<TodoItemNode[]>((accumulator, key) => {
+      const value = obj[key];
+      const node = new TodoItemNode();
+      node.item = key;
+
+      if (value != null) {
+        if (typeof value === 'object') {
+          node.children = this.buildFileTree(value, level + 1);
+        } else {
+          node.item = value;
+        }
+      }
+
+      return accumulator.concat(node);
+    }, []);
+  }
+
+  /** Add an item to to-do list */
+  insertItem(parent: TodoItemNode, name: string) {
+    if (parent.children) {
+      parent.children.push({item: name} as TodoItemNode);
+      this.dataChange.next(this.data);
+    }
+  }
+
+  updateItem(node: TodoItemNode, name: string) {
+    node.item = name;
+    this.dataChange.next(this.data);
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
new file mode 100644
index 0000000..307f21b
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
@@ -0,0 +1,62 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<div class="bucket-browser" id="dialog-box">
+  <header class="dialog-header">
+    <h4 class="modal-title">Bucket browser</h4>
+    <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+  </header>
+  <div class="dialog-content tabs">
+    <div class="submit m-bott-10 m-top-10">
+      <button mat-raised-button type="button" class="butt action"><input type="file" (change)="handleFileInput($event.target.files)">Add file</button>
+<!--      <button mat-raised-button type="button" class="butt action"><input type="file" (change)="filesPicked($event.target.files)" webkitdirectory directory multiple/>Upload folder</button>-->
+<!--      <button mat-raised-button type="button" class="butt action">Download files</button>-->
+      <button mat-raised-button type="button" class="butt action">Create folder</button>
+    </div>
+    <div class="backet-wrapper" id="scrolling">
+      <div class="navigation">
+        <dlab-folder-tree></dlab-folder-tree>
+<!--        <ul class="folder-tree">-->
+<!--          <li class="folder-item">-->
+<!--            <i class="material-icons">folder</i>-->
+<!--            <span class="folder">bucket</span>-->
+<!--          </li>-->
+<!--        </ul>-->
+      </div>
+      <div class="directory">
+<!--        <dlab-folder-tree></dlab-folder-tree>-->
+        <ul class="folder-tree">
+          <li *ngFor="let file of uploadPaths" class="folder-item">
+            <div class="name">{{file}}</div>
+            <div class="size">2.4kb</div>
+            <div class="progres"></div>
+          </li>
+          <li class="folder-item">
+
+          </li>
+        </ul>
+      </div>
+    </div>
+    <div class="text-center m-top-30 m-bott-30">
+      <button type="button" class="butt" mat-raised-button (click)="this.dialogRef.close()">Close</button>
+      <button type="button" class="butt butt-success" mat-raised-button>Download</button>
+      <button type="button" class="butt butt-success" mat-raised-button>Upload</button>
+    </div>
+  </div>
+</div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
new file mode 100644
index 0000000..9d839bb
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
@@ -0,0 +1,123 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.bucket-browser {
+
+  bottom: 0;
+  .dialog-content{
+    padding: 0 35px;
+  }
+  .content-box {
+    height: 500px;
+
+  }
+
+  .submit{
+    display: flex;
+    .butt{
+      position: relative;
+      overflow: hidden;
+      margin: 10px;
+      input[type="file"] {
+        position: absolute;
+        left: 0;
+        right: 0;
+        top: 0;
+        bottom: 0;
+        opacity: 0;
+      }
+    }
+  }
+
+  .text-center{
+    position: absolute;
+    bottom: 50px;
+    left: 0;
+    right: 0;
+  }
+
+}
+
+.backet-wrapper{
+  min-height: 450px;
+  border: 2px solid rgba(0,0,0,.12);
+  border-radius: 5px;
+  display: flex;
+
+  .navigation{
+    flex: 1;
+    border-right: 2px solid rgba(0,0,0,.12);
+    max-height: 500px;
+    overflow: auto;
+    .folder-tree{
+
+      .folder{
+        line-height: 30px;
+      }
+    }
+
+  }
+
+  .directory{
+    flex: 2;
+    .folder-tree{
+      .name{
+        flex:2;
+      }
+      .size{
+        flex:1;
+      }
+      .progres{
+        flex:1;
+        border: 1px solid rgba(0,0,0,.12);
+        height: 15px;
+      }
+      .action {
+        display: flex;
+        justify-content: space-around;
+        width: 100%;
+        .add-file {
+          overflow: hidden;
+          min-width: 100px ;
+          height: 30px;
+          position: relative;
+          input{
+            position: absolute;
+            left: 0;
+            right: 0;
+            top: 0;
+            bottom: 0;
+            opacity: 0;
+          }
+        }
+      }
+
+    }
+  }
+
+  .folder-tree {
+    padding: 20px 30px;
+  }
+
+  .folder-item{
+     display: flex;
+     align-items: center;
+
+   }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
new file mode 100644
index 0000000..447501e
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit, ViewChild, Inject } from '@angular/core';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { ToastrService } from 'ngx-toastr';
+
+import { AccountCredentials, MangeUngitModel } from './bucket-browser.model';
+import { ManageUngitService } from '../../core/services';
+import {logger} from 'codelyzer/util/logger';
+
+@Component({
+  selector: 'dlab-bucket-browser',
+  templateUrl: './bucket-browser.component.html',
+  styleUrls: ['./bucket-browser.component.scss']
+})
+export class BucketBrowserComponent implements OnInit {
+  filenames: Array<any> = [];
+  uploadPaths = [];
+  @ViewChild('tabGroupGit', { static: false }) tabGroupGit;
+
+  constructor(
+    public toastr: ToastrService,
+    public dialog: MatDialog,
+    public dialogRef: MatDialogRef<BucketBrowserComponent>,
+    private manageUngitService: ManageUngitService,
+    private _fb: FormBuilder,
+  ) {
+
+  }
+
+  ngOnInit() {
+
+  }
+
+  handleFileInput(files) {
+    //   for (let i = 0; i < files.length; i++) {
+    //     const file = files[i];
+    //     const path = file.webkitRelativePath.split('/');
+    //   }
+    // }
+    console.log(files)
+    this.filenames = Object['values'](files).map(v => v.name)
+    this.uploadPaths = [...this.uploadPaths, ...this.filenames];
+  }
+
+  filesPicked(files) {
+    console.log(files);
+    // this.uploadPaths = [];
+    Array.prototype.forEach.call(files, file => {
+      this.uploadPaths.push(file.webkitRelativePath);
+    });
+    console.log(this.uploadPaths);
+  }
+
+  private upload(tree, path) {
+    tree.files.forEach(file => {
+      this.uploadPaths.push(path + file.name);
+    });
+    tree.directories.forEach(directory => {
+      const newPath = path + directory.name + '/';
+      this.uploadPaths.push(newPath);
+      this.upload(directory, newPath);
+    });
+  }
+}
+
+// @Component({
+//   selector: 'dialog-result-example-dialog',
+//   template: `
+//   <div class="dialog-header">
+//     <h4 class="modal-title"><i class="material-icons">priority_high</i>Warning</h4>
+//     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+//   </div>
+//   <div mat-dialog-content class="content">
+//     <p>Account <span class="strong">{{ data.hostname }}</span> will be decommissioned.</p>
+//     <p class="m-top-20"><span class="strong">Do you want to proceed?</span></p>
+//   </div>
+//   <div class="text-center">
+//     <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">No</button>
+//     <button type="button" class="butt butt-success" mat-raised-button (click)="dialogRef.close(true)">Yes</button>
+//   </div>
+//   `,
+//   styles: [`
+//     .content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400 }
+//   `]
+// })
+// export class ConfirmDeleteAccountDialog {
+//   constructor(
+//     public dialogRef: MatDialogRef<ConfirmDeleteAccountDialog>,
+//     @Inject(MAT_DIALOG_DATA) public data: any
+//   ) { }
+// }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
new file mode 100644
index 0000000..2ba6ed8
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
@@ -0,0 +1,32 @@
+<mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
+  <mat-tree-node *matTreeNodeDef="let node" matTreeNodeToggle matTreeNodePadding>
+    <button mat-icon-button disabled></button>
+<!--    <mat-checkbox class="checklist-leaf-node"-->
+<!--                  [checked]="checklistSelection.isSelected(node)"-->
+<!--                  (change)="todoLeafItemSelectionToggle(node)"></mat-checkbox>-->
+    {{node.item}}
+  </mat-tree-node>
+
+  <mat-tree-node *matTreeNodeDef="let node; when: hasNoContent" matTreeNodePadding>
+    <button mat-icon-button disabled></button>
+    <mat-form-field>
+      <mat-label>New item...</mat-label>
+      <input matInput #itemValue placeholder="Ex. Lettuce">
+    </mat-form-field>
+    <button mat-button (click)="saveNode(node, itemValue.value)">Save</button>
+  </mat-tree-node>
+
+  <mat-tree-node *matTreeNodeDef="let node; when: hasChild" matTreeNodePadding>
+    <button mat-icon-button matTreeNodeToggle
+            [attr.aria-label]="'toggle ' + node.filename">
+      <mat-icon class="mat-icon-rtl-mirror">
+        {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
+      </mat-icon>
+    </button>
+<!--    <mat-checkbox [checked]="descendantsAllSelected(node)"-->
+<!--                  [indeterminate]="descendantsPartiallySelected(node)"-->
+<!--                  (change)="todoItemSelectionToggle(node)">{{node.item}}</mat-checkbox>-->
+    <i class="material-icons folder-icon">folder</i> <span class="folder">{{node.item}}</span>
+<!--    <button mat-icon-button (click)="addNewItem(node)"><mat-icon>add</mat-icon></button>-->
+  </mat-tree-node>
+</mat-tree>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
new file mode 100644
index 0000000..a842b13
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
@@ -0,0 +1,7 @@
+.folder{
+  padding-left: 5px;
+}
+
+.folder-icon{
+  color: rgb(232, 232, 232);
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
new file mode 100644
index 0000000..bba1a45
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
@@ -0,0 +1,171 @@
+import { Component, OnInit, Injectable } from '@angular/core';
+import {SelectionModel} from '@angular/cdk/collections';
+import {FlatTreeControl} from '@angular/cdk/tree';
+import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree';
+import {BucketBrowserService, TodoItemFlatNode, TodoItemNode} from '../../../core/services/bucket-browser.service';
+
+
+class ChecklistDatabase {
+}
+
+/**
+ * @title Tree with checkboxes
+ */
+
+@Component({
+  selector: 'dlab-folder-tree',
+  templateUrl: './folder-tree.component.html',
+  styleUrls: ['./folder-tree.component.scss']
+})
+export class FolderTreeComponent {
+  /** Map from flat node to nested node. This helps us finding the nested node to be modified */
+  flatNodeMap = new Map<TodoItemFlatNode, TodoItemNode>();
+
+  /** Map from nested node to flattened node. This helps us to keep the same object for selection */
+  nestedNodeMap = new Map<TodoItemNode, TodoItemFlatNode>();
+
+  /** A selected parent node to be inserted */
+  selectedParent: TodoItemFlatNode | null = null;
+
+  /** The new item's name */
+  newItemName = '';
+
+  treeControl: FlatTreeControl<TodoItemFlatNode>;
+
+  treeFlattener: MatTreeFlattener<TodoItemNode, TodoItemFlatNode>;
+
+  dataSource: MatTreeFlatDataSource<TodoItemNode, TodoItemFlatNode>;
+
+  /** The selection for checklist */
+  checklistSelection = new SelectionModel<TodoItemFlatNode>(true /* multiple */);
+
+  constructor(private bucketBrowserService: BucketBrowserService) {
+    this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel,
+      this.isExpandable, this.getChildren);
+    this.treeControl = new FlatTreeControl<TodoItemFlatNode>(this.getLevel, this.isExpandable);
+    this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
+
+    bucketBrowserService.dataChange.subscribe(data => {
+      this.dataSource.data = data;
+    });
+  }
+
+  getLevel = (node: TodoItemFlatNode) => node.level;
+
+  isExpandable = (node: TodoItemFlatNode) => node.expandable;
+
+  getChildren = (node: TodoItemNode): TodoItemNode[] => node.children;
+
+  hasChild = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.expandable;
+
+  hasNoContent = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.item === '';
+
+  /**
+   * Transformer to convert nested node to flat node. Record the nodes in maps for later use.
+   */
+  transformer = (node: TodoItemNode, level: number) => {
+    const existingNode = this.nestedNodeMap.get(node);
+    const flatNode = existingNode && existingNode.item === node.item
+      ? existingNode
+      : new TodoItemFlatNode();
+    flatNode.item = node.item;
+    flatNode.level = level;
+    flatNode.expandable = !!node.children;
+    this.flatNodeMap.set(flatNode, node);
+    this.nestedNodeMap.set(node, flatNode);
+    return flatNode;
+  }
+
+  /** Whether all the descendants of the node are selected. */
+  descendantsAllSelected(node: TodoItemFlatNode): boolean {
+    const descendants = this.treeControl.getDescendants(node);
+    const descAllSelected = descendants.every(child =>
+      this.checklistSelection.isSelected(child)
+    );
+    return descAllSelected;
+  }
+
+  /** Whether part of the descendants are selected */
+  descendantsPartiallySelected(node: TodoItemFlatNode): boolean {
+    const descendants = this.treeControl.getDescendants(node);
+    const result = descendants.some(child => this.checklistSelection.isSelected(child));
+    return result && !this.descendantsAllSelected(node);
+  }
+
+  /** Toggle the to-do item selection. Select/deselect all the descendants node */
+  todoItemSelectionToggle(node: TodoItemFlatNode): void {
+    this.checklistSelection.toggle(node);
+    const descendants = this.treeControl.getDescendants(node);
+    this.checklistSelection.isSelected(node)
+      ? this.checklistSelection.select(...descendants)
+      : this.checklistSelection.deselect(...descendants);
+
+    // Force update for the parent
+    descendants.every(child =>
+      this.checklistSelection.isSelected(child)
+    );
+    this.checkAllParentsSelection(node);
+  }
+
+  /** Toggle a leaf to-do item selection. Check all the parents to see if they changed */
+  todoLeafItemSelectionToggle(node: TodoItemFlatNode): void {
+    this.checklistSelection.toggle(node);
+    this.checkAllParentsSelection(node);
+  }
+
+  /* Checks all the parents when a leaf node is selected/unselected */
+  checkAllParentsSelection(node: TodoItemFlatNode): void {
+    let parent: TodoItemFlatNode | null = this.getParentNode(node);
+    while (parent) {
+      this.checkRootNodeSelection(parent);
+      parent = this.getParentNode(parent);
+    }
+  }
+
+  /** Check root node checked state and change it accordingly */
+  checkRootNodeSelection(node: TodoItemFlatNode): void {
+    const nodeSelected = this.checklistSelection.isSelected(node);
+    const descendants = this.treeControl.getDescendants(node);
+    const descAllSelected = descendants.every(child =>
+      this.checklistSelection.isSelected(child)
+    );
+    if (nodeSelected && !descAllSelected) {
+      this.checklistSelection.deselect(node);
+    } else if (!nodeSelected && descAllSelected) {
+      this.checklistSelection.select(node);
+    }
+  }
+
+  /* Get the parent node of a node */
+  getParentNode(node: TodoItemFlatNode): TodoItemFlatNode | null {
+    const currentLevel = this.getLevel(node);
+
+    if (currentLevel < 1) {
+      return null;
+    }
+
+    const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
+
+    for (let i = startIndex; i >= 0; i--) {
+      const currentNode = this.treeControl.dataNodes[i];
+
+      if (this.getLevel(currentNode) < currentLevel) {
+        return currentNode;
+      }
+    }
+    return null;
+  }
+
+  /** Select the category so we can insert the new item. */
+  addNewItem(node: TodoItemFlatNode) {
+    const parentNode = this.flatNodeMap.get(node);
+    this.bucketBrowserService.insertItem(parentNode!, '');
+    this.treeControl.expand(node);
+  }
+
+  /** Save the node to database */
+  saveNode(node: TodoItemFlatNode, itemValue: string) {
+    const nestedNode = this.flatNodeMap.get(node);
+    this.bucketBrowserService.updateItem(nestedNode!, itemValue);
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
index bbf6e09..d2d5f02 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
@@ -28,6 +28,8 @@ import { ExploratoryEnvironmentCreateModule } from './exploratory/create-environ
 import { ManageUngitComponent } from './manage-ungit/manage-ungit.component';
 import { ConfirmDeleteAccountDialog } from './manage-ungit/manage-ungit.component';
 import {BucketBrowserComponent} from './bucket-browser/bucket-browser.component';
+import {FolderTreeComponent} from './bucket-browser/folder-tree/folder-tree.component';
+import {MatTreeModule} from '@angular/material/tree';
 
 @NgModule({
   imports: [
@@ -36,15 +38,17 @@ import {BucketBrowserComponent} from './bucket-browser/bucket-browser.component'
     ReactiveFormsModule,
     ResourcesGridModule,
     ExploratoryEnvironmentCreateModule,
-    MaterialModule
+    MaterialModule,
+    MatTreeModule
   ],
   declarations: [
     ResourcesComponent,
     ManageUngitComponent,
     ConfirmDeleteAccountDialog,
-    BucketBrowserComponent
+    BucketBrowserComponent,
+    FolderTreeComponent
   ],
-  entryComponents: [ManageUngitComponent, ConfirmDeleteAccountDialog, BucketBrowserComponent],
+  entryComponents: [ManageUngitComponent, ConfirmDeleteAccountDialog, BucketBrowserComponent, FolderTreeComponent],
   exports: [ResourcesComponent]
 })
 export class ResourcesModule { }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org


[incubator-dlab] 01/05: [DLAB-1551]: Created bucket browser window

Posted by dg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch DLAB-1551
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit 34a46625f670ee3c218fa4b1e5399666cf63c002
Author: Dmytro Gnatyshyn <di...@ukr.net>
AuthorDate: Fri Apr 3 11:20:56 2020 +0300

    [DLAB-1551]: Created bucket browser window
---
 .../resources/webapp/src/app/resources/resources.component.html     | 3 +++
 .../main/resources/webapp/src/app/resources/resources.component.ts  | 6 ++++++
 .../src/main/resources/webapp/src/app/resources/resources.module.ts | 6 ++++--
 .../src/main/resources/webapp/src/assets/styles/_dialogs.scss       | 1 +
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
index 091ccb7..ab088b6 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
@@ -46,6 +46,9 @@
     </div>
 
     <div>
+      <button mat-raised-button class="butt butt-tool" (click)="bucketBrowser()">
+        <i class="material-icons"></i>Bucket browser
+      </button>
       <button mat-raised-button class="butt butt-tool" (click)="manageUngit()">
         <i class="material-icons"></i>Git credentials
       </button>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
index bab05a7..6394d89 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
@@ -27,6 +27,7 @@ import { Exploratory } from './resources-grid/resources-grid.model';
 import { HealthStatusService, ProjectService } from '../core/services';
 import { ManageUngitComponent } from './manage-ungit/manage-ungit.component';
 import { Project } from './../administration/project/project.component';
+import {BucketBrowserComponent} from './bucket-browser/bucket-browser.component';
 
 @Component({
   selector: 'dlab-resources',
@@ -79,6 +80,11 @@ export class ResourcesComponent implements OnInit {
       .afterClosed().subscribe(() => this.refreshGrid());
   }
 
+  public bucketBrowser(): void {
+    this.dialog.open(BucketBrowserComponent, { panelClass: 'modal-fullscreen' })
+      .afterClosed().subscribe(() => this.refreshGrid());
+  }
+
   public setActiveProject(project): void {
     this.resourcesGrid.selectActiveProject(project);
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
index 7ce335b..bbf6e09 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
@@ -27,6 +27,7 @@ import { ResourcesGridModule } from './resources-grid';
 import { ExploratoryEnvironmentCreateModule } from './exploratory/create-environment';
 import { ManageUngitComponent } from './manage-ungit/manage-ungit.component';
 import { ConfirmDeleteAccountDialog } from './manage-ungit/manage-ungit.component';
+import {BucketBrowserComponent} from './bucket-browser/bucket-browser.component';
 
 @NgModule({
   imports: [
@@ -40,9 +41,10 @@ import { ConfirmDeleteAccountDialog } from './manage-ungit/manage-ungit.componen
   declarations: [
     ResourcesComponent,
     ManageUngitComponent,
-    ConfirmDeleteAccountDialog
+    ConfirmDeleteAccountDialog,
+    BucketBrowserComponent
   ],
-  entryComponents: [ManageUngitComponent, ConfirmDeleteAccountDialog],
+  entryComponents: [ManageUngitComponent, ConfirmDeleteAccountDialog, BucketBrowserComponent],
   exports: [ResourcesComponent]
 })
 export class ResourcesModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss b/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
index c6f8fe8..c5ac335 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
+++ b/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
@@ -59,6 +59,7 @@ mat-dialog-container {
     padding: 0;
     border-radius: 0;
     overflow-x: hidden;
+    position: relative;
 
     #dialog-box {
       color: $modal-text-color;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org


[incubator-dlab] 03/05: [DLAB-1551]: Added folders menu

Posted by dg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch DLAB-1551
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit 084a9ecced5d8e3e20428759460cc1dc64467e77
Author: Dmytro Gnatyshyn <di...@ukr.net>
AuthorDate: Fri Apr 10 11:52:29 2020 +0300

    [DLAB-1551]: Added folders menu
---
 .../app/core/services/bucket-browser.service.ts    | 46 ++++++-----
 .../bucket-browser/bucket-browser.component.html   | 38 ++++++----
 .../bucket-browser/bucket-browser.component.scss   | 51 ++++++++++++-
 .../bucket-browser/bucket-browser.component.ts     | 43 ++++++++++-
 .../folder-tree/folder-tree.component.html         | 20 ++---
 .../folder-tree/folder-tree.component.scss         | 22 ++++++
 .../folder-tree/folder-tree.component.ts           | 88 ++++++++++++++++++----
 7 files changed, 242 insertions(+), 66 deletions(-)

diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
index 0c334a1..c98df9b 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
@@ -4,6 +4,7 @@ import {BehaviorSubject} from 'rxjs';
 export class TodoItemNode {
   children: TodoItemNode[];
   item: string;
+  id: string;
 }
 
 /** Flat to-do item node with expandable and level information */
@@ -17,23 +18,26 @@ export class TodoItemFlatNode {
  * The Json object for to-do list data.
  */
 const TREE_DATA = {
-  FirsrFolder: {
-    folder: {
-      folder: ['file1', 'file2'],
-      file1: null,
-      file2: null
+  'dlab-local-shared-bucket': {
+    FirsrFolder: {
+      folder: {
+        folder: ['2008.cvs.bz2', 'airports.csv', 'carriers.csv'],
+        folder1: [],
+        folder2: []
+      },
+      'folder1': [],
+      'file2': null,
+      'file3': null,
     },
-    'file': null,
-    'file2': null,
-    'file3': null,
-  },
-  SecondFolder: [
-    'file1',
-    'file2',
-    'file3'
-  ]
+    SecondFolder: [
+      'file1',
+      'file2',
+      'file3'
+    ]
+  }
 };
 
+
 @Injectable({
   providedIn: 'root'
 })
@@ -50,7 +54,7 @@ export class BucketBrowserService {
     // Build the tree nodes from Json object. The result is a list of `TodoItemNode` with nested
     //     file node as children.
     const data = this.buildFileTree(TREE_DATA, 0);
-
+    console.log(data);
     // Notify the change.
     this.dataChange.next(data);
   }
@@ -64,7 +68,6 @@ export class BucketBrowserService {
       const value = obj[key];
       const node = new TodoItemNode();
       node.item = key;
-
       if (value != null) {
         if (typeof value === 'object') {
           node.children = this.buildFileTree(value, level + 1);
@@ -78,9 +81,9 @@ export class BucketBrowserService {
   }
 
   /** Add an item to to-do list */
-  insertItem(parent: TodoItemNode, name: string) {
+  insertItem(parent: TodoItemNode, name: string, isFile) {
     if (parent.children) {
-      parent.children.push({item: name} as TodoItemNode);
+      parent.children.push(isFile ? {item: name} as TodoItemNode : {item: name, children: []} as TodoItemNode);
       this.dataChange.next(this.data);
     }
   }
@@ -89,4 +92,11 @@ export class BucketBrowserService {
     node.item = name;
     this.dataChange.next(this.data);
   }
+
+  uploadFile(parent: TodoItemNode, name: string) {
+    if (parent.children) {
+      parent.children.push({item: name, children: []} as TodoItemNode);
+      this.dataChange.next(this.data);
+    }
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
index 307f21b..50c812d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
@@ -25,38 +25,44 @@
   <div class="dialog-content tabs">
     <div class="submit m-bott-10 m-top-10">
       <button mat-raised-button type="button" class="butt action"><input type="file" (change)="handleFileInput($event.target.files)">Add file</button>
-<!--      <button mat-raised-button type="button" class="butt action"><input type="file" (change)="filesPicked($event.target.files)" webkitdirectory directory multiple/>Upload folder</button>-->
-<!--      <button mat-raised-button type="button" class="butt action">Download files</button>-->
-      <button mat-raised-button type="button" class="butt action">Create folder</button>
+      <button mat-raised-button type="button" class="butt action" (click)="folderTreeComponent.addNewItem(selectedFolder, '', false)">Create folder</button>
     </div>
+    <p class="path"><span class="strong">Bucket path:</span><i> {{path}}</i></p>
     <div class="backet-wrapper" id="scrolling">
       <div class="navigation">
-        <dlab-folder-tree></dlab-folder-tree>
-<!--        <ul class="folder-tree">-->
-<!--          <li class="folder-item">-->
-<!--            <i class="material-icons">folder</i>-->
-<!--            <span class="folder">bucket</span>-->
-<!--          </li>-->
-<!--        </ul>-->
+        <dlab-folder-tree (showFolderContent)=onFolderClick($event)> </dlab-folder-tree>
       </div>
       <div class="directory">
-<!--        <dlab-folder-tree></dlab-folder-tree>-->
+        <ul class="folder-tree" *ngIf="!uploadPaths.length">
+          <li *ngFor="let file of folderItems" class="folder-item" >
+            <div class="folder-item-wrapper" *ngIf="file.children" (click)="showItem(file)">
+              <div class="name name-folder"><i class="material-icons folder-icon" >folder</i><span>{{file.item}}</span></div>
+              <div class="size">2.4kb</div>
+            </div>
+            <div class="folder-item-wrapper" *ngIf="!file.children">
+              <div class="name name-file"> <mat-checkbox ></mat-checkbox><span>{{file.item}}</span></div>
+<!--                [checked]="descendantsAllSelected(node)"-->
+<!--                [indeterminate]="descendantsPartiallySelected(node)"-->
+<!--                (change)="todoItemSelectionToggle(node)"-->
+              <div class="size">2.4kb</div>
+            </div>
+            <!--            <div class="progres"></div>-->
+          </li>
+        </ul>
         <ul class="folder-tree">
           <li *ngFor="let file of uploadPaths" class="folder-item">
             <div class="name">{{file}}</div>
             <div class="size">2.4kb</div>
             <div class="progres"></div>
-          </li>
-          <li class="folder-item">
-
+            <div (click)="deleteAddedFile(file)">X</div>
           </li>
         </ul>
       </div>
     </div>
     <div class="text-center m-top-30 m-bott-30">
       <button type="button" class="butt" mat-raised-button (click)="this.dialogRef.close()">Close</button>
-      <button type="button" class="butt butt-success" mat-raised-button>Download</button>
-      <button type="button" class="butt butt-success" mat-raised-button>Upload</button>
+      <button *ngIf="!this.uploadPaths.length" type="button" class="butt butt-success" mat-raised-button >Download</button>
+      <button *ngIf="this.uploadPaths.length !== 0" type="button" class="butt butt-success" mat-raised-button (click)="uploadItems()">Upload</button>
     </div>
   </div>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
index 9d839bb..dba2d31 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
@@ -18,7 +18,13 @@
  */
 
 .bucket-browser {
+  .path{
+    margin-bottom: 8px;
+    padding-left: 20px;
+    .url{
 
+    }
+  }
   bottom: 0;
   .dialog-content{
     padding: 0 35px;
@@ -51,7 +57,6 @@
     left: 0;
     right: 0;
   }
-
 }
 
 .backet-wrapper{
@@ -60,6 +65,8 @@
   border-radius: 5px;
   display: flex;
 
+
+
   .navigation{
     flex: 1;
     border-right: 2px solid rgba(0,0,0,.12);
@@ -79,6 +86,19 @@
     .folder-tree{
       .name{
         flex:2;
+        display: flex;
+        align-items: center;
+        &-folder{
+          span{
+            padding-left: 10px;
+          }
+        }
+        &-file{
+          padding-left: 4px;
+          span{
+            padding-left: 14px;
+          }
+        }
       }
       .size{
         flex:1;
@@ -118,6 +138,33 @@
   .folder-item{
      display: flex;
      align-items: center;
-
+     .folder-item-wrapper{
+       width: 100%;
+       display: flex;
+       justify-content: space-between;
+       align-items: center;
+       cursor: pointer;
+       color: rgba(0,0,0,.87);
+       i{
+         color: rgb(232, 232, 232);
+       }
+       &:hover{
+         color: #00bcd4;
+         transition: .3s ease-in-out;
+         i{
+           color: #00bcd4;
+           transition: .3s ease-in-out;
+         }
+       }
+     }
    }
 }
+
+.folder-item-name{
+  span{
+    color: #000;
+  }
+
+
+
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
index 447501e..71d9dba 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
@@ -22,9 +22,10 @@ import { FormGroup, FormBuilder, Validators } from '@angular/forms';
 import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
 
-import { AccountCredentials, MangeUngitModel } from './bucket-browser.model';
+// import { AccountCredentials, MangeUngitModel } from './bucket-browser.model';
 import { ManageUngitService } from '../../core/services';
 import {logger} from 'codelyzer/util/logger';
+import {FolderTreeComponent} from './folder-tree/folder-tree.component';
 
 @Component({
   selector: 'dlab-bucket-browser',
@@ -34,7 +35,12 @@ import {logger} from 'codelyzer/util/logger';
 export class BucketBrowserComponent implements OnInit {
   filenames: Array<any> = [];
   uploadPaths = [];
-  @ViewChild('tabGroupGit', { static: false }) tabGroupGit;
+  folderItems = [];
+  path = '';
+  selectedFolderItems = [];
+  // @ViewChild('tabGroupGit', { static: false }) tabGroupGit;
+  @ViewChild(FolderTreeComponent, {static: true}) folderTreeComponent;
+  private selectedFolder: any;
 
   constructor(
     public toastr: ToastrService,
@@ -50,14 +56,22 @@ export class BucketBrowserComponent implements OnInit {
 
   }
 
+  showItem(item) {
+    const flatItem = this.folderTreeComponent.nestedNodeMap.get(item);
+    // this.folderTreeComponent.treeControl.isExpanded(flatItem) = ;
+    this.folderTreeComponent.showItem(flatItem);
+    // console.log(item);
+    // this.onFolderClick(item);
+  }
+
   handleFileInput(files) {
     //   for (let i = 0; i < files.length; i++) {
     //     const file = files[i];
     //     const path = file.webkitRelativePath.split('/');
     //   }
     // }
-    console.log(files)
-    this.filenames = Object['values'](files).map(v => v.name)
+    console.log(files);
+    this.filenames = Object['values'](files).map(v => v.name);
     this.uploadPaths = [...this.uploadPaths, ...this.filenames];
   }
 
@@ -70,6 +84,13 @@ export class BucketBrowserComponent implements OnInit {
     console.log(this.uploadPaths);
   }
 
+  onFolderClick(event) {
+    this.selectedFolder = event.element1;
+    this.folderItems = event.element ? event.element.children : event.children;
+    this.path = event.path;
+
+  }
+
   private upload(tree, path) {
     tree.files.forEach(file => {
       this.uploadPaths.push(path + file.name);
@@ -80,6 +101,20 @@ export class BucketBrowserComponent implements OnInit {
       this.upload(directory, newPath);
     });
   }
+
+  deleteAddedFile(file) {
+    this.uploadPaths.splice(this.uploadPaths.indexOf(file), 1);
+  }
+
+  uploadItems(){
+    // this.folderTreeComponent.addNewItem(this.selectedFolder);
+    this.uploadPaths.forEach(v => {
+      this.folderTreeComponent.addNewItem(this.selectedFolder, v, true);
+    });
+    this.uploadPaths = [];
+    // this.folderTreeComponent.saveNode(this.selectedFolder);
+
+  }
 }
 
 // @Component({
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
index 2ba6ed8..5b05dea 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
@@ -1,16 +1,16 @@
 <mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
-  <mat-tree-node *matTreeNodeDef="let node" matTreeNodeToggle matTreeNodePadding>
-    <button mat-icon-button disabled></button>
-<!--    <mat-checkbox class="checklist-leaf-node"-->
-<!--                  [checked]="checklistSelection.isSelected(node)"-->
-<!--                  (change)="todoLeafItemSelectionToggle(node)"></mat-checkbox>-->
-    {{node.item}}
-  </mat-tree-node>
+  <mat-tree-node *matTreeNodeDef="let node" matTreeNodeToggle matTreeNodePadding [ngStyle]="{'display': 'none'}">
+  <button mat-icon-button disabled></button>
+  <!--    <mat-checkbox class="checklist-leaf-node"-->
+  <!--                  [checked]="checklistSelection.isSelected(node)"-->
+  <!--                  (change)="todoLeafItemSelectionToggle(node)"></mat-checkbox>-->
+  {{node.item}}
+</mat-tree-node>
 
   <mat-tree-node *matTreeNodeDef="let node; when: hasNoContent" matTreeNodePadding>
     <button mat-icon-button disabled></button>
     <mat-form-field>
-      <mat-label>New item...</mat-label>
+      <mat-label>New folder</mat-label>
       <input matInput #itemValue placeholder="Ex. Lettuce">
     </mat-form-field>
     <button mat-button (click)="saveNode(node, itemValue.value)">Save</button>
@@ -25,8 +25,8 @@
     </button>
 <!--    <mat-checkbox [checked]="descendantsAllSelected(node)"-->
 <!--                  [indeterminate]="descendantsPartiallySelected(node)"-->
-<!--                  (change)="todoItemSelectionToggle(node)">{{node.item}}</mat-checkbox>-->
-    <i class="material-icons folder-icon">folder</i> <span class="folder">{{node.item}}</span>
+<!--                  (change)="todoItemSelectionToggle(node)"></mat-checkbox>-->
+    <div (click)="showItem(node)" class="folder-item-line" [ngClass]="{'active': selectedFolder === node}"><i class="material-icons folder-icon">folder</i> <span class="folder">{{node.item}}</span></div>
 <!--    <button mat-icon-button (click)="addNewItem(node)"><mat-icon>add</mat-icon></button>-->
   </mat-tree-node>
 </mat-tree>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
index a842b13..8da2b8d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
@@ -1,3 +1,4 @@
+
 .folder{
   padding-left: 5px;
 }
@@ -5,3 +6,24 @@
 .folder-icon{
   color: rgb(232, 232, 232);
 }
+
+.folder-item-line{
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  &.active {
+    //border-bottom: 1px solid #00bcd4;
+    color: #00bcd4;
+    i{
+      color: #00bcd4;
+    }
+
+}
+  &:hover{
+    color: #00bcd4;
+    i{
+      color: #00bcd4;
+    }
+  }
+
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
index bba1a45..7070c25 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
@@ -1,13 +1,13 @@
-import { Component, OnInit, Injectable } from '@angular/core';
+import {Component, OnInit, AfterViewInit, Output, EventEmitter} from '@angular/core';
 import {SelectionModel} from '@angular/cdk/collections';
 import {FlatTreeControl} from '@angular/cdk/tree';
 import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree';
 import {BucketBrowserService, TodoItemFlatNode, TodoItemNode} from '../../../core/services/bucket-browser.service';
+import {Logger} from 'codelyzer/util/logger';
 
 
 class ChecklistDatabase {
 }
-
 /**
  * @title Tree with checkboxes
  */
@@ -17,7 +17,12 @@ class ChecklistDatabase {
   templateUrl: './folder-tree.component.html',
   styleUrls: ['./folder-tree.component.scss']
 })
-export class FolderTreeComponent {
+export class FolderTreeComponent implements AfterViewInit{
+
+  @Output() showFolderContent: EventEmitter<any> = new EventEmitter();
+
+  path = [];
+  selectedFolder: TodoItemFlatNode;
   /** Map from flat node to nested node. This helps us finding the nested node to be modified */
   flatNodeMap = new Map<TodoItemFlatNode, TodoItemNode>();
 
@@ -29,7 +34,9 @@ export class FolderTreeComponent {
 
   /** The new item's name */
   newItemName = '';
+  isOpened = {
 
+  };
   treeControl: FlatTreeControl<TodoItemFlatNode>;
 
   treeFlattener: MatTreeFlattener<TodoItemNode, TodoItemFlatNode>;
@@ -42,14 +49,20 @@ export class FolderTreeComponent {
   constructor(private bucketBrowserService: BucketBrowserService) {
     this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel,
       this.isExpandable, this.getChildren);
+
     this.treeControl = new FlatTreeControl<TodoItemFlatNode>(this.getLevel, this.isExpandable);
     this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
 
     bucketBrowserService.dataChange.subscribe(data => {
       this.dataSource.data = data;
+      console.log(this.dataSource);
     });
   }
 
+  // ngAfterViewInit(): void {
+  //
+  // }
+
   getLevel = (node: TodoItemFlatNode) => node.level;
 
   isExpandable = (node: TodoItemFlatNode) => node.expandable;
@@ -76,6 +89,46 @@ export class FolderTreeComponent {
     return flatNode;
   }
 
+
+  ngAfterViewInit() {
+    const subject = this.dataSource._flattenedData;
+    let firstSelected;
+    subject.subscribe((data) => {
+      firstSelected = data[0];
+      // this.selectedFolder = ;
+      this.treeControl.expand(data[0]);
+    });
+    this.selectedFolder = firstSelected;
+  }
+
+  showItem(el) {
+    this.treeControl.expand(el);
+    this.selectedFolder = el;
+    const path = this.getpath(el);
+    this.path = [];
+    const data = {
+      flatNode: el,
+      element: this.flatNodeMap.get(el),
+      element1: el,
+      path: path.join('/')
+    };
+    console.log(data);
+    this.showFolderContent.emit(data);
+  }
+
+  getpath(el) {
+    if (this.path.length === 0) {
+      this.path.unshift(el.item);
+    }
+    if (this.getParentNode(el) !== null) {
+      this.path.unshift(this.getParentNode(el).item);
+      this.getpath(this.getParentNode(el));
+    }
+    return this.path;
+  }
+
+
+
   /** Whether all the descendants of the node are selected. */
   descendantsAllSelected(node: TodoItemFlatNode): boolean {
     const descendants = this.treeControl.getDescendants(node);
@@ -95,17 +148,17 @@ export class FolderTreeComponent {
   /** Toggle the to-do item selection. Select/deselect all the descendants node */
   todoItemSelectionToggle(node: TodoItemFlatNode): void {
     this.checklistSelection.toggle(node);
-    const descendants = this.treeControl.getDescendants(node);
-    this.checklistSelection.isSelected(node)
-      ? this.checklistSelection.select(...descendants)
-      : this.checklistSelection.deselect(...descendants);
-
-    // Force update for the parent
-    descendants.every(child =>
-      this.checklistSelection.isSelected(child)
-    );
-    this.checkAllParentsSelection(node);
-  }
+  const descendants = this.treeControl.getDescendants(node);
+  this.checklistSelection.isSelected(node)
+? this.checklistSelection.select(...descendants)
+    : this.checklistSelection.deselect(...descendants);
+
+  // Force update for the parent
+  descendants.every(child =>
+  this.checklistSelection.isSelected(child)
+);
+  this.checkAllParentsSelection(node);
+}
 
   /** Toggle a leaf to-do item selection. Check all the parents to see if they changed */
   todoLeafItemSelectionToggle(node: TodoItemFlatNode): void {
@@ -157,15 +210,18 @@ export class FolderTreeComponent {
   }
 
   /** Select the category so we can insert the new item. */
-  addNewItem(node: TodoItemFlatNode) {
+  addNewItem(node: TodoItemFlatNode, name, isFile) {
+    console.log(node);
     const parentNode = this.flatNodeMap.get(node);
-    this.bucketBrowserService.insertItem(parentNode!, '');
+    this.bucketBrowserService.insertItem(parentNode!, name, isFile);
     this.treeControl.expand(node);
   }
 
   /** Save the node to database */
   saveNode(node: TodoItemFlatNode, itemValue: string) {
     const nestedNode = this.flatNodeMap.get(node);
+    console.log(nestedNode);
+    console.log(itemValue);
     this.bucketBrowserService.updateItem(nestedNode!, itemValue);
   }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org


[incubator-dlab] 05/05: Bucket browser for video

Posted by dg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch DLAB-1551
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit 470a2d7c9ebc8097aab8613a7010d873f2e81c68
Author: Dmytro Gnatyshyn <di...@ukr.net>
AuthorDate: Tue Apr 14 11:12:50 2020 +0300

    Bucket browser for video
---
 .../app/core/services/bucket-browser.service.ts    | 99 ++++++++++------------
 .../bucket-browser/bucket-browser.component.html   | 54 +++++++-----
 .../bucket-browser/bucket-browser.component.scss   | 47 ++++++++--
 .../bucket-browser/bucket-browser.component.ts     | 89 +++++++++----------
 .../folder-tree/folder-tree.component.html         |  2 +-
 .../folder-tree/folder-tree.component.scss         |  1 +
 .../folder-tree/folder-tree.component.ts           | 58 ++-----------
 .../detail-dialog/detail-dialog.component.html     |  4 +-
 .../detail-dialog/detail-dialog.component.scss     |  1 +
 .../detail-dialog/detail-dialog.component.ts       | 11 ++-
 .../src/app/resources/resources.component.html     |  6 +-
 11 files changed, 181 insertions(+), 191 deletions(-)

diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
index 36f4a05..fca1ba5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
@@ -5,6 +5,7 @@ export class TodoItemNode {
   children: TodoItemNode[];
   item: string;
   id: string;
+  size: number;
 }
 
 /** Flat to-do item node with expandable and level information */
@@ -17,50 +18,39 @@ export class TodoItemFlatNode {
 /**
  * The Json object for to-do list data.
  */
-const TREE_DATA = {
+let TREE_DATA = {};
+const local = {
   'dlab-local-shared-bucket': {
-    'file1': null,
-    'file2': null,
-    'file3': null,
-    FirsrFolder: {
-      folder: {
-        folder: ['2008.cvs.bz2', 'airports.csv', 'carriers.csv'],
-        folder1: ['2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
-          'file2',
-          'file3',
-          'file4',
-          'file5',
-          'file6', '2008.cvs.bz2', '2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
-          'file2',
-          'file3',
-          'file4',
-          'file5',
-          'file6',
-          '2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
-          'file2',
-          'file3',
-          'file4',
-          'file5',
-          'file6', '2008.cvs.bz2', '2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
-          'file2',
-          'file3',
-          'file4',
-          'file5',
-          'file6'],
-        folder2: []
-      },
-      'folder1': [],
-      'file2': null,
-      'file3': null,
-    },
-    SecondFolder: [
-      'file1',
-      'file2',
-      'file3'
-    ]
+    // folder: {
+    //   folder: {
+    //     folder: ['2008.cvs.bz2', 'airports.csv', 'carriers.csv'],
+    //     folder2: []
+    //   },
+    //   'folder1': [],
+    //   'file2': {size: 123.32},
+    //   'file3': {size: 5.34},
+    // },
+    '2008.cvs.bz2': {size: 125.34},
+    'airports.csv': {size: 33.12},
+    'carriers.csv': {size: 46.13},
+  }
+};
+const projecta = {
+  'dlab-projecta-local-bucket': {
+    // folder: {
+    //   folder: {
+    //     folder: ['2008.cvs.bz2', 'airports.csv', 'carriers.csv'],
+    //     folder2: []
+    //   },
+    //   'folder1': [],
+    //   'file2': {size: 123.32},
+    //   'file3': {size: 5.34},
+    // },
+    '2008.cvs.bz2': {size: 125.34},
+    'airports.csv': {size: 33.12},
+    'carriers.csv': {size: 46.13},
   }
 };
-
 
 @Injectable({
   providedIn: 'root'
@@ -75,11 +65,7 @@ export class BucketBrowserService {
   }
 
   initialize() {
-    // Build the tree nodes from Json object. The result is a list of `TodoItemNode` with nested
-    //     file node as children.
     const data = this.buildFileTree(TREE_DATA, 0);
-    console.log(data);
-    // Notify the change.
     this.dataChange.next(data);
   }
 
@@ -92,28 +78,33 @@ export class BucketBrowserService {
       const value = obj[key];
       const node = new TodoItemNode();
       node.item = key;
-      if (value != null) {
+      if (!value.size) {
         if (typeof value === 'object') {
           node.children = this.buildFileTree(value, level + 1);
         } else {
           node.item = value;
         }
+      } else {
+        node.size = value.size;
       }
 
       return accumulator.concat(node);
     }, []);
   }
 
-  /** Add an item to to-do list */
-  insertItem(parent: TodoItemNode, name: string, isFile) {
+  insertItem(parent: TodoItemNode, name, isFile) {
     if (parent.children) {
-      parent.children.push(isFile ? {item: name} as TodoItemNode : {item: name, children: []} as TodoItemNode);
-      this.dataChange.next(this.data);
+      if (isFile) {
+        parent.children.push(name as TodoItemNode);
+      } else {
+        parent.children.unshift({item: name, children: []} as TodoItemNode);
+        this.dataChange.next(this.data);
+      }
     }
   }
 
-  updateItem(node: TodoItemNode, name: string) {
-    node.item = name;
+  updateItem(node: TodoItemNode, file) {
+    node.item = file;
     this.dataChange.next(this.data);
   }
 
@@ -123,4 +114,8 @@ export class BucketBrowserService {
       this.dataChange.next(this.data);
     }
   }
+
+  initBucket(bucketType) {
+    bucketType !== 'project' ? TREE_DATA = local : TREE_DATA = projecta;
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
index 2a84c86..79c272d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
@@ -24,53 +24,65 @@
   </header>
   <div class="dialog-content tabs">
     <div class="submit m-bott-10 m-top-10">
-      <button mat-raised-button type="button" class="butt action"><input type="file" (change)="handleFileInput($event.target.files)">Add file</button>
+      <button mat-raised-button type="button" class="butt action"><input type="file" multiple (change)="handleFileInput($event.target.files)">Add file</button>
       <button mat-raised-button type="button" class="butt action" (click)="folderTreeComponent.addNewItem(selectedFolder, '', false)">Create folder</button>
     </div>
-    <p class="path"><span class="strong">Bucket path:</span><i> {{path}}</i></p>
+    <p class="path"><span>Bucket path:</span><span class="url"> {{path}}</span></p>
     <div class="backet-wrapper" id="scrolling">
       <div class="navigation">
         <dlab-folder-tree (showFolderContent)=onFolderClick($event)> </dlab-folder-tree>
       </div>
       <div class="directory">
-        <ul class="folder-tree" *ngIf="!uploadPaths.length">
+        <ul class="folder-tree" *ngIf="!addedFiles.length">
           <li *ngFor="let file of folderItems" class="folder-item" >
+
             <div class="folder-item-wrapper" *ngIf="file.children" (click)="showItem(file)">
               <div class="name name-folder"><i class="material-icons folder-icon" >folder</i><span>{{file.item}}</span></div>
-              <div class="size">2.4kb</div>
-            </div>
-            <div class="folder-item-wrapper" *ngIf="!file.children">
-              <div class="name name-file"> <mat-checkbox [(ngModel)]="file.isSelected"></mat-checkbox><span>{{file.item}}</span></div>
-<!--                [checked]="descendantsAllSelected(node)"-->
-<!--                [indeterminate]="descendantsPartiallySelected(node)"-->
-<!--                (change)="todoItemSelectionToggle(node)"-->
-              <div class="size">2.4kb</div>
+              <div class="size"></div>
               <div class="progress-wrapper">
                 <div class="progres" *ngIf="file.isSelected"><div class="bar"></div></div>
               </div>
             </div>
 
+            <div class="folder-item-wrapper"  (click)="toggleSelectedFile(file)" *ngIf="!file.children">
+              <div class="name name-file">
+                 <span class="empty-checkbox" [ngClass]="{'checked': file.isSelected}" (click)="toggleSelectedFile(file);$event.stopPropagation()" >
+                    <span class="checked-checkbox" *ngIf="file.isSelected"></span>
+                  </span>
+                <span class="item-name">{{file.item}}</span>
+              </div>
+              <div class="size">{{file.size}}MB</div>
+              <div class="progress-wrapper">
+<!--                <div class="progres" *ngIf="file.isSelected"><div class="bar"></div></div>-->
+              </div>
+            </div>
+
           </li>
         </ul>
         <ul class="folder-tree">
-          <li *ngFor="let file of uploadPaths" class="folder-item">
-            <div class="name">{{file}}</div>
-            <div class="size">2.4kb</div>
-            <div class="progress-wrapper">
-              <div class="progres">
-                <div class="bar" [ngClass]="{'full': isUploading}">
-                </div>
+          <li *ngFor="let file of addedFiles" class="folder-item">
+            <div class="folder-item-wrapper">
+              <div class="name">{{file.item}}</div>
+              <div class="size">{{file.size}} MB</div>
+              <div class="progress-wrapper">
+<!--                <div class="progres">-->
+<!--                  <div class="bar" [ngClass]="{'full': isUploading}">-->
+<!--                    -->
+<!--                  </div>-->
+
+<!--                </div>-->
+              <mat-progress-bar mode="indeterminate" *ngIf="isUploading"></mat-progress-bar>
               </div>
+              <div (click)="deleteAddedFile(file)"><i class="material-icons close">close</i></div>
             </div>
-            <div (click)="deleteAddedFile(file)">X</div>
           </li>
         </ul>
       </div>
     </div>
     <div class="text-center m-top-30 m-bott-30">
       <button type="button" class="butt" mat-raised-button (click)="this.dialogRef.close()">Close</button>
-      <button *ngIf="!this.uploadPaths.length" type="button" class="butt butt-success" mat-raised-button (click)="downloadItems()">Download</button>
-      <button *ngIf="this.uploadPaths.length !== 0" type="button" class="butt butt-success" mat-raised-button (click)="uploadItems()">Upload</button>
+      <button *ngIf="!this.addedFiles.length" type="button" class="butt butt-success" mat-raised-button (click)="downloadItems()" [disabled]="!selected?.length">Download</button>
+      <button *ngIf="this.addedFiles.length !== 0" type="button" class="butt butt-success" mat-raised-button (click)="uploadItems()">Upload</button>
     </div>
   </div>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
index d20c10f..7f004b4 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
@@ -19,10 +19,11 @@
 
 .bucket-browser {
   .path{
-    margin-bottom: 8px;
-    padding-left: 20px;
+    margin: 0 4px 10px 4px;
+    padding: 4px 4px 4px 20px;
+    color: rgba(0,0,0,.87);
     .url{
-
+      font-weight: 600;
     }
   }
   bottom: 0;
@@ -97,7 +98,7 @@
         }
         &-file{
           padding-left: 4px;
-          span{
+          span.item-name{
             padding-left: 14px;
           }
         }
@@ -125,7 +126,11 @@
           }
         }
       }
-
+      .material-icons.close{
+        font-size: 15px;
+        margin: 0 10px;
+        cursor: pointer;
+      }
       .action {
         display: flex;
         justify-content: space-around;
@@ -173,14 +178,42 @@
            color: #00bcd4;
            transition: .3s ease-in-out;
          }
-         .mat-checkbox .mat-ripple-element {
-           background-color: #00bcd4 !important;
+         .empty-checkbox{
+           border-color: #00bcd4
+         }
+         .progress-wrapper{
+           .progres{
+             border-color: #00bcd4 !important;
+           }
          }
        }
      }
    }
 }
 
+.empty-checkbox {
+  width: 16px;
+  height: 16px;
+  border-radius: 2px;
+  border: 2px solid lightgrey;
+  margin-top: 2px;
+  position: relative;
+  &.checked {
+    border-color: #35afd5;
+    background-color: #35afd5;
+  }
+  .checked-checkbox {
+    top: 0px;
+    left: 4px;
+    width: 5px;
+    height: 10px;
+    border-bottom: 2px solid white;
+    border-right: 2px solid white;
+    position: absolute;
+    transform: rotate(45deg);
+  }
+}
+
 .folder-item-name{
   span{
     color: #000;
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
index 58454cb..203bd08 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
@@ -21,11 +21,10 @@ import { Component, OnInit, ViewChild, Inject } from '@angular/core';
 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
 import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
-
-// import { AccountCredentials, MangeUngitModel } from './bucket-browser.model';
 import { ManageUngitService } from '../../core/services';
-import {logger} from 'codelyzer/util/logger';
+
 import {FolderTreeComponent} from './folder-tree/folder-tree.component';
+import {BucketBrowserService, TodoItemNode} from '../../core/services/bucket-browser.service';
 
 @Component({
   selector: 'dlab-bucket-browser',
@@ -34,35 +33,36 @@ import {FolderTreeComponent} from './folder-tree/folder-tree.component';
 })
 export class BucketBrowserComponent implements OnInit {
   filenames: Array<any> = [];
-  uploadPaths = [];
+  addedFiles = [];
   folderItems = [];
   path = '';
-  selectedFolderItems = [];
-  // @ViewChild('tabGroupGit', { static: false }) tabGroupGit;
+
   @ViewChild(FolderTreeComponent, {static: true}) folderTreeComponent;
   private selectedFolder: any;
   private isUploading: boolean;
+  private selected: any[];
 
   constructor(
+    @Inject(MAT_DIALOG_DATA) public data: 'string',
     public toastr: ToastrService,
     public dialog: MatDialog,
     public dialogRef: MatDialogRef<BucketBrowserComponent>,
     private manageUngitService: ManageUngitService,
     private _fb: FormBuilder,
+    private bucketBrowserService: BucketBrowserService
   ) {
 
   }
 
   ngOnInit() {
-
+    this.bucketBrowserService.initBucket(this.data);
+    this.bucketBrowserService.initialize();
+    // console.log(this.data);
   }
 
   showItem(item) {
     const flatItem = this.folderTreeComponent.nestedNodeMap.get(item);
-    // this.folderTreeComponent.treeControl.isExpanded(flatItem) = ;
     this.folderTreeComponent.showItem(flatItem);
-    // console.log(item);
-    // this.onFolderClick(item);
   }
 
   handleFileInput(files) {
@@ -71,40 +71,46 @@ export class BucketBrowserComponent implements OnInit {
     //     const path = file.webkitRelativePath.split('/');
     //   }
     // }
-    console.log(files);
-    this.filenames = Object['values'](files).map(v => v.name);
-    this.uploadPaths = [...this.uploadPaths, ...this.filenames];
+    this.filenames = Object['values'](files).map(v => ({item: v.name, 'size': (v.size / 1048576).toFixed(2)} as unknown as TodoItemNode));
+    this.addedFiles = [...this.addedFiles, ...this.filenames];
+  }
+
+  toggleSelectedFile(file) {
+    file.isSelected = !file.isSelected;
+    this.selected = this.folderItems.filter(item => item.isSelected);
   }
 
   filesPicked(files) {
-    console.log(files);
-    // this.uploadPaths = [];
+    // console.log(files);
+
     Array.prototype.forEach.call(files, file => {
-      this.uploadPaths.push(file.webkitRelativePath);
+      this.addedFiles.push(file.webkitRelativePath);
     });
-    console.log(this.uploadPaths);
+    // console.log(this.addedFiles);
   }
 
   onFolderClick(event) {
     this.selectedFolder = event.element1;
     this.folderItems = event.element ? event.element.children : event.children;
+    // this.folderItems = this.folderItems.sort((a, b) => (a.children > b.children) ? 1 : -1)
+    // console.log(this.folderItems);
     this.path = event.path;
-
+    this.folderItems.forEach(item => item.isSelected = false);
   }
 
   private upload(tree, path) {
     tree.files.forEach(file => {
-      this.uploadPaths.push(path + file.name);
+      this.addedFiles.push(path + file.name);
     });
     tree.directories.forEach(directory => {
       const newPath = path + directory.name + '/';
-      this.uploadPaths.push(newPath);
+      this.addedFiles.push(newPath);
       this.upload(directory, newPath);
     });
   }
 
   deleteAddedFile(file) {
-    this.uploadPaths.splice(this.uploadPaths.indexOf(file), 1);
+    this.addedFiles.splice(this.addedFiles.indexOf(file), 1);
   }
 
   uploadItems() {
@@ -112,44 +118,25 @@ export class BucketBrowserComponent implements OnInit {
     setTimeout(() => this.upLoading(), 5000);
   }
 
-  downloadItems(){
-    this.isUploading = true;
+  downloadItems() {
+    setTimeout(() => this.downloadItemsAction(), 1000);
   }
 
   upLoading() {
-    this.uploadPaths.forEach(v => {
+    this.addedFiles.forEach(v => {
       this.folderTreeComponent.addNewItem(this.selectedFolder, v, true);
     });
-    this.uploadPaths = [];
+    this.toastr.success(this.addedFiles.length === 1 ? 'File successfully uploaded' : 'Files successfully uploaded', 'Success!');
+    this.addedFiles = [];
     this.isUploading = false;
   }
+
+  downloadItemsAction() {
+    this.folderItems.forEach(item => item.isSelected = false);
+    this.toastr.success(this.selected.length === 1 ? 'File downloading started' : 'Files downloading started', 'Success!');
+    this.selected = this.folderItems.filter(item => item.isSelected);
+  }
 }
 
 
 
-// @Component({
-//   selector: 'dialog-result-example-dialog',
-//   template: `
-//   <div class="dialog-header">
-//     <h4 class="modal-title"><i class="material-icons">priority_high</i>Warning</h4>
-//     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
-//   </div>
-//   <div mat-dialog-content class="content">
-//     <p>Account <span class="strong">{{ data.hostname }}</span> will be decommissioned.</p>
-//     <p class="m-top-20"><span class="strong">Do you want to proceed?</span></p>
-//   </div>
-//   <div class="text-center">
-//     <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">No</button>
-//     <button type="button" class="butt butt-success" mat-raised-button (click)="dialogRef.close(true)">Yes</button>
-//   </div>
-//   `,
-//   styles: [`
-//     .content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400 }
-//   `]
-// })
-// export class ConfirmDeleteAccountDialog {
-//   constructor(
-//     public dialogRef: MatDialogRef<ConfirmDeleteAccountDialog>,
-//     @Inject(MAT_DIALOG_DATA) public data: any
-//   ) { }
-// }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
index 0d1c480..b663e78 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
@@ -11,7 +11,7 @@
     <button mat-icon-button disabled></button>
     <mat-form-field>
       <mat-label>New folder</mat-label>
-      <input matInput #itemValue placeholder="Ex. Lettuce">
+      <input matInput #itemValue>
     </mat-form-field>
     <button mat-button (click)="saveNode(node, itemValue.value)">Save</button>
   </mat-tree-node>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
index ffbf47d..e9902af 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
@@ -27,6 +27,7 @@
 .mat-tree-node{
   cursor: pointer;
   transition: .3s;
+  overflow: unset;
   &:hover{
     color: #00bcd4;
     i{
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
index 7070c25..774a3c8 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
@@ -3,47 +3,27 @@ import {SelectionModel} from '@angular/cdk/collections';
 import {FlatTreeControl} from '@angular/cdk/tree';
 import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree';
 import {BucketBrowserService, TodoItemFlatNode, TodoItemNode} from '../../../core/services/bucket-browser.service';
-import {Logger} from 'codelyzer/util/logger';
 
 
-class ChecklistDatabase {
-}
-/**
- * @title Tree with checkboxes
- */
-
 @Component({
   selector: 'dlab-folder-tree',
   templateUrl: './folder-tree.component.html',
   styleUrls: ['./folder-tree.component.scss']
 })
-export class FolderTreeComponent implements AfterViewInit{
+export class FolderTreeComponent implements OnInit{
 
   @Output() showFolderContent: EventEmitter<any> = new EventEmitter();
 
   path = [];
   selectedFolder: TodoItemFlatNode;
-  /** Map from flat node to nested node. This helps us finding the nested node to be modified */
   flatNodeMap = new Map<TodoItemFlatNode, TodoItemNode>();
-
-  /** Map from nested node to flattened node. This helps us to keep the same object for selection */
   nestedNodeMap = new Map<TodoItemNode, TodoItemFlatNode>();
-
-  /** A selected parent node to be inserted */
   selectedParent: TodoItemFlatNode | null = null;
-
-  /** The new item's name */
   newItemName = '';
-  isOpened = {
-
-  };
   treeControl: FlatTreeControl<TodoItemFlatNode>;
-
   treeFlattener: MatTreeFlattener<TodoItemNode, TodoItemFlatNode>;
-
   dataSource: MatTreeFlatDataSource<TodoItemNode, TodoItemFlatNode>;
 
-  /** The selection for checklist */
   checklistSelection = new SelectionModel<TodoItemFlatNode>(true /* multiple */);
 
   constructor(private bucketBrowserService: BucketBrowserService) {
@@ -55,14 +35,9 @@ export class FolderTreeComponent implements AfterViewInit{
 
     bucketBrowserService.dataChange.subscribe(data => {
       this.dataSource.data = data;
-      console.log(this.dataSource);
     });
   }
 
-  // ngAfterViewInit(): void {
-  //
-  // }
-
   getLevel = (node: TodoItemFlatNode) => node.level;
 
   isExpandable = (node: TodoItemFlatNode) => node.expandable;
@@ -73,9 +48,6 @@ export class FolderTreeComponent implements AfterViewInit{
 
   hasNoContent = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.item === '';
 
-  /**
-   * Transformer to convert nested node to flat node. Record the nodes in maps for later use.
-   */
   transformer = (node: TodoItemNode, level: number) => {
     const existingNode = this.nestedNodeMap.get(node);
     const flatNode = existingNode && existingNode.item === node.item
@@ -87,18 +59,15 @@ export class FolderTreeComponent implements AfterViewInit{
     this.flatNodeMap.set(flatNode, node);
     this.nestedNodeMap.set(node, flatNode);
     return flatNode;
-  }
+  };
 
 
-  ngAfterViewInit() {
+  ngOnInit() {
     const subject = this.dataSource._flattenedData;
-    let firstSelected;
     subject.subscribe((data) => {
-      firstSelected = data[0];
-      // this.selectedFolder = ;
       this.treeControl.expand(data[0]);
+      this.showItem(data[0]);
     });
-    this.selectedFolder = firstSelected;
   }
 
   showItem(el) {
@@ -112,7 +81,6 @@ export class FolderTreeComponent implements AfterViewInit{
       element1: el,
       path: path.join('/')
     };
-    console.log(data);
     this.showFolderContent.emit(data);
   }
 
@@ -127,9 +95,6 @@ export class FolderTreeComponent implements AfterViewInit{
     return this.path;
   }
 
-
-
-  /** Whether all the descendants of the node are selected. */
   descendantsAllSelected(node: TodoItemFlatNode): boolean {
     const descendants = this.treeControl.getDescendants(node);
     const descAllSelected = descendants.every(child =>
@@ -138,14 +103,12 @@ export class FolderTreeComponent implements AfterViewInit{
     return descAllSelected;
   }
 
-  /** Whether part of the descendants are selected */
   descendantsPartiallySelected(node: TodoItemFlatNode): boolean {
     const descendants = this.treeControl.getDescendants(node);
     const result = descendants.some(child => this.checklistSelection.isSelected(child));
     return result && !this.descendantsAllSelected(node);
   }
 
-  /** Toggle the to-do item selection. Select/deselect all the descendants node */
   todoItemSelectionToggle(node: TodoItemFlatNode): void {
     this.checklistSelection.toggle(node);
   const descendants = this.treeControl.getDescendants(node);
@@ -160,13 +123,11 @@ export class FolderTreeComponent implements AfterViewInit{
   this.checkAllParentsSelection(node);
 }
 
-  /** Toggle a leaf to-do item selection. Check all the parents to see if they changed */
   todoLeafItemSelectionToggle(node: TodoItemFlatNode): void {
     this.checklistSelection.toggle(node);
     this.checkAllParentsSelection(node);
   }
 
-  /* Checks all the parents when a leaf node is selected/unselected */
   checkAllParentsSelection(node: TodoItemFlatNode): void {
     let parent: TodoItemFlatNode | null = this.getParentNode(node);
     while (parent) {
@@ -175,7 +136,6 @@ export class FolderTreeComponent implements AfterViewInit{
     }
   }
 
-  /** Check root node checked state and change it accordingly */
   checkRootNodeSelection(node: TodoItemFlatNode): void {
     const nodeSelected = this.checklistSelection.isSelected(node);
     const descendants = this.treeControl.getDescendants(node);
@@ -189,7 +149,6 @@ export class FolderTreeComponent implements AfterViewInit{
     }
   }
 
-  /* Get the parent node of a node */
   getParentNode(node: TodoItemFlatNode): TodoItemFlatNode | null {
     const currentLevel = this.getLevel(node);
 
@@ -209,19 +168,14 @@ export class FolderTreeComponent implements AfterViewInit{
     return null;
   }
 
-  /** Select the category so we can insert the new item. */
-  addNewItem(node: TodoItemFlatNode, name, isFile) {
-    console.log(node);
+  addNewItem(node: TodoItemFlatNode, file, isFile) {
     const parentNode = this.flatNodeMap.get(node);
-    this.bucketBrowserService.insertItem(parentNode!, name, isFile);
+    this.bucketBrowserService.insertItem(parentNode!, file, isFile);
     this.treeControl.expand(node);
   }
 
-  /** Save the node to database */
   saveNode(node: TodoItemFlatNode, itemValue: string) {
     const nestedNode = this.flatNodeMap.get(node);
-    console.log(nestedNode);
-    console.log(itemValue);
     this.bucketBrowserService.updateItem(nestedNode!, itemValue);
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
index 4977b22..8900116 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
@@ -60,14 +60,14 @@
                 class="strong">{{ notebook.password }}</span></p>
 
             <p class="m-top-30">{{ DICTIONARY[PROVIDER].personal_storage }}: &nbsp;</p>
-            <div class="links_block">
+            <div class="links_block" (click)="bucketBrowser('project')">
               <p *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.account_name">{{ DICTIONARY[PROVIDER].account }}
                 <span class="bucket-info">{{ notebook.account_name}}</span></p>
               <p *ngIf="notebook.bucket_name">{{ DICTIONARY[PROVIDER].container }} <span
                   class="bucket-info">{{ notebook.bucket_name }}</span></p>
             </div>
             <p>Shared endpoint bucket: &nbsp;</p>
-            <div class="links_block">
+            <div class="links_block" (click)="bucketBrowser('endpoint')">
               <p *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.shared_account_name">{{ DICTIONARY[PROVIDER].account }}
                 <span class="bucket-info">{{ notebook.shared_account_name}}</span></p>
               <p *ngIf="notebook.shared_bucket_name">{{ DICTIONARY[PROVIDER].container }}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss
index 2849ce0..12be81b 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss
@@ -86,4 +86,5 @@
   padding-left: 7px;
   font-weight: 600;
   color: $blue-grey-color;
+  cursor: pointer;
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
index db097f3..0d76b75 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
@@ -20,12 +20,13 @@
 import { Component, ViewChild, OnInit, Inject } from '@angular/core';
 import { FormGroup, FormBuilder } from '@angular/forms';
 import { ToastrService } from 'ngx-toastr';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import {MatDialogRef, MAT_DIALOG_DATA, MatDialog} from '@angular/material/dialog';
 
 import { DateUtils, CheckUtils } from '../../../core/util';
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 import { DataengineConfigurationService } from '../../../core/services';
 import { CLUSTER_CONFIGURATION } from '../../computational/computational-resource-create-dialog/cluster-configuration-templates';
+import {BucketBrowserComponent} from '../../bucket-browser/bucket-browser.component';
 
 @Component({
   selector: 'detail-dialog',
@@ -51,7 +52,8 @@ export class DetailDialogComponent implements OnInit {
     private dataengineConfigurationService: DataengineConfigurationService,
     private _fb: FormBuilder,
     public dialogRef: MatDialogRef<DetailDialogComponent>,
-    public toastr: ToastrService
+    public toastr: ToastrService,
+    private dialog: MatDialog,
   ) {
     this.notebook = data;
   }
@@ -120,4 +122,9 @@ export class DetailDialogComponent implements OnInit {
         ? (control.value && control.value !== null && CheckUtils.isJSON(control.value) ? null : { valid: false })
         : null;
   }
+
+  public bucketBrowser(type): void {
+  this.dialog.open(BucketBrowserComponent, { data: type, panelClass: 'modal-fullscreen' })
+    .afterClosed().subscribe();
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
index ab088b6..38e388e 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
@@ -46,9 +46,9 @@
     </div>
 
     <div>
-      <button mat-raised-button class="butt butt-tool" (click)="bucketBrowser()">
-        <i class="material-icons"></i>Bucket browser
-      </button>
+<!--      <button mat-raised-button class="butt butt-tool" (click)="bucketBrowser()">-->
+<!--        <i class="material-icons"></i>Bucket browser-->
+<!--      </button>-->
       <button mat-raised-button class="butt butt-tool" (click)="manageUngit()">
         <i class="material-icons"></i>Git credentials
       </button>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org


[incubator-dlab] 04/05: Styling bucket browser

Posted by dg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch DLAB-1551
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit 1c50ce16bf8e4c9b3036658a63cec971b5911811
Author: Dmytro Gnatyshyn <di...@ukr.net>
AuthorDate: Fri Apr 10 17:06:41 2020 +0300

    Styling bucket browser
---
 .../app/core/services/bucket-browser.service.ts    | 26 +++++++++++++++-
 .../bucket-browser/bucket-browser.component.html   | 16 +++++++---
 .../bucket-browser/bucket-browser.component.scss   | 35 +++++++++++++++++++---
 .../bucket-browser/bucket-browser.component.ts     | 18 ++++++++---
 .../folder-tree/folder-tree.component.html         |  4 +--
 .../folder-tree/folder-tree.component.scss         | 20 +++++++++----
 6 files changed, 98 insertions(+), 21 deletions(-)

diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
index c98df9b..36f4a05 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
@@ -19,10 +19,34 @@ export class TodoItemFlatNode {
  */
 const TREE_DATA = {
   'dlab-local-shared-bucket': {
+    'file1': null,
+    'file2': null,
+    'file3': null,
     FirsrFolder: {
       folder: {
         folder: ['2008.cvs.bz2', 'airports.csv', 'carriers.csv'],
-        folder1: [],
+        folder1: ['2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
+          'file2',
+          'file3',
+          'file4',
+          'file5',
+          'file6', '2008.cvs.bz2', '2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
+          'file2',
+          'file3',
+          'file4',
+          'file5',
+          'file6',
+          '2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
+          'file2',
+          'file3',
+          'file4',
+          'file5',
+          'file6', '2008.cvs.bz2', '2008.cvs.bz2', 'airports.csv', 'carriers.csv', 'file1',
+          'file2',
+          'file3',
+          'file4',
+          'file5',
+          'file6'],
         folder2: []
       },
       'folder1': [],
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
index 50c812d..2a84c86 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
@@ -40,20 +40,28 @@
               <div class="size">2.4kb</div>
             </div>
             <div class="folder-item-wrapper" *ngIf="!file.children">
-              <div class="name name-file"> <mat-checkbox ></mat-checkbox><span>{{file.item}}</span></div>
+              <div class="name name-file"> <mat-checkbox [(ngModel)]="file.isSelected"></mat-checkbox><span>{{file.item}}</span></div>
 <!--                [checked]="descendantsAllSelected(node)"-->
 <!--                [indeterminate]="descendantsPartiallySelected(node)"-->
 <!--                (change)="todoItemSelectionToggle(node)"-->
               <div class="size">2.4kb</div>
+              <div class="progress-wrapper">
+                <div class="progres" *ngIf="file.isSelected"><div class="bar"></div></div>
+              </div>
             </div>
-            <!--            <div class="progres"></div>-->
+
           </li>
         </ul>
         <ul class="folder-tree">
           <li *ngFor="let file of uploadPaths" class="folder-item">
             <div class="name">{{file}}</div>
             <div class="size">2.4kb</div>
-            <div class="progres"></div>
+            <div class="progress-wrapper">
+              <div class="progres">
+                <div class="bar" [ngClass]="{'full': isUploading}">
+                </div>
+              </div>
+            </div>
             <div (click)="deleteAddedFile(file)">X</div>
           </li>
         </ul>
@@ -61,7 +69,7 @@
     </div>
     <div class="text-center m-top-30 m-bott-30">
       <button type="button" class="butt" mat-raised-button (click)="this.dialogRef.close()">Close</button>
-      <button *ngIf="!this.uploadPaths.length" type="button" class="butt butt-success" mat-raised-button >Download</button>
+      <button *ngIf="!this.uploadPaths.length" type="button" class="butt butt-success" mat-raised-button (click)="downloadItems()">Download</button>
       <button *ngIf="this.uploadPaths.length !== 0" type="button" class="butt butt-success" mat-raised-button (click)="uploadItems()">Upload</button>
     </div>
   </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
index dba2d31..d20c10f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
@@ -82,6 +82,8 @@
   }
 
   .directory{
+    max-height: 500px;
+    overflow: auto;
     flex: 2;
     .folder-tree{
       .name{
@@ -103,11 +105,27 @@
       .size{
         flex:1;
       }
-      .progres{
+      .progress-wrapper{
         flex:1;
-        border: 1px solid rgba(0,0,0,.12);
-        height: 15px;
+        .progres{
+          border: 1px solid rgba(0,0,0,.12);
+          height: 15px;
+          position: relative;
+          .bar{
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            width: 0;
+            background-color:  #00bcd4;
+            &.full{
+              width: 100%;
+              transition: 5s ease-in-out;
+            }
+          }
+        }
       }
+
       .action {
         display: flex;
         justify-content: space-around;
@@ -155,6 +173,9 @@
            color: #00bcd4;
            transition: .3s ease-in-out;
          }
+         .mat-checkbox .mat-ripple-element {
+           background-color: #00bcd4 !important;
+         }
        }
      }
    }
@@ -165,6 +186,12 @@
     color: #000;
   }
 
-
+  .check-box {
+    background-color: red;
+  }
 
 }
+
+
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
index 71d9dba..58454cb 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
@@ -41,6 +41,7 @@ export class BucketBrowserComponent implements OnInit {
   // @ViewChild('tabGroupGit', { static: false }) tabGroupGit;
   @ViewChild(FolderTreeComponent, {static: true}) folderTreeComponent;
   private selectedFolder: any;
+  private isUploading: boolean;
 
   constructor(
     public toastr: ToastrService,
@@ -106,17 +107,26 @@ export class BucketBrowserComponent implements OnInit {
     this.uploadPaths.splice(this.uploadPaths.indexOf(file), 1);
   }
 
-  uploadItems(){
-    // this.folderTreeComponent.addNewItem(this.selectedFolder);
+  uploadItems() {
+    this.isUploading = true;
+    setTimeout(() => this.upLoading(), 5000);
+  }
+
+  downloadItems(){
+    this.isUploading = true;
+  }
+
+  upLoading() {
     this.uploadPaths.forEach(v => {
       this.folderTreeComponent.addNewItem(this.selectedFolder, v, true);
     });
     this.uploadPaths = [];
-    // this.folderTreeComponent.saveNode(this.selectedFolder);
-
+    this.isUploading = false;
   }
 }
 
+
+
 // @Component({
 //   selector: 'dialog-result-example-dialog',
 //   template: `
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
index 5b05dea..0d1c480 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
@@ -19,14 +19,14 @@
   <mat-tree-node *matTreeNodeDef="let node; when: hasChild" matTreeNodePadding>
     <button mat-icon-button matTreeNodeToggle
             [attr.aria-label]="'toggle ' + node.filename">
-      <mat-icon class="mat-icon-rtl-mirror">
+      <mat-icon class="mat-icon-rtl-mirror" [ngClass]="{'active-item': selectedFolder === node}">
         {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
       </mat-icon>
     </button>
 <!--    <mat-checkbox [checked]="descendantsAllSelected(node)"-->
 <!--                  [indeterminate]="descendantsPartiallySelected(node)"-->
 <!--                  (change)="todoItemSelectionToggle(node)"></mat-checkbox>-->
-    <div (click)="showItem(node)" class="folder-item-line" [ngClass]="{'active': selectedFolder === node}"><i class="material-icons folder-icon">folder</i> <span class="folder">{{node.item}}</span></div>
+    <div (click)="showItem(node)" class="folder-item-line"  [ngClass]="{'active-item': selectedFolder === node}"><i class="material-icons folder-icon">folder</i> <span class="folder">{{node.item}}</span></div>
 <!--    <button mat-icon-button (click)="addNewItem(node)"><mat-icon>add</mat-icon></button>-->
   </mat-tree-node>
 </mat-tree>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
index 8da2b8d..ffbf47d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
@@ -11,19 +11,27 @@
   display: flex;
   align-items: center;
   cursor: pointer;
-  &.active {
-    //border-bottom: 1px solid #00bcd4;
+
+}
+
+.active-item {
+  //border-bottom: 1px solid #00bcd4;
+  color: #00bcd4;
+  i{
     color: #00bcd4;
-    i{
-      color: #00bcd4;
-    }
+  }
+
 
 }
+
+.mat-tree-node{
+  cursor: pointer;
+  transition: .3s;
   &:hover{
     color: #00bcd4;
     i{
       color: #00bcd4;
     }
   }
-
 }
+


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org