mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-01 02:51:39 -05:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
637dc9b9b2 | ||
|
|
1de16d4715 | ||
|
|
49090d774d | ||
|
|
9a695b5cdd | ||
|
|
e0339b50c0 | ||
|
|
d0c584672f | ||
|
|
27816acaeb | ||
|
|
4de3cc8a09 | ||
|
|
5c16ceb2fa | ||
|
|
9db3f73413 | ||
|
|
e0ceddce09 | ||
|
|
6dc4096299 | ||
|
|
1fa03b5c74 | ||
|
|
f8f57a93c3 | ||
|
|
960fe63312 | ||
|
|
7545b94128 |
@@ -67,7 +67,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.10",
|
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.11",
|
||||||
"opener": "^1.4.3",
|
"opener": "^1.4.3",
|
||||||
"service-downloader": "github:anthonydresser/service-downloader#0.1.5",
|
"service-downloader": "github:anthonydresser/service-downloader#0.1.5",
|
||||||
"vscode-extension-telemetry": "0.0.18",
|
"vscode-extension-telemetry": "0.0.18",
|
||||||
|
|||||||
@@ -5,14 +5,12 @@
|
|||||||
agent-base@4, agent-base@^4.1.0:
|
agent-base@4, agent-base@^4.1.0:
|
||||||
version "4.2.1"
|
version "4.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
|
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
|
||||||
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-promisify "^5.0.0"
|
es6-promisify "^5.0.0"
|
||||||
|
|
||||||
applicationinsights@1.0.1:
|
applicationinsights@1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927"
|
resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927"
|
||||||
integrity sha1-U0Rrgw/o1dYZ7uKieLMdPSUDCSc=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
diagnostic-channel "0.2.0"
|
diagnostic-channel "0.2.0"
|
||||||
diagnostic-channel-publishers "0.2.1"
|
diagnostic-channel-publishers "0.2.1"
|
||||||
@@ -21,12 +19,10 @@ applicationinsights@1.0.1:
|
|||||||
base64-js@0.0.8:
|
base64-js@0.0.8:
|
||||||
version "0.0.8"
|
version "0.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
|
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
|
||||||
integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=
|
|
||||||
|
|
||||||
bl@^1.0.0:
|
bl@^1.0.0:
|
||||||
version "1.2.2"
|
version "1.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
|
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
|
||||||
integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
readable-stream "^2.3.5"
|
readable-stream "^2.3.5"
|
||||||
safe-buffer "^5.1.1"
|
safe-buffer "^5.1.1"
|
||||||
@@ -34,12 +30,10 @@ bl@^1.0.0:
|
|||||||
buffer-alloc-unsafe@^1.1.0:
|
buffer-alloc-unsafe@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
||||||
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
|
|
||||||
|
|
||||||
buffer-alloc@^1.2.0:
|
buffer-alloc@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
||||||
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer-alloc-unsafe "^1.1.0"
|
buffer-alloc-unsafe "^1.1.0"
|
||||||
buffer-fill "^1.0.0"
|
buffer-fill "^1.0.0"
|
||||||
@@ -47,17 +41,14 @@ buffer-alloc@^1.2.0:
|
|||||||
buffer-crc32@~0.2.3:
|
buffer-crc32@~0.2.3:
|
||||||
version "0.2.13"
|
version "0.2.13"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||||
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
|
|
||||||
|
|
||||||
buffer-fill@^1.0.0:
|
buffer-fill@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
||||||
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
|
|
||||||
|
|
||||||
buffer@^3.0.1:
|
buffer@^3.0.1:
|
||||||
version "3.6.0"
|
version "3.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
|
resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
|
||||||
integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
base64-js "0.0.8"
|
base64-js "0.0.8"
|
||||||
ieee754 "^1.1.4"
|
ieee754 "^1.1.4"
|
||||||
@@ -66,39 +57,34 @@ buffer@^3.0.1:
|
|||||||
commander@~2.8.1:
|
commander@~2.8.1:
|
||||||
version "2.8.1"
|
version "2.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
||||||
integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-readlink ">= 1.0.0"
|
graceful-readlink ">= 1.0.0"
|
||||||
|
|
||||||
core-util-is@~1.0.0:
|
core-util-is@~1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
|
||||||
|
|
||||||
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.10":
|
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.11":
|
||||||
version "0.2.10"
|
version "0.2.11"
|
||||||
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/4de3f7caf0eba54159911b977ddb4f5d7c0a9ca8"
|
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/bc80d2226699d23f45a2ec26129cbcdee4781ca9"
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-languageclient "3.5.1"
|
vscode-languageclient "3.5.1"
|
||||||
|
|
||||||
debug@3.1.0:
|
debug@3.1.0:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
||||||
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
debug@^3.1.0:
|
debug@^3.1.0:
|
||||||
version "3.2.6"
|
version "3.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
|
||||||
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
ms "^2.1.1"
|
ms "^2.1.1"
|
||||||
|
|
||||||
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
|
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
|
||||||
integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
file-type "^5.2.0"
|
file-type "^5.2.0"
|
||||||
is-stream "^1.1.0"
|
is-stream "^1.1.0"
|
||||||
@@ -107,7 +93,6 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
|||||||
decompress-tarbz2@^4.0.0:
|
decompress-tarbz2@^4.0.0:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
|
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
|
||||||
integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decompress-tar "^4.1.0"
|
decompress-tar "^4.1.0"
|
||||||
file-type "^6.1.0"
|
file-type "^6.1.0"
|
||||||
@@ -118,7 +103,6 @@ decompress-tarbz2@^4.0.0:
|
|||||||
decompress-targz@^4.0.0:
|
decompress-targz@^4.0.0:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
|
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
|
||||||
integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decompress-tar "^4.1.1"
|
decompress-tar "^4.1.1"
|
||||||
file-type "^5.2.0"
|
file-type "^5.2.0"
|
||||||
@@ -127,7 +111,6 @@ decompress-targz@^4.0.0:
|
|||||||
decompress-unzip@^4.0.1:
|
decompress-unzip@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
|
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
|
||||||
integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
file-type "^3.8.0"
|
file-type "^3.8.0"
|
||||||
get-stream "^2.2.0"
|
get-stream "^2.2.0"
|
||||||
@@ -137,7 +120,6 @@ decompress-unzip@^4.0.1:
|
|||||||
decompress@^4.2.0:
|
decompress@^4.2.0:
|
||||||
version "4.2.0"
|
version "4.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
|
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
|
||||||
integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decompress-tar "^4.0.0"
|
decompress-tar "^4.0.0"
|
||||||
decompress-tarbz2 "^4.0.0"
|
decompress-tarbz2 "^4.0.0"
|
||||||
@@ -151,70 +133,58 @@ decompress@^4.2.0:
|
|||||||
diagnostic-channel-publishers@0.2.1:
|
diagnostic-channel-publishers@0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3"
|
resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3"
|
||||||
integrity sha1-ji1geottef6IC1SLxYzGvrKIxPM=
|
|
||||||
|
|
||||||
diagnostic-channel@0.2.0:
|
diagnostic-channel@0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17"
|
resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17"
|
||||||
integrity sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
|
|
||||||
end-of-stream@^1.0.0:
|
end-of-stream@^1.0.0:
|
||||||
version "1.4.1"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
|
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
|
||||||
integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
once "^1.4.0"
|
once "^1.4.0"
|
||||||
|
|
||||||
es6-promise@^4.0.3:
|
es6-promise@^4.0.3:
|
||||||
version "4.2.5"
|
version "4.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
|
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
|
||||||
integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
|
|
||||||
|
|
||||||
es6-promisify@^5.0.0:
|
es6-promisify@^5.0.0:
|
||||||
version "5.0.0"
|
version "5.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
|
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
|
||||||
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-promise "^4.0.3"
|
es6-promise "^4.0.3"
|
||||||
|
|
||||||
eventemitter2@^5.0.1:
|
eventemitter2@^5.0.1:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
|
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
|
||||||
integrity sha1-YZegldX7a1folC9v1+qtY6CclFI=
|
|
||||||
|
|
||||||
fd-slicer@~1.1.0:
|
fd-slicer@~1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
|
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
|
||||||
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
pend "~1.2.0"
|
pend "~1.2.0"
|
||||||
|
|
||||||
file-type@^3.8.0:
|
file-type@^3.8.0:
|
||||||
version "3.9.0"
|
version "3.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
||||||
integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
|
|
||||||
|
|
||||||
file-type@^5.2.0:
|
file-type@^5.2.0:
|
||||||
version "5.2.0"
|
version "5.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
|
||||||
integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
|
|
||||||
|
|
||||||
file-type@^6.1.0:
|
file-type@^6.1.0:
|
||||||
version "6.2.0"
|
version "6.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
|
||||||
integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
|
|
||||||
|
|
||||||
fs-constants@^1.0.0:
|
fs-constants@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
|
||||||
|
|
||||||
get-stream@^2.2.0:
|
get-stream@^2.2.0:
|
||||||
version "2.3.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
|
||||||
integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
object-assign "^4.0.1"
|
object-assign "^4.0.1"
|
||||||
pinkie-promise "^2.0.0"
|
pinkie-promise "^2.0.0"
|
||||||
@@ -222,17 +192,14 @@ get-stream@^2.2.0:
|
|||||||
graceful-fs@^4.1.10:
|
graceful-fs@^4.1.10:
|
||||||
version "4.1.15"
|
version "4.1.15"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
|
||||||
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
|
|
||||||
|
|
||||||
"graceful-readlink@>= 1.0.0":
|
"graceful-readlink@>= 1.0.0":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
||||||
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
|
||||||
|
|
||||||
http-proxy-agent@^2.1.0:
|
http-proxy-agent@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
|
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
|
||||||
integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base "4"
|
agent-base "4"
|
||||||
debug "3.1.0"
|
debug "3.1.0"
|
||||||
@@ -240,7 +207,6 @@ http-proxy-agent@^2.1.0:
|
|||||||
https-proxy-agent@^2.2.1:
|
https-proxy-agent@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
|
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
|
||||||
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base "^4.1.0"
|
agent-base "^4.1.0"
|
||||||
debug "^3.1.0"
|
debug "^3.1.0"
|
||||||
@@ -248,115 +214,94 @@ https-proxy-agent@^2.2.1:
|
|||||||
ieee754@^1.1.4:
|
ieee754@^1.1.4:
|
||||||
version "1.1.12"
|
version "1.1.12"
|
||||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
|
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
|
||||||
integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
|
|
||||||
|
|
||||||
inherits@~2.0.3:
|
inherits@~2.0.3:
|
||||||
version "2.0.3"
|
version "2.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||||
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
|
||||||
|
|
||||||
is-natural-number@^4.0.1:
|
is-natural-number@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
||||||
integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
|
|
||||||
|
|
||||||
is-stream@^1.1.0:
|
is-stream@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
|
||||||
|
|
||||||
isarray@^1.0.0, isarray@~1.0.0:
|
isarray@^1.0.0, isarray@~1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||||
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
|
||||||
|
|
||||||
make-dir@^1.0.0:
|
make-dir@^1.0.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
|
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
|
||||||
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
pify "^3.0.0"
|
pify "^3.0.0"
|
||||||
|
|
||||||
minimist@0.0.8:
|
minimist@0.0.8:
|
||||||
version "0.0.8"
|
version "0.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
|
||||||
|
|
||||||
mkdirp@^0.5.1:
|
mkdirp@^0.5.1:
|
||||||
version "0.5.1"
|
version "0.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
minimist "0.0.8"
|
minimist "0.0.8"
|
||||||
|
|
||||||
ms@2.0.0:
|
ms@2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
|
||||||
|
|
||||||
ms@^2.1.1:
|
ms@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
|
||||||
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
|
|
||||||
|
|
||||||
object-assign@^4.0.1:
|
object-assign@^4.0.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
|
||||||
|
|
||||||
once@^1.4.0:
|
once@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
opener@^1.4.3:
|
opener@^1.4.3:
|
||||||
version "1.5.1"
|
version "1.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
|
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
|
||||||
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
|
|
||||||
|
|
||||||
os-tmpdir@~1.0.2:
|
os-tmpdir@~1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
||||||
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
|
|
||||||
|
|
||||||
pend@~1.2.0:
|
pend@~1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||||
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
|
|
||||||
|
|
||||||
pify@^2.3.0:
|
pify@^2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||||
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
|
|
||||||
|
|
||||||
pify@^3.0.0:
|
pify@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
|
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
|
||||||
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
|
|
||||||
|
|
||||||
pinkie-promise@^2.0.0:
|
pinkie-promise@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
|
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
|
||||||
integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
pinkie "^2.0.0"
|
pinkie "^2.0.0"
|
||||||
|
|
||||||
pinkie@^2.0.0:
|
pinkie@^2.0.0:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
||||||
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
|
|
||||||
|
|
||||||
process-nextick-args@~2.0.0:
|
process-nextick-args@~2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
|
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
|
||||||
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
|
|
||||||
|
|
||||||
readable-stream@^2.3.0, readable-stream@^2.3.5:
|
readable-stream@^2.3.0, readable-stream@^2.3.5:
|
||||||
version "2.3.6"
|
version "2.3.6"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
||||||
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
core-util-is "~1.0.0"
|
core-util-is "~1.0.0"
|
||||||
inherits "~2.0.3"
|
inherits "~2.0.3"
|
||||||
@@ -369,19 +314,16 @@ readable-stream@^2.3.0, readable-stream@^2.3.5:
|
|||||||
safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
|
||||||
|
|
||||||
seek-bzip@^1.0.5:
|
seek-bzip@^1.0.5:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
|
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
|
||||||
integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
commander "~2.8.1"
|
commander "~2.8.1"
|
||||||
|
|
||||||
semver@^5.3.0:
|
semver@^5.3.0:
|
||||||
version "5.6.0"
|
version "5.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
|
||||||
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
|
|
||||||
|
|
||||||
"service-downloader@github:anthonydresser/service-downloader#0.1.5":
|
"service-downloader@github:anthonydresser/service-downloader#0.1.5":
|
||||||
version "0.1.5"
|
version "0.1.5"
|
||||||
@@ -397,21 +339,18 @@ semver@^5.3.0:
|
|||||||
string_decoder@~1.1.1:
|
string_decoder@~1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
||||||
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
strip-dirs@^2.0.0:
|
strip-dirs@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
|
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
|
||||||
integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
is-natural-number "^4.0.1"
|
is-natural-number "^4.0.1"
|
||||||
|
|
||||||
tar-stream@^1.5.2:
|
tar-stream@^1.5.2:
|
||||||
version "1.6.2"
|
version "1.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
|
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
|
||||||
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
bl "^1.0.0"
|
bl "^1.0.0"
|
||||||
buffer-alloc "^1.2.0"
|
buffer-alloc "^1.2.0"
|
||||||
@@ -424,24 +363,20 @@ tar-stream@^1.5.2:
|
|||||||
through@^2.3.6:
|
through@^2.3.6:
|
||||||
version "2.3.8"
|
version "2.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
|
||||||
|
|
||||||
tmp@^0.0.33:
|
tmp@^0.0.33:
|
||||||
version "0.0.33"
|
version "0.0.33"
|
||||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
|
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
|
||||||
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
os-tmpdir "~1.0.2"
|
os-tmpdir "~1.0.2"
|
||||||
|
|
||||||
to-buffer@^1.1.1:
|
to-buffer@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
||||||
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
|
|
||||||
|
|
||||||
unbzip2-stream@^1.0.9:
|
unbzip2-stream@^1.0.9:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1"
|
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1"
|
||||||
integrity sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer "^3.0.1"
|
buffer "^3.0.1"
|
||||||
through "^2.3.6"
|
through "^2.3.6"
|
||||||
@@ -449,31 +384,26 @@ unbzip2-stream@^1.0.9:
|
|||||||
util-deprecate@~1.0.1:
|
util-deprecate@~1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||||
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
|
||||||
|
|
||||||
vscode-extension-telemetry@0.0.18:
|
vscode-extension-telemetry@0.0.18:
|
||||||
version "0.0.18"
|
version "0.0.18"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327"
|
resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327"
|
||||||
integrity sha512-Vw3Sr+dZwl+c6PlsUwrTtCOJkgrmvS3OUVDQGcmpXWAgq9xGq6as0K4pUx+aGqTjzLAESmWSrs6HlJm6J6Khcg==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
applicationinsights "1.0.1"
|
applicationinsights "1.0.1"
|
||||||
|
|
||||||
vscode-jsonrpc@3.5.0:
|
vscode-jsonrpc@3.5.0:
|
||||||
version "3.5.0"
|
version "3.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa"
|
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa"
|
||||||
integrity sha1-hyOdnhZrLXNSJFuKgTWXgEwdY6o=
|
|
||||||
|
|
||||||
vscode-languageclient@3.5.1:
|
vscode-languageclient@3.5.1:
|
||||||
version "3.5.1"
|
version "3.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.1.tgz#c78e582459c24e58f88020dfa34065e976186a98"
|
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.1.tgz#c78e582459c24e58f88020dfa34065e976186a98"
|
||||||
integrity sha512-GTQ+hSq/o4c/y6GYmyP9XNrVoIu0NFZ67KltSkqN+tO0eUNDIlrVNX+3DJzzyLhSsrctuGzuYWm3t87mNAcBmQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-languageserver-protocol "3.5.1"
|
vscode-languageserver-protocol "3.5.1"
|
||||||
|
|
||||||
vscode-languageserver-protocol@3.5.1:
|
vscode-languageserver-protocol@3.5.1:
|
||||||
version "3.5.1"
|
version "3.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.1.tgz#5144a3a9eeccbd83fe2745bd4ed75fad6cc45f0d"
|
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.1.tgz#5144a3a9eeccbd83fe2745bd4ed75fad6cc45f0d"
|
||||||
integrity sha512-1fPDIwsAv1difCV+8daOrJEGunClNJWqnUHq/ncWrjhitKWXgGmRCjlwZ3gDUTt54yRcvXz1PXJDaRNvNH6pYA==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-jsonrpc "3.5.0"
|
vscode-jsonrpc "3.5.0"
|
||||||
vscode-languageserver-types "3.5.0"
|
vscode-languageserver-types "3.5.0"
|
||||||
@@ -481,27 +411,22 @@ vscode-languageserver-protocol@3.5.1:
|
|||||||
vscode-languageserver-types@3.5.0:
|
vscode-languageserver-types@3.5.0:
|
||||||
version "3.5.0"
|
version "3.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374"
|
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374"
|
||||||
integrity sha1-5I15li8LjgLelV4/UkkI4rGcA3Q=
|
|
||||||
|
|
||||||
vscode-nls@^3.2.1:
|
vscode-nls@^3.2.1:
|
||||||
version "3.2.5"
|
version "3.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.5.tgz#25520c1955108036dec607c85e00a522f247f1a4"
|
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.5.tgz#25520c1955108036dec607c85e00a522f247f1a4"
|
||||||
integrity sha512-ITtoh3V4AkWXMmp3TB97vsMaHRgHhsSFPsUdzlueSL+dRZbSNTZeOmdQv60kjCV306ghPxhDeoNUEm3+EZMuyw==
|
|
||||||
|
|
||||||
wrappy@1:
|
wrappy@1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
|
||||||
|
|
||||||
xtend@^4.0.0:
|
xtend@^4.0.0:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
|
||||||
|
|
||||||
yauzl@^2.4.2:
|
yauzl@^2.4.2:
|
||||||
version "2.10.0"
|
version "2.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
||||||
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer-crc32 "~0.2.3"
|
buffer-crc32 "~0.2.3"
|
||||||
fd-slicer "~1.1.0"
|
fd-slicer "~1.1.0"
|
||||||
@@ -509,4 +434,3 @@ yauzl@^2.4.2:
|
|||||||
zone.js@0.7.6:
|
zone.js@0.7.6:
|
||||||
version "0.7.6"
|
version "0.7.6"
|
||||||
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
|
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
|
||||||
integrity sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
"update-grammar": "node ../../build/npm/update-grammar.js Microsoft/vscode-mssql syntaxes/SQL.plist ./syntaxes/sql.tmLanguage.json"
|
"update-grammar": "node ../../build/npm/update-grammar.js Microsoft/vscode-mssql syntaxes/SQL.plist ./syntaxes/sql.tmLanguage.json"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.10",
|
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.11",
|
||||||
"opener": "^1.4.3",
|
"opener": "^1.4.3",
|
||||||
"service-downloader": "github:anthonydresser/service-downloader#0.1.5",
|
"service-downloader": "github:anthonydresser/service-downloader#0.1.5",
|
||||||
"vscode-extension-telemetry": "^0.0.15"
|
"vscode-extension-telemetry": "^0.0.15"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
|
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
|
||||||
"version": "1.5.0-alpha.63",
|
"version": "1.5.0-alpha.65",
|
||||||
"downloadFileNames": {
|
"downloadFileNames": {
|
||||||
"Windows_86": "win-x86-netcoreapp2.2.zip",
|
"Windows_86": "win-x86-netcoreapp2.2.zip",
|
||||||
"Windows_64": "win-x64-netcoreapp2.2.zip",
|
"Windows_64": "win-x64-netcoreapp2.2.zip",
|
||||||
|
|||||||
@@ -5,14 +5,12 @@
|
|||||||
agent-base@4, agent-base@^4.1.0:
|
agent-base@4, agent-base@^4.1.0:
|
||||||
version "4.2.1"
|
version "4.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
|
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
|
||||||
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-promisify "^5.0.0"
|
es6-promisify "^5.0.0"
|
||||||
|
|
||||||
applicationinsights@1.0.1:
|
applicationinsights@1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927"
|
resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927"
|
||||||
integrity sha1-U0Rrgw/o1dYZ7uKieLMdPSUDCSc=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
diagnostic-channel "0.2.0"
|
diagnostic-channel "0.2.0"
|
||||||
diagnostic-channel-publishers "0.2.1"
|
diagnostic-channel-publishers "0.2.1"
|
||||||
@@ -21,12 +19,10 @@ applicationinsights@1.0.1:
|
|||||||
base64-js@0.0.8:
|
base64-js@0.0.8:
|
||||||
version "0.0.8"
|
version "0.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
|
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
|
||||||
integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=
|
|
||||||
|
|
||||||
bl@^1.0.0:
|
bl@^1.0.0:
|
||||||
version "1.2.2"
|
version "1.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
|
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
|
||||||
integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
readable-stream "^2.3.5"
|
readable-stream "^2.3.5"
|
||||||
safe-buffer "^5.1.1"
|
safe-buffer "^5.1.1"
|
||||||
@@ -34,12 +30,10 @@ bl@^1.0.0:
|
|||||||
buffer-alloc-unsafe@^1.1.0:
|
buffer-alloc-unsafe@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
||||||
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
|
|
||||||
|
|
||||||
buffer-alloc@^1.2.0:
|
buffer-alloc@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
||||||
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer-alloc-unsafe "^1.1.0"
|
buffer-alloc-unsafe "^1.1.0"
|
||||||
buffer-fill "^1.0.0"
|
buffer-fill "^1.0.0"
|
||||||
@@ -47,17 +41,14 @@ buffer-alloc@^1.2.0:
|
|||||||
buffer-crc32@~0.2.3:
|
buffer-crc32@~0.2.3:
|
||||||
version "0.2.13"
|
version "0.2.13"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||||
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
|
|
||||||
|
|
||||||
buffer-fill@^1.0.0:
|
buffer-fill@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
||||||
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
|
|
||||||
|
|
||||||
buffer@^3.0.1:
|
buffer@^3.0.1:
|
||||||
version "3.6.0"
|
version "3.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
|
resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
|
||||||
integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
base64-js "0.0.8"
|
base64-js "0.0.8"
|
||||||
ieee754 "^1.1.4"
|
ieee754 "^1.1.4"
|
||||||
@@ -66,39 +57,34 @@ buffer@^3.0.1:
|
|||||||
commander@~2.8.1:
|
commander@~2.8.1:
|
||||||
version "2.8.1"
|
version "2.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
||||||
integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-readlink ">= 1.0.0"
|
graceful-readlink ">= 1.0.0"
|
||||||
|
|
||||||
core-util-is@~1.0.0:
|
core-util-is@~1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
|
||||||
|
|
||||||
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.10":
|
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.11":
|
||||||
version "0.2.10"
|
version "0.2.11"
|
||||||
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/4de3f7caf0eba54159911b977ddb4f5d7c0a9ca8"
|
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/bc80d2226699d23f45a2ec26129cbcdee4781ca9"
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-languageclient "3.5.1"
|
vscode-languageclient "3.5.1"
|
||||||
|
|
||||||
debug@3.1.0:
|
debug@3.1.0:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
||||||
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
debug@^3.1.0:
|
debug@^3.1.0:
|
||||||
version "3.2.6"
|
version "3.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
|
||||||
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
ms "^2.1.1"
|
ms "^2.1.1"
|
||||||
|
|
||||||
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
|
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
|
||||||
integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
file-type "^5.2.0"
|
file-type "^5.2.0"
|
||||||
is-stream "^1.1.0"
|
is-stream "^1.1.0"
|
||||||
@@ -107,7 +93,6 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
|||||||
decompress-tarbz2@^4.0.0:
|
decompress-tarbz2@^4.0.0:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
|
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
|
||||||
integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decompress-tar "^4.1.0"
|
decompress-tar "^4.1.0"
|
||||||
file-type "^6.1.0"
|
file-type "^6.1.0"
|
||||||
@@ -118,7 +103,6 @@ decompress-tarbz2@^4.0.0:
|
|||||||
decompress-targz@^4.0.0:
|
decompress-targz@^4.0.0:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
|
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
|
||||||
integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decompress-tar "^4.1.1"
|
decompress-tar "^4.1.1"
|
||||||
file-type "^5.2.0"
|
file-type "^5.2.0"
|
||||||
@@ -127,7 +111,6 @@ decompress-targz@^4.0.0:
|
|||||||
decompress-unzip@^4.0.1:
|
decompress-unzip@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
|
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
|
||||||
integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
file-type "^3.8.0"
|
file-type "^3.8.0"
|
||||||
get-stream "^2.2.0"
|
get-stream "^2.2.0"
|
||||||
@@ -137,7 +120,6 @@ decompress-unzip@^4.0.1:
|
|||||||
decompress@^4.2.0:
|
decompress@^4.2.0:
|
||||||
version "4.2.0"
|
version "4.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
|
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
|
||||||
integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
decompress-tar "^4.0.0"
|
decompress-tar "^4.0.0"
|
||||||
decompress-tarbz2 "^4.0.0"
|
decompress-tarbz2 "^4.0.0"
|
||||||
@@ -151,70 +133,58 @@ decompress@^4.2.0:
|
|||||||
diagnostic-channel-publishers@0.2.1:
|
diagnostic-channel-publishers@0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3"
|
resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3"
|
||||||
integrity sha1-ji1geottef6IC1SLxYzGvrKIxPM=
|
|
||||||
|
|
||||||
diagnostic-channel@0.2.0:
|
diagnostic-channel@0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17"
|
resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17"
|
||||||
integrity sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
|
|
||||||
end-of-stream@^1.0.0:
|
end-of-stream@^1.0.0:
|
||||||
version "1.4.1"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
|
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
|
||||||
integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
once "^1.4.0"
|
once "^1.4.0"
|
||||||
|
|
||||||
es6-promise@^4.0.3:
|
es6-promise@^4.0.3:
|
||||||
version "4.2.5"
|
version "4.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
|
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
|
||||||
integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
|
|
||||||
|
|
||||||
es6-promisify@^5.0.0:
|
es6-promisify@^5.0.0:
|
||||||
version "5.0.0"
|
version "5.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
|
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
|
||||||
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
es6-promise "^4.0.3"
|
es6-promise "^4.0.3"
|
||||||
|
|
||||||
eventemitter2@^5.0.1:
|
eventemitter2@^5.0.1:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
|
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
|
||||||
integrity sha1-YZegldX7a1folC9v1+qtY6CclFI=
|
|
||||||
|
|
||||||
fd-slicer@~1.1.0:
|
fd-slicer@~1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
|
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
|
||||||
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
pend "~1.2.0"
|
pend "~1.2.0"
|
||||||
|
|
||||||
file-type@^3.8.0:
|
file-type@^3.8.0:
|
||||||
version "3.9.0"
|
version "3.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
||||||
integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
|
|
||||||
|
|
||||||
file-type@^5.2.0:
|
file-type@^5.2.0:
|
||||||
version "5.2.0"
|
version "5.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
|
||||||
integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
|
|
||||||
|
|
||||||
file-type@^6.1.0:
|
file-type@^6.1.0:
|
||||||
version "6.2.0"
|
version "6.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
|
||||||
integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
|
|
||||||
|
|
||||||
fs-constants@^1.0.0:
|
fs-constants@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
|
||||||
|
|
||||||
get-stream@^2.2.0:
|
get-stream@^2.2.0:
|
||||||
version "2.3.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
|
||||||
integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
object-assign "^4.0.1"
|
object-assign "^4.0.1"
|
||||||
pinkie-promise "^2.0.0"
|
pinkie-promise "^2.0.0"
|
||||||
@@ -222,17 +192,14 @@ get-stream@^2.2.0:
|
|||||||
graceful-fs@^4.1.10:
|
graceful-fs@^4.1.10:
|
||||||
version "4.1.15"
|
version "4.1.15"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
|
||||||
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
|
|
||||||
|
|
||||||
"graceful-readlink@>= 1.0.0":
|
"graceful-readlink@>= 1.0.0":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
||||||
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
|
||||||
|
|
||||||
http-proxy-agent@^2.1.0:
|
http-proxy-agent@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
|
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
|
||||||
integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base "4"
|
agent-base "4"
|
||||||
debug "3.1.0"
|
debug "3.1.0"
|
||||||
@@ -240,7 +207,6 @@ http-proxy-agent@^2.1.0:
|
|||||||
https-proxy-agent@^2.2.1:
|
https-proxy-agent@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
|
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
|
||||||
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base "^4.1.0"
|
agent-base "^4.1.0"
|
||||||
debug "^3.1.0"
|
debug "^3.1.0"
|
||||||
@@ -248,115 +214,94 @@ https-proxy-agent@^2.2.1:
|
|||||||
ieee754@^1.1.4:
|
ieee754@^1.1.4:
|
||||||
version "1.1.12"
|
version "1.1.12"
|
||||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
|
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
|
||||||
integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
|
|
||||||
|
|
||||||
inherits@~2.0.3:
|
inherits@~2.0.3:
|
||||||
version "2.0.3"
|
version "2.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||||
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
|
||||||
|
|
||||||
is-natural-number@^4.0.1:
|
is-natural-number@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
||||||
integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
|
|
||||||
|
|
||||||
is-stream@^1.1.0:
|
is-stream@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
|
||||||
|
|
||||||
isarray@^1.0.0, isarray@~1.0.0:
|
isarray@^1.0.0, isarray@~1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||||
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
|
||||||
|
|
||||||
make-dir@^1.0.0:
|
make-dir@^1.0.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
|
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
|
||||||
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
pify "^3.0.0"
|
pify "^3.0.0"
|
||||||
|
|
||||||
minimist@0.0.8:
|
minimist@0.0.8:
|
||||||
version "0.0.8"
|
version "0.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
|
||||||
|
|
||||||
mkdirp@^0.5.1:
|
mkdirp@^0.5.1:
|
||||||
version "0.5.1"
|
version "0.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
minimist "0.0.8"
|
minimist "0.0.8"
|
||||||
|
|
||||||
ms@2.0.0:
|
ms@2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
|
||||||
|
|
||||||
ms@^2.1.1:
|
ms@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
|
||||||
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
|
|
||||||
|
|
||||||
object-assign@^4.0.1:
|
object-assign@^4.0.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
|
||||||
|
|
||||||
once@^1.4.0:
|
once@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
opener@^1.4.3:
|
opener@^1.4.3:
|
||||||
version "1.5.1"
|
version "1.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
|
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
|
||||||
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
|
|
||||||
|
|
||||||
os-tmpdir@~1.0.2:
|
os-tmpdir@~1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
||||||
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
|
|
||||||
|
|
||||||
pend@~1.2.0:
|
pend@~1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||||
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
|
|
||||||
|
|
||||||
pify@^2.3.0:
|
pify@^2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||||
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
|
|
||||||
|
|
||||||
pify@^3.0.0:
|
pify@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
|
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
|
||||||
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
|
|
||||||
|
|
||||||
pinkie-promise@^2.0.0:
|
pinkie-promise@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
|
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
|
||||||
integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
pinkie "^2.0.0"
|
pinkie "^2.0.0"
|
||||||
|
|
||||||
pinkie@^2.0.0:
|
pinkie@^2.0.0:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
||||||
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
|
|
||||||
|
|
||||||
process-nextick-args@~2.0.0:
|
process-nextick-args@~2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
|
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
|
||||||
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
|
|
||||||
|
|
||||||
readable-stream@^2.3.0, readable-stream@^2.3.5:
|
readable-stream@^2.3.0, readable-stream@^2.3.5:
|
||||||
version "2.3.6"
|
version "2.3.6"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
||||||
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
core-util-is "~1.0.0"
|
core-util-is "~1.0.0"
|
||||||
inherits "~2.0.3"
|
inherits "~2.0.3"
|
||||||
@@ -369,19 +314,16 @@ readable-stream@^2.3.0, readable-stream@^2.3.5:
|
|||||||
safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
|
||||||
|
|
||||||
seek-bzip@^1.0.5:
|
seek-bzip@^1.0.5:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
|
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
|
||||||
integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
commander "~2.8.1"
|
commander "~2.8.1"
|
||||||
|
|
||||||
semver@^5.3.0:
|
semver@^5.3.0:
|
||||||
version "5.6.0"
|
version "5.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
|
||||||
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
|
|
||||||
|
|
||||||
"service-downloader@github:anthonydresser/service-downloader#0.1.5":
|
"service-downloader@github:anthonydresser/service-downloader#0.1.5":
|
||||||
version "0.1.5"
|
version "0.1.5"
|
||||||
@@ -397,21 +339,18 @@ semver@^5.3.0:
|
|||||||
string_decoder@~1.1.1:
|
string_decoder@~1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
||||||
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
strip-dirs@^2.0.0:
|
strip-dirs@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
|
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
|
||||||
integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
is-natural-number "^4.0.1"
|
is-natural-number "^4.0.1"
|
||||||
|
|
||||||
tar-stream@^1.5.2:
|
tar-stream@^1.5.2:
|
||||||
version "1.6.2"
|
version "1.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
|
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
|
||||||
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
bl "^1.0.0"
|
bl "^1.0.0"
|
||||||
buffer-alloc "^1.2.0"
|
buffer-alloc "^1.2.0"
|
||||||
@@ -424,24 +363,20 @@ tar-stream@^1.5.2:
|
|||||||
through@^2.3.6:
|
through@^2.3.6:
|
||||||
version "2.3.8"
|
version "2.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
|
||||||
|
|
||||||
tmp@^0.0.33:
|
tmp@^0.0.33:
|
||||||
version "0.0.33"
|
version "0.0.33"
|
||||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
|
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
|
||||||
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
os-tmpdir "~1.0.2"
|
os-tmpdir "~1.0.2"
|
||||||
|
|
||||||
to-buffer@^1.1.1:
|
to-buffer@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
||||||
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
|
|
||||||
|
|
||||||
unbzip2-stream@^1.0.9:
|
unbzip2-stream@^1.0.9:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1"
|
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1"
|
||||||
integrity sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer "^3.0.1"
|
buffer "^3.0.1"
|
||||||
through "^2.3.6"
|
through "^2.3.6"
|
||||||
@@ -449,31 +384,26 @@ unbzip2-stream@^1.0.9:
|
|||||||
util-deprecate@~1.0.1:
|
util-deprecate@~1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||||
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
|
||||||
|
|
||||||
vscode-extension-telemetry@^0.0.15:
|
vscode-extension-telemetry@^0.0.15:
|
||||||
version "0.0.15"
|
version "0.0.15"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856"
|
resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856"
|
||||||
integrity sha512-Yf6dL9r2x2GISI1xh22XsAaydSTQG/4aBitu8sGBwGr42n2TyOsIXGtXSDgqQBNZgYD6+P1EHqrrzetn9ekWTQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
applicationinsights "1.0.1"
|
applicationinsights "1.0.1"
|
||||||
|
|
||||||
vscode-jsonrpc@3.5.0:
|
vscode-jsonrpc@3.5.0:
|
||||||
version "3.5.0"
|
version "3.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa"
|
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa"
|
||||||
integrity sha1-hyOdnhZrLXNSJFuKgTWXgEwdY6o=
|
|
||||||
|
|
||||||
vscode-languageclient@3.5.1:
|
vscode-languageclient@3.5.1:
|
||||||
version "3.5.1"
|
version "3.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.1.tgz#c78e582459c24e58f88020dfa34065e976186a98"
|
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.1.tgz#c78e582459c24e58f88020dfa34065e976186a98"
|
||||||
integrity sha512-GTQ+hSq/o4c/y6GYmyP9XNrVoIu0NFZ67KltSkqN+tO0eUNDIlrVNX+3DJzzyLhSsrctuGzuYWm3t87mNAcBmQ==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-languageserver-protocol "3.5.1"
|
vscode-languageserver-protocol "3.5.1"
|
||||||
|
|
||||||
vscode-languageserver-protocol@3.5.1:
|
vscode-languageserver-protocol@3.5.1:
|
||||||
version "3.5.1"
|
version "3.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.1.tgz#5144a3a9eeccbd83fe2745bd4ed75fad6cc45f0d"
|
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.1.tgz#5144a3a9eeccbd83fe2745bd4ed75fad6cc45f0d"
|
||||||
integrity sha512-1fPDIwsAv1difCV+8daOrJEGunClNJWqnUHq/ncWrjhitKWXgGmRCjlwZ3gDUTt54yRcvXz1PXJDaRNvNH6pYA==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-jsonrpc "3.5.0"
|
vscode-jsonrpc "3.5.0"
|
||||||
vscode-languageserver-types "3.5.0"
|
vscode-languageserver-types "3.5.0"
|
||||||
@@ -481,22 +411,18 @@ vscode-languageserver-protocol@3.5.1:
|
|||||||
vscode-languageserver-types@3.5.0:
|
vscode-languageserver-types@3.5.0:
|
||||||
version "3.5.0"
|
version "3.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374"
|
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374"
|
||||||
integrity sha1-5I15li8LjgLelV4/UkkI4rGcA3Q=
|
|
||||||
|
|
||||||
wrappy@1:
|
wrappy@1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
|
||||||
|
|
||||||
xtend@^4.0.0:
|
xtend@^4.0.0:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
|
||||||
|
|
||||||
yauzl@^2.4.2:
|
yauzl@^2.4.2:
|
||||||
version "2.10.0"
|
version "2.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
||||||
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
|
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer-crc32 "~0.2.3"
|
buffer-crc32 "~0.2.3"
|
||||||
fd-slicer "~1.1.0"
|
fd-slicer "~1.1.0"
|
||||||
@@ -504,4 +430,3 @@ yauzl@^2.4.2:
|
|||||||
zone.js@0.7.6:
|
zone.js@0.7.6:
|
||||||
version "0.7.6"
|
version "0.7.6"
|
||||||
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
|
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
|
||||||
integrity sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=
|
|
||||||
|
|||||||
@@ -21,6 +21,11 @@
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true,
|
"default": true,
|
||||||
"description": "%notebook.enabled.description%"
|
"description": "%notebook.enabled.description%"
|
||||||
|
},
|
||||||
|
"notebook.pythonPath": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "",
|
||||||
|
"description": "%notebook.pythonPath.description%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
"description": "Defines the Data-procotol based Notebook contribution and many Notebook commands and contributions.",
|
"description": "Defines the Data-procotol based Notebook contribution and many Notebook commands and contributions.",
|
||||||
"notebook.configuration.title": "Notebook configuration",
|
"notebook.configuration.title": "Notebook configuration",
|
||||||
"notebook.enabled.description": "Enable viewing notebook files using built-in notebook editor.",
|
"notebook.enabled.description": "Enable viewing notebook files using built-in notebook editor.",
|
||||||
|
"notebook.pythonPath.description": "Local path to python installation used by Notebooks.",
|
||||||
"notebook.command.new": "New Notebook",
|
"notebook.command.new": "New Notebook",
|
||||||
"notebook.command.open": "Open Notebook"
|
"notebook.command.open": "Open Notebook"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "azuredatastudio",
|
"name": "azuredatastudio",
|
||||||
"version": "1.4.1",
|
"version": "1.4.2",
|
||||||
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
|
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Microsoft Corporation"
|
"name": "Microsoft Corporation"
|
||||||
|
|||||||
@@ -62,6 +62,12 @@
|
|||||||
<trans-unit id="sql.saveAsCsv.encoding">
|
<trans-unit id="sql.saveAsCsv.encoding">
|
||||||
<source xml:lang="en">[Optional] File encoding used when saving results as CSV</source>
|
<source xml:lang="en">[Optional] File encoding used when saving results as CSV</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="sql.saveAsXml.formatted">
|
||||||
|
<source xml:lang="en">[Optional] When true, XML output will be formatted when saving results as XML</source>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="sql.saveAsXml.encoding">
|
||||||
|
<source xml:lang="en">[Optional] File encoding used when saving results as XML</source>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="sql.copyIncludeHeaders">
|
<trans-unit id="sql.copyIncludeHeaders">
|
||||||
<source xml:lang="en">[Optional] Configuration options for copying results from the Results View</source>
|
<source xml:lang="en">[Optional] Configuration options for copying results from the Results View</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -596,6 +602,9 @@
|
|||||||
<trans-unit id="saveAsExcel">
|
<trans-unit id="saveAsExcel">
|
||||||
<source xml:lang="en">Save As Excel</source>
|
<source xml:lang="en">Save As Excel</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="saveAsXml">
|
||||||
|
<source xml:lang="en">Save As XML</source>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="copySelection">
|
<trans-unit id="copySelection">
|
||||||
<source xml:lang="en">Copy</source>
|
<source xml:lang="en">Copy</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1142,6 +1151,9 @@
|
|||||||
<trans-unit id="saveExcelLabel">
|
<trans-unit id="saveExcelLabel">
|
||||||
<source xml:lang="en">Save as Excel</source>
|
<source xml:lang="en">Save as Excel</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="saveXMLLabel">
|
||||||
|
<source xml:lang="en">Save as XML</source>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="viewChartLabel">
|
<trans-unit id="viewChartLabel">
|
||||||
<source xml:lang="en">View as Chart</source>
|
<source xml:lang="en">View as Chart</source>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
|||||||
@@ -414,17 +414,17 @@ export abstract class Modal extends Disposable implements IThemable {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
this._resizeListener = DOM.addDisposableListener(window, DOM.EventType.RESIZE, (e: Event) => {
|
this._resizeListener = DOM.addDisposableListener(window, DOM.EventType.RESIZE, (e: Event) => {
|
||||||
this.layout(DOM.getTotalHeight(this._builder.getHTMLElement()));
|
this.layout(DOM.getTotalHeight(this._modalBodySection));
|
||||||
});
|
});
|
||||||
|
|
||||||
this.layout(DOM.getTotalHeight(this._builder.getHTMLElement()));
|
this.layout(DOM.getTotalHeight(this._modalBodySection));
|
||||||
TelemetryUtils.addTelemetry(this._telemetryService, TelemetryKeys.ModalDialogOpened, { name: this._name });
|
TelemetryUtils.addTelemetry(this._telemetryService, TelemetryKeys.ModalDialogOpened, { name: this._name });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required to be implemented so that scrolling and other functions operate correctly. Should re-layout controls in the modal
|
* Required to be implemented so that scrolling and other functions operate correctly. Should re-layout controls in the modal
|
||||||
*/
|
*/
|
||||||
protected abstract layout(height?: number): void;
|
protected abstract layout(height: number): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hides the modal and removes key listeners
|
* Hides the modal and removes key listeners
|
||||||
|
|||||||
@@ -6,19 +6,20 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import 'vs/css!./media/optionsDialog';
|
import 'vs/css!./media/optionsDialog';
|
||||||
import { Button } from 'sql/base/browser/ui/button/button';
|
|
||||||
import { FixedCollapsibleView } from 'sql/platform/views/fixedCollapsibleView';
|
|
||||||
import * as DialogHelper from './dialogHelper';
|
import * as DialogHelper from './dialogHelper';
|
||||||
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
|
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
|
||||||
import { IModalOptions, Modal } from './modal';
|
import { IModalOptions, Modal } from './modal';
|
||||||
import * as OptionsDialogHelper from './optionsDialogHelper';
|
import * as OptionsDialogHelper from './optionsDialogHelper';
|
||||||
import { attachButtonStyler, attachModalDialogStyler } from 'sql/common/theme/styler';
|
import { attachButtonStyler, attachModalDialogStyler, attachPanelStyler } from 'sql/common/theme/styler';
|
||||||
|
import { ServiceOptionType } from 'sql/workbench/api/common/sqlExtHostTypes';
|
||||||
|
import { ScrollableSplitView } from 'sql/base/browser/ui/scrollableSplitview/scrollableSplitview';
|
||||||
|
|
||||||
import * as sqlops from 'sqlops';
|
import * as sqlops from 'sqlops';
|
||||||
|
|
||||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import { Event, Emitter } from 'vs/base/common/event';
|
import { Event, Emitter } from 'vs/base/common/event';
|
||||||
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
||||||
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||||
import { localize } from 'vs/nls';
|
import { localize } from 'vs/nls';
|
||||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
@@ -26,58 +27,56 @@ import { IWorkbenchThemeService, IColorTheme } from 'vs/workbench/services/theme
|
|||||||
import { contrastBorder } from 'vs/platform/theme/common/colorRegistry';
|
import { contrastBorder } from 'vs/platform/theme/common/colorRegistry';
|
||||||
import * as styler from 'vs/platform/theme/common/styler';
|
import * as styler from 'vs/platform/theme/common/styler';
|
||||||
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
|
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||||
import { SplitView, CollapsibleState } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
import { Builder, $ } from 'vs/base/browser/builder';
|
import { Builder, $ } from 'vs/base/browser/builder';
|
||||||
import { Widget } from 'vs/base/browser/ui/widget';
|
import { Widget } from 'vs/base/browser/ui/widget';
|
||||||
import { ServiceOptionType } from 'sql/workbench/api/common/sqlExtHostTypes';
|
|
||||||
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
||||||
|
import { IViewletPanelOptions, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet';
|
||||||
|
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||||
|
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
|
||||||
export class CategoryView extends FixedCollapsibleView {
|
export class CategoryView extends ViewletPanel {
|
||||||
private _treecontainer: HTMLElement;
|
|
||||||
private _collapsed: CollapsibleState;
|
|
||||||
|
|
||||||
constructor(private viewTitle: string, private _bodyContainer: HTMLElement, collapsed: boolean, initialBodySize: number, headerSize: number) {
|
constructor(
|
||||||
super(
|
private contentElement: HTMLElement,
|
||||||
initialBodySize,
|
private size: number,
|
||||||
{
|
options: IViewletPanelOptions,
|
||||||
expandedBodySize: initialBodySize,
|
@IKeybindingService keybindingService: IKeybindingService,
|
||||||
sizing: headerSize,
|
@IContextMenuService contextMenuService: IContextMenuService,
|
||||||
initialState: collapsed ? CollapsibleState.COLLAPSED : CollapsibleState.EXPANDED,
|
@IConfigurationService configurationService: IConfigurationService
|
||||||
ariaHeaderLabel: viewTitle
|
) {
|
||||||
});
|
super(options, keybindingService, contextMenuService, configurationService);
|
||||||
this._collapsed = collapsed ? CollapsibleState.COLLAPSED : CollapsibleState.EXPANDED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public renderHeader(container: HTMLElement): void {
|
// we want a fixed size, so when we render to will measure our content and set that to be our
|
||||||
const titleDiv = $('div.title').appendTo(container);
|
// minimum and max size
|
||||||
$('span').text(this.viewTitle).appendTo(titleDiv);
|
protected renderBody(container: HTMLElement): void {
|
||||||
|
container.appendChild(this.contentElement);
|
||||||
|
this.maximumBodySize = this.size;
|
||||||
|
this.minimumBodySize = this.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public renderBody(container: HTMLElement): void {
|
protected layoutBody(size: number): void {
|
||||||
this._treecontainer = document.createElement('div');
|
//
|
||||||
container.appendChild(this._treecontainer);
|
|
||||||
this._treecontainer.appendChild(this._bodyContainer);
|
|
||||||
this.changeState(this._collapsed);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public layoutBody(size: number): void {
|
export interface IOptionsDialogOptions extends IModalOptions {
|
||||||
this._treecontainer.style.height = size + 'px';
|
cancelLabel?: string;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class OptionsDialog extends Modal {
|
export class OptionsDialog extends Modal {
|
||||||
private _body: HTMLElement;
|
private _body: HTMLElement;
|
||||||
private _optionGroups: HTMLElement;
|
private _optionGroups: HTMLElement;
|
||||||
private _dividerBuilder: Builder;
|
private _dividerBuilder: Builder;
|
||||||
private _okButton: Button;
|
|
||||||
private _closeButton: Button;
|
|
||||||
private _optionTitle: Builder;
|
private _optionTitle: Builder;
|
||||||
private _optionDescription: Builder;
|
private _optionDescription: Builder;
|
||||||
private _optionElements: { [optionName: string]: OptionsDialogHelper.IOptionElement } = {};
|
private _optionElements: { [optionName: string]: OptionsDialogHelper.IOptionElement } = {};
|
||||||
private _optionValues: { [optionName: string]: string };
|
private _optionValues: { [optionName: string]: string };
|
||||||
private _optionRowSize = 31;
|
private _optionRowSize = 31;
|
||||||
private _optionCategoryPadding = 30;
|
private _optionCategoryPadding = 30;
|
||||||
private _categoryHeaderSize = 22;
|
private height: number;
|
||||||
|
private splitview: ScrollableSplitView;
|
||||||
|
|
||||||
private _onOk = new Emitter<void>();
|
private _onOk = new Emitter<void>();
|
||||||
public onOk: Event<void> = this._onOk.event;
|
public onOk: Event<void> = this._onOk.event;
|
||||||
@@ -85,16 +84,14 @@ export class OptionsDialog extends Modal {
|
|||||||
private _onCloseEvent = new Emitter<void>();
|
private _onCloseEvent = new Emitter<void>();
|
||||||
public onCloseEvent: Event<void> = this._onCloseEvent.event;
|
public onCloseEvent: Event<void> = this._onCloseEvent.event;
|
||||||
|
|
||||||
public okLabel: string = localize('optionsDialog.ok', 'OK');
|
|
||||||
public cancelLabel: string = localize('optionsDialog.cancel', 'Cancel');
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
title: string,
|
title: string,
|
||||||
name: string,
|
name: string,
|
||||||
options: IModalOptions,
|
private options: IOptionsDialogOptions,
|
||||||
@IPartService partService: IPartService,
|
@IPartService partService: IPartService,
|
||||||
@IWorkbenchThemeService private _workbenchThemeService: IWorkbenchThemeService,
|
@IWorkbenchThemeService private _workbenchThemeService: IWorkbenchThemeService,
|
||||||
@IContextViewService private _contextViewService: IContextViewService,
|
@IContextViewService private _contextViewService: IContextViewService,
|
||||||
|
@IInstantiationService private _instantiationService: IInstantiationService,
|
||||||
@ITelemetryService telemetryService: ITelemetryService,
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
@IContextKeyService contextKeyService: IContextKeyService,
|
@IContextKeyService contextKeyService: IContextKeyService,
|
||||||
@IClipboardService clipboardService: IClipboardService
|
@IClipboardService clipboardService: IClipboardService
|
||||||
@@ -109,14 +106,13 @@ export class OptionsDialog extends Modal {
|
|||||||
this.backButton.onDidClick(() => this.cancel());
|
this.backButton.onDidClick(() => this.cancel());
|
||||||
attachButtonStyler(this.backButton, this._themeService, { buttonBackground: SIDE_BAR_BACKGROUND, buttonHoverBackground: SIDE_BAR_BACKGROUND });
|
attachButtonStyler(this.backButton, this._themeService, { buttonBackground: SIDE_BAR_BACKGROUND, buttonHoverBackground: SIDE_BAR_BACKGROUND });
|
||||||
}
|
}
|
||||||
this._okButton = this.addFooterButton(this.okLabel, () => this.ok());
|
let okButton = this.addFooterButton(localize('optionsDialog.ok', 'OK'), () => this.ok());
|
||||||
this._closeButton = this.addFooterButton(this.cancelLabel, () => this.cancel());
|
let closeButton = this.addFooterButton(this.options.cancelLabel || localize('optionsDialog.cancel', 'Cancel'), () => this.cancel());
|
||||||
// Theme styler
|
// Theme styler
|
||||||
attachButtonStyler(this._okButton, this._themeService);
|
attachButtonStyler(okButton, this._themeService);
|
||||||
attachButtonStyler(this._closeButton, this._themeService);
|
attachButtonStyler(closeButton, this._themeService);
|
||||||
let self = this;
|
this._register(this._workbenchThemeService.onDidColorThemeChange(e => this.updateTheme(e)));
|
||||||
this._register(self._workbenchThemeService.onDidColorThemeChange(e => self.updateTheme(e)));
|
this.updateTheme(this._workbenchThemeService.getColorTheme());
|
||||||
self.updateTheme(self._workbenchThemeService.getColorTheme());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected renderBody(container: HTMLElement) {
|
protected renderBody(container: HTMLElement) {
|
||||||
@@ -151,24 +147,24 @@ export class OptionsDialog extends Modal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private onOptionLinkClicked(optionName: string): void {
|
private onOptionLinkClicked(optionName: string): void {
|
||||||
var option = this._optionElements[optionName].option;
|
let option = this._optionElements[optionName].option;
|
||||||
this._optionTitle.text(option.displayName);
|
this._optionTitle.text(option.displayName);
|
||||||
this._optionDescription.text(option.description);
|
this._optionDescription.text(option.description);
|
||||||
}
|
}
|
||||||
|
|
||||||
private fillInOptions(container: Builder, options: sqlops.ServiceOption[]): void {
|
private fillInOptions(container: Builder, options: sqlops.ServiceOption[]): void {
|
||||||
for (var i = 0; i < options.length; i++) {
|
for (let i = 0; i < options.length; i++) {
|
||||||
var option: sqlops.ServiceOption = options[i];
|
let option: sqlops.ServiceOption = options[i];
|
||||||
var rowContainer = DialogHelper.appendRow(container, option.displayName, 'optionsDialog-label', 'optionsDialog-input');
|
let rowContainer = DialogHelper.appendRow(container, option.displayName, 'optionsDialog-label', 'optionsDialog-input');
|
||||||
OptionsDialogHelper.createOptionElement(option, rowContainer, this._optionValues, this._optionElements, this._contextViewService, (name) => this.onOptionLinkClicked(name));
|
OptionsDialogHelper.createOptionElement(option, rowContainer, this._optionValues, this._optionElements, this._contextViewService, (name) => this.onOptionLinkClicked(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private registerStyling(): void {
|
private registerStyling(): void {
|
||||||
// Theme styler
|
// Theme styler
|
||||||
for (var optionName in this._optionElements) {
|
for (let optionName in this._optionElements) {
|
||||||
var widget: Widget = this._optionElements[optionName].optionWidget;
|
let widget: Widget = this._optionElements[optionName].optionWidget;
|
||||||
var option = this._optionElements[optionName].option;
|
let option = this._optionElements[optionName].option;
|
||||||
switch (option.valueType) {
|
switch (option.valueType) {
|
||||||
case ServiceOptionType.category:
|
case ServiceOptionType.category:
|
||||||
case ServiceOptionType.boolean:
|
case ServiceOptionType.boolean:
|
||||||
@@ -225,47 +221,51 @@ export class OptionsDialog extends Modal {
|
|||||||
|
|
||||||
public open(options: sqlops.ServiceOption[], optionValues: { [name: string]: any }) {
|
public open(options: sqlops.ServiceOption[], optionValues: { [name: string]: any }) {
|
||||||
this._optionValues = optionValues;
|
this._optionValues = optionValues;
|
||||||
var firstOption: string;
|
let firstOption: string;
|
||||||
var containerGroup: Builder;
|
let containerGroup: Builder;
|
||||||
var layoutSize = 0;
|
let optionsContentBuilder: Builder = $().div({ class: 'optionsDialog-options-groups monaco-panel-view' }, (container) => {
|
||||||
var optionsContentBuilder: Builder = $().div({ class: 'optionsDialog-options-groups' }, (container) => {
|
|
||||||
containerGroup = container;
|
containerGroup = container;
|
||||||
this._optionGroups = container.getHTMLElement();
|
this._optionGroups = container.getHTMLElement();
|
||||||
});
|
});
|
||||||
var splitview = new SplitView(containerGroup.getHTMLElement());
|
this.splitview = new ScrollableSplitView(containerGroup.getHTMLElement(), { enableResizing: false, scrollDebounce: 0 });
|
||||||
let categoryMap = OptionsDialogHelper.groupOptionsByCategory(options);
|
let categoryMap = OptionsDialogHelper.groupOptionsByCategory(options);
|
||||||
for (var category in categoryMap) {
|
for (let category in categoryMap) {
|
||||||
var serviceOptions: sqlops.ServiceOption[] = categoryMap[category];
|
let serviceOptions: sqlops.ServiceOption[] = categoryMap[category];
|
||||||
var bodyContainer = $().element('table', { class: 'optionsDialog-table' }, (tableContainer: Builder) => {
|
let bodyContainer = $().element('table', { class: 'optionsDialog-table' }, (tableContainer: Builder) => {
|
||||||
this.fillInOptions(tableContainer, serviceOptions);
|
this.fillInOptions(tableContainer, serviceOptions);
|
||||||
});
|
});
|
||||||
|
|
||||||
var viewSize = this._optionCategoryPadding + serviceOptions.length * this._optionRowSize;
|
let viewSize = this._optionCategoryPadding + serviceOptions.length * this._optionRowSize;
|
||||||
layoutSize += (viewSize + this._categoryHeaderSize);
|
let categoryView = this._instantiationService.createInstance(CategoryView, bodyContainer.getHTMLElement(), viewSize, { title: category, ariaHeaderLabel: category, id: category });
|
||||||
var categoryView = new CategoryView(category, bodyContainer.getHTMLElement(), false, viewSize, this._categoryHeaderSize);
|
this.splitview.addView(categoryView, viewSize);
|
||||||
splitview.addView(categoryView);
|
categoryView.render();
|
||||||
|
attachPanelStyler(categoryView, this._themeService);
|
||||||
|
|
||||||
if (!firstOption) {
|
if (!firstOption) {
|
||||||
firstOption = serviceOptions[0].name;
|
firstOption = serviceOptions[0].name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
splitview.layout(layoutSize);
|
if (this.height) {
|
||||||
|
this.splitview.layout(this.height - 120);
|
||||||
|
}
|
||||||
let body = new Builder(this._body);
|
let body = new Builder(this._body);
|
||||||
body.append(optionsContentBuilder.getHTMLElement(), 0);
|
body.append(optionsContentBuilder.getHTMLElement(), 0);
|
||||||
this.show();
|
this.show();
|
||||||
var firstOptionWidget = this._optionElements[firstOption].optionWidget;
|
let firstOptionWidget = this._optionElements[firstOption].optionWidget;
|
||||||
this.registerStyling();
|
this.registerStyling();
|
||||||
firstOptionWidget.focus();
|
firstOptionWidget.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected layout(height?: number): void {
|
protected layout(height?: number): void {
|
||||||
// Nothing currently laid out in this class
|
this.height = height;
|
||||||
|
// account for padding and the details view
|
||||||
|
this.splitview.layout(this.height - 120 - 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public dispose(): void {
|
public dispose(): void {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
for (var optionName in this._optionElements) {
|
for (let optionName in this._optionElements) {
|
||||||
var widget: Widget = this._optionElements[optionName].optionWidget;
|
let widget: Widget = this._optionElements[optionName].optionWidget;
|
||||||
widget.dispose();
|
widget.dispose();
|
||||||
delete this._optionElements[optionName];
|
delete this._optionElements[optionName];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
import { INextIterator } from 'vs/base/common/iterator';
|
import { INextIterator } from 'vs/base/common/iterator';
|
||||||
|
|
||||||
export interface IView {
|
export interface IView {
|
||||||
id: string;
|
id?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IViewItem {
|
export interface IViewItem {
|
||||||
|
|||||||
@@ -3,6 +3,11 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
.monaco-scroll-split-view {
|
.split-view-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.monaco-scroll-split-view {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
@@ -6,35 +6,49 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import 'vs/css!./scrollableSplitview';
|
import 'vs/css!./scrollableSplitview';
|
||||||
|
import { HeightMap, IView as HeightIView, IViewItem as HeightIViewItem } from './heightMap';
|
||||||
|
|
||||||
import { IDisposable, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { mapEvent, Emitter, Event, debounceEvent } from 'vs/base/common/event';
|
import { mapEvent, Emitter, Event, debounceEvent } from 'vs/base/common/event';
|
||||||
import * as types from 'vs/base/common/types';
|
import * as types from 'vs/base/common/types';
|
||||||
import * as dom from 'vs/base/browser/dom';
|
import * as dom from 'vs/base/browser/dom';
|
||||||
import { clamp } from 'vs/base/common/numbers';
|
import { clamp } from 'vs/base/common/numbers';
|
||||||
import { range, firstIndex } from 'vs/base/common/arrays';
|
import { range, firstIndex, pushToStart } from 'vs/base/common/arrays';
|
||||||
import { Sash, Orientation, ISashEvent as IBaseSashEvent } from 'vs/base/browser/ui/sash/sash';
|
import { Sash, Orientation, ISashEvent as IBaseSashEvent } from 'vs/base/browser/ui/sash/sash';
|
||||||
import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
|
import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
|
||||||
import { HeightMap, IView as HeightIView, IViewItem as HeightIViewItem } from './heightMap';
|
|
||||||
import { ArrayIterator } from 'vs/base/common/iterator';
|
import { ArrayIterator } from 'vs/base/common/iterator';
|
||||||
import { mixin } from 'vs/base/common/objects';
|
import { mixin } from 'vs/base/common/objects';
|
||||||
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
||||||
|
import { ISplitViewStyles, Sizing } from 'vs/base/browser/ui/splitview/splitview';
|
||||||
|
import { Color } from 'vs/base/common/color';
|
||||||
|
import { domEvent } from 'vs/base/browser/event';
|
||||||
|
import { generateUuid } from 'vs/base/common/uuid';
|
||||||
export { Orientation } from 'vs/base/browser/ui/sash/sash';
|
export { Orientation } from 'vs/base/browser/ui/sash/sash';
|
||||||
|
|
||||||
export interface ISplitViewOptions {
|
export interface ISplitViewOptions {
|
||||||
orientation?: Orientation; // default Orientation.VERTICAL
|
orientation?: Orientation; // default Orientation.VERTICAL
|
||||||
|
styles?: ISplitViewStyles;
|
||||||
|
orthogonalStartSash?: Sash;
|
||||||
|
orthogonalEndSash?: Sash;
|
||||||
|
inverseAltBehavior?: boolean;
|
||||||
enableResizing?: boolean;
|
enableResizing?: boolean;
|
||||||
|
scrollDebounce?: number;
|
||||||
verticalScrollbarVisibility?: ScrollbarVisibility;
|
verticalScrollbarVisibility?: ScrollbarVisibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultStyles: ISplitViewStyles = {
|
||||||
|
separatorBorder: Color.transparent
|
||||||
|
};
|
||||||
|
|
||||||
const defaultOptions: ISplitViewOptions = {
|
const defaultOptions: ISplitViewOptions = {
|
||||||
enableResizing: true
|
enableResizing: true
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface IView extends HeightIView {
|
export interface IView extends HeightIView {
|
||||||
|
readonly element: HTMLElement;
|
||||||
readonly minimumSize: number;
|
readonly minimumSize: number;
|
||||||
readonly maximumSize: number;
|
readonly maximumSize: number;
|
||||||
readonly onDidChange: Event<number | undefined>;
|
readonly onDidChange: Event<number | undefined>;
|
||||||
render(container: HTMLElement, orientation: Orientation): void;
|
|
||||||
layout(size: number, orientation: Orientation): void;
|
layout(size: number, orientation: Orientation): void;
|
||||||
onAdd?(): void;
|
onAdd?(): void;
|
||||||
onRemove?(): void;
|
onRemove?(): void;
|
||||||
@@ -44,6 +58,7 @@ interface ISashEvent {
|
|||||||
sash: Sash;
|
sash: Sash;
|
||||||
start: number;
|
start: number;
|
||||||
current: number;
|
current: number;
|
||||||
|
alt: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IViewItem extends HeightIViewItem {
|
interface IViewItem extends HeightIViewItem {
|
||||||
@@ -64,7 +79,12 @@ interface ISashItem {
|
|||||||
interface ISashDragState {
|
interface ISashDragState {
|
||||||
index: number;
|
index: number;
|
||||||
start: number;
|
start: number;
|
||||||
|
current: number;
|
||||||
sizes: number[];
|
sizes: number[];
|
||||||
|
minDelta: number;
|
||||||
|
maxDelta: number;
|
||||||
|
alt: boolean;
|
||||||
|
disposable: IDisposable;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
@@ -95,24 +115,28 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
|
|
||||||
private orientation: Orientation;
|
private orientation: Orientation;
|
||||||
private el: HTMLElement;
|
private el: HTMLElement;
|
||||||
|
private sashContainer: HTMLElement;
|
||||||
|
private viewContainer: HTMLElement;
|
||||||
|
private scrollable: ScrollableElement;
|
||||||
private size = 0;
|
private size = 0;
|
||||||
private contentSize = 0;
|
private contentSize = 0;
|
||||||
|
private proportions: undefined | number[] = undefined;
|
||||||
private viewItems: IViewItem[] = [];
|
private viewItems: IViewItem[] = [];
|
||||||
private sashItems: ISashItem[] = [];
|
private sashItems: ISashItem[] = [];
|
||||||
private sashDragState: ISashDragState;
|
private sashDragState: ISashDragState;
|
||||||
private state: State = State.Idle;
|
private state: State = State.Idle;
|
||||||
private scrollable: ScrollableElement;
|
private inverseAltBehavior: boolean;
|
||||||
|
|
||||||
|
private lastRenderHeight: number;
|
||||||
|
private lastRenderTop: number;
|
||||||
|
|
||||||
private options: ISplitViewOptions;
|
private options: ISplitViewOptions;
|
||||||
|
|
||||||
private dirtyState = false;
|
private dirtyState = false;
|
||||||
|
|
||||||
private lastRenderTop: number;
|
private _onDidSashChange = new Emitter<number>();
|
||||||
private lastRenderHeight: number;
|
|
||||||
|
|
||||||
private _onDidSashChange = new Emitter<void>();
|
|
||||||
readonly onDidSashChange = this._onDidSashChange.event;
|
readonly onDidSashChange = this._onDidSashChange.event;
|
||||||
private _onDidSashReset = new Emitter<void>();
|
private _onDidSashReset = new Emitter<number>();
|
||||||
readonly onDidSashReset = this._onDidSashReset.event;
|
readonly onDidSashReset = this._onDidSashReset.event;
|
||||||
|
|
||||||
private _onScroll = new Emitter<number>();
|
private _onScroll = new Emitter<number>();
|
||||||
@@ -122,15 +146,48 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
return this.viewItems.length;
|
return this.viewItems.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get minimumSize(): number {
|
||||||
|
return this.viewItems.reduce((r, item) => r + item.view.minimumSize, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
get maximumSize(): number {
|
||||||
|
return this.length === 0 ? Number.POSITIVE_INFINITY : this.viewItems.reduce((r, item) => r + item.view.maximumSize, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _orthogonalStartSash: Sash | undefined;
|
||||||
|
get orthogonalStartSash(): Sash | undefined { return this._orthogonalStartSash; }
|
||||||
|
set orthogonalStartSash(sash: Sash | undefined) {
|
||||||
|
for (const sashItem of this.sashItems) {
|
||||||
|
sashItem.sash.orthogonalStartSash = sash;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._orthogonalStartSash = sash;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _orthogonalEndSash: Sash | undefined;
|
||||||
|
get orthogonalEndSash(): Sash | undefined { return this._orthogonalEndSash; }
|
||||||
|
set orthogonalEndSash(sash: Sash | undefined) {
|
||||||
|
for (const sashItem of this.sashItems) {
|
||||||
|
sashItem.sash.orthogonalEndSash = sash;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._orthogonalEndSash = sash;
|
||||||
|
}
|
||||||
|
|
||||||
|
get sashes(): Sash[] {
|
||||||
|
return this.sashItems.map(s => s.sash);
|
||||||
|
}
|
||||||
|
|
||||||
constructor(container: HTMLElement, options: ISplitViewOptions = {}) {
|
constructor(container: HTMLElement, options: ISplitViewOptions = {}) {
|
||||||
super();
|
super();
|
||||||
this.orientation = types.isUndefined(options.orientation) ? Orientation.VERTICAL : options.orientation;
|
this.orientation = types.isUndefined(options.orientation) ? Orientation.VERTICAL : options.orientation;
|
||||||
|
this.inverseAltBehavior = !!options.inverseAltBehavior;
|
||||||
|
|
||||||
this.options = mixin(options, defaultOptions, false);
|
this.options = mixin(options, defaultOptions, false);
|
||||||
|
|
||||||
this.el = document.createElement('div');
|
this.el = document.createElement('div');
|
||||||
this.scrollable = new ScrollableElement(this.el, { vertical: options.verticalScrollbarVisibility });
|
this.scrollable = new ScrollableElement(this.el, { vertical: options.verticalScrollbarVisibility });
|
||||||
debounceEvent(this.scrollable.onScroll, (l, e) => e, 25)(e => {
|
debounceEvent(this.scrollable.onScroll, (l, e) => e, types.isNumber(this.options.scrollDebounce) ? this.options.scrollDebounce : 25)(e => {
|
||||||
this.render(e.scrollTop, e.height);
|
this.render(e.scrollTop, e.height);
|
||||||
this.relayout();
|
this.relayout();
|
||||||
this._onScroll.fire(e.scrollTop);
|
this._onScroll.fire(e.scrollTop);
|
||||||
@@ -140,9 +197,24 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
dom.addClass(domNode, 'monaco-split-view2');
|
dom.addClass(domNode, 'monaco-split-view2');
|
||||||
dom.addClass(domNode, this.orientation === Orientation.VERTICAL ? 'vertical' : 'horizontal');
|
dom.addClass(domNode, this.orientation === Orientation.VERTICAL ? 'vertical' : 'horizontal');
|
||||||
container.appendChild(domNode);
|
container.appendChild(domNode);
|
||||||
|
|
||||||
|
this.sashContainer = dom.append(this.el, dom.$('.sash-container'));
|
||||||
|
this.viewContainer = dom.append(this.el, dom.$('.split-view-container'));
|
||||||
|
|
||||||
|
this.style(options.styles || defaultStyles);
|
||||||
}
|
}
|
||||||
|
|
||||||
addViews(views: IView[], sizes: number[], index = this.viewItems.length): void {
|
style(styles: ISplitViewStyles): void {
|
||||||
|
if (styles.separatorBorder.isTransparent()) {
|
||||||
|
dom.removeClass(this.el, 'separator-border');
|
||||||
|
this.el.style.removeProperty('--separator-border');
|
||||||
|
} else {
|
||||||
|
dom.addClass(this.el, 'separator-border');
|
||||||
|
this.el.style.setProperty('--separator-border', styles.separatorBorder.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addViews(views: IView[], sizes: number[] | Sizing, index = this.viewItems.length): void {
|
||||||
if (this.state !== State.Idle) {
|
if (this.state !== State.Idle) {
|
||||||
throw new Error('Cant modify splitview');
|
throw new Error('Cant modify splitview');
|
||||||
}
|
}
|
||||||
@@ -150,16 +222,23 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
this.state = State.Busy;
|
this.state = State.Busy;
|
||||||
|
|
||||||
for (let i = 0; i < views.length; i++) {
|
for (let i = 0; i < views.length; i++) {
|
||||||
let viewIndex = index + i;
|
let size: number | Sizing;
|
||||||
let view = views[i], size = sizes[i];
|
if (Array.isArray(sizes)) {
|
||||||
|
size = sizes[i];
|
||||||
|
} else {
|
||||||
|
size = sizes;
|
||||||
|
}
|
||||||
|
const view = views[i];
|
||||||
|
view.id = view.id || generateUuid();
|
||||||
// Add view
|
// Add view
|
||||||
const container = dom.$('.split-view-view');
|
const container = dom.$('.split-view-view');
|
||||||
|
|
||||||
|
// removed default adding of the view directly to the container
|
||||||
|
|
||||||
const onChangeDisposable = view.onDidChange(size => this.onViewChange(item, size));
|
const onChangeDisposable = view.onDidChange(size => this.onViewChange(item, size));
|
||||||
const containerDisposable = toDisposable(() => {
|
const containerDisposable = toDisposable(() => {
|
||||||
if (container.parentElement) {
|
if (container.parentElement) {
|
||||||
this.el.removeChild(container);
|
this.viewContainer.removeChild(container);
|
||||||
}
|
}
|
||||||
this.onRemoveItems(new ArrayIterator([item.view.id]));
|
this.onRemoveItems(new ArrayIterator([item.view.id]));
|
||||||
});
|
});
|
||||||
@@ -169,65 +248,91 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
const onRemove = view.onRemove ? () => view.onRemove() : () => { };
|
const onRemove = view.onRemove ? () => view.onRemove() : () => { };
|
||||||
|
|
||||||
const layoutContainer = this.orientation === Orientation.VERTICAL
|
const layoutContainer = this.orientation === Orientation.VERTICAL
|
||||||
? size => item.container.style.height = `${item.size}px`
|
? () => item.container.style.height = `${item.size}px`
|
||||||
: size => item.container.style.width = `${item.size}px`;
|
: () => item.container.style.width = `${item.size}px`;
|
||||||
|
|
||||||
const layout = () => {
|
const layout = () => {
|
||||||
layoutContainer(item.size);
|
layoutContainer();
|
||||||
item.view.layout(item.size, this.orientation);
|
item.view.layout(item.size, this.orientation);
|
||||||
};
|
};
|
||||||
|
|
||||||
size = Math.round(size);
|
let viewSize: number;
|
||||||
const item: IViewItem = { onRemove, onAdd, view, container, size, layout, disposable, height: size, top: 0, width: 0 };
|
|
||||||
this.viewItems.splice(viewIndex, 0, item);
|
|
||||||
|
|
||||||
this.onInsertItems(new ArrayIterator([item]), viewIndex > 0 ? this.viewItems[viewIndex - 1].view.id : undefined);
|
if (typeof size === 'number') {
|
||||||
|
viewSize = size;
|
||||||
|
} else if (size.type === 'split') {
|
||||||
|
viewSize = this.getViewSize(size.index) / 2;
|
||||||
|
} else {
|
||||||
|
viewSize = view.minimumSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
const item: IViewItem = { onAdd, onRemove, view, container, size: viewSize, layout, disposable, height: viewSize, top: 0, width: 0 };
|
||||||
|
this.viewItems.splice(index, 0, item);
|
||||||
|
|
||||||
|
this.onInsertItems(new ArrayIterator([item]), index > 0 ? this.viewItems[index - 1].view.id : undefined);
|
||||||
|
|
||||||
// Add sash
|
// Add sash
|
||||||
if (this.options.enableResizing && this.viewItems.length > 1) {
|
if (this.options.enableResizing && this.viewItems.length > 1) {
|
||||||
const orientation = this.orientation === Orientation.VERTICAL ? Orientation.HORIZONTAL : Orientation.VERTICAL;
|
const orientation = this.orientation === Orientation.VERTICAL ? Orientation.HORIZONTAL : Orientation.VERTICAL;
|
||||||
const layoutProvider = this.orientation === Orientation.VERTICAL ? { getHorizontalSashTop: sash => this.getSashPosition(sash) } : { getVerticalSashLeft: sash => this.getSashPosition(sash) };
|
const layoutProvider = this.orientation === Orientation.VERTICAL ? { getHorizontalSashTop: sash => this.getSashPosition(sash) } : { getVerticalSashLeft: sash => this.getSashPosition(sash) };
|
||||||
const sash = new Sash(this.el, layoutProvider, { orientation });
|
const sash = new Sash(this.sashContainer, layoutProvider, {
|
||||||
|
orientation,
|
||||||
|
orthogonalStartSash: this.orthogonalStartSash,
|
||||||
|
orthogonalEndSash: this.orthogonalEndSash
|
||||||
|
});
|
||||||
|
|
||||||
const sashEventMapper = this.orientation === Orientation.VERTICAL
|
const sashEventMapper = this.orientation === Orientation.VERTICAL
|
||||||
? (e: IBaseSashEvent) => ({ sash, start: e.startY, current: e.currentY })
|
? (e: IBaseSashEvent) => ({ sash, start: e.startY, current: e.currentY, alt: e.altKey } as ISashEvent)
|
||||||
: (e: IBaseSashEvent) => ({ sash, start: e.startX, current: e.currentX });
|
: (e: IBaseSashEvent) => ({ sash, start: e.startX, current: e.currentX, alt: e.altKey } as ISashEvent);
|
||||||
|
|
||||||
const onStart = mapEvent(sash.onDidStart, sashEventMapper);
|
const onStart = mapEvent(sash.onDidStart, sashEventMapper);
|
||||||
const onStartDisposable = onStart(this.onSashStart, this);
|
const onStartDisposable = onStart(this.onSashStart, this);
|
||||||
const onChange = mapEvent(sash.onDidChange, sashEventMapper);
|
const onChange = mapEvent(sash.onDidChange, sashEventMapper);
|
||||||
const onSashChangeDisposable = onChange(this.onSashChange, this);
|
const onChangeDisposable = onChange(this.onSashChange, this);
|
||||||
const onEnd = mapEvent<void, void>(sash.onDidEnd, () => null);
|
const onEnd = mapEvent(sash.onDidEnd, () => firstIndex(this.sashItems, item => item.sash === sash));
|
||||||
const onEndDisposable = onEnd(() => this._onDidSashChange.fire());
|
const onEndDisposable = onEnd(this.onSashEnd, this);
|
||||||
const onDidReset = mapEvent<void, void>(sash.onDidReset, () => null);
|
const onDidResetDisposable = sash.onDidReset(() => this._onDidSashReset.fire(firstIndex(this.sashItems, item => item.sash === sash)));
|
||||||
const onDidResetDisposable = onDidReset(() => this._onDidSashReset.fire());
|
|
||||||
|
|
||||||
const disposable = combinedDisposable([onStartDisposable, onSashChangeDisposable, onEndDisposable, onDidResetDisposable, sash]);
|
const disposable = combinedDisposable([onStartDisposable, onChangeDisposable, onEndDisposable, onDidResetDisposable, sash]);
|
||||||
const sashItem: ISashItem = { sash, disposable };
|
const sashItem: ISashItem = { sash, disposable };
|
||||||
|
|
||||||
this.sashItems.splice(viewIndex - 1, 0, sashItem);
|
this.sashItems.splice(index - 1, 0, sashItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
view.render(container, this.orientation);
|
container.appendChild(view.element);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.relayout();
|
let highPriorityIndex: number | undefined;
|
||||||
|
|
||||||
|
if (!types.isArray(sizes) && sizes.type === 'split') {
|
||||||
|
highPriorityIndex = sizes.index;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.relayout(index, highPriorityIndex);
|
||||||
this.state = State.Idle;
|
this.state = State.Idle;
|
||||||
|
|
||||||
|
if (!types.isArray(sizes) && sizes.type === 'distribute') {
|
||||||
|
this.distributeViewSizes();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addView(view: IView, size: number, index = this.viewItems.length): void {
|
addView(view: IView, size: number | Sizing, index = this.viewItems.length): void {
|
||||||
if (this.state !== State.Idle) {
|
if (this.state !== State.Idle) {
|
||||||
throw new Error('Cant modify splitview');
|
throw new Error('Cant modify splitview');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.state = State.Busy;
|
this.state = State.Busy;
|
||||||
|
|
||||||
|
view.id = view.id || generateUuid();
|
||||||
// Add view
|
// Add view
|
||||||
const container = dom.$('.split-view-view');
|
const container = dom.$('.split-view-view');
|
||||||
|
|
||||||
|
// removed default adding of the view directly to the container
|
||||||
|
|
||||||
const onChangeDisposable = view.onDidChange(size => this.onViewChange(item, size));
|
const onChangeDisposable = view.onDidChange(size => this.onViewChange(item, size));
|
||||||
const containerDisposable = toDisposable(() => {
|
const containerDisposable = toDisposable(() => {
|
||||||
if (container.parentElement) {
|
if (container.parentElement) {
|
||||||
this.el.removeChild(container);
|
this.viewContainer.removeChild(container);
|
||||||
}
|
}
|
||||||
this.onRemoveItems(new ArrayIterator([item.view.id]));
|
this.onRemoveItems(new ArrayIterator([item.view.id]));
|
||||||
});
|
});
|
||||||
@@ -237,16 +342,25 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
const onRemove = view.onRemove ? () => view.onRemove() : () => { };
|
const onRemove = view.onRemove ? () => view.onRemove() : () => { };
|
||||||
|
|
||||||
const layoutContainer = this.orientation === Orientation.VERTICAL
|
const layoutContainer = this.orientation === Orientation.VERTICAL
|
||||||
? size => item.container.style.height = `${item.size}px`
|
? () => item.container.style.height = `${item.size}px`
|
||||||
: size => item.container.style.width = `${item.size}px`;
|
: () => item.container.style.width = `${item.size}px`;
|
||||||
|
|
||||||
const layout = () => {
|
const layout = () => {
|
||||||
layoutContainer(item.size);
|
layoutContainer();
|
||||||
item.view.layout(item.size, this.orientation);
|
item.view.layout(item.size, this.orientation);
|
||||||
};
|
};
|
||||||
|
|
||||||
size = Math.round(size);
|
let viewSize: number;
|
||||||
const item: IViewItem = { onAdd, onRemove, view, container, size, layout, disposable, height: size, top: 0, width: 0 };
|
|
||||||
|
if (typeof size === 'number') {
|
||||||
|
viewSize = size;
|
||||||
|
} else if (size.type === 'split') {
|
||||||
|
viewSize = this.getViewSize(size.index) / 2;
|
||||||
|
} else {
|
||||||
|
viewSize = view.minimumSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
const item: IViewItem = { onAdd, onRemove, view, container, size: viewSize, layout, disposable, height: viewSize, top: 0, width: 0 };
|
||||||
this.viewItems.splice(index, 0, item);
|
this.viewItems.splice(index, 0, item);
|
||||||
|
|
||||||
this.onInsertItems(new ArrayIterator([item]), index > 0 ? this.viewItems[index - 1].view.id : undefined);
|
this.onInsertItems(new ArrayIterator([item]), index > 0 ? this.viewItems[index - 1].view.id : undefined);
|
||||||
@@ -255,33 +369,47 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
if (this.options.enableResizing && this.viewItems.length > 1) {
|
if (this.options.enableResizing && this.viewItems.length > 1) {
|
||||||
const orientation = this.orientation === Orientation.VERTICAL ? Orientation.HORIZONTAL : Orientation.VERTICAL;
|
const orientation = this.orientation === Orientation.VERTICAL ? Orientation.HORIZONTAL : Orientation.VERTICAL;
|
||||||
const layoutProvider = this.orientation === Orientation.VERTICAL ? { getHorizontalSashTop: sash => this.getSashPosition(sash) } : { getVerticalSashLeft: sash => this.getSashPosition(sash) };
|
const layoutProvider = this.orientation === Orientation.VERTICAL ? { getHorizontalSashTop: sash => this.getSashPosition(sash) } : { getVerticalSashLeft: sash => this.getSashPosition(sash) };
|
||||||
const sash = new Sash(this.el, layoutProvider, { orientation });
|
const sash = new Sash(this.sashContainer, layoutProvider, {
|
||||||
|
orientation,
|
||||||
|
orthogonalStartSash: this.orthogonalStartSash,
|
||||||
|
orthogonalEndSash: this.orthogonalEndSash
|
||||||
|
});
|
||||||
|
|
||||||
const sashEventMapper = this.orientation === Orientation.VERTICAL
|
const sashEventMapper = this.orientation === Orientation.VERTICAL
|
||||||
? (e: IBaseSashEvent) => ({ sash, start: e.startY, current: e.currentY })
|
? (e: IBaseSashEvent) => ({ sash, start: e.startY, current: e.currentY, alt: e.altKey } as ISashEvent)
|
||||||
: (e: IBaseSashEvent) => ({ sash, start: e.startX, current: e.currentX });
|
: (e: IBaseSashEvent) => ({ sash, start: e.startX, current: e.currentX, alt: e.altKey } as ISashEvent);
|
||||||
|
|
||||||
const onStart = mapEvent(sash.onDidStart, sashEventMapper);
|
const onStart = mapEvent(sash.onDidStart, sashEventMapper);
|
||||||
const onStartDisposable = onStart(this.onSashStart, this);
|
const onStartDisposable = onStart(this.onSashStart, this);
|
||||||
const onChange = mapEvent(sash.onDidChange, sashEventMapper);
|
const onChange = mapEvent(sash.onDidChange, sashEventMapper);
|
||||||
const onSashChangeDisposable = onChange(this.onSashChange, this);
|
const onChangeDisposable = onChange(this.onSashChange, this);
|
||||||
const onEnd = mapEvent<void, void>(sash.onDidEnd, () => null);
|
const onEnd = mapEvent(sash.onDidEnd, () => firstIndex(this.sashItems, item => item.sash === sash));
|
||||||
const onEndDisposable = onEnd(() => this._onDidSashChange.fire());
|
const onEndDisposable = onEnd(this.onSashEnd, this);
|
||||||
const onDidReset = mapEvent<void, void>(sash.onDidReset, () => null);
|
const onDidResetDisposable = sash.onDidReset(() => this._onDidSashReset.fire(firstIndex(this.sashItems, item => item.sash === sash)));
|
||||||
const onDidResetDisposable = onDidReset(() => this._onDidSashReset.fire());
|
|
||||||
|
|
||||||
const disposable = combinedDisposable([onStartDisposable, onSashChangeDisposable, onEndDisposable, onDidResetDisposable, sash]);
|
const disposable = combinedDisposable([onStartDisposable, onChangeDisposable, onEndDisposable, onDidResetDisposable, sash]);
|
||||||
const sashItem: ISashItem = { sash, disposable };
|
const sashItem: ISashItem = { sash, disposable };
|
||||||
|
|
||||||
sash.hide();
|
|
||||||
this.sashItems.splice(index - 1, 0, sashItem);
|
this.sashItems.splice(index - 1, 0, sashItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
view.render(container, this.orientation);
|
container.appendChild(view.element);
|
||||||
this.relayout(index);
|
|
||||||
|
let highPriorityIndex: number | undefined;
|
||||||
|
|
||||||
|
if (typeof size !== 'number' && size.type === 'split') {
|
||||||
|
highPriorityIndex = size.index;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.relayout(index, highPriorityIndex);
|
||||||
this.state = State.Idle;
|
this.state = State.Idle;
|
||||||
|
|
||||||
|
if (typeof size !== 'number' && size.type === 'distribute') {
|
||||||
|
this.distributeViewSizes();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
removeView(index: number): void {
|
removeView(index: number, sizing?: Sizing): IView {
|
||||||
if (this.state !== State.Idle) {
|
if (this.state !== State.Idle) {
|
||||||
throw new Error('Cant modify splitview');
|
throw new Error('Cant modify splitview');
|
||||||
}
|
}
|
||||||
@@ -289,7 +417,7 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
this.state = State.Busy;
|
this.state = State.Busy;
|
||||||
|
|
||||||
if (index < 0 || index >= this.viewItems.length) {
|
if (index < 0 || index >= this.viewItems.length) {
|
||||||
return;
|
throw new Error('Index out of bounds');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove view
|
// Remove view
|
||||||
@@ -301,12 +429,16 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
const sashIndex = Math.max(index - 1, 0);
|
const sashIndex = Math.max(index - 1, 0);
|
||||||
const sashItem = this.sashItems.splice(sashIndex, 1)[0];
|
const sashItem = this.sashItems.splice(sashIndex, 1)[0];
|
||||||
sashItem.disposable.dispose();
|
sashItem.disposable.dispose();
|
||||||
} else {
|
|
||||||
this.lastRenderHeight = NaN, this.lastRenderTop = NaN;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.relayout();
|
this.relayout();
|
||||||
this.state = State.Idle;
|
this.state = State.Idle;
|
||||||
|
|
||||||
|
if (sizing && sizing.type === 'distribute') {
|
||||||
|
this.distributeViewSizes();
|
||||||
|
}
|
||||||
|
|
||||||
|
return viewItem.view;
|
||||||
}
|
}
|
||||||
|
|
||||||
moveView(from: number, to: number): void {
|
moveView(from: number, to: number): void {
|
||||||
@@ -314,36 +446,36 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
throw new Error('Cant modify splitview');
|
throw new Error('Cant modify splitview');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.state = State.Busy;
|
const size = this.getViewSize(from);
|
||||||
|
const view = this.removeView(from);
|
||||||
if (from < 0 || from >= this.viewItems.length) {
|
this.addView(view, size, to);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (to < 0 || to >= this.viewItems.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (from === to) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const viewItem = this.viewItems.splice(from, 1)[0];
|
|
||||||
this.viewItems.splice(to, 0, viewItem);
|
|
||||||
|
|
||||||
if (to + 1 < this.viewItems.length) {
|
|
||||||
this.el.insertBefore(viewItem.container, this.viewItems[to + 1].container);
|
|
||||||
} else {
|
|
||||||
this.el.appendChild(viewItem.container);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.layoutViews();
|
|
||||||
this.state = State.Idle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private relayout(lowPriorityIndex?: number): void {
|
swapViews(from: number, to: number): void {
|
||||||
|
if (this.state !== State.Idle) {
|
||||||
|
throw new Error('Cant modify splitview');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from > to) {
|
||||||
|
return this.swapViews(to, from);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fromSize = this.getViewSize(from);
|
||||||
|
const toSize = this.getViewSize(to);
|
||||||
|
const toView = this.removeView(to);
|
||||||
|
const fromView = this.removeView(from);
|
||||||
|
|
||||||
|
this.addView(toView, fromSize, from);
|
||||||
|
this.addView(fromView, toSize, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
private relayout(lowPriorityIndex?: number, highPriorityIndex?: number): void {
|
||||||
const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
|
const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
|
||||||
this.resize(this.viewItems.length - 1, this.size - contentSize, undefined, lowPriorityIndex);
|
|
||||||
|
this.resize(this.viewItems.length - 1, this.size - contentSize, undefined, lowPriorityIndex, highPriorityIndex);
|
||||||
|
this.distributeEmptySpace();
|
||||||
|
this.layoutViews();
|
||||||
|
this.saveProportions();
|
||||||
}
|
}
|
||||||
|
|
||||||
public setScrollPosition(position: number) {
|
public setScrollPosition(position: number) {
|
||||||
@@ -351,14 +483,188 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
layout(size: number): void {
|
layout(size: number): void {
|
||||||
const previousSize = this.size;
|
const previousSize = Math.max(this.size, this.contentSize);
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.contentSize = 0;
|
this.contentSize = 0;
|
||||||
this.lastRenderHeight = undefined;
|
this.lastRenderHeight = undefined;
|
||||||
this.lastRenderTop = undefined;
|
this.lastRenderTop = undefined;
|
||||||
this.resize(this.viewItems.length - 1, size - previousSize);
|
|
||||||
|
if (!this.proportions) {
|
||||||
|
this.resize(this.viewItems.length - 1, size - previousSize);
|
||||||
|
} else {
|
||||||
|
for (let i = 0; i < this.viewItems.length; i++) {
|
||||||
|
const item = this.viewItems[i];
|
||||||
|
item.size = clamp(Math.round(this.proportions[i] * size), item.view.minimumSize, item.view.maximumSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.distributeEmptySpace();
|
||||||
|
this.layoutViews();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private saveProportions(): void {
|
||||||
|
if (this.contentSize > 0) {
|
||||||
|
this.proportions = this.viewItems.map(i => i.size / this.contentSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private onSashStart({ sash, start, alt }: ISashEvent): void {
|
||||||
|
const index = firstIndex(this.sashItems, item => item.sash === sash);
|
||||||
|
|
||||||
|
// This way, we can press Alt while we resize a sash, macOS style!
|
||||||
|
const disposable = combinedDisposable([
|
||||||
|
domEvent(document.body, 'keydown')(e => resetSashDragState(this.sashDragState.current, e.altKey)),
|
||||||
|
domEvent(document.body, 'keyup')(() => resetSashDragState(this.sashDragState.current, false))
|
||||||
|
]);
|
||||||
|
|
||||||
|
const resetSashDragState = (start: number, alt: boolean) => {
|
||||||
|
const sizes = this.viewItems.map(i => i.size);
|
||||||
|
let minDelta = Number.NEGATIVE_INFINITY;
|
||||||
|
let maxDelta = Number.POSITIVE_INFINITY;
|
||||||
|
|
||||||
|
if (this.inverseAltBehavior) {
|
||||||
|
alt = !alt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alt) {
|
||||||
|
// When we're using the last sash with Alt, we're resizing
|
||||||
|
// the view to the left/up, instead of right/down as usual
|
||||||
|
// Thus, we must do the inverse of the usual
|
||||||
|
const isLastSash = index === this.sashItems.length - 1;
|
||||||
|
|
||||||
|
if (isLastSash) {
|
||||||
|
const viewItem = this.viewItems[index];
|
||||||
|
minDelta = (viewItem.view.minimumSize - viewItem.size) / 2;
|
||||||
|
maxDelta = (viewItem.view.maximumSize - viewItem.size) / 2;
|
||||||
|
} else {
|
||||||
|
const viewItem = this.viewItems[index + 1];
|
||||||
|
minDelta = (viewItem.size - viewItem.view.maximumSize) / 2;
|
||||||
|
maxDelta = (viewItem.size - viewItem.view.minimumSize) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sashDragState = { start, current: start, index, sizes, minDelta, maxDelta, alt, disposable };
|
||||||
|
};
|
||||||
|
|
||||||
|
resetSashDragState(start, alt);
|
||||||
|
}
|
||||||
|
|
||||||
|
private onSashChange({ current }: ISashEvent): void {
|
||||||
|
const { index, start, sizes, alt, minDelta, maxDelta } = this.sashDragState;
|
||||||
|
this.sashDragState.current = current;
|
||||||
|
|
||||||
|
const delta = current - start;
|
||||||
|
const newDelta = this.resize(index, delta, sizes, undefined, undefined, minDelta, maxDelta);
|
||||||
|
|
||||||
|
if (alt) {
|
||||||
|
const isLastSash = index === this.sashItems.length - 1;
|
||||||
|
const newSizes = this.viewItems.map(i => i.size);
|
||||||
|
const viewItemIndex = isLastSash ? index : index + 1;
|
||||||
|
const viewItem = this.viewItems[viewItemIndex];
|
||||||
|
const newMinDelta = viewItem.size - viewItem.view.maximumSize;
|
||||||
|
const newMaxDelta = viewItem.size - viewItem.view.minimumSize;
|
||||||
|
const resizeIndex = isLastSash ? index - 1 : index + 1;
|
||||||
|
|
||||||
|
this.resize(resizeIndex, -newDelta, newSizes, undefined, undefined, newMinDelta, newMaxDelta);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.distributeEmptySpace();
|
||||||
|
this.layoutViews();
|
||||||
|
}
|
||||||
|
|
||||||
|
private onSashEnd(index: number): void {
|
||||||
|
this._onDidSashChange.fire(index);
|
||||||
|
this.sashDragState.disposable.dispose();
|
||||||
|
this.saveProportions();
|
||||||
|
}
|
||||||
|
|
||||||
|
private onViewChange(item: IViewItem, size: number | undefined): void {
|
||||||
|
const index = this.viewItems.indexOf(item);
|
||||||
|
|
||||||
|
if (index < 0 || index >= this.viewItems.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = typeof size === 'number' ? size : item.size;
|
||||||
|
size = clamp(size, item.view.minimumSize, item.view.maximumSize);
|
||||||
|
|
||||||
|
if (this.inverseAltBehavior && index > 0) {
|
||||||
|
// In this case, we want the view to grow or shrink both sides equally
|
||||||
|
// so we just resize the "left" side by half and let `resize` do the clamping magic
|
||||||
|
this.resize(index - 1, Math.floor((item.size - size) / 2));
|
||||||
|
this.distributeEmptySpace();
|
||||||
|
this.layoutViews();
|
||||||
|
} else {
|
||||||
|
item.size = size;
|
||||||
|
this.updateSize(item.view.id, size);
|
||||||
|
let top = item.top + item.size;
|
||||||
|
for (let i = index + 1; i < this.viewItems.length; i++) {
|
||||||
|
let currentItem = this.viewItems[i];
|
||||||
|
this.updateTop(currentItem.view.id, top);
|
||||||
|
top += currentItem.size;
|
||||||
|
}
|
||||||
|
this.relayout(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resizeView(index: number, size: number): void {
|
||||||
|
if (this.state !== State.Idle) {
|
||||||
|
throw new Error('Cant modify splitview');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.state = State.Busy;
|
||||||
|
|
||||||
|
if (index < 0 || index >= this.viewItems.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const item = this.viewItems[index];
|
||||||
|
size = Math.round(size);
|
||||||
|
size = clamp(size, item.view.minimumSize, item.view.maximumSize);
|
||||||
|
let delta = size - item.size;
|
||||||
|
|
||||||
|
if (delta !== 0 && index < this.viewItems.length - 1) {
|
||||||
|
const downIndexes = range(index + 1, this.viewItems.length);
|
||||||
|
const collapseDown = downIndexes.reduce((r, i) => r + (this.viewItems[i].size - this.viewItems[i].view.minimumSize), 0);
|
||||||
|
const expandDown = downIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - this.viewItems[i].size), 0);
|
||||||
|
const deltaDown = clamp(delta, -expandDown, collapseDown);
|
||||||
|
|
||||||
|
this.resize(index, deltaDown);
|
||||||
|
delta -= deltaDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delta !== 0 && index > 0) {
|
||||||
|
const upIndexes = range(index - 1, -1);
|
||||||
|
const collapseUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].size - this.viewItems[i].view.minimumSize), 0);
|
||||||
|
const expandUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - this.viewItems[i].size), 0);
|
||||||
|
const deltaUp = clamp(-delta, -collapseUp, expandUp);
|
||||||
|
|
||||||
|
this.resize(index - 1, deltaUp);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.distributeEmptySpace();
|
||||||
|
this.layoutViews();
|
||||||
|
this.saveProportions();
|
||||||
|
this.state = State.Idle;
|
||||||
|
}
|
||||||
|
|
||||||
|
distributeViewSizes(): void {
|
||||||
|
const size = Math.floor(this.size / this.viewItems.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < this.viewItems.length - 1; i++) {
|
||||||
|
this.resizeView(i, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getViewSize(index: number): number {
|
||||||
|
if (index < 0 || index >= this.viewItems.length) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.viewItems[index].size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private render(scrollTop: number, viewHeight: number): void {
|
private render(scrollTop: number, viewHeight: number): void {
|
||||||
let i: number;
|
let i: number;
|
||||||
let stop: number;
|
let stop: number;
|
||||||
@@ -398,96 +704,13 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
let topItem = this.itemAtIndex(this.indexAt(renderTop));
|
let topItem = this.itemAtIndex(this.indexAt(renderTop));
|
||||||
|
|
||||||
if (topItem) {
|
if (topItem) {
|
||||||
this.el.style.top = (topItem.top - renderTop) + 'px';
|
this.viewContainer.style.top = (topItem.top - renderTop) + 'px';
|
||||||
}
|
}
|
||||||
|
|
||||||
this.lastRenderTop = renderTop;
|
this.lastRenderTop = renderTop;
|
||||||
this.lastRenderHeight = renderBottom - renderTop;
|
this.lastRenderHeight = renderBottom - renderTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private onSashStart({ sash, start }: ISashEvent): void {
|
|
||||||
const index = firstIndex(this.sashItems, item => item.sash === sash);
|
|
||||||
const sizes = this.viewItems.map(i => i.size);
|
|
||||||
|
|
||||||
// const upIndexes = range(index, -1);
|
|
||||||
// const collapseUp = upIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.minimumSize), 0);
|
|
||||||
// const expandUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - sizes[i]), 0);
|
|
||||||
|
|
||||||
// const downIndexes = range(index + 1, this.viewItems.length);
|
|
||||||
// const collapseDown = downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.minimumSize), 0);
|
|
||||||
// const expandDown = downIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - sizes[i]), 0);
|
|
||||||
|
|
||||||
// const minDelta = -Math.min(collapseUp, expandDown);
|
|
||||||
// const maxDelta = Math.min(collapseDown, expandUp);
|
|
||||||
|
|
||||||
this.sashDragState = { start, index, sizes };
|
|
||||||
}
|
|
||||||
|
|
||||||
private onSashChange({ sash, current }: ISashEvent): void {
|
|
||||||
const { index, start, sizes } = this.sashDragState;
|
|
||||||
const delta = current - start;
|
|
||||||
|
|
||||||
this.resize(index, delta, sizes);
|
|
||||||
}
|
|
||||||
|
|
||||||
private onViewChange(item: IViewItem, size: number | undefined): void {
|
|
||||||
const index = this.viewItems.indexOf(item);
|
|
||||||
|
|
||||||
if (index < 0 || index >= this.viewItems.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
size = typeof size === 'number' ? size : item.size;
|
|
||||||
size = clamp(size, item.view.minimumSize, item.view.maximumSize);
|
|
||||||
item.size = size;
|
|
||||||
this.updateSize(item.view.id, size);
|
|
||||||
let top = item.top + item.size;
|
|
||||||
for (let i = index + 1; i < this.viewItems.length; i++) {
|
|
||||||
let currentItem = this.viewItems[i];
|
|
||||||
this.updateTop(currentItem.view.id, top);
|
|
||||||
top += currentItem.size;
|
|
||||||
}
|
|
||||||
this.relayout(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
resizeView(index: number, size: number): void {
|
|
||||||
if (this.state !== State.Idle) {
|
|
||||||
throw new Error('Cant modify splitview');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.state = State.Busy;
|
|
||||||
|
|
||||||
if (index < 0 || index >= this.viewItems.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const item = this.viewItems[index];
|
|
||||||
size = Math.round(size);
|
|
||||||
size = clamp(size, item.view.minimumSize, item.view.maximumSize);
|
|
||||||
let delta = size - item.size;
|
|
||||||
|
|
||||||
if (delta !== 0 && index < this.viewItems.length - 1) {
|
|
||||||
const downIndexes = range(index + 1, this.viewItems.length);
|
|
||||||
const collapseDown = downIndexes.reduce((r, i) => r + (this.viewItems[i].size - this.viewItems[i].view.minimumSize), 0);
|
|
||||||
const expandDown = downIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - this.viewItems[i].size), 0);
|
|
||||||
const deltaDown = clamp(delta, -expandDown, collapseDown);
|
|
||||||
|
|
||||||
this.resize(index, deltaDown);
|
|
||||||
delta -= deltaDown;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (delta !== 0 && index > 0) {
|
|
||||||
const upIndexes = range(index - 1, -1);
|
|
||||||
const collapseUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].size - this.viewItems[i].view.minimumSize), 0);
|
|
||||||
const expandUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - this.viewItems[i].size), 0);
|
|
||||||
const deltaUp = clamp(-delta, -collapseUp, expandUp);
|
|
||||||
|
|
||||||
this.resize(index - 1, deltaUp);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.state = State.Idle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// DOM changes
|
// DOM changes
|
||||||
|
|
||||||
private insertItemInDOM(item: IViewItem): boolean {
|
private insertItemInDOM(item: IViewItem): boolean {
|
||||||
@@ -503,13 +726,13 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (elementAfter === null) {
|
if (elementAfter === null) {
|
||||||
this.el.appendChild(item.container);
|
this.viewContainer.appendChild(item.container);
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
this.el.insertBefore(item.container, elementAfter);
|
this.viewContainer.insertBefore(item.container, elementAfter);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// console.warn('Failed to locate previous tree element');
|
// console.warn('Failed to locate previous tree element');
|
||||||
this.el.appendChild(item.container);
|
this.viewContainer.appendChild(item.container);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,85 +747,94 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.el.removeChild(item.container);
|
this.viewContainer.removeChild(item.container);
|
||||||
|
|
||||||
item.onRemove();
|
item.onRemove();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
getViewSize(index: number): number {
|
private resize(
|
||||||
|
index: number,
|
||||||
|
delta: number,
|
||||||
|
sizes = this.viewItems.map(i => i.size),
|
||||||
|
lowPriorityIndex?: number,
|
||||||
|
highPriorityIndex?: number,
|
||||||
|
overloadMinDelta: number = Number.NEGATIVE_INFINITY,
|
||||||
|
overloadMaxDelta: number = Number.POSITIVE_INFINITY
|
||||||
|
): number {
|
||||||
if (index < 0 || index >= this.viewItems.length) {
|
if (index < 0 || index >= this.viewItems.length) {
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.viewItems[index].size;
|
const upIndexes = range(index, -1);
|
||||||
|
const downIndexes = range(index + 1, this.viewItems.length);
|
||||||
|
|
||||||
|
if (typeof highPriorityIndex === 'number') {
|
||||||
|
pushToStart(upIndexes, highPriorityIndex);
|
||||||
|
pushToStart(downIndexes, highPriorityIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof lowPriorityIndex === 'number') {
|
||||||
|
pushToEnd(upIndexes, lowPriorityIndex);
|
||||||
|
pushToEnd(downIndexes, lowPriorityIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
const upItems = upIndexes.map(i => this.viewItems[i]);
|
||||||
|
const upSizes = upIndexes.map(i => sizes[i]);
|
||||||
|
|
||||||
|
const downItems = downIndexes.map(i => this.viewItems[i]);
|
||||||
|
const downSizes = downIndexes.map(i => sizes[i]);
|
||||||
|
|
||||||
|
const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.minimumSize - sizes[i]), 0);
|
||||||
|
const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - sizes[i]), 0);
|
||||||
|
const maxDeltaDown = downIndexes.length === 0 ? Number.POSITIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.minimumSize), 0);
|
||||||
|
const minDeltaDown = downIndexes.length === 0 ? Number.NEGATIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.maximumSize), 0);
|
||||||
|
const minDelta = Math.max(minDeltaUp, minDeltaDown, overloadMinDelta);
|
||||||
|
const maxDelta = Math.min(maxDeltaDown, maxDeltaUp, overloadMaxDelta);
|
||||||
|
|
||||||
|
delta = clamp(delta, minDelta, maxDelta);
|
||||||
|
|
||||||
|
for (let i = 0, deltaUp = delta; i < upItems.length; i++) {
|
||||||
|
const item = upItems[i];
|
||||||
|
const size = clamp(upSizes[i] + deltaUp, item.view.minimumSize, item.view.maximumSize);
|
||||||
|
const viewDelta = size - upSizes[i];
|
||||||
|
|
||||||
|
deltaUp -= viewDelta;
|
||||||
|
item.size = size;
|
||||||
|
this.dirtyState = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0, deltaDown = delta; i < downItems.length; i++) {
|
||||||
|
const item = downItems[i];
|
||||||
|
const size = clamp(downSizes[i] - deltaDown, item.view.minimumSize, item.view.maximumSize);
|
||||||
|
const viewDelta = size - downSizes[i];
|
||||||
|
|
||||||
|
deltaDown += viewDelta;
|
||||||
|
item.size = size;
|
||||||
|
this.dirtyState = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
private resize(index: number, delta: number, sizes = this.viewItems.map(i => i.size), lowPriorityIndex?: number): void {
|
private distributeEmptySpace(): void {
|
||||||
if (index < 0 || index >= this.viewItems.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (delta !== 0) {
|
|
||||||
let upIndexes = range(index, -1);
|
|
||||||
let downIndexes = range(index + 1, this.viewItems.length);
|
|
||||||
|
|
||||||
if (typeof lowPriorityIndex === 'number') {
|
|
||||||
upIndexes = pushToEnd(upIndexes, lowPriorityIndex);
|
|
||||||
downIndexes = pushToEnd(downIndexes, lowPriorityIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
const upItems = upIndexes.map(i => this.viewItems[i]);
|
|
||||||
const upSizes = upIndexes.map(i => sizes[i]);
|
|
||||||
|
|
||||||
const downItems = downIndexes.map(i => this.viewItems[i]);
|
|
||||||
const downSizes = downIndexes.map(i => sizes[i]);
|
|
||||||
|
|
||||||
for (let i = 0, deltaUp = delta; deltaUp !== 0 && i < upItems.length; i++) {
|
|
||||||
const item = upItems[i];
|
|
||||||
const size = clamp(upSizes[i] + deltaUp, item.view.minimumSize, item.view.maximumSize);
|
|
||||||
const viewDelta = size - upSizes[i];
|
|
||||||
|
|
||||||
deltaUp -= viewDelta;
|
|
||||||
item.size = size;
|
|
||||||
this.dirtyState = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0, deltaDown = delta; deltaDown !== 0 && i < downItems.length; i++) {
|
|
||||||
const item = downItems[i];
|
|
||||||
const size = clamp(downSizes[i] - deltaDown, item.view.minimumSize, item.view.maximumSize);
|
|
||||||
const viewDelta = size - downSizes[i];
|
|
||||||
|
|
||||||
deltaDown += viewDelta;
|
|
||||||
item.size = size;
|
|
||||||
this.dirtyState = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
|
let contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
|
||||||
let emptyDelta = this.size - contentSize;
|
let emptyDelta = this.size - contentSize;
|
||||||
|
|
||||||
for (let i = this.viewItems.length - 1; emptyDelta > 0 && i >= 0; i--) {
|
for (let i = this.viewItems.length - 1; emptyDelta !== 0 && i >= 0; i--) {
|
||||||
const item = this.viewItems[i];
|
const item = this.viewItems[i];
|
||||||
const size = clamp(item.size + emptyDelta, item.view.minimumSize, item.view.maximumSize);
|
const size = clamp(item.size + emptyDelta, item.view.minimumSize, item.view.maximumSize);
|
||||||
const viewDelta = size - item.size;
|
const viewDelta = size - item.size;
|
||||||
|
|
||||||
emptyDelta -= viewDelta;
|
emptyDelta -= viewDelta;
|
||||||
item.size = size;
|
item.size = size;
|
||||||
this.dirtyState = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
|
|
||||||
|
|
||||||
this.scrollable.setScrollDimensions({
|
|
||||||
scrollHeight: this.contentSize,
|
|
||||||
height: this.size
|
|
||||||
});
|
|
||||||
|
|
||||||
this.layoutViews();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private layoutViews(): void {
|
private layoutViews(): void {
|
||||||
|
// Save new content size
|
||||||
|
this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
|
||||||
|
|
||||||
if (this.dirtyState) {
|
if (this.dirtyState) {
|
||||||
for (let i = this.indexAt(this.lastRenderTop); i <= this.indexAfter(this.lastRenderTop + this.lastRenderHeight) - 1; i++) {
|
for (let i = this.indexAt(this.lastRenderTop); i <= this.indexAfter(this.lastRenderTop + this.lastRenderHeight) - 1; i++) {
|
||||||
this.viewItems[i].layout();
|
this.viewItems[i].layout();
|
||||||
@@ -613,27 +845,10 @@ export class ScrollableSplitView extends HeightMap implements IDisposable {
|
|||||||
this.dirtyState = false;
|
this.dirtyState = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update sashes enablement
|
this.scrollable.setScrollDimensions({
|
||||||
// let previous = false;
|
scrollHeight: this.contentSize,
|
||||||
// const collapsesDown = this.viewItems.map(i => previous = (i.size - i.view.minimumSize > 0) || previous);
|
height: this.size
|
||||||
|
});
|
||||||
// previous = false;
|
|
||||||
// const expandsDown = this.viewItems.map(i => previous = (i.view.maximumSize - i.size > 0) || previous);
|
|
||||||
|
|
||||||
// const reverseViews = [...this.viewItems].reverse();
|
|
||||||
// previous = false;
|
|
||||||
// const collapsesUp = reverseViews.map(i => previous = (i.size - i.view.minimumSize > 0) || previous).reverse();
|
|
||||||
|
|
||||||
// previous = false;
|
|
||||||
// const expandsUp = reverseViews.map(i => previous = (i.view.maximumSize - i.size > 0) || previous).reverse();
|
|
||||||
|
|
||||||
// this.sashItems.forEach((s, i) => {
|
|
||||||
// if ((collapsesDown[i] && expandsUp[i + 1]) || (expandsDown[i] && collapsesUp[i + 1])) {
|
|
||||||
// s.sash.enable();
|
|
||||||
// } else {
|
|
||||||
// s.sash.disable();
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private getSashPosition(sash: Sash): number {
|
private getSashPosition(sash: Sash): number {
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e8e8e8" d="M6 4v8l4-4-4-4zm1 2.414l1.586 1.586-1.586 1.586v-3.172z"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 151 B |
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#646465" d="M6 4v8l4-4-4-4zm1 2.414l1.586 1.586-1.586 1.586v-3.172z"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 151 B |
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#e8e8e8" d="M11 10.07h-5.656l5.656-5.656v5.656z"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 131 B |
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#646465" d="M11 10.07h-5.656l5.656-5.656v5.656z"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 131 B |
@@ -1,94 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
.monaco-split-view {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view > .split-view-view {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view.vertical > .split-view-view {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view.horizontal > .split-view-view {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view > .split-view-view > .header {
|
|
||||||
position: relative;
|
|
||||||
line-height: 22px;
|
|
||||||
font-size: 11px;
|
|
||||||
font-weight: bold;
|
|
||||||
text-transform: uppercase;
|
|
||||||
padding-left: 20px;
|
|
||||||
overflow: hidden;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view > .split-view-view > .header.hide {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bold font style does not go well with CJK fonts */
|
|
||||||
.monaco-split-view:lang(zh-Hans) > .split-view-view > .header,
|
|
||||||
.monaco-split-view:lang(zh-Hant) > .split-view-view > .header,
|
|
||||||
.monaco-split-view:lang(ja) > .split-view-view > .header,
|
|
||||||
.monaco-split-view:lang(ko) > .split-view-view > .header { font-weight: normal; }
|
|
||||||
|
|
||||||
.monaco-split-view > .split-view-view > .header.collapsible {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view > .split-view-view > .header.collapsible {
|
|
||||||
background-image: url('arrow-collapse.svg');
|
|
||||||
background-position: 2px center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view > .split-view-view > .header.collapsible:not(.collapsed) {
|
|
||||||
background-image: url('arrow-expand.svg');
|
|
||||||
background-position: 2px center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vs-dark .monaco-split-view > .split-view-view > .header.collapsible {
|
|
||||||
background-image: url('arrow-collapse-dark.svg');
|
|
||||||
}
|
|
||||||
|
|
||||||
.vs-dark .monaco-split-view > .split-view-view > .header.collapsible:not(.collapsed) {
|
|
||||||
background-image: url('arrow-expand-dark.svg');
|
|
||||||
background-position: 2px center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Animation */
|
|
||||||
|
|
||||||
.monaco-split-view.animated > .split-view-view {
|
|
||||||
transition-duration: 0.15s;
|
|
||||||
-webkit-transition-duration: 0.15s;
|
|
||||||
-moz-transition-duration: 0.15s;
|
|
||||||
transition-timing-function: ease-out;
|
|
||||||
-webkit-transition-timing-function: ease-out;
|
|
||||||
-moz-transition-timing-function: ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view.vertical.animated > .split-view-view {
|
|
||||||
transition-property: height;
|
|
||||||
-webkit-transition-property: height;
|
|
||||||
-moz-transition-property: height;
|
|
||||||
}
|
|
||||||
|
|
||||||
.monaco-split-view.horizontal.animated > .split-view-view {
|
|
||||||
transition-property: width;
|
|
||||||
-webkit-transition-property: width;
|
|
||||||
-moz-transition-property: width;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hc-black .split-view-view > .header .action-label:before {
|
|
||||||
top: 4px !important;
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,148 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
import { Table } from './table';
|
|
||||||
import { TableDataView } from './tableDataView';
|
|
||||||
import { View, Orientation, AbstractCollapsibleView, HeaderView, ICollapsibleViewOptions, IViewOptions, CollapsibleState } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
import { $ } from 'vs/base/browser/builder';
|
|
||||||
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
|
||||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
|
||||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
|
||||||
|
|
||||||
export class TableBasicView<T> extends View {
|
|
||||||
private _table: Table<T>;
|
|
||||||
private _container: HTMLElement;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
viewOpts: IViewOptions,
|
|
||||||
data?: Array<T> | TableDataView<T>,
|
|
||||||
columns?: Slick.Column<T>[],
|
|
||||||
tableOpts?: Slick.GridOptions<T>
|
|
||||||
) {
|
|
||||||
super(undefined, viewOpts);
|
|
||||||
this._container = document.createElement('div');
|
|
||||||
this._container.className = 'table-view';
|
|
||||||
this._table = new Table<T>(this._container, { dataProvider: data, columns }, tableOpts);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get table(): Table<T> {
|
|
||||||
return this._table;
|
|
||||||
}
|
|
||||||
|
|
||||||
render(container: HTMLElement, orientation: Orientation): void {
|
|
||||||
container.appendChild(this._container);
|
|
||||||
}
|
|
||||||
|
|
||||||
focus(): void {
|
|
||||||
this._table.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
layout(size: number, orientation: Orientation): void {
|
|
||||||
this._table.layout(size, orientation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class TableHeaderView<T> extends HeaderView {
|
|
||||||
private _table: Table<T>;
|
|
||||||
private _container: HTMLElement;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private _viewTitle: string,
|
|
||||||
viewOpts: IViewOptions,
|
|
||||||
data?: Array<T> | TableDataView<T>,
|
|
||||||
columns?: Slick.Column<T>[],
|
|
||||||
tableOpts?: Slick.GridOptions<T>
|
|
||||||
) {
|
|
||||||
super(undefined, viewOpts);
|
|
||||||
this._container = document.createElement('div');
|
|
||||||
this._container.className = 'table-view';
|
|
||||||
this._table = new Table<T>(this._container, { dataProvider: data, columns }, tableOpts);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get table(): Table<T> {
|
|
||||||
return this._table;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected renderHeader(container: HTMLElement): void {
|
|
||||||
const titleDiv = $('div.title').appendTo(container);
|
|
||||||
$('span').text(this._viewTitle).appendTo(titleDiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected renderBody(container: HTMLElement): void {
|
|
||||||
container.appendChild(this._container);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected layoutBody(size: number): void {
|
|
||||||
this._table.layout(size, Orientation.VERTICAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
focus(): void {
|
|
||||||
this._table.focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class TableCollapsibleView<T> extends AbstractCollapsibleView {
|
|
||||||
private _table: Table<T>;
|
|
||||||
private _container: HTMLElement;
|
|
||||||
private _headerTabListener: lifecycle.IDisposable;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private _viewTitle: string,
|
|
||||||
viewOpts: ICollapsibleViewOptions,
|
|
||||||
data?: Array<T> | TableDataView<T>,
|
|
||||||
columns?: Slick.Column<T>[],
|
|
||||||
tableOpts?: Slick.GridOptions<T>
|
|
||||||
) {
|
|
||||||
super(undefined, viewOpts);
|
|
||||||
this._container = document.createElement('div');
|
|
||||||
this._container.className = 'table-view';
|
|
||||||
this._table = new Table<T>(this._container, { dataProvider: data, columns }, tableOpts);
|
|
||||||
}
|
|
||||||
|
|
||||||
public render(container: HTMLElement, orientation: Orientation): void {
|
|
||||||
super.render(container, orientation);
|
|
||||||
this._headerTabListener = DOM.addDisposableListener(this.header, DOM.EventType.KEY_DOWN, (e) => {
|
|
||||||
let event = new StandardKeyboardEvent(e);
|
|
||||||
if (event.equals(KeyCode.Tab) && this.state === CollapsibleState.EXPANDED) {
|
|
||||||
let element = this._table.getSelectedRows();
|
|
||||||
if (!element || element.length === 0) {
|
|
||||||
this._table.setSelectedRows([0]);
|
|
||||||
this._table.setActiveCell(0, 1);
|
|
||||||
e.stopImmediatePropagation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public dispose(): void {
|
|
||||||
if (this._headerTabListener) {
|
|
||||||
this._headerTabListener.dispose();
|
|
||||||
this._headerTabListener = null;
|
|
||||||
}
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
public addContainerClass(className: string) {
|
|
||||||
this._container.classList.add(className);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get table(): Table<T> {
|
|
||||||
return this._table;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected renderHeader(container: HTMLElement): void {
|
|
||||||
const titleDiv = $('div.title').appendTo(container);
|
|
||||||
$('span').text(this._viewTitle).appendTo(titleDiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected renderBody(container: HTMLElement): void {
|
|
||||||
container.appendChild(this._container);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected layoutBody(size: number): void {
|
|
||||||
this._table.layout(size, Orientation.VERTICAL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
.custom-view-tree-node-item {
|
|
||||||
display: flex;
|
|
||||||
height: 22px;
|
|
||||||
line-height: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-view-tree-node-item > .custom-view-tree-node-item-icon {
|
|
||||||
background-size: 16px;
|
|
||||||
background-position: left center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
padding-right: 6px;
|
|
||||||
width: 16px;
|
|
||||||
height: 22px;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-view-tree-node-item > .custom-view-tree-node-item-label {
|
|
||||||
flex: 1;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
@@ -1,303 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
import * as nls from 'vs/nls';
|
|
||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
|
||||||
import { IThemable } from 'vs/platform/theme/common/styler';
|
|
||||||
import * as errors from 'vs/base/common/errors';
|
|
||||||
import { $ } from 'vs/base/browser/builder';
|
|
||||||
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
|
|
||||||
import { IAction, IActionRunner } from 'vs/base/common/actions';
|
|
||||||
import { IActionItem, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar';
|
|
||||||
import { prepareActions } from 'vs/workbench/browser/actions';
|
|
||||||
import { ITree } from 'vs/base/parts/tree/browser/tree';
|
|
||||||
import { DelayedDragHandler } from 'vs/base/browser/dnd';
|
|
||||||
import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar';
|
|
||||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
|
||||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
|
||||||
import { AbstractCollapsibleView, CollapsibleState, IView as IBaseView, SplitView, ViewSizing } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
|
|
||||||
export interface IViewOptions {
|
|
||||||
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
actionRunner: IActionRunner;
|
|
||||||
|
|
||||||
collapsed: boolean;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IViewConstructorSignature {
|
|
||||||
|
|
||||||
new(initialSize: number, options: IViewOptions, ...services: { _serviceBrand: any; }[]): IView;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IView extends IBaseView, IThemable {
|
|
||||||
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
getHeaderElement(): HTMLElement;
|
|
||||||
|
|
||||||
create(): TPromise<void>;
|
|
||||||
|
|
||||||
setVisible(visible: boolean): TPromise<void>;
|
|
||||||
|
|
||||||
isVisible(): boolean;
|
|
||||||
|
|
||||||
getActions(): IAction[];
|
|
||||||
|
|
||||||
getSecondaryActions(): IAction[];
|
|
||||||
|
|
||||||
getActionItem(action: IAction): IActionItem;
|
|
||||||
|
|
||||||
getActionsContext(): any;
|
|
||||||
|
|
||||||
showHeader(): boolean;
|
|
||||||
|
|
||||||
hideHeader(): boolean;
|
|
||||||
|
|
||||||
focusBody(): void;
|
|
||||||
|
|
||||||
isExpanded(): boolean;
|
|
||||||
|
|
||||||
expand(): void;
|
|
||||||
|
|
||||||
collapse(): void;
|
|
||||||
|
|
||||||
getOptimalWidth(): number;
|
|
||||||
|
|
||||||
shutdown(): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ICollapsibleViewOptions extends IViewOptions {
|
|
||||||
|
|
||||||
ariaHeaderLabel?: string;
|
|
||||||
|
|
||||||
sizing: ViewSizing;
|
|
||||||
|
|
||||||
initialBodySize?: number;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class CollapsibleView extends AbstractCollapsibleView implements IView {
|
|
||||||
|
|
||||||
readonly id: string;
|
|
||||||
readonly name: string;
|
|
||||||
|
|
||||||
protected treeContainer: HTMLElement;
|
|
||||||
protected tree: ITree;
|
|
||||||
protected toDispose: IDisposable[];
|
|
||||||
protected toolBar: ToolBar;
|
|
||||||
protected actionRunner: IActionRunner;
|
|
||||||
protected isDisposed: boolean;
|
|
||||||
|
|
||||||
private _isVisible: boolean;
|
|
||||||
|
|
||||||
private dragHandler: DelayedDragHandler;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
initialSize: number,
|
|
||||||
options: ICollapsibleViewOptions,
|
|
||||||
protected keybindingService: IKeybindingService,
|
|
||||||
protected contextMenuService: IContextMenuService
|
|
||||||
) {
|
|
||||||
super(initialSize, {
|
|
||||||
ariaHeaderLabel: options.ariaHeaderLabel,
|
|
||||||
sizing: options.sizing,
|
|
||||||
bodySize: options.initialBodySize ? options.initialBodySize : 4 * 22,
|
|
||||||
initialState: options.collapsed ? CollapsibleState.COLLAPSED : CollapsibleState.EXPANDED,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.id = options.id;
|
|
||||||
this.name = options.name;
|
|
||||||
this.actionRunner = options.actionRunner;
|
|
||||||
this.toDispose = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected changeState(state: CollapsibleState): void {
|
|
||||||
this.updateTreeVisibility(this.tree, state === CollapsibleState.EXPANDED);
|
|
||||||
|
|
||||||
super.changeState(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
get draggableLabel(): string { return this.name; }
|
|
||||||
|
|
||||||
public create(): TPromise<void> {
|
|
||||||
return TPromise.as(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
getHeaderElement(): HTMLElement {
|
|
||||||
return this.header;
|
|
||||||
}
|
|
||||||
|
|
||||||
public renderHeader(container: HTMLElement): void {
|
|
||||||
|
|
||||||
// Tool bar
|
|
||||||
this.toolBar = new ToolBar($('div.actions').appendTo(container).getHTMLElement(), this.contextMenuService, {
|
|
||||||
orientation: ActionsOrientation.HORIZONTAL,
|
|
||||||
actionItemProvider: (action) => this.getActionItem(action),
|
|
||||||
ariaLabel: nls.localize('viewToolbarAriaLabel', "{0} actions", this.name),
|
|
||||||
getKeyBinding: (action) => this.keybindingService.lookupKeybinding(action.id)
|
|
||||||
});
|
|
||||||
this.toolBar.actionRunner = this.actionRunner;
|
|
||||||
this.updateActions();
|
|
||||||
|
|
||||||
// Expand on drag over
|
|
||||||
this.dragHandler = new DelayedDragHandler(container, () => {
|
|
||||||
if (!this.isExpanded()) {
|
|
||||||
this.expand();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected updateActions(): void {
|
|
||||||
this.toolBar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))();
|
|
||||||
this.toolBar.context = this.getActionsContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected renderViewTree(container: HTMLElement): HTMLElement {
|
|
||||||
const treeContainer = document.createElement('div');
|
|
||||||
container.appendChild(treeContainer);
|
|
||||||
|
|
||||||
return treeContainer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getViewer(): ITree {
|
|
||||||
return this.tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
public isVisible(): boolean {
|
|
||||||
return this._isVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
public setVisible(visible: boolean): TPromise<void> {
|
|
||||||
if (this._isVisible !== visible) {
|
|
||||||
this._isVisible = visible;
|
|
||||||
this.updateTreeVisibility(this.tree, visible && this.state === CollapsibleState.EXPANDED);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TPromise.as(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public focusBody(): void {
|
|
||||||
this.focusTree();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected reveal(element: any, relativeTop?: number): TPromise<void> {
|
|
||||||
if (!this.tree) {
|
|
||||||
return TPromise.as(null); // return early if viewlet has not yet been created
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.tree.reveal(element, relativeTop);
|
|
||||||
}
|
|
||||||
|
|
||||||
public layoutBody(size: number): void {
|
|
||||||
if (this.tree) {
|
|
||||||
this.treeContainer.style.height = size + 'px';
|
|
||||||
this.tree.layout(size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public getActions(): IAction[] {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public getSecondaryActions(): IAction[] {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public getActionItem(action: IAction): IActionItem {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getActionsContext(): any {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
public shutdown(): void {
|
|
||||||
// Subclass to implement
|
|
||||||
}
|
|
||||||
|
|
||||||
public getOptimalWidth(): number {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public dispose(): void {
|
|
||||||
this.isDisposed = true;
|
|
||||||
this.treeContainer = null;
|
|
||||||
|
|
||||||
if (this.tree) {
|
|
||||||
this.tree.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.dragHandler) {
|
|
||||||
this.dragHandler.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.toDispose = dispose(this.toDispose);
|
|
||||||
|
|
||||||
if (this.toolBar) {
|
|
||||||
this.toolBar.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
private updateTreeVisibility(tree: ITree, isVisible: boolean): void {
|
|
||||||
if (!tree) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isVisible) {
|
|
||||||
$(tree.getHTMLElement()).show();
|
|
||||||
} else {
|
|
||||||
$(tree.getHTMLElement()).hide(); // make sure the tree goes out of the tabindex world by hiding it
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isVisible) {
|
|
||||||
tree.onVisible();
|
|
||||||
} else {
|
|
||||||
tree.onHidden();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private focusTree(): void {
|
|
||||||
if (!this.tree) {
|
|
||||||
return; // return early if viewlet has not yet been created
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure the current selected element is revealed
|
|
||||||
const selection = this.tree.getSelection();
|
|
||||||
if (selection.length > 0) {
|
|
||||||
this.reveal(selection[0], 0.5).done(null, errors.onUnexpectedError);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pass Focus to Viewer
|
|
||||||
this.tree.domFocus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IViewletViewOptions extends IViewOptions {
|
|
||||||
|
|
||||||
viewletSettings: object;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IViewState {
|
|
||||||
|
|
||||||
collapsed: boolean;
|
|
||||||
|
|
||||||
size: number | undefined;
|
|
||||||
|
|
||||||
isHidden: boolean;
|
|
||||||
|
|
||||||
order: number;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
|
||||||
import { Event } from 'vs/base/common/event';
|
|
||||||
import { Command } from 'vs/editor/common/modes';
|
|
||||||
|
|
||||||
export type TreeViewItemHandleArg = {
|
|
||||||
$treeViewId: string,
|
|
||||||
$treeItemHandle: number
|
|
||||||
};
|
|
||||||
|
|
||||||
export enum TreeItemCollapsibleState {
|
|
||||||
None = 0,
|
|
||||||
Collapsed = 1,
|
|
||||||
Expanded = 2
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ITreeItem {
|
|
||||||
|
|
||||||
handle: number;
|
|
||||||
|
|
||||||
label: string;
|
|
||||||
|
|
||||||
icon?: string;
|
|
||||||
|
|
||||||
iconDark?: string;
|
|
||||||
|
|
||||||
contextValue?: string;
|
|
||||||
|
|
||||||
command?: Command;
|
|
||||||
|
|
||||||
children?: ITreeItem[];
|
|
||||||
|
|
||||||
collapsibleState?: TreeItemCollapsibleState;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ITreeViewDataProvider {
|
|
||||||
|
|
||||||
onDidChange: Event<ITreeItem[] | undefined | null>;
|
|
||||||
|
|
||||||
onDispose: Event<void>;
|
|
||||||
|
|
||||||
getElements(): TPromise<ITreeItem[]>;
|
|
||||||
|
|
||||||
getChildren(element: ITreeItem): TPromise<ITreeItem[]>;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,8 @@ import { IThemeService } from 'vs/platform/theme/common/themeService';
|
|||||||
import * as cr from 'vs/platform/theme/common/colorRegistry';
|
import * as cr from 'vs/platform/theme/common/colorRegistry';
|
||||||
import { IThemable, attachStyler } from 'vs/platform/theme/common/styler';
|
import { IThemable, attachStyler } from 'vs/platform/theme/common/styler';
|
||||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
import { SIDE_BAR_BACKGROUND, SIDE_BAR_SECTION_HEADER_FOREGROUND, SIDE_BAR_SECTION_HEADER_BACKGROUND, SIDE_BAR_DRAG_AND_DROP_BACKGROUND } from 'vs/workbench/common/theme';
|
||||||
|
import { IPanelColors } from 'vs/workbench/browser/parts/views/panelViewlet';
|
||||||
|
|
||||||
export function attachModalDialogStyler(widget: IThemable, themeService: IThemeService, style?:
|
export function attachModalDialogStyler(widget: IThemable, themeService: IThemeService, style?:
|
||||||
{
|
{
|
||||||
@@ -262,3 +263,12 @@ export function attachCheckboxStyler(widget: IThemable, themeService: IThemeServ
|
|||||||
disabledCheckboxForeground: (style && style.disabledCheckboxForeground) || sqlcolors.disabledCheckboxForeground
|
disabledCheckboxForeground: (style && style.disabledCheckboxForeground) || sqlcolors.disabledCheckboxForeground
|
||||||
}, widget);
|
}, widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function attachPanelStyler(widget: IThemable, themeService: IThemeService) {
|
||||||
|
return attachStyler<IPanelColors>(themeService, {
|
||||||
|
headerForeground: SIDE_BAR_SECTION_HEADER_FOREGROUND,
|
||||||
|
headerBackground: SIDE_BAR_SECTION_HEADER_BACKGROUND,
|
||||||
|
// headerHighContrastBorder: index === 0 ? null : contrastBorder,
|
||||||
|
dropBackground: SIDE_BAR_DRAG_AND_DROP_BACKGROUND
|
||||||
|
}, widget);
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,35 +8,87 @@
|
|||||||
import 'vs/css!./media/accountDialog';
|
import 'vs/css!./media/accountDialog';
|
||||||
import 'vs/css!sql/parts/accountManagement/common/media/accountActions';
|
import 'vs/css!sql/parts/accountManagement/common/media/accountActions';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
import { SplitView } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
import { List } from 'vs/base/browser/ui/list/listWidget';
|
import { List } from 'vs/base/browser/ui/list/listWidget';
|
||||||
import { IListService, ListService } from 'vs/platform/list/browser/listService';
|
|
||||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import { Event, Emitter } from 'vs/base/common/event';
|
import { Event, Emitter } from 'vs/base/common/event';
|
||||||
import { localize } from 'vs/nls';
|
import { localize } from 'vs/nls';
|
||||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||||
import { attachListStyler } from 'vs/platform/theme/common/styler';
|
import { attachListStyler } from 'vs/platform/theme/common/styler';
|
||||||
import { ActionRunner } from 'vs/base/common/actions';
|
import { IAction } from 'vs/base/common/actions';
|
||||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||||
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
import { SplitView, Sizing } from 'vs/base/browser/ui/splitview/splitview';
|
||||||
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet';
|
||||||
|
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||||
|
import { values } from 'vs/base/common/map';
|
||||||
|
|
||||||
import * as sqlops from 'sqlops';
|
import * as sqlops from 'sqlops';
|
||||||
|
|
||||||
import { Button } from 'sql/base/browser/ui/button/button';
|
import { Button } from 'sql/base/browser/ui/button/button';
|
||||||
import { Modal } from 'sql/base/browser/ui/modal/modal';
|
import { Modal } from 'sql/base/browser/ui/modal/modal';
|
||||||
import { attachModalDialogStyler, attachButtonStyler } from 'sql/common/theme/styler';
|
import { attachModalDialogStyler, attachButtonStyler, attachPanelStyler } from 'sql/common/theme/styler';
|
||||||
import { AccountViewModel } from 'sql/parts/accountManagement/accountDialog/accountViewModel';
|
import { AccountViewModel } from 'sql/parts/accountManagement/accountDialog/accountViewModel';
|
||||||
import { AddAccountAction } from 'sql/parts/accountManagement/common/accountActions';
|
import { AddAccountAction } from 'sql/parts/accountManagement/common/accountActions';
|
||||||
import { AccountListRenderer, AccountListDelegate } from 'sql/parts/accountManagement/common/accountListRenderer';
|
import { AccountListRenderer, AccountListDelegate } from 'sql/parts/accountManagement/common/accountListRenderer';
|
||||||
import { AccountProviderAddedEventParams, UpdateAccountListEventParams } from 'sql/services/accountManagement/eventTypes';
|
import { AccountProviderAddedEventParams, UpdateAccountListEventParams } from 'sql/services/accountManagement/eventTypes';
|
||||||
import { FixedListView } from 'sql/platform/views/fixedListView';
|
|
||||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
|
||||||
import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService';
|
import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService';
|
||||||
|
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
||||||
|
|
||||||
|
class AccountPanel extends ViewletPanel {
|
||||||
|
public index: number;
|
||||||
|
private accountList: List<sqlops.Account>;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private options: IViewletPanelOptions,
|
||||||
|
@IKeybindingService keybindingService: IKeybindingService,
|
||||||
|
@IContextMenuService contextMenuService: IContextMenuService,
|
||||||
|
@IConfigurationService configurationService: IConfigurationService,
|
||||||
|
@IInstantiationService private instantiationService: IInstantiationService,
|
||||||
|
@IThemeService private themeService: IThemeService
|
||||||
|
) {
|
||||||
|
super(options, keybindingService, contextMenuService, configurationService);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected renderBody(container: HTMLElement): void {
|
||||||
|
this.accountList = new List<sqlops.Account>(container, new AccountListDelegate(AccountDialog.ACCOUNTLIST_HEIGHT), [this.instantiationService.createInstance(AccountListRenderer)]);
|
||||||
|
this.disposables.push(attachListStyler(this.accountList, this.themeService));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected layoutBody(size: number): void {
|
||||||
|
if (this.accountList) {
|
||||||
|
this.accountList.layout(size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get length(): number {
|
||||||
|
return this.accountList.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public focus() {
|
||||||
|
this.accountList.domFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public updateAccounts(accounts: sqlops.Account[]) {
|
||||||
|
this.accountList.splice(0, this.accountList.length, accounts);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setSelection(indexes: number[]) {
|
||||||
|
this.accountList.setSelection(indexes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getActions(): IAction[] {
|
||||||
|
return [this.instantiationService.createInstance(
|
||||||
|
AddAccountAction,
|
||||||
|
this.options.id
|
||||||
|
)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export interface IProviderViewUiComponent {
|
export interface IProviderViewUiComponent {
|
||||||
view: FixedListView<sqlops.Account>;
|
view: AccountPanel;
|
||||||
addAccountAction: AddAccountAction;
|
addAccountAction: AddAccountAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,13 +98,10 @@ export class AccountDialog extends Modal {
|
|||||||
public viewModel: AccountViewModel;
|
public viewModel: AccountViewModel;
|
||||||
|
|
||||||
// MEMBER VARIABLES ////////////////////////////////////////////////////
|
// MEMBER VARIABLES ////////////////////////////////////////////////////
|
||||||
private _providerViews: { [providerId: string]: IProviderViewUiComponent } = {};
|
private _providerViewsMap = new Map<string, IProviderViewUiComponent>();
|
||||||
|
|
||||||
private _closeButton: Button;
|
private _closeButton: Button;
|
||||||
private _addAccountButton: Button;
|
private _addAccountButton: Button;
|
||||||
private _delegate: AccountListDelegate;
|
|
||||||
private _accountRenderer: AccountListRenderer;
|
|
||||||
private _actionRunner: ActionRunner;
|
|
||||||
private _splitView: SplitView;
|
private _splitView: SplitView;
|
||||||
private _container: HTMLElement;
|
private _container: HTMLElement;
|
||||||
private _splitViewContainer: HTMLElement;
|
private _splitViewContainer: HTMLElement;
|
||||||
@@ -68,10 +117,10 @@ export class AccountDialog extends Modal {
|
|||||||
constructor(
|
constructor(
|
||||||
@IPartService partService: IPartService,
|
@IPartService partService: IPartService,
|
||||||
@IThemeService themeService: IThemeService,
|
@IThemeService themeService: IThemeService,
|
||||||
@IListService private _listService: IListService,
|
|
||||||
@IInstantiationService private _instantiationService: IInstantiationService,
|
@IInstantiationService private _instantiationService: IInstantiationService,
|
||||||
@IContextMenuService private _contextMenuService: IContextMenuService,
|
@IContextMenuService private _contextMenuService: IContextMenuService,
|
||||||
@IKeybindingService private _keybindingService: IKeybindingService,
|
@IKeybindingService private _keybindingService: IKeybindingService,
|
||||||
|
@IConfigurationService private _configurationService: IConfigurationService,
|
||||||
@ITelemetryService telemetryService: ITelemetryService,
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
@IContextKeyService contextKeyService: IContextKeyService,
|
@IContextKeyService contextKeyService: IContextKeyService,
|
||||||
@IClipboardService clipboardService: IClipboardService
|
@IClipboardService clipboardService: IClipboardService
|
||||||
@@ -86,11 +135,6 @@ export class AccountDialog extends Modal {
|
|||||||
contextKeyService,
|
contextKeyService,
|
||||||
{ hasSpinner: true }
|
{ hasSpinner: true }
|
||||||
);
|
);
|
||||||
let self = this;
|
|
||||||
|
|
||||||
this._delegate = new AccountListDelegate(AccountDialog.ACCOUNTLIST_HEIGHT);
|
|
||||||
this._accountRenderer = this._instantiationService.createInstance(AccountListRenderer);
|
|
||||||
this._actionRunner = new ActionRunner();
|
|
||||||
|
|
||||||
// Setup the event emitters
|
// Setup the event emitters
|
||||||
this._onAddAccountErrorEmitter = new Emitter<string>();
|
this._onAddAccountErrorEmitter = new Emitter<string>();
|
||||||
@@ -98,28 +142,25 @@ export class AccountDialog extends Modal {
|
|||||||
|
|
||||||
// Create the view model and wire up the events
|
// Create the view model and wire up the events
|
||||||
this.viewModel = this._instantiationService.createInstance(AccountViewModel);
|
this.viewModel = this._instantiationService.createInstance(AccountViewModel);
|
||||||
this.viewModel.addProviderEvent(arg => { self.addProvider(arg); });
|
this.viewModel.addProviderEvent(arg => { this.addProvider(arg); });
|
||||||
this.viewModel.removeProviderEvent(arg => { self.removeProvider(arg); });
|
this.viewModel.removeProviderEvent(arg => { this.removeProvider(arg); });
|
||||||
this.viewModel.updateAccountListEvent(arg => { self.updateProviderAccounts(arg); });
|
this.viewModel.updateAccountListEvent(arg => { this.updateProviderAccounts(arg); });
|
||||||
|
|
||||||
// Load the initial contents of the view model
|
// Load the initial contents of the view model
|
||||||
this.viewModel.initialize()
|
this.viewModel.initialize()
|
||||||
.then(addedProviders => {
|
.then(addedProviders => {
|
||||||
for (let addedProvider of addedProviders) {
|
for (let addedProvider of addedProviders) {
|
||||||
self.addProvider(addedProvider);
|
this.addProvider(addedProvider);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// MODAL OVERRIDE METHODS //////////////////////////////////////////////
|
// MODAL OVERRIDE METHODS //////////////////////////////////////////////
|
||||||
protected layout(height?: number): void {
|
protected layout(height?: number): void {
|
||||||
// Ignore height as it's a subcomponent being laid out
|
|
||||||
this._splitView.layout(DOM.getContentHeight(this._container));
|
this._splitView.layout(DOM.getContentHeight(this._container));
|
||||||
}
|
}
|
||||||
|
|
||||||
public render() {
|
public render() {
|
||||||
let self = this;
|
|
||||||
|
|
||||||
super.render();
|
super.render();
|
||||||
attachModalDialogStyler(this, this._themeService);
|
attachModalDialogStyler(this, this._themeService);
|
||||||
this._closeButton = this.addFooterButton(localize('accountDialog.close', 'Close'), () => this.close());
|
this._closeButton = this.addFooterButton(localize('accountDialog.close', 'Close'), () => this.close());
|
||||||
@@ -128,7 +169,7 @@ export class AccountDialog extends Modal {
|
|||||||
|
|
||||||
protected renderBody(container: HTMLElement) {
|
protected renderBody(container: HTMLElement) {
|
||||||
this._container = container;
|
this._container = container;
|
||||||
this._splitViewContainer = DOM.$('div.account-view');
|
this._splitViewContainer = DOM.$('div.account-view.monaco-panel-view');
|
||||||
DOM.append(container, this._splitViewContainer);
|
DOM.append(container, this._splitViewContainer);
|
||||||
this._splitView = new SplitView(this._splitViewContainer);
|
this._splitView = new SplitView(this._splitViewContainer);
|
||||||
|
|
||||||
@@ -143,7 +184,7 @@ export class AccountDialog extends Modal {
|
|||||||
this._addAccountButton = new Button(buttonSection);
|
this._addAccountButton = new Button(buttonSection);
|
||||||
this._addAccountButton.label = localize('accountDialog.addConnection', 'Add an account');
|
this._addAccountButton.label = localize('accountDialog.addConnection', 'Add an account');
|
||||||
this._register(this._addAccountButton.onDidClick(() => {
|
this._register(this._addAccountButton.onDidClick(() => {
|
||||||
(<IProviderViewUiComponent>Object.values(this._providerViews)[0]).addAccountAction.run();
|
(<IProviderViewUiComponent>values(this._providerViewsMap)[0]).addAccountAction.run();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
DOM.append(container, this._noaccountViewContainer);
|
DOM.append(container, this._noaccountViewContainer);
|
||||||
@@ -189,20 +230,19 @@ export class AccountDialog extends Modal {
|
|||||||
private showSplitView() {
|
private showSplitView() {
|
||||||
this._splitViewContainer.hidden = false;
|
this._splitViewContainer.hidden = false;
|
||||||
this._noaccountViewContainer.hidden = true;
|
this._noaccountViewContainer.hidden = true;
|
||||||
let views = this._splitView.getViews();
|
if (values(this._providerViewsMap).length > 0) {
|
||||||
if (views && views.length > 0) {
|
let firstView = values(this._providerViewsMap)[0];
|
||||||
let firstView = views[0];
|
if (firstView instanceof AccountPanel) {
|
||||||
if (firstView instanceof FixedListView) {
|
firstView.setSelection([0]);
|
||||||
firstView.list.setSelection([0]);
|
firstView.focus();
|
||||||
firstView.list.domFocus();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private isEmptyLinkedAccount(): boolean {
|
private isEmptyLinkedAccount(): boolean {
|
||||||
for (var providerId in this._providerViews) {
|
for (let provider of values(this._providerViewsMap)) {
|
||||||
var listView = this._providerViews[providerId].view;
|
let listView = provider.view;
|
||||||
if (listView && listView.list.length > 0) {
|
if (listView && listView.length > 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -211,23 +251,21 @@ export class AccountDialog extends Modal {
|
|||||||
|
|
||||||
public dispose(): void {
|
public dispose(): void {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
for (let key in this._providerViews) {
|
for (let provider of values(this._providerViewsMap)) {
|
||||||
if (this._providerViews[key].addAccountAction) {
|
if (provider.addAccountAction) {
|
||||||
this._providerViews[key].addAccountAction.dispose();
|
provider.addAccountAction.dispose();
|
||||||
}
|
}
|
||||||
if (this._providerViews[key].view) {
|
if (provider.view) {
|
||||||
this._providerViews[key].view.dispose();
|
provider.view.dispose();
|
||||||
}
|
}
|
||||||
delete this._providerViews[key];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PRIVATE HELPERS /////////////////////////////////////////////////////
|
// PRIVATE HELPERS /////////////////////////////////////////////////////
|
||||||
private addProvider(newProvider: AccountProviderAddedEventParams) {
|
private addProvider(newProvider: AccountProviderAddedEventParams) {
|
||||||
let self = this;
|
|
||||||
|
|
||||||
// Skip adding the provider if it already exists
|
// Skip adding the provider if it already exists
|
||||||
if (this._providerViews[newProvider.addedProvider.id]) {
|
if (this._providerViewsMap.get(newProvider.addedProvider.id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,37 +275,35 @@ export class AccountDialog extends Modal {
|
|||||||
AddAccountAction,
|
AddAccountAction,
|
||||||
newProvider.addedProvider.id
|
newProvider.addedProvider.id
|
||||||
);
|
);
|
||||||
addAccountAction.addAccountCompleteEvent(() => { self.hideSpinner(); });
|
addAccountAction.addAccountCompleteEvent(() => { this.hideSpinner(); });
|
||||||
addAccountAction.addAccountErrorEvent(msg => { self._onAddAccountErrorEmitter.fire(msg); });
|
addAccountAction.addAccountErrorEvent(msg => { this._onAddAccountErrorEmitter.fire(msg); });
|
||||||
addAccountAction.addAccountStartEvent(() => { self.showSpinner(); });
|
addAccountAction.addAccountStartEvent(() => { this.showSpinner(); });
|
||||||
|
|
||||||
// Create a fixed list view for the account provider
|
let providerView = new AccountPanel(
|
||||||
let providerViewContainer = DOM.$('.provider-view');
|
{
|
||||||
let accountList = new List<sqlops.Account>(providerViewContainer, this._delegate, [this._accountRenderer]);
|
id: newProvider.addedProvider.id,
|
||||||
let providerView = new FixedListView<sqlops.Account>(
|
title: newProvider.addedProvider.displayName,
|
||||||
undefined,
|
ariaHeaderLabel: newProvider.addedProvider.displayName
|
||||||
false,
|
},
|
||||||
newProvider.addedProvider.displayName,
|
|
||||||
accountList,
|
|
||||||
providerViewContainer,
|
|
||||||
22,
|
|
||||||
[addAccountAction],
|
|
||||||
this._actionRunner,
|
|
||||||
this._contextMenuService,
|
|
||||||
this._keybindingService,
|
this._keybindingService,
|
||||||
|
this._contextMenuService,
|
||||||
|
this._configurationService,
|
||||||
|
this._instantiationService,
|
||||||
this._themeService
|
this._themeService
|
||||||
);
|
);
|
||||||
|
|
||||||
// Append the list view to the split view
|
attachPanelStyler(providerView, this._themeService);
|
||||||
this._splitView.addView(providerView);
|
|
||||||
this._register(attachListStyler(accountList, this._themeService));
|
const insertIndex = this._splitView.length;
|
||||||
|
// Append the list view to the split view
|
||||||
|
this._splitView.addView(providerView, Sizing.Distribute, insertIndex);
|
||||||
|
providerView.render();
|
||||||
|
providerView.index = insertIndex;
|
||||||
|
|
||||||
let listService = <ListService>this._listService;
|
|
||||||
this._register(listService.register(accountList));
|
|
||||||
this._splitView.layout(DOM.getContentHeight(this._container));
|
this._splitView.layout(DOM.getContentHeight(this._container));
|
||||||
|
|
||||||
// Set the initial items of the list
|
// Set the initial items of the list
|
||||||
providerView.updateList(newProvider.initialAccounts);
|
providerView.updateAccounts(newProvider.initialAccounts);
|
||||||
|
|
||||||
if (newProvider.initialAccounts.length > 0 && this._splitViewContainer.hidden) {
|
if (newProvider.initialAccounts.length > 0 && this._splitViewContainer.hidden) {
|
||||||
this.showSplitView();
|
this.showSplitView();
|
||||||
@@ -276,31 +312,31 @@ export class AccountDialog extends Modal {
|
|||||||
this.layout();
|
this.layout();
|
||||||
|
|
||||||
// Store the view for the provider and action
|
// Store the view for the provider and action
|
||||||
this._providerViews[newProvider.addedProvider.id] = { view: providerView, addAccountAction: addAccountAction };
|
this._providerViewsMap.set(newProvider.addedProvider.id, { view: providerView, addAccountAction: addAccountAction });
|
||||||
}
|
}
|
||||||
|
|
||||||
private removeProvider(removedProvider: sqlops.AccountProviderMetadata) {
|
private removeProvider(removedProvider: sqlops.AccountProviderMetadata) {
|
||||||
// Skip removing the provider if it doesn't exist
|
// Skip removing the provider if it doesn't exist
|
||||||
let providerView = this._providerViews[removedProvider.id];
|
let providerView = this._providerViewsMap.get(removedProvider.id);
|
||||||
if (!providerView || !providerView.view) {
|
if (!providerView || !providerView.view) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove the list view from the split view
|
// Remove the list view from the split view
|
||||||
this._splitView.removeView(providerView.view);
|
this._splitView.removeView(providerView.view.index);
|
||||||
this._splitView.layout(DOM.getContentHeight(this._container));
|
this._splitView.layout(DOM.getContentHeight(this._container));
|
||||||
|
|
||||||
// Remove the list view from our internal map
|
// Remove the list view from our internal map
|
||||||
delete this._providerViews[removedProvider.id];
|
this._providerViewsMap.delete(removedProvider.id);
|
||||||
this.layout();
|
this.layout();
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateProviderAccounts(args: UpdateAccountListEventParams) {
|
private updateProviderAccounts(args: UpdateAccountListEventParams) {
|
||||||
let providerMapping = this._providerViews[args.providerId];
|
let providerMapping = this._providerViewsMap.get(args.providerId);
|
||||||
if (!providerMapping || !providerMapping.view) {
|
if (!providerMapping || !providerMapping.view) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
providerMapping.view.updateList(args.accountList);
|
providerMapping.view.updateAccounts(args.accountList);
|
||||||
|
|
||||||
if (args.accountList.length > 0 && this._splitViewContainer.hidden) {
|
if (args.accountList.length > 0 && this._splitViewContainer.hidden) {
|
||||||
this.showSplitView();
|
this.showSplitView();
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ import { localize } from 'vs/nls';
|
|||||||
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
||||||
|
|
||||||
export class AdvancedPropertiesController {
|
export class AdvancedPropertiesController {
|
||||||
private _container: HTMLElement;
|
|
||||||
|
|
||||||
private _advancedDialog: OptionsDialog;
|
private _advancedDialog: OptionsDialog;
|
||||||
private _options: { [name: string]: any };
|
private _options: { [name: string]: any };
|
||||||
|
|
||||||
@@ -30,7 +28,6 @@ export class AdvancedPropertiesController {
|
|||||||
|
|
||||||
public showDialog(providerOptions: sqlops.ConnectionOption[], container: HTMLElement, options: { [name: string]: any }): void {
|
public showDialog(providerOptions: sqlops.ConnectionOption[], container: HTMLElement, options: { [name: string]: any }): void {
|
||||||
this._options = options;
|
this._options = options;
|
||||||
this._container = container;
|
|
||||||
var serviceOptions = providerOptions.map(option => AdvancedPropertiesController.connectionOptionToServiceOption(option));
|
var serviceOptions = providerOptions.map(option => AdvancedPropertiesController.connectionOptionToServiceOption(option));
|
||||||
this.advancedDialog.open(serviceOptions, this._options);
|
this.advancedDialog.open(serviceOptions, this._options);
|
||||||
}
|
}
|
||||||
@@ -38,8 +35,7 @@ export class AdvancedPropertiesController {
|
|||||||
public get advancedDialog() {
|
public get advancedDialog() {
|
||||||
if (!this._advancedDialog) {
|
if (!this._advancedDialog) {
|
||||||
this._advancedDialog = this._instantiationService.createInstance(
|
this._advancedDialog = this._instantiationService.createInstance(
|
||||||
OptionsDialog, localize('connectionAdvancedProperties', 'Advanced Properties'), TelemetryKeys.ConnectionAdvancedProperties, { hasBackButton: true });
|
OptionsDialog, localize('connectionAdvancedProperties', 'Advanced Properties'), TelemetryKeys.ConnectionAdvancedProperties, { hasBackButton: true, cancelLabel: localize('advancedProperties.discard', 'Discard') });
|
||||||
this._advancedDialog.cancelLabel = localize('advancedProperties.discard', 'Discard');
|
|
||||||
this._advancedDialog.onCloseEvent(() => this._onCloseAdvancedProperties());
|
this._advancedDialog.onCloseEvent(() => this._onCloseAdvancedProperties());
|
||||||
this._advancedDialog.onOk(() => this.handleOnOk());
|
this._advancedDialog.onOk(() => this.handleOnOk());
|
||||||
this._advancedDialog.render();
|
this._advancedDialog.render();
|
||||||
|
|||||||
@@ -27,9 +27,7 @@ import { KeyCode } from 'vs/base/common/keyCodes';
|
|||||||
import { Button } from 'sql/base/browser/ui/button/button';
|
import { Button } from 'sql/base/browser/ui/button/button';
|
||||||
import { Modal } from 'sql/base/browser/ui/modal/modal';
|
import { Modal } from 'sql/base/browser/ui/modal/modal';
|
||||||
import { attachModalDialogStyler, attachButtonStyler } from 'sql/common/theme/styler';
|
import { attachModalDialogStyler, attachButtonStyler } from 'sql/common/theme/styler';
|
||||||
import { FixedListView } from 'sql/platform/views/fixedListView';
|
|
||||||
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
||||||
import { Orientation } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
import { NewDashboardTabViewModel, IDashboardUITab } from 'sql/parts/dashboard/newDashboardTabDialog/newDashboardTabViewModel';
|
import { NewDashboardTabViewModel, IDashboardUITab } from 'sql/parts/dashboard/newDashboardTabDialog/newDashboardTabViewModel';
|
||||||
import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
|
import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
|
||||||
import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService';
|
import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService';
|
||||||
@@ -104,8 +102,6 @@ export class NewDashboardTabDialog extends Modal {
|
|||||||
private _addNewTabButton: Button;
|
private _addNewTabButton: Button;
|
||||||
private _cancelButton: Button;
|
private _cancelButton: Button;
|
||||||
private _extensionList: List<IDashboardUITab>;
|
private _extensionList: List<IDashboardUITab>;
|
||||||
private _extensionTabView: FixedListView<IDashboardUITab>;
|
|
||||||
private _container: HTMLElement;
|
|
||||||
private _extensionViewContainer: HTMLElement;
|
private _extensionViewContainer: HTMLElement;
|
||||||
private _noExtensionViewContainer: HTMLElement;
|
private _noExtensionViewContainer: HTMLElement;
|
||||||
|
|
||||||
@@ -121,10 +117,6 @@ export class NewDashboardTabDialog extends Modal {
|
|||||||
constructor(
|
constructor(
|
||||||
@IPartService partService: IPartService,
|
@IPartService partService: IPartService,
|
||||||
@IThemeService themeService: IThemeService,
|
@IThemeService themeService: IThemeService,
|
||||||
@IListService private _listService: IListService,
|
|
||||||
@IInstantiationService private _instantiationService: IInstantiationService,
|
|
||||||
@IContextMenuService private _contextMenuService: IContextMenuService,
|
|
||||||
@IKeybindingService private _keybindingService: IKeybindingService,
|
|
||||||
@ITelemetryService telemetryService: ITelemetryService,
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
@IContextKeyService contextKeyService: IContextKeyService,
|
@IContextKeyService contextKeyService: IContextKeyService,
|
||||||
@IClipboardService clipboardService: IClipboardService
|
@IClipboardService clipboardService: IClipboardService
|
||||||
@@ -150,7 +142,7 @@ export class NewDashboardTabDialog extends Modal {
|
|||||||
|
|
||||||
// MODAL OVERRIDE METHODS //////////////////////////////////////////////
|
// MODAL OVERRIDE METHODS //////////////////////////////////////////////
|
||||||
protected layout(height?: number): void {
|
protected layout(height?: number): void {
|
||||||
// Nothing currently laid out in this class
|
this._extensionList.layout(height);
|
||||||
}
|
}
|
||||||
|
|
||||||
public render() {
|
public render() {
|
||||||
@@ -163,7 +155,6 @@ export class NewDashboardTabDialog extends Modal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected renderBody(container: HTMLElement) {
|
protected renderBody(container: HTMLElement) {
|
||||||
this._container = container;
|
|
||||||
this._extensionViewContainer = DOM.$('div.extension-view');
|
this._extensionViewContainer = DOM.$('div.extension-view');
|
||||||
DOM.append(container, this._extensionViewContainer);
|
DOM.append(container, this._extensionViewContainer);
|
||||||
|
|
||||||
@@ -182,19 +173,6 @@ export class NewDashboardTabDialog extends Modal {
|
|||||||
let delegate = new ExtensionListDelegate(NewDashboardTabDialog.EXTENSIONLIST_HEIGHT);
|
let delegate = new ExtensionListDelegate(NewDashboardTabDialog.EXTENSIONLIST_HEIGHT);
|
||||||
let extensionTabRenderer = new ExtensionListRenderer();
|
let extensionTabRenderer = new ExtensionListRenderer();
|
||||||
this._extensionList = new List<IDashboardUITab>(extensionTabViewContainer, delegate, [extensionTabRenderer]);
|
this._extensionList = new List<IDashboardUITab>(extensionTabViewContainer, delegate, [extensionTabRenderer]);
|
||||||
this._extensionTabView = new FixedListView<IDashboardUITab>(
|
|
||||||
undefined,
|
|
||||||
false,
|
|
||||||
localize('allFeatures', 'All features'),
|
|
||||||
this._extensionList,
|
|
||||||
extensionTabViewContainer,
|
|
||||||
22,
|
|
||||||
[],
|
|
||||||
undefined,
|
|
||||||
this._contextMenuService,
|
|
||||||
this._keybindingService,
|
|
||||||
this._themeService
|
|
||||||
);
|
|
||||||
|
|
||||||
this._extensionList.onMouseDblClick(e => this.onAccept());
|
this._extensionList.onMouseDblClick(e => this.onAccept());
|
||||||
this._extensionList.onKeyDown(e => {
|
this._extensionList.onKeyDown(e => {
|
||||||
@@ -206,13 +184,9 @@ export class NewDashboardTabDialog extends Modal {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this._extensionTabView.render(container, Orientation.VERTICAL);
|
DOM.append(container, extensionTabViewContainer);
|
||||||
this._extensionTabView.hideHeader();
|
|
||||||
|
|
||||||
this._register(attachListStyler(this._extensionList, this._themeService));
|
this._register(attachListStyler(this._extensionList, this._themeService));
|
||||||
|
|
||||||
let listService = <ListService>this._listService;
|
|
||||||
this._register(listService.register(this._extensionList));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private registerListeners(): void {
|
private registerListeners(): void {
|
||||||
@@ -252,7 +226,7 @@ export class NewDashboardTabDialog extends Modal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private onUpdateTabList(tabs: IDashboardUITab[]) {
|
private onUpdateTabList(tabs: IDashboardUITab[]) {
|
||||||
this._extensionTabView.updateList(tabs);
|
this._extensionList.splice(0, this._extensionList.length, tabs);
|
||||||
this.layout();
|
this.layout();
|
||||||
if (this._extensionList.length > 0) {
|
if (this._extensionList.length > 0) {
|
||||||
this._extensionViewContainer.hidden = false;
|
this._extensionViewContainer.hidden = false;
|
||||||
|
|||||||
@@ -13,27 +13,25 @@ import { ListBox } from 'sql/base/browser/ui/listBox/listBox';
|
|||||||
import { ModalFooterStyle } from 'sql/base/browser/ui/modal/modal';
|
import { ModalFooterStyle } from 'sql/base/browser/ui/modal/modal';
|
||||||
import { CategoryView } from 'sql/base/browser/ui/modal/optionsDialog';
|
import { CategoryView } from 'sql/base/browser/ui/modal/optionsDialog';
|
||||||
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
|
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
|
||||||
import { SplitView } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
import { attachButtonStyler, attachListBoxStyler, attachInputBoxStyler, attachSelectBoxStyler, attachCheckboxStyler } from 'sql/common/theme/styler';
|
import { attachButtonStyler, attachListBoxStyler, attachInputBoxStyler, attachSelectBoxStyler, attachCheckboxStyler } from 'sql/common/theme/styler';
|
||||||
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
||||||
import * as BackupConstants from 'sql/parts/disasterRecovery/backup/constants';
|
import * as BackupConstants from 'sql/parts/disasterRecovery/backup/constants';
|
||||||
import { IBackupService, IBackupUiService, TaskExecutionMode } from 'sql/parts/disasterRecovery/backup/common/backupService';
|
import { IBackupService, IBackupUiService, TaskExecutionMode } from 'sql/parts/disasterRecovery/backup/common/backupService';
|
||||||
import FileValidationConstants = require('sql/parts/fileBrowser/common/fileValidationServiceConstants');
|
import FileValidationConstants = require('sql/parts/fileBrowser/common/fileValidationServiceConstants');
|
||||||
import { IDashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
|
||||||
import { IFileBrowserDialogController } from 'sql/parts/fileBrowser/common/interfaces';
|
import { IFileBrowserDialogController } from 'sql/parts/fileBrowser/common/interfaces';
|
||||||
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
|
import { ScrollableSplitView } from 'sql/base/browser/ui/scrollableSplitview/scrollableSplitview';
|
||||||
|
|
||||||
import { MessageType } from 'vs/base/browser/ui/inputbox/inputBox';
|
import { MessageType } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
import * as lifecycle from 'vs/base/common/lifecycle';
|
||||||
import { localize } from 'vs/nls';
|
import { localize } from 'vs/nls';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
|
||||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
|
||||||
import * as types from 'vs/base/common/types';
|
import * as types from 'vs/base/common/types';
|
||||||
import * as strings from 'vs/base/common/strings';
|
import * as strings from 'vs/base/common/strings';
|
||||||
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||||
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
|
||||||
export const BACKUP_SELECTOR: string = 'backup-component';
|
export const BACKUP_SELECTOR: string = 'backup-component';
|
||||||
|
|
||||||
@@ -207,7 +205,8 @@ export class BackupComponent {
|
|||||||
@Inject(IBackupUiService) private _backupUiService: IBackupUiService,
|
@Inject(IBackupUiService) private _backupUiService: IBackupUiService,
|
||||||
@Inject(IBackupService) private _backupService: IBackupService,
|
@Inject(IBackupService) private _backupService: IBackupService,
|
||||||
@Inject(IClipboardService) private clipboardService: IClipboardService,
|
@Inject(IClipboardService) private clipboardService: IClipboardService,
|
||||||
@Inject(IConnectionManagementService) private connectionManagementService: IConnectionManagementService
|
@Inject(IConnectionManagementService) private connectionManagementService: IConnectionManagementService,
|
||||||
|
@Inject(IInstantiationService) private instantiationService: IInstantiationService
|
||||||
) {
|
) {
|
||||||
this._backupUiService.onShowBackupEvent((param) => this.onGetBackupConfigInfo(param));
|
this._backupUiService.onShowBackupEvent((param) => this.onGetBackupConfigInfo(param));
|
||||||
}
|
}
|
||||||
@@ -338,10 +337,10 @@ export class BackupComponent {
|
|||||||
|
|
||||||
ngAfterViewInit() {
|
ngAfterViewInit() {
|
||||||
// Set category view for advanced options. This should be defined in ngAfterViewInit so that it correctly calculates the text height after data binding.
|
// Set category view for advanced options. This should be defined in ngAfterViewInit so that it correctly calculates the text height after data binding.
|
||||||
var splitview = new SplitView(this.advancedOptionElement.nativeElement);
|
var splitview = new ScrollableSplitView(this.advancedOptionElement.nativeElement);
|
||||||
var advancedBodySize = DOM.getTotalHeight(this.advancedOptionBodyElement.nativeElement);
|
var advancedBodySize = DOM.getTotalHeight(this.advancedOptionBodyElement.nativeElement);
|
||||||
var categoryView = new CategoryView(LocalizedStrings.ADVANCED_CONFIGURATION, this.advancedOptionBodyElement.nativeElement, true, advancedBodySize, this._advancedHeaderSize);
|
var categoryView = this.instantiationService.createInstance(CategoryView, this.advancedOptionBodyElement.nativeElement, advancedBodySize, { title: LocalizedStrings.ADVANCED_CONFIGURATION, id: LocalizedStrings.ADVANCED_CONFIGURATION, ariaHeaderLabel: LocalizedStrings.ADVANCED_CONFIGURATION });
|
||||||
splitview.addView(categoryView);
|
splitview.addView(categoryView, 0);
|
||||||
splitview.layout(advancedBodySize + this._advancedHeaderSize);
|
splitview.layout(advancedBodySize + this._advancedHeaderSize);
|
||||||
|
|
||||||
this._backupUiService.onShowBackupDialog();
|
this._backupUiService.onShowBackupDialog();
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ export let SelectAllMessages = 'SelectAllMessages';
|
|||||||
export let SaveAsCsv = 'SaveAsCSV';
|
export let SaveAsCsv = 'SaveAsCSV';
|
||||||
export let SaveAsJSON = 'SaveAsJSON';
|
export let SaveAsJSON = 'SaveAsJSON';
|
||||||
export let SaveAsExcel = 'SaveAsExcel';
|
export let SaveAsExcel = 'SaveAsExcel';
|
||||||
|
export let SaveAsXML = 'SaveAsXML';
|
||||||
export let ViewAsChart = 'ViewAsChart';
|
export let ViewAsChart = 'ViewAsChart';
|
||||||
export let GoToNextQueryOutputTab = 'GoToNextQueryOutputTab';
|
export let GoToNextQueryOutputTab = 'GoToNextQueryOutputTab';
|
||||||
export let GoToNextGrid = 'GoToNextGrid';
|
export let GoToNextGrid = 'GoToNextGrid';
|
||||||
|
|||||||
9
src/sql/parts/grid/media/saveXml.svg
Normal file
9
src/sql/parts/grid/media/saveXml.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="saveXml" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<polygon id="canvas" fill="#F6F6F6" fill-rule="nonzero" opacity="0" points="16 16 0 16 0 0 16 0"></polygon>
|
||||||
|
<polygon id="<->" fill="#424242" points="14.3701172 10.7222222 9.41870773 15 9.41870773 12.3454861 12.9578306 9.5 9.41870773 6.6640625 9.41870773 4 14.3701172 8.296875"></polygon>
|
||||||
|
<polygon id="colorAction" fill="#00539C" fill-rule="nonzero" points="8 4 5 7 3 7 5 5 1 5 1 3 5 3 3 1 5 1"></polygon>
|
||||||
|
<path d="M2.32152009,8 L5.28619938,8 L3.4164898,9.5 L6.95140946,12.3454861 L6.95140946,15 L2,10.7222222 L2,8.27777778 L2.32152009,8 Z" id="Combined-Shape" fill="#424242"></path>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 877 B |
9
src/sql/parts/grid/media/saveXml_inverse.svg
Normal file
9
src/sql/parts/grid/media/saveXml_inverse.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="saveXmlInverse" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<polygon id="canvas" fill="#F6F6F6" fill-rule="nonzero" opacity="0" points="16 16 0 16 0 0 16 0"></polygon>
|
||||||
|
<polygon id="<->" fill="#C5C5C5" points="14.3701172 10.7222222 9.41870773 15 9.41870773 12.3454861 12.9578306 9.5 9.41870773 6.6640625 9.41870773 4 14.3701172 8.296875"></polygon>
|
||||||
|
<polygon id="colorAction" fill="#75BEFF" fill-rule="nonzero" points="8 4 5 7 3 7 5 5 1 5 1 3 5 3 3 1 5 1"></polygon>
|
||||||
|
<path d="M2.32152009,8 L5.28619938,8 L3.4164898,9.5 L6.95140946,12.3454861 L6.95140946,15 L2,10.7222222 L2,8.27777778 L2.32152009,8 Z" id="Combined-Shape" fill="#C5C5C5"></path>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 884 B |
@@ -112,6 +112,11 @@
|
|||||||
background-image: url("saveExcel.svg");
|
background-image: url("saveExcel.svg");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vs .icon.saveXml {
|
||||||
|
/* ResultToXML_16x_vscode */
|
||||||
|
background-image: url("saveXml.svg");
|
||||||
|
}
|
||||||
|
|
||||||
.vs .icon.viewChart {
|
.vs .icon.viewChart {
|
||||||
/* ResultToXlsx_16x_vscode */
|
/* ResultToXlsx_16x_vscode */
|
||||||
background-image: url("viewChart.svg");
|
background-image: url("viewChart.svg");
|
||||||
@@ -243,6 +248,12 @@
|
|||||||
background-image: url("saveExcel_inverse.svg");
|
background-image: url("saveExcel_inverse.svg");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vs-dark .icon.saveXml,
|
||||||
|
.hc-black .icon.saveXml {
|
||||||
|
/* ResultToXml_16x_vscode_inverse.svg */
|
||||||
|
background-image: url("saveXml_inverse.svg");
|
||||||
|
}
|
||||||
|
|
||||||
.vs-dark .icon.viewChart,
|
.vs-dark .icon.viewChart,
|
||||||
.hc-black .icon.viewChart {
|
.hc-black .icon.viewChart {
|
||||||
/* ResultToXlsx_16x_vscode */
|
/* ResultToXlsx_16x_vscode */
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
|
|||||||
export const GRID_SAVECSV_ID = 'grid.saveAsCsv';
|
export const GRID_SAVECSV_ID = 'grid.saveAsCsv';
|
||||||
export const GRID_SAVEJSON_ID = 'grid.saveAsJson';
|
export const GRID_SAVEJSON_ID = 'grid.saveAsJson';
|
||||||
export const GRID_SAVEEXCEL_ID = 'grid.saveAsExcel';
|
export const GRID_SAVEEXCEL_ID = 'grid.saveAsExcel';
|
||||||
|
export const GRID_SAVEXML_ID = 'grid.saveAsXml';
|
||||||
export const GRID_COPY_ID = 'grid.copySelection';
|
export const GRID_COPY_ID = 'grid.copySelection';
|
||||||
export const GRID_COPYWITHHEADERS_ID = 'grid.copyWithHeaders';
|
export const GRID_COPYWITHHEADERS_ID = 'grid.copyWithHeaders';
|
||||||
export const GRID_SELECTALL_ID = 'grid.selectAll';
|
export const GRID_SELECTALL_ID = 'grid.selectAll';
|
||||||
@@ -46,6 +47,7 @@ export class GridActionProvider {
|
|||||||
actions.push(new SaveResultAction(SaveResultAction.SAVECSV_ID, SaveResultAction.SAVECSV_LABEL, SaveFormat.CSV, this._dataService));
|
actions.push(new SaveResultAction(SaveResultAction.SAVECSV_ID, SaveResultAction.SAVECSV_LABEL, SaveFormat.CSV, this._dataService));
|
||||||
actions.push(new SaveResultAction(SaveResultAction.SAVEJSON_ID, SaveResultAction.SAVEJSON_LABEL, SaveFormat.JSON, this._dataService));
|
actions.push(new SaveResultAction(SaveResultAction.SAVEJSON_ID, SaveResultAction.SAVEJSON_LABEL, SaveFormat.JSON, this._dataService));
|
||||||
actions.push(new SaveResultAction(SaveResultAction.SAVEEXCEL_ID, SaveResultAction.SAVEEXCEL_LABEL, SaveFormat.EXCEL, this._dataService));
|
actions.push(new SaveResultAction(SaveResultAction.SAVEEXCEL_ID, SaveResultAction.SAVEEXCEL_LABEL, SaveFormat.EXCEL, this._dataService));
|
||||||
|
actions.push(new SaveResultAction(SaveResultAction.SAVEXML_ID, SaveResultAction.SAVEXML_LABEL, SaveFormat.XML, this._dataService));
|
||||||
actions.push(new SelectAllGridAction(SelectAllGridAction.ID, SelectAllGridAction.LABEL, this._selectAllCallback));
|
actions.push(new SelectAllGridAction(SelectAllGridAction.ID, SelectAllGridAction.LABEL, this._selectAllCallback));
|
||||||
actions.push(new CopyResultAction(CopyResultAction.COPY_ID, CopyResultAction.COPY_LABEL, false, this._dataService));
|
actions.push(new CopyResultAction(CopyResultAction.COPY_ID, CopyResultAction.COPY_LABEL, false, this._dataService));
|
||||||
actions.push(new CopyResultAction(CopyResultAction.COPYWITHHEADERS_ID, CopyResultAction.COPYWITHHEADERS_LABEL, true, this._dataService));
|
actions.push(new CopyResultAction(CopyResultAction.COPYWITHHEADERS_ID, CopyResultAction.COPYWITHHEADERS_LABEL, true, this._dataService));
|
||||||
@@ -74,6 +76,9 @@ export class SaveResultAction extends Action {
|
|||||||
public static SAVEEXCEL_ID = GRID_SAVEEXCEL_ID;
|
public static SAVEEXCEL_ID = GRID_SAVEEXCEL_ID;
|
||||||
public static SAVEEXCEL_LABEL = localize('saveAsExcel', 'Save As Excel');
|
public static SAVEEXCEL_LABEL = localize('saveAsExcel', 'Save As Excel');
|
||||||
|
|
||||||
|
public static SAVEXML_ID = GRID_SAVEXML_ID;
|
||||||
|
public static SAVEXML_LABEL = localize('saveAsXml', 'Save As XML');
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
id: string,
|
id: string,
|
||||||
label: string,
|
label: string,
|
||||||
|
|||||||
@@ -69,6 +69,10 @@ export const saveAsExcel = (accessor: ServicesAccessor) => {
|
|||||||
runActionOnActiveResultsEditor(accessor, GridContentEvents.SaveAsExcel);
|
runActionOnActiveResultsEditor(accessor, GridContentEvents.SaveAsExcel);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const saveAsXml = (accessor: ServicesAccessor) => {
|
||||||
|
runActionOnActiveResultsEditor(accessor, GridContentEvents.SaveAsXML);
|
||||||
|
};
|
||||||
|
|
||||||
export const selectAll = (accessor: ServicesAccessor) => {
|
export const selectAll = (accessor: ServicesAccessor) => {
|
||||||
runActionOnActiveResultsEditor(accessor, GridContentEvents.SelectAll);
|
runActionOnActiveResultsEditor(accessor, GridContentEvents.SelectAll);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -154,6 +154,9 @@ export abstract class GridParentComponent {
|
|||||||
case GridContentEvents.SaveAsExcel:
|
case GridContentEvents.SaveAsExcel:
|
||||||
self.sendSaveRequest(SaveFormat.EXCEL);
|
self.sendSaveRequest(SaveFormat.EXCEL);
|
||||||
break;
|
break;
|
||||||
|
case GridContentEvents.SaveAsXML:
|
||||||
|
self.sendSaveRequest(SaveFormat.XML);
|
||||||
|
break;
|
||||||
case GridContentEvents.GoToNextQueryOutputTab:
|
case GridContentEvents.GoToNextQueryOutputTab:
|
||||||
self.goToNextQueryOutputTab();
|
self.goToNextQueryOutputTab();
|
||||||
break;
|
break;
|
||||||
@@ -320,6 +323,9 @@ export abstract class GridParentComponent {
|
|||||||
'SaveAsExcel': () => {
|
'SaveAsExcel': () => {
|
||||||
this.sendSaveRequest(SaveFormat.EXCEL);
|
this.sendSaveRequest(SaveFormat.EXCEL);
|
||||||
},
|
},
|
||||||
|
'SaveAsXML': () => {
|
||||||
|
this.sendSaveRequest(SaveFormat.XML);
|
||||||
|
},
|
||||||
'GoToNextQueryOutputTab': () => {
|
'GoToNextQueryOutputTab': () => {
|
||||||
this.goToNextQueryOutputTab();
|
this.goToNextQueryOutputTab();
|
||||||
}
|
}
|
||||||
@@ -345,6 +351,9 @@ export abstract class GridParentComponent {
|
|||||||
case 'saveexcel':
|
case 'saveexcel':
|
||||||
this.dataService.sendSaveRequest({ batchIndex: event.batchId, resultSetNumber: event.resultId, format: SaveFormat.EXCEL, selection: event.selection });
|
this.dataService.sendSaveRequest({ batchIndex: event.batchId, resultSetNumber: event.resultId, format: SaveFormat.EXCEL, selection: event.selection });
|
||||||
break;
|
break;
|
||||||
|
case 'savexml':
|
||||||
|
this.dataService.sendSaveRequest({ batchIndex: event.batchId, resultSetNumber: event.resultId, format: SaveFormat.XML, selection: event.selection });
|
||||||
|
break;
|
||||||
case 'selectall':
|
case 'selectall':
|
||||||
this.activeGrid = event.index;
|
this.activeGrid = event.index;
|
||||||
this.onSelectAllForActiveGrid();
|
this.onSelectAllForActiveGrid();
|
||||||
|
|||||||
@@ -127,6 +127,19 @@ export class QueryComponent extends GridParentComponent implements OnInit, OnDes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
showCondition: () => { return true; },
|
||||||
|
icon: () => { return 'saveXml'; },
|
||||||
|
hoverText: () => { return LocalizedConstants.saveXMLLabel; },
|
||||||
|
functionality: (batchId, resultId, index) => {
|
||||||
|
let selection = this.getSelection(index);
|
||||||
|
if (selection.length <= 1) {
|
||||||
|
this.handleContextClick({ type: 'savexml', batchId: batchId, resultId: resultId, index: index, selection: selection });
|
||||||
|
} else {
|
||||||
|
this.dataService.showWarning(LocalizedConstants.msgCannotSaveMultipleSelections);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
showCondition: () => {
|
showCondition: () => {
|
||||||
return this.configurationService.getValue('workbench')['enablePreviewFeatures'];
|
return this.configurationService.getValue('workbench')['enablePreviewFeatures'];
|
||||||
|
|||||||
@@ -8,25 +8,25 @@ import { Button } from 'sql/base/browser/ui/button/button';
|
|||||||
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
||||||
import { Modal } from 'sql/base/browser/ui/modal/modal';
|
import { Modal } from 'sql/base/browser/ui/modal/modal';
|
||||||
import { IInsightsConfigDetails } from 'sql/parts/dashboard/widgets/insights/interfaces';
|
import { IInsightsConfigDetails } from 'sql/parts/dashboard/widgets/insights/interfaces';
|
||||||
import { attachButtonStyler, attachModalDialogStyler, attachTableStyler } from 'sql/common/theme/styler';
|
import { attachButtonStyler, attachModalDialogStyler, attachTableStyler, attachPanelStyler } from 'sql/common/theme/styler';
|
||||||
import { TaskRegistry } from 'sql/platform/tasks/common/tasks';
|
import { TaskRegistry } from 'sql/platform/tasks/common/tasks';
|
||||||
import { ConnectionProfile } from 'sql/parts/connection/common/connectionProfile';
|
import { ConnectionProfile } from 'sql/parts/connection/common/connectionProfile';
|
||||||
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
||||||
import { IInsightsDialogModel, ListResource, IInsightDialogActionContext, insertValueRegex } from 'sql/parts/insights/common/interfaces';
|
import { IInsightsDialogModel, ListResource, IInsightDialogActionContext, insertValueRegex } from 'sql/parts/insights/common/interfaces';
|
||||||
import { TableCollapsibleView } from 'sql/base/browser/ui/table/tableView';
|
|
||||||
import { TableDataView } from 'sql/base/browser/ui/table/tableDataView';
|
import { TableDataView } from 'sql/base/browser/ui/table/tableDataView';
|
||||||
import { RowSelectionModel } from 'sql/base/browser/ui/table/plugins/rowSelectionModel.plugin';
|
import { RowSelectionModel } from 'sql/base/browser/ui/table/plugins/rowSelectionModel.plugin';
|
||||||
import { error } from 'sql/base/common/log';
|
import { error } from 'sql/base/common/log';
|
||||||
import { Table } from 'sql/base/browser/ui/table/table';
|
import { Table } from 'sql/base/browser/ui/table/table';
|
||||||
import { CopyInsightDialogSelectionAction } from 'sql/parts/insights/common/insightDialogActions';
|
import { CopyInsightDialogSelectionAction } from 'sql/parts/insights/common/insightDialogActions';
|
||||||
import { SplitView, ViewSizing } from 'sql/base/browser/ui/splitview/splitview';
|
import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService';
|
||||||
|
import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService';
|
||||||
|
import { IDisposableDataProvider } from 'sql/base/browser/ui/table/interfaces';
|
||||||
|
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||||
import { IListService } from 'vs/platform/list/browser/listService';
|
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||||
import { IAction } from 'vs/base/common/actions';
|
import { IAction } from 'vs/base/common/actions';
|
||||||
@@ -38,12 +38,45 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
|||||||
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
|
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
|
||||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||||
import { MenuRegistry, ExecuteCommandAction } from 'vs/platform/actions/common/actions';
|
import { MenuRegistry, ExecuteCommandAction } from 'vs/platform/actions/common/actions';
|
||||||
import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService';
|
import { SplitView, Orientation, Sizing } from 'vs/base/browser/ui/splitview/splitview';
|
||||||
import { IClipboardService } from 'sql/platform/clipboard/common/clipboardService';
|
import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet';
|
||||||
|
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||||
|
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||||
|
|
||||||
const labelDisplay = nls.localize("insights.item", "Item");
|
const labelDisplay = nls.localize("insights.item", "Item");
|
||||||
const valueDisplay = nls.localize("insights.value", "Value");
|
const valueDisplay = nls.localize("insights.value", "Value");
|
||||||
|
|
||||||
|
class InsightTableView<T> extends ViewletPanel {
|
||||||
|
private _table: Table<T>;
|
||||||
|
public get table(): Table<T> {
|
||||||
|
return this._table;
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private columns: Slick.Column<T>[],
|
||||||
|
private data: IDisposableDataProvider<T> | Array<T>,
|
||||||
|
private tableOptions: Slick.GridOptions<T>,
|
||||||
|
options: IViewletPanelOptions,
|
||||||
|
@IKeybindingService keybindingService: IKeybindingService,
|
||||||
|
@IContextMenuService contextMenuService: IContextMenuService,
|
||||||
|
@IConfigurationService configurationService: IConfigurationService
|
||||||
|
) {
|
||||||
|
super(options, keybindingService, contextMenuService, configurationService);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected renderBody(container: HTMLElement): void {
|
||||||
|
this._table = new Table(container, {
|
||||||
|
columns: this.columns,
|
||||||
|
dataProvider: this.data
|
||||||
|
}, this.tableOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected layoutBody(size: number): void {
|
||||||
|
this._table.layout(size, Orientation.VERTICAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function stateFormatter(row: number, cell: number, value: any, columnDef: Slick.Column<ListResource>, resource: ListResource): string {
|
function stateFormatter(row: number, cell: number, value: any, columnDef: Slick.Column<ListResource>, resource: ListResource): string {
|
||||||
// template
|
// template
|
||||||
const icon = DOM.$('span.icon-span');
|
const icon = DOM.$('span.icon-span');
|
||||||
@@ -126,7 +159,6 @@ export class InsightsDialogView extends Modal {
|
|||||||
private _model: IInsightsDialogModel,
|
private _model: IInsightsDialogModel,
|
||||||
@IInstantiationService private _instantiationService: IInstantiationService,
|
@IInstantiationService private _instantiationService: IInstantiationService,
|
||||||
@IThemeService themeService: IThemeService,
|
@IThemeService themeService: IThemeService,
|
||||||
@IListService private _listService: IListService,
|
|
||||||
@IPartService partService: IPartService,
|
@IPartService partService: IPartService,
|
||||||
@IContextMenuService private _contextMenuService: IContextMenuService,
|
@IContextMenuService private _contextMenuService: IContextMenuService,
|
||||||
@ITelemetryService telemetryService: ITelemetryService,
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
@@ -167,6 +199,7 @@ export class InsightsDialogView extends Modal {
|
|||||||
|
|
||||||
protected renderBody(container: HTMLElement) {
|
protected renderBody(container: HTMLElement) {
|
||||||
this._container = container;
|
this._container = container;
|
||||||
|
container.classList.add('monaco-panel-view');
|
||||||
|
|
||||||
this._splitView = new SplitView(container);
|
this._splitView = new SplitView(container);
|
||||||
|
|
||||||
@@ -175,11 +208,14 @@ export class InsightsDialogView extends Modal {
|
|||||||
|
|
||||||
this._topTableData = new TableDataView();
|
this._topTableData = new TableDataView();
|
||||||
this._bottomTableData = new TableDataView();
|
this._bottomTableData = new TableDataView();
|
||||||
let topTableView = new TableCollapsibleView(itemsHeaderTitle, { sizing: ViewSizing.Flexible, ariaHeaderLabel: itemsHeaderTitle }, this._topTableData, this._topColumns, { forceFitColumns: true });
|
let topTableView = this._instantiationService.createInstance(InsightTableView, this._topColumns, this._topTableData, { forceFitColumns: true }, { id: 'insights.top', title: itemsHeaderTitle, ariaHeaderLabel: itemsHeaderTitle }) as InsightTableView<ListResource>;
|
||||||
|
topTableView.render();
|
||||||
|
attachPanelStyler(topTableView, this._themeService);
|
||||||
this._topTable = topTableView.table;
|
this._topTable = topTableView.table;
|
||||||
topTableView.addContainerClass('insights');
|
|
||||||
this._topTable.setSelectionModel(new RowSelectionModel<ListResource>());
|
this._topTable.setSelectionModel(new RowSelectionModel<ListResource>());
|
||||||
let bottomTableView = new TableCollapsibleView(itemsDetailHeaderTitle, { sizing: ViewSizing.Flexible, ariaHeaderLabel: itemsDetailHeaderTitle }, this._bottomTableData, this._bottomColumns, { forceFitColumns: true });
|
let bottomTableView = this._instantiationService.createInstance(InsightTableView, this._bottomColumns, this._bottomTableData, { forceFitColumns: true }, { id: 'insights.bottom', title: itemsDetailHeaderTitle, ariaHeaderLabel: itemsDetailHeaderTitle }) as InsightTableView<ListResource>;
|
||||||
|
bottomTableView.render();
|
||||||
|
attachPanelStyler(bottomTableView, this._themeService);
|
||||||
this._bottomTable = bottomTableView.table;
|
this._bottomTable = bottomTableView.table;
|
||||||
this._bottomTable.setSelectionModel(new RowSelectionModel<ListResource>());
|
this._bottomTable.setSelectionModel(new RowSelectionModel<ListResource>());
|
||||||
|
|
||||||
@@ -193,12 +229,9 @@ export class InsightsDialogView extends Modal {
|
|||||||
|
|
||||||
this._bottomTableData.clear();
|
this._bottomTableData.clear();
|
||||||
this._bottomTableData.push(resourceArray);
|
this._bottomTableData.push(resourceArray);
|
||||||
// this table view has to be collapsed and expanded
|
|
||||||
// because the initial expand doesn't have the
|
|
||||||
// loaded data
|
|
||||||
if (bottomTableView.isExpanded()) {
|
if (bottomTableView.isExpanded()) {
|
||||||
bottomTableView.collapse();
|
bottomTableView.setExpanded(false);
|
||||||
bottomTableView.expand();
|
bottomTableView.setExpanded(true);
|
||||||
}
|
}
|
||||||
this._enableTaskButtons(true);
|
this._enableTaskButtons(true);
|
||||||
} else {
|
} else {
|
||||||
@@ -224,8 +257,8 @@ export class InsightsDialogView extends Modal {
|
|||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._splitView.addView(topTableView);
|
this._splitView.addView(topTableView, Sizing.Distribute);
|
||||||
this._splitView.addView(bottomTableView);
|
this._splitView.addView(bottomTableView, Sizing.Distribute);
|
||||||
|
|
||||||
this._register(attachTableStyler(this._topTable, this._themeService));
|
this._register(attachTableStyler(this._topTable, this._themeService));
|
||||||
this._register(attachTableStyler(this._bottomTable, this._themeService));
|
this._register(attachTableStyler(this._bottomTable, this._themeService));
|
||||||
@@ -344,7 +377,6 @@ export class InsightsDialogView extends Modal {
|
|||||||
this.hide();
|
this.hide();
|
||||||
dispose(this._taskButtonDisposables);
|
dispose(this._taskButtonDisposables);
|
||||||
this._taskButtonDisposables = [];
|
this._taskButtonDisposables = [];
|
||||||
this.dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected onClose(e: StandardKeyboardEvent) {
|
protected onClose(e: StandardKeyboardEvent) {
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ export class InsightsDialogController {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
return Promise.reject(e);
|
return Promise.reject(e);
|
||||||
}
|
}
|
||||||
this._queryRunner = this._instantiationService.createInstance(QueryRunner, this._connectionUri, undefined);
|
this._queryRunner = this._instantiationService.createInstance(QueryRunner, this._connectionUri);
|
||||||
this.addQueryEventListeners(this._queryRunner);
|
this.addQueryEventListeners(this._queryRunner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ export class CodeComponent extends AngularDisposable implements OnInit, OnChange
|
|||||||
let uri = this.createUri();
|
let uri = this.createUri();
|
||||||
this._editorInput = instantiationService.createInstance(UntitledEditorInput, uri, false, this.cellModel.language, '', '');
|
this._editorInput = instantiationService.createInstance(UntitledEditorInput, uri, false, this.cellModel.language, '', '');
|
||||||
this._editor.setInput(this._editorInput, undefined);
|
this._editor.setInput(this._editorInput, undefined);
|
||||||
|
this.setFocusAndScroll();
|
||||||
this._editorInput.resolve().then(model => {
|
this._editorInput.resolve().then(model => {
|
||||||
this._editorModel = model.textEditorModel;
|
this._editorModel = model.textEditorModel;
|
||||||
this._modelService.updateModel(this._editorModel, this.cellModel.source);
|
this._modelService.updateModel(this._editorModel, this.cellModel.source);
|
||||||
@@ -193,4 +194,10 @@ export class CodeComponent extends AngularDisposable implements OnInit, OnChange
|
|||||||
moreActionsEl.style.borderRightColor = theme.getColor(themeColors.SIDE_BAR_BACKGROUND, true).toString();
|
moreActionsEl.style.borderRightColor = theme.getColor(themeColors.SIDE_BAR_BACKGROUND, true).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private setFocusAndScroll(): void {
|
||||||
|
if (this.cellModel.id === this._activeCellId) {
|
||||||
|
this._editor.focus();
|
||||||
|
this._editor.getContainer().scrollIntoView();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
20
src/sql/parts/notebook/cellViews/placeholder.css
Normal file
20
src/sql/parts/notebook/cellViews/placeholder.css
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
placeholder-cell-component {
|
||||||
|
height: 50px;
|
||||||
|
width: 100%;
|
||||||
|
display: block;
|
||||||
|
box-shadow: 0px 4px 6px 0px rgba(0,0,0,0.14);
|
||||||
|
}
|
||||||
|
|
||||||
|
placeholder-cell-component .text {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 50px;
|
||||||
|
-webkit-margin-before: 0em;
|
||||||
|
-webkit-margin-after: 0em;
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<!--
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
-->
|
||||||
|
<div style="overflow: hidden; width: 100%; height: 100%; display: flex; flex-flow: column">
|
||||||
|
<div class="placeholder-cell-component" style="flex: 0 0 auto;">
|
||||||
|
<div class="placeholder-cell-component text">
|
||||||
|
<p>{{clickOn}} <a href="#" (click)="addCell('code')">{{plusCode}}</a> {{or}} <a href="#" (click)="addCell('markdown')">{{plusText}}</a> {{toAddCell}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
import 'vs/css!./placeholder';
|
||||||
|
|
||||||
|
import { OnInit, Component, Input, Inject, forwardRef, ElementRef, ChangeDetectorRef, OnDestroy, ViewChild, SimpleChange, OnChanges } from '@angular/core';
|
||||||
|
import { CellView } from 'sql/parts/notebook/cellViews/interfaces';
|
||||||
|
import { ICellModel } from 'sql/parts/notebook/models/modelInterfaces';
|
||||||
|
import { NotebookModel } from 'sql/parts/notebook/models/notebookModel';
|
||||||
|
import { localize } from 'vs/nls';
|
||||||
|
import { CellType } from 'sql/parts/notebook/models/contracts';
|
||||||
|
|
||||||
|
|
||||||
|
export const PLACEHOLDER_SELECTOR: string = 'placeholder-cell-component';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: PLACEHOLDER_SELECTOR,
|
||||||
|
templateUrl: decodeURI(require.toUrl('./placeholderCell.component.html'))
|
||||||
|
})
|
||||||
|
|
||||||
|
export class PlaceholderCellComponent extends CellView implements OnInit, OnChanges {
|
||||||
|
@Input() cellModel: ICellModel;
|
||||||
|
@Input() set model(value: NotebookModel) {
|
||||||
|
this._model = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _model: NotebookModel;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
if (this.cellModel) {
|
||||||
|
this._register(this.cellModel.onOutputsChanged(() => {
|
||||||
|
this._changeRef.detectChanges();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnChanges(changes: { [propKey: string]: SimpleChange }) {
|
||||||
|
}
|
||||||
|
|
||||||
|
get model(): NotebookModel {
|
||||||
|
return this._model;
|
||||||
|
}
|
||||||
|
|
||||||
|
get clickOn(): string {
|
||||||
|
return localize('clickOn','Click on');
|
||||||
|
}
|
||||||
|
|
||||||
|
get plusCode(): string {
|
||||||
|
return localize('plusCode', '+ Code');
|
||||||
|
}
|
||||||
|
|
||||||
|
get or(): string {
|
||||||
|
return localize('or', 'or');
|
||||||
|
}
|
||||||
|
|
||||||
|
get plusText(): string {
|
||||||
|
return localize('plusText', '+ Text');
|
||||||
|
}
|
||||||
|
|
||||||
|
get toAddCell(): string {
|
||||||
|
return localize('toAddCell', 'to add a code or text cell');
|
||||||
|
}
|
||||||
|
|
||||||
|
public addCell(cellType: string): void {
|
||||||
|
let type: CellType = <CellType>cellType;
|
||||||
|
if (!type) {
|
||||||
|
type = 'code';
|
||||||
|
}
|
||||||
|
this._model.addCell(<CellType>cellType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public layout() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -60,7 +60,7 @@ export class TextCellComponent extends CellView implements OnInit, OnChanges {
|
|||||||
@Inject(IOpenerService) private readonly openerService: IOpenerService,
|
@Inject(IOpenerService) private readonly openerService: IOpenerService,
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.isEditMode = false;
|
this.isEditMode = true;
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
this._cellToggleMoreActions = this._instantiationService.createInstance(CellToggleMoreActions);
|
this._cellToggleMoreActions = this._instantiationService.createInstance(CellToggleMoreActions);
|
||||||
}
|
}
|
||||||
@@ -87,10 +87,10 @@ export class TextCellComponent extends CellView implements OnInit, OnChanges {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.updatePreview();
|
|
||||||
this.setLoading(false);
|
this.setLoading(false);
|
||||||
this._register(this.themeService.onDidColorThemeChange(this.updateTheme, this));
|
this._register(this.themeService.onDidColorThemeChange(this.updateTheme, this));
|
||||||
this.updateTheme(this.themeService.getColorTheme());
|
this.updateTheme(this.themeService.getColorTheme());
|
||||||
|
this.setFocusAndScroll();
|
||||||
this._register(this.cellModel.onOutputsChanged(e => {
|
this._register(this.cellModel.onOutputsChanged(e => {
|
||||||
this.updatePreview();
|
this.updatePreview();
|
||||||
}));
|
}));
|
||||||
@@ -101,7 +101,11 @@ export class TextCellComponent extends CellView implements OnInit, OnChanges {
|
|||||||
if (propName === 'activeCellId') {
|
if (propName === 'activeCellId') {
|
||||||
let changedProp = changes[propName];
|
let changedProp = changes[propName];
|
||||||
this._activeCellId = changedProp.currentValue;
|
this._activeCellId = changedProp.currentValue;
|
||||||
this.toggleEditMode(false);
|
// If the activeCellId is undefined (i.e. in an active cell update), don't unnecessarily set editMode to false;
|
||||||
|
// it will be set to true in a subsequent call to toggleEditMode()
|
||||||
|
if (changedProp.previousValue !== undefined) {
|
||||||
|
this.toggleEditMode(false);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,4 +167,15 @@ export class TextCellComponent extends CellView implements OnInit, OnChanges {
|
|||||||
this.updatePreview();
|
this.updatePreview();
|
||||||
this._changeRef.detectChanges();
|
this._changeRef.detectChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private setFocusAndScroll(): void {
|
||||||
|
if (this.cellModel.id === this._activeCellId) {
|
||||||
|
this.toggleEditMode(true);
|
||||||
|
} else {
|
||||||
|
this.toggleEditMode(false);
|
||||||
|
}
|
||||||
|
if (this.output && this.output.nativeElement) {
|
||||||
|
(<HTMLElement>this.output.nativeElement).scrollTo();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ export class NotebookModel extends Disposable implements INotebookModel {
|
|||||||
private _defaultKernel: nb.IKernelSpec;
|
private _defaultKernel: nb.IKernelSpec;
|
||||||
private _activeCell: ICellModel;
|
private _activeCell: ICellModel;
|
||||||
private _providerId: string;
|
private _providerId: string;
|
||||||
|
private _isNewNotebook: boolean = true;
|
||||||
|
|
||||||
constructor(private notebookOptions: INotebookModelOptions, startSessionImmediately?: boolean, private connectionProfile?: IConnectionProfile) {
|
constructor(private notebookOptions: INotebookModelOptions, startSessionImmediately?: boolean, private connectionProfile?: IConnectionProfile) {
|
||||||
super();
|
super();
|
||||||
@@ -170,6 +171,10 @@ export class NotebookModel extends Disposable implements INotebookModel {
|
|||||||
return this._trustedMode;
|
return this._trustedMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get isNewNotebook(): boolean {
|
||||||
|
return this._isNewNotebook;
|
||||||
|
}
|
||||||
|
|
||||||
public get providerId(): string {
|
public get providerId(): string {
|
||||||
return this._providerId;
|
return this._providerId;
|
||||||
}
|
}
|
||||||
@@ -212,21 +217,19 @@ export class NotebookModel extends Disposable implements INotebookModel {
|
|||||||
}
|
}
|
||||||
let factory = this.notebookOptions.factory;
|
let factory = this.notebookOptions.factory;
|
||||||
// if cells already exist, create them with language info (if it is saved)
|
// if cells already exist, create them with language info (if it is saved)
|
||||||
this._cells = undefined;
|
this._cells = [];
|
||||||
this._defaultLanguageInfo = {
|
this._defaultLanguageInfo = {
|
||||||
name: this._providerId === SQL_NOTEBOOK_PROVIDER ? 'sql' : 'python',
|
name: this._providerId === SQL_NOTEBOOK_PROVIDER ? 'sql' : 'python',
|
||||||
version: ''
|
version: ''
|
||||||
};
|
};
|
||||||
if (contents) {
|
if (contents) {
|
||||||
|
this._isNewNotebook = false;
|
||||||
this._defaultLanguageInfo = this.getDefaultLanguageInfo(contents);
|
this._defaultLanguageInfo = this.getDefaultLanguageInfo(contents);
|
||||||
this._savedKernelInfo = this.getSavedKernelInfo(contents);
|
this._savedKernelInfo = this.getSavedKernelInfo(contents);
|
||||||
if (contents.cells && contents.cells.length > 0) {
|
if (contents.cells && contents.cells.length > 0) {
|
||||||
this._cells = contents.cells.map(c => factory.createCell(c, { notebook: this, isTrusted: isTrusted }));
|
this._cells = contents.cells.map(c => factory.createCell(c, { notebook: this, isTrusted: isTrusted }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!this._cells) {
|
|
||||||
this._cells = [this.createCell(CellTypes.Code)];
|
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this._inErrorState = true;
|
this._inErrorState = true;
|
||||||
throw error;
|
throw error;
|
||||||
@@ -238,7 +241,7 @@ export class NotebookModel extends Disposable implements INotebookModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public addCell(cellType: CellType, index?: number): ICellModel {
|
public addCell(cellType: CellType, index?: number): ICellModel {
|
||||||
if (this.inErrorState || !this._cells) {
|
if (this.inErrorState) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
let cell = this.createCell(cellType);
|
let cell = this.createCell(cellType);
|
||||||
@@ -250,7 +253,9 @@ export class NotebookModel extends Disposable implements INotebookModel {
|
|||||||
index = undefined;
|
index = undefined;
|
||||||
}
|
}
|
||||||
// Set newly created cell as active cell
|
// Set newly created cell as active cell
|
||||||
this._activeCell.active = false;
|
if (this._activeCell) {
|
||||||
|
this._activeCell.active = false;
|
||||||
|
}
|
||||||
this._activeCell = cell;
|
this._activeCell = cell;
|
||||||
this._activeCell.active = true;
|
this._activeCell.active = true;
|
||||||
|
|
||||||
@@ -398,7 +403,7 @@ export class NotebookModel extends Disposable implements INotebookModel {
|
|||||||
if (!newConnection && this._activeContexts.defaultConnection.options['host'] === host) {
|
if (!newConnection && this._activeContexts.defaultConnection.options['host'] === host) {
|
||||||
newConnection = this._activeContexts.defaultConnection;
|
newConnection = this._activeContexts.defaultConnection;
|
||||||
}
|
}
|
||||||
SparkMagicContexts.configureContext(this.notebookOptions);
|
SparkMagicContexts.configureContext();
|
||||||
this._hadoopConnection = new NotebookConnection(newConnection);
|
this._hadoopConnection = new NotebookConnection(newConnection);
|
||||||
this.refreshConnections(newConnection);
|
this.refreshConnections(newConnection);
|
||||||
this._activeClientSession.updateConnection(this._hadoopConnection);
|
this._activeClientSession.updateConnection(this._hadoopConnection);
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { nb } from 'sqlops';
|
import { nb } from 'sqlops';
|
||||||
|
|
||||||
import * as json from 'vs/base/common/json';
|
|
||||||
import * as pfs from 'vs/base/node/pfs';
|
import * as pfs from 'vs/base/node/pfs';
|
||||||
import { localize } from 'vs/nls';
|
import { localize } from 'vs/nls';
|
||||||
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
||||||
@@ -17,11 +16,48 @@ import * as notebookUtils from '../notebookUtils';
|
|||||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||||
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
|
|
||||||
|
const configBase = {
|
||||||
|
'kernel_python_credentials': {
|
||||||
|
'url': ''
|
||||||
|
},
|
||||||
|
'kernel_scala_credentials': {
|
||||||
|
'url': ''
|
||||||
|
},
|
||||||
|
'kernel_r_credentials': {
|
||||||
|
'url': ''
|
||||||
|
},
|
||||||
|
|
||||||
|
'ignore_ssl_errors': true,
|
||||||
|
|
||||||
|
'logging_config': {
|
||||||
|
'version': 1,
|
||||||
|
'formatters': {
|
||||||
|
'magicsFormatter': {
|
||||||
|
'format': '%(asctime)s\t%(levelname)s\t%(message)s',
|
||||||
|
'datefmt': ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'handlers': {
|
||||||
|
'magicsHandler': {
|
||||||
|
'class': 'hdijupyterutils.filehandler.MagicsFileHandler',
|
||||||
|
'formatter': 'magicsFormatter',
|
||||||
|
'home_path': ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'magicsLogger': {
|
||||||
|
'handlers': ['magicsHandler'],
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'propagate': 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
export class SparkMagicContexts {
|
export class SparkMagicContexts {
|
||||||
|
|
||||||
public static get DefaultContext(): IDefaultConnection {
|
public static get DefaultContext(): IDefaultConnection {
|
||||||
// TODO NOTEBOOK REFACTOR fix default connection handling
|
// TODO NOTEBOOK REFACTOR fix default connection handling
|
||||||
let defaultConnection: IConnectionProfile = <any> {
|
let defaultConnection: IConnectionProfile = <any>{
|
||||||
providerName: notebookConstants.hadoopKnoxProviderName,
|
providerName: notebookConstants.hadoopKnoxProviderName,
|
||||||
id: '-1',
|
id: '-1',
|
||||||
options:
|
options:
|
||||||
@@ -47,7 +83,7 @@ export class SparkMagicContexts {
|
|||||||
let connections: IDefaultConnection = this.DefaultContext;
|
let connections: IDefaultConnection = this.DefaultContext;
|
||||||
if (!profile) {
|
if (!profile) {
|
||||||
if (!kernelChangedArgs || !kernelChangedArgs.newValue ||
|
if (!kernelChangedArgs || !kernelChangedArgs.newValue ||
|
||||||
(kernelChangedArgs.oldValue && kernelChangedArgs.newValue.id === kernelChangedArgs.oldValue.id)) {
|
(kernelChangedArgs.oldValue && kernelChangedArgs.newValue.id === kernelChangedArgs.oldValue.id)) {
|
||||||
// nothing to do, kernels are the same or new kernel is undefined
|
// nothing to do, kernels are the same or new kernel is undefined
|
||||||
return connections;
|
return connections;
|
||||||
}
|
}
|
||||||
@@ -55,7 +91,7 @@ export class SparkMagicContexts {
|
|||||||
if (kernelChangedArgs && kernelChangedArgs.newValue && kernelChangedArgs.newValue.name) {
|
if (kernelChangedArgs && kernelChangedArgs.newValue && kernelChangedArgs.newValue.name) {
|
||||||
switch (kernelChangedArgs.newValue.name) {
|
switch (kernelChangedArgs.newValue.name) {
|
||||||
case (notebookConstants.python3):
|
case (notebookConstants.python3):
|
||||||
// python3 case, use this.DefaultContext for the only connection
|
// python3 case, use this.DefaultContext for the only connection
|
||||||
break;
|
break;
|
||||||
//TO DO: Handle server connections based on kernel type. Right now, we call the same method for all kernel types.
|
//TO DO: Handle server connections based on kernel type. Right now, we call the same method for all kernel types.
|
||||||
default:
|
default:
|
||||||
@@ -76,13 +112,13 @@ export class SparkMagicContexts {
|
|||||||
let defaultConnection: IConnectionProfile = SparkMagicContexts.DefaultContext.defaultConnection;
|
let defaultConnection: IConnectionProfile = SparkMagicContexts.DefaultContext.defaultConnection;
|
||||||
let activeConnections: IConnectionProfile[] = await connectionService.getActiveConnections();
|
let activeConnections: IConnectionProfile[] = await connectionService.getActiveConnections();
|
||||||
// If no connections exist, only show 'n/a'
|
// If no connections exist, only show 'n/a'
|
||||||
if (activeConnections && activeConnections.length > 0) {
|
if (activeConnections && activeConnections.length > 0) {
|
||||||
// Remove all non-Spark connections
|
// Remove all non-Spark connections
|
||||||
activeConnections = activeConnections.filter(conn => conn.providerName === notebookConstants.hadoopKnoxProviderName);
|
activeConnections = activeConnections.filter(conn => conn.providerName === notebookConstants.hadoopKnoxProviderName);
|
||||||
}
|
}
|
||||||
if (activeConnections.length === 0) {
|
if (activeConnections.length === 0) {
|
||||||
return SparkMagicContexts.DefaultContext;
|
return SparkMagicContexts.DefaultContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If launched from the right click or server dashboard, connection profile data exists, so use that as default
|
// If launched from the right click or server dashboard, connection profile data exists, so use that as default
|
||||||
if (profile && profile.options) {
|
if (profile && profile.options) {
|
||||||
@@ -95,7 +131,7 @@ export class SparkMagicContexts {
|
|||||||
defaultConnection = activeConnections[0];
|
defaultConnection = activeConnections[0];
|
||||||
} else {
|
} else {
|
||||||
// TODO NOTEBOOK REFACTOR change this so it's no longer incompatible with IConnectionProfile
|
// TODO NOTEBOOK REFACTOR change this so it's no longer incompatible with IConnectionProfile
|
||||||
defaultConnection = <IConnectionProfile> <any>{
|
defaultConnection = <IConnectionProfile><any>{
|
||||||
providerName: notebookConstants.hadoopKnoxProviderName,
|
providerName: notebookConstants.hadoopKnoxProviderName,
|
||||||
id: '-1',
|
id: '-1',
|
||||||
options:
|
options:
|
||||||
@@ -107,31 +143,28 @@ export class SparkMagicContexts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
otherConnections: activeConnections,
|
otherConnections: activeConnections,
|
||||||
defaultConnection: defaultConnection
|
defaultConnection: defaultConnection
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async configureContext(options: INotebookModelOptions): Promise<object> {
|
public static async configureContext(): Promise<object> {
|
||||||
let sparkmagicConfDir = path.join(notebookUtils.getUserHome(), '.sparkmagic');
|
let sparkmagicConfDir = path.join(notebookUtils.getUserHome(), '.sparkmagic');
|
||||||
// TODO NOTEBOOK REFACTOR re-enable this or move to extension. Requires config files to be available in order to work
|
// TODO NOTEBOOK REFACTOR re-enable this or move to extension. Requires config files to be available in order to work
|
||||||
// await notebookUtils.mkDir(sparkmagicConfDir);
|
await notebookUtils.mkDir(sparkmagicConfDir);
|
||||||
|
|
||||||
// // Default to localhost in config file.
|
// Default to localhost in config file.
|
||||||
// let creds: ICredentials = {
|
let creds: ICredentials = {
|
||||||
// 'url': 'http://localhost:8088'
|
'url': 'http://localhost:8088'
|
||||||
// };
|
};
|
||||||
|
|
||||||
// let configPath = notebookUtils.getTemplatePath(options.extensionContext.extensionPath, path.join('jupyter_config', 'sparkmagic_config.json'));
|
let config: ISparkMagicConfig = Object.assign({}, configBase);
|
||||||
// let fileBuffer: Buffer = await pfs.readFile(configPath);
|
SparkMagicContexts.updateConfig(config, creds, sparkmagicConfDir);
|
||||||
// let fileContents: string = fileBuffer.toString();
|
|
||||||
// let config: ISparkMagicConfig = json.parse(fileContents);
|
|
||||||
// SparkMagicContexts.updateConfig(config, creds, sparkmagicConfDir);
|
|
||||||
|
|
||||||
// let configFilePath = path.join(sparkmagicConfDir, 'config.json');
|
let configFilePath = path.join(sparkmagicConfDir, 'config.json');
|
||||||
// await pfs.writeFile(configFilePath, JSON.stringify(config));
|
await pfs.writeFile(configFilePath, JSON.stringify(config));
|
||||||
|
|
||||||
return {'SPARKMAGIC_CONF_DIR': sparkmagicConfDir};
|
return { 'SPARKMAGIC_CONF_DIR': sparkmagicConfDir };
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -186,10 +219,13 @@ interface ISparkMagicConfig {
|
|||||||
kernel_python_credentials: ICredentials;
|
kernel_python_credentials: ICredentials;
|
||||||
kernel_scala_credentials: ICredentials;
|
kernel_scala_credentials: ICredentials;
|
||||||
kernel_r_credentials: ICredentials;
|
kernel_r_credentials: ICredentials;
|
||||||
|
ignore_ssl_errors?: boolean;
|
||||||
logging_config: {
|
logging_config: {
|
||||||
handlers: {
|
handlers: {
|
||||||
magicsHandler: {
|
magicsHandler: {
|
||||||
home_path: string;
|
home_path: string;
|
||||||
|
class?: string;
|
||||||
|
formatter?: string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -15,5 +15,9 @@
|
|||||||
<text-cell-component *ngIf="cell.cellType === 'markdown'" [cellModel]="cell" [model]="model" [activeCellId]="activeCellId">
|
<text-cell-component *ngIf="cell.cellType === 'markdown'" [cellModel]="cell" [model]="model" [activeCellId]="activeCellId">
|
||||||
</text-cell-component>
|
</text-cell-component>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="notebook-cell" *ngIf="!cells.length">
|
||||||
|
<placeholder-cell-component [cellModel]="cell" [model]="model">
|
||||||
|
</placeholder-cell-component>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ export class NotebookComponent extends AngularDisposable implements OnInit, OnDe
|
|||||||
}
|
}
|
||||||
|
|
||||||
public unselectActiveCell() {
|
public unselectActiveCell() {
|
||||||
if (this.model.activeCell) {
|
if (this.model && this.model.activeCell) {
|
||||||
this.model.activeCell.active = false;
|
this.model.activeCell.active = false;
|
||||||
}
|
}
|
||||||
this._changeRef.detectChanges();
|
this._changeRef.detectChanges();
|
||||||
@@ -250,10 +250,6 @@ export class NotebookComponent extends AngularDisposable implements OnInit, OnDe
|
|||||||
this.updateToolbarComponents(this._model.trustedMode);
|
this.updateToolbarComponents(this._model.trustedMode);
|
||||||
this._modelRegisteredDeferred.resolve(this._model);
|
this._modelRegisteredDeferred.resolve(this._model);
|
||||||
model.backgroundStartSession();
|
model.backgroundStartSession();
|
||||||
// Set first cell as default active cell
|
|
||||||
if (this._model && this._model.cells && this._model.cells[0]) {
|
|
||||||
this.selectCell(model.cells[0]);
|
|
||||||
}
|
|
||||||
this._changeRef.detectChanges();
|
this._changeRef.detectChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
margin: 10px 20px 10px;
|
margin: 10px 20px 10px;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notebookEditor .notebook-info-label {
|
.notebookEditor .notebook-info-label {
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import { CommonModule, APP_BASE_HREF } from '@angular/common';
|
|||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
|
|
||||||
|
|
||||||
import { Extensions, IComponentRegistry } from 'sql/platform/dashboard/common/modelComponentRegistry';
|
|
||||||
import { ComponentHostDirective } from 'sql/parts/dashboard/common/componentHost.directive';
|
import { ComponentHostDirective } from 'sql/parts/dashboard/common/componentHost.directive';
|
||||||
import { IBootstrapParams, ISelector, providerIterator } from 'sql/services/bootstrap/bootstrapService';
|
import { IBootstrapParams, ISelector, providerIterator } from 'sql/services/bootstrap/bootstrapService';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
@@ -22,12 +21,12 @@ import { InputBox } from 'sql/base/browser/ui/inputBox/inputBox.component';
|
|||||||
import { NotebookComponent } from 'sql/parts/notebook/notebook.component';
|
import { NotebookComponent } from 'sql/parts/notebook/notebook.component';
|
||||||
|
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { Registry } from 'vs/platform/registry/common/platform';
|
|
||||||
import { CodeComponent } from 'sql/parts/notebook/cellViews/code.component';
|
import { CodeComponent } from 'sql/parts/notebook/cellViews/code.component';
|
||||||
import { CodeCellComponent } from 'sql/parts/notebook/cellViews/codeCell.component';
|
import { CodeCellComponent } from 'sql/parts/notebook/cellViews/codeCell.component';
|
||||||
import { TextCellComponent } from 'sql/parts/notebook/cellViews/textCell.component';
|
import { TextCellComponent } from 'sql/parts/notebook/cellViews/textCell.component';
|
||||||
import { OutputAreaComponent } from 'sql/parts/notebook/cellViews/outputArea.component';
|
import { OutputAreaComponent } from 'sql/parts/notebook/cellViews/outputArea.component';
|
||||||
import { OutputComponent } from 'sql/parts/notebook/cellViews/output.component';
|
import { OutputComponent } from 'sql/parts/notebook/cellViews/output.component';
|
||||||
|
import { PlaceholderCellComponent } from 'sql/parts/notebook/cellViews/placeholderCell.component';
|
||||||
import LoadingSpinner from 'sql/parts/modelComponents/loadingSpinner.component';
|
import LoadingSpinner from 'sql/parts/modelComponents/loadingSpinner.component';
|
||||||
|
|
||||||
export const NotebookModule = (params, selector: string, instantiationService: IInstantiationService): any => {
|
export const NotebookModule = (params, selector: string, instantiationService: IInstantiationService): any => {
|
||||||
@@ -41,6 +40,7 @@ export const NotebookModule = (params, selector: string, instantiationService: I
|
|||||||
CodeComponent,
|
CodeComponent,
|
||||||
CodeCellComponent,
|
CodeCellComponent,
|
||||||
TextCellComponent,
|
TextCellComponent,
|
||||||
|
PlaceholderCellComponent,
|
||||||
NotebookComponent,
|
NotebookComponent,
|
||||||
ComponentHostDirective,
|
ComponentHostDirective,
|
||||||
OutputAreaComponent,
|
OutputAreaComponent,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
import * as nls from 'vs/nls';
|
||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
import { IEditorModel } from 'vs/platform/editor/common/editor';
|
import { IEditorModel } from 'vs/platform/editor/common/editor';
|
||||||
import { EditorInput, EditorModel, ConfirmResult } from 'vs/workbench/common/editor';
|
import { EditorInput, EditorModel, ConfirmResult } from 'vs/workbench/common/editor';
|
||||||
@@ -13,7 +14,9 @@ import URI from 'vs/base/common/uri';
|
|||||||
import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||||
import * as resources from 'vs/base/common/resources';
|
import * as resources from 'vs/base/common/resources';
|
||||||
|
|
||||||
import { INotebookService } from 'sql/services/notebook/notebookService';
|
import { INotebookService, INotebookEditor } from 'sql/services/notebook/notebookService';
|
||||||
|
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
|
||||||
|
import Severity from 'vs/base/common/severity';
|
||||||
|
|
||||||
export type ModeViewSaveHandler = (handle: number) => Thenable<boolean>;
|
export type ModeViewSaveHandler = (handle: number) => Thenable<boolean>;
|
||||||
|
|
||||||
@@ -94,7 +97,8 @@ export class NotebookInput extends EditorInput {
|
|||||||
|
|
||||||
constructor(private _title: string,
|
constructor(private _title: string,
|
||||||
private _model: NotebookInputModel,
|
private _model: NotebookInputModel,
|
||||||
@INotebookService private notebookService: INotebookService
|
@INotebookService private notebookService: INotebookService,
|
||||||
|
@IDialogService private dialogService: IDialogService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this._model.onDidChangeDirty(() => this._onDidChangeDirty.fire());
|
this._model.onDidChangeDirty(() => this._onDidChangeDirty.fire());
|
||||||
@@ -173,14 +177,41 @@ export class NotebookInput extends EditorInput {
|
|||||||
// as we need to either integrate with textFileService (seems like this isn't viable)
|
// as we need to either integrate with textFileService (seems like this isn't viable)
|
||||||
// or register our own complimentary service that handles the lifecycle operations such
|
// or register our own complimentary service that handles the lifecycle operations such
|
||||||
// as close all, auto save etc.
|
// as close all, auto save etc.
|
||||||
return TPromise.wrap(ConfirmResult.DONT_SAVE);
|
const message = nls.localize('saveChangesMessage', "Do you want to save the changes you made to {0}?", this.getTitle());
|
||||||
|
const buttons: string[] = [
|
||||||
|
nls.localize({ key: 'save', comment: ['&& denotes a mnemonic'] }, "&&Save"),
|
||||||
|
nls.localize({ key: 'dontSave', comment: ['&& denotes a mnemonic'] }, "Do&&n't Save"),
|
||||||
|
nls.localize('cancel', "Cancel")
|
||||||
|
];
|
||||||
|
|
||||||
|
return this.dialogService.show(Severity.Warning, message, buttons, {
|
||||||
|
cancelId: 2,
|
||||||
|
detail: nls.localize('saveChangesDetail', "Your changes will be lost if you don't save them.")
|
||||||
|
}).then(index => {
|
||||||
|
switch (index) {
|
||||||
|
case 0: return ConfirmResult.SAVE;
|
||||||
|
case 1: return ConfirmResult.DONT_SAVE;
|
||||||
|
default: return ConfirmResult.CANCEL;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the editor if it is dirty. Subclasses return a promise with a boolean indicating the success of the operation.
|
* Saves the editor if it is dirty. Subclasses return a promise with a boolean indicating the success of the operation.
|
||||||
*/
|
*/
|
||||||
save(): TPromise<boolean> {
|
save(): TPromise<boolean> {
|
||||||
return this._model.save();
|
let activeEditor: INotebookEditor;
|
||||||
|
for (const editor of this.notebookService.listNotebookEditors()) {
|
||||||
|
if(editor.isActive())
|
||||||
|
{
|
||||||
|
activeEditor = editor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(activeEditor)
|
||||||
|
{
|
||||||
|
return TPromise.wrap(activeEditor.save().then((val) => {return val;}));
|
||||||
|
}
|
||||||
|
return TPromise.wrap(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import 'vs/css!./notebook';
|
|||||||
|
|
||||||
import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
|
import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
|
||||||
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
||||||
import { activeContrastBorder, buttonBackground } from 'vs/platform/theme/common/colorRegistry';
|
import { activeContrastBorder, buttonBackground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry';
|
||||||
|
|
||||||
registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
||||||
|
|
||||||
@@ -48,4 +48,16 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Styling for all links in notebooks
|
||||||
|
const linkForeground = theme.getColor(textLinkForeground);
|
||||||
|
if (linkForeground) {
|
||||||
|
collector.addRule(`
|
||||||
|
.notebookEditor a:link {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
color: ${linkForeground};
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -172,17 +172,14 @@ output-component .jp-RenderedHTMLCommon u {
|
|||||||
|
|
||||||
output-component .jp-RenderedHTMLCommon a:link {
|
output-component .jp-RenderedHTMLCommon a:link {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: var(--jp-content-link-color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output-component .jp-RenderedHTMLCommon a:hover {
|
output-component .jp-RenderedHTMLCommon a:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
color: var(--jp-content-link-color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output-component .jp-RenderedHTMLCommon a:visited {
|
output-component .jp-RenderedHTMLCommon a:visited {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: var(--jp-content-link-color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Headings */
|
/* Headings */
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { ProfilerInput } from './profilerInput';
|
import { ProfilerInput } from './profilerInput';
|
||||||
|
|
||||||
import { TabbedPanel } from 'sql/base/browser/ui/panel/panel';
|
import { TabbedPanel } from 'sql/base/browser/ui/panel/panel';
|
||||||
import { Table } from 'sql/base/browser/ui/table/table';
|
import { Table } from 'sql/base/browser/ui/table/table';
|
||||||
import { TableDataView } from 'sql/base/browser/ui/table/tableDataView';
|
import { TableDataView } from 'sql/base/browser/ui/table/tableDataView';
|
||||||
@@ -17,15 +16,8 @@ import * as Actions from 'sql/parts/profiler/contrib/profilerActions';
|
|||||||
import { CONTEXT_PROFILER_EDITOR, PROFILER_TABLE_COMMAND_SEARCH } from './interfaces';
|
import { CONTEXT_PROFILER_EDITOR, PROFILER_TABLE_COMMAND_SEARCH } from './interfaces';
|
||||||
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
|
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
|
||||||
import { textFormatter } from 'sql/parts/grid/services/sharedServices';
|
import { textFormatter } from 'sql/parts/grid/services/sharedServices';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
|
||||||
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
|
|
||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
|
||||||
import { EditorOptions } from 'vs/workbench/common/editor';
|
|
||||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
|
||||||
import { IWorkbenchThemeService, VS_DARK_THEME, VS_HC_THEME } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
|
||||||
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
|
|
||||||
import { ProfilerResourceEditor } from './profilerResourceEditor';
|
import { ProfilerResourceEditor } from './profilerResourceEditor';
|
||||||
import { SplitView, View, Orientation, IViewOptions } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||||
import { ITextModel } from 'vs/editor/common/model';
|
import { ITextModel } from 'vs/editor/common/model';
|
||||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||||
@@ -39,59 +31,77 @@ import { Command } from 'vs/editor/browser/editorExtensions';
|
|||||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||||
import { KeyMod, KeyCode } from 'vs/base/common/keyCodes';
|
import { KeyMod, KeyCode } from 'vs/base/common/keyCodes';
|
||||||
import { ContextKeyExpr, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey';
|
import { ContextKeyExpr, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey';
|
||||||
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||||
import { CommonFindController, FindStartFocusAction } from 'vs/editor/contrib/find/findController';
|
import { CommonFindController, FindStartFocusAction } from 'vs/editor/contrib/find/findController';
|
||||||
import * as types from 'vs/base/common/types';
|
import * as types from 'vs/base/common/types';
|
||||||
import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler';
|
import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler';
|
||||||
import { DARK, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService';
|
import { DARK, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService';
|
||||||
import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService';
|
import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService';
|
||||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||||
|
import { IView, SplitView, Sizing } from 'vs/base/browser/ui/splitview/splitview';
|
||||||
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
|
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
|
||||||
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
|
import { EditorOptions } from 'vs/workbench/common/editor';
|
||||||
|
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||||
|
import { IWorkbenchThemeService, VS_DARK_THEME, VS_HC_THEME } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
|
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { Event, Emitter } from 'vs/base/common/event';
|
||||||
|
import { clamp } from 'vs/base/common/numbers';
|
||||||
|
|
||||||
class BasicView extends View {
|
class BasicView implements IView {
|
||||||
private _previousSize: number;
|
public get element(): HTMLElement {
|
||||||
private _collapsed: boolean;
|
return this._element;
|
||||||
public headerSize: number;
|
}
|
||||||
|
private _onDidChange = new Emitter<number>();
|
||||||
|
public readonly onDidChange: Event<number> = this._onDidChange.event;
|
||||||
|
|
||||||
|
private _collapsed = false;
|
||||||
|
private size: number;
|
||||||
|
private previousSize: number;
|
||||||
|
private _minimumSize: number;
|
||||||
|
public get minimumSize(): number {
|
||||||
|
return this._minimumSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _maximumSize: number;
|
||||||
|
public get maximumSize(): number {
|
||||||
|
return this._maximumSize;
|
||||||
|
}
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
initialSize: number,
|
private _defaultMinimumSize: number,
|
||||||
|
private _defaultMaximumSize: number,
|
||||||
|
private _layout: (size: number) => void,
|
||||||
private _element: HTMLElement,
|
private _element: HTMLElement,
|
||||||
private _focus: () => void,
|
private options: { headersize?: number } = {}
|
||||||
private _layout: (size: number, orientation: Orientation) => void,
|
|
||||||
opts: IViewOptions
|
|
||||||
) {
|
) {
|
||||||
super(initialSize, opts);
|
this._minimumSize = _defaultMinimumSize;
|
||||||
this._previousSize = initialSize;
|
this._maximumSize = _defaultMaximumSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
render(container: HTMLElement, orientation: Orientation): void {
|
public layout(size: number): void {
|
||||||
container.appendChild(this._element);
|
this.size = size;
|
||||||
|
this._layout(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
focus(): void {
|
public set collapsed(val: boolean) {
|
||||||
this._focus();
|
if (val !== this._collapsed && this.options.headersize) {
|
||||||
}
|
this._collapsed = val;
|
||||||
|
if (this.collapsed) {
|
||||||
layout(size: number, orientation: Orientation): void {
|
this.previousSize = this.size;
|
||||||
if (!this.collapsed) {
|
this._minimumSize = this.options.headersize;
|
||||||
this._previousSize = size;
|
this._maximumSize = this.options.headersize;
|
||||||
}
|
this._onDidChange.fire();
|
||||||
this._layout(size, orientation);
|
} else {
|
||||||
}
|
this._maximumSize = this._defaultMaximumSize;
|
||||||
|
this._minimumSize = this._defaultMinimumSize;
|
||||||
set collapsed(val: boolean) {
|
this._onDidChange.fire(clamp(this.previousSize, this.minimumSize, this.maximumSize));
|
||||||
this._collapsed = val === false ? false : true;
|
}
|
||||||
if (this.collapsed) {
|
|
||||||
this._previousSize = this.size;
|
|
||||||
this.setFixed(this.headerSize);
|
|
||||||
} else {
|
|
||||||
// Enforce the min height for the view when user is doing expand operation,
|
|
||||||
// to make sure the view has a reasonable height.
|
|
||||||
const minHeight = 200;
|
|
||||||
this.setFlexible(Math.max(this._previousSize, minHeight));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get collapsed(): boolean {
|
public get collapsed(): boolean {
|
||||||
return this._collapsed;
|
return this._collapsed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,14 +156,13 @@ export class ProfilerEditor extends BaseEditor {
|
|||||||
@IProfilerService private _profilerService: IProfilerService,
|
@IProfilerService private _profilerService: IProfilerService,
|
||||||
@IContextKeyService private _contextKeyService: IContextKeyService,
|
@IContextKeyService private _contextKeyService: IContextKeyService,
|
||||||
@IContextViewService private _contextViewService: IContextViewService,
|
@IContextViewService private _contextViewService: IContextViewService,
|
||||||
@IEditorGroupsService private _editorGroupService: IEditorGroupsService,
|
@IEditorService editorService: IEditorService
|
||||||
@IEditorService private _editorService: IEditorService
|
|
||||||
) {
|
) {
|
||||||
super(ProfilerEditor.ID, telemetryService, themeService);
|
super(ProfilerEditor.ID, telemetryService, themeService);
|
||||||
this._profilerEditorContextKey = CONTEXT_PROFILER_EDITOR.bindTo(this._contextKeyService);
|
this._profilerEditorContextKey = CONTEXT_PROFILER_EDITOR.bindTo(this._contextKeyService);
|
||||||
|
|
||||||
if (_editorService) {
|
if (editorService) {
|
||||||
_editorService.overrideOpenEditor((editor, options, group) => {
|
editorService.overrideOpenEditor((editor, options, group) => {
|
||||||
if (this.isVisible() && (editor !== this.input || group !== this.group)) {
|
if (this.isVisible() && (editor !== this.input || group !== this.group)) {
|
||||||
this.saveEditorViewState();
|
this.saveEditorViewState();
|
||||||
}
|
}
|
||||||
@@ -178,21 +187,19 @@ export class ProfilerEditor extends BaseEditor {
|
|||||||
let paneContainer = this._createProfilerPane();
|
let paneContainer = this._createProfilerPane();
|
||||||
this._splitView.addView(new BasicView(
|
this._splitView.addView(new BasicView(
|
||||||
300,
|
300,
|
||||||
tableContainer,
|
Number.POSITIVE_INFINITY,
|
||||||
() => this._profilerTableEditor.focus(),
|
|
||||||
size => this._profilerTableEditor.layout(new DOM.Dimension(parseFloat(DOM.getComputedStyle(this._body).width), size)),
|
size => this._profilerTableEditor.layout(new DOM.Dimension(parseFloat(DOM.getComputedStyle(this._body).width), size)),
|
||||||
{}
|
tableContainer
|
||||||
));
|
), Sizing.Distribute);
|
||||||
|
|
||||||
this._panelView = new BasicView(
|
this._panelView = new BasicView(
|
||||||
300,
|
300,
|
||||||
paneContainer,
|
Number.POSITIVE_INFINITY,
|
||||||
() => this._tabbedPanel.focus(),
|
|
||||||
size => this._tabbedPanel.layout(new DOM.Dimension(DOM.getTotalWidth(this._body), size)),
|
size => this._tabbedPanel.layout(new DOM.Dimension(DOM.getTotalWidth(this._body), size)),
|
||||||
{ minimumSize: 35 }
|
paneContainer,
|
||||||
|
{ headersize: 35 }
|
||||||
);
|
);
|
||||||
this._panelView.headerSize = 35;
|
this._splitView.addView(this._panelView, Sizing.Distribute);
|
||||||
this._splitView.addView(this._panelView);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private _createHeader(): void {
|
private _createHeader(): void {
|
||||||
@@ -426,7 +433,6 @@ export class ProfilerEditor extends BaseEditor {
|
|||||||
isPanelCollapsed: true
|
isPanelCollapsed: true
|
||||||
});
|
});
|
||||||
this._profilerTableEditor.updateState();
|
this._profilerTableEditor.updateState();
|
||||||
this._splitView.layout();
|
|
||||||
this._profilerTableEditor.focus();
|
this._profilerTableEditor.focus();
|
||||||
if (savedViewState) {
|
if (savedViewState) {
|
||||||
this._profilerTableEditor.restoreViewState(savedViewState);
|
this._profilerTableEditor.restoreViewState(savedViewState);
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export class ProfilerState implements IDisposable {
|
|||||||
private _isPaused: boolean;
|
private _isPaused: boolean;
|
||||||
private _isStopped: boolean;
|
private _isStopped: boolean;
|
||||||
private _autoscroll: boolean;
|
private _autoscroll: boolean;
|
||||||
private _isPanelCollapsed: boolean;
|
private _isPanelCollapsed = true;
|
||||||
private _eventEmitter: EventEmitter;
|
private _eventEmitter: EventEmitter;
|
||||||
|
|
||||||
public get isConnected(): boolean { return this._isConnected; }
|
public get isConnected(): boolean { return this._isConnected; }
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
export const copyIncludeHeaders = 'copyIncludeHeaders';
|
export const copyIncludeHeaders = 'copyIncludeHeaders';
|
||||||
export const configSaveAsCsv = 'saveAsCsv';
|
export const configSaveAsCsv = 'saveAsCsv';
|
||||||
|
export const configSaveAsXml = 'saveAsXml';
|
||||||
export const configCopyRemoveNewLine = 'copyRemoveNewLine';
|
export const configCopyRemoveNewLine = 'copyRemoveNewLine';
|
||||||
export const configShowBatchTime = 'showBatchTime';
|
export const configShowBatchTime = 'showBatchTime';
|
||||||
export const querySection = 'query';
|
export const querySection = 'query';
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ export const restoreLabel = localize('resultsPane.restoreLabel', 'Restore');
|
|||||||
export const saveCSVLabel = localize('saveCSVLabel', 'Save as CSV');
|
export const saveCSVLabel = localize('saveCSVLabel', 'Save as CSV');
|
||||||
export const saveJSONLabel = localize('saveJSONLabel', 'Save as JSON');
|
export const saveJSONLabel = localize('saveJSONLabel', 'Save as JSON');
|
||||||
export const saveExcelLabel = localize('saveExcelLabel', 'Save as Excel');
|
export const saveExcelLabel = localize('saveExcelLabel', 'Save as Excel');
|
||||||
|
export const saveXMLLabel = localize('saveXMLLabel', 'Save as XML');
|
||||||
export const viewChartLabel = localize('viewChartLabel', 'View as Chart');
|
export const viewChartLabel = localize('viewChartLabel', 'View as Chart');
|
||||||
|
|
||||||
export const resultPaneLabel = localize('resultPaneLabel', 'Results');
|
export const resultPaneLabel = localize('resultPaneLabel', 'Results');
|
||||||
|
|||||||
@@ -233,6 +233,14 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({
|
|||||||
handler: gridCommands.saveAsExcel
|
handler: gridCommands.saveAsExcel
|
||||||
});
|
});
|
||||||
|
|
||||||
|
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||||
|
id: gridActions.GRID_SAVEXML_ID,
|
||||||
|
weight: KeybindingWeight.EditorContrib,
|
||||||
|
when: ResultsGridFocusCondition,
|
||||||
|
primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_R, KeyMod.CtrlCmd | KeyCode.KEY_X),
|
||||||
|
handler: gridCommands.saveAsXml
|
||||||
|
});
|
||||||
|
|
||||||
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
KeybindingsRegistry.registerCommandAndKeybindingRule({
|
||||||
id: gridActions.GRID_VIEWASCHART_ID,
|
id: gridActions.GRID_VIEWASCHART_ID,
|
||||||
weight: KeybindingWeight.EditorContrib,
|
weight: KeybindingWeight.EditorContrib,
|
||||||
@@ -308,7 +316,17 @@ let registryProperties = {
|
|||||||
'sql.results.streaming': {
|
'sql.results.streaming': {
|
||||||
'type': 'boolean',
|
'type': 'boolean',
|
||||||
'description': localize('sql.results.streaming', 'Enable results streaming; contains few minor visual issues'),
|
'description': localize('sql.results.streaming', 'Enable results streaming; contains few minor visual issues'),
|
||||||
'default': false
|
'default': true
|
||||||
|
},
|
||||||
|
'sql.saveAsXml.formatted': {
|
||||||
|
'type': 'string',
|
||||||
|
'description': localize('sql.saveAsXml.formatted', '[Optional] When true, XML output will be formatted when saving results as XML'),
|
||||||
|
'default': true
|
||||||
|
},
|
||||||
|
'sql.saveAsXml.encoding': {
|
||||||
|
'type': 'string',
|
||||||
|
'description': localize('sql.saveAsXml.encoding', '[Optional] File encoding used when saving results as XML'),
|
||||||
|
'default': 'utf-8'
|
||||||
},
|
},
|
||||||
'sql.copyIncludeHeaders': {
|
'sql.copyIncludeHeaders': {
|
||||||
'type': 'boolean',
|
'type': 'boolean',
|
||||||
|
|||||||
@@ -254,6 +254,24 @@ export class ResultSerializer {
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private getConfigForXml(): SaveResultsRequestParams {
|
||||||
|
let saveResultsParams = <SaveResultsRequestParams>{ resultFormat: SaveFormat.XML as string };
|
||||||
|
|
||||||
|
// get save results config from vscode config
|
||||||
|
let saveConfig = WorkbenchUtils.getSqlConfigSection(this._workspaceConfigurationService, Constants.configSaveAsXml);
|
||||||
|
// if user entered config, set options
|
||||||
|
if (saveConfig) {
|
||||||
|
if (saveConfig.formatted !== undefined) {
|
||||||
|
saveResultsParams.formatted = saveConfig.formatted;
|
||||||
|
}
|
||||||
|
if (saveConfig.encoding !== undefined) {
|
||||||
|
saveResultsParams.encoding = saveConfig.encoding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return saveResultsParams;
|
||||||
|
}
|
||||||
|
|
||||||
private getParameters(filePath: string, batchIndex: number, resultSetNo: number, format: string, selection: Slick.Range): SaveResultsRequestParams {
|
private getParameters(filePath: string, batchIndex: number, resultSetNo: number, format: string, selection: Slick.Range): SaveResultsRequestParams {
|
||||||
let saveResultsParams: SaveResultsRequestParams;
|
let saveResultsParams: SaveResultsRequestParams;
|
||||||
if (!path.isAbsolute(filePath)) {
|
if (!path.isAbsolute(filePath)) {
|
||||||
@@ -268,6 +286,8 @@ export class ResultSerializer {
|
|||||||
saveResultsParams = this.getConfigForJson();
|
saveResultsParams = this.getConfigForJson();
|
||||||
} else if (format === SaveFormat.EXCEL) {
|
} else if (format === SaveFormat.EXCEL) {
|
||||||
saveResultsParams = this.getConfigForExcel();
|
saveResultsParams = this.getConfigForExcel();
|
||||||
|
} else if (format === SaveFormat.XML) {
|
||||||
|
saveResultsParams = this.getConfigForXml();
|
||||||
}
|
}
|
||||||
|
|
||||||
saveResultsParams.filePath = this._filePath;
|
saveResultsParams.filePath = this._filePath;
|
||||||
|
|||||||
@@ -57,6 +57,10 @@ export class SaveResultAction extends Action {
|
|||||||
public static SAVEEXCEL_LABEL = localize('saveAsExcel', 'Save As Excel');
|
public static SAVEEXCEL_LABEL = localize('saveAsExcel', 'Save As Excel');
|
||||||
public static SAVEEXCEL_ICON = 'saveExcel';
|
public static SAVEEXCEL_ICON = 'saveExcel';
|
||||||
|
|
||||||
|
public static SAVEXML_ID = 'grid.saveAsXml';
|
||||||
|
public static SAVEXML_LABEL = localize('saveAsXml', 'Save As XML');
|
||||||
|
public static SAVEXML_ICON = 'saveXml';
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
id: string,
|
id: string,
|
||||||
label: string,
|
label: string,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { attachTableStyler } from 'sql/common/theme/styler';
|
|||||||
import QueryRunner from 'sql/parts/query/execution/queryRunner';
|
import QueryRunner from 'sql/parts/query/execution/queryRunner';
|
||||||
import { VirtualizedCollection, AsyncDataProvider } from 'sql/base/browser/ui/table/asyncDataView';
|
import { VirtualizedCollection, AsyncDataProvider } from 'sql/base/browser/ui/table/asyncDataView';
|
||||||
import { Table } from 'sql/base/browser/ui/table/table';
|
import { Table } from 'sql/base/browser/ui/table/table';
|
||||||
import { ScrollableSplitView } from 'sql/base/browser/ui/scrollableSplitview/scrollableSplitview';
|
import { ScrollableSplitView, IView } from 'sql/base/browser/ui/scrollableSplitview/scrollableSplitview';
|
||||||
import { MouseWheelSupport } from 'sql/base/browser/ui/table/plugins/mousewheelTableScroll.plugin';
|
import { MouseWheelSupport } from 'sql/base/browser/ui/table/plugins/mousewheelTableScroll.plugin';
|
||||||
import { AutoColumnSize } from 'sql/base/browser/ui/table/plugins/autoSizeColumns.plugin';
|
import { AutoColumnSize } from 'sql/base/browser/ui/table/plugins/autoSizeColumns.plugin';
|
||||||
import { SaveFormat } from 'sql/parts/grid/common/interfaces';
|
import { SaveFormat } from 'sql/parts/grid/common/interfaces';
|
||||||
@@ -34,7 +34,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService';
|
|||||||
import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet';
|
import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet';
|
||||||
import { isUndefinedOrNull } from 'vs/base/common/types';
|
import { isUndefinedOrNull } from 'vs/base/common/types';
|
||||||
import { range } from 'vs/base/common/arrays';
|
import { range } from 'vs/base/common/arrays';
|
||||||
import { Orientation, IView } from 'vs/base/browser/ui/splitview/splitview';
|
import { Orientation } from 'vs/base/browser/ui/splitview/splitview';
|
||||||
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
|
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||||
import { $ } from 'vs/base/browser/builder';
|
import { $ } from 'vs/base/browser/builder';
|
||||||
import { generateUuid } from 'vs/base/common/uuid';
|
import { generateUuid } from 'vs/base/common/uuid';
|
||||||
@@ -476,10 +476,6 @@ class GridTable<T> extends Disposable implements IView {
|
|||||||
this.scrolled = false;
|
this.scrolled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public render(container: HTMLElement, orientation: Orientation): void {
|
|
||||||
container.appendChild(this.container);
|
|
||||||
}
|
|
||||||
|
|
||||||
private build(): void {
|
private build(): void {
|
||||||
let tableContainer = document.createElement('div');
|
let tableContainer = document.createElement('div');
|
||||||
tableContainer.style.display = 'inline-block';
|
tableContainer.style.display = 'inline-block';
|
||||||
@@ -695,6 +691,7 @@ class GridTable<T> extends Disposable implements IView {
|
|||||||
new SaveResultAction(SaveResultAction.SAVECSV_ID, SaveResultAction.SAVECSV_LABEL, SaveResultAction.SAVECSV_ICON, SaveFormat.CSV),
|
new SaveResultAction(SaveResultAction.SAVECSV_ID, SaveResultAction.SAVECSV_LABEL, SaveResultAction.SAVECSV_ICON, SaveFormat.CSV),
|
||||||
new SaveResultAction(SaveResultAction.SAVEEXCEL_ID, SaveResultAction.SAVEEXCEL_LABEL, SaveResultAction.SAVEEXCEL_ICON, SaveFormat.EXCEL),
|
new SaveResultAction(SaveResultAction.SAVEEXCEL_ID, SaveResultAction.SAVEEXCEL_LABEL, SaveResultAction.SAVEEXCEL_ICON, SaveFormat.EXCEL),
|
||||||
new SaveResultAction(SaveResultAction.SAVEJSON_ID, SaveResultAction.SAVEJSON_LABEL, SaveResultAction.SAVEJSON_ICON, SaveFormat.JSON),
|
new SaveResultAction(SaveResultAction.SAVEJSON_ID, SaveResultAction.SAVEJSON_LABEL, SaveResultAction.SAVEJSON_ICON, SaveFormat.JSON),
|
||||||
|
new SaveResultAction(SaveResultAction.SAVEXML_ID, SaveResultAction.SAVEXML_LABEL, SaveResultAction.SAVEXML_ICON, SaveFormat.XML),
|
||||||
this.instantiationService.createInstance(ChartDataAction)
|
this.instantiationService.createInstance(ChartDataAction)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -753,6 +750,7 @@ class GridTable<T> extends Disposable implements IView {
|
|||||||
new SaveResultAction(SaveResultAction.SAVECSV_ID, SaveResultAction.SAVECSV_LABEL, SaveResultAction.SAVECSV_ICON, SaveFormat.CSV),
|
new SaveResultAction(SaveResultAction.SAVECSV_ID, SaveResultAction.SAVECSV_LABEL, SaveResultAction.SAVECSV_ICON, SaveFormat.CSV),
|
||||||
new SaveResultAction(SaveResultAction.SAVEEXCEL_ID, SaveResultAction.SAVEEXCEL_LABEL, SaveResultAction.SAVEEXCEL_ICON, SaveFormat.EXCEL),
|
new SaveResultAction(SaveResultAction.SAVEEXCEL_ID, SaveResultAction.SAVEEXCEL_LABEL, SaveResultAction.SAVEEXCEL_ICON, SaveFormat.EXCEL),
|
||||||
new SaveResultAction(SaveResultAction.SAVEJSON_ID, SaveResultAction.SAVEJSON_LABEL, SaveResultAction.SAVEJSON_ICON, SaveFormat.JSON),
|
new SaveResultAction(SaveResultAction.SAVEJSON_ID, SaveResultAction.SAVEJSON_LABEL, SaveResultAction.SAVEJSON_ICON, SaveFormat.JSON),
|
||||||
|
new SaveResultAction(SaveResultAction.SAVEXML_ID, SaveResultAction.SAVEXML_LABEL, SaveResultAction.SAVEXML_ICON, SaveFormat.XML),
|
||||||
new Separator(),
|
new Separator(),
|
||||||
new CopyResultAction(CopyResultAction.COPY_ID, CopyResultAction.COPY_LABEL, false),
|
new CopyResultAction(CopyResultAction.COPY_ID, CopyResultAction.COPY_LABEL, false),
|
||||||
new CopyResultAction(CopyResultAction.COPYWITHHEADERS_ID, CopyResultAction.COPYWITHHEADERS_LABEL, true)
|
new CopyResultAction(CopyResultAction.COPYWITHHEADERS_ID, CopyResultAction.COPYWITHHEADERS_LABEL, true)
|
||||||
|
|||||||
@@ -191,6 +191,7 @@ export default class QueryRunner extends Disposable {
|
|||||||
this._hasCompleted = false;
|
this._hasCompleted = false;
|
||||||
this._queryStartTime = undefined;
|
this._queryStartTime = undefined;
|
||||||
this._queryEndTime = undefined;
|
this._queryEndTime = undefined;
|
||||||
|
this._messages = [];
|
||||||
if (types.isObject(input) || types.isUndefinedOrNull(input)) {
|
if (types.isObject(input) || types.isUndefinedOrNull(input)) {
|
||||||
// Update internal state to show that we're executing the query
|
// Update internal state to show that we're executing the query
|
||||||
this._resultLineOffset = input ? input.startLine : 0;
|
this._resultLineOffset = input ? input.startLine : 0;
|
||||||
@@ -417,10 +418,10 @@ export default class QueryRunner extends Disposable {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return this._queryManagementService.getQueryRows(rowData).then(r => r, error => {
|
return this._queryManagementService.getQueryRows(rowData).then(r => r, error => {
|
||||||
this._notificationService.notify({
|
// this._notificationService.notify({
|
||||||
severity: Severity.Error,
|
// severity: Severity.Error,
|
||||||
message: nls.localize('query.gettingRowsFailedError', 'Something went wrong getting more rows: {0}', error)
|
// message: nls.localize('query.gettingRowsFailedError', 'Something went wrong getting more rows: {0}', error)
|
||||||
});
|
// });
|
||||||
return error;
|
return error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -475,11 +476,11 @@ export default class QueryRunner extends Disposable {
|
|||||||
}
|
}
|
||||||
resolve(result);
|
resolve(result);
|
||||||
}, error => {
|
}, error => {
|
||||||
let errorMessage = nls.localize('query.moreRowsFailedError', 'Something went wrong getting more rows:');
|
// let errorMessage = nls.localize('query.moreRowsFailedError', 'Something went wrong getting more rows:');
|
||||||
self._notificationService.notify({
|
// self._notificationService.notify({
|
||||||
severity: Severity.Error,
|
// severity: Severity.Error,
|
||||||
message: `${errorMessage} ${error}`
|
// message: `${errorMessage} ${error}`
|
||||||
});
|
// });
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export class TopOperationsState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class TopOperationsTab implements IPanelTab {
|
export class TopOperationsTab implements IPanelTab {
|
||||||
public readonly title = localize('topOperationsTitle', 'Top Operation');
|
public readonly title = localize('topOperationsTitle', 'Top Operations');
|
||||||
public readonly identifier = 'TopOperationsTab';
|
public readonly identifier = 'TopOperationsTab';
|
||||||
public readonly view: TopOperationsView;
|
public readonly view: TopOperationsView;
|
||||||
|
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
import types = require('vs/base/common/types');
|
|
||||||
import objects = require('vs/base/common/objects');
|
|
||||||
|
|
||||||
import {
|
|
||||||
ICollapsibleViewOptions, AbstractCollapsibleView, ViewSizing, CollapsibleState
|
|
||||||
} from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
|
|
||||||
export interface IFixedCollapsibleViewOptions extends ICollapsibleViewOptions {
|
|
||||||
expandedBodySize?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class FixedCollapsibleView extends AbstractCollapsibleView {
|
|
||||||
private _expandedBodySize: number;
|
|
||||||
|
|
||||||
constructor(initialSize: number, opts: IFixedCollapsibleViewOptions) {
|
|
||||||
super(initialSize, objects.mixin({ sizing: ViewSizing.Fixed }, opts));
|
|
||||||
this._expandedBodySize = types.isUndefined(opts.expandedBodySize) ? 22 : opts.expandedBodySize;
|
|
||||||
}
|
|
||||||
|
|
||||||
get fixedSize(): number { return this.state === CollapsibleState.EXPANDED ? this.expandedSize : this.headerSize; }
|
|
||||||
private get expandedSize(): number { return this.expandedBodySize + this.headerSize; }
|
|
||||||
|
|
||||||
get expandedBodySize(): number { return this._expandedBodySize; }
|
|
||||||
set expandedBodySize(size: number) {
|
|
||||||
this._expandedBodySize = size;
|
|
||||||
this.setFixed(this.fixedSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected changeState(state: CollapsibleState): void {
|
|
||||||
super.changeState(state);
|
|
||||||
this.setFixed(this.fixedSize);
|
|
||||||
|
|
||||||
if (this.body) {
|
|
||||||
if (state === CollapsibleState.COLLAPSED) {
|
|
||||||
// make sure the body goes out of the tabindex world by hiding it
|
|
||||||
$(this.body).hide();
|
|
||||||
} else {
|
|
||||||
$(this.body).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
import { CollapsibleView, ICollapsibleViewOptions } from 'sql/base/browser/ui/views/browser/views';
|
|
||||||
import { List } from 'vs/base/browser/ui/list/listWidget';
|
|
||||||
import { IAction, ActionRunner } from 'vs/base/common/actions';
|
|
||||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
|
||||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
|
||||||
import { $ } from 'vs/base/browser/builder';
|
|
||||||
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
|
|
||||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
|
||||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
|
||||||
import { attachBadgeStyler } from 'vs/platform/theme/common/styler';
|
|
||||||
import { CollapsibleState } from 'sql/base/browser/ui/splitview/splitview';
|
|
||||||
|
|
||||||
export class FixedListView<T> extends CollapsibleView {
|
|
||||||
private _badge: CountBadge;
|
|
||||||
private _disposables: IDisposable[] = [];
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
initialSize: number,
|
|
||||||
initiallyCollapsed: boolean,
|
|
||||||
private _viewTitle: string,
|
|
||||||
private _list: List<T>,
|
|
||||||
private _bodyContainer: HTMLElement,
|
|
||||||
headerSize: number,
|
|
||||||
private _actions: IAction[],
|
|
||||||
actionRunner: ActionRunner,
|
|
||||||
contextMenuService: IContextMenuService,
|
|
||||||
keybindingService: IKeybindingService,
|
|
||||||
private _themeService: IThemeService
|
|
||||||
) {
|
|
||||||
super(initialSize, <ICollapsibleViewOptions>{
|
|
||||||
id: _viewTitle,
|
|
||||||
name: _viewTitle,
|
|
||||||
actionRunner: actionRunner,
|
|
||||||
collapsed: initiallyCollapsed,
|
|
||||||
ariaHeaderLabel: _viewTitle,
|
|
||||||
sizing: headerSize,
|
|
||||||
initialBodySize: undefined
|
|
||||||
}, keybindingService, contextMenuService);
|
|
||||||
}
|
|
||||||
|
|
||||||
// RENDER METHODS //////////////////////////////////////////////////////
|
|
||||||
public renderBody(container: HTMLElement): void {
|
|
||||||
container.appendChild(this._bodyContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public renderHeader(container: HTMLElement): void {
|
|
||||||
const titleDiv = $('div.title').appendTo(container);
|
|
||||||
$('span').text(this._viewTitle).appendTo(titleDiv);
|
|
||||||
super.renderHeader(container);
|
|
||||||
|
|
||||||
// show the badge
|
|
||||||
this._badge = new CountBadge($('.count-badge-wrapper').appendTo(container).getHTMLElement());
|
|
||||||
this._disposables.push(attachBadgeStyler(this._badge, this._themeService));
|
|
||||||
}
|
|
||||||
|
|
||||||
public updateList(content: T[]) {
|
|
||||||
this._list.splice(0, this._list.length, content);
|
|
||||||
this._badge.setCount(this._list.length);
|
|
||||||
this._list.layout(this._list.contentHeight);
|
|
||||||
this.setFixed(this.fixedSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
public get list(): List<T> {
|
|
||||||
return this._list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public listContentHeight(): number {
|
|
||||||
return this._list.contentHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public get fixedSize(): number {
|
|
||||||
return this.state === CollapsibleState.EXPANDED ? this.expandedSize : this.headerSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
private get expandedSize(): number {
|
|
||||||
if (this._list && this._list.contentHeight) {
|
|
||||||
return this._list.contentHeight + this.headerSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.headerSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected changeState(state: CollapsibleState): void {
|
|
||||||
super.changeState(state);
|
|
||||||
this.setFixed(this.fixedSize);
|
|
||||||
if (this.list) {
|
|
||||||
this.list.getHTMLElement().hidden = (state === CollapsibleState.COLLAPSED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return actions for the view
|
|
||||||
*/
|
|
||||||
public getActions(): IAction[] {
|
|
||||||
return this._actions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public dispose(): void {
|
|
||||||
this._disposables = dispose(this._disposables);
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
3
src/sql/sqlops.d.ts
vendored
3
src/sql/sqlops.d.ts
vendored
@@ -882,7 +882,7 @@ declare module 'sqlops' {
|
|||||||
// Save Results ===============================================================================
|
// Save Results ===============================================================================
|
||||||
export interface SaveResultsRequestParams {
|
export interface SaveResultsRequestParams {
|
||||||
/**
|
/**
|
||||||
* 'csv', 'json', 'excel'
|
* 'csv', 'json', 'excel', 'xml'
|
||||||
*/
|
*/
|
||||||
resultFormat: string;
|
resultFormat: string;
|
||||||
ownerUri: string;
|
ownerUri: string;
|
||||||
@@ -898,6 +898,7 @@ declare module 'sqlops' {
|
|||||||
lineSeperator?: string;
|
lineSeperator?: string;
|
||||||
textIdentifier?: string;
|
textIdentifier?: string;
|
||||||
encoding?: string;
|
encoding?: string;
|
||||||
|
formatted?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SaveResultRequestResult {
|
export interface SaveResultRequestResult {
|
||||||
|
|||||||
@@ -321,16 +321,13 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements
|
|||||||
let model = new NotebookInputModel(uri, undefined, trusted, undefined);
|
let model = new NotebookInputModel(uri, undefined, trusted, undefined);
|
||||||
let providerId = options.providerId;
|
let providerId = options.providerId;
|
||||||
let providers: string[] = undefined;
|
let providers: string[] = undefined;
|
||||||
if (!providerId)
|
// Ensure there is always a sensible provider ID for this file type
|
||||||
{
|
providers = getProvidersForFileName(uri.fsPath, this._notebookService);
|
||||||
// Ensure there is always a sensible provider ID for this file type
|
// Try to use a non-builtin provider first
|
||||||
providers = getProvidersForFileName(uri.fsPath, this._notebookService);
|
if (providers) {
|
||||||
// Try to use a non-builtin provider first
|
providerId = providers.find(p => p !== DEFAULT_NOTEBOOK_PROVIDER);
|
||||||
if (providers) {
|
if (!providerId) {
|
||||||
providerId = providers.find(p => p !== DEFAULT_NOTEBOOK_PROVIDER);
|
providerId = model.providerId;
|
||||||
if (!providerId) {
|
|
||||||
providerId = model.providerId;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
model.providers = providers;
|
model.providers = providers;
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ function createInstantiationService(addAccountFailureEmitter?: Emitter<string>):
|
|||||||
.returns(() => undefined);
|
.returns(() => undefined);
|
||||||
|
|
||||||
// Create a mock account dialog
|
// Create a mock account dialog
|
||||||
let accountDialog = new AccountDialog(null, null, null, instantiationService.object, null, null, null, new ContextKeyServiceStub(), null);
|
let accountDialog = new AccountDialog(null, null, instantiationService.object, null, null, null, null, new ContextKeyServiceStub(), null);
|
||||||
let mockAccountDialog = TypeMoq.Mock.ofInstance(accountDialog);
|
let mockAccountDialog = TypeMoq.Mock.ofInstance(accountDialog);
|
||||||
mockAccountDialog.setup(x => x.onAddAccountErrorEvent)
|
mockAccountDialog.setup(x => x.onAddAccountErrorEvent)
|
||||||
.returns(() => { return addAccountFailureEmitter ? addAccountFailureEmitter.event : mockEvent.event; });
|
.returns(() => { return addAccountFailureEmitter ? addAccountFailureEmitter.event : mockEvent.event; });
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ suite('Advanced properties dialog tests', () => {
|
|||||||
undefined, // partsService
|
undefined, // partsService
|
||||||
undefined, // themeService
|
undefined, // themeService
|
||||||
undefined, // Context view service
|
undefined, // Context view service
|
||||||
|
undefined, // instantiation Service
|
||||||
undefined, // telemetry service
|
undefined, // telemetry service
|
||||||
new ContextKeyServiceStub() // contextkeyservice
|
new ContextKeyServiceStub() // contextkeyservice
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ suite('Insights Dialog Controller Tests', () => {
|
|||||||
let { runner, complete } = getPrimedQueryRunner(testData, testColumns);
|
let { runner, complete } = getPrimedQueryRunner(testData, testColumns);
|
||||||
|
|
||||||
let instMoq = Mock.ofType(InstantiationService, MockBehavior.Strict);
|
let instMoq = Mock.ofType(InstantiationService, MockBehavior.Strict);
|
||||||
instMoq.setup(x => x.createInstance(It.isValue(QueryRunner), It.isAny(), undefined))
|
instMoq.setup(x => x.createInstance(It.isValue(QueryRunner), It.isAny()))
|
||||||
.returns(() => runner);
|
.returns(() => runner);
|
||||||
|
|
||||||
let connMoq = Mock.ofType(ConnectionManagementService, MockBehavior.Strict, {}, {});
|
let connMoq = Mock.ofType(ConnectionManagementService, MockBehavior.Strict, {}, {});
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ describe('notebook model', function(): void {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should create single cell if model has no contents', async function(): Promise<void> {
|
it('Should create no cells if model has no contents', async function(): Promise<void> {
|
||||||
// Given an empty notebook
|
// Given an empty notebook
|
||||||
let emptyNotebook: nb.INotebookContents = {
|
let emptyNotebook: nb.INotebookContents = {
|
||||||
cells: [],
|
cells: [],
|
||||||
@@ -125,9 +125,8 @@ describe('notebook model', function(): void {
|
|||||||
let model = new NotebookModel(defaultModelOptions);
|
let model = new NotebookModel(defaultModelOptions);
|
||||||
await model.requestModelLoad();
|
await model.requestModelLoad();
|
||||||
|
|
||||||
// Then I expect to have 1 code cell as the contents
|
// Then I expect to have 0 code cell as the contents
|
||||||
should(model.cells).have.length(1);
|
should(model.cells).have.length(0);
|
||||||
should(model.cells[0].source).be.empty();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should throw if model load fails', async function(): Promise<void> {
|
it('Should throw if model load fails', async function(): Promise<void> {
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ suite('Account Management Service Tests:', () => {
|
|||||||
provider: mockProvider.object,
|
provider: mockProvider.object,
|
||||||
metadata: hasAccountProvider
|
metadata: hasAccountProvider
|
||||||
};
|
};
|
||||||
|
|
||||||
// If: I update an account that exists
|
// If: I update an account that exists
|
||||||
state.accountManagementService.accountUpdated(account)
|
state.accountManagementService.accountUpdated(account)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ suite('ExtHostAccountManagement', () => {
|
|||||||
|
|
||||||
let mockAccountManagementService = getMockAccountManagementService(mockAccounts);
|
let mockAccountManagementService = getMockAccountManagementService(mockAccounts);
|
||||||
instantiationService.stub(IAccountManagementService, mockAccountManagementService.object);
|
instantiationService.stub(IAccountManagementService, mockAccountManagementService.object);
|
||||||
let accountManagementService = instantiationService.createInstance(MainThreadAccountManagement);
|
let accountManagementService = instantiationService.createInstance(MainThreadAccountManagement, undefined);
|
||||||
threadService.set(SqlMainContext.MainThreadAccountManagement, accountManagementService);
|
threadService.set(SqlMainContext.MainThreadAccountManagement, accountManagementService);
|
||||||
|
|
||||||
// Setup: Create ext host account management with registered account provider
|
// Setup: Create ext host account management with registered account provider
|
||||||
|
|||||||
Reference in New Issue
Block a user