graphdb-workbench 10.0.0-M2-1 → 10.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/dist/0.f8448f998a59db17e94e.bundle.js +25 -0
- package/dist/1.46d9ecd4119bac145f3b.bundle.js +81 -0
- package/dist/10.a26ae97905866618b14e.bundle.js +7 -0
- package/dist/100.aef098a33fbb925e0d2d.bundle.js +1 -0
- package/dist/101.42eacc63e0fb5834b78a.bundle.js +1 -0
- package/dist/102.4f78eeab62aac245879e.bundle.js +1 -0
- package/dist/103.f38f3cd69ff610955aaf.bundle.js +1 -0
- package/dist/104.2e21f1462021dca17db1.bundle.js +1 -0
- package/dist/105.76381cb7984bcbc9ba9a.bundle.js +1 -0
- package/dist/106.23e14c6b280756d04533.bundle.js +1 -0
- package/dist/107.75e40619cb45972dc39f.bundle.js +1 -0
- package/dist/108.f09444e990531d27e0be.bundle.js +1 -0
- package/dist/109.ef97393181ee534042d8.bundle.js +1 -0
- package/dist/11.0fc995ac096734b915c6.bundle.js +1 -0
- package/dist/110.d59b8565d2255a282669.bundle.js +1 -0
- package/dist/111.fff9f089f65f01013923.bundle.js +1 -0
- package/dist/112.5bd3fcd7c37f1024fe26.bundle.js +1 -0
- package/dist/113.2fa29eca15d32deb3320.bundle.js +1 -0
- package/dist/114.d78615087abe68db7b2f.bundle.js +1 -0
- package/dist/115.558ce3da00d3be87d18a.bundle.js +1 -0
- package/dist/116.577aab1d9bafd0053623.bundle.js +1 -0
- package/dist/117.c20f037799328c931eba.bundle.js +1 -0
- package/dist/118.39c8b47405ab93c40847.bundle.js +1 -0
- package/dist/119.19ee7b3ae143f817c5b1.bundle.js +1 -0
- package/dist/12.7877dd6008df9acf44e1.bundle.js +1 -0
- package/dist/120.b944d5e63424d4307fc8.bundle.js +1 -0
- package/dist/121.3a8954e4c885c56a9817.bundle.js +1 -0
- package/dist/122.71a8cf0330504672fffc.bundle.js +1 -0
- package/dist/123.c6957ecb441d8a09932a.bundle.js +1 -0
- package/dist/124.27e85a0284e2ebeb7d6e.bundle.js +1 -0
- package/dist/125.9e925ae0dd1217d81d89.bundle.js +1 -0
- package/dist/126.a32b57d6108545746ed3.bundle.js +1 -0
- package/dist/127.90d1975083eef3d4a715.bundle.js +1 -0
- package/dist/128.544f1a82e19dd245c7de.bundle.js +1 -0
- package/dist/129.64ec11449e0c734500c2.bundle.js +1 -0
- package/dist/13.fe78f15334507bcc08ae.bundle.js +1 -0
- package/dist/130.f8e68ac86e17b3622d40.bundle.js +1 -0
- package/dist/131.4868fc3a837277c30273.bundle.js +1 -0
- package/dist/132.7815ab1168a254cb0d47.bundle.js +1 -0
- package/dist/133.f87e1685dd5ed920f9b5.bundle.js +1 -0
- package/dist/134.8998ff724a077ecff2ce.bundle.js +1 -0
- package/dist/135.c07268699f76ef7a02ff.bundle.js +1 -0
- package/dist/136.908f1f6fe3054f99b560.bundle.js +1 -0
- package/dist/137.8262ca9736e9818284cd.bundle.js +1 -0
- package/dist/138.8c149cad49010a65b3ca.bundle.js +1 -0
- package/dist/139.97ee12e7a3c05be03456.bundle.js +1 -0
- package/dist/14.0bb211bcdc29c6d8b3b5.bundle.js +29 -0
- package/dist/140.6b3c57ffec700081328b.bundle.js +1 -0
- package/dist/141.4981056237955a34b2e2.bundle.js +1 -0
- package/dist/142.4d60c1795eed3a9570f9.bundle.js +1 -0
- package/dist/143.b7057852f7859cf39e75.bundle.js +1 -0
- package/dist/144.3f85f8eacae521d52355.bundle.js +1 -0
- package/dist/145.9281069e9e77978b640a.bundle.js +1 -0
- package/dist/146.51d2987de4defe7df7c7.bundle.js +1 -0
- package/dist/147.54016549674d35bc2869.bundle.js +1 -0
- package/dist/148.ad95b30f508a0bd02970.bundle.js +1 -0
- package/dist/149.8dd1281617389f8c189b.bundle.js +1 -0
- package/dist/15.6a74adbd30b4d2930e10.bundle.js +1 -0
- package/dist/150.5e0ee4350f8edd0e7b9a.bundle.js +1 -0
- package/dist/151.6b81c99a1ec1b184b82d.bundle.js +1 -0
- package/dist/152.2e1aa910a68f0086825b.bundle.js +1 -0
- package/dist/153.7a64973115bdaec26406.bundle.js +1 -0
- package/dist/154.5938248b52830d0a80a2.bundle.js +1 -0
- package/dist/155.a4511849c1001c5f2ba6.bundle.js +1 -0
- package/dist/156.bbcaf52acb0cecbc6257.bundle.js +1 -0
- package/dist/157.51181d03518519f84b5e.bundle.js +1 -0
- package/dist/158.640e412f6002ee1d7341.bundle.js +1 -0
- package/dist/159.10457cbb053c1315d93a.bundle.js +1 -0
- package/dist/16.2f60fbeaccd97aefaae2.bundle.js +1 -0
- package/dist/160.c46bfdf09357a4c62a53.bundle.js +1 -0
- package/dist/{103.05b86c1b360c05133b49.bundle.js → 161.0f35ee11981f0ea0455f.bundle.js} +1 -2
- package/dist/{104.089568ff7c49a29de892.bundle.js → 162.fef28120701e7d200b01.bundle.js} +1 -2
- package/dist/{105.81b74220f7fa646e719b.bundle.js → 163.38565d40ac5f71d1c875.bundle.js} +1 -2
- package/dist/164.b2116f472aa847618aee.bundle.js +1 -0
- package/dist/168.2d4b5a75da5430c73efc.bundle.js +1 -0
- package/dist/169.6897f56896e3664e8b53.bundle.js +1 -0
- package/dist/17.2bff7856b13fd72e2db4.bundle.js +1 -0
- package/dist/170.d5c0d475c5b6ad84ef77.bundle.js +1 -0
- package/dist/171.60cdc91b2bf682a20911.bundle.js +1 -0
- package/dist/172.1fb9ead3e508a7cfa5f3.bundle.js +1 -0
- package/dist/173.95602c81a2692624a015.bundle.js +1 -0
- package/dist/174.aac1982e67b5ca1731c1.bundle.js +1 -0
- package/dist/175.5e49a28397900168f816.bundle.js +1 -0
- package/dist/176.2e6d1a9f4eac4fdd8422.bundle.js +1 -0
- package/dist/177.3b6aabf3c4db8519ea74.bundle.js +1 -0
- package/dist/178.e10370553beb5c6bb839.bundle.js +1 -0
- package/dist/179.784cbd536b8e636c1272.bundle.js +1 -0
- package/dist/18.d6be3e6583bf3dacd54f.bundle.js +2 -0
- package/dist/180.d37db50f3ce1b3a04a65.bundle.js +1 -0
- package/dist/181.f307cabdc4ed7a10ff64.bundle.js +1 -0
- package/dist/182.e8fe148e90fcd334b9b9.bundle.js +1 -0
- package/dist/183.a086e00d4dc3c7855611.bundle.js +1 -0
- package/dist/184.ff8a39692d0ff666c9e6.bundle.js +1 -0
- package/dist/185.8b9f0b866e848f8a1aac.bundle.js +1 -0
- package/dist/186.798880846274da7033da.bundle.js +1 -0
- package/dist/{120.3b0b67fbfa81ec95e044.bundle.js → 187.eb92a35d38294bc21703.bundle.js} +1 -2
- package/dist/{121.ff452d05188836228deb.bundle.js → 188.641582484af80415d29a.bundle.js} +1 -2
- package/dist/189.7ccbb0ef67513ae7001a.bundle.js +1 -0
- package/dist/19.c2a5c3e7a49a4acba486.bundle.js +2 -0
- package/dist/{123.289bb9a87ce416004c0a.bundle.js → 190.a3609218c5d8e873a46f.bundle.js} +1 -2
- package/dist/191.4c817606bf66c16d9ad1.bundle.js +1 -0
- package/dist/{125.51ff26fe7687752811e4.bundle.js → 192.21f366a1ea7e6905f120.bundle.js} +1 -2
- package/dist/193.4d40b788bd7ddcf16788.bundle.js +1 -0
- package/dist/{127.4d0a2164fb95df43ea22.bundle.js → 194.0170093f1daf20e82b5f.bundle.js} +1 -2
- package/dist/{128.c7a3530622ede2f34e72.bundle.js → 195.d7d8af61458f9416878f.bundle.js} +1 -2
- package/dist/{129.2d32313059ae96dba010.bundle.js → 196.6e6b7589cd1342a0b2b5.bundle.js} +1 -2
- package/dist/{130.7302112cf14a10bd1306.bundle.js → 197.c071fa1fe9e081a3b053.bundle.js} +1 -2
- package/dist/{131.eb262b5100305bdc23ee.bundle.js → 198.3c5ca9ac5a745b4b23a1.bundle.js} +1 -2
- package/dist/199.00ac5221a334189ea09a.bundle.js +1 -0
- package/dist/2.78b4e53269171c9c08a5.bundle.js +1 -0
- package/dist/20.8fd969e3860ddffedcc3.bundle.js +1 -0
- package/dist/{133.f855496341ba657eb673.bundle.js → 200.aa3f4dcf9cf98409dbf5.bundle.js} +1 -2
- package/dist/201.a1b147e78f43a3bc99c3.bundle.js +1 -0
- package/dist/202.20e71b18f57e7d234ff0.bundle.js +1 -0
- package/dist/{136.74f131c98a163b48e3df.bundle.js → 203.0219c2ba2d4fe4881af2.bundle.js} +1 -2
- package/dist/204.cc169603e18b84e7e65b.bundle.js +1 -0
- package/dist/{138.9111fe731587313e4574.bundle.js → 205.99fb3c89cd9b9183ddbf.bundle.js} +1 -2
- package/dist/206.43b04d2170165e13353c.bundle.js +1 -0
- package/dist/207.798c195e1d7d3f301131.bundle.js +1 -0
- package/dist/208.34f042066a757f4fd8c0.bundle.js +1 -0
- package/dist/{142.5ced0a8e7a08aea7988f.bundle.js → 209.288844c6a42ff4d5685a.bundle.js} +1 -2
- package/dist/21.c981976c6528073c0a2f.bundle.js +1 -0
- package/dist/210.1ac38e393ca959703d4b.bundle.js +1 -0
- package/dist/211.d2721b9785e609e2f817.bundle.js +1 -0
- package/dist/212.b6b19c939f21132b451c.bundle.js +1 -0
- package/dist/213.5a5116f764e6357e53ab.bundle.js +1 -0
- package/dist/{147.f6bd445276a200981cff.bundle.js → 214.a2640be51c42d820bb83.bundle.js} +1 -2
- package/dist/215.209396a71f130477e2b3.bundle.js +1 -0
- package/dist/216.16e2e982acc750b4045a.bundle.js +1 -0
- package/dist/217.8540eb1d1a0946e72dbf.bundle.js +1 -0
- package/dist/218.ef33580c82d20f39f75f.bundle.js +1 -0
- package/dist/219.1652bc940cdd0088dc18.bundle.js +1 -0
- package/dist/22.9d339503774f4f6c0a8b.bundle.js +1 -0
- package/dist/{153.ebc378a7a60222b69484.bundle.js → 220.f8f9c348b1fc0cc72bd6.bundle.js} +1 -2
- package/dist/221.b18a92f0ba880edaebbf.bundle.js +1 -0
- package/dist/222.a52ebecd1d5201437ebe.bundle.js +1 -0
- package/dist/23.87ca8226d464e3699b8e.bundle.js +3 -0
- package/dist/24.9076b75f45ce0579f7be.bundle.js +1 -0
- package/dist/25.073791b8dd02c5b31183.bundle.js +1 -0
- package/dist/26.6e06be7172a866ad45f9.bundle.js +2 -0
- package/dist/27.5152c2a1f3b1369e21b0.bundle.js +1 -0
- package/dist/28.90b784e728e3d5e4c6aa.bundle.js +1 -0
- package/dist/29.e2309b858706718f1732.bundle.js +1 -0
- package/dist/3.cf89087c137e759ecd19.bundle.js +27 -0
- package/dist/30.32fb84930c42bae43a74.bundle.js +1 -0
- package/dist/31.31b7b4bd073b82c09fda.bundle.js +1 -0
- package/dist/32.6725d94946764db833b8.bundle.js +1 -0
- package/dist/33.fa9f0e662060f2e97267.bundle.js +1 -0
- package/dist/34.af22bc6d5ed2bcb72a09.bundle.js +1 -0
- package/dist/35.e601e19e63c6ddaf2484.bundle.js +1 -0
- package/dist/36.df47a70d8efbf1cd033b.bundle.js +1 -0
- package/dist/37.085cdb373f74d55eee07.bundle.js +2 -0
- package/dist/38.fc172c7b0d24ab0f8a35.bundle.js +1 -0
- package/dist/39.5ca9fa51ec3c63459317.bundle.js +1 -0
- package/dist/4.851f9ade6202116ecfb9.bundle.js +1 -0
- package/dist/40.309ec5212fd53fe696bb.bundle.js +1 -0
- package/dist/41.3870740f1d24570cb415.bundle.js +1 -0
- package/dist/42.b926c2c8620df5c7ed6d.bundle.js +1 -0
- package/dist/43.d4551e1f6cac0a1a77e5.bundle.js +1 -0
- package/dist/44.46c9e2d54a9f07d78368.bundle.js +1 -0
- package/dist/45.a916daee1f0c6873c890.bundle.js +1 -0
- package/dist/46.4f57238bd032edc81d6d.bundle.js +1 -0
- package/dist/47.4fbfdaa63628c501a30c.bundle.js +1 -0
- package/dist/48.3fbd50adcb0c7dd7ec60.bundle.js +1 -0
- package/dist/49.0707795b3b6e40387da8.bundle.js +1 -0
- package/dist/5.7cfbc07050f137932ffe.bundle.js +1 -0
- package/dist/50.8f6cc698b42c96f2b41f.bundle.js +1 -0
- package/dist/51.514a339efd6cd11db0f8.bundle.js +1 -0
- package/dist/52.410a7d8b4cb433fb24ca.bundle.js +1 -0
- package/dist/53.174d18435f7bf3bf05a0.bundle.js +1 -0
- package/dist/54.7cb3bd3ae8055e350629.bundle.js +1 -0
- package/dist/55.f0762e755ba58cbaac26.bundle.js +1 -0
- package/dist/56.3b0312e77f8607a4d957.bundle.js +1 -0
- package/dist/57.dfb7a710da8ca09c725b.bundle.js +1 -0
- package/dist/58.ac0fa95bbbe4b2dfb0fc.bundle.js +1 -0
- package/dist/59.273ffcd48e856d2752ff.bundle.js +1 -0
- package/dist/6.c5eea752e1f541f494e8.bundle.js +1 -0
- package/dist/60.00a29320ea162becd718.bundle.js +1 -0
- package/dist/61.3794de8b6d022738bafa.bundle.js +1 -0
- package/dist/62.cf39ad55adb1616560ec.bundle.js +1 -0
- package/dist/63.8880f667c958d12b338b.bundle.js +1 -0
- package/dist/64.fdd90fedc8a5dc3cacaf.bundle.js +1 -0
- package/dist/65.cdc961a8042c385c49c6.bundle.js +1 -0
- package/dist/66.c3b906de2fcf69089b7b.bundle.js +1 -0
- package/dist/67.9c851e5930459a5f5903.bundle.js +1 -0
- package/dist/68.05bba948c414a1e21c8f.bundle.js +1 -0
- package/dist/69.c5561c83fe410ea9a908.bundle.js +1 -0
- package/dist/7.14f008aaac190939acd3.bundle.js +7 -0
- package/dist/70.f2557c225be5923bab24.bundle.js +1 -0
- package/dist/71.e9c3c5ccc70f443c97cf.bundle.js +1 -0
- package/dist/72.0780a8424293909f94a4.bundle.js +1 -0
- package/dist/73.57e88cee0af3f67aee77.bundle.js +1 -0
- package/dist/74.48e90caf0b5ecd351f1d.bundle.js +1 -0
- package/dist/75.c75a824264d0e67421ed.bundle.js +1 -0
- package/dist/76.2ad0f5373462bc70bebf.bundle.js +1 -0
- package/dist/77.303a075d21928354102c.bundle.js +1 -0
- package/dist/78.66f3e9630550f20287ff.bundle.js +1 -0
- package/dist/79.29d39a29721f936ae688.bundle.js +1 -0
- package/dist/8.b5e29f80f8a5766d70d5.bundle.js +2 -0
- package/dist/80.8af0388db859fcc9fbf3.bundle.js +1 -0
- package/dist/{47.686e599732ae6f41120c.bundle.js → 81.2ff1f5047ab4e0591585.bundle.js} +1 -2
- package/dist/82.27bb51dfeb4898504e96.bundle.js +1 -0
- package/dist/83.a59d34bc50cf323af43d.bundle.js +1 -0
- package/dist/84.a4ee7bb5d3ed2e6ead5e.bundle.js +1 -0
- package/dist/{51.895a3dacdc3a8eaee275.bundle.js → 85.1f1b07562fbf97ab3e11.bundle.js} +1 -2
- package/dist/86.637667a4555ae621aff0.bundle.js +1 -0
- package/dist/87.b76338a62297ad83960b.bundle.js +1 -0
- package/dist/88.532e7295b49b1071d45c.bundle.js +1 -0
- package/dist/89.90bb1cf65f183ecce47c.bundle.js +1 -0
- package/dist/9.610b595b60a0fc51466a.bundle.js +1 -0
- package/dist/90.683c4d5b142356f274ef.bundle.js +1 -0
- package/dist/{56.91947e80d8e04223ac58.bundle.js → 91.2437dfc2ea1bc89f53f3.bundle.js} +1 -2
- package/dist/92.a12cfd3b602e98b344de.bundle.js +1 -0
- package/dist/93.a5cb6192d32cb016bb60.bundle.js +1 -0
- package/dist/94.f6a3e7628449796419b6.bundle.js +1 -0
- package/dist/95.15f0e472c49c81a68c3a.bundle.js +1 -0
- package/dist/96.2bf3b75fb0efb6b9e7e8.bundle.js +1 -0
- package/dist/97.bd1988af419f7373b569.bundle.js +1 -0
- package/dist/98.060c6842b3a8ed94dd20.bundle.js +1 -0
- package/dist/{64.ac922cb38c3ff6c431fb.bundle.js → 99.6360b70da56083cd76fe.bundle.js} +1 -2
- package/dist/bundle.39b836d40f0926aeec16.bundle.js +91 -0
- package/dist/css/aclmanagement.css +114 -0
- package/dist/css/angular-tooltips.css +144 -0
- package/dist/css/autocomplete-select.css +62 -0
- package/dist/css/backup-and-restore.css +7 -0
- package/dist/css/bootstrap-graphdb-theme-dark-auto.css +36 -0
- package/dist/css/bootstrap-graphdb-theme.css +514 -252
- package/dist/css/clustermanagement.css +145 -266
- package/dist/css/common.css +105 -0
- package/dist/css/dependencies.css +4 -4
- package/dist/css/domain-range-graph.css +3 -3
- package/dist/css/explore.css +7 -1
- package/dist/css/export.css +13 -9
- package/dist/css/find.css +2 -3
- package/dist/css/fonts/icons.eot +0 -0
- package/dist/css/fonts/icons.svg +14 -5
- package/dist/css/fonts/icons.ttf +0 -0
- package/dist/css/fonts/icons.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff2 +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff2 +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/css/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/css/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/css/graphs-config.css +4 -4
- package/dist/css/graphs-vizualizations.css +11 -10
- package/dist/css/guides.css +9 -0
- package/dist/css/jmx.css +22 -0
- package/dist/css/lib/angular-xeditable/xeditable.min.css +2 -2
- package/dist/css/new-sparql.css +68 -2
- package/dist/css/operations-statuses-monitor.css +111 -0
- package/dist/css/plugins.css +7 -18
- package/dist/css/rdf-class-hierarchy-labels.css +2 -2
- package/dist/css/rdf-class-hierarchy.css +3 -3
- package/dist/css/rdf-details-side-panel.css +8 -1
- package/dist/css/rdf-resource-search.css +5 -2
- package/dist/css/repositories.css +73 -31
- package/dist/css/repository.create.css +14 -4
- package/dist/css/shepherd-custom.css +80 -0
- package/dist/css/workbench-custom.css +54 -14
- package/dist/css/yasr.custom.css +28 -6
- package/dist/font/{icons.f404525bf0491c43fc1c35fc43fe14d8.eot → icons.23e96f215ba03e98233de883d2c30b60.eot} +0 -0
- package/dist/i18n/locale-en.json +488 -129
- package/dist/i18n/locale-fr.json +602 -261
- package/dist/icon.png +0 -0
- package/dist/img/{graphdb-logo-sq.75ddb875d9a986a6ac944450ae134725.svg → graphdb-logo-sq.3a5fb4b3f1e0e248dc308da1bf4de9f8.svg} +4 -4
- package/dist/img/{graphdb-logo.cb18d544b9cf2eb6062daa81bdb1f850.svg → graphdb-logo.741abf3e3881e1566e4504c9f00b91c0.svg} +3 -4
- package/dist/img/{graphdb-small.635110bdf15de2ad589b6e3fdaa75887.svg → graphdb-small.5f94ee13e65870be1db31bb89e6deded.svg} +6 -6
- package/dist/img/graphdb-splash.1ef2940889acddc03c7defb3f9f41f8d.svg +1 -0
- package/dist/img/{icons.2271b2cdd5a3d1037d80bf831f4918cc.svg → icons.ab6168834b8775f511d09c8fad540b27.svg} +14 -5
- package/dist/index.html +87 -85
- package/dist/js/angular/autocomplete/templates/modal/add-label.html +9 -8
- package/dist/js/angular/chatgpt/templates/chat.html +113 -0
- package/dist/js/angular/chatgpt/templates/chatInfo.html +11 -0
- package/dist/js/angular/chatgpt/templates/modal/settings.html +61 -0
- package/dist/js/angular/clustermanagement/templates/modal/add-nodes-dialog.html +67 -0
- package/dist/js/angular/clustermanagement/templates/modal/cluster-create-dialog.html +173 -0
- package/dist/js/angular/clustermanagement/templates/modal/cluster-delete-dialog.html +9 -14
- package/dist/js/angular/clustermanagement/templates/modal/cluster-edit-dialog.html +118 -0
- package/dist/js/angular/clustermanagement/templates/modal/remove-nodes-dialog.html +39 -0
- package/dist/js/angular/clustermanagement/templates/modal/replace-nodes-dialog.html +86 -0
- package/dist/js/angular/core/directives/autocomplete/templates/autocomplete.html +18 -0
- package/dist/js/angular/core/directives/languageselector/templates/languageSelector.html +9 -7
- package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +57 -0
- package/dist/js/angular/core/directives/queryeditor/templates/query-editor.html +44 -56
- package/dist/js/angular/core/directives/queryeditor/templates/query-sample.html +11 -11
- package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +4 -6
- package/dist/js/angular/core/templates/core-errors.html +27 -18
- package/dist/js/angular/core/templates/inactive-plugin-warning-page.html +1 -2
- package/dist/js/angular/core/templates/modal/copy-to-clipboard-modal.html +9 -10
- package/dist/js/angular/core/templates/modal/modal-warning.html +1 -1
- package/dist/js/angular/core/templates/search-resource-input.html +9 -9
- package/dist/js/angular/externalsync/templates/deleteConnector.html +5 -5
- package/dist/js/angular/graphexplore/templates/modal/save-graph.html +10 -11
- package/dist/js/angular/graphexplore/templates/rdfsCommentLabelTemplate.html +4 -6
- package/dist/js/angular/graphexplore/templates/searchIconInputTemplate.html +5 -7
- package/dist/js/angular/import/templates/filesTable.html +15 -15
- package/dist/js/angular/import/templates/settingsModal.html +231 -231
- package/dist/js/angular/import/templates/textSnippet.html +4 -4
- package/dist/js/angular/import/templates/urlImport.html +7 -5
- package/dist/js/angular/repositories/templates/fedx-repo.html +53 -49
- package/dist/js/angular/repositories/templates/ontop-repo.html +191 -60
- package/dist/js/angular/security/templates/modal/default-authorities.html +12 -12
- package/dist/js/angular/security/templates/user.html +102 -41
- package/dist/js/angular/security/templates/users.html +24 -17
- package/dist/js/angular/settings/modal/location-settings.html +17 -18
- package/dist/js/angular/settings/modal/validate-license.html +19 -6
- package/dist/js/angular/templates/graphdb-small.svg +6 -6
- package/dist/js/angular/templates/modal/add-fedx-remote-repo.html +17 -15
- package/dist/js/angular/templates/modal/add-location.html +18 -22
- package/dist/js/angular/templates/modal/edit-location.html +11 -11
- package/dist/js/angular/templates/modal/editRepoFile.html +2 -2
- package/dist/js/angular/templates/modal/upload-repository-config.html +2 -2
- package/dist/js/angular/templates/repositorySize.html +7 -1
- package/dist/js/lib/angucomplete-alt/angucomplete-alt.css +2 -2
- package/dist/js/lib/rzslider/rzslider.min.css +1 -1
- package/dist/license-checker-static.json +128 -0
- package/dist/license-checker.json +872 -0
- package/dist/main.3ac2b4b19f56209c6467.css +1 -0
- package/dist/main.948c3b96766ce09e145b.bundle.js +1 -0
- package/dist/pages/aclmanagement.html +177 -0
- package/dist/pages/autocomplete.html +16 -12
- package/dist/pages/choose-repository-type.html +8 -8
- package/dist/pages/cluster-management/clusterInfo.html +160 -138
- package/dist/pages/connectorsInfo.html +23 -18
- package/dist/pages/create-index.html +18 -18
- package/dist/pages/createConnector.html +137 -137
- package/dist/pages/dependencies.html +23 -31
- package/dist/pages/domainRangeInfo.html +16 -19
- package/dist/pages/edit.html +15 -15
- package/dist/pages/explore.html +22 -25
- package/dist/pages/export.html +38 -39
- package/dist/pages/find.html +3 -3
- package/dist/pages/graph-config/saveGraphConfig.html +43 -43
- package/dist/pages/graphs-visualizations.html +71 -78
- package/dist/pages/guides.html +60 -0
- package/dist/pages/home.html +46 -28
- package/dist/pages/import.html +11 -10
- package/dist/pages/info.html +18 -18
- package/dist/pages/jdbc-create.html +48 -46
- package/dist/pages/jdbc.html +4 -4
- package/dist/pages/licenseInfo.html +66 -48
- package/dist/pages/login.html +5 -6
- package/dist/pages/monitor/backup-and-restore.html +80 -0
- package/dist/pages/monitor/queries.html +7 -8
- package/dist/pages/monitor/resources.html +213 -79
- package/dist/pages/namespaces.html +22 -21
- package/dist/pages/plugins.html +9 -10
- package/dist/pages/rdfClassHierarchyInfo.html +31 -35
- package/dist/pages/rdfrank.html +25 -27
- package/dist/pages/registerLicenseInfo.html +10 -12
- package/dist/pages/repositories.html +170 -193
- package/dist/pages/repository.html +124 -58
- package/dist/pages/similarity-indexes.html +18 -18
- package/dist/pages/sparql-template-create.html +30 -29
- package/dist/pages/sparql-templates.html +4 -4
- package/dist/pages/sparql.html +11 -11
- package/dist/pages/ux-test1.html +102 -0
- package/dist/pages/ux-test2.html +17 -0
- package/dist/pages/webapi.html +4 -4
- package/dist/plugin-registry.js +14 -0
- package/dist/plugins.js +1967 -84
- package/dist/res/sparql/keyboard-shortcuts.html +7 -1
- package/dist/res/swagger/css/onto-theme.css +8 -0
- package/dist/res/swagger/css/reset.css +1 -2
- package/dist/res/swagger/css/screen.css +6 -15
- package/dist/res/swagger/fonts/icons.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600.woff2 +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-600italic.woff2 +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/res/swagger/fonts/jetbrains-mono-v12-vietnamese_latin-ext_latin_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-300italic.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-500italic.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff2 +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff +0 -0
- package/dist/res/swagger/fonts/roboto-v30-vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-italic.woff +0 -0
- package/dist/res/swagger/fonts/rubik-italic.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-light.woff +0 -0
- package/dist/res/swagger/fonts/rubik-light.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-lightitalic.woff +0 -0
- package/dist/res/swagger/fonts/rubik-lightitalic.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-medium.woff +0 -0
- package/dist/res/swagger/fonts/rubik-medium.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-mediumitalic.woff +0 -0
- package/dist/res/swagger/fonts/rubik-mediumitalic.woff2 +0 -0
- package/dist/res/swagger/fonts/rubik-regular.woff +0 -0
- package/dist/res/swagger/fonts/rubik-regular.woff2 +0 -0
- package/dist/res/swagger/index.html +27 -25
- package/dist/vendor.7b6ede99ef82acd3dcf5.bundle.js +27 -0
- package/dist/{vendor.4ba46e62f4d43dab5e82.css → vendor.d1c629ceaacea40a5f4a.css} +1 -1
- package/package.json +13 -9
- package/dist/0.32d0f91ca9c8d09fb6f1.bundle.js +0 -82
- package/dist/0.32d0f91ca9c8d09fb6f1.bundle.js.map +0 -1
- package/dist/1.6300131e72a9f28f9df3.bundle.js +0 -27
- package/dist/1.6300131e72a9f28f9df3.bundle.js.map +0 -1
- package/dist/10.bb0713b18c3e55445fa7.bundle.js +0 -2
- package/dist/10.bb0713b18c3e55445fa7.bundle.js.map +0 -1
- package/dist/100.acbece8e389effbcfa2e.bundle.js +0 -2
- package/dist/100.acbece8e389effbcfa2e.bundle.js.map +0 -1
- package/dist/101.abc28aeafc8c037b80dc.bundle.js +0 -2
- package/dist/101.abc28aeafc8c037b80dc.bundle.js.map +0 -1
- package/dist/102.236df15ec49946c8799a.bundle.js +0 -2
- package/dist/102.236df15ec49946c8799a.bundle.js.map +0 -1
- package/dist/103.05b86c1b360c05133b49.bundle.js.map +0 -1
- package/dist/104.089568ff7c49a29de892.bundle.js.map +0 -1
- package/dist/105.81b74220f7fa646e719b.bundle.js.map +0 -1
- package/dist/106.5de7943f8a3adda97372.bundle.js +0 -2
- package/dist/106.5de7943f8a3adda97372.bundle.js.map +0 -1
- package/dist/11.288d37db1902f00f7c8e.bundle.js +0 -2
- package/dist/11.288d37db1902f00f7c8e.bundle.js.map +0 -1
- package/dist/110.5a553b21d45a64e7e321.bundle.js +0 -2
- package/dist/110.5a553b21d45a64e7e321.bundle.js.map +0 -1
- package/dist/111.04e34833a2c4fc227899.bundle.js +0 -2
- package/dist/111.04e34833a2c4fc227899.bundle.js.map +0 -1
- package/dist/112.b2bdfd64c50509d05503.bundle.js +0 -2
- package/dist/112.b2bdfd64c50509d05503.bundle.js.map +0 -1
- package/dist/113.b386b036c2a3d9077f64.bundle.js +0 -2
- package/dist/113.b386b036c2a3d9077f64.bundle.js.map +0 -1
- package/dist/114.0768e042a8e6ec856942.bundle.js +0 -2
- package/dist/114.0768e042a8e6ec856942.bundle.js.map +0 -1
- package/dist/115.374b221f284e8755ef31.bundle.js +0 -2
- package/dist/115.374b221f284e8755ef31.bundle.js.map +0 -1
- package/dist/116.ca9d40889c222f47c45f.bundle.js +0 -2
- package/dist/116.ca9d40889c222f47c45f.bundle.js.map +0 -1
- package/dist/117.92f7630bfb95444a87e8.bundle.js +0 -2
- package/dist/117.92f7630bfb95444a87e8.bundle.js.map +0 -1
- package/dist/118.7e28dcfd80b93a705d71.bundle.js +0 -2
- package/dist/118.7e28dcfd80b93a705d71.bundle.js.map +0 -1
- package/dist/119.e3a038ffb960ed3661fe.bundle.js +0 -2
- package/dist/119.e3a038ffb960ed3661fe.bundle.js.map +0 -1
- package/dist/12.9004ab127289745129a4.bundle.js +0 -4
- package/dist/12.9004ab127289745129a4.bundle.js.map +0 -1
- package/dist/120.3b0b67fbfa81ec95e044.bundle.js.map +0 -1
- package/dist/121.ff452d05188836228deb.bundle.js.map +0 -1
- package/dist/122.1b8056c745358fa2f6cb.bundle.js +0 -2
- package/dist/122.1b8056c745358fa2f6cb.bundle.js.map +0 -1
- package/dist/123.289bb9a87ce416004c0a.bundle.js.map +0 -1
- package/dist/124.75965fcb93d0fe988609.bundle.js +0 -2
- package/dist/124.75965fcb93d0fe988609.bundle.js.map +0 -1
- package/dist/125.51ff26fe7687752811e4.bundle.js.map +0 -1
- package/dist/126.b89a0728154793be4eb9.bundle.js +0 -2
- package/dist/126.b89a0728154793be4eb9.bundle.js.map +0 -1
- package/dist/127.4d0a2164fb95df43ea22.bundle.js.map +0 -1
- package/dist/128.c7a3530622ede2f34e72.bundle.js.map +0 -1
- package/dist/129.2d32313059ae96dba010.bundle.js.map +0 -1
- package/dist/13.897f9af290de9fbd43bb.bundle.js +0 -16
- package/dist/13.897f9af290de9fbd43bb.bundle.js.map +0 -1
- package/dist/130.7302112cf14a10bd1306.bundle.js.map +0 -1
- package/dist/131.eb262b5100305bdc23ee.bundle.js.map +0 -1
- package/dist/132.264b9ebf860e308417ad.bundle.js +0 -2
- package/dist/132.264b9ebf860e308417ad.bundle.js.map +0 -1
- package/dist/133.f855496341ba657eb673.bundle.js.map +0 -1
- package/dist/134.91de2ab11c49967200ad.bundle.js +0 -2
- package/dist/134.91de2ab11c49967200ad.bundle.js.map +0 -1
- package/dist/135.82e48e81e60b2ab89e04.bundle.js +0 -2
- package/dist/135.82e48e81e60b2ab89e04.bundle.js.map +0 -1
- package/dist/136.74f131c98a163b48e3df.bundle.js.map +0 -1
- package/dist/137.89253235e0e48f86534b.bundle.js +0 -2
- package/dist/137.89253235e0e48f86534b.bundle.js.map +0 -1
- package/dist/138.9111fe731587313e4574.bundle.js.map +0 -1
- package/dist/139.642cab70149cdfc8c034.bundle.js +0 -2
- package/dist/139.642cab70149cdfc8c034.bundle.js.map +0 -1
- package/dist/14.3c22be70e13b5347940a.bundle.js +0 -3
- package/dist/14.3c22be70e13b5347940a.bundle.js.map +0 -1
- package/dist/140.8fcbd3b16a54b9ca5d80.bundle.js +0 -2
- package/dist/140.8fcbd3b16a54b9ca5d80.bundle.js.map +0 -1
- package/dist/141.09939d5f25d69d9e1bdd.bundle.js +0 -2
- package/dist/141.09939d5f25d69d9e1bdd.bundle.js.map +0 -1
- package/dist/142.5ced0a8e7a08aea7988f.bundle.js.map +0 -1
- package/dist/143.1bd6e2941d5c9fdc9e77.bundle.js +0 -2
- package/dist/143.1bd6e2941d5c9fdc9e77.bundle.js.map +0 -1
- package/dist/144.34dd1b710f93da283e39.bundle.js +0 -2
- package/dist/144.34dd1b710f93da283e39.bundle.js.map +0 -1
- package/dist/145.832e90a54396296da91b.bundle.js +0 -2
- package/dist/145.832e90a54396296da91b.bundle.js.map +0 -1
- package/dist/146.a4ab1f2f5177d9e27861.bundle.js +0 -2
- package/dist/146.a4ab1f2f5177d9e27861.bundle.js.map +0 -1
- package/dist/147.f6bd445276a200981cff.bundle.js.map +0 -1
- package/dist/148.1c23268b87514b7220b3.bundle.js +0 -2
- package/dist/148.1c23268b87514b7220b3.bundle.js.map +0 -1
- package/dist/149.82fc16905f1377c6610a.bundle.js +0 -2
- package/dist/149.82fc16905f1377c6610a.bundle.js.map +0 -1
- package/dist/15.ba4fe6f57951d2f73adc.bundle.js +0 -2
- package/dist/15.ba4fe6f57951d2f73adc.bundle.js.map +0 -1
- package/dist/150.6d8e3bb0cbc5774322d9.bundle.js +0 -2
- package/dist/150.6d8e3bb0cbc5774322d9.bundle.js.map +0 -1
- package/dist/151.c752cbb4d5f9299df813.bundle.js +0 -2
- package/dist/151.c752cbb4d5f9299df813.bundle.js.map +0 -1
- package/dist/152.78d7840c4b8f93748bfe.bundle.js +0 -2
- package/dist/152.78d7840c4b8f93748bfe.bundle.js.map +0 -1
- package/dist/153.ebc378a7a60222b69484.bundle.js.map +0 -1
- package/dist/154.4452ad65074e44967389.bundle.js +0 -2
- package/dist/154.4452ad65074e44967389.bundle.js.map +0 -1
- package/dist/155.12819130f26753e109ad.bundle.js +0 -2
- package/dist/155.12819130f26753e109ad.bundle.js.map +0 -1
- package/dist/16.a236b38d63123b1a3c61.bundle.js +0 -4
- package/dist/16.a236b38d63123b1a3c61.bundle.js.map +0 -1
- package/dist/17.d8d59fa7fbb3b422fdf8.bundle.js +0 -2
- package/dist/17.d8d59fa7fbb3b422fdf8.bundle.js.map +0 -1
- package/dist/18.bc2da9ff57be136ef082.bundle.js +0 -2
- package/dist/18.bc2da9ff57be136ef082.bundle.js.map +0 -1
- package/dist/19.19811699b6e54f19f71e.bundle.js +0 -3
- package/dist/19.19811699b6e54f19f71e.bundle.js.map +0 -1
- package/dist/2.fb2f97f5c543a24296f6.bundle.js +0 -2
- package/dist/2.fb2f97f5c543a24296f6.bundle.js.map +0 -1
- package/dist/20.df3652981fc73c6a8b8c.bundle.js +0 -2
- package/dist/20.df3652981fc73c6a8b8c.bundle.js.map +0 -1
- package/dist/21.b7fbdf3c3b22b578928c.bundle.js +0 -2
- package/dist/21.b7fbdf3c3b22b578928c.bundle.js.map +0 -1
- package/dist/22.2da0e8ec2ac2048ecd60.bundle.js +0 -3
- package/dist/22.2da0e8ec2ac2048ecd60.bundle.js.map +0 -1
- package/dist/23.4140c4c20347efc963a4.bundle.js +0 -2
- package/dist/23.4140c4c20347efc963a4.bundle.js.map +0 -1
- package/dist/24.219ce55f8f6a5bd02dad.bundle.js +0 -2
- package/dist/24.219ce55f8f6a5bd02dad.bundle.js.map +0 -1
- package/dist/25.e79de2370b1ee4072e19.bundle.js +0 -2
- package/dist/25.e79de2370b1ee4072e19.bundle.js.map +0 -1
- package/dist/26.c1619706b8cbb1ab23cb.bundle.js +0 -2
- package/dist/26.c1619706b8cbb1ab23cb.bundle.js.map +0 -1
- package/dist/27.350dba622e243e1ab5fb.bundle.js +0 -2
- package/dist/27.350dba622e243e1ab5fb.bundle.js.map +0 -1
- package/dist/28.e687c87a5f1dc8a30fd0.bundle.js +0 -2
- package/dist/28.e687c87a5f1dc8a30fd0.bundle.js.map +0 -1
- package/dist/29.34a4af65623cd4af6899.bundle.js +0 -2
- package/dist/29.34a4af65623cd4af6899.bundle.js.map +0 -1
- package/dist/3.dfa66b44200c3fca24a2.bundle.js +0 -2
- package/dist/3.dfa66b44200c3fca24a2.bundle.js.map +0 -1
- package/dist/30.f4738c7c2d74f00f2e5f.bundle.js +0 -2
- package/dist/30.f4738c7c2d74f00f2e5f.bundle.js.map +0 -1
- package/dist/31.ab8f2e70841221e1d427.bundle.js +0 -2
- package/dist/31.ab8f2e70841221e1d427.bundle.js.map +0 -1
- package/dist/32.3210a7952ffcb57daa1a.bundle.js +0 -2
- package/dist/32.3210a7952ffcb57daa1a.bundle.js.map +0 -1
- package/dist/33.fcf9c56901b5590bd603.bundle.js +0 -2
- package/dist/33.fcf9c56901b5590bd603.bundle.js.map +0 -1
- package/dist/34.2c344c05bfc4048c3d53.bundle.js +0 -2
- package/dist/34.2c344c05bfc4048c3d53.bundle.js.map +0 -1
- package/dist/35.423c4a91e80adf5d97c8.bundle.js +0 -2
- package/dist/35.423c4a91e80adf5d97c8.bundle.js.map +0 -1
- package/dist/36.247686b6d65de11ec10d.bundle.js +0 -2
- package/dist/36.247686b6d65de11ec10d.bundle.js.map +0 -1
- package/dist/37.5f6089a939b59309cc82.bundle.js +0 -2
- package/dist/37.5f6089a939b59309cc82.bundle.js.map +0 -1
- package/dist/38.9e79a9ec2f9d5af38692.bundle.js +0 -2
- package/dist/38.9e79a9ec2f9d5af38692.bundle.js.map +0 -1
- package/dist/39.b64ae969a5f5fea4504c.bundle.js +0 -2
- package/dist/39.b64ae969a5f5fea4504c.bundle.js.map +0 -1
- package/dist/4.188966396c80909f58cd.bundle.js +0 -2
- package/dist/4.188966396c80909f58cd.bundle.js.map +0 -1
- package/dist/40.1303e99feecbba2614a7.bundle.js +0 -2
- package/dist/40.1303e99feecbba2614a7.bundle.js.map +0 -1
- package/dist/41.687956ca2240355a838f.bundle.js +0 -2
- package/dist/41.687956ca2240355a838f.bundle.js.map +0 -1
- package/dist/42.78e0302e87b9d244a1d7.bundle.js +0 -2
- package/dist/42.78e0302e87b9d244a1d7.bundle.js.map +0 -1
- package/dist/43.ee0de548c525f8e422ba.bundle.js +0 -2
- package/dist/43.ee0de548c525f8e422ba.bundle.js.map +0 -1
- package/dist/44.38b4979d4b201ae1fffb.bundle.js +0 -2
- package/dist/44.38b4979d4b201ae1fffb.bundle.js.map +0 -1
- package/dist/45.8a0ab002ad0f614964e5.bundle.js +0 -2
- package/dist/45.8a0ab002ad0f614964e5.bundle.js.map +0 -1
- package/dist/46.720c0f65b93f4fe01a7c.bundle.js +0 -2
- package/dist/46.720c0f65b93f4fe01a7c.bundle.js.map +0 -1
- package/dist/47.686e599732ae6f41120c.bundle.js.map +0 -1
- package/dist/48.bdb51ad865126b918831.bundle.js +0 -2
- package/dist/48.bdb51ad865126b918831.bundle.js.map +0 -1
- package/dist/49.74a24e08097ef1f6fcd2.bundle.js +0 -2
- package/dist/49.74a24e08097ef1f6fcd2.bundle.js.map +0 -1
- package/dist/5.9bbd38317d375cd02da2.bundle.js +0 -8
- package/dist/5.9bbd38317d375cd02da2.bundle.js.map +0 -1
- package/dist/50.313e315d4c339ad1bcdd.bundle.js +0 -2
- package/dist/50.313e315d4c339ad1bcdd.bundle.js.map +0 -1
- package/dist/51.895a3dacdc3a8eaee275.bundle.js.map +0 -1
- package/dist/52.1f6bc47f1c9abcc79e8d.bundle.js +0 -2
- package/dist/52.1f6bc47f1c9abcc79e8d.bundle.js.map +0 -1
- package/dist/53.f6c19075252833268cca.bundle.js +0 -2
- package/dist/53.f6c19075252833268cca.bundle.js.map +0 -1
- package/dist/54.599ca3ae32ee1fb5f937.bundle.js +0 -2
- package/dist/54.599ca3ae32ee1fb5f937.bundle.js.map +0 -1
- package/dist/55.c20a51cb1d894f9113b4.bundle.js +0 -2
- package/dist/55.c20a51cb1d894f9113b4.bundle.js.map +0 -1
- package/dist/56.91947e80d8e04223ac58.bundle.js.map +0 -1
- package/dist/57.ab4ee313c9d6c7e29384.bundle.js +0 -2
- package/dist/57.ab4ee313c9d6c7e29384.bundle.js.map +0 -1
- package/dist/58.99c83a8dac31c1b681df.bundle.js +0 -2
- package/dist/58.99c83a8dac31c1b681df.bundle.js.map +0 -1
- package/dist/59.99da52e1d8946ac0f601.bundle.js +0 -2
- package/dist/59.99da52e1d8946ac0f601.bundle.js.map +0 -1
- package/dist/6.6c67a1bcf82bb335b0c4.bundle.js +0 -2
- package/dist/6.6c67a1bcf82bb335b0c4.bundle.js.map +0 -1
- package/dist/60.92b9758945e497e52bac.bundle.js +0 -2
- package/dist/60.92b9758945e497e52bac.bundle.js.map +0 -1
- package/dist/61.42887fbc87f941cf7c81.bundle.js +0 -2
- package/dist/61.42887fbc87f941cf7c81.bundle.js.map +0 -1
- package/dist/62.c21410d6e123395d3920.bundle.js +0 -2
- package/dist/62.c21410d6e123395d3920.bundle.js.map +0 -1
- package/dist/63.1ab0c580ba57aee5479c.bundle.js +0 -2
- package/dist/63.1ab0c580ba57aee5479c.bundle.js.map +0 -1
- package/dist/64.ac922cb38c3ff6c431fb.bundle.js.map +0 -1
- package/dist/65.9fcde753699dc94bea1d.bundle.js +0 -2
- package/dist/65.9fcde753699dc94bea1d.bundle.js.map +0 -1
- package/dist/66.8213a0430e7543b6d7f7.bundle.js +0 -2
- package/dist/66.8213a0430e7543b6d7f7.bundle.js.map +0 -1
- package/dist/67.320a484bc979f5076d8c.bundle.js +0 -2
- package/dist/67.320a484bc979f5076d8c.bundle.js.map +0 -1
- package/dist/68.a69e9e22327878f44dbd.bundle.js +0 -2
- package/dist/68.a69e9e22327878f44dbd.bundle.js.map +0 -1
- package/dist/69.be786580c66ac4ee18cb.bundle.js +0 -2
- package/dist/69.be786580c66ac4ee18cb.bundle.js.map +0 -1
- package/dist/7.0fd9bc389f42820382e4.bundle.js +0 -3
- package/dist/7.0fd9bc389f42820382e4.bundle.js.map +0 -1
- package/dist/70.93cfa1f02948e8276451.bundle.js +0 -2
- package/dist/70.93cfa1f02948e8276451.bundle.js.map +0 -1
- package/dist/71.6b8c8bce52a95f2da242.bundle.js +0 -2
- package/dist/71.6b8c8bce52a95f2da242.bundle.js.map +0 -1
- package/dist/72.6cbb41a38d917191c660.bundle.js +0 -2
- package/dist/72.6cbb41a38d917191c660.bundle.js.map +0 -1
- package/dist/73.801e05b4acc74a3e268c.bundle.js +0 -2
- package/dist/73.801e05b4acc74a3e268c.bundle.js.map +0 -1
- package/dist/74.1c6322e5f93d5376fd76.bundle.js +0 -2
- package/dist/74.1c6322e5f93d5376fd76.bundle.js.map +0 -1
- package/dist/75.c95c9015a30a98acb353.bundle.js +0 -2
- package/dist/75.c95c9015a30a98acb353.bundle.js.map +0 -1
- package/dist/76.29111b9618d43a0dd149.bundle.js +0 -2
- package/dist/76.29111b9618d43a0dd149.bundle.js.map +0 -1
- package/dist/77.6ced6f6e26dfe1c4e00f.bundle.js +0 -2
- package/dist/77.6ced6f6e26dfe1c4e00f.bundle.js.map +0 -1
- package/dist/78.7c7d2a0d9e7c2d2483e6.bundle.js +0 -2
- package/dist/78.7c7d2a0d9e7c2d2483e6.bundle.js.map +0 -1
- package/dist/79.696045e048461f420813.bundle.js +0 -2
- package/dist/79.696045e048461f420813.bundle.js.map +0 -1
- package/dist/8.22695f5c20dcddc1c7f9.bundle.js +0 -2
- package/dist/8.22695f5c20dcddc1c7f9.bundle.js.map +0 -1
- package/dist/80.b5e832779f88ebe839e2.bundle.js +0 -2
- package/dist/80.b5e832779f88ebe839e2.bundle.js.map +0 -1
- package/dist/81.5a0776b89463df60bd1a.bundle.js +0 -2
- package/dist/81.5a0776b89463df60bd1a.bundle.js.map +0 -1
- package/dist/82.0a98b482c7c37a9812fc.bundle.js +0 -2
- package/dist/82.0a98b482c7c37a9812fc.bundle.js.map +0 -1
- package/dist/83.8beeb651df72c23d53ac.bundle.js +0 -2
- package/dist/83.8beeb651df72c23d53ac.bundle.js.map +0 -1
- package/dist/84.6f35fe422db61d53ae3e.bundle.js +0 -2
- package/dist/84.6f35fe422db61d53ae3e.bundle.js.map +0 -1
- package/dist/85.2d1142fcbdf4c9868e94.bundle.js +0 -2
- package/dist/85.2d1142fcbdf4c9868e94.bundle.js.map +0 -1
- package/dist/86.ce91cb69963c2b84e551.bundle.js +0 -2
- package/dist/86.ce91cb69963c2b84e551.bundle.js.map +0 -1
- package/dist/87.d4aa485128cd374a11c7.bundle.js +0 -2
- package/dist/87.d4aa485128cd374a11c7.bundle.js.map +0 -1
- package/dist/88.b4cd8e99a6af1abea692.bundle.js +0 -2
- package/dist/88.b4cd8e99a6af1abea692.bundle.js.map +0 -1
- package/dist/89.8ce40cc9d5fe2596fdf9.bundle.js +0 -2
- package/dist/89.8ce40cc9d5fe2596fdf9.bundle.js.map +0 -1
- package/dist/9.d94f24c12177433d455a.bundle.js +0 -2
- package/dist/9.d94f24c12177433d455a.bundle.js.map +0 -1
- package/dist/90.94988124ca51fa46932e.bundle.js +0 -2
- package/dist/90.94988124ca51fa46932e.bundle.js.map +0 -1
- package/dist/91.bfbbacbaea095478d82e.bundle.js +0 -2
- package/dist/91.bfbbacbaea095478d82e.bundle.js.map +0 -1
- package/dist/92.791121a262e5f42a2ba2.bundle.js +0 -2
- package/dist/92.791121a262e5f42a2ba2.bundle.js.map +0 -1
- package/dist/93.7da268902b8515abecf6.bundle.js +0 -2
- package/dist/93.7da268902b8515abecf6.bundle.js.map +0 -1
- package/dist/94.88f1bd8fa645739c4f30.bundle.js +0 -2
- package/dist/94.88f1bd8fa645739c4f30.bundle.js.map +0 -1
- package/dist/95.bbd1b757de3af20f2ac1.bundle.js +0 -2
- package/dist/95.bbd1b757de3af20f2ac1.bundle.js.map +0 -1
- package/dist/96.38e7df277c99946f9a20.bundle.js +0 -2
- package/dist/96.38e7df277c99946f9a20.bundle.js.map +0 -1
- package/dist/97.1818744137f2fb66596a.bundle.js +0 -2
- package/dist/97.1818744137f2fb66596a.bundle.js.map +0 -1
- package/dist/98.1a14af46a31cf35db0e5.bundle.js +0 -2
- package/dist/98.1a14af46a31cf35db0e5.bundle.js.map +0 -1
- package/dist/99.bd486f7d738e281a0752.bundle.js +0 -2
- package/dist/99.bd486f7d738e281a0752.bundle.js.map +0 -1
- package/dist/bundle.5eeff901b77240e58d27.bundle.js +0 -89
- package/dist/bundle.5eeff901b77240e58d27.bundle.js.map +0 -1
- package/dist/css/fonts/rubik-italic.woff +0 -0
- package/dist/css/fonts/rubik-italic.woff2 +0 -0
- package/dist/css/fonts/rubik-light.woff +0 -0
- package/dist/css/fonts/rubik-light.woff2 +0 -0
- package/dist/css/fonts/rubik-lightitalic.woff +0 -0
- package/dist/css/fonts/rubik-lightitalic.woff2 +0 -0
- package/dist/css/fonts/rubik-medium.woff +0 -0
- package/dist/css/fonts/rubik-medium.woff2 +0 -0
- package/dist/css/fonts/rubik-mediumitalic.woff +0 -0
- package/dist/css/fonts/rubik-mediumitalic.woff2 +0 -0
- package/dist/css/fonts/rubik-regular.woff +0 -0
- package/dist/css/fonts/rubik-regular.woff2 +0 -0
- package/dist/css/lib/bootstrap-switch/bootstrap-switch.min.css +0 -10
- package/dist/img/graphdb-splash.2eb3f7f02aa7e25a2545459e096f3738.svg +0 -141
- package/dist/js/angular/clustermanagement/templates/modal/clone-modal.html +0 -27
- package/dist/js/lib/nvd3/nv.d3.css +0 -755
- package/dist/main.e5d47f1d0bcd23074c38.css +0 -1
- package/dist/main.f10730ef6eebe969b494.bundle.js +0 -2
- package/dist/main.f10730ef6eebe969b494.bundle.js.map +0 -1
- package/dist/pages/cluster-management/cluster-configuration.html +0 -183
- package/dist/res/swagger/css/style.css +0 -250
- package/dist/res/swagger/css/typography.css +0 -60
- package/dist/vendor.327ffd7c7997ca288654.bundle.js +0 -50
- package/dist/vendor.327ffd7c7997ca288654.bundle.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/js/lib/common/d3-utils.js","webpack:///./src/js/lib/d3-tip/d3-tip-patch.js","webpack:///./src/js/angular/repositories/repository.constants.js","webpack:///./src/js/angular/graphexplore/controllers/graphs-visualizations.controller.js"],"names":["D3","Text","calcFontSizeRaw","text","radius","minimumSize","isMultiline","textSize","substring","length","match","Math","round","calcFontSize","getTextWithElipsisIfNeeded","str","threshold","Transition","fadeIn","sel","duration","style","transition","fadeOut","Click","delayDblClick","event","d3","dispatch","rebind","selection","down","wait","on","mouse","document","body","Date","d","a","b","sqrt","pow","window","clearTimeout","dblclick","setTimeout","click","direction","offset","html","node","initNode","svg","point","target","customPosition","tip","vis","el","tagName","toLowerCase","ownerSVGElement","createSVGPoint","appendChild","show","args","Array","prototype","slice","call","arguments","SVGElement","pop","coords","content","apply","this","poffset","dir","nodel","getNodeEl","i","directions","scrollTop","documentElement","scrollLeft","customPos","opacity","classed","direction_callbacks","get","top","left","hide","attr","n","v","functor","destroy","remove","map","bbox","getScreenBBox","y","offsetHeight","x","offsetWidth","s","e","w","nw","ne","sw","se","keys","select","createElement","position","targetel","getScreenCTM","parentNode","matrix","tbbox","getBBox","width","height","matrixTransform","STATIC_RULESETS","id","name","REPOSITORY_TYPES","graphdbRepo","free","eeWorker","eeMaster","ontop","fedx","FILENAME_PATTERN","RegExp","NUMBER_PATTERN","GraphsVisualizationsCtrl","$scope","$rootScope","$repositories","$licenseService","toastr","$timeout","$http","ClassInstanceDetailsService","AutocompleteRestService","$q","$location","$jwtAuth","UiScrollService","ModalService","$modal","$window","LocalStorageAdapter","LSKeys","SavedGraphsRestService","GraphConfigRestService","RDF4JRepositoriesRestService","$translate","languageChanged","propertiesObj","propertiesQueryObj","items","propertiesNotFiltered","searchVisible","nodeSelected","queryResultsMode","embedded","search","openedNodeInfoPanel","undefined","invalidLimit","INVALID_LINKS_MSG","instant","INVALID_LINKS_TOOLTIP","$on","propertiesSearchPlaceholder","onopen","onclose","angular","noop","query","uri","config","saved","noGoHome","datasource","current","type2color","colorIndex","nodeLabelMinFontSize","panAndZoom","behavior","zoom","scaleExtent","transformValues","tipElement","openedLink","copyToClipboard","openCopyToClipboardModal","initSettings","principal","settingsFromPrincipal","appSettings","defaultSettings","includeInferred","sameAsState","includeSchema","localStorageSettings","GRAPHS_VIZ","saveSettings","unique","copy","set","key","index","count","success","initLazyList","$watch","_","each","item","revision","adapterContainer","adapter","remain","propertiesFilterFunc","indexOf","resetState","configLoaded","lastSavedGraphName","lastSavedGraphId","shared","numberOfPinnedNodes","pushHistory","searchParams","state","goToHome","url","shouldShowSettings","defaultGraphConfig","shouldDisableSameAs","sameAsCheckbox","$","settings","prop","isDefined","reload","toggleMoreInfo","ev","element","currentTarget","parent","next","toggle","children","toggleClass","linksLimit","languages","showLinksText","preferredTypes","rejectedTypes","preferredPredicates","rejectedPredicates","preferredTypesOnly","preferredPredicatesOnly","getPrincipal","renderSettings","languagesMap","preferredTypesMap","rejectedTypesMap","preferredPredicatesMap","rejectedPredicatesMap","resetSettings","validateLinksLimit","changeLimit","delta","test","showSettings","showInfoPanel","showFilter","showNodeInfo","showPredicates","reExpandNode","rootNodeIri","$broadcast","loadGraphForQuery","queryString","sameAsParam","inferredParam","sendSameAs","sendInferred","loading","method","headers","data","then","response","initGraphFromResponse","error","getError","removeSpecialChars","string","replace","convertTripleToLinkId","triple","tripleLike","tripleParts","split","join","convertLinkDataToLinkId","link","source","iri","getNodeX","isTriple","getElementById","__data__","getNodeY","createTriple","value","trim","createArrowMarkerUniqueID","Graph","nodes","links","tripleNodes","Map","tripleLinksCopy","addNode","push","computeConnectedness","counts","seenLinks","i1","i2","seenKey","min","max","connectedness","addAndMatchLinks","newLinks","isTripleSource","getTripleNode","find","o","isTripleTarget","matchedLink","predicates","linkId","graph","has","matchLinksToNodes","delete","filter","countLinks","findLinksForNode","l","linksTypes","linksForNode","types","uniq","flatten","linksPredicates","removeTriples","triplesToRemove","targetTriples","size","forEach","reject","sourceSplit","lSource","lTarget","targetSplit","isRejected","removeNode","removeNodeLeafLinks","targetLinks","addTriple","weight","copyState","nodesCopy","labels","rdfRank","fixed","triplesCopy","JSON","stringify","from","entries","scale","translate","restoreState","parse","draw","updateSettings","t","sameAs","inference","startMode","loadGraphConfig","selectAll","getGraphConfigs","graphCallback","graphConfigs","loadConfigForId","configId","successCallback","getConfig","findConfigById","grep","easyGraphSearch","openUri","startIRI","startGraphQuery","loadGraphForConfig","startQueryIncludeInferred","startQuerySameAs","deleteConfig","openSimpleModal","title","message","configName","warning","result","deleteGraphConfig","refreshSavedGraphs","goToGraphConfig","onpopstate","savedGraph","loadSavedGraph","initGraphFromQueryParam","inputValue","params","rootNode","expandNode","catch","err","getSavedGraph","msg","loadGraphFromQueryParam","initForRepository","newRepo","getActiveRepository","hasInitedRepository","getNamespacesPromise","getNamespaces","nss","results","bindings","namespace","prefix","namespaces","sortBy","checkAutocompleteStatus","isLicenseValid","getAutocompletePromise","replaceIRIWithPrefix","namespacePrefix","findLast","addedTag","tag","uriParts","uriPart","localName","isUndefined","expandedUri","getNamespaceUriForPrefix","expandPrefix","pageslideExpanded","validateTag","category","wildcardOK","wildcardPos","getTagClass","tagText","endsWith","empty","multiClickDelay","nodeLabelRectScaleX","color1","linear","domain","range","interpolate","interpolateHslLong","color2","getColor","type","force","layout","gravity","append","showNodeTipAndIconsTimer","removeIconsTimer","loader","setLoadingState","getLoadingState","init","resetRootNode","container","stopPropagation","removeMenuIfVisible","stop","getBoundingClientRect","bottom","createTipText","p","getShortPredicate","numOfPredLeft","numberOfPredLeft","textToShow","tipPredicateElement","tipPredicates","textWidth","ctx","getContext","font","measureText","calculateWidth","hideTipForNode","cancel","tipTimer","charge","linkDistance","span","splitedLink","predicateText","addClass","textLength","getPredicateTextLength","enter","predicate","getPredicate","tipPredicateTimer","thisPredicateTipElement","showPredicateToolTip","revertElementsStyleToDefault","tripleNode","clickedNode","button","nodeCopy","pred","applyElementsStyleChanges","foundNodeIndex","findIndex","getTripleNodeIndex","isPartOfTriple","partOfTriple","nodeIndex","openPredicates","linkActions","mouseEventTimer","upEventLast","virtualClickEventTimer","moveEventCount","downEventHandler","timeStamp","preventDefault","upEventHandler","info","closeInfoPanel","showPinAnimation","startSize","endSize","startOpacity","endOpacity","animate","pin","innerD","drag","origin","sourceEvent","fixedBeforeDrag","isBeingDragged","beginDragging","px","py","pinWasFixed","resume","menuEvents","closeIcon","expandIcon","focusIcon","copyURIIcon","removeIcons","alpha","initIcons","expandNodeIcons","thisTipElement","showTipForNode","hideNode","shiftKey","updateTipForNode","nodeLabels","insert","fontSize","label","textContent","endlessLoopGuard","scrollHeight","clientHeight","scrollWidth","clientWidth","updateNodeLabels","geom","quadtree","sourceX","targetX","sourceY","targetY","linkedNodes","p1","p2","atan2","PI","angleDeg","abs","findAngleBetweenNodes","sourceId","targetId","twoWayLinkID","textNode","createTextNode","lastChild","start","getPositionAndAngle","angle","cos","sin","collapseIcon","actionsTip","expandedState","right","isExpanded","getAttribute","animateMenu","delay","ease","ctrlKey","metaKey","initGraph","renderGraphFromResponse","isStartNode","linksFound","newLink","existingLink","linksCopy","tripleLinksIt","values","nodesFromLinks","array","distinctBy","union","existingNodes","Boolean","tripleNodesIt","newNodes","some","promises","newNodesData","newNode","res","all","newNodeData","theta","expandIri","nodeTypes","nodeIri","resourceType","encodedIri","encodeURI","rdfsLabel","rdfsComment","comment","expanded","dataNodeKeysQuery","mapKeys","nodeImage","imageVal","updatePredicatesColor","getElementsByClassName","linkLink","stroke","strokeWidth","markers","marker","markerLink","setAttribute","className","color","preds","predLink","fill","oppLinkIRI","oppTriplePred","currEl","fontWeight","shortIRI","toggleSidePanel","clickLink","predData","clickedEl","every","linkPred","splitPredicate","isLoadingLocation","hasActiveLocation","rotate","isLeft","pivotX","pivotY","noHistory","saveOrUpdateGraph","graphToSave","saveGraphModal","renameSavedGraph","graphToRename","editSavedGraphHttp","editSavedGraph","mode","graphExists","open","templateUrl","controller","resolve","restart","addNewSavedGraph","status","saveGraphHttp","getSavedGraphs","savedGraphs","graphToLoad","owner","copyToClipboardSavedGraph","location","protocol","host","pathname","deleteSavedGraph","graphName","deleteSavedGraphHttp","openIRI","togglePinAllNodes","nodeName","keyCode","getLiteralFromPropValue","SaveGraphModalCtrl","$modalInstance","okButtonText","ok","form","$valid","close","saveNew","dismiss","module","$tooltipProvider","options","appendToBody","$inject"],"mappings":"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","file":"25.e79de2370b1ee4072e19.bundle.js","sourcesContent":["var D3 = D3 || {};\n\nD3.Text = function () {\n function calcFontSizeRaw(text, radius, minimumSize, isMultiline) {\n minimumSize = minimumSize || 10;\n\n var textSize = radius / 3;\n if (typeof text === \"string\") {\n var len = text.substring(0, radius / 3).length + 1.5;\n textSize *= 10 / len;\n textSize += 1;\n // experimental alternative method:\n // var textSize = 3.3 * radius / text.length;\n\n // Tweak for Indian scripts and CJK ones\n if (text.match(/[\\u0900-\\u0DFF\\u1100-\\u11FF\\u2E80-\\u2EFF\\u3000-\\u9FFF]/)) {\n textSize *= 0.6;\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n /* Disabled for the time being, better without this\n if (isMultiline) {\n var numWords = text.split(/\\s+/).length;\n if (numWords > 1) {\n if (numWords > 4) {\n numWords = 4;\n }\n textSize += textSize * (4 - numWords) * 0.1;\n }\n }\n */\n\n return Math.round(textSize);\n }\n\n if (textSize < minimumSize) {\n textSize = minimumSize;\n }\n\n return Math.round(textSize);\n }\n\n function calcFontSize(text, radius, minimumSize, isMultiline) {\n return calcFontSizeRaw(text, radius, minimumSize, isMultiline) + 'px';\n }\n\n function getTextWithElipsisIfNeeded(str, threshold) {\n if (typeof str === \"string\") {\n if (str.length > threshold) {\n return str.substring(0, threshold - 3) + \"...\";\n }\n }\n return str;\n }\n\n return {\n calcFontSizeRaw: calcFontSizeRaw,\n calcFontSize: calcFontSize,\n getTextWithElipsisIfNeeded: getTextWithElipsisIfNeeded\n };\n}();\n\nD3.Transition = function () {\n function fadeIn(sel, duration) {\n sel.style(\"opacity\", 0.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 1.0);\n }\n\n function fadeOut(sel, duration) {\n sel.style(\"opacity\", 1.0)\n .transition()\n .duration(duration)\n .style(\"opacity\", 0.0);\n }\n\n return {\n fadeIn: fadeIn,\n fadeOut: fadeOut\n };\n}();\n\nD3.Click = function () {\n function delayDblClick() {\n var event = d3.dispatch('click', 'dblclick');\n\n function cc(selection) {\n var down,\n tolerance = 5,\n last,\n wait = null;\n\n // euclidean distance\n function dist(a, b) {\n return Math.sqrt(Math.pow(a[0] - b[0], 2), Math.pow(a[1] - b[1], 2));\n }\n\n selection.on('mousedown', function () {\n down = d3.mouse(document.body);\n last = +new Date();\n });\n selection.on('mouseup', function (d) {\n if (dist(down, d3.mouse(document.body)) > tolerance) {\n return;\n } else {\n if (wait) {\n window.clearTimeout(wait);\n wait = null;\n event.dblclick(d);\n } else {\n wait = window.setTimeout((function (e) {\n return function () {\n event.click(d);\n wait = null;\n };\n })(d3.event), 250);\n }\n }\n });\n }\n\n return d3.rebind(cc, event, 'on');\n }\n\n return {\n delayDblClick: delayDblClick\n };\n}();\n\nexport default D3;\n","// d3.tip\n// Copyright (c) 2013 Justin Palmer\n//\n// Tooltips for d3.js SVG visualizations\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module with d3 as a dependency.\n define([], factory)\n } else if (typeof module === 'object' && module.exports) {\n // CommonJS\n module.exports = function(d3) {\n d3.tip = factory(d3)\n return d3.tip\n }\n } else {\n // Browser global.\n root.d3.tip = factory(root.d3)\n }\n}(this, function () {\n // Public - contructs a new tooltip\n //\n // Returns a tip\n return function() {\n var direction = d3_tip_direction,\n offset = d3_tip_offset,\n html = d3_tip_html,\n node = initNode(),\n svg = null,\n point = null,\n target = null,\n customPosition = null\n\n function tip(vis) {\n svg = getSVGNode(vis)\n point = svg.createSVGPoint()\n document.body.appendChild(node)\n }\n\n // Public - show the tooltip on the screen\n //\n // Returns a tip\n tip.show = function() {\n var args = Array.prototype.slice.call(arguments)\n if(args[args.length - 1] instanceof SVGElement) target = args.pop()\n\n var content = html.apply(this, args),\n poffset = offset.apply(this, args),\n dir = direction.apply(this, args),\n nodel = getNodeEl(),\n i = directions.length,\n coords,\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft,\n customPos = customPosition.apply(this, args)\n\n nodel.html(content)\n .style({ opacity: 1, 'pointer-events': 'all' })\n\n while(i--) nodel.classed(directions[i], false)\n coords = direction_callbacks.get(dir).apply(this)\n\n if (customPos) {\n nodel.style(customPos)\n } else {\n nodel.classed(dir, true).style({\n top: (coords.top + poffset[0]) + scrollTop + 'px',\n left: (coords.left + poffset[1]) + scrollLeft + 'px'\n })\n }\n\n return tip\n }\n\n // Public - hide the tooltip\n //\n // Returns a tip\n tip.hide = function() {\n var nodel = getNodeEl()\n nodel.style({ opacity: 0, 'pointer-events': 'none' })\n return tip\n }\n\n // Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.\n //\n // n - name of the attribute\n // v - value of the attribute\n //\n // Returns tip or attribute value\n tip.attr = function(n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().attr(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.attr.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Proxy style calls to the d3 tip container. Sets or gets a style value.\n //\n // n - name of the property\n // v - value of the property\n //\n // Returns tip or style property value\n tip.style = function(n, v) {\n if (arguments.length < 2 && typeof n === 'string') {\n return getNodeEl().style(n)\n } else {\n var args = Array.prototype.slice.call(arguments)\n d3.selection.prototype.style.apply(getNodeEl(), args)\n }\n\n return tip\n }\n\n // Public: Set or get the direction of the tooltip\n //\n // v - One of n(north), s(south), e(east), or w(west), nw(northwest),\n // sw(southwest), ne(northeast) or se(southeast)\n //\n // Returns tip or direction\n tip.direction = function(v) {\n if (!arguments.length) return direction\n direction = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n // Public: Sets or gets the offset of the tip\n //\n // v - Array of [x, y] offset\n //\n // Returns offset or\n tip.offset = function(v) {\n if (!arguments.length) return offset\n offset = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n // Public: sets or gets the html value of the tooltip\n //\n // v - String value of the tip\n //\n // Returns html value or tip\n tip.html = function(v) {\n if (!arguments.length) return html\n html = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n tip.customPosition = function(v) {\n if (!arguments.length) return customPosition\n customPosition = v == null ? v : d3.functor(v)\n\n return tip\n }\n\n // Public: destroys the tooltip and removes it from the DOM\n //\n // Returns a tip\n tip.destroy = function() {\n if(node) {\n getNodeEl().remove();\n node = null;\n }\n return tip;\n }\n\n function d3_tip_direction() { return 'n' }\n function d3_tip_offset() { return [0, 0] }\n function d3_tip_html() { return ' ' }\n\n var direction_callbacks = d3.map({\n n: direction_n,\n s: direction_s,\n e: direction_e,\n w: direction_w,\n nw: direction_nw,\n ne: direction_ne,\n sw: direction_sw,\n se: direction_se\n }),\n\n directions = direction_callbacks.keys()\n\n function direction_n() {\n var bbox = getScreenBBox()\n return {\n top: bbox.n.y - node.offsetHeight,\n left: bbox.n.x - node.offsetWidth / 2\n }\n }\n\n function direction_s() {\n var bbox = getScreenBBox()\n return {\n top: bbox.s.y,\n left: bbox.s.x - node.offsetWidth / 2\n }\n }\n\n function direction_e() {\n var bbox = getScreenBBox()\n return {\n top: bbox.e.y - node.offsetHeight / 2,\n left: bbox.e.x\n }\n }\n\n function direction_w() {\n var bbox = getScreenBBox()\n return {\n top: bbox.w.y - node.offsetHeight / 2,\n left: bbox.w.x - node.offsetWidth\n }\n }\n\n function direction_nw() {\n var bbox = getScreenBBox()\n return {\n top: bbox.nw.y - node.offsetHeight,\n left: bbox.nw.x - node.offsetWidth\n }\n }\n\n function direction_ne() {\n var bbox = getScreenBBox()\n return {\n top: bbox.ne.y - node.offsetHeight,\n left: bbox.ne.x\n }\n }\n\n function direction_sw() {\n var bbox = getScreenBBox()\n return {\n top: bbox.sw.y,\n left: bbox.sw.x - node.offsetWidth\n }\n }\n\n function direction_se() {\n var bbox = getScreenBBox()\n return {\n top: bbox.se.y,\n left: bbox.e.x\n }\n }\n\n function initNode() {\n var node = d3.select(document.createElement('div'))\n node.style({\n position: 'absolute',\n top: 0,\n opacity: 0,\n 'pointer-events': 'none',\n 'box-sizing': 'border-box'\n })\n\n return node.node()\n }\n\n function getSVGNode(el) {\n el = el.node()\n if(el.tagName.toLowerCase() === 'svg')\n return el\n\n return el.ownerSVGElement\n }\n\n function getNodeEl() {\n if(node === null) {\n node = initNode();\n // re-add node to DOM\n document.body.appendChild(node);\n };\n return d3.select(node);\n }\n\n // Private - gets the screen coordinates of a shape\n //\n // Given a shape on the screen, will return an SVGPoint for the directions\n // n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),\n // sw(southwest).\n //\n // +-+-+\n // | |\n // + +\n // | |\n // +-+-+\n //\n // Returns an Object {n, s, e, w, nw, sw, ne, se}\n function getScreenBBox() {\n var targetel = target || d3.event.target;\n\n while ('undefined' === typeof targetel.getScreenCTM && 'undefined' === targetel.parentNode) {\n targetel = targetel.parentNode;\n }\n\n var bbox = {},\n matrix = targetel.getScreenCTM(),\n tbbox = targetel.getBBox(),\n width = tbbox.width,\n height = tbbox.height,\n x = tbbox.x,\n y = tbbox.y\n\n point.x = x\n point.y = y\n bbox.nw = point.matrixTransform(matrix)\n point.x += width\n bbox.ne = point.matrixTransform(matrix)\n point.y += height\n bbox.se = point.matrixTransform(matrix)\n point.x -= width\n bbox.sw = point.matrixTransform(matrix)\n point.y -= height / 2\n bbox.w = point.matrixTransform(matrix)\n point.x += width\n bbox.e = point.matrixTransform(matrix)\n point.x -= width / 2\n point.y -= height / 2\n bbox.n = point.matrixTransform(matrix)\n point.y += height\n bbox.s = point.matrixTransform(matrix)\n\n return bbox\n }\n\n return tip\n };\n\n}));","export const STATIC_RULESETS = [\n {id: 'empty', name: 'No inference'},\n {id: 'rdfs-optimized', name: 'RDFS (Optimized)'},\n {id: 'rdfs', name: 'RDFS'},\n {id: 'rdfsplus-optimized', name: 'RDFS-Plus (Optimized)'},\n {id: 'owl-horst-optimized', name: 'OWL-Horst (Optimized)'},\n {id: 'owl-horst', name: 'OWL-Horst'},\n {id: 'owl2-ql-optimized', name: 'OWL2-QL (Optimized)'},\n {id: 'owl2-ql', name: 'OWL2-QL'},\n {id: 'owl-max-optimized', name: 'OWL-Max (Optimized)'},\n {id: 'owl-max', name: 'OWL-Max'},\n {id: 'owl2-rl-optimized', name: 'OWL2-RL (Optimized)'},\n {id: 'owl2-rl', name: 'OWL2-RL'},\n\n];\n\nexport const REPOSITORY_TYPES = {graphdbRepo: 'graphdb', free: 'free', eeWorker: 'worker', eeMaster: 'master', ontop: 'ontop', se: 'se', fedx: 'fedx'};\nexport const FILENAME_PATTERN = new RegExp('^[a-zA-Z0-9-_]+$');\nexport const NUMBER_PATTERN = new RegExp('^[0-9]+$');\n","import 'angular/core/services';\nimport D3 from 'lib/common/d3-utils.js';\nimport d3tip from 'lib/d3-tip/d3-tip-patch';\nimport 'angular/utils/local-storage-adapter';\nimport {NUMBER_PATTERN} from \"../../repositories/repository.constants\";\n\nconst modules = [\n 'ui.scroll.jqlite',\n 'ui.scroll',\n 'toastr',\n 'ui.bootstrap',\n 'ngTagsInput',\n 'graphdb.framework.utils.localstorageadapter'\n];\n\nangular\n .module('graphdb.framework.graphexplore.controllers.graphviz', modules)\n .controller('GraphsVisualizationsCtrl', GraphsVisualizationsCtrl)\n .controller('SaveGraphModalCtrl', SaveGraphModalCtrl)\n .config(['$tooltipProvider', function ($tooltipProvider) {\n $tooltipProvider.options({appendToBody: true});\n }]);\n\nGraphsVisualizationsCtrl.$inject = [\"$scope\", \"$rootScope\", \"$repositories\", \"$licenseService\", \"toastr\", \"$timeout\", \"$http\", \"ClassInstanceDetailsService\", \"AutocompleteRestService\", \"$q\", \"$location\", \"$jwtAuth\", \"UiScrollService\", \"ModalService\", \"$modal\", \"$window\", \"LocalStorageAdapter\", \"LSKeys\", \"SavedGraphsRestService\", \"GraphConfigRestService\", \"RDF4JRepositoriesRestService\", \"$translate\"];\n\nfunction GraphsVisualizationsCtrl($scope, $rootScope, $repositories, $licenseService, toastr, $timeout, $http, ClassInstanceDetailsService, AutocompleteRestService, $q, $location, $jwtAuth, UiScrollService, ModalService, $modal, $window, LocalStorageAdapter, LSKeys, SavedGraphsRestService, GraphConfigRestService, RDF4JRepositoriesRestService, $translate) {\n\n $scope.languageChanged = false;\n $scope.propertiesObj = {};\n $scope.propertiesQueryObj = {};\n\n $scope.propertiesObj.items = [];\n $scope.propertiesNotFiltered = [];\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.queryResultsMode = false;\n $scope.embedded = $location.search().embedded;\n $scope.openedNodeInfoPanel = undefined;\n\n $scope.invalidLimit = false;\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n\n $rootScope.$on('$translateChangeSuccess', function () {\n $scope.INVALID_LINKS_MSG = $translate.instant('sidepanel.invalid.limit.links.msg');\n $scope.INVALID_LINKS_TOOLTIP = $translate.instant('sidepanel.invalid.limit.links.tooltip');\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n });\n\n // Handle pageslide directive callbacks which incidentally appeared to be present in the angular's\n // scope, so we need to define our's and pass them to pageslide, otherwise it throws an error.\n $scope.onopen = $scope.onclose = () => angular.noop();\n\n // embedded and other params when the controller is initialized\n if ($scope.embedded && ($location.search().query ||\n $location.search().uri ||\n $location.search().config ||\n $location.search().saved)) {\n\n $scope.noGoHome = true;\n }\n\n // creating datasource for class properties data\n const datasource = {};\n let position = 0;\n let current = 0;\n let type2color = {};\n let colorIndex = 0;\n const nodeLabelMinFontSize = 16; // pixels\n // define zoom and drag behavior; keep this out of draw() to preserve state when nodes are added/removed\n const panAndZoom = d3.behavior.zoom()\n .scaleExtent([0.5, 10]);\n let transformValues;\n // build svg element\n const width = 1000;\n const height = 1000;\n let tipElement;\n let openedLink;\n\n $rootScope.key = \"\";\n\n datasource.get = function (index, count, success) {\n return UiScrollService.initLazyList(index, count, success, position, $scope.propertiesObj.items);\n };\n\n $rootScope.$watch(function () {\n return $rootScope.key;\n }, function () {\n position = 0;\n _.each($scope.propertiesObj.items, function (item) {\n if ($rootScope.key > item) {\n position++;\n }\n });\n current++;\n });\n\n datasource.revision = function () {\n return current;\n };\n\n $scope.datasource = datasource;\n\n // adapter implementation for ui-scroll directive\n $scope.adapterContainer = {adapter: {remain: true}};\n\n $scope.propertiesQueryObj.query = '';\n $scope.propertiesSearchPlaceholder = $translate.instant(\"visual.search.instance.placeholder\");\n $scope.propertiesFilterFunc = propertiesFilterFunc;\n\n $scope.resetState = function () {\n $scope.searchVisible = false;\n $scope.nodeSelected = false;\n $scope.configLoaded = null;\n $scope.queryResultsMode = false;\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = false;\n $scope.numberOfPinnedNodes = 0;\n\n // Reset type colours\n type2color = {};\n colorIndex = 0;\n };\n\n $scope.pushHistory = function (searchParams, state) {\n if ($scope.embedded) {\n searchParams.embedded = true;\n }\n $location.search(searchParams);\n $location.state(state);\n };\n\n $scope.goToHome = function () {\n $scope.resetState();\n $location.url(\"graphs-visualizations\");\n };\n\n $scope.shouldShowSettings = function () {\n return $scope.configLoaded && $scope.configLoaded.id === $scope.defaultGraphConfig.id;\n };\n\n $scope.shouldDisableSameAs = function () {\n const sameAsCheckbox = $('#sameAsCheck');\n if ($scope.settings && !$scope.settings['includeInferred'] && sameAsCheckbox.prop('checked')) {\n sameAsCheckbox.prop(\"checked\", false);\n $scope.settings['sameAsState'] = false;\n }\n\n return $scope.settings && !$scope.settings['includeInferred'];\n };\n\n function propertiesFilterFunc(item) {\n return item.key\n .toLowerCase()\n .indexOf($scope.propertiesQueryObj.query.toLowerCase()) >= 0;\n }\n\n $scope.$watch('propertiesObj.items', function () {\n if (angular.isDefined($scope.propertiesObj.items) && $scope.propertiesObj.items.length > 0) {\n $timeout(function () {\n $scope.adapterContainer.adapter.reload();\n }, 500);\n }\n });\n\n $scope.toggleMoreInfo = function (ev) {\n angular.element(ev.currentTarget).parent().next().toggle(200);\n angular.element(ev.currentTarget).children('span').toggleClass(\"icon-caret-down\").toggleClass(\"icon-caret-up\");\n };\n\n function updatePredicateLabels() {\n if (!$scope.saveSettings['showLinksText']) {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"none\");\n } else {\n d3.selectAll(\"svg .link-wrapper text\")\n .style(\"display\", \"block\");\n }\n }\n\n function updateNodeLabels(nodeLabels) {\n nodeLabels.each(function (d) {\n d.fontSize = D3.Text.calcFontSizeRaw(d.labels[0].label, d.size, nodeLabelMinFontSize, true);\n // TODO: get language and set it on the label html tag\n })\n .attr(\"height\", function (d) {\n return d.fontSize * 3;\n })\n // if this was kosher we would use xhtml:body here but if we do that angular (or the browser)\n // goes crazy and resizes/messes up other unrelated elements. div seems to work too.\n .append(\"xhtml:div\")\n .attr(\"class\", \"node-label-body\")\n .style(\"font-size\", function (d) {\n return d.fontSize + 'px';\n })\n .append('xhtml:div')\n .text(function (d) {\n return d.labels[0].label;\n });\n\n // Our own implementation of what browsers should really do but they either can't or don't do properly.\n // This code will look at each node's label element and check if the text fits. This is achieved by\n // checking the DOM properties scrollHeight/-Width and clientHeight/-Width. Generally if the scroll ones\n // are bigger than the client ones the content doesn't fit.\n $timeout(function () {\n $('.node-label-body div').each(function (i, e) {\n // Initial text is minus one character as we'll be adding a one-character suffix if we need to truncate\n let text = e.textContent.substring(0, e.textContent.length - 1);\n const suffixToInsert = '…';\n let endlessLoopGuard = 0;\n\n // Loop until the text fits\n while (endlessLoopGuard < 200 && (e.scrollHeight > e.clientHeight || e.scrollWidth > e.clientWidth)) {\n // Take previous text minus one character\n text = text.substring(0, text.length - 1);\n\n // Set the new text + suffix as textContent\n e.textContent = text + suffixToInsert;\n\n endlessLoopGuard++;\n }\n });\n }, 50);\n }\n\n $scope.copyToClipboard = copyToClipboard;\n\n function copyToClipboard(uri) {\n ModalService.openCopyToClipboardModal(uri);\n }\n\n $scope.defaultSettings = {\n linksLimit: 20,\n includeInferred: true,\n sameAsState: true,\n languages: ['en'],\n showLinksText: true,\n preferredTypes: [],\n rejectedTypes: [],\n preferredPredicates: [],\n rejectedPredicates: [\"http://dbpedia.org/property/logo\",\n \"http://dbpedia.org/property/hasPhotoCollection\",\n \"http://dbpedia.org/property/website\",\n \"http://dbpedia.org/property/homepage\",\n \"http://dbpedia.org/ontology/thumbnail\",\n \"http://xmlns.com/foaf/0.1/depiction\",\n \"http://xmlns.com/foaf/0.1/homepage\",\n \"http://xmlns.com/foaf/0.1/mbox\",\n \"http://dbpedia.org/ontology/wikiPage*\",\n \"http://dbpedia.org/property/wikiPage*\",\n \"http://factforge.net/*\"],\n preferredTypesOnly: false,\n preferredPredicatesOnly: false,\n includeSchema: true\n };\n // Static defaults before we do the actual dynamic default settings in initSettings\n $scope.saveSettings = angular.copy($scope.defaultSettings);\n\n function initSettings(principal) {\n const settingsFromPrincipal = principal.appSettings;\n\n // New style settings from principal\n $scope.defaultSettings.includeInferred = settingsFromPrincipal['DEFAULT_INFERENCE'];\n $scope.defaultSettings.sameAsState = settingsFromPrincipal['DEFAULT_INFERENCE'] && settingsFromPrincipal['DEFAULT_SAMEAS'],\n $scope.defaultSettings.includeSchema = settingsFromPrincipal['DEFAULT_VIS_GRAPH_SCHEMA'];\n\n const localStorageSettings = LocalStorageAdapter.get(LSKeys.GRAPHS_VIZ);\n if (localStorageSettings && typeof localStorageSettings === 'object') {\n // Patch existing settings\n try {\n $scope.saveSettings = localStorageSettings;\n if ($scope.saveSettings['includeSchema'] === undefined) {\n // Add the new defaults when migrating from an old GDB\n $scope.saveSettings['includeSchema'] = $scope.defaultSettings['includeSchema'];\n $scope.saveSettings['rejectedPredicates'] = [...$scope.saveSettings['rejectedPredicates'], ...$scope.defaultSettings['rejectedPredicates']].unique();\n }\n } catch (e) {\n $scope.saveSettings = angular.copy($scope.defaultSettings);\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n }\n } else {\n $scope.saveSettings = angular.copy($scope.defaultSettings);\n }\n }\n\n // Resolves race condition with security init if this is the first loaded page\n const principal = $jwtAuth.getPrincipal();\n if (principal) {\n // We already got a principal, safe to call initSettings\n initSettings(principal);\n } else {\n // No principal yet, delegate to the securityInit event to do call initSettings for us\n $scope.$on('securityInit', function () {\n initSettings($jwtAuth.getPrincipal());\n });\n }\n\n function renderSettings() {\n $scope.settings.languagesMap = _.map($scope.settings.languages, function (v) {\n return {'text': v};\n });\n\n $scope.settings.preferredTypesMap = _.map($scope.settings.preferredTypes, function (v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedTypesMap = _.map($scope.settings.rejectedTypes, function (v) {\n return {'text': v};\n });\n\n $scope.settings.preferredPredicatesMap = _.map($scope.settings.preferredPredicates, function (v) {\n return {'text': v};\n });\n\n $scope.settings.rejectedPredicatesMap = _.map($scope.settings.rejectedPredicates, function (v) {\n return {'text': v};\n });\n }\n\n $scope.resetSettings = function () {\n $scope.settings = angular.copy($scope.defaultSettings);\n $scope.validateLinksLimit();\n renderSettings();\n };\n\n $scope.changeLimit = function (delta) {\n let linksLimit = $scope.settings.linksLimit + delta;\n if (linksLimit < 1) {\n linksLimit = 1;\n }\n if (linksLimit > 1000) {\n linksLimit = 1000;\n }\n $scope.settings.linksLimit = linksLimit;\n };\n\n $scope.validateLinksLimit = function () {\n $scope.invalidLimit = !NUMBER_PATTERN.test($scope.settings.linksLimit);\n }\n\n $scope.showSettings = function () {\n $scope.showInfoPanel = true;\n $scope.showFilter = true;\n $scope.showNodeInfo = false;\n $scope.showPredicates = false;\n if (!$scope.saveSettings) {\n $scope.settings = angular.copy($scope.defaultSettings);\n } else {\n $scope.settings = angular.copy($scope.saveSettings);\n }\n renderSettings();\n };\n\n $scope.reExpandNode = function () {\n if ($scope.rootNodeIri) {\n $scope.$broadcast(\"onRootNodeChange\", $scope.rootNodeIri);\n }\n };\n\n const loadGraphForQuery = function (queryString, sameAsParam, inferredParam) {\n const sendSameAs = (sameAsParam === undefined) ? ($scope.saveSettings['sameAsState']) : sameAsParam === true;\n const sendInferred = (inferredParam === undefined) ? ($scope.saveSettings['includeInferred']) : inferredParam === true;\n $scope.loading = true;\n $http({\n url: 'rest/explore-graph/graph',\n method: 'POST',\n headers: {\n 'Content-Type' : 'application/json'\n },\n data: {\n query: queryString,\n linksLimit: $scope.saveSettings['linksLimit'],\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: sendInferred,\n sameAsState: sendSameAs\n }\n }).then(function (response) {\n // Node draw will turn off loader\n initGraphFromResponse(response);\n }, function (response) {\n $scope.loading = false;\n toastr.error(getError(response.data), $translate.instant('graphexplore.error.cannot.load.graph'));\n });\n };\n\n $scope.updateSettings = function () {\n if ($scope.invalidLimit) {\n toastr.error($scope.INVALID_LINKS_TOOLTIP, $scope.INVALID_LINKS_MSG);\n return;\n }\n $scope.saveSettings = $scope.settings;\n $scope.saveSettings.languages = _.map($scope.saveSettings['languagesMap'], function (s) {\n return s['text'];\n });\n\n $scope.saveSettings.preferredTypes = _.map($scope.saveSettings['preferredTypesMap'], function (t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedTypes = _.map($scope.saveSettings['rejectedTypesMap'], function (t) {\n return t['text'];\n });\n\n $scope.saveSettings.preferredPredicates = _.map($scope.saveSettings['preferredPredicatesMap'], function (t) {\n return t['text'];\n });\n $scope.saveSettings.rejectedPredicates = _.map($scope.saveSettings['rejectedPredicatesMap'], function (t) {\n return t['text'];\n });\n\n // TODO\n // reexpand root node\n if ($scope.rootNodeIri) {\n $scope.reExpandNode($scope.rootNodeIri);\n } else if ($scope.queryResultsMode && $location.search().query) {\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else if ($scope.configLoaded.startMode === 'query') {\n $scope.loadGraphConfig($scope.configLoaded);\n }\n\n updatePredicateLabels();\n\n $scope.showInfoPanel = false;\n $scope.showFilter = false;\n\n LocalStorageAdapter.set(LSKeys.GRAPHS_VIZ, $scope.saveSettings);\n };\n\n $scope.showInfoPanel = false;\n\n /**\n * Removes brackets and serial commas from IRIs\n * when used to create ids for links and markers,\n * because elements with ids that contain such\n * are not valid XHTML and cause a host problems\n * when trying to style individual elements\n * @param string\n * @returns {*}\n */\n function removeSpecialChars(string) {\n return string.replace(/[()']/g, \"\");\n }\n\n /**\n * Converts triple to link id or generates unique id (needed for arrows)\n * @param triple\n * @param tripleLike\n * @returns {string}\n */\n function convertTripleToLinkId(triple, tripleLike) {\n let tripleParts = triple.split(' ');\n if (tripleLike) {\n return [tripleParts[0], tripleParts[1], tripleParts[2]].join('>');\n }\n return [tripleParts[0], tripleParts[2]].join('>');\n }\n\n function convertLinkDataToLinkId(link) {\n return [link.source.iri, link.target.iri].join('>');\n }\n\n /**\n * If source or target of a link is a triple returns a x\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's x,\n * which afterwards will be overridden\n * @param node\n * @returns {number|number|*}\n */\n function getNodeX(node) {\n if (node.isTriple) {\n let el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.x !== \"undefined\") {\n return el.__data__.x;\n }\n }\n return node.x;\n }\n\n /**\n * If source or target of a link is a triple returns a y\n * for the link, otherwise returns this of the node.\n * Because tick is called before links are created we return node's y,\n * which afterwards will be overridden\n * @param node\n * @returns {number|number|*}\n */\n function getNodeY(node) {\n if (node.isTriple) {\n let el = document.getElementById(removeSpecialChars(convertTripleToLinkId(node.iri)));\n if (el && typeof el.__data__.y !== \"undefined\") {\n return el.__data__.y;\n }\n }\n return node.y;\n }\n\n function createTriple(value) {\n let tripleParts = value.trim().split(' ');\n return `<<<${tripleParts[0]}> <${tripleParts[1]}> <${tripleParts[2]}>>>`;\n }\n\n /**\n * Creates unique arrow-marker id will allow change color and refX for particular one\n * @param d\n * @returns {string}\n */\n function createArrowMarkerUniqueID(d) {\n let source = d.source.isTriple ? convertTripleToLinkId(d.source.iri, true) : d.source.iri;\n let target = d.target.isTriple ? convertTripleToLinkId(d.target.iri, true) : d.target.iri;\n return removeSpecialChars(`${source}>${target}>marker`);\n }\n\n /**\n * Filters nodes array on a given field\n * @param iri\n * @param array\n * @returns {*}\n */\n function distinctBy(iri, array) {\n let keys = array.map(function (value) { return value[iri]; });\n return array.filter(function (value, index) { return keys.indexOf(value[iri]) === index; });\n }\n\n function Graph() {\n this.nodes = [];\n this.links = [];\n this.tripleNodes = new Map();\n this.tripleLinksCopy = new Map();\n\n this.addNode = function (node, x, y) {\n node.x = x;\n node.y = y;\n this.nodes.push(node);\n return node;\n };\n\n // computes a \"connectedness\" metric on each link, which is then used to hint for longer links.\n // this results in improved clustering and appearance.\n this.computeConnectedness = function () {\n // count the the number of times a given node is connected to other nodes\n // (only for nodes connected to more than one node)\n const counts = {};\n const seenLinks = {};\n _.each(this.links, function (link) {\n const i1 = link.source.iri;\n const i2 = link.target.iri;\n const seenKey = _.min([i1, i2]) + \"|\" + _.max([i1, i2]);\n if (!seenLinks[seenKey]) {\n seenLinks[seenKey] = 1;\n counts[i1] = (counts[i1] || 0) + 1;\n counts[i2] = (counts[i2] || 0) + 1;\n }\n });\n\n // computes the connectedness of each link based on the number of times its nodes were connected\n // (only for links to/from nodes connected to more than one node)\n _.each(this.links, function (link) {\n if (counts[link.source.iri] > 1 && counts[link.target.iri] > 1) {\n link.connectedness = Math.min(5, Math.max(counts[link.source.iri], counts[link.target.iri]) - 1);\n } else {\n link.connectedness = 0;\n }\n });\n };\n\n this.addAndMatchLinks = function (newLinks) {\n const nodes = this.nodes;\n Array.prototype.push.apply(this.links, matchLinksToNodes(newLinks, nodes));\n for (let key of graph.tripleLinksCopy.keys()) {\n if (graph.tripleLinksCopy.get(key).length === 1) {\n graph.tripleLinksCopy.delete(key);\n }\n }\n this.links = this.links.filter(link => link !== null);\n this.computeConnectedness();\n };\n\n const countLinks = function (d, links) {\n return findLinksForNode(d, links).length;\n };\n\n this.countLinks = countLinks;\n\n function findLinksForNode(d, links) {\n return _.filter(links, function (l) {\n return l.source.iri === d.iri || l.target.iri === d.iri;\n });\n }\n\n function linksTypes(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const types = _.map(linksForNode, function (l) {\n return (l.source.iri === d.iri ) ? l.target.types : l.source.types;\n });\n return _.uniq(_.flatten(types));\n }\n\n function linksPredicates(d, links) {\n const linksForNode = findLinksForNode(d, links);\n const predicates = _.map(linksForNode, function (l) {\n return l.predicates;\n });\n return _.uniq(_.flatten(predicates));\n }\n\n this.linksTypes = linksTypes;\n\n this.linksPredicates = linksPredicates;\n\n /**\n * Removes generated triple links and related nodes\n * @param triplesToRemove\n */\n this.removeTriples = function (triplesToRemove) {\n let targetTriples = [];\n if (this.tripleNodes.size > 0) {\n triplesToRemove.forEach((source) => {\n if (this.tripleNodes.has(source)) {\n this.tripleNodes.delete(source);\n this.links = _.reject(this.links, function (l) {\n let sourceSplit = source.split('>');\n let lSource = convertTripleToLinkId(l.source.iri);\n let lTarget = convertTripleToLinkId(l.target.iri);\n // Handle triple targets\n if (lSource === source && graph.tripleNodes.delete(lTarget)) {\n let targetSplit = lTarget.split('>');\n targetTriples.push({\n source: targetSplit[0],\n target: targetSplit[1]\n });\n }\n let isRejected = lSource === source || lTarget === source || (l.source.iri === sourceSplit[0] && l.target.iri === sourceSplit[1]);\n if (isRejected) {\n graph.tripleLinksCopy.delete(`${lSource}>${lTarget}`);\n graph.tripleLinksCopy.delete(`${lTarget}>${lSource}`);\n }\n return isRejected;\n });\n }\n });\n }\n\n // This step is needed for removing artificially created links representing triples\n targetTriples.forEach((target) => {\n this.links = _.reject(this.links, function (l) {\n return l.source.iri === target.source && l.target.iri === target.target;\n });\n });\n }\n\n this.removeNode = function (d) {\n let triplesToRemove = [];\n this.links = _.reject(this.links, function (l) {\n let isRejected = l.source.iri === d.iri || l.target.iri === d.iri;\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'))\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n const links = this.links;\n this.nodes = _.reject(this.nodes, function (n) {\n return countLinks(n, links) === 0;\n });\n if (this.nodes.length === 0) {\n $scope.nodeSelected = false;\n }\n\n this.computeConnectedness();\n };\n\n this.removeNodeLeafLinks = function (d) {\n let triplesToRemove = [];\n let links = this.links;\n this.links = _.reject(this.links, function (l) {\n let isRejected = (l.source.iri === d.iri && countLinks(l.target, links) === 1 && !l.target.isTriple) ||\n (l.target.iri === d.iri && countLinks(l.source, links) === 1 && !l.source.isTriple);\n if (!isRejected) {\n let targetLinks;\n if (l.source.iri === d.iri && countLinks(l.target, links) === 2 && !l.target.isTriple) {\n targetLinks = findLinksForNode(l.target, links);\n } else if (l.target.iri === d.iri && countLinks(l.source, links) === 2 && !l.source.isTriple) {\n targetLinks = findLinksForNode(l.source, links);\n }\n if (!targetLinks) {\n return false;\n }\n // the node to which (or from which) d has link to has only two links, check if the second one is to d also\n isRejected = (targetLinks[0].source.iri === d.iri || targetLinks[0].target.iri) &&\n (targetLinks[1].source.iri === d.iri || targetLinks[1].target.iri);\n }\n if (isRejected) {\n if (l.target.isTriple) {\n triplesToRemove.push(convertTripleToLinkId(l.target.iri));\n }\n if (!l.source.isTriple && !l.target.isTriple) {\n triplesToRemove.push([l.source.iri, l.target.iri].join('>'))\n }\n }\n return isRejected;\n });\n\n this.removeTriples(triplesToRemove);\n\n links = this.links;\n this.nodes = _.reject(this.nodes, function (n) {\n return countLinks(n, links) === 0 && n.iri !== d.iri;\n });\n\n this.computeConnectedness();\n };\n\n this.addTriple = function (triple, x, y) {\n triple.x = x;\n triple.y = y;\n triple.weight = 0;\n let key = convertTripleToLinkId(triple.iri);\n if (!this.tripleNodes.has(key)) {\n triple.weight = 10;\n this.tripleNodes.set(key, [triple]);\n } else {\n let value = this.tripleNodes.get(key);\n value.push(triple);\n this.tripleNodes.set(key, value);\n }\n }\n\n function matchLinksToNodes(newLinks, nodes) {\n return _.map(newLinks, function (link) {\n let source;\n let target;\n if (link.isTripleSource) {\n source = getTripleNode(link.source);\n } else {\n source = _.find(nodes, function (o) {\n return o.iri === link.source;\n })\n }\n if (link.isTripleTarget) {\n target = getTripleNode(link.target);\n } else {\n target = _.find(nodes, function (o) {\n return o.iri === link.target;\n })\n }\n let matchedLink = {\n \"source\": source,\n \"target\": target,\n \"predicates\": link.predicates\n };\n // make copy of links with triples in them\n if (link.isTripleSource || link.isTripleTarget) {\n let sourceId = matchedLink.source.isTriple ? convertTripleToLinkId(matchedLink.source.iri) : matchedLink.source.iri;\n let targetId = matchedLink.target.isTriple ? convertTripleToLinkId(matchedLink.target.iri) : matchedLink.target.iri;\n let linkId = `${sourceId}>${targetId}`;\n if (graph.tripleLinksCopy.has(linkId)) {\n let value = graph.tripleLinksCopy.get(linkId);\n value[0].predicates.push(...matchedLink.predicates);\n value.push(matchedLink);\n graph.tripleLinksCopy.set(linkId, value);\n return null;\n } else {\n graph.tripleLinksCopy.set(linkId, [matchedLink]);\n }\n }\n return matchedLink;\n });\n }\n\n this.copyState = function () {\n const nodesCopy = _.map(this.nodes, function (node) {\n return {\n iri: node.iri,\n isTriple: node.isTriple,\n size: node.size,\n labels: angular.copy(node.labels),\n types: angular.copy(node.types),\n rdfRank: node.rdfRank,\n x: node.x,\n y: node.y,\n fixed: node.fixed\n };\n });\n\n const triplesCopy = JSON.stringify(Array.from(this.tripleNodes.entries()));\n const tripleLinksCopy = JSON.stringify(Array.from(this.tripleLinksCopy.entries()));\n\n const linksCopy = _.map(this.links, function (link) {\n return {\n source: link.source.iri,\n isTripleSource: link.source.isTriple,\n target: link.target.iri,\n isTripleTarget: link.target.isTriple,\n predicates: link.predicates\n };\n });\n\n return {\n nodes: nodesCopy,\n links: linksCopy,\n tripleNodes: triplesCopy,\n tripleLinksCopy: tripleLinksCopy,\n colorIndex: colorIndex,\n type2color: type2color,\n scale: panAndZoom.scale(),\n translate: panAndZoom.translate()\n };\n };\n\n this.restoreState = function (state) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n\n this.nodes = angular.copy(state.nodes);\n // check if triples exists is needed for old configs\n this.tripleNodes = state.tripleNodes ? new Map(JSON.parse(state.tripleNodes)) : new Map();\n this.links = [];\n this.addAndMatchLinks(state.links);\n this.tripleLinksCopy = state.tripleLinksCopy ? new Map(JSON.parse(state.tripleLinksCopy)) : new Map();\n\n _.each(this.nodes, function (d) {\n if (d.fixed) {\n $scope.numberOfPinnedNodes++;\n }\n });\n\n if (angular.isDefined(state.colorIndex) && angular.isDefined(state.type2color)) {\n colorIndex = state.colorIndex;\n type2color = angular.copy(state.type2color);\n }\n\n if (angular.isDefined(state.translate) && angular.isDefined(state.scale)) {\n transformValues = \"translate(\" + state.translate[0] + \", \" + state.translate[1] + \") scale(\" + state.scale + \")\";\n panAndZoom.translate(state.translate);\n panAndZoom.scale(state.scale);\n }\n\n draw();\n };\n }\n\n let graph = new Graph();\n\n $scope.defaultGraphConfig = {\n id: 'default',\n name: 'Easy graph',\n startMode: 'search'\n };\n\n // Graph Config\n $scope.getGraphConfigs = function (graphCallback) {\n GraphConfigRestService.getGraphConfigs()\n .success(function (data) {\n $scope.graphConfigs = data;\n if (graphCallback) {\n graphCallback();\n }\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.configs.short.msg'));\n });\n };\n\n $scope.loadConfigForId = function (configId, successCallback) {\n if (configId === $scope.defaultGraphConfig.id) {\n $scope.loadGraphConfig($scope.defaultGraphConfig);\n } else {\n GraphConfigRestService.getConfig(configId)\n .success(function (data) {\n $scope.loadGraphConfig(data);\n successCallback();\n })\n .error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.could.not.load.config', {configId: configId}));\n });\n }\n };\n\n $scope.findConfigById = function (configId) {\n if (configId === $scope.defaultGraphConfig.id) {\n return $scope.defaultGraphConfig;\n }\n return $.grep($scope.graphConfigs, function (e) {\n return e.id === configId;\n })[0];\n };\n\n $scope.easyGraphSearch = function (iri) {\n $scope.configLoaded = $scope.defaultGraphConfig;\n $scope.openUri(iri);\n };\n\n $scope.loadGraphConfig = function (config) {\n $scope.configLoaded = config;\n if (config.startMode === 'search') {\n $scope.searchVisible = true;\n } else if (config.startMode === 'node' && config.startIRI) {\n $timeout(function () {\n $scope.openUri(config.startIRI, true);\n }, 0);\n } else if (config.startMode === 'query' && config.startGraphQuery) {\n $scope.loading = true;\n GraphConfigRestService.loadGraphForConfig(config, config.startQueryIncludeInferred, $scope.saveSettings['linksLimit'], config.startQuerySameAs)\n .then(function (response) {\n // Node drawing will turn off loader\n initGraphFromResponse(response);\n }, function (data) {\n $scope.loading = false;\n toastr.error(getError(data), $translate.instant('graphexplore.error.graph.load'));\n });\n }\n };\n\n $scope.deleteConfig = function (config) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.delete.graph', {configName: config.name}),\n warning: true\n }).result\n .then(function () {\n GraphConfigRestService.deleteGraphConfig(config)\n .success(function () {\n $scope.getGraphConfigs();\n $scope.refreshSavedGraphs();\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.cannot.delete.config'));\n });\n });\n };\n\n $scope.goToGraphConfig = function (config) {\n $scope.pushHistory({config: config.id}, {config: config});\n $scope.resetState();\n $scope.loadGraphConfig(config);\n };\n\n $window.onpopstate = function (event) {\n $scope.resetState();\n\n if (event.state) {\n if (event.state.config) {\n $scope.loadGraphConfig(event.state.config);\n if (event.state.uri) {\n $scope.openUri(event.state.uri, true);\n }\n } else if (event.state.savedGraph) {\n $scope.loadSavedGraph(event.state.savedGraph, true);\n }\n }\n };\n\n const initGraphFromQueryParam = function () {\n // view sparql\n if ($location.search().query) {\n $scope.searchVisible = false;\n $scope.queryResultsMode = true;\n loadGraphForQuery($location.search().query,\n $location.search().sameAs,\n $location.search().inference);\n } else {\n // broadcasted event from view resource directive to take input value\n $scope.$on('onRootNodeChange', function (e, inputValue) {\n $scope.loading = true;\n if (angular.isDefined(inputValue)) {\n $scope.rootNodeIri = inputValue;\n $http({\n url: 'rest/explore-graph/node',\n method: 'GET',\n params: {\n iri: inputValue,\n config: $scope.configLoaded ? $scope.configLoaded.id : $scope.defaultGraphConfig.id,\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: $scope.saveSettings['includeInferred'],\n sameAsState: $scope.saveSettings['sameAsState']\n }\n }).then(function (response) {\n $scope.nodeSelected = true;\n $scope.searchVisible = false;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n const rootNode = graph.addNode(response.data, width / 2, height / 2);\n\n transformValues = \"translate(0, -70) scale(1)\";\n panAndZoom.translate([0, -70]);\n panAndZoom.scale(1);\n\n expandNode(rootNode, true);\n }).catch(function (err) {\n $scope.loading = false;\n toastr.error(getError(err), $translate.instant('graphexplore.error.could.not.load.graph'));\n });\n }\n });\n }\n\n if ($location.search().uri) {\n $scope.openUri($location.search().uri);\n }\n\n if ($location.search().saved) {\n SavedGraphsRestService.getSavedGraph($location.search().saved)\n .success(function (data) {\n $scope.loadSavedGraph(data);\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.could.not.open'));\n });\n }\n };\n\n const loadGraphFromQueryParam = function () {\n // view graph config\n if ($location.search().config) {\n $scope.loadConfigForId($location.search().config, initGraphFromQueryParam);\n } else if ($location.search().query || $location.search().uri) {\n $scope.loadGraphConfig($scope.defaultGraphConfig);\n initGraphFromQueryParam();\n } else {\n initGraphFromQueryParam();\n }\n };\n\n $scope.replaceIRIWithPrefix = function (iri) {\n const namespaces = $scope.namespaces;\n const namespacePrefix = _.findLast(namespaces, function (o) {\n return iri.indexOf(o.uri) === 0;\n });\n return namespacePrefix ? (namespacePrefix.prefix + \":\" + iri.substring(namespacePrefix.uri.length)) : iri;\n };\n\n function expandPrefix(str, namespaces) {\n const ABS_URI_REGEX = /^<?(http|urn).*>?/;\n if (!ABS_URI_REGEX.test(str)) {\n const uriParts = str.split(':');\n const uriPart = uriParts[0];\n const localName = uriParts[1];\n if (!angular.isUndefined(localName)) {\n const expandedUri = ClassInstanceDetailsService.getNamespaceUriForPrefix(namespaces, uriPart);\n if (expandedUri) {\n return expandedUri + localName;\n }\n }\n }\n return str;\n }\n\n $scope.addedTag = function (tag) {\n if (tag.text.indexOf(':') < 0) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'));\n return null;\n }\n tag.text = expandPrefix(tag.text, $scope.namespaces);\n $scope.pageslideExpanded = true;\n return tag;\n };\n\n $scope.validateTag = function (tag, category, wildcardOK) {\n if (tag.text.indexOf(':') < 0) {\n if (wildcardOK) {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri.option'), category);\n } else {\n toastr.warning($translate.instant('graphexplore.absolute.prefixed.iri'), category);\n }\n return false;\n }\n const wildcardPos = tag.text.indexOf('*');\n if (wildcardPos >= 0) {\n if (!wildcardOK) {\n toastr.warning($translate.instant('graphexplore.wildcards.not.allowed'), category);\n return false;\n } else if (wildcardPos < tag.text.length - 1) {\n toastr.warning($translate.instant('graphexplore.wildcards.last.char'), category);\n return false;\n }\n }\n return true;\n };\n\n $scope.getTagClass = function (tagText) {\n if (tagText.endsWith('*')) {\n return 'tag-item-wildcard';\n }\n return null;\n };\n\n $scope.getActiveRepository = function () {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLicenseValid = function() {\n return $licenseService.isLicenseValid();\n }\n\n // Flag to avoid calling repo init logic twice\n $scope.hasInitedRepository = false;\n\n // This method may be called twice - once by us explicitly and once by the repositoryInit event.\n // In some race conditions getActiveRepository() will be already set when we enter it the first\n // time but then we'll be called again by the event, so we need the above flag to avoid double\n // initialization and weirdness.\n function initForRepository(newRepo) {\n if (!$repositories.getActiveRepository() || $scope.hasInitedRepository && !newRepo) {\n return;\n }\n\n $scope.hasInitedRepository = true;\n\n if (!newRepo) {\n // Process params only if this isn't a repo that was just selected from the dropdown menu\n $scope.getGraphConfigs(loadGraphFromQueryParam);\n }\n\n // Inits namespaces for repo\n $scope.getNamespacesPromise = RDF4JRepositoriesRestService.getNamespaces($scope.getActiveRepository())\n .success(function (data) {\n const nss = _.map(data.results.bindings, function (o) {\n return {\"uri\": o.namespace.value, \"prefix\": o.prefix.value};\n });\n $scope.namespaces = _.sortBy(nss, function (n) {\n return n.uri.length;\n });\n\n checkAutocompleteStatus();\n }).error(function (data) {\n toastr.error(getError(data), $translate.instant('graphexplore.error.view.will.not.work'));\n });\n }\n\n function checkAutocompleteStatus() {\n if ($licenseService.isLicenseValid()) {\n $scope.getAutocompletePromise = AutocompleteRestService.checkAutocompleteStatus();\n }\n }\n\n $scope.$on('autocompleteStatus', function() {\n checkAutocompleteStatus();\n });\n\n $scope.$on('repositoryIsSet', function (event, args) {\n // New repo set from dropdown, clear init state\n if (args.newRepo) {\n $scope.hasInitedRepository = false;\n }\n\n initForRepository(args.newRepo);\n\n // New repo set from dropdown, clear state and go to home page\n if (args.newRepo) {\n $scope.resetState();\n // Quick-n-dirty way to get rid of the existing vis\n $('.graph-visualization svg').empty();\n\n // When we come from the sparql view and then change the repo though the dropdown,\n // should goToHome and reinit the view, for the search to view on the home page\n if ($location.search().query) {\n $scope.goToHome();\n initGraphFromQueryParam();\n }\n\n }\n });\n\n initForRepository();\n\n const multiClickDelay = 500; // max delay between clicks for multiple click events\n\n const nodeLabelRectScaleX = 1.75;\n\n const color1 = d3.scale.linear()\n .domain([0, 9])\n .range([\"hsl(0, 100%, 75%)\", \"hsl(360, 90%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n const color2 = d3.scale.linear()\n .domain([0, 9])\n .range([\"hsl(180, 50%, 75%)\", \"hsl(540, 40%, 82%)\"])\n .interpolate(d3.interpolateHslLong);\n\n $scope.getColor = function (type) {\n if (angular.isUndefined(type2color[type])) {\n type2color[type] = colorIndex;\n colorIndex++;\n }\n\n const index = type2color[type];\n if (index > 39) {\n return \"#c2c2c2\";\n } else if (index % 2 === 0) {\n return color1(index / 2);\n } else {\n return color2(index / 2);\n }\n };\n\n const force = d3.layout.force()\n .gravity(0.07)\n .size([width, height]);\n\n const svg = d3.select(\".main-container .graph-visualization\").append(\"svg\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr(\"preserveAspectRatio\", \"xMidYMid meet\");\n\n let showNodeTipAndIconsTimer = 0;\n let removeIconsTimer = 0;\n\n const loader = new Loader();\n\n function draw(resetRootNode) {\n // remove all group elements and rec to rebuild the graph when the user clicks on it\n d3.selectAll(\"svg g\").remove();\n d3.selectAll(\"svg rect\").remove();\n d3.selectAll('.d3-tip').remove();\n d3.selectAll('.menu-events').remove();\n\n // zoom and drag event\n panAndZoom.on(\"zoom\", panAndZoomed);\n\n // building rectangular so we can bind zoom and drag effects\n svg.append(\"rect\")\n .attr(\"width\", width * 10)\n .attr(\"height\", height * 10)\n .attr(\"x\", -(width * 10 - width) / 2)\n .attr(\"y\", -(height * 10 - height) / 2)\n .style(\"fill\", \"none\")\n .style(\"pointer-events\", \"all\")\n .call(panAndZoom)\n .on(\"click\", function () {\n d3.event.stopPropagation();\n removeMenuIfVisible();\n // Clicking outside the graph stops the layout\n force.stop();\n });\n\n\n const container = svg.append(\"g\").attr(\"class\", \"nodes-container\")\n .attr(\"transform\", function () {\n if (angular.isDefined(transformValues) && !resetRootNode) {\n return transformValues;\n }\n return '';\n });\n\n const tip = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function () {\n const bbox = tipElement.getBoundingClientRect();\n return {\n top: (bbox.bottom + 10) + 'px',\n left: (bbox.left - 30) + 'px'\n };\n })\n .html(function (d) {\n let html = '';\n\n if (d.fixed) {\n // add pin icon if pinned down\n html += '<i class=\"icon-pin\"></i> ';\n }\n\n if (d.types.length > 0) {\n // mid-dot delimited types\n html += _.join(_.map(d.types, function (t) {\n return $scope.replaceIRIWithPrefix(t);\n }), ' \\u00B7 ');\n } else {\n html += '<i>No types</i>';\n }\n\n return html;\n });\n\n const numberOfPredLeft = function (d) {\n return d.predicates.length - 10;\n };\n\n // This will create text that will appear in d3tip\n const createTipText = function (d) {\n let html = '';\n html += _.join(_.map(d.predicates, function (p, index) {\n if (index === 0) {\n return getShortPredicate(p);\n // If we have less than or ten predicates should show them with middle dot separated\n } else if (index < 10) {\n return ' \\u00B7 ' + getShortPredicate(p);\n // On eleventh predicate just append how many more predicates left to show to the user\n } else if (index === 10) {\n const numOfPredLeft = numberOfPredLeft(d);\n // Show how many predicates left\n const textToShow = numOfPredLeft > 1 ? numOfPredLeft + ' predicates'\n : numOfPredLeft + ' predicate';\n return ' \\u00B7 ' + $translate.instant('graphexplore.tip.text', {textToShow: textToShow});\n }\n }), '');\n\n return html;\n };\n\n const calculateWidth = function (d) {\n const text = createTipText(d);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext(\"2d\");\n ctx.font = \"13px Arial\";\n\n if (d.predicates.length < 10) {\n return ctx.measureText(text).width;\n } else {\n return ctx.measureText(text).width / 2;\n }\n };\n\n let tipPredicateElement;\n let tipPredicateTimer;\n\n const tipPredicates = d3tip()\n .attr('class', 'd3-tip')\n .customPosition(function (d) {\n const bbox = tipPredicateElement.getBoundingClientRect();\n const textWidth = calculateWidth(d);\n return {\n top: (bbox.top - 30) + 'px',\n left: (bbox.left - 30) + 'px',\n width: textWidth + 'px'\n };\n })\n .html(function (d) {\n return createTipText(d);\n });\n\n let tipTimer;\n // Shows the tooltip for a node but with a slight delay\n const showTipForNode = function (d, event) {\n $timeout.cancel(tipTimer);\n const thisTipElement = tipElement = event.target;\n $timeout(function () {\n if (tipElement === thisTipElement) {\n tip.show(d, tipElement);\n }\n }, 300);\n };\n\n // Hides the tooltip for the node and resets some variables\n const hideTipForNode = function () {\n $timeout.cancel(tipTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n tipElement = null;\n tip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n };\n\n // Updates the text in the tooltip if already visible\n const updateTipForNode = function (d) {\n if (tipElement) {\n tip.show(d, tipElement);\n }\n };\n\n svg.call(tip);\n\n // Shows like tooltip list of predicates but with a slight delay\n const showPredicateToolTip = function (d) {\n $timeout.cancel(tipPredicateTimer);\n const thisPredicateTipElement = tipPredicateElement = d3.event.target;\n $timeout(function () {\n if (tipPredicateElement === thisPredicateTipElement && d.predicates.length > 1) {\n tipPredicates.show(d, tipPredicateElement);\n }\n }, 300);\n };\n\n // Hides the tooltip with predicates and resets some variables\n const hidePredicateToolTip = function () {\n $timeout.cancel(tipPredicateTimer);\n tipPredicateElement = null;\n tipPredicates.hide();\n };\n\n svg.call(tipPredicates);\n\n let link = svg.selectAll(\".link\");\n let node = svg.selectAll(\".node\");\n\n force.nodes(graph.nodes).charge(-3000);\n\n force.links(graph.links).linkDistance(function (l) {\n if (l.source.isTriple || l.target.isTriple) {\n return 0;\n }\n // link distance depends on length of text with an added bonus for strongly connected nodes,\n // i.e. they will be pushed further from each other so that their common nodes can cluster up\n return getPredicateTextLength(l) + 30 * l.connectedness;\n });\n\n // arrow markers\n container.append(\"defs\").selectAll(\"marker\")\n .data(force.links())\n .enter().append(\"marker\")\n .attr(\"class\", \"arrow-marker\")\n .attr(\"id\", function (d) {\n return createArrowMarkerUniqueID(d);\n })\n .attr(\"viewBox\", \"0 -5 10 10\")\n .attr(\"refX\", function (d) {\n // The positioning of the arrow for triple target nodes differ from normal ones\n return d.target.isTriple ? 11 : d.target.size + 11;\n })\n .attr(\"refY\", 0)\n .attr(\"markerWidth\", 10)\n .attr(\"markerHeight\", 10)\n .attr(\"orient\", \"auto\")\n .append(\"path\")\n .attr(\"d\", \"M0,-5L10,0L0,5 L10,0 L0, -5\");\n\n // add the links, nodes, predicates and node labels\n link = container.selectAll(\".link\")\n .data(graph.links)\n .enter().append(\"g\")\n .attr(\"class\", \"link-wrapper\")\n .attr(\"id\", function (d) {\n return removeSpecialChars(convertLinkDataToLinkId(d));\n })\n .append(\"line\")\n .attr(\"class\", \"link\")\n .style(\"stroke-width\", 1)\n .style(\"fill\", \"transparent\")\n .style(\"marker-end\", function (d) {\n let targetArrowId = createArrowMarkerUniqueID(d);\n return `url(#${targetArrowId})`;\n });\n\n const predicate = container.selectAll(\".link-wrapper\")\n .append(\"text\")\n .text(function (d) {\n return getPredicate(d);\n })\n .attr(\"class\", function (d) {\n if (d.predicates.length > 1 || graph.tripleNodes.has(convertLinkDataToLinkId(d))) {\n return \"predicates\";\n }\n return \"predicate\";\n })\n .attr(\"dy\", \"-0.5em\")\n .style(\"text-anchor\", \"middle\")\n .style(\"display\", $scope.saveSettings.showLinksText ? \"\" : \"none\")\n .on(\"mouseover\", function (d) {\n d3.event.stopPropagation();\n showPredicateToolTip(d);\n })\n .on('mouseout', hidePredicateToolTip)\n .on(\"click\", function (d) {\n d3.event.stopPropagation();\n linkActions(d);\n });\n\n // node events and variables\n let mouseEventTimer;\n let upEventLast = 0;\n let virtualClickEventTimer = 0;\n let moveEventCount = 0;\n\n // tracks mousedown and touchstart events in order to count single or double click\n // (checked in upEventHandler)\n const downEventHandler = function () {\n if (d3.event.button && d3.event.button !== 0) {\n return;\n }\n\n hideTipForNode();\n $timeout.cancel(mouseEventTimer);\n $scope.showPredicates = false;\n if (d3.event.timeStamp - upEventLast < multiClickDelay) {\n virtualClickEventTimer++;\n } else {\n virtualClickEventTimer = 1;\n }\n\n upEventLast = d3.event.timeStamp;\n\n d3.event.preventDefault();\n };\n\n // builds upon downEventHandler and adds additional functionality for touch devices\n const touchStartEventHandler = function (d) {\n downEventHandler();\n\n // for touch devices we track touch and hold for 1s in order to remove a node\n moveEventCount = 0;\n mouseEventTimer = $timeout(function () {\n if (moveEventCount < 5) {\n // remove the node only if not many move events were fired,\n // this avoids conflict with dragging nodes\n hideNode(d);\n }\n mouseEventTimer = null;\n virtualClickEventTimer = 0;\n }, 1000);\n };\n\n // tracks the number of move events (checked in the touchend event handler)\n const moveEventHandler = function () {\n moveEventCount++;\n };\n\n const showNodeTipAndIcons = function (d) {\n if (!d.isBeingDragged) {\n const event = d3.event;\n $timeout.cancel(removeIconsTimer);\n showNodeTipAndIconsTimer = $timeout(() => {\n if (expandNodeIcons(d, this)) {\n showTipForNode(d, event);\n }\n }, 400);\n }\n };\n\n const upEventHandler = function (d) {\n if (d3.event.button && d3.event.button !== 0) {\n return;\n }\n\n $timeout.cancel(mouseEventTimer);\n\n const event = d3.event;\n const element = this;\n if (d3.event.timeStamp - upEventLast < multiClickDelay) {\n if (virtualClickEventTimer === 1) {\n mouseEventTimer = $timeout(function () {\n clickedNode(d, element, event);\n }, 40 + multiClickDelay - (d3.event.timeStamp - upEventLast));\n } else if (virtualClickEventTimer === 2) {\n // expand node\n const shownLinks = graph.countLinks(d, graph.links);\n if (shownLinks <= $scope.saveSettings['linksLimit']) {\n expandNode(d, false, element.parentNode);\n } else {\n toastr.info($translate.instant('graphexplore.increase.limit'), $translate.instant('graphexplore.node.at.max'));\n }\n $scope.closeInfoPanel();\n }\n }\n\n d3.event.preventDefault();\n };\n\n // Shows growing or shrinking pin animation\n function showPinAnimation(d, type) {\n let startSize;\n let endSize;\n let startOpacity;\n let endOpacity;\n let animate = true;\n\n if (type === 'down') {\n startSize = d.size * 2;\n endSize = d.size / 3;\n startOpacity = 0.8;\n endOpacity = 0.3;\n } else if (type === 'down-fixed') {\n startSize = d.size * 2;\n endSize = d.size;\n startOpacity = 0.8;\n endOpacity = 0.66;\n } else if (type === 'up') {\n startSize = d.size / 3;\n endSize = d.size * 2;\n startOpacity = 0.3;\n endOpacity = 0.8;\n } else if (type === 'fixed') {\n startSize = d.size;\n startOpacity = 0.66;\n animate = false;\n } else {\n return; // unknown\n }\n\n let pin = container.selectAll('.node-wrapper')\n .filter(function (innerD) {\n return innerD === d;\n })\n .append('text')\n .text('\\ue90f') // pin icon\n .classed('icon-any pinned', true)\n .style('font-size', startSize + 'px')\n .attr('x', function (d) {\n return d.x;\n })\n .attr('y', function (d) {\n return d.y;\n })\n .attr('opacity', startOpacity);\n\n if (type === 'fixed' || type === 'down-fixed') {\n d.pin = pin;\n }\n\n if (animate) {\n pin = pin.transition()\n .duration(1000)\n .style('font-size', function () {\n return endSize + 'px';\n })\n .attr('opacity', endOpacity);\n\n if (type !== 'down-fixed') {\n pin.remove();\n }\n }\n }\n\n function removePin() {\n d3.select('.pinned').remove();\n }\n\n // Unfixes nodes that were dragged previously\n const rightClickHandler = function (d) {\n if (d3.event.shiftKey) {\n // Do nothing with shift key, use to access context menu\n return;\n }\n\n d3.event.preventDefault();\n\n removeMenuIfVisible();\n $scope.closeInfoPanel();\n\n if (d.fixed) {\n // unpin\n $scope.numberOfPinnedNodes--;\n d.fixed = false;\n showPinAnimation(d, 'up');\n force.resume();\n } else {\n // pin down\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down');\n }\n // update pin in tooltip\n updateTipForNode(d);\n };\n\n const drag = d3.behavior.drag()\n .origin(function (d) {\n return d;\n })\n .on(\"dragstart\", dragstarted)\n .on(\"drag\", dragged)\n .on(\"dragend\", dragended);\n\n\n function dragstarted(d) {\n if (d3.event.sourceEvent.button === 0) {\n d.fixedBeforeDrag = d.fixed;\n d.isBeingDragged = true;\n d.beginDragging = true;\n removeMenuIfVisible();\n d3.event.sourceEvent.stopPropagation();\n d3.select(this).classed(\"dragging\", true);\n }\n }\n\n function dragged(d) {\n if (d.isBeingDragged) {\n // reset click counter to avoid conflicts between clicks and drags\n virtualClickEventTimer = 0;\n\n d.px = d3.event.x;\n d.py = d3.event.y;\n if (!d.fixed) {\n $scope.numberOfPinnedNodes++;\n d.fixed = true;\n showPinAnimation(d, 'down-fixed');\n } else if (d.beginDragging) {\n showPinAnimation(d, 'fixed');\n }\n d.pinWasFixed = true;\n d.beginDragging = null;\n\n force.resume();\n }\n }\n\n function dragended(d) {\n if (d.isBeingDragged) {\n if (d.pinWasFixed) {\n d.pinWasFixed = null;\n removePin();\n }\n d.isBeingDragged = false;\n d3.select(this).classed(\"dragging\", false);\n }\n }\n\n node = container.selectAll(\".node\")\n .data(graph.nodes)\n .enter().append(\"g\")\n .attr(\"class\", \"node-wrapper\")\n .attr(\"id\", function (d) {\n return d.iri;\n })\n .append(\"circle\")\n .attr(\"class\", \"node\")\n .attr(\"r\", function (d) {\n return d.size;\n })\n .style(\"fill\", function (d) {\n if (d.types === \"greyColor\") {\n return \"c2c2c2\";\n }\n return $scope.getColor(d.types[0]);\n })\n .call(drag)\n .on('mouseover', showNodeTipAndIcons)\n .on('mouseout', hideTipForNode)\n .on(\"mousedown\", downEventHandler)\n .on(\"touchstart\", touchStartEventHandler)\n // no need to track move for mouse\n .on(\"touchmove\", moveEventHandler)\n .on(\"mouseup\", upEventHandler)\n .on(\"touchend\", upEventHandler)\n .on(\"contextmenu\", rightClickHandler);\n\n const nodeLabels = container.selectAll(\".node-wrapper\").append(\"foreignObject\")\n .style(\"pointer-events\", \"none\")\n .attr(\"width\", function (d) {\n return d.size * 2 * nodeLabelRectScaleX;\n });\n // height will be computed by updateNodeLabels\n\n container.insert(\"g\").attr(\"class\", \"menu-events\");\n\n updateNodeLabels(nodeLabels);\n\n force.on(\"tick\", function () {\n // recalculate nodes positions and repel them if they collide\n let q = d3.geom.quadtree(graph.nodes);\n let i = 0;\n const n = graph.nodes.length;\n // FIXME while (++i < n) q.visit(collide(graph.nodes[i]));\n\n // recalculate links attributes\n link.attr(\"x1\", function (d) {\n return getNodeX(d.source);\n }).attr(\"y1\", function (d) {\n return getNodeY(d.source);\n }).attr(\"x2\", function (d) {\n return getNodeX(d.target);\n }).attr(\"y2\", function (d) {\n return getNodeY(d.target);\n });\n\n // recalculate predicates attributes\n predicate.attr(\"x\", function (d) {\n let sourceX = getNodeX(d.source);\n let targetX = getNodeX(d.target);\n return d.x = (sourceX + targetX) * 0.5;\n }).attr(\"y\", function (d) {\n let sourceY = getNodeY(d.source);\n let targetY = getNodeY(d.target);\n return d.y = (sourceY + targetY) * 0.5;\n }).attr(\"transform\", function (d) {\n const angle = findAngleBetweenNodes(d, d.direction);\n return \"rotate(\" + angle + \", \" + d.x + \", \" + d.y + \")\";\n });\n\n // recalculate nodes attributes\n node.attr(\"cx\", function (d) {\n return d.x;\n }).attr(\"cy\", function (d) {\n return d.y;\n });\n\n // update node loader position\n container.select(\".node-loader\").attr(\"x\", function (d) {\n return d.x - d.size + 3; //square svg is not perfectly centered and need +3 units on x ordinate to fit in circle\n }).attr(\"y\", function (d) {\n return d.y - d.size;\n });\n\n container.select(\".loader-container\").attr(\"cx\", function (d) {\n return d.x;\n }).attr(\"cy\", function (d) {\n return d.y;\n });\n\n nodeLabels.attr(\"x\", function (d) {\n return d.x - (d.size * nodeLabelRectScaleX);\n }).attr(\"y\", function (d) {\n // the height of the nodeLabel box is 3 times the fontSize computed by updateNodeLabels\n // and we want to offset it so that its middle matches the centre of the circle, hence divided by 2\n return d.y - 3 * d.fontSize / 2;\n });\n\n // Update position of shrinking pin animation (if any)\n d3.select('.pinned').attr(\"x\", function (d) {\n return d.x;\n }).attr(\"y\", function (d) {\n return d.y;\n });\n });\n\n function panAndZoomed() {\n transformValues = \"translate(\" + d3.event.translate + \") scale(\" + d3.event.scale + \")\";\n container.attr(\"transform\", transformValues);\n }\n\n if (angular.isDefined(loader)) {\n loader.setLoadingState(false);\n }\n\n if ($scope.loading) {\n $scope.loading = false;\n }\n\n d3.selectAll('.link-wrapper').each(function () {\n const source = $(this).attr(\"id\").split(\">\")[0];\n const target = $(this).attr(\"id\").split(\">\")[1];\n d3.selectAll('.link').each(function (link) {\n let sourceId = removeSpecialChars(link.source.iri);\n let targetId = removeSpecialChars(link.target.iri);\n if (sourceId === target && targetId === source) {\n let twoWayLinkID = sourceId;\n twoWayLinkID += \">\";\n twoWayLinkID += targetId;\n const textNode = document.createTextNode(' \\u27F6');\n document.getElementById(twoWayLinkID).lastChild.appendChild(textNode);\n link.direction = \"double\";\n }\n });\n });\n\n d3.selectAll('.d3-actions-tip').remove();\n\n force.start();\n }\n\n /* FIXME\n // check for collision of the nodes\n function collide(node, bigger) {\n return function (quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n var x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.size + quad.point.size;\n if (l < r) {\n l = (l - r) / l * .5;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n */\n\n draw();\n\n // find angle between pair of nodes so we can position predicates\n function findAngleBetweenNodes(linkedNodes, direction) {\n const p1 = {\n x: getNodeX(linkedNodes.source),\n y: getNodeY(linkedNodes.source)\n };\n\n const p2 = {\n x: getNodeX(linkedNodes.target),\n y: getNodeY(linkedNodes.target)\n };\n if (direction) {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n } else {\n const angleDeg = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI;\n if (angleDeg <= 90 && angleDeg >= -90) {\n return angleDeg;\n }\n return (angleDeg > 0 ? -1 : 1) * (180 - Math.abs(angleDeg));\n }\n }\n\n const menuEvents = new MenuEvents();\n\n // expanding and collapsing of the nodes\n function clickedNode(d, element, event) {\n $scope.showInfoPanel = false;\n $scope.showPredicates = false;\n $scope.showNodeInfo = false;\n\n // shift + ctrl/cmd + click focuses node\n if (event.shiftKey && (event.ctrlKey || event.metaKey)) {\n $rootScope.$broadcast(\"onRootNodeChange\", d.iri);\n return false;\n }\n\n // ctrl/cmd + click hides the node\n if (event.ctrlKey || event.metaKey) {\n hideNode(d);\n return false;\n }\n\n // If value of openedNodeInfoPanel is different than \"undefined\"\n // we evaluate if clicked node value is the same and close it\n if (typeof $scope.openedNodeInfoPanel !== \"undefined\" && $scope.openedNodeInfoPanel === d) {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n return false;\n }\n\n showNodeInfo(d);\n return true;\n }\n\n function expandNodeIcons(d, element) {\n if ($scope.showInfoPanel) {\n return false;\n }\n\n if (menuEvents.closeIcon || menuEvents.expandIcon || menuEvents.focusIcon || menuEvents.copyURIIcon) {\n menuEvents.removeIcons();\n }\n\n // If nodes are still rearranging result of force.alpha() is more than 0.05\n // and we don't want to show node's icons on mouse over and stop rearrangement\n if (force.alpha() < 0.05) {\n menuEvents.initIcons(d, element.parentNode);\n force.stop();\n\n return true;\n }\n\n return false;\n }\n\n function hideNode(d) {\n graph.removeNode(d);\n draw();\n }\n\n function collapseNode(d) {\n d.isExpanded = false;\n graph.removeNodeLeafLinks(d);\n draw();\n }\n\n function initGraph(response) {\n $scope.nodeSelected = true;\n if (response.data.types === null) {\n response.data.types = \"greyColor\";\n }\n graph = new Graph();\n transformValues = \"translate(0, -70) scale(1)\";\n panAndZoom.translate([0, -70]);\n panAndZoom.scale(1);\n }\n\n function initGraphFromResponse(response) {\n initGraph(response);\n renderGraphFromResponse(response);\n }\n\n function renderGraphFromResponse(response, d, isStartNode) {\n let linksFound = response.data;\n // filter existing links\n linksFound = _.filter(linksFound, function (newLink) {\n return _.findIndex(graph.links,\n function (existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n let linksCopy = [];\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n let linkCopy = tripleLinksIt.next().value;\n linkCopy.forEach(link => {\n linksCopy.push(link);\n });\n }\n // filter existing shadow links\n linksFound = _.filter(linksFound, function (newLink) {\n return _.findIndex(linksCopy,\n function (existingLink) {\n return newLink.source === existingLink.source.iri && newLink.target === existingLink.target.iri;\n }) === -1;\n });\n // filter reflexive links until we find a way to render them GDB-1853\n linksFound = _.filter(linksFound, function (newLink) {\n return newLink.source !== newLink.target;\n });\n const nodesFromLinks = distinctBy('iri',_.union(_.flatten(_.map(response.data, function (link) {\n return [\n { iri: link.source,\n isTriple: link.isTripleSource },\n {\n iri: link.target,\n isTriple: link.isTripleTarget }];\n }))));\n const existingNodes = _.map(graph.nodes, function (n) {\n return {\n iri: n.iri,\n isTriple: Boolean(n.isTriple)\n };\n });\n const tripleNodesIt = graph.tripleNodes.values();\n for (let i = 0; i < graph.tripleNodes.size; i++) {\n let nodes = tripleNodesIt.next().value;\n nodes.forEach(node => {\n existingNodes.push({\n iri: node.iri,\n isTriple: node.isTriple\n });\n });\n }\n const newNodes = _.reject(nodesFromLinks, function (n) {\n return _.some(existingNodes, n);\n });\n\n if (newNodes.length === 0) {\n if (isStartNode) {\n toastr.info($translate.instant('graphexplore.error.node.connections'));\n } else if (linksFound.length === 0) {\n toastr.info($translate.instant('graphexplore.error.node.connections'));\n }\n\n graph.addAndMatchLinks(linksFound);\n draw();\n } else {\n const promises = [];\n const newNodesData = [];\n\n _.forEach(newNodes, function (newNode, index) {\n promises.push($http({\n url: 'rest/explore-graph/node',\n method: 'GET',\n params: {\n iri: newNode.isTriple ? createTriple(newNode.iri) : newNode.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: $scope.saveSettings['includeInferred'],\n sameAsState: $scope.saveSettings['sameAsState']\n }\n }).then(function (res) {\n // Save the data for later\n newNodesData[index] = res.data;\n }));\n });\n\n // Waits for all of the collected promises and then:\n // - adds each new node\n // - redraws the graph\n $q.all(promises).then(function () {\n _.forEach(newNodesData, function (newNodeData, index) {\n // Calculate initial positions for the new nodes based on spreading them evenly\n // on a circle around the node we came from.\n const theta = 2 * Math.PI * index / newNodesData.length;\n const x = (d ? d.x : 0) + Math.cos(theta) * height / 3;\n const y = (d ? d.y : 0) + Math.sin(theta) * height / 3;\n if (newNodeData.isTriple) {\n graph.addTriple(newNodeData, x, y);\n } else {\n graph.addNode(newNodeData, x, y);\n }\n });\n\n graph.addAndMatchLinks(linksFound);\n if (d) {\n d.isExpanded = true;\n }\n draw();\n });\n }\n }\n\n function expandNode(d, isStartNode, parentNode) {\n if (loader.getLoadingState()) {\n return;\n }\n loader.init(d, parentNode);\n\n const expandIri = d.iri;\n $http({\n url: 'rest/explore-graph/links',\n method: 'GET',\n params: {\n iri: expandIri, linksLimit: $scope.saveSettings['linksLimit'],\n includeInferred: $scope.saveSettings['includeInferred'],\n config: $scope.configLoaded.id,\n preferredTypes: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredTypes'],\n rejectedTypes: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['rejectedTypes'],\n preferredPredicates: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredPredicates'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['rejectedPredicates'],\n preferredTypesOnly: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredTypesOnly'],\n preferredPredicatesOnly: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['preferredPredicatesOnly'],\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n sameAsState: $scope.saveSettings['sameAsState'],\n includeSchema: $scope.saveSettings['includeSchema']\n }\n }).then(function (response) {\n renderGraphFromResponse(response, d, isStartNode);\n }, function (response) {\n const msg = getError(response.data);\n toastr.error(msg, $translate.instant('graphexplore.error.exploring.node'));\n $scope.loading = false;\n loader.setLoadingState(false);\n });\n }\n\n function removeMenuIfVisible() {\n if (angular.isDefined(menuEvents) && menuEvents.expandedState) {\n menuEvents.removeIcons();\n }\n }\n\n function MenuEvents() {\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n this.actionsTip = undefined;\n\n this.removeIcons = function () {\n this.closeIcon.remove(\"g\");\n if (this.expandIcon) {\n this.expandIcon.remove(\"g\");\n }\n\n if (this.collapseIcon) {\n this.collapseIcon.remove(\"g\");\n }\n\n this.focusIcon.remove(\"g\");\n this.copyURIIcon.remove(\"g\");\n this.closeIcon = undefined;\n this.expandIcon = undefined;\n this.collapseIcon = undefined;\n this.focusIcon = undefined;\n this.copyURIIcon = undefined;\n\n this.expandedState = false;\n };\n\n this.expandedState = false;\n\n function getPositionAndAngle(angle, d) {\n const x = d.x - 14 + (d.size + 15) * Math.cos(angle * Math.PI / 180 - Math.PI / 2);\n const y = d.y - 14 + (d.size + 15) * Math.sin(angle * Math.PI / 180 - Math.PI / 2);\n return \"translate(\" + x + \",\" + y + \")\";\n }\n\n this.initIcons = function (node, parentNode) {\n // init action tips on hover of the icons\n const actionsTip = d3tip()\n .attr('class', 'd3-tip d3-actions-tip')\n .customPosition(function () {\n const bbox = d3.event.target.getBoundingClientRect();\n return {\n top: (bbox.top - 20) + 'px',\n left: (bbox.right + 10) + 'px'\n };\n })\n .html(function (name) {\n return name;\n });\n svg.call(actionsTip);\n const angle = 20;\n if (node.isExpanded) {\n this.collapseIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"collapse-icon\")\n .attr(\"name\", \"collapse\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.collapseIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.collapseIcon.append(\"path\")\n .attr(\"d\", \"M22.67,12a.59.59,0,0,1-.53.65l-6.88.72H15.2a.59.59,0,0,1-.59-.65l.72-6.88A.58.58,0,0,1,16,5.33a.59.59,0,0,1,.53.65L16,11.11,21.3,5.79a.64.64,0,0,1,.91.91L16.89,12,22,11.49A.59.59,0,0,1,22.67,12ZM12.59,14.75l-6.75.85a.59.59,0,0,0-.51.66.58.58,0,0,0,.66.51l4.95-.62-5.2,5.2a.64.64,0,1,0,.91.91l5.2-5.2L11.23,22a.59.59,0,0,0,.51.66h.07a.59.59,0,0,0,.59-.52l.85-6.75a.59.59,0,0,0-.17-.49A.58.58,0,0,0,12.59,14.75Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.collapseIcon.on(\"click\", function () {\n collapseNode(node);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(showNodeTipAndIconsTimer);\n $timeout.cancel(removeIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n } else {\n this.expandIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"expand-icon\")\n .attr(\"name\", \"expand\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.expandIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.expandIcon.append(\"path\")\n .attr(\"d\", \"M22.37,6.28l-.72,6.88a.59.59,0,0,1-.59.53H21a.59.59,0,0,1-.53-.65L21,7.9l-5.32,5.32a.64.64,0,0,1-.91-.91L20.1,7,15,7.53a.59.59,0,0,1-.12-1.18l6.88-.72a.59.59,0,0,1,.65.65ZM12.89,20.34,7.95,21l5.2-5.2a.64.64,0,0,0-.91-.91L7,20.05l.62-4.95A.59.59,0,0,0,6.48,15l-.85,6.75a.59.59,0,0,0,.59.67h.07L13,21.52a.59.59,0,1,0-.15-1.18Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.expandIcon.on(\"click\", function () {\n expandNode(node, false, parentNode);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n }\n\n\n this.focusIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"focus-icon\")\n .attr(\"name\", \"focus\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.focusIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.focusIcon.append(\"path\")\n .attr(\"d\", \"M14.2,23.81a9.8,9.8,0,1,1,6.93-2.87h0A9.74,9.74,0,0,1,14.2,23.81Zm0-18.17a8.37,8.37,0,1,0,5.92,14.29h0A8.37,8.37,0,0,0,14.2,5.64Zm1.42,6.95a2,2,0,1,0,0,2.85A2,2,0,0,0,15.62,12.59Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.focusIcon.on(\"click\", function () {\n $rootScope.$broadcast(\"onRootNodeChange\", node.iri);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.copyURIIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"icon-link\")\n .attr(\"name\", \"link\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.copyURIIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.copyURIIcon.append(\"path\")\n .attr(\"d\", \"M 13.457031 10.164062 C 13.648438 10.164062 13.820312 10.242188 13.941406 10.363281 L 15.492188 11.859375 C 15.984375 12.332031 16.292969 12.992188 16.292969 13.714844 C 16.292969 14.441406 15.984375 15.097656 15.492188 15.574219 L 10.394531 20.496094 C 9.902344 20.972656 9.222656 21.265625 8.472656 21.265625 C 7.71875 21.265625 7.039062 20.972656 6.546875 20.496094 L 4.996094 19 C 4.507812 18.523438 4.203125 17.867188 4.203125 17.144531 C 4.203125 16.421875 4.507812 15.765625 4.996094 15.289062 L 7.542969 12.824219 C 7.667969 12.707031 7.84375 12.628906 8.035156 12.628906 C 8.417969 12.628906 8.726562 12.929688 8.726562 13.300781 C 8.726562 13.484375 8.648438 13.652344 8.523438 13.773438 L 5.976562 16.234375 C 5.738281 16.46875 5.589844 16.792969 5.589844 17.148438 C 5.589844 17.503906 5.738281 17.824219 5.976562 18.058594 L 7.527344 19.566406 C 7.773438 19.792969 8.105469 19.929688 8.472656 19.929688 C 8.835938 19.929688 9.167969 19.792969 9.414062 19.566406 L 14.511719 14.644531 C 14.753906 14.410156 14.90625 14.089844 14.90625 13.730469 C 14.90625 13.375 14.753906 13.054688 14.511719 12.820312 L 12.964844 11.324219 C 12.839844 11.203125 12.761719 11.039062 12.761719 10.855469 C 12.761719 10.488281 13.070312 10.1875 13.449219 10.1875 Z M 17.082031 3.976562 C 17.082031 3.976562 17.085938 3.976562 17.085938 3.976562 C 17.824219 3.976562 18.492188 4.261719 18.980469 4.722656 L 20.535156 6.203125 C 21.042969 6.679688 21.355469 7.34375 21.355469 8.082031 C 21.355469 8.792969 21.058594 9.441406 20.582031 9.914062 L 18.0625 12.402344 C 17.9375 12.527344 17.761719 12.605469 17.566406 12.605469 C 17.183594 12.605469 16.875 12.304688 16.875 11.9375 C 16.875 11.753906 16.949219 11.589844 17.070312 11.46875 L 19.605469 8.984375 C 19.847656 8.75 19.996094 8.429688 19.996094 8.070312 C 19.996094 7.714844 19.847656 7.394531 19.605469 7.160156 L 18.019531 5.667969 C 17.773438 5.445312 17.4375 5.304688 17.070312 5.300781 C 16.703125 5.304688 16.367188 5.453125 16.128906 5.691406 L 11.085938 10.667969 C 10.84375 10.898438 10.695312 11.222656 10.695312 11.578125 C 10.695312 11.933594 10.84375 12.257812 11.085938 12.488281 L 12.675781 13.980469 C 12.804688 14.101562 12.882812 14.273438 12.882812 14.457031 C 12.882812 14.828125 12.574219 15.128906 12.191406 15.128906 C 12.003906 15.128906 11.832031 15.054688 11.707031 14.9375 L 10.140625 13.457031 C 9.636719 12.980469 9.324219 12.316406 9.324219 11.582031 C 9.324219 10.863281 9.621094 10.214844 10.101562 9.742188 L 15.140625 4.765625 C 15.625 4.285156 16.304688 3.980469 17.054688 3.976562 Z M 17.082031 3.976562\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.copyURIIcon.on(\"click\", function () {\n copyToClipboard(node.iri);\n removeMenuIfVisible();\n actionsTip.hide();\n }).on('mouseover', function () {\n actionsTip.show(\"<div style='text-align: center;'><b>Copy to ClipBoard</b><br>\" + node.iri + \"</div>\");\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.closeIcon = d3.select('.menu-events').append(\"g\")\n .attr(\"class\", \"close-icon\")\n .attr(\"name\", \"remove\")\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n });\n this.closeIcon.append(\"circle\")\n .attr(\"cx\", 14)\n .attr(\"cy\", 14)\n .attr(\"r\", 13)\n .style(\"fill\", \"#eee\");\n this.closeIcon.append(\"path\")\n .attr(\"d\", \"M14.94,14l5.87-5.87a.66.66,0,1,0-.94-.94L14,13.06,8.13,7.19a.66.66,0,0,0-.94.94L13.06,14,7.19,19.87a.66.66,0,1,0,.94.94L14,14.94l5.87,5.87a.66.66,0,1,0,.94-.94Z\")\n .style(\"fill\", \"#ed4f2f\");\n\n this.closeIcon.on(\"click\", function () {\n hideNode(node);\n }).on('mouseover', function () {\n actionsTip.show(this.getAttribute(\"name\"));\n $timeout.cancel(removeIconsTimer);\n $timeout.cancel(showNodeTipAndIconsTimer);\n }).on('mouseout', function () {\n actionsTip.hide();\n removeIconsTimer = $timeout(function () {\n removeMenuIfVisible();\n }, 500);\n });\n\n this.animateMenu(node);\n };\n\n this.animateMenu = function (node) {\n const animationDuration = 100;\n const easeEffects = [\"linear\", \"quad\", \"cubic\", \"sin\", \"exp\", \"circle\", \"elastic\", \"back\", \"bounce\"]; // https://github.com/d3/d3-3.x-api-reference/blob/master/Transitions.md#easing\n const easeEffect = easeEffects[3];\n let delay = 0;\n const dellayAddition = 35;\n let angle = 20; // angle of the first icon 0 is at 12 o'clock\n\n if (this.expandIcon) {\n this.expandIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n if (this.collapseIcon) {\n this.collapseIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n }\n\n this.copyURIIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.focusIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n\n this.closeIcon\n .transition()\n .duration(animationDuration)\n .style(\"opacity\", 1)\n .ease(easeEffect)\n .attr(\"transform\", function () {\n angle += 30;\n return getPositionAndAngle(angle, node);\n })\n .delay(delay += dellayAddition);\n\n this.expandedState = true;\n };\n }\n\n function Loader() {\n this.state = false;\n\n this.setLoadingState = function (state) {\n this.state = state;\n };\n\n this.getLoadingState = function () {\n return this.state;\n };\n\n this.init = function (node, parentNode) {\n d3.select(parentNode).append(\"circle\")\n .attr(\"cx\", function () {\n return node.x;\n })\n .attr(\"cy\", function () {\n return node.y;\n })\n .attr(\"class\", \"loader-container\")\n .attr(\"r\", function () {\n return node.size;\n })\n .style(\"fill\", \"fff\")\n .style(\"opacity\", \"0.7\");\n\n d3.select(parentNode).append(\"image\")\n .attr(\"xlink:href\", \"js/angular/templates/loader/ot-loader.svg?v=10.0.0-M2-1\")\n .attr(\"x\", function () {\n return node.x - node.size + 5;\n })\n .attr(\"y\", function () {\n return node.y - node.size;\n })\n .attr(\"width\", function () {\n return node.size * 2;\n })\n .attr(\"height\", function () {\n return node.size * 2;\n })\n .attr(\"class\", \"node-loader\");\n };\n }\n\n function showNodeInfo(d) {\n force.stop();\n // Assign value of node, which info panel has been opened\n $scope.openedNodeInfoPanel = d;\n $scope.showNodeInfo = true;\n $scope.showFilter = false;\n $scope.showPredicates = false;\n $scope.nodeLabels = d.labels;\n $scope.nodeTypes = d.types;\n $scope.rdfRank = d.rdfRank;\n $scope.nodeIri = d.iri;\n $scope.resourceType = d.isTriple ? 'triple' : 'uri';\n $scope.encodedIri = d.isTriple ? encodeURI(createTriple(d.iri)) : encodeURI(d.iri);\n $scope.showInfoPanel = true;\n\n $scope.rdfsLabel = d.labels[0].label;\n $scope.rdfsComment = d.comment;\n $scope.expanded = false;\n\n $scope.propertiesQueryObj.query = '';\n $scope.dataNodeKeysQuery = '';\n $http.get('rest/explore-graph/properties', {\n params: {\n iri: d.isTriple ? createTriple(d.iri) : d.iri,\n config: $scope.configLoaded.id,\n languages: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['languages'],\n includeInferred: $scope.saveSettings['includeInferred'],\n sameAsState: $scope.saveSettings['sameAsState'],\n rejectedPredicates: !$scope.shouldShowSettings() ? [] : $scope.saveSettings['rejectedPredicates']\n }\n }).then(function (response) {\n $scope.data = _.mapKeys(response.data, function (value, key) {\n return $scope.replaceIRIWithPrefix(key);\n });\n $scope.propertiesObj.items = [];\n\n _.forEach($scope.data, function (value, key) {\n $scope.propertiesObj.items.push({key: key, value: value});\n });\n $scope.nodeImage = undefined;\n\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n\n const imageVal = _.find($scope.propertiesObj.items, function (o) {\n return o.key === 'image';\n });\n if (imageVal) {\n $scope.nodeImage = imageVal['value'][0].v;\n }\n $scope.propertiesObj.items = _.reject($scope.propertiesObj.items, function (o) {\n return o.key === 'image';\n });\n $scope.propertiesNotFiltered = $scope.propertiesObj.items;\n }, function (response) {\n toastr.warning(getError(response.data), \"Error\");\n });\n }\n\n $scope.toggleSidePanel = function () {\n $scope.pageslideExpanded = !$scope.pageslideExpanded;\n };\n\n $scope.closeInfoPanel = function () {\n $scope.pageslideExpanded = false;\n $scope.openedNodeInfoPanel = undefined;\n $scope.predicates = [];\n openedLink = null;\n // o, angular, o, miracle\n $timeout(function () {\n $scope.showInfoPanel = false;\n });\n };\n\n function applyElementsStyleChanges(tripleNode) {\n updatePredicatesColor('predicate', '#d54a33', tripleNode);\n updatePredicatesColor('predicates', '#d54a33', tripleNode);\n\n let links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function (link) {\n let linkLink = link.__data__;\n if (linkLink.source.iri.indexOf(tripleNode.iri) >= 0 || linkLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n link.style.stroke = '#d54a33';\n link.style.strokeWidth = 4;\n }\n })\n }\n\n let markers = document.getElementsByClassName('arrow-marker');\n if (markers) {\n _.each(markers, function (marker) {\n let markerLink = marker.__data__;\n if (markerLink.source.iri.indexOf(tripleNode.iri) >= 0 || markerLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n marker.style.stroke = '#d54a33';\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"23\");\n }\n }\n });\n }\n }\n\n $scope.clickLink = function (predData) {\n if (graph.tripleNodes.has(predData.linkId)) {\n revertElementsStyleToDefault();\n let tripleNode = graph.tripleNodes.get(predData.linkId)[predData.nodeIndex];\n // Shows selected triple and its properties\n showNodeInfo(tripleNode);\n $scope.showPredicates = true;\n\n let clickedEl = document.getElementById(predData.linkId + predData.nodeIndex);\n if (clickedEl) {\n clickedEl.style.fontWeight = \"bold\";\n }\n\n let nodeCopy = {};\n const tripleLinksIt = graph.tripleLinksCopy.values();\n for (let i = 0; i < graph.tripleLinksCopy.size; i++) {\n let links = tripleLinksIt.next().value;\n if (links.length > 1) {\n links.every(link => {\n if (link.source.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].source.iri;\n if (link.target.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.target.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.target.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n if (link.target.iri === tripleNode.iri) {\n nodeCopy.iri = links[0].target.iri;\n if (link.source.isTriple) {\n nodeCopy.oppLinkIRI = convertTripleToLinkId(link.source.iri);\n nodeCopy.oppTriplePred = getShortPredicate(link.source.iri.split(' ')[1]);\n }\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n if (link.predicates.length === 1) {\n nodeCopy.linkPred = link.predicates[0];\n }\n return false;\n }\n return true;\n });\n }\n }\n\n if (!nodeCopy.iri) {\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n }\n\n applyElementsStyleChanges(nodeCopy);\n }\n }\n\n function updatePredicatesColor(className, color, tripleNode) {\n let preds = document.getElementsByClassName(className);\n\n if (preds) {\n _.each(preds, function (pred) {\n let predLink = pred.__data__;\n if (tripleNode) {\n if (predLink.source.iri.indexOf(tripleNode.iri) >= 0 || predLink.target.iri.indexOf(tripleNode.iri) >= 0) {\n pred.style.fill = color;\n }\n if (convertTripleToLinkId(tripleNode.iri) === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.pred;\n pred.style.fill = color;\n }\n if (tripleNode.oppLinkIRI && tripleNode.oppLinkIRI === convertLinkDataToLinkId(predLink)) {\n pred.textContent = tripleNode.oppTriplePred;\n pred.style.fill = color;\n }\n } else {\n pred.style.fill = color;\n pred.textContent = getPredicate(predLink);\n }\n })\n }\n }\n\n function revertElementsStyleToDefault() {\n _.each($scope.predicates, function (pred) {\n let currEl = document.getElementById(pred.linkId + pred.nodeIndex);\n if (currEl) {\n currEl.style.fontWeight = \"normal\";\n }\n });\n let links = document.getElementsByClassName('link');\n if (links) {\n _.each(links, function (link) {\n link.style.stroke = '#999';\n link.style.strokeWidth = 1;\n })\n }\n updatePredicatesColor('predicate', '');\n updatePredicatesColor('predicates', '');\n\n let markers = document.getElementsByClassName('arrow-marker');\n\n if (markers) {\n _.each(markers, function (marker) {\n marker.style.stroke = '#999';\n // RefX for triple targets isn't changed, because they are not affected by increasing of stroke-width\n if (!marker.__data__.target.isTriple) {\n marker.setAttribute(\"refX\", \"59\");\n }\n });\n }\n }\n\n function linkActions(d) {\n revertElementsStyleToDefault();\n let linkId = convertLinkDataToLinkId(d);\n if (d.predicates.length === 1 && graph.tripleNodes.has(linkId)) {\n openedLink = null;\n let tripleNode = graph.tripleNodes.get(linkId)[0];\n // If there is a triple in this link, show its properties\n if (clickedNode(tripleNode, this, d3.event.button)) {\n let nodeCopy = {};\n nodeCopy.iri = tripleNode.iri;\n nodeCopy.pred = getShortPredicate(tripleNode.iri.split(' ')[1]);\n applyElementsStyleChanges(nodeCopy);\n }\n return;\n }\n openPredicates(d);\n }\n\n function openPredicates(d) {\n $scope.showNodeInfo = false;\n // open predicates sidebar if they are more than one\n $scope.showPredicates = d.predicates.length > 1;\n $scope.showFilter = false;\n $scope.showInfoPanel = false;\n\n if (openedLink === d) {\n $scope.showNodeInfo = false;\n $scope.showInfoPanel = false;\n openedLink = null;\n return;\n }\n\n openedLink = d;\n\n if ($scope.showPredicates) {\n $scope.predicates = _.map(d.predicates, function (p) {\n let foundNodeIndex = getTripleNodeIndex(p, d);\n let isPartOfTriple = foundNodeIndex > -1;\n return {\n value: getShortPredicate(p),\n partOfTriple: isPartOfTriple,\n linkId: isPartOfTriple ? convertLinkDataToLinkId(d) : '',\n nodeIndex: foundNodeIndex\n };\n });\n $scope.showInfoPanel = true;\n }\n }\n\n function getTripleNode(triple) {\n let linkId = convertTripleToLinkId(triple);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).find(el => el.iri === triple);\n }\n }\n\n function getTripleNodeIndex(pred, d) {\n let linkId = convertLinkDataToLinkId(d);\n if (graph.tripleNodes.has(linkId)) {\n return graph.tripleNodes.get(linkId).findIndex(el => el.iri.indexOf(pred) >= 0);\n } else {\n return -1;\n }\n }\n\n // get each predicate and check if there are more than one for same source and target\n function getPredicate(d) {\n if (d.predicates.length > 1) {\n return d.predicates.length + \" predicates\";\n }\n return getShortPredicate(d.predicates[0]);\n }\n\n function getShortPredicate(p) {\n const shortIRI = $scope.replaceIRIWithPrefix(p);\n if (shortIRI.length === p.length) {\n return p.split('/')[p.split('/').length - 1];\n } else {\n return shortIRI;\n }\n }\n\n // calculate predicate text length so we can have dynamic link lengths\n function getPredicateTextLength(link) {\n const span = $('<span></span>');\n const splitedLink = link.predicates[0].split('/');\n const predicateText = splitedLink[splitedLink.length - 1];\n span.addClass('predicate-text').text(predicateText);\n $('body').append(span);\n const textLength = span.width() + link.source.size * 2 + link.target.size * 2 + 50;\n span.remove();\n return textLength * 0.75;\n }\n\n $scope.splitPredicate = function (predicate) {\n return predicate.split('/')[predicate.split('/').length - 1];\n };\n\n $scope.getActiveRepository = function () {\n return $repositories.getActiveRepository();\n };\n\n $scope.isLoadingLocation = function () {\n return $repositories.isLoadingLocation();\n };\n\n $scope.hasActiveLocation = function () {\n return $repositories.hasActiveLocation();\n };\n\n $scope.rotate = function (isLeft) {\n removeMenuIfVisible();\n\n // compute common rotation math such as the angle, its sine and cosine and the pivot point\n const theta = (isLeft ? 1 : -1) * 2 * Math.PI / 180; // + rotates left, - rotates right\n const cos = Math.cos(theta);\n const sin = Math.sin(theta);\n const pivotX = width / 2; // i.e. centre of viewport\n const pivotY = height / 2;\n\n // rotates each node around the pivot\n d3.selectAll(\".node-wrapper\")\n .each(function (d) {\n d.x = pivotX + (cos * (d.x - pivotX) + sin * (d.y - pivotY));\n d.y = pivotY + (-sin * (d.x - pivotX) + cos * (d.y - pivotY));\n if (d.fixed) {\n // Fixed nodes need their px and py updated too\n d.px = d.x;\n d.py = d.y;\n }\n });\n\n force.resume();\n };\n\n $scope.openUri = function (uri, noHistory) {\n if (!noHistory) {\n const searchParams = {};\n if ($scope.configLoaded.id !== $scope.defaultGraphConfig.id) {\n searchParams.config = $scope.configLoaded.id;\n }\n searchParams.uri = uri;\n $scope.pushHistory(searchParams, {uri: uri, config: $scope.configLoaded});\n }\n $scope.$broadcast(\"onRootNodeChange\", uri);\n };\n\n function saveGraphHttp(graph) {\n if ($scope.configLoaded) {\n graph.config = $scope.configLoaded.id;\n }\n SavedGraphsRestService.addNewSavedGraph(graph)\n .success(function (data, status, headers) {\n $scope.lastSavedGraphName = graph.name;\n $scope.lastSavedGraphId = headers()['x-saved-graph-id'];\n $scope.shared = graph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph', {name: graph.name}));\n })\n .error(function (data, status) {\n if (status === 422) {\n $scope.saveGraphModal('new', graph, true);\n } else {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.create.graph'));\n }\n });\n }\n\n $scope.saveOrUpdateGraph = function () {\n const data = JSON.stringify(graph.copyState());\n const graphToSave = {id: $scope.lastSavedGraphId, name: $scope.lastSavedGraphName, data: data, shared: $scope.shared};\n\n if (graphToSave.id) {\n $scope.saveGraphModal('update', graphToSave);\n } else {\n $scope.saveGraphModal('new', graphToSave);\n }\n };\n\n $scope.renameSavedGraph = function (graphToRename) {\n // By not sending the 'data' part of a graph we only change the name\n $scope.saveGraphModal('rename', {id: graphToRename.id, name: graphToRename.name, config: graphToRename.config, shared: graphToRename.shared});\n };\n\n const editSavedGraphHttp = function (savedGraph) {\n SavedGraphsRestService.editSavedGraph(savedGraph)\n .success(function () {\n $scope.lastSavedGraphName = savedGraph.name;\n $scope.shared = savedGraph.shared;\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.edited', {name: savedGraph.name}));\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.edit'));\n });\n };\n\n $scope.saveGraphModal = function (mode, graphToSave, graphExists) {\n const modalInstance = $modal.open({\n templateUrl: 'js/angular/graphexplore/templates/modal/save-graph.html',\n controller: 'SaveGraphModalCtrl',\n resolve: {\n data: function () {\n return {\n mode: mode,\n graph: graphToSave,\n graphExists: graphExists,\n shared: graphToSave.shared\n };\n }\n }\n });\n\n modalInstance.result.then(function (data) {\n if (data.restart) {\n $scope.saveGraphModal(data.mode, data.graph, false);\n return;\n }\n switch (data.mode) {\n case 'new':\n saveGraphHttp(data.graph);\n break;\n case 'update':\n editSavedGraphHttp(data.graph);\n break;\n case 'rename':\n editSavedGraphHttp(data.graph);\n break;\n }\n });\n };\n\n $scope.refreshSavedGraphs = function () {\n SavedGraphsRestService.getSavedGraphs()\n .success(function (data) {\n $scope.savedGraphs = data;\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.getting.saved.graphs'));\n });\n };\n\n\n $scope.loadSavedGraph = function (graphToLoad, noHistory) {\n if (graphToLoad.owner) {\n // Own saved graph\n $scope.lastSavedGraphName = graphToLoad.name;\n $scope.lastSavedGraphId = graphToLoad.id;\n $scope.shared = graphToLoad.shared;\n $scope.configLoaded = $scope.findConfigById(graphToLoad.config);\n } else {\n // Someone else's saved graph\n $scope.lastSavedGraphName = null;\n $scope.lastSavedGraphId = null;\n $scope.shared = graphToLoad.shared;\n }\n\n if (!$scope.configLoaded) {\n // Fallback to default config, either because config is gone or because graph isn't owned\n $scope.configLoaded = $scope.defaultGraphConfig;\n }\n\n $location.url(\"?saved=\" + graphToLoad.id);\n graph.restoreState(JSON.parse(graphToLoad.data));\n if (!noHistory) {\n $scope.pushHistory({saved: graphToLoad.id}, {savedGraph: graphToLoad});\n }\n };\n\n $scope.copyToClipboardSavedGraph = function (savedGraph) {\n const url = [location.protocol, '//', location.host, location.pathname, '?saved=', savedGraph.id].join('');\n copyToClipboard(url);\n };\n\n function deleteSavedGraphHttp(savedGraph) {\n SavedGraphsRestService.deleteSavedGraph(savedGraph)\n .success(function () {\n $scope.refreshSavedGraphs();\n toastr.success($translate.instant('graphexplore.saved.graph.was.deleted', {name: savedGraph.name}));\n })\n .error(function (data) {\n const msg = getError(data);\n toastr.error(msg, $translate.instant('graphexplore.error.cannot.delete'));\n });\n }\n\n $scope.deleteSavedGraph = function (savedGraph) {\n ModalService.openSimpleModal({\n title: $translate.instant('common.confirm'),\n message: $translate.instant('graphexplore.confirm.delete.graph', {graphName: savedGraph.name}),\n warning: true\n }).result\n .then(function () {\n deleteSavedGraphHttp(savedGraph);\n });\n };\n\n $scope.openIRI = function (link, event) {\n if (event.shiftKey) {\n $scope.$broadcast(\"onRootNodeChange\", link);\n } else {\n window.open(link, '_blank');\n }\n return false;\n };\n\n $scope.togglePinAllNodes = function () {\n removeMenuIfVisible();\n\n const value = $scope.numberOfPinnedNodes <= 0;\n\n $scope.numberOfPinnedNodes = 0;\n d3.selectAll('.node').each(function (d) {\n d.fixed = value;\n if (value) {\n $scope.numberOfPinnedNodes++;\n }\n });\n\n force.resume();\n };\n\n // event for capturing left and right arrows used for rotation\n $('body').on(\"keydown\", function (event) {\n if (event.target.nodeName === 'input' || !$scope.nodeSelected) {\n // don't do anything when the target is an input field or no node is selected\n } else if (event.keyCode === 37) {\n // left arrow rotates left\n $scope.rotate(true);\n } else if (event.keyCode === 39) {\n // right arrow rotates right\n $scope.rotate(false);\n }\n });\n\n $scope.getLiteralFromPropValue = function (value) {\n return value.substring(value.indexOf(':') + 1);\n }\n}\n\nSaveGraphModalCtrl.$inject = ['$scope', '$modalInstance', 'data', '$translate'];\n\nfunction SaveGraphModalCtrl($scope, $modalInstance, data, $translate) {\n $scope.mode = data.mode;\n $scope.graph = angular.copy(data.graph);\n $scope.graphExists = data.graphExists;\n\n switch ($scope.mode) {\n case 'new':\n $scope.title = $translate.instant('graphexplore.create.new.graph');\n $scope.okButtonText = $translate.instant('common.create.btn');\n break;\n case 'update':\n $scope.title = $translate.instant('graphexplore.update');\n $scope.okButtonText = $translate.instant('common.save.btn');\n break;\n case 'rename':\n $scope.title = $translate.instant('graphexplore.rename');\n $scope.okButtonText = $translate.instant('common.save.btn');\n }\n\n $scope.ok = function () {\n if ($scope.form.$valid) {\n $modalInstance.close({graph: $scope.graph, mode: $scope.mode});\n }\n };\n\n $scope.saveNew = function () {\n $scope.graph.name = $scope.graph.name + ' (new)';\n $modalInstance.close({graph: $scope.graph, mode: 'new', restart: true});\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n}\n"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[26,31,84],{42:function(e,t){angular.module("graphdb.framework.rest.cluster.service",[]).factory("ClusterRestService",n),n.$inject=["$http"];const r="rest/cluster";function n(e){return{getClusterConfig:function(){return e.get(`${r}/config`)},createCluster:function(t){return e.post(`${r}/config`,t)},updateCluster:function(t){t.nodes&&delete t.nodes;return e.patch(`${r}/config`,t)},deleteCluster:function(t){const n=$.param({force:t});return e.delete(`${r}/config?${n}`)},addNodesToCluster:function(t){return e.post(`${r}/config/node`,t)},removeNodesFromCluster:function(t){return e.delete(`${r}/config/node`,t)},getClusterStatus:function(){return e.get(`${r}/group/status`)},getNodeStatus:function(){return e.get(`${r}/node/status`)}}}},49:function(e,t,r){"use strict";r.r(t);r(3),r(42);function n(e,t,r,n,o,s,a,c,i,u,l,d,g,f,m){e.loader=!0,e.setLoader=function(t,r){e.loader=t,l.cancel(e.loaderTimeout),t?e.loaderTimeout=l((function(){e.loader=t,e.loaderMessage=r}),50):e.loader=!1},e.getLoaderMessage=function(){return e.loaderMessage||m.instant("common.loading")},e.createCluster=function(){f.path(`${f.path()}/create`)},e.getClusterConfiguration=()=>{e.setLoader(!0),d.getClusterConfig().success((t,r)=>{e.clusterConfiguration=t}).error((t,r)=>{e.clusterConfiguration=null}).finally(()=>{e.setLoader(!1)})},e.getClusterStatus=function(){d.getClusterStatus().success((function(t,r){e.clusterConfiguration?(e.leader=t.find(e=>"LEADER"===e.nodeState),e.leader?(e.followers=t.filter(t=>t!==e.leader),e.followers.forEach(t=>{t.syncStatus=e.leader.syncStatus[t.address]})):e.followers=t):e.getClusterConfiguration()})).error((function(t,r){404===r&&(e.clusterConfiguration=null)}))},e.showDeleteDialog=()=>{s.open({templateUrl:"js/angular/clustermanagement/templates/modal/cluster-delete-dialog.html",controller:"DeleteClusterCtrl"}).result.then((function(t){const r=m.instant("cluster_management.delete_cluster_dialog.loader_message");e.setLoader(!0,r),d.deleteCluster(t).success(t=>{if(Object.values(t).every(e=>"DELETED"===e)){const e=m.instant("cluster_management.delete_cluster_dialog.notifications.success_delete");n.success(e)}else{const e=m.instant("cluster_management.delete_cluster_dialog.notifications.success_delete_partial"),r=Object.keys(t).reduce((e,r)=>e+=`<div>${r} - ${t[r]}</div>`,"");n.success(r,e,{allowHtml:!0})}e.getClusterConfiguration()}).error(e=>{const t=m.instant("cluster_management.delete_cluster_dialog.notifications.fail_delete"),r=Object.keys(e).reduce((t,r)=>t+=`<div>${r} - ${e[r]}</div>`,"");n.error(r,t,{allowHtml:!0})}).finally(()=>e.setLoader(!1))}))},e.getClusterConfiguration(),e.getClusterStatus();let p=0;const C=i((function(){p%3==0&&e.getClusterConfiguration(),p++,e.clusterConfiguration&&e.getClusterStatus()}),2e3);e.$on("$destroy",(function(){i.cancel(C)}))}angular.module("graphdb.framework.clustermanagement.controllers",["ui.bootstrap","graphdb.framework.core.services.repositories","graphdb.framework.rest.repositories.service","graphdb.framework.rest.cluster.service","toastr"]).controller("ClusterManagementCtrl",n).controller("CreateClusterCtrl",s).controller("DeleteClusterCtrl",a),n.$inject=["$scope","$http","$q","toastr","$repositories","$modal","$sce","$window","$interval","ModalService","$timeout","ClusterRestService","RepositoriesRestService","$location","$translate"];const o=function(){const e=document.getElementById("advancedOptions");if(e){const t=e.getAttribute("aria-expanded");if(t&&"true"===t)return"fa fa-angle-down"}return"fa fa-angle-right"};function s(e,t,r,n,s,a,c,i){t.pageTitle=i.instant("cluster_management.cluster_page.create_page_title"),t.autofocusId="autofocus",t.errors=[],t.clusterConfiguration={electionMinTimeout:1500,electionRangeTimeout:2e3,heartbeatInterval:500,messageSizeKB:64,nodes:[],verificationTimeout:1500},a.getNodeStatus().then(e=>{t.currentNode=e}).catch(e=>{t.currentNode=e.data}).finally(()=>{t.clusterConfiguration.nodes.push(t.currentNode.address)}),t.getAdvancedOptionsClass=o,e.$on("$translateChangeSuccess",(function(){t.pageTitle=i.instant("cluster_management.cluster_page.create_page_title")})),t.getLoaderMessage=function(){return t.loaderMessage||i.instant("common.loading")},t.goToClusterManagementPage=function(){n.path("/cluster")},t.createCluster=function(){!function(){const e=!t.clusterConfigurationForm.$invalid,r=t.clusterConfiguration.nodes&&t.clusterConfiguration.nodes.length>=2;return e&&r}()?c.warning(i.instant("cluster_management.cluster_page.notifications.form_invalid")):(t.setLoader(!0,i.instant("cluster_management.cluster_page.creating_cluster_loader")),a.createCluster(t.clusterConfiguration).success((function(e,r){c.success(i.instant("cluster_management.cluster_page.notifications.create_success"));const n=s((function(){t.setLoader(!1),t.goToClusterManagementPage()}),2e3);t.$on("$destroy",(function(){s.cancel(n)}))})).error((function(e,r){!function(e,r){delete t.preconditionErrors,c.error(i.instant("cluster_management.cluster_page.notifications.create_failed")),t.errors.splice(0),412===r?t.preconditionErrors=Object.keys(e).map(t=>`${t} - ${e[t]}`):400===r?t.errors.push(...e):409===r&&t.errors.push(e)}(e,r),t.setLoader(!1)})))},t.setLoader=function(e,r){s.cancel(t.loaderTimeout),e?t.loaderTimeout=s((function(){t.loader=e,t.loaderMessage=r}),300):t.loader=!1},t.addNodeToList=function(e){e&&!t.clusterConfiguration.nodes.includes(e)&&(t.clusterConfiguration.nodes.push(e),t.rpcAddress="")},t.removeNodeFromList=function(e,r){t.clusterConfiguration.nodes.splice(e,1)}}function a(e,t){e.forceDelete=!1,e.ok=function(){t.close(e.forceDelete)},e.cancel=function(){t.dismiss("cancel")}}s.$inject=["$rootScope","$scope","$routeParams","$location","$timeout","ClusterRestService","toastr","$translate"],a.$inject=["$scope","$modalInstance"]},93:function(e,t,r){"use strict";r.r(t);r(3),r(9),r(49),r(87),r(8),r(224),r(221);angular.module("graphdb.framework.clustermanagement",["ngAnimate","toastr","graphdb.framework.clustermanagement.controllers","graphdb.framework.clustermanagement.directives"])}}]);
|
|
2
|
-
//# sourceMappingURL=26.c1619706b8cbb1ab23cb.bundle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/js/angular/rest/cluster.rest.service.js","webpack:///./src/js/angular/clustermanagement/controllers.js","webpack:///./src/js/angular/clustermanagement/app.js"],"names":["angular","module","factory","ClusterRestService","$inject","CLUSTER_GROUP_ENDPOINT","$http","getClusterConfig","get","createCluster","groupConfiguration","post","updateCluster","nodes","patch","deleteCluster","forceDelete","data","$","param","force","delete","addNodesToCluster","nodesArray","removeNodesFromCluster","getClusterStatus","getNodeStatus","ClusterManagementCtrl","$scope","$q","toastr","$repositories","$modal","$sce","$window","$interval","ModalService","$timeout","RepositoriesRestService","$location","$translate","loader","setLoader","message","cancel","loaderTimeout","loaderMessage","getLoaderMessage","instant","path","getClusterConfiguration","success","status","clusterConfiguration","error","finally","leader","find","node","nodeState","followers","filter","forEach","syncStatus","address","showDeleteDialog","open","templateUrl","controller","result","then","Object","values","every","successMessage","failedNodesList","keys","reduce","key","allowHtml","failMessage","timerCounter","timer","$on","CreateClusterCtrl","DeleteClusterCtrl","getAdvancedOptionsClass","optionsModule","document","getElementById","isAriaExpanded","getAttribute","$rootScope","$routeParams","pageTitle","autofocusId","errors","electionMinTimeout","electionRangeTimeout","heartbeatInterval","messageSizeKB","verificationTimeout","currentNode","catch","push","goToClusterManagementPage","isFormValid","clusterConfigurationForm","$invalid","nodesListValid","length","validateClusterSettings","warning","preconditionErrors","splice","map","handleErrors","addNodeToList","nodeRpcAddress","includes","rpcAddress","removeNodeFromList","index","$modalInstance","ok","close","dismiss"],"mappings":"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","file":"26.c1619706b8cbb1ab23cb.bundle.js","sourcesContent":["angular\n .module('graphdb.framework.rest.cluster.service', [])\n .factory('ClusterRestService', ClusterRestService);\n\nClusterRestService.$inject = ['$http'];\n\nconst CLUSTER_GROUP_ENDPOINT = 'rest/cluster';\n\nfunction ClusterRestService($http) {\n return {\n getClusterConfig,\n createCluster,\n updateCluster,\n deleteCluster,\n addNodesToCluster,\n removeNodesFromCluster,\n getClusterStatus,\n getNodeStatus\n };\n\n function getClusterConfig() {\n return $http.get(`${CLUSTER_GROUP_ENDPOINT}/config`);\n }\n\n function createCluster(groupConfiguration) {\n return $http.post(`${CLUSTER_GROUP_ENDPOINT}/config`, groupConfiguration);\n }\n\n function updateCluster(groupConfiguration) {\n if (groupConfiguration.nodes) {\n delete groupConfiguration.nodes;\n }\n return $http.patch(`${CLUSTER_GROUP_ENDPOINT}/config`, groupConfiguration);\n }\n\n function deleteCluster(forceDelete) {\n const data = $.param({\n force: forceDelete\n });\n return $http.delete(`${CLUSTER_GROUP_ENDPOINT}/config?${data}`);\n }\n\n function addNodesToCluster(nodesArray) {\n return $http.post(`${CLUSTER_GROUP_ENDPOINT}/config/node`, nodesArray);\n }\n\n function removeNodesFromCluster(nodesArray) {\n return $http.delete(`${CLUSTER_GROUP_ENDPOINT}/config/node`, nodesArray);\n }\n\n function getClusterStatus() {\n return $http.get(`${CLUSTER_GROUP_ENDPOINT}/group/status`);\n }\n\n function getNodeStatus() {\n return $http.get(`${CLUSTER_GROUP_ENDPOINT}/node/status`);\n }\n}\n","import 'angular/core/services';\nimport 'angular/rest/cluster.rest.service';\n\nconst modules = [\n 'ui.bootstrap',\n 'graphdb.framework.core.services.repositories',\n 'graphdb.framework.rest.repositories.service',\n 'graphdb.framework.rest.cluster.service',\n 'toastr'\n];\n\nangular\n .module('graphdb.framework.clustermanagement.controllers', modules)\n .controller('ClusterManagementCtrl', ClusterManagementCtrl)\n .controller('CreateClusterCtrl', CreateClusterCtrl)\n .controller('DeleteClusterCtrl', DeleteClusterCtrl);\n\nClusterManagementCtrl.$inject = ['$scope', '$http', '$q', 'toastr', '$repositories', '$modal', '$sce',\n '$window', '$interval', 'ModalService', '$timeout', 'ClusterRestService', 'RepositoriesRestService', '$location', '$translate'];\n\nfunction ClusterManagementCtrl($scope, $http, $q, toastr, $repositories, $modal, $sce,\n $window, $interval, ModalService, $timeout, ClusterRestService, RepositoriesRestService, $location, $translate) {\n $scope.loader = true;\n // TODO: Similar function is declared multiple times in different components. Find out how to avoid it!\n $scope.setLoader = function (loader, message) {\n $scope.loader = loader;\n $timeout.cancel($scope.loaderTimeout);\n if (loader) {\n $scope.loaderTimeout = $timeout(function () {\n $scope.loader = loader;\n $scope.loaderMessage = message;\n }, 50);\n } else {\n $scope.loader = false;\n }\n };\n\n $scope.getLoaderMessage = function () {\n return $scope.loaderMessage || $translate.instant('common.loading');\n };\n\n $scope.createCluster = function () {\n $location.path(`${$location.path()}/create`);\n };\n\n $scope.getClusterConfiguration = () => {\n $scope.setLoader(true);\n ClusterRestService.getClusterConfig()\n .success((data, status) => {\n $scope.clusterConfiguration = data;\n })\n .error((data, status) => {\n $scope.clusterConfiguration = null;\n })\n .finally(() => {\n $scope.setLoader(false);\n });\n };\n\n $scope.getClusterStatus = function () {\n ClusterRestService.getClusterStatus()\n .success(function (data, status) {\n if (!$scope.clusterConfiguration) {\n $scope.getClusterConfiguration();\n return;\n }\n $scope.leader = data.find((node) => node.nodeState === 'LEADER');\n\n if ($scope.leader) {\n $scope.followers = data.filter((node) => node !== $scope.leader);\n $scope.followers.forEach((node) => {\n node.syncStatus = $scope.leader.syncStatus[node.address];\n });\n } else {\n $scope.followers = data;\n }\n })\n .error(function (data, status) {\n if (status === 404) {\n $scope.clusterConfiguration = null;\n }\n });\n };\n\n $scope.showDeleteDialog = () => {\n const modalInstance = $modal.open({\n templateUrl: 'js/angular/clustermanagement/templates/modal/cluster-delete-dialog.html',\n controller: 'DeleteClusterCtrl'\n });\n\n modalInstance.result.then(function (forceDelete) {\n const loaderMessage = $translate.instant('cluster_management.delete_cluster_dialog.loader_message');\n $scope.setLoader(true, loaderMessage);\n ClusterRestService.deleteCluster(forceDelete)\n .success((data) => {\n const allNodesDeleted = Object.values(data).every((node) => node === 'DELETED');\n if (allNodesDeleted) {\n const successMessage = $translate.instant('cluster_management.delete_cluster_dialog.notifications.success_delete');\n toastr.success(successMessage);\n } else {\n const successMessage = $translate.instant('cluster_management.delete_cluster_dialog.notifications.success_delete_partial');\n const failedNodesList = Object.keys(data)\n .reduce((message, key) => message += `<div>${key} - ${data[key]}</div>`, '');\n toastr.success(failedNodesList, successMessage, {allowHtml: true});\n }\n $scope.getClusterConfiguration();\n })\n .error((data) => {\n const failMessage = $translate.instant('cluster_management.delete_cluster_dialog.notifications.fail_delete');\n const failedNodesList = Object.keys(data)\n .reduce((message, key) => message += `<div>${key} - ${data[key]}</div>`, '');\n toastr.error(failedNodesList, failMessage, {allowHtml: true});\n })\n .finally(() => $scope.setLoader(false));\n });\n };\n\n $scope.getClusterConfiguration();\n $scope.getClusterStatus();\n\n let timerCounter = 0;\n const timer = $interval(function () {\n if (timerCounter % 3 === 0) {\n $scope.getClusterConfiguration();\n }\n timerCounter++;\n if ($scope.clusterConfiguration) {\n $scope.getClusterStatus();\n }\n }, 2000);\n\n $scope.$on(\"$destroy\", function () {\n $interval.cancel(timer);\n });\n}\n\n\nconst getAdvancedOptionsClass = function () {\n const optionsModule = document.getElementById('advancedOptions');\n\n if (optionsModule) {\n const isAriaExpanded = optionsModule.getAttribute('aria-expanded');\n if (isAriaExpanded && isAriaExpanded === 'true') {\n return 'fa fa-angle-down';\n }\n }\n return 'fa fa-angle-right';\n};\n\nCreateClusterCtrl.$inject = ['$rootScope', '$scope', '$routeParams', '$location', '$timeout', 'ClusterRestService', 'toastr', '$translate'];\n\nfunction CreateClusterCtrl($rootScope, $scope, $routeParams, $location, $timeout, ClusterRestService, toastr, $translate) {\n $scope.pageTitle = $translate.instant('cluster_management.cluster_page.create_page_title');\n $scope.autofocusId = 'autofocus';\n $scope.errors = [];\n $scope.clusterConfiguration = {\n electionMinTimeout: 1500,\n electionRangeTimeout: 2000,\n heartbeatInterval: 500,\n messageSizeKB: 64,\n nodes: [],\n verificationTimeout: 1500\n };\n\n function getCurrentNodeStatus() {\n return ClusterRestService.getNodeStatus()\n .then((data) => {\n $scope.currentNode = data;\n })\n .catch((error) => {\n $scope.currentNode = error.data;\n })\n .finally(() => {\n $scope.clusterConfiguration.nodes.push($scope.currentNode.address);\n });\n }\n getCurrentNodeStatus();\n\n $scope.getAdvancedOptionsClass = getAdvancedOptionsClass;\n\n $rootScope.$on('$translateChangeSuccess', function () {\n $scope.pageTitle = $translate.instant('cluster_management.cluster_page.create_page_title');\n });\n\n $scope.getLoaderMessage = function () {\n return $scope.loaderMessage || $translate.instant('common.loading');\n };\n\n $scope.goToClusterManagementPage = function () {\n $location.path('/cluster');\n };\n\n $scope.createCluster = function () {\n if (!validateClusterSettings()) {\n toastr.warning($translate.instant('cluster_management.cluster_page.notifications.form_invalid'));\n return;\n }\n $scope.setLoader(true, $translate.instant('cluster_management.cluster_page.creating_cluster_loader'));\n ClusterRestService.createCluster($scope.clusterConfiguration)\n .success(function (data, status) {\n toastr.success($translate.instant('cluster_management.cluster_page.notifications.create_success'));\n const timer = $timeout(function () {\n $scope.setLoader(false);\n $scope.goToClusterManagementPage();\n }, 2000);\n $scope.$on('$destroy', function () {\n $timeout.cancel(timer);\n });\n })\n .error(function (data, status) {\n handleErrors(data, status);\n $scope.setLoader(false);\n });\n };\n\n function handleErrors(data, status) {\n delete $scope.preconditionErrors;\n toastr.error($translate.instant('cluster_management.cluster_page.notifications.create_failed'));\n $scope.errors.splice(0);\n if (status === 412) {\n $scope.preconditionErrors = Object.keys(data).map((key) => `${key} - ${data[key]}`);\n } else if (status === 400) {\n $scope.errors.push(...data);\n } else if (status === 409) {\n $scope.errors.push(data);\n }\n }\n\n function validateClusterSettings() {\n const isFormValid = !$scope.clusterConfigurationForm.$invalid;\n const nodesListValid = $scope.clusterConfiguration.nodes && $scope.clusterConfiguration.nodes.length >= 2;\n return isFormValid && nodesListValid;\n }\n\n $scope.setLoader = function (loader, message) {\n $timeout.cancel($scope.loaderTimeout);\n if (loader) {\n $scope.loaderTimeout = $timeout(function () {\n $scope.loader = loader;\n $scope.loaderMessage = message;\n }, 300);\n } else {\n $scope.loader = false;\n }\n };\n\n $scope.addNodeToList = function (nodeRpcAddress) {\n if (!nodeRpcAddress || $scope.clusterConfiguration.nodes.includes(nodeRpcAddress)) {\n return;\n }\n\n $scope.clusterConfiguration.nodes.push(nodeRpcAddress);\n $scope.rpcAddress = '';\n };\n\n $scope.removeNodeFromList = function (index, node) {\n $scope.clusterConfiguration.nodes.splice(index, 1);\n };\n}\n\nDeleteClusterCtrl.$inject = ['$scope', '$modalInstance'];\n\nfunction DeleteClusterCtrl($scope, $modalInstance) {\n $scope.forceDelete = false;\n\n $scope.ok = function () {\n $modalInstance.close($scope.forceDelete);\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n}\n","import 'angular/core/services';\nimport 'angular/core/directives';\nimport 'angular/clustermanagement/controllers';\nimport 'angular/clustermanagement/directives';\nimport 'angular/core/services/repositories.service';\nimport 'd3/build/d3';\nimport 'lib/d3-ONTO-chord-patch';\n\nconst modules = [\n 'ngAnimate',\n 'toastr',\n 'graphdb.framework.clustermanagement.controllers',\n 'graphdb.framework.clustermanagement.directives'\n];\n\nconst clusterManagementApp = angular.module('graphdb.framework.clustermanagement', modules);\n"],"sourceRoot":""}
|