Commit 922b9684 authored by ibuler's avatar ibuler

[Update] 修改Luna结构

parent 8dd82f18
{ {
"name": "luna", "name": "luna",
"version": "1.4.7", "version": "1.5.2",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
...@@ -232,31 +232,31 @@ ...@@ -232,31 +232,31 @@
} }
}, },
"@angular/common": { "@angular/common": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz",
"integrity": "sha512-yMFn2isC7/XOs56/2Kzzbb1AASHiwipAPOVFtKe7TdZQClO8fJXwCnk326rzr615+CG0eSBNQWeiFGyWN2riBA==", "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
}, },
"@angular/compiler": { "@angular/compiler": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.11.tgz",
"integrity": "sha512-RfYa4ESgjGX0T0ob/Xz00IF7nd2xZkoyRy6oKgL82q42uzB3xZUDMrFNgeGxAUs3H22IkL46/5SSPOMOTMZ0NA==", "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
}, },
"@angular/compiler-cli": { "@angular/compiler-cli": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.11.tgz",
"integrity": "sha512-+Kef4NjuHwLj2hRPdVo4yAtPmv+kn0Nu/ShmKfaEK4mt9aaQMFxKNt6beUuDK5iUPMB5nuTCZ4bqEFpqd+EtxQ==", "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==",
"dev": true, "dev": true,
"requires": { "requires": {
"chokidar": "^1.4.2", "chokidar": "^1.4.2",
"minimist": "^1.2.0", "minimist": "^1.2.0",
"reflect-metadata": "^0.1.2", "reflect-metadata": "^0.1.2",
"tsickle": "^0.26.0" "tsickle": "^0.27.2"
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
...@@ -268,33 +268,33 @@ ...@@ -268,33 +268,33 @@
} }
}, },
"@angular/core": { "@angular/core": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz",
"integrity": "sha512-s2ne45DguNUubhC1YgybGECC4Tyx3G4EZCntUiRMDWWkmKXSK+6dgHMesyDo8R5Oat8VfN4Anf8l3JHS1He8kg==", "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
}, },
"@angular/flex-layout": { "@angular/flex-layout": {
"version": "2.0.0-beta.10-4905443", "version": "5.0.0-beta.15",
"resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-2.0.0-beta.10-4905443.tgz", "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-5.0.0-beta.15.tgz",
"integrity": "sha512-jjr6mQ3X2vdEQbsyHD/mz1hfTBUUEOZVLFWEz/sbNoeU7uiA4lvqdp/ASrkZydGJHmTDUYrbBE/9kx0lherZ8Q==", "integrity": "sha512-rGvvjDu0PMrsfTsNX+qcNc4EloKGXTxW8FT1tKcdIxOUMRQkvflkwAnKW2kRWNfEgDtBNt+VNP98u2w+athvZQ==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
}, },
"@angular/forms": { "@angular/forms": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz",
"integrity": "sha512-g1/SF9lY0ZwzJ0w4NXbFsTGGEuUdgtaZny8DmkaqtmA7idby3FW398X0tv25KQfVYKtL+p9Jp1Y8EI0CvrIsvw==", "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
}, },
"@angular/http": { "@angular/http": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz",
"integrity": "sha512-V5Cl24dP3rCXTTQvDc0TIKoWqBRAa0DWAQbtr7iuDAt5a1vPGdKz5K1sEiiV6ziwX6gzjiwHjUvL+B+WbIUrQA==", "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
...@@ -314,25 +314,25 @@ ...@@ -314,25 +314,25 @@
} }
}, },
"@angular/platform-browser": { "@angular/platform-browser": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.11.tgz",
"integrity": "sha512-c6cR15MfopPwGZ097HdRuAi9+R9BhA3bRRFpP2HmrSSB/BW4ZNovUYwB2QUMSYbd9s0lYTtnavqGm6DKcyF2QA==", "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
}, },
"@angular/platform-browser-dynamic": { "@angular/platform-browser-dynamic": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.11.tgz",
"integrity": "sha512-xG1eNoi8sm4Jcly2y98r5mqYVe3XV8sUJCtOhvGBYtvt4dKEQ5tOns6fWQ0nUbl6Vv3Y0xgGUS1JCtfut3DuaQ==", "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
}, },
"@angular/router": { "@angular/router": {
"version": "5.2.0", "version": "5.2.11",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.0.tgz", "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.11.tgz",
"integrity": "sha512-VXDXtp2A1GQEUEhXg0ZzqHdTUERLgDSo3/Mmpzt+dgLMKlXDSCykcm4gINwE5VQLGD1zQvDFCCRv3seGRNfrqA==", "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==",
"requires": { "requires": {
"tslib": "^1.7.1" "tslib": "^1.7.1"
} }
...@@ -406,6 +406,14 @@ ...@@ -406,6 +406,14 @@
"normalize.css": "^5.0.0" "normalize.css": "^5.0.0"
}, },
"dependencies": { "dependencies": {
"@angular/flex-layout": {
"version": "2.0.0-beta.10-4905443",
"resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-2.0.0-beta.10-4905443.tgz",
"integrity": "sha512-jjr6mQ3X2vdEQbsyHD/mz1hfTBUUEOZVLFWEz/sbNoeU7uiA4lvqdp/ASrkZydGJHmTDUYrbBE/9kx0lherZ8Q==",
"requires": {
"tslib": "^1.7.1"
}
},
"moment": { "moment": {
"version": "2.22.2", "version": "2.22.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
...@@ -563,6 +571,7 @@ ...@@ -563,6 +571,7 @@
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
"dev": true,
"requires": { "requires": {
"kind-of": "^3.0.2", "kind-of": "^3.0.2",
"longest": "^1.0.1", "longest": "^1.0.1",
...@@ -572,7 +581,8 @@ ...@@ -572,7 +581,8 @@
"amdefine": { "amdefine": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"dev": true
}, },
"amqplib": { "amqplib": {
"version": "0.5.2", "version": "0.5.2",
...@@ -1356,9 +1366,9 @@ ...@@ -1356,9 +1366,9 @@
} }
}, },
"bootstrap": { "bootstrap": {
"version": "4.1.3", "version": "4.3.1",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.3.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz",
"integrity": "sha512-rDFIzgXcof0jDyjNosjv4Sno77X4KuPeFxG2XZZv1/Kc8DRVGVADdoQyyOVDwPqL36DDmtCQbrpMCqvpPLJQ0w==" "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag=="
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.8", "version": "1.1.8",
...@@ -1858,6 +1868,7 @@ ...@@ -1858,6 +1868,7 @@
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
"dev": true,
"requires": { "requires": {
"align-text": "^0.1.3", "align-text": "^0.1.3",
"lazy-cache": "^1.0.3" "lazy-cache": "^1.0.3"
...@@ -1866,7 +1877,8 @@ ...@@ -1866,7 +1877,8 @@
"lazy-cache": { "lazy-cache": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
"dev": true
} }
} }
}, },
...@@ -2698,7 +2710,8 @@ ...@@ -2698,7 +2710,8 @@
"decamelize": { "decamelize": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
}, },
"decode-uri-component": { "decode-uri-component": {
"version": "0.2.0", "version": "0.2.0",
...@@ -3156,10 +3169,6 @@ ...@@ -3156,10 +3169,6 @@
"integrity": "sha512-h3zEBLdHvsKfaXv1SHAtykJyNtwYFEKkrWGSFyW1BzGgPQ4ykAzD5Hd8C5MZGTAEhkCKmtyIwYUrapsI0xfKww==", "integrity": "sha512-h3zEBLdHvsKfaXv1SHAtykJyNtwYFEKkrWGSFyW1BzGgPQ4ykAzD5Hd8C5MZGTAEhkCKmtyIwYUrapsI0xfKww==",
"dev": true "dev": true
}, },
"elfinder": {
"version": "git+https://github.com/Studio-42/elFinder.git#2d3a31f70e3c817417913ab54035717f26e3efce",
"from": "git+https://github.com/Studio-42/elFinder.git#2.1.33"
},
"elliptic": { "elliptic": {
"version": "6.4.0", "version": "6.4.0",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
...@@ -3933,11 +3942,6 @@ ...@@ -3933,11 +3942,6 @@
"minimatch": "^3.0.3" "minimatch": "^3.0.3"
} }
}, },
"filetree-css": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/filetree-css/-/filetree-css-1.0.0.tgz",
"integrity": "sha1-7bfoiHH+ere+CeaZXNouodVzXUw="
},
"fill-range": { "fill-range": {
"version": "2.2.4", "version": "2.2.4",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
...@@ -5031,82 +5035,25 @@ ...@@ -5031,82 +5035,25 @@
"dev": true "dev": true
}, },
"handlebars": { "handlebars": {
"version": "4.0.11", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
"integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
"requires": { "requires": {
"async": "^1.4.0", "neo-async": "^2.6.0",
"optimist": "^0.6.1", "optimist": "^0.6.1",
"source-map": "^0.4.4", "source-map": "^0.6.1",
"uglify-js": "^2.6" "uglify-js": "^3.1.4"
}, },
"dependencies": { "dependencies": {
"async": { "neo-async": {
"version": "1.5.2", "version": "2.6.1",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
},
"camelcase": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
"optional": true
},
"cliui": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
"optional": true,
"requires": {
"center-align": "^0.1.1",
"right-align": "^0.1.1",
"wordwrap": "0.0.2"
}
}, },
"source-map": { "source-map": {
"version": "0.4.4", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
"requires": {
"amdefine": ">=0.0.4"
}
},
"uglify-js": {
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
"optional": true,
"requires": {
"source-map": "~0.5.1",
"uglify-to-browserify": "~1.0.0",
"yargs": "~3.10.0"
},
"dependencies": {
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"optional": true
}
}
},
"wordwrap": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
"optional": true
},
"yargs": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
"optional": true,
"requires": {
"camelcase": "^1.0.2",
"cliui": "^2.1.0",
"decamelize": "^1.0.0",
"window-size": "0.1.0"
}
} }
} }
}, },
...@@ -5872,7 +5819,8 @@ ...@@ -5872,7 +5819,8 @@
"is-buffer": { "is-buffer": {
"version": "1.1.5", "version": "1.1.5",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
"integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
"dev": true
}, },
"is-builtin-module": { "is-builtin-module": {
"version": "1.0.0", "version": "1.0.0",
...@@ -6330,9 +6278,9 @@ ...@@ -6330,9 +6278,9 @@
"dev": true "dev": true
}, },
"jquery": { "jquery": {
"version": "3.2.1", "version": "3.4.1",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
"integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
}, },
"jquery-slimscroll": { "jquery-slimscroll": {
"version": "1.3.8", "version": "1.3.8",
...@@ -6749,6 +6697,7 @@ ...@@ -6749,6 +6697,7 @@
"version": "3.2.2", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": { "requires": {
"is-buffer": "^1.1.5" "is-buffer": "^1.1.5"
} }
...@@ -6921,9 +6870,9 @@ ...@@ -6921,9 +6870,9 @@
} }
}, },
"lodash": { "lodash": {
"version": "4.17.11", "version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
}, },
"lodash.assign": { "lodash.assign": {
"version": "4.2.0", "version": "4.2.0",
...@@ -7114,7 +7063,8 @@ ...@@ -7114,7 +7063,8 @@
"longest": { "longest": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
"dev": true
}, },
"loose-envify": { "loose-envify": {
"version": "1.3.1", "version": "1.3.1",
...@@ -9884,9 +9834,9 @@ ...@@ -9884,9 +9834,9 @@
"optional": true "optional": true
}, },
"reflect-metadata": { "reflect-metadata": {
"version": "0.1.12", "version": "0.1.13",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
"integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
"dev": true "dev": true
}, },
"regenerate": { "regenerate": {
...@@ -9989,7 +9939,8 @@ ...@@ -9989,7 +9939,8 @@
"repeat-string": { "repeat-string": {
"version": "1.6.1", "version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
}, },
"repeating": { "repeating": {
"version": "2.0.1", "version": "2.0.1",
...@@ -10127,6 +10078,7 @@ ...@@ -10127,6 +10078,7 @@
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
"dev": true,
"requires": { "requires": {
"align-text": "^0.1.1" "align-text": "^0.1.1"
} }
...@@ -11743,15 +11695,15 @@ ...@@ -11743,15 +11695,15 @@
} }
}, },
"tsickle": { "tsickle": {
"version": "0.26.0", "version": "0.27.5",
"resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.26.0.tgz", "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz",
"integrity": "sha512-eWJ2CUfttGK0LqF9iJ/Avnxbj4M+fCyJ50Zag3wm73Fut1hsasPRHKxKdrMWVj4BMHnQNx7TO+DdNmLmJTSuNw==", "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==",
"dev": true, "dev": true,
"requires": { "requires": {
"minimist": "^1.2.0", "minimist": "^1.2.0",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"source-map": "^0.5.6", "source-map": "^0.6.0",
"source-map-support": "^0.4.2" "source-map-support": "^0.5.0"
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
...@@ -11759,6 +11711,22 @@ ...@@ -11759,6 +11711,22 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true "dev": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"source-map-support": {
"version": "0.5.13",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
"integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
} }
} }
}, },
...@@ -11888,7 +11856,6 @@ ...@@ -11888,7 +11856,6 @@
"version": "3.4.9", "version": "3.4.9",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
"integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
"dev": true,
"requires": { "requires": {
"commander": "~2.17.1", "commander": "~2.17.1",
"source-map": "~0.6.1" "source-map": "~0.6.1"
...@@ -11897,14 +11864,12 @@ ...@@ -11897,14 +11864,12 @@
"commander": { "commander": {
"version": "2.17.1", "version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
"dev": true
}, },
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
"dev": true
} }
} }
}, },
...@@ -11912,6 +11877,7 @@ ...@@ -11912,6 +11877,7 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
"dev": true,
"optional": true "optional": true
}, },
"uglifyjs-webpack-plugin": { "uglifyjs-webpack-plugin": {
...@@ -14175,7 +14141,8 @@ ...@@ -14175,7 +14141,8 @@
"window-size": { "window-size": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
"dev": true
}, },
"wordwrap": { "wordwrap": {
"version": "0.0.3", "version": "0.0.3",
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
"@angular/core": "^5.2.11", "@angular/core": "^5.2.11",
"@angular/flex-layout": "^5.0.0-beta.15", "@angular/flex-layout": "^5.0.0-beta.15",
"@angular/forms": "^5.2.11", "@angular/forms": "^5.2.11",
"@angular/http": "^5.2.11",
"@angular/material": "^5.2.0", "@angular/material": "^5.2.0",
"@angular/platform-browser": "^5.2.11", "@angular/platform-browser": "^5.2.11",
"@angular/platform-browser-dynamic": "^5.2.11", "@angular/platform-browser-dynamic": "^5.2.11",
...@@ -31,6 +32,7 @@ ...@@ -31,6 +32,7 @@
"ajv": "^6.5.0", "ajv": "^6.5.0",
"animate.css": "^3.6.1", "animate.css": "^3.6.1",
"body-parser": "^1.18.2", "body-parser": "^1.18.2",
"bootstrap": "^4.3.1",
"clipboard": "^1.7.1", "clipboard": "^1.7.1",
"compass-mixins": "^0.12.10", "compass-mixins": "^0.12.10",
"core-js": "2.5.3", "core-js": "2.5.3",
...@@ -75,7 +77,7 @@ ...@@ -75,7 +77,7 @@
"devDependencies": { "devDependencies": {
"@angular-devkit/core": "^0.4.9", "@angular-devkit/core": "^0.4.9",
"@angular-devkit/schematics": "^0.4.9", "@angular-devkit/schematics": "^0.4.9",
"@angular/cli": "^7.2.1", "@angular/cli": "^1.7.4",
"@angular/compiler-cli": "^5.2.11", "@angular/compiler-cli": "^5.2.11",
"@angular/language-service": "5.2.0", "@angular/language-service": "5.2.0",
"@types/jasmine": "2.8.4", "@types/jasmine": "2.8.4",
......
{ {
"/api": { "/api": {
"target": "http://127.0.0.1:5001", "target": "http://127.0.0.1:8080",
"secure": false "secure": false
}, },
"/luna/i18n": { "/luna/i18n": {
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
"secure": false "secure": false
}, },
"/socket.io/": { "/socket.io/": {
"target": "http://127.0.0.1:5001", "target": "http://127.0.0.1:5000",
"secure": false, "secure": false,
"ws": true "ws": true
}, },
...@@ -27,5 +27,13 @@ ...@@ -27,5 +27,13 @@
"^/rdp": "" "^/rdp": ""
}, },
"secure": false "secure": false
},
"/guacamole/": {
"target": "http://127.0.0.1:8083",
"secure": false,
"ws": true,
"pathRewrite": {
"^/guacamole": ""
}
} }
} }
...@@ -9,16 +9,16 @@ import {BrowserModule} from '@angular/platform-browser'; ...@@ -9,16 +9,16 @@ import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {FormsModule, ReactiveFormsModule} from '@angular/forms'; // <-- NgModel lives here import {FormsModule, ReactiveFormsModule} from '@angular/forms'; // <-- NgModel lives here
import {NGXLogger} from 'ngx-logger'; import {NGXLogger} from 'ngx-logger';
import {FlexLayoutModule} from '@angular/flex-layout';
import {HttpClientModule} from '@angular/common/http'; import {HttpClientModule} from '@angular/common/http';
import {CookieService} from 'ngx-cookie-service';
import {MAT_LABEL_GLOBAL_OPTIONS} from '@angular/material';
import {AppRouterModule} from './router/router.module';
// service // service
import {AppService, HttpService, LocalStorageService, NavService, LogService, UUIDService, TreeFilterService} from './app.service'; import {AppService, HttpService, LocalStorageService, NavService, LogService, UUIDService, TreeFilterService} from './app.service';
import {CookieService} from 'ngx-cookie-service';
import {MAT_LABEL_GLOBAL_OPTIONS} from '@angular/material';
import {AppRouterModule} from './router/router.module';
import {Pipes} from './pipes/pipes'; import {Pipes} from './pipes/pipes';
import {AppComponent} from './pages/app.component'; import {AppComponent} from './pages/app.component';
import {PagesComponents} from './pages/pages.component'; import {PagesComponents} from './pages/pages.component';
...@@ -34,6 +34,7 @@ import {SftpComponent} from './elements/sftp/sftp.component'; ...@@ -34,6 +34,7 @@ import {SftpComponent} from './elements/sftp/sftp.component';
@NgModule({ @NgModule({
imports: [ imports: [
BrowserModule, BrowserModule,
FlexLayoutModule,
FormsModule, FormsModule,
HttpClientModule, HttpClientModule,
ReactiveFormsModule, ReactiveFormsModule,
......
...@@ -3,9 +3,9 @@ import {MatDialog} from '@angular/material'; ...@@ -3,9 +3,9 @@ import {MatDialog} from '@angular/material';
import {BehaviorSubject} from 'rxjs/BehaviorSubject'; import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute} from '@angular/router';
import {AppService, HttpService, LogService, NavService, TreeFilterService} from '../../app.service'; import {AppService, HttpService, LogService, NavService, TreeFilterService} from '@app/app.service';
import {connectEvt, translate} from '../../globals'; import {connectEvt, translate} from '@app/globals';
import {TreeNode, ConnectEvt} from '../../model'; import {TreeNode, ConnectEvt} from '@app/model';
declare var $: any; declare var $: any;
......
import {Component, Input, OnInit, Output, Inject, OnDestroy, EventEmitter} from '@angular/core'; import {Component, Input, OnInit, Output, Inject, OnDestroy, EventEmitter} from '@angular/core';
import {connectEvt} from '../../globals'; import {connectEvt} from '@app/globals';
import {AppService, HttpService, LogService, NavService} from '../../app.service'; import {AppService, HttpService, LogService, NavService} from '@app/app.service';
import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material'; import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material';
import {FormControl, Validators} from '@angular/forms'; import {FormControl, Validators} from '@angular/forms';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute} from '@angular/router';
import {SystemUser, TreeNode, Asset} from '../../model'; import {SystemUser, TreeNode, Asset} from '@app/model';
import {View} from '../content/model'; import {View} from '@app/model';
import * as jQuery from 'jquery/dist/jquery.min'; import * as jQuery from 'jquery/dist/jquery.min';
declare var $: any; declare var $: any;
......
import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core'; import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core';
import {View, ViewAction} from '../content/model'; import {View, ViewAction} from '@app/model';
@Component({ @Component({
selector: 'elements-content-tab', selector: 'elements-content-tab',
......
div, elements-term, elements-guacamole, elements-settings { div, elements-term, elements-guacamole {
height: 100%; height: 100%;
} }
elements-term, elements-guacamole, elements-settings { elements-term, elements-guacamole {
/*padding-bottom: 30px;*/ /*padding-bottom: 30px;*/
} }
......
import {Component, OnInit, Input} from '@angular/core'; import {Component, OnInit, Input} from '@angular/core';
import {View} from '../content/model'; import {View} from '@app/model';
@Component({ @Component({
selector: 'elements-content-window', selector: 'elements-content-window',
......
<div id="content" fxLayout="column" ngxSplit="column"> <div id="content">
<div fxFlex="0 0 30px"> <div>
<div class="scroll-button" style="padding: 0 5px"> <div class="scroll-button">
<a class="left" (click)="scrollLeft()"><i class="fa fa-caret-left"></i></a> <a class="left" (click)="scrollLeft()"><i class="fa fa-caret-left"></i></a>
<a class="right" (click)="scrollRight()"><i class="fa fa-caret-right"></i></a> <a class="right" (click)="scrollRight()"><i class="fa fa-caret-right"></i></a>
</div> </div>
...@@ -13,9 +13,9 @@ ...@@ -13,9 +13,9 @@
</ul> </ul>
</div> </div>
</div> </div>
<div fxFlex="1 1 calc(100%-30px)" id="winContainer"> <div id="winContainer">
<elements-content-window *ngFor="let view of viewList" [view]="view" ></elements-content-window> <elements-content-window *ngFor="let view of viewList" [view]="view" ></elements-content-window>
</div> </div>
</div> </div>
<elements-connect [ngStyle]="{'display': none}" (onNewView)="onNewView($event)" ></elements-connect> <elements-connect [ngStyle]="{'display': 'none'}" (onNewView)="onNewView($event)" ></elements-connect>
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
display: inline-block; display: inline-block;
min-width: 100%; min-width: 100%;
padding-left: 0; padding-left: 0;
margin: 0;
} }
/* /*
* scrollbar * scrollbar
...@@ -36,7 +37,8 @@ ...@@ -36,7 +37,8 @@
height: 30px; height: 30px;
overflow: hidden; overflow: hidden;
background-color: #3a3333; background-color: #3a3333;
color: white color: white;
padding: 0 5px;
} }
.scroll-button a.disabled { .scroll-button a.disabled {
...@@ -44,7 +46,14 @@ ...@@ -44,7 +46,14 @@
cursor: not-allowed; cursor: not-allowed;
} }
#content {
.window {
height: 100%; height: 100%;
} }
#winContainer {
height: calc(100% - 30px);
}
//
//.window {
// height: 100%;
//}
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
import {View, ViewAction} from './model'; import {View, ViewAction} from '@app/model';
@Component({ @Component({
selector: 'elements-content', selector: 'elements-content',
...@@ -7,8 +7,8 @@ import {View, ViewAction} from './model'; ...@@ -7,8 +7,8 @@ import {View, ViewAction} from './model';
styleUrls: ['./content.component.scss'] styleUrls: ['./content.component.scss']
}) })
export class ElementContentComponent implements OnInit { export class ElementContentComponent implements OnInit {
viewList: Array<View> = [];
@ViewChild('tabs') tabsRef: ElementRef; @ViewChild('tabs') tabsRef: ElementRef;
viewList: Array<View> = [];
static DisconnectAll() { static DisconnectAll() {
} }
......
export class View {
id: string;
nick: string;
type: string;
editable: boolean;
active: boolean;
connected: boolean;
hide: boolean;
closed: boolean;
host: any;
user: any;
remoteApp: string;
room: string;
Rdp: any;
Term: any;
}
export class ViewAction {
view: View;
name: string;
constructor(view: View, name: string) {
this.view = view;
this.name = name;
}
}
import {Component, Inject, Injectable, OnInit} from '@angular/core'; import {Component, Inject, Injectable, OnInit} from '@angular/core';
import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material'; import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material';
import {LogService} from '../../app.service'; import {LogService} from '@app/app.service';
import {FormControl, Validators} from '@angular/forms'; import {FormControl, Validators} from '@angular/forms';
// import * as layer from 'layui-layer/src/layer.js'; // import * as layer from 'layui-layer/src/layer.js';
......
...@@ -6,7 +6,6 @@ import {ElementContentViewComponent} from './content-window/content-window.compo ...@@ -6,7 +6,6 @@ import {ElementContentViewComponent} from './content-window/content-window.compo
import {ElementContentTabComponent} from './content-tab/content-tab.component'; import {ElementContentTabComponent} from './content-tab/content-tab.component';
import {ElementAssetTreeComponent} from './asset-tree/asset-tree.component'; import {ElementAssetTreeComponent} from './asset-tree/asset-tree.component';
import {ElementTreeFilterComponent} from './tree-filter/tree-filter.component'; import {ElementTreeFilterComponent} from './tree-filter/tree-filter.component';
import {ElementOfooterComponent} from './ofooter/ofooter.component';
import {ElementFooterComponent} from './footer/footer.component'; import {ElementFooterComponent} from './footer/footer.component';
import {ElementTermComponent} from './term/term.component'; import {ElementTermComponent} from './term/term.component';
import {ElementInteractiveComponent} from './interactive/interactive.component'; import {ElementInteractiveComponent} from './interactive/interactive.component';
...@@ -28,7 +27,6 @@ export const ElementComponents = [ ...@@ -28,7 +27,6 @@ export const ElementComponents = [
ElementContentViewComponent, ElementContentViewComponent,
ElementConnectComponent, ElementConnectComponent,
ElementTreeFilterComponent, ElementTreeFilterComponent,
ElementOfooterComponent,
ElementTableComponent, ElementTableComponent,
ElementFooterComponent, ElementFooterComponent,
ElementTermComponent, ElementTermComponent,
......
...@@ -5,9 +5,9 @@ ...@@ -5,9 +5,9 @@
* @author liuzheng <liuzheng712@gmail.com> * @author liuzheng <liuzheng712@gmail.com>
*/ */
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {AppService, LogService} from '../../app.service'; import {AppService, LogService} from '@app/app.service';
import {DataStore, User} from '../../globals'; import {DataStore, User} from '@app/globals';
import {version} from '../../../environments/environment'; import {version} from '@src/environments/environment';
@Component({ @Component({
selector: 'elements-footer', selector: 'elements-footer',
......
<!--<iframe #rdp [src]="trust('https://inews.gtimg.com/newsapp_bt/0/3460971429/1000')" width="100%" height="100%" (mouseenter)="active()"></iframe>--> <div class="rdpIframe">
<iframe #rdpRef *ngIf="target" [src]="trust(target)" width="100%" height="100%" (mouseenter)="active()"></iframe> <iframe #rdpRef *ngIf="target" [src]="trust(target)" width="100%" height="100%" (mouseenter)="active()"></iframe>
</div>
...@@ -2,3 +2,7 @@ iframe { ...@@ -2,3 +2,7 @@ iframe {
border: none; border: none;
background-color: white; background-color: white;
} }
.rdpIframe {
height: 100%;
}
import {Component, ElementRef, Input, OnInit, ViewChild} from '@angular/core'; import {Component, ElementRef, Input, OnInit, ViewChild} from '@angular/core';
import {CookieService} from 'ngx-cookie-service'; import {CookieService} from 'ngx-cookie-service';
import {HttpService, LogService} from '../../app.service'; import {HttpService, LogService} from '@app/app.service';
import {DataStore, User} from '../../globals'; import {DataStore, User} from '@app/globals';
import {DomSanitizer} from '@angular/platform-browser'; import {DomSanitizer} from '@angular/platform-browser';
import {View} from '../content/model'; import {View} from '@app/model';
@Component({ @Component({
selector: 'elements-guacamole', selector: 'elements-guacamole',
......
<div class="sidebar" fxLayout="column" ngxSplit="column"> <div class="sidebar" fxLayout="column" >
<div fxflex="1 1 30px" class="tree-filter"> <div fxflex="1 1 30px" class="tree-filter">
<elements-tree-filter ></elements-tree-filter> <elements-tree-filter ></elements-tree-filter>
</div> </div>
<div class="overflow ngx-scroll-overlay" fxflex="1 1 calc(90%-60px)"> <div class="overflow ngx-scroll-overlay" fxflex="1 1 calc(100% - 60px)">
<elements-asset-tree ></elements-asset-tree> <elements-asset-tree ></elements-asset-tree>
</div> </div>
......
...@@ -3,10 +3,6 @@ ...@@ -3,10 +3,6 @@
width: 100%; width: 100%;
overflow: auto; overflow: auto;
} }
//
//:root {
// font-family: "Hiragino Kaku Gothic ProN", Meiryo, sans-serif;
//}
label { label {
margin-bottom: 0; margin-bottom: 0;
...@@ -16,14 +12,10 @@ label { ...@@ -16,14 +12,10 @@ label {
content: "\f26c"; content: "\f26c";
} }
.tree-filter {
height: 30px;
}
.overflow { .overflow {
height: 90%;
display: flex; display: flex;
width: 100%; width: 100%;
height: 100%;
float: left; float: left;
position: inherit; position: inherit;
background: #2f2a2a; background: #2f2a2a;
...@@ -38,7 +30,7 @@ label { ...@@ -38,7 +30,7 @@ label {
padding: 1px 20px 0 20px; padding: 1px 20px 0 20px;
border-top: 1px solid #e7eaec; border-top: 1px solid #e7eaec;
bottom: 0; bottom: 0;
height: 60px; height: 30px;
} }
.footer-version > p { .footer-version > p {
...@@ -49,23 +41,6 @@ label { ...@@ -49,23 +41,6 @@ label {
color: #d6cbcb; color: #d6cbcb;
} }
//@import "~@swimlane/ngx-ui/release/styles/components/scrollbars";
.ngx-scroll-overlay { .ngx-scroll-overlay {
overflow: auto; // for FF overflow: auto; // for FF
} }
//.sidebar::-webkit-scrollbar-track {
// -webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3);
// background-color: #676a6c;
//}
//
//.sidebar::-webkit-scrollbar {
// width: 8px;
//}
//
//.sidebar::-webkit-scrollbar-thumb {
// background-color: #F5F5F5;
// border-radius: 6px;
// border: 2px solid transparent;
//}
import {Component, Inject, OnInit, ViewChild, ElementRef} from '@angular/core'; import {Component, Inject, OnInit, ViewChild, ElementRef} from '@angular/core';
import {AppService, HttpService, LogService} from '../../app.service'; import {AppService, HttpService, LogService} from '@app/app.service';
// import {ElementTreeFilterComponent} from '../tree-filter/tree-filter.component'; // import {ElementTreeFilterComponent} from '../tree-filter/tree-filter.component';
import {DataStore} from '../../globals'; import {DataStore} from '@app/globals';
import {version} from '../../../environments/environment'; import {version} from '@src/environments/environment';
import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material'; import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material';
......
.nav { .nav {
display: block; display: block;
height: 31px; height: 30px;
padding-top: 2px; padding-top: 0;
background-color: #463e3e; background-color: #463e3e;
list-style: none;
} }
.nav ul { .nav ul {
list-style-type: none; list-style-type: none;
line-height: 24px; line-height: 24px;
margin: 0;
box-sizing: border-box;
font-weight: 400;
text-align: left;
} }
.nav li { .nav li {
display: inline-block; display: inline-block;
} }
.nav a { .nav .dropdown a {
color: #f0f0f1; color: #f0f0f1;
font-family: Roboto,sans-serif; font-family: Roboto,sans-serif;
font-size: 13px; font-size: 13px;
font-weight: 300; font-weight: 300;
text-decoration: none; text-decoration: none;
padding: 6px 15px 6px 15px; padding: 6px 15px;
height: 30px;
} }
.nav a:hover { .nav a:hover {
......
<script src="../../trans.pipe.spec.ts"></script>
<div class="nav"> <div class="nav">
<ul> <ul class="nav-main">
<li><a href="/"><img src="static/imgs/logo.png" height="26px"/></a> <li>
<a href="/"><img src="static/imgs/logo.png" height="26px"/></a>
</li> </li>
<li *ngFor="let v of navs" [ngClass]="{'dropdown': v.children}"> <li *ngFor="let v of navs" [ngClass]="{'dropdown': v.children}" >
<a>{{v.name|trans}}</a> <a>{{v.name|trans}}</a>
<ul [ngClass]="{'dropdown-content': v.children}"> <ul [ngClass]="{'dropdown-content': v.children}">
<li *ngFor="let vv of v.children" [ngClass]="{'disabled': vv.disable}"> <li *ngFor="let vv of v.children" [ngClass]="{'disabled': vv.disable}">
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
* @author liuzheng <liuzheng712@gmail.com> * @author liuzheng <liuzheng712@gmail.com>
*/ */
import {Component, Inject, OnInit} from '@angular/core'; import {Component, Inject, OnInit} from '@angular/core';
import {HttpService, LocalStorageService, NavService, LogService} from '../../app.service'; import {HttpService, LocalStorageService, NavService, LogService} from '@app/app.service';
import {DataStore, i18n} from '../../globals'; import {DataStore, i18n} from '@app/globals';
import * as jQuery from 'jquery/dist/jquery.min.js'; import * as jQuery from 'jquery/dist/jquery.min.js';
import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material'; import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material';
declare let layer: any; declare let layer: any;
...@@ -19,7 +19,7 @@ declare let layer: any; ...@@ -19,7 +19,7 @@ declare let layer: any;
}) })
export class ElementNavComponent implements OnInit { export class ElementNavComponent implements OnInit {
DataStore = DataStore; DataStore = DataStore;
navs: Array<object>; navs: Array<any>;
_asyncTree = false; _asyncTree = false;
static Hide() { static Hide() {
...@@ -215,26 +215,6 @@ export class ElementNavComponent implements OnInit { ...@@ -215,26 +215,6 @@ export class ElementNavComponent implements OnInit {
getNav() { getNav() {
return [{ return [{
'id': 'File',
'name': 'Server',
'children': [
{
'id': 'Disconnect',
'click': 'Disconnect',
'name': 'Disconnect'
},
{
'id': 'DisconnectAll',
'click': 'DisconnectAll',
'name': 'Disconnect all'
},
{
'id': 'Reconnect',
'click': 'Reconnect',
'name': 'Reconnect'
},
]
}, {
'id': 'FileManager', 'id': 'FileManager',
'name': 'File Manager', 'name': 'File Manager',
'children': [ 'children': [
......
<div class="footer fixed">
<div class="pull-right">
Version <strong>{{version}}</strong> GPLv2.
<img style="display: none" src="http://www.jumpserver.org/img/evaluate_avatar1.jpg">
</div>
<div>
<strong>Copyright</strong> 北京堆栈科技有限公司 &copy; 2014-2018
</div>
</div>
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ElementOfooterComponent } from './ofooter.component';
describe('ElementOfooterComponent', () => {
let component: ElementOfooterComponent;
let fixture: ComponentFixture<ElementOfooterComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ElementOfooterComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ElementOfooterComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnInit} from '@angular/core';
import {version} from '../../../environments/environment';
import {DataStore} from '../../globals';
@Component({
selector: 'elements-ofooter',
templateUrl: './ofooter.component.html',
styleUrls: ['./ofooter.component.scss']
})
export class ElementOfooterComponent implements OnInit {
version = version;
constructor() {
DataStore.NavShow = false;
}
ngOnInit() {
}
}
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
*/ */
import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from '@angular/core'; import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from '@angular/core';
import {ActivatedRoute, Params} from '@angular/router'; import {ActivatedRoute, Params} from '@angular/router';
import {DataStore} from '../../globals'; import {DataStore} from '@app/globals';
declare let Mstsc: any; declare let Mstsc: any;
......
import {Component, OnInit, Input, ElementRef, ViewChild} from '@angular/core'; import {Component, OnInit, Input, ElementRef, ViewChild} from '@angular/core';
import {DataStore} from '../../globals'; import {DataStore} from '@app/globals';
import {DomSanitizer} from '@angular/platform-browser'; import {DomSanitizer} from '@angular/platform-browser';
@Component({ @Component({
......
import {Component, Input, OnInit, OnDestroy } from '@angular/core'; import {Component, Input, OnInit, OnDestroy } from '@angular/core';
import {Terminal} from 'xterm'; import {Terminal} from 'xterm';
import {View} from '../content/model'; import {View} from '@app/model';
import {LogService, UUIDService} from '../../app.service'; import {LogService, UUIDService} from '@app/app.service';
import {Socket} from '../../utils/socket'; import {Socket} from '@app/utils/socket';
import {getWsSocket, translate} from '../../globals'; import {getWsSocket, translate} from '@app/globals';
@Component({ @Component({
......
import {Component, Input, OnInit, ViewChild} from '@angular/core'; import {Component, Input, OnInit, ViewChild} from '@angular/core';
import {DatatableComponent} from '@swimlane/ngx-datatable'; import {DatatableComponent} from '@swimlane/ngx-datatable';
import {MatPaginator} from '@angular/material'; import {MatPaginator} from '@angular/material';
import {LogService} from '../../app.service'; import {LogService} from '@app/app.service';
export let Config: { export let Config: {
search: boolean, search: boolean,
......
...@@ -2,6 +2,7 @@ import {AfterViewInit, Component, Input, Output, OnInit, ViewChild, EventEmitter ...@@ -2,6 +2,7 @@ import {AfterViewInit, Component, Input, Output, OnInit, ViewChild, EventEmitter
import {ElementRef} from '@angular/core'; import {ElementRef} from '@angular/core';
import {Terminal} from 'xterm'; import {Terminal} from 'xterm';
import {fit} from 'xterm/lib/addons/fit/fit'; import {fit} from 'xterm/lib/addons/fit/fit';
import {LogService} from '@app/app.service';
import {Observable} from 'rxjs/Rx'; import {Observable} from 'rxjs/Rx';
import * as $ from 'jquery/dist/jquery.min.js'; import * as $ from 'jquery/dist/jquery.min.js';
import 'rxjs/Observable'; import 'rxjs/Observable';
...@@ -21,6 +22,10 @@ export class ElementTermComponent implements OnInit, AfterViewInit { ...@@ -21,6 +22,10 @@ export class ElementTermComponent implements OnInit, AfterViewInit {
@Output() winSizeChangeTrigger = new EventEmitter<Array<number>>(); @Output() winSizeChangeTrigger = new EventEmitter<Array<number>>();
winSizeChange$: Observable<any>; winSizeChange$: Observable<any>;
constructor(private _logger: LogService){
}
ngOnInit() { ngOnInit() {
this.winSizeChange$ = Observable.fromEvent(window, 'resize') this.winSizeChange$ = Observable.fromEvent(window, 'resize')
.debounceTime(500) .debounceTime(500)
...@@ -61,7 +66,7 @@ export class ElementTermComponent implements OnInit, AfterViewInit { ...@@ -61,7 +66,7 @@ export class ElementTermComponent implements OnInit, AfterViewInit {
const dimensions = (<any>this.term).renderer.dimensions; const dimensions = (<any>this.term).renderer.dimensions;
const geometry = [ const geometry = [
Math.floor(availableWidth / dimensions.actualCellWidth) - 1, Math.floor(availableWidth / dimensions.actualCellWidth) - 1,
Math.floor(availableHeight / dimensions.actualCellHeight) - 2 Math.floor(availableHeight / dimensions.actualCellHeight) - 1
]; ];
if (!isFinite(geometry[0])) { if (!isFinite(geometry[0])) {
......
...@@ -2,15 +2,31 @@ import {Component, OnInit, Pipe, PipeTransform} from '@angular/core'; ...@@ -2,15 +2,31 @@ import {Component, OnInit, Pipe, PipeTransform} from '@angular/core';
import {FormControl} from '@angular/forms'; import {FormControl} from '@angular/forms';
import {debounceTime, distinctUntilChanged} from 'rxjs/operators'; import {debounceTime, distinctUntilChanged} from 'rxjs/operators';
import {LogService, TreeFilterService} from '../../app.service'; import {LogService, TreeFilterService} from '@app/app.service';
@Pipe({name: 'SearchFilter'})
export class SearchFilter implements PipeTransform {
transform(value: any, input: string) {
if (input) {
input = input.toLowerCase();
return value.filter(function (el: any) {
// ToDo: search with a simple SQL like language, and a bug search a group's hosts
return JSON.stringify(el).toLowerCase().indexOf(input) > -1;
});
}
return value;
}
}
@Component({ @Component({
selector: 'elements-tree-filter', selector: 'elements-tree-filter',
templateUrl: './tree-filter.component.html', templateUrl: './tree-filter.component.html',
styleUrls: ['./tree-filter.component.css'], styleUrls: ['./tree-filter.component.css'],
providers: [SearchFilter],
}) })
export class ElementTreeFilterComponent implements OnInit { export class ElementTreeFilterComponent implements OnInit {
private searchControl: FormControl; searchControl: FormControl;
private debounce = 400; private debounce = 400;
constructor(private _treeFilterService: TreeFilterService, constructor(private _treeFilterService: TreeFilterService,
...@@ -29,16 +45,3 @@ export class ElementTreeFilterComponent implements OnInit { ...@@ -29,16 +45,3 @@ export class ElementTreeFilterComponent implements OnInit {
} }
@Pipe({name: 'SearchFilter'})
export class SearchFilter implements PipeTransform {
transform(value: any, input: string) {
if (input) {
input = input.toLowerCase();
return value.filter(function (el: any) {
// ToDo: search with a simple SQL like language, and a bug search a group's hosts
return JSON.stringify(el).toLowerCase().indexOf(input) > -1;
});
}
return value;
}
}
import {Component, Input, OnInit} from '@angular/core'; import {Component, Input, OnInit} from '@angular/core';
import {HttpService} from '../../app.service'; import {HttpService} from '@app/app.service';
export interface Assets { export interface Assets {
name: string; name: string;
......
...@@ -26,8 +26,8 @@ export const DataStore: _DataStore = { ...@@ -26,8 +26,8 @@ export const DataStore: _DataStore = {
msg: {}, msg: {},
logLevel: 4, logLevel: 4,
showLeftBar: true, showLeftBar: true,
windowsize: [], windowSize: [],
autologin: false, autoLogin: false,
guacamoleToken: '', guacamoleToken: '',
guacamoleTokenTime: 0 guacamoleTokenTime: 0
}; };
......
...@@ -91,6 +91,33 @@ export class NavEvt { ...@@ -91,6 +91,33 @@ export class NavEvt {
} }
export class View {
id: string;
nick: string;
type: string;
editable: boolean;
active: boolean;
connected: boolean;
hide: boolean;
closed: boolean;
host: any;
user: any;
remoteApp: string;
room: string;
Rdp: any;
Term: any;
}
export class ViewAction {
view: View;
name: string;
constructor(view: View, name: string) {
this.view = view;
this.name = name;
}
}
export class DataStore { export class DataStore {
socket: any; socket: any;
Nav: Array<object>; Nav: Array<object>;
...@@ -100,8 +127,8 @@ export class DataStore { ...@@ -100,8 +127,8 @@ export class DataStore {
msg: {}; msg: {};
logLevel: number; logLevel: number;
showLeftBar = true; showLeftBar = true;
windowsize: Array<number>; windowSize: Array<number>;
autologin: boolean; autoLogin: boolean;
guacamoleToken: string; guacamoleToken: string;
guacamoleTokenTime: number; guacamoleTokenTime: number;
...@@ -139,7 +166,7 @@ export class Video { ...@@ -139,7 +166,7 @@ export class Video {
height: number; height: number;
width: number; width: number;
json: object; json: object;
timelist: Array<number>; timeList: Array<number>;
totalTime: number; totalTime: number;
} }
...@@ -149,3 +176,4 @@ export class Monitor { ...@@ -149,3 +176,4 @@ export class Monitor {
type: string; type: string;
} }
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {DataStore} from '../../globals'; import {DataStore} from '@app/globals';
@Component({ @Component({
selector: 'pages-blank', selector: 'pages-blank',
......
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {AppService, HttpService, LocalStorageService} from '../../app.service'; import {AppService, HttpService, LocalStorageService} from '@app/app.service';
import {DataStore} from '../../globals'; import {DataStore} from '@app/globals';
import * as jQuery from 'jquery/dist/jquery.min.js'; import * as jQuery from 'jquery/dist/jquery.min.js';
@Component({ @Component({
......
...@@ -6,10 +6,10 @@ ...@@ -6,10 +6,10 @@
* @author liuzheng <liuzheng712@gmail.com> * @author liuzheng <liuzheng712@gmail.com>
*/ */
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {AppService, HttpService, LogService} from '../../app.service'; import {AppService, HttpService, LogService} from '@app/app.service';
import {NgForm} from '@angular/forms'; import {NgForm} from '@angular/forms';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
import {DataStore, User} from '../../globals'; import {DataStore, User} from '@app/globals';
import * as jQuery from 'jquery/dist/jquery.min.js'; import * as jQuery from 'jquery/dist/jquery.min.js';
@Component({ @Component({
......
div { .content {
height: 100%; height: 100%;
width: 100%; width: 100%;
padding: 0; padding: 0;
background-color: #1f1b1b; background-color: #1f1b1b;
/*background-color: red;*/
margin: 0; margin: 0;
position: initial; position: initial;
} }
/*.content {*/
/*overflow: hidden !important;*/
/*}*/
elements-nav { elements-nav {
height: 30px; height: 30px;
} }
#container { #container {
padding-top: 0; padding: 0;
margin: 0;
height: calc(100% - 30px); height: calc(100% - 30px);
} }
/*.container-fluid {*/ /*.container-fluid {*/
/*padding-top: 30px;*/ /*padding-top: 30px;*/
/*}*/ /*}*/
<elements-nav></elements-nav> <elements-nav></elements-nav>
<div id="container" class="container-fluid row" fxLayout="row" ngxSplit="row"> <div fxLayout="row" id="container" class="container-fluid row" ngxSplit="row">
<div fxFlex="1 1 20%" minBasis="100px" maxBasis="800px" fxFlexFill ngxSplitArea *ngIf="DataStore.showLeftBar"> <div fxFlex="1 1 20%" minBasis="100px" maxBasis="800px" fxFlexFill ngxSplitArea *ngIf="DataStore.showLeftBar">
<elements-left-bar></elements-left-bar> <elements-left-bar></elements-left-bar>
</div> </div>
......
import {Component, HostListener, OnInit} from '@angular/core'; import {Component, HostListener, OnInit} from '@angular/core';
import {DataStore, User} from '../../globals'; import {DataStore, User} from '@app/globals';
import {environment} from '../../../environments/environment'; import {environment} from '@src/environments/environment';
@Component({ @Component({
selector: 'pages-main', selector: 'pages-main',
......
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {Monitor} from '../../../globals'; import {Monitor} from '@app/globals';
@Component({ @Component({
selector: 'pages-monitor-linux', selector: 'pages-monitor-linux',
......
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {ActivatedRoute, Params} from '@angular/router'; import {ActivatedRoute, Params} from '@angular/router';
import {DataStore, Monitor} from '../../globals'; import {DataStore, Monitor} from '@app/globals';
@Component({ @Component({
selector: 'pages-monitor', selector: 'pages-monitor',
......
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {DataStore} from '../../globals'; import {DataStore} from '@app/globals';
@Component({ @Component({
selector: 'pages-not-found', selector: 'pages-not-found',
......
import {Component, Input, OnInit} from '@angular/core'; import {Component, Input, OnInit} from '@angular/core';
import {Terminal} from 'xterm'; import {Terminal} from 'xterm';
import {HttpService, LogService} from '../../../app.service'; import {HttpService, LogService} from '@app/app.service';
import {Replay} from '../replay.model'; import {Replay} from '../replay.model';
function zeroPad(num, minLength) { function zeroPad(num, minLength) {
......
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {ActivatedRoute, Params} from '@angular/router'; import {ActivatedRoute, Params} from '@angular/router';
import {HttpService, LogService} from '../../app.service'; import {HttpService, LogService} from '@app/app.service';
import {DataStore} from '../../globals'; import {DataStore} from '@app/globals';
import {Replay} from './replay.model'; import {Replay} from './replay.model';
@Component({ @Component({
......
import {TransPipe} from './trans.pipe'; import {TransPipe} from './trans.pipe';
import {UtcDatePipe} from './date.pipe'; import {UtcDatePipe} from './date.pipe';
import {TruncatecharsPipe} from './truncatechars.pipe'; import {TruncatecharsPipe} from './truncatechars.pipe';
import {SearchFilter} from '@app/elements/tree-filter/tree-filter.component';
export const Pipes = [ export const Pipes = [
UtcDatePipe, UtcDatePipe,
TransPipe, TransPipe,
TruncatecharsPipe TruncatecharsPipe,
SearchFilter
]; ];
{
"hello": "world"
}
...@@ -3,6 +3,7 @@ $fa-font-path: '~font-awesome/fonts'; ...@@ -3,6 +3,7 @@ $fa-font-path: '~font-awesome/fonts';
@import '~font-awesome/scss/font-awesome'; @import '~font-awesome/scss/font-awesome';
// bootstrap // bootstrap
// Todo: 去掉依赖
@import '~bootstrap/scss/bootstrap'; @import '~bootstrap/scss/bootstrap';
$FontPathOpenSans: '~npm-font-open-sans/fonts'; $FontPathOpenSans: '~npm-font-open-sans/fonts';
...@@ -17,6 +18,7 @@ $roboto-font-path: '~roboto-fontface/fonts'; ...@@ -17,6 +18,7 @@ $roboto-font-path: '~roboto-fontface/fonts';
* *
*/ */
$asset-path: '../static/imgs/inspinia'; $asset-path: '../static/imgs/inspinia';
// Todo: 去掉依赖
@import '../assets/inspinia/style'; @import '../assets/inspinia/style';
@import '~@swimlane/ngx-datatable/release/index.css'; @import '~@swimlane/ngx-datatable/release/index.css';
......
...@@ -10,6 +10,7 @@ body { ...@@ -10,6 +10,7 @@ body {
width: 100%; width: 100%;
background-color: rgb(243, 243, 244); background-color: rgb(243, 243, 244);
overflow-y: hidden; overflow-y: hidden;
margin: 0;
} }
app-root { app-root {
......
...@@ -6,6 +6,6 @@ npm run-script build ...@@ -6,6 +6,6 @@ npm run-script build
rm -fr luna* rm -fr luna*
mv dist luna mv dist luna
cp -R i18n luna/ cp -R src/assets/i18n luna/
tar czf luna.tar.gz luna tar czf luna.tar.gz luna
md5 luna.tar.gz md5 luna.tar.gz
{ {
"compileOnSave": false, "compileOnSave": false,
"compilerOptions": { "compilerOptions": {
"baseUrl": "src",
"paths": {
"@src/*": ["*"],
"@app/*": ["app/*"]
},
"allowJs": true, "allowJs": true,
"outDir": "./dist/out-tsc", "outDir": "./dist/out-tsc",
"sourceMap": true, "sourceMap": true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment