Compare commits
901 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 808836a65f | |||
| 6f7e505bed | |||
| ecf1d75954 | |||
| c5257de436 | |||
| cde5a6d1a4 | |||
| b601c8bcfe | |||
| 023c8260f2 | |||
| 51e2e084af | |||
| fc5dd8137f | |||
| 268fc46ef7 | |||
| 010c65af9c | |||
| db42256dc3 | |||
| e9b537b6e6 | |||
| c615ef476a | |||
| b93e8da235 | |||
| 74a0a57468 | |||
| b19d665817 | |||
| 10dc884fa8 | |||
| d8446c2d5a | |||
| d3cd46bb51 | |||
| bc0da03caf | |||
| c0a356261b | |||
| fa4060b7fe | |||
| 29117fc222 | |||
| 24ba5e5bda | |||
| 2d94857369 | |||
| c6ea7d7e63 | |||
| 3916495329 | |||
| 4e965e59a9 | |||
| 0acb3aa32b | |||
| 9189d8bf4d | |||
| ec0c96bde4 | |||
| 562c8c4afe | |||
| fd6d4493c4 | |||
| 1a2419e096 | |||
| b86cfd49ef | |||
| d421ff9736 | |||
| 92c61701f2 | |||
| d45d9e356c | |||
| 098f9a2675 | |||
| 0347dab82e | |||
| 9aa89a0df9 | |||
| 556bd11725 | |||
| 07f5c21a07 | |||
| 93b20960b8 | |||
| 3cbdd6bfd3 | |||
| c3c38880e6 | |||
| 415bbf5b3b | |||
| 186cb02748 | |||
| 4aaccb909f | |||
| 2daf7dd01a | |||
| ab9ed73e55 | |||
| a4a33fe167 | |||
| e6fbd10031 | |||
| 9868d96fec | |||
| 0d1c2ac40c | |||
| a6d0dddaf7 | |||
| 06d57e8f32 | |||
| 70a40edc5d | |||
| 95d64208d0 | |||
| e28b2e8328 | |||
| 4123745a6b | |||
| 70bb4d71e6 | |||
| dd314e1741 | |||
| 3cbb489ac6 | |||
| 101df4cbf1 | |||
| 42263a0ec0 | |||
| d402f7514e | |||
| 84e6674e23 | |||
| afcfaace19 | |||
| 5a3bd8cfe5 | |||
| f0c90a4744 | |||
| 3baed292e1 | |||
| d41a2cad73 | |||
| ffccc3be38 | |||
| ef1e8d7ef3 | |||
| 7af891216d | |||
| aa80500b35 | |||
| b72fbe06f7 | |||
| 41a63a5418 | |||
| e8ce7898c1 | |||
| 687a45c564 | |||
| 3ac3dd3ca5 | |||
| f2efebf7d9 | |||
| 7b68ce49d5 | |||
| 8a2a41fab0 | |||
| ceaaec5378 | |||
| e49a3e7206 | |||
| dc7986dbad | |||
| 2dfba130f5 | |||
| 155c7c409b | |||
| aacb8970f8 | |||
| be66a0520d | |||
| 3fa3c45794 | |||
| 0f6da1873e | |||
| 1564208e83 | |||
| e724e8db60 | |||
| 5a092a83cd | |||
| ffefe5e8aa | |||
| 631fdd8a26 | |||
| 53d7ef4014 | |||
| 5c3ac79043 | |||
| 90fb1646e0 | |||
| 54604e45e0 | |||
| 9ed0f9eee8 | |||
| b764c44318 | |||
| adbd519061 | |||
| b0415299ca | |||
| e96d05149c | |||
| 354ddcfee5 | |||
| 6d232778e2 | |||
| 95ee7daf21 | |||
| 2238ac5d17 | |||
| c209c1c034 | |||
| b1eec16333 | |||
| e126c45fb3 | |||
| c89ff93be4 | |||
| c82c27a5c5 | |||
| b3e84f407a | |||
| 72902c8984 | |||
| 2c47c5eb99 | |||
| 398129f3e1 | |||
| d74ab12d9e | |||
| 679c0599dd | |||
| 4d04ad5632 | |||
| 3fdc50b354 | |||
| 7eeff32185 | |||
| d40f2cb852 | |||
| f9dc2fb6d5 | |||
| de31dfb11e | |||
| ef6a648189 | |||
| 09953e2af8 | |||
| be240119e8 | |||
| 2b7893c834 | |||
| 896e824ca1 | |||
| 7a94725808 | |||
| a66fb76e9a | |||
| b453d48fee | |||
| a7f2c07998 | |||
| 3cff878f74 | |||
| 665d536481 | |||
| ec6d407fbb | |||
| 72bc7ed6d4 | |||
| ac407ca2c0 | |||
| 6af5f2b528 | |||
| 8fd4a98fbe | |||
| 07d553fae3 | |||
| 34e0eea173 | |||
| 73e6db9a12 | |||
| 0df464ac03 | |||
| 78ee6afbae | |||
| 31be74e6d3 | |||
| 767a09894a | |||
| 0d410d107d | |||
| 7829b18b3c | |||
| b2267a55ce | |||
| eca016fe61 | |||
| 81723f7fa9 | |||
| 44c91fb90c | |||
| 7cb5bd9c95 | |||
| 8196f6b9db | |||
| d72b16531b | |||
| f333196efe | |||
| 6ea047dcb4 | |||
| ea65867b23 | |||
| c41200e762 | |||
| 4c70afbb53 | |||
| 0c1ce66053 | |||
| fa8b8cebf9 | |||
| 72fa89ba76 | |||
| dc7b4cebf2 | |||
| 3c1dd94915 | |||
| 3decbbac3a | |||
| 27f43569f5 | |||
| bd9bded73b | |||
| 0ce81e1ab6 | |||
| 2926201694 | |||
| 059be2c853 | |||
| dd09f31abb | |||
| 1da20da3ff | |||
| 341773830b | |||
| c65452bb01 | |||
| 34d81356a3 | |||
| c9b84a5202 | |||
| 5394cc2dc9 | |||
| 63141f339f | |||
| 079a0b56c3 | |||
| 66721affe7 | |||
| d8ab23e9ba | |||
| 11b0a5c9cc | |||
| d273a72cb3 | |||
| 08641a6694 | |||
| 9ac5c0d886 | |||
| 8a57d33223 | |||
| 1945b53e43 | |||
| 161e1820a8 | |||
| 22b5ac8622 | |||
| f75a70e42b | |||
| c9076606be | |||
| 853d22b947 | |||
| 82d6719d91 | |||
| 3f02c150e3 | |||
| d7d46a93a7 | |||
| dfd51635a6 | |||
| c04366d505 | |||
| fd89e88d40 | |||
| 894de923b9 | |||
| c47e7cd91d | |||
| e359347a3b | |||
| d320017e3c | |||
| e6c34f4311 | |||
| 9b0c945086 | |||
| bc85f5de1d | |||
| 4df219161c | |||
| 06f157e634 | |||
| 54addbdd28 | |||
| 0e721917e7 | |||
| 4dc7089f89 | |||
| 30b5a35db2 | |||
| dc8f81b536 | |||
| a018770a18 | |||
| 5e4f7c5d8e | |||
| 1d9d665ed0 | |||
| 68477c09a7 | |||
| 574b9086d4 | |||
| d74c323c66 | |||
| 8e85a1b84e | |||
| 6ce1cb4325 | |||
| fbbd85d8b2 | |||
| e611dc43c5 | |||
| c86309cfc0 | |||
| ec74e9bce0 | |||
| f371e8a523 | |||
| 57a059eecb | |||
| 2cb149c647 | |||
| ee5371b582 | |||
| 70e4dbe3bd | |||
| 18ead9a64f | |||
| d2764cee2a | |||
| 082c098420 | |||
| 46a42e2901 | |||
| c21cacd309 | |||
| 81ac359f71 | |||
| f5b91c90bc | |||
| 0a92a3012e | |||
| ff8fc237e2 | |||
| b99d943b4d | |||
| 3199fe08e8 | |||
| 7503ce62af | |||
| df8ca250aa | |||
| c71b4bde86 | |||
| 3f67802e3d | |||
| 093ed23140 | |||
| 0f8dee7011 | |||
| 0cb557b716 | |||
| 8137a776b6 | |||
| 1af3e0bd93 | |||
| d3662f2302 | |||
| 5fe34cb593 | |||
| af5166e95d | |||
| 13907d6711 | |||
| c4c9f0e368 | |||
| 394932b57f | |||
| 7dff9bc696 | |||
| 4713eaffdb | |||
| 3a7992b1c8 | |||
| 5275aa72fb | |||
| 9e45b9e808 | |||
| 88dfa14046 | |||
| dd4216d432 | |||
| 628ab85de4 | |||
| 39ea2dd32f | |||
| 1d77c40d0e | |||
| a3cbb4158c | |||
| 52aa84e9f9 | |||
| f08fc7493d | |||
| a80b1bbcb3 | |||
| 7ce8bac3ea | |||
| 5c258797ec | |||
| 0dccc7e91e | |||
| 9e68653949 | |||
| 83c09b4540 | |||
| 5cf2672469 | |||
| 50144721d7 | |||
| 0fe7da80ab | |||
| 068eb33bf6 | |||
| 98b1a7681b | |||
| 488967c6ef | |||
| a5aab95ecf | |||
| 345de3654a | |||
| 6ea7e785e3 | |||
| 0c2331f638 | |||
| 5fe1ce1eff | |||
| 6a6d6f9e0d | |||
| 30a512c880 | |||
| 2b4519a4ad | |||
| 3e25d41c0f | |||
| d8baa93289 | |||
| d8c2640959 | |||
| 2ae4337d0d | |||
| 0416060643 | |||
| 2b1fd77ad7 | |||
| 43567a3119 | |||
| d463c2fbc5 | |||
| 940cba5f90 | |||
| 7321075631 | |||
| a06cbc44cd | |||
| 088b4af795 | |||
| fc0b1e8941 | |||
| 9ad3b12403 | |||
| 88ecec2f9a | |||
| 4ea5e9ce9b | |||
| 9b617af713 | |||
| e70d92f670 | |||
| 1b3acb52f1 | |||
| 052ddc11b7 | |||
| 4e3a5a8823 | |||
| 05e17b70b5 | |||
| 949d764638 | |||
| 5c2cb4de80 | |||
| f68c5cb4f7 | |||
| 06c1f376bc | |||
| 7c7a6a4514 | |||
| 5293349785 | |||
| 2ee0ae1f9e | |||
| 8143237d25 | |||
| a426068273 | |||
| 599b19102e | |||
| e7a979d6b4 | |||
| 7991ed0154 | |||
| a9a3e50179 | |||
| 7642fe046b | |||
| ccc2c39d43 | |||
| 26228e546e | |||
| 6036bc17c5 | |||
| ca4b03f48a | |||
| b0f59ad988 | |||
| c9bdf43a0d | |||
| dadab50f3b | |||
| 0b49eba77a | |||
| 004b7391c6 | |||
| 45c221a3b2 | |||
| 364f074be1 | |||
| e82eded1e9 | |||
| b298f84f51 | |||
| 26ff28aae6 | |||
| 588eb6f691 | |||
| c10448af0b | |||
| 0eb7973ab0 | |||
| 150a87f2ea | |||
| 2505a19a88 | |||
| beea02cea9 | |||
| 600b5cfa8e | |||
| 8055b5e5da | |||
| 4933a75d15 | |||
| 478e13b0fd | |||
| 9c26da70da | |||
| 872a8d983b | |||
| 47d3fe1de5 | |||
| 9421af2c3f | |||
| 90626e353f | |||
| b3e019e7a0 | |||
| 84a0a0743b | |||
| 377bd6e2b7 | |||
| dc42c6a1df | |||
| 0ca70a3197 | |||
| 889f92268e | |||
| 24fba7a36d | |||
| c90672a5ab | |||
| 81c8fc0381 | |||
| 7922a3856e | |||
| 9aea452829 | |||
| e797b759b7 | |||
| b60d5f837e | |||
| 877235c8a2 | |||
| 558bbeaa34 | |||
| 0911abcfc0 | |||
| 04850331ce | |||
| b58336f4c8 | |||
| 4665b4fb37 | |||
| 49197a2ae0 | |||
| c718db21da | |||
| 35f28bdc71 | |||
| bf86b09f4e | |||
| cdde8cfdbe | |||
| cd26b8f728 | |||
| 8abfc7609e | |||
| 7d06e5d684 | |||
| 439870a546 | |||
| 82b35f095e | |||
| b40d7d89a1 | |||
| 8f3dbbc356 | |||
| f748891b4b | |||
| e325a5c27e | |||
| 7d131fbb3d | |||
| 2b63110323 | |||
| a63ca0f0e9 | |||
| 5b2d0a2ade | |||
| 1a984df11a | |||
| fdc7a19628 | |||
| 8087996c8e | |||
| e5f264a510 | |||
| 0a2eb74c26 | |||
| d5bb3bd799 | |||
| cfa9d88be6 | |||
| ac4617ae51 | |||
| f6bcadfeec | |||
| 5272078ea3 | |||
| b6257400ec | |||
| c3a6e01040 | |||
| b63cbbdaaa | |||
| 81d3f35034 | |||
| 1fc2866032 | |||
| eb2e7b9c79 | |||
| cab900f656 | |||
| e2b91e5dc4 | |||
| 00a66e9030 | |||
| 775c8780a6 | |||
| 50a968ace8 | |||
| db41104d9b | |||
| 95bb73c5ac | |||
| 7ed2776476 | |||
| 341dfb934d | |||
| ecebe73c33 | |||
| 1b0c6b919f | |||
| 06b876cf8b | |||
| de0d0a3526 | |||
| 7f99ac0efa | |||
| d2980c58ec | |||
| d244ed6c64 | |||
| a30d9a1af2 | |||
| 7acd6a4d3c | |||
| a6fdcb7493 | |||
| 0cc2437a9d | |||
| 8102cb63ae | |||
| 5062d74041 | |||
| feebb349d5 | |||
| 1036813b97 | |||
| 6b405700ec | |||
| 29b4a83d93 | |||
| 7b159c1e63 | |||
| 02c64ad3a5 | |||
| 13c625d7c0 | |||
| 9a3f49bf9c | |||
| 6698ca400c | |||
| 6bb649bac5 | |||
| b72b74b6c6 | |||
| e7bfea8c69 | |||
| de7e805718 | |||
| 7b5e8646eb | |||
| 966e147a20 | |||
| 269a5bd914 | |||
| 4f1f56f653 | |||
| 6b517d7ffd | |||
| 4eb9a1cfa5 | |||
| db3aeb9ab5 | |||
| 984b7bbeea | |||
| 582beed977 | |||
| 7fa8bd5613 | |||
| 4474172c40 | |||
| 1dde397e2b | |||
| 7ea3b6ca15 | |||
| e52fcf843c | |||
| 08ba273089 | |||
| 956e7b564c | |||
| 08990dd58a | |||
| faa2d632e5 | |||
| 1b939ebf4b | |||
| aa46216117 | |||
| ca32434535 | |||
| ebf4f17f17 | |||
| 22778091f9 | |||
| 4d389ae5ce | |||
| 39e3120058 | |||
| 6b15d7e260 | |||
| 277025775d | |||
| dbd649bfb5 | |||
| df4ddba1ab | |||
| 21985d0814 | |||
| f7031dcb7f | |||
| 0219e62979 | |||
| e66725047a | |||
| 84fa99a126 | |||
| 78b3c9552b | |||
| 1222aeaab6 | |||
| cbbfc5b58c | |||
| 11164ab838 | |||
| 8339f7fdb3 | |||
| 220cd84ef5 | |||
| e5fa446159 | |||
| 70c320e98b | |||
| 8e486da928 | |||
| 7ae906863d | |||
| fb4483fdcf | |||
| e32e6e0bec | |||
| 05e7b90aab | |||
| ee59f91ba2 | |||
| ece3241041 | |||
| fcb1bcb91b | |||
| 728c0e8272 | |||
| 9b212d11f0 | |||
| 223209e1eb | |||
| 5b741a10db | |||
| 1606ea19a8 | |||
| e5632019db | |||
| ff994d594a | |||
| 0214ced8f0 | |||
| 813e5e1db8 | |||
| 69627911b3 | |||
| 29f905b942 | |||
| 551fa7fe10 | |||
| 2ce3cd4c2a | |||
| 8ea24a6b09 | |||
| 00ca91399a | |||
| cf327077e9 | |||
| f215ba9bac | |||
| c3c6b3d166 | |||
| b319cb9525 | |||
| 95cd327022 | |||
| 807cfebf76 | |||
| a29b1259b5 | |||
| 102b8afd66 | |||
| 561fdef815 | |||
| 47db1db861 | |||
| de3d7e925a | |||
| b04c286efc | |||
| b8b82189f7 | |||
| 08b65a954d | |||
| c6c998dc9f | |||
| b3ff91608e | |||
| 1d862db7c9 | |||
| 070cbeebbe | |||
| 2c95f07cb2 | |||
| 4a2277b424 | |||
| a1f02916d4 | |||
| 900dfd92d0 | |||
| d6997b0588 | |||
| 86c74b3ee0 | |||
| b1a8c70d20 | |||
| 9107d1678c | |||
| 095234babc | |||
| 8aecec507e | |||
| 70fb1551af | |||
| fb67e123f4 | |||
| ae2efbc116 | |||
| 4bc0ffa74d | |||
| 6fed932a61 | |||
| 939ebcf897 | |||
| 1239fa874d | |||
| 779ab39f50 | |||
| 00283e3d6e | |||
| 2b4429f8b7 | |||
| 2446c4185a | |||
| 04900e5f90 | |||
| 8abdb8bf51 | |||
| e217068dbd | |||
| e3a9f753d2 | |||
| fc2a586453 | |||
| 979ea449bd | |||
| ba5e2cfc45 | |||
| 3b565d8bb1 | |||
| 21a92b62fd | |||
| 7e33261ccc | |||
| 6a489a0b8f | |||
| 44e9c77568 | |||
| 77816aebac | |||
| 9dd967f2aa | |||
| ef7a08879f | |||
| 647e444a07 | |||
| c417239652 | |||
| e10c92878d | |||
| fc376bfe3f | |||
| 36fe4eaa49 | |||
| a3baab9671 | |||
| edd6c0bd4c | |||
| ce59db528b | |||
| c14b339d80 | |||
| 8f4067adbb | |||
| 54160850b2 | |||
| 524048c4b4 | |||
| 565e625e21 | |||
| 1ccae530d9 | |||
| e8161aa9f4 | |||
| 5a24b8d294 | |||
| aafa9cb6be | |||
| dbdb8e4436 | |||
| bfe2976463 | |||
| 080bf6787a | |||
| 066a9de7ae | |||
| f87e2dd717 | |||
| 1cf80c3ba0 | |||
| 6345d0e73b | |||
| 7f5c1b0d5f | |||
| b7259e3ebb | |||
| fb6e4c0130 | |||
| 241c26e099 | |||
| e2ccb4c049 | |||
| 975fe98cbf | |||
| 40a7cf32c5 | |||
| 9e909cafdd | |||
| db47308762 | |||
| 6d41f7895f | |||
| 7cf4c6f655 | |||
| c63186a798 | |||
| a0ce2d7cdf | |||
| de61ecbfd2 | |||
| 5f6f4915a1 | |||
| f345977e3f | |||
| 853f25468c | |||
| ac709c39ab | |||
| 4939b77a6c | |||
| ded0caee39 | |||
| 3b9ed49d0f | |||
| 7e79ccd710 | |||
| 575c5af1f8 | |||
| ca079a77ce | |||
| a550186337 | |||
| 8594a93cf5 | |||
| a86397f4bd | |||
| d52b63e5e9 | |||
| 400838c79a | |||
| 62b03adb53 | |||
| ffc49c9049 | |||
| 3b042707f5 | |||
| 36b9c51163 | |||
| 07be9cf47a | |||
| 897f3fea99 | |||
| a3b90650be | |||
| 673efe46fb | |||
| a17a60f914 | |||
| 07cbc71aa2 | |||
| 81d6c0d210 | |||
| fdbe45c0ab | |||
| 5666369cc4 | |||
| e3b3e65409 | |||
| c3166e08b4 | |||
| adaf428aa7 | |||
| ef70df1db3 | |||
| c69ca290cf | |||
| 50d4d7a19d | |||
| ab12c51e0f | |||
| e343f8e35e | |||
| 5894b4fd95 | |||
| 99feff549d | |||
| 37518349b9 | |||
| 5b4e194f25 | |||
| 296881b358 | |||
| efb9c0791f | |||
| acc901455b | |||
| cfb7494992 | |||
| f31ac39e37 | |||
| 068ea1e934 | |||
| 7297c1b8e4 | |||
| 211f3769e1 | |||
| 2686c78f06 | |||
| 5b385d9900 | |||
| 31b266659e | |||
| e071b0c2e0 | |||
| 270f04d2d2 | |||
| 9af57c6786 | |||
| ff4a550cbb | |||
| 537e4d7c39 | |||
| 9f16d9b2fc | |||
| ae6d920e2a | |||
| 0d22f9ec29 | |||
| 699076a405 | |||
| df593f486f | |||
| 0d95873a05 | |||
| b20acc9063 | |||
| 70d6d25178 | |||
| 196d165432 | |||
| bb3ca998fc | |||
| da73221cef | |||
| 36f66eed21 | |||
| 8e916d60f5 | |||
| 44048207f2 | |||
| b73b99df8d | |||
| ad69ecc5eb | |||
| 1304bc8fb9 | |||
| a4f63e728c | |||
| 307b3536b7 | |||
| 24c6d3f4b3 | |||
| 4a052708c8 | |||
| 39a8d4f0d8 | |||
| ca22a25842 | |||
| ff9a9a5e4d | |||
| 3d7c59bc3b | |||
| 63ea1f1afd | |||
| baf8f6cca6 | |||
| c67c7e1b5a | |||
| 46d8e5830a | |||
| 37054673b7 | |||
| 86bc5c5547 | |||
| fc44607c73 | |||
| 2a1421f488 | |||
| d7a054f637 | |||
| 9c9ad9aec3 | |||
| 1467c52e03 | |||
| e407145d10 | |||
| 476110b1de | |||
| 45f9f45f50 | |||
| d581d997c2 | |||
| 633344e5bb | |||
| 0cce6b74f9 | |||
| 8b8bfb9bf0 | |||
| 7241ca4ae9 | |||
| e9b11e55e9 | |||
| 48126f55ed | |||
| cb549507ee | |||
| a0b6cdb08e | |||
| 9b9597093c | |||
| c92fb4d9c0 | |||
| 88c659059b | |||
| d1ced600a1 | |||
| a5977f2752 | |||
| 8668e8b036 | |||
| 783c27a584 | |||
| fde0409650 | |||
| 2ed5abf4d3 | |||
| cb372f284d | |||
| 5d674a07f7 | |||
| 59e69c1839 | |||
| 89a3eec6ae | |||
| 6517f1af14 | |||
| b95c4d37d7 | |||
| 7388e8c2c2 | |||
| b837ab41eb | |||
| de6615f586 | |||
| 0947dfc423 | |||
| 002ed9e4c7 | |||
| 1a6a3038d6 | |||
| d86beb06f7 | |||
| 6df61e305d | |||
| 47018b02a8 | |||
| b6ef4d50dc | |||
| 2d86e44c63 | |||
| 69f8fc4d5e | |||
| b339fcbd82 | |||
| 7d1b09ac1b | |||
| 55d01f620a | |||
| 39d0d08ced | |||
| 94f8cc9b62 | |||
| 17b998f01f | |||
| 18415ddb30 | |||
| 2b3d0235cf | |||
| c687f45ff6 | |||
| 13f540f1f5 | |||
| a7aff3bd9a | |||
| 03997e2a0d | |||
| 60c73df685 | |||
| b5ce3b2773 | |||
| 6c09b7dc28 | |||
| bf1fbd7fc4 | |||
| 401530db65 | |||
| 4fb7cb3a8b | |||
| aba8abb176 | |||
| 2b3956cb60 | |||
| 1b0647423d | |||
| 5b627a8bc2 | |||
| 62f7e90748 | |||
| fd1064cb69 | |||
| c677736a8f | |||
| 67038ddd5e | |||
| ff8eb0b67f | |||
| 70afacee3f | |||
| 5b0e959d3f | |||
| b7c5639a9d | |||
| 740af2751a | |||
| 81e385bebf | |||
| 650d18797a | |||
| 49e91b8660 | |||
| 4fb3d99153 | |||
| a29f133e5d | |||
| f277b60cc9 | |||
| 6d8eebcd30 | |||
| 91c97ed232 | |||
| 13a259b473 | |||
| d3f8e0ef4c | |||
| 700751715b | |||
| 58e939beda | |||
| b19b6c93d3 | |||
| 17e4a8ab66 | |||
| 3573e631c8 | |||
| 52588509ed | |||
| e607a67f00 | |||
| 96d7382a1c | |||
| e15530cee1 | |||
| 940f59468a | |||
| ff885ab3bd | |||
| 17cfaf170e | |||
| f1b2186313 | |||
| ac379e3b84 | |||
| 616454edb4 | |||
| d284969379 | |||
| f0eba619f3 | |||
| 448cfff769 | |||
| 99ee59e9cc | |||
| c9ff55f601 | |||
| ecb0438b16 | |||
| d0acbe992e | |||
| fb44e67ea8 | |||
| 3f86c10c44 | |||
| 9e7f0c859f | |||
| a9c54a1f01 | |||
| 1c36bc5fee | |||
| b529270f71 | |||
| bcf45bb68a | |||
| 9744873e7a | |||
| 9a61bb13e6 | |||
| 2f69a158b1 | |||
| 4975793b45 | |||
| d93645fb46 | |||
| d617b6c6e3 | |||
| cc01608f0a | |||
| 8a3db99811 | |||
| 883f7b88cf | |||
| 03da779ddb | |||
| 7c95fc23d0 | |||
| aa2174b43c | |||
| a023732c1c | |||
| 90f9dce44a | |||
| ea54b10bf7 | |||
| 223ccb5a73 | |||
| 968d8159a6 | |||
| 245bf6c7d6 | |||
| ee673cd152 | |||
| a1b6095f6e | |||
| 5663eb527b | |||
| 8e8da76467 | |||
| 8a6acd999a | |||
| f32e8beab8 | |||
| d25e5fe329 | |||
| d0e8aef949 | |||
| ad10349878 | |||
| 560fe31280 | |||
| c67a4a61a4 | |||
| 6e85b8782e | |||
| f719c5ccf1 | |||
| e8c5e417b6 | |||
| 3492d6bbaa | |||
| 15bd181f16 | |||
| 96108cb758 | |||
| 459d6ea906 | |||
| 747f3e171c | |||
| b371296e78 | |||
| 0553a39a02 | |||
| 4ca5e978ac | |||
| 025440ee86 | |||
| 40016f2928 | |||
| 581320e3a4 | |||
| 5fae2ac66f | |||
| 3ba61cd5aa | |||
| 0008f28236 | |||
| f9ec4c6b0d | |||
| 2b20b91ec5 | |||
| e070eeda4a | |||
| 195a761c29 | |||
| 4399d272dc | |||
| 9d7547e941 | |||
| 0a690eb4d8 | |||
| 32309260b9 | |||
| e11e8ad272 | |||
| b45b2017a8 | |||
| ae2a97763d | |||
| 442d49046d | |||
| 3d8cd9616e | |||
| 9c68c89f24 | |||
| 59ad5f35df | |||
| 263f3c46b1 | |||
| 2c13fcf579 | |||
| 7a1c1064ae | |||
| bb52f3d41c | |||
| 0688340722 | |||
| cf7b8455d4 | |||
| df3c6ed572 | |||
| e6c01be2cb | |||
| 2196db9a58 | |||
| f10174da37 | |||
| b48eaa7fd3 | |||
| c34eec160f | |||
| 393996fe88 | |||
| 1ef08424ff | |||
| 20af2c8c0f | |||
| b7e74bd5be | |||
| 34ded19be4 | |||
| f53cad822a | |||
| 090dd45541 | |||
| e01e822394 | |||
| ea5769fdd6 | |||
| 1d2b35fdde | |||
| 1d3c536c93 | |||
| e6b8b17b21 | |||
| 2a0df7e83e | |||
| 12065948ca | |||
| a9e1aee295 | |||
| 73cb789f59 | |||
| 7345811115 | |||
| 22378b28f5 | |||
| 961f0d0ad3 | |||
| 65187e7d01 | |||
| 00c3074216 |
@@ -2,14 +2,14 @@
|
|||||||
# editorconfig.org
|
# editorconfig.org
|
||||||
root = true
|
root = true
|
||||||
|
|
||||||
[*.{cs,html,js,hbs}]
|
[*.{cs}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
[*.less]
|
[*.{js,html,js,hbs,less,css}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"paths": [
|
||||||
|
"frontend/src/**/*.js"
|
||||||
|
],
|
||||||
|
"ignored": [
|
||||||
|
"**/node_modules/**/*"
|
||||||
|
],
|
||||||
|
"port": 5004
|
||||||
|
}
|
||||||
@@ -1,22 +1,12 @@
|
|||||||
# Auto detect text files and perform LF normalization
|
# Auto detect text files and perform LF normalization
|
||||||
*text eol=lf
|
* text=auto
|
||||||
|
|
||||||
|
# Explicitly set bash scripts to have unix endings
|
||||||
|
# when checked out on windows
|
||||||
|
*.sh text eol=lf
|
||||||
|
distribution/debian/* text eol=lf
|
||||||
|
macOS/Sonarr text eol=lf
|
||||||
|
|
||||||
# Custom for Visual Studio
|
# Custom for Visual Studio
|
||||||
*.cs diff=csharp
|
*.cs diff=csharp
|
||||||
*.sln merge=union
|
*.sln merge=union
|
||||||
*.csproj merge=union
|
|
||||||
*.vbproj merge=union
|
|
||||||
*.fsproj merge=union
|
|
||||||
*.dbproj merge=union
|
|
||||||
|
|
||||||
# Standard to msysgit
|
|
||||||
*.doc diff=astextplain
|
|
||||||
*.DOC diff=astextplain
|
|
||||||
*.docx diff=astextplain
|
|
||||||
*.DOCX diff=astextplain
|
|
||||||
*.dot diff=astextplain
|
|
||||||
*.DOT diff=astextplain
|
|
||||||
*.pdf diff=astextplain
|
|
||||||
*.PDF diff=astextplain
|
|
||||||
*.rtf diff=astextplain
|
|
||||||
*.RTF diff=astextplain
|
|
||||||
@@ -1,5 +1,41 @@
|
|||||||
|
<!--
|
||||||
|
Before opening a new issue, please ensure:
|
||||||
|
- You use the forums for support/questions
|
||||||
|
- You search for existing bugs/feature requests
|
||||||
|
- Remove extraneous template details
|
||||||
|
- Do not prefix title with type of issue (Feature Request, Bug, etc.) The appropriate labels will be added during triage.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Support / Questions
|
||||||
|
|
||||||
|
Please use https://forums.sonarr.tv/ for support. Support requests or questions will be redirected to the forums and the issue will be closed.
|
||||||
|
|
||||||
Provide a description of the feature request or bug, the more details the better.
|
<!--
|
||||||
Please use https://forums.sonarr.tv/ for support or other questions. (When in doubt, use the forums)
|
Remove if not opening a bug report
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Bug Report
|
||||||
|
|
||||||
|
### System Information/Logs
|
||||||
|
|
||||||
|
**Sonarr Version:**
|
||||||
|
|
||||||
|
**Operating System:**
|
||||||
|
|
||||||
|
**.net Framework (Windows) or mono (macOS/Linux) Version:**
|
||||||
|
|
||||||
|
**Link to Log Files (debug or trace):**
|
||||||
|
|
||||||
|
**Browser (for UI bugs):**
|
||||||
|
|
||||||
|
### Additional Information
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Remove if not opening a feature request
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Feature Request
|
||||||
|
|
||||||
|
### What problem are you looking to solve?
|
||||||
|
|
||||||
|
### Other Information
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve Sonarr
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Logs**
|
||||||
|
Link to debug or trace log files.
|
||||||
|
|
||||||
|
**System Information**
|
||||||
|
|
||||||
|
- Sonarr Version: [e.g. 2.0.0.1]
|
||||||
|
- Operating System: [e.g. Windows 10]
|
||||||
|
- .net Framework (Windows) or mono (macOS/Linux) Version: [e.g. 4.5 or 5.12]
|
||||||
|
|
||||||
|
**UI Bugs:**
|
||||||
|
- OS: [e.g. Windows]
|
||||||
|
- Browser: [e.g. chrome, firefox]
|
||||||
|
- Version: [e.g. 22]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for Sonarr
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the problem**
|
||||||
|
A clear and concise description of the problem you're looking to solve.
|
||||||
|
|
||||||
|
**Describe any solutions you think might work**
|
||||||
|
A clear and concise description of any solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
name: Other issues
|
||||||
|
about: How to get support or ask questions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Please use https://forums.sonarr.tv/ for support. Support requests or questions will be redirected to the forums and the issue will be closed.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
## Support
|
||||||
|
|
||||||
|
There are a number of frequently asked questions that have been answered in our [FAQ](https://github.com/Sonarr/Sonarr/wiki/FAQ)
|
||||||
|
|
||||||
|
The [wiki](https://github.com/Sonarr/Sonarr/wiki) contains other information and guides
|
||||||
|
|
||||||
|
If you have a support question, please use the [support forums](https://forums.sonarr.tv/).
|
||||||
@@ -45,6 +45,10 @@ _dotCover*
|
|||||||
# DevExpress CodeRush
|
# DevExpress CodeRush
|
||||||
src/.cr/
|
src/.cr/
|
||||||
|
|
||||||
|
# Emacs
|
||||||
|
*~
|
||||||
|
\#*\#
|
||||||
|
|
||||||
# NCrunch
|
# NCrunch
|
||||||
*.ncrunch*
|
*.ncrunch*
|
||||||
.*crunch*.local.xml
|
.*crunch*.local.xml
|
||||||
@@ -115,12 +119,14 @@ node_modules/
|
|||||||
_output*
|
_output*
|
||||||
_rawPackage/
|
_rawPackage/
|
||||||
_dotTrace*
|
_dotTrace*
|
||||||
_tests/
|
_tests*
|
||||||
|
_publish*
|
||||||
|
_temp*
|
||||||
*.Result.xml
|
*.Result.xml
|
||||||
setup/Output/
|
setup/Output/
|
||||||
*.~is
|
*.~is
|
||||||
|
|
||||||
UI.Phantom/
|
UI/
|
||||||
|
|
||||||
#VS outout folders
|
#VS outout folders
|
||||||
bin
|
bin
|
||||||
@@ -130,8 +136,8 @@ output/*
|
|||||||
|
|
||||||
#OS X metadata files
|
#OS X metadata files
|
||||||
._*
|
._*
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
_start
|
_start
|
||||||
_temp_*/**/*
|
|
||||||
|
|
||||||
src/.idea/
|
src/.idea/
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
[submodule "src/ExternalModules/CurlSharp"]
|
|
||||||
path = src/ExternalModules/CurlSharp
|
|
||||||
url = https://github.com/Sonarr/CurlSharp.git
|
|
||||||
branch = master
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Sonarr
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="WEB_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/.idea" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/Logo" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_output" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_output_mono" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_output_osx" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_output_osx_app" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_start" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/_tests" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/debian" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/node_modules" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/osx" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/schemas" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/setup" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/src" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/tools" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
<orderEntry type="library" name="Sonarr node_modules" level="project" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectCodeStyleSettingsManager">
|
|
||||||
<option name="PER_PROJECT_SETTINGS">
|
|
||||||
<value>
|
|
||||||
<option name="LINE_SEPARATOR" value=" " />
|
|
||||||
<option name="RIGHT_MARGIN" value="190" />
|
|
||||||
<option name="HTML_ATTRIBUTE_WRAP" value="0" />
|
|
||||||
<option name="HTML_KEEP_LINE_BREAKS" value="false" />
|
|
||||||
<option name="HTML_KEEP_BLANK_LINES" value="1" />
|
|
||||||
<option name="HTML_ALIGN_ATTRIBUTES" value="false" />
|
|
||||||
<option name="HTML_INLINE_ELEMENTS" value="" />
|
|
||||||
<option name="HTML_DONT_ADD_BREAKS_IF_INLINE_CONTENT" value="" />
|
|
||||||
<CssCodeStyleSettings>
|
|
||||||
<option name="HEX_COLOR_LOWER_CASE" value="true" />
|
|
||||||
<option name="HEX_COLOR_LONG_FORMAT" value="true" />
|
|
||||||
<option name="VALUE_ALIGNMENT" value="1" />
|
|
||||||
</CssCodeStyleSettings>
|
|
||||||
<JSCodeStyleSettings>
|
|
||||||
<option name="SPACE_BEFORE_PROPERTY_COLON" value="true" />
|
|
||||||
<option name="ALIGN_OBJECT_PROPERTIES" value="2" />
|
|
||||||
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
|
|
||||||
<option name="OBJECT_LITERAL_WRAP" value="2" />
|
|
||||||
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
|
|
||||||
</JSCodeStyleSettings>
|
|
||||||
<XML>
|
|
||||||
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
|
|
||||||
</XML>
|
|
||||||
<codeStyleSettings language="CSS">
|
|
||||||
<indentOptions>
|
|
||||||
<option name="SMART_TABS" value="true" />
|
|
||||||
</indentOptions>
|
|
||||||
</codeStyleSettings>
|
|
||||||
<codeStyleSettings language="JavaScript">
|
|
||||||
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="true" />
|
|
||||||
<option name="KEEP_LINE_BREAKS" value="false" />
|
|
||||||
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
|
|
||||||
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
|
|
||||||
<option name="CATCH_ON_NEW_LINE" value="true" />
|
|
||||||
<option name="FINALLY_ON_NEW_LINE" value="true" />
|
|
||||||
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
|
||||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
|
||||||
<option name="SPACE_BEFORE_METHOD_PARENTHESES" value="true" />
|
|
||||||
<option name="CALL_PARAMETERS_WRAP" value="1" />
|
|
||||||
<option name="BINARY_OPERATION_WRAP" value="1" />
|
|
||||||
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
|
|
||||||
<option name="ARRAY_INITIALIZER_WRAP" value="2" />
|
|
||||||
<option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
|
|
||||||
<option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
|
|
||||||
<option name="IF_BRACE_FORCE" value="3" />
|
|
||||||
<option name="DOWHILE_BRACE_FORCE" value="3" />
|
|
||||||
<option name="WHILE_BRACE_FORCE" value="3" />
|
|
||||||
<option name="FOR_BRACE_FORCE" value="3" />
|
|
||||||
</codeStyleSettings>
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Encoding">
|
|
||||||
<file url="PROJECT" charset="UTF-8" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="JavaScriptLibraryMappings">
|
|
||||||
<includedPredefinedLibrary name="ECMAScript 6" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<component name="libraryTable">
|
|
||||||
<library name="Sonarr node_modules" type="javaScript">
|
|
||||||
<properties>
|
|
||||||
<option name="frameworkName" value="node_modules" />
|
|
||||||
<sourceFilesUrls>
|
|
||||||
<item url="file://$PROJECT_DIR$/node_modules" />
|
|
||||||
</sourceFilesUrls>
|
|
||||||
</properties>
|
|
||||||
<CLASSES>
|
|
||||||
<root url="file://$PROJECT_DIR$/node_modules" />
|
|
||||||
</CLASSES>
|
|
||||||
<SOURCES />
|
|
||||||
</library>
|
|
||||||
</component>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
|
||||||
<OptionsSetting value="true" id="Add" />
|
|
||||||
<OptionsSetting value="true" id="Remove" />
|
|
||||||
<OptionsSetting value="true" id="Checkout" />
|
|
||||||
<OptionsSetting value="true" id="Update" />
|
|
||||||
<OptionsSetting value="true" id="Status" />
|
|
||||||
<OptionsSetting value="true" id="Edit" />
|
|
||||||
<ConfirmationsSetting value="0" id="Add" />
|
|
||||||
<ConfirmationsSetting value="0" id="Remove" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" />
|
|
||||||
</project>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/Sonarr.iml" filepath="$PROJECT_DIR$/.idea/Sonarr.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -7,21 +7,7 @@ Setup guides, FAQ, the more information we have on the wiki the better.
|
|||||||
|
|
||||||
## Development ##
|
## Development ##
|
||||||
|
|
||||||
### Tools required ###
|
See the readme for information on setting up your development environment.
|
||||||
- Visual Studio 2015
|
|
||||||
- HTML/Javascript editor of choice (Sublime Text/Webstorm/Atom/etc)
|
|
||||||
- npm (node package manager)
|
|
||||||
- git
|
|
||||||
|
|
||||||
### Getting started ###
|
|
||||||
|
|
||||||
1. Fork Sonarr
|
|
||||||
2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)*
|
|
||||||
3. Run `npm install`
|
|
||||||
4. Run `npm start` - Used to compile the UI components and copy them.
|
|
||||||
Leave this window open.
|
|
||||||
If you have gulp globally installed you can use `gulp watch` instead
|
|
||||||
5. Compile in Visual Studio
|
|
||||||
|
|
||||||
### Contributing Code ###
|
### Contributing Code ###
|
||||||
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Sonarr/Sonarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first)
|
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Sonarr/Sonarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 490 B After Width: | Height: | Size: 423 B |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 620 B |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 824 B |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 929 B |
@@ -1,240 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<svg height="216.9" viewBox="0 0 216.7 216.9" width="216.7" xmlns="http://www.w3.org/2000/svg">
|
||||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
<path clip-rule="evenodd" d="M216.7 108.45c0 29.833-10.533 55.4-31.6 76.7-.7.833-1.483 1.6-2.35 2.3-3.466 3.4-7.133 6.484-11 9.25-18.267 13.467-39.367 20.2-63.3 20.2-23.967 0-45.033-6.733-63.2-20.2-4.8-3.4-9.3-7.25-13.5-11.55-16.367-16.266-26.417-35.167-30.15-56.7-.733-4.2-1.217-8.467-1.45-12.8-.1-2.4-.15-4.8-.15-7.2 0-2.533.05-4.95.15-7.25 0-.233.066-.467.2-.7 1.567-26.6 12.033-49.583 31.4-68.95C53.05 10.517 78.617 0 108.45 0c29.933 0 55.484 10.517 76.65 31.55 21.067 21.433 31.6 47.067 31.6 76.9z" fill="#EEE" fill-rule="evenodd"/>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<path clip-rule="evenodd" d="M194.65 42.5l-22.4 22.4C159.152 77.998 158 89.4 158 109.5c0 17.934 2.852 34.352 16.2 47.7 9.746 9.746 19 18.95 19 18.95-2.5 3.067-5.2 6.067-8.1 9-.7.833-1.483 1.6-2.35 2.3-2.533 2.5-5.167 4.817-7.9 6.95l-17.55-17.55c-15.598-15.6-27.996-17.1-48.6-17.1-19.77 0-33.223 1.822-47.7 16.3-8.647 8.647-18.55 18.6-18.55 18.6-3.767-2.867-7.333-6.034-10.7-9.5-2.8-2.8-5.417-5.667-7.85-8.6 0 0 9.798-9.848 19.15-19.2 13.852-13.853 16.1-29.916 16.1-47.85 0-17.5-2.874-33.823-15.6-46.55-8.835-8.836-21.05-21-21.05-21 2.833-3.6 5.917-7.067 9.25-10.4 2.934-2.867 5.934-5.55 9-8.05L61.1 43.85C74.102 56.852 90.767 60.2 108.7 60.2c18.467 0 35.077-3.577 48.6-17.1 8.32-8.32 19.3-19.25 19.3-19.25 2.9 2.367 5.733 4.933 8.5 7.7 3.467 3.533 6.65 7.183 9.55 10.95z" fill="#3A3F51" fill-rule="evenodd"/>
|
||||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="218px"
|
<g clip-rule="evenodd">
|
||||||
height="218px" viewBox="0 0 218 218" enable-background="new 0 0 218 218" xml:space="preserve">
|
<path d="M78.7 114c-.2-1.167-.332-2.35-.4-3.55-.032-.667-.05-1.333-.05-2 0-.7.018-1.367.05-2 0-.067.018-.133.05-.2.435-7.367 3.334-13.733 8.7-19.1 5.9-5.833 12.984-8.75 21.25-8.75 8.3 0 15.384 2.917 21.25 8.75 5.834 5.934 8.75 13.033 8.75 21.3 0 8.267-2.916 15.35-8.75 21.25-.2.233-.416.45-.65.65-.966.933-1.982 1.783-3.05 2.55-5.065 3.733-10.916 5.6-17.55 5.6s-12.466-1.866-17.5-5.6c-1.332-.934-2.582-2-3.75-3.2-4.532-4.5-7.316-9.734-8.35-15.7z" fill="#0CF" fill-rule="evenodd"/>
|
||||||
<symbol id="hex_grid" viewBox="-114.25 -98.617 228.55 197.233">
|
<path d="M157.8 59.75l-15 14.65M30.785 32.526L71.65 73.25m84.6 84.25l27.808 28.78m1.855-153.894L157.8 59.75m-125.45 126l27.35-27.4" fill="none" stroke="#0CF" stroke-miterlimit="1" stroke-width="2"/>
|
||||||
|
<path d="M157.8 59.75l-16.95 17.2M58.97 60.604l17.2 17.15M59.623 158.43l16.75-17.4m61.928-1.396l18.028 17.945" fill="none" stroke="#0CF" stroke-miterlimit="1" stroke-width="7"/>
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="none" stroke="#989898" stroke-width="0.5" stroke-linecap="square" stroke-miterlimit="1" d="
|
</g>
|
||||||
M72.15,90.3l4.7-2.7l4.65,2.7v5.4l-4.65,2.7l-4.7-2.7V90.3z M62.85,95.7l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7V95.7l4.65,2.7
|
</svg>
|
||||||
l4.65-2.7 M62.85,90.3l4.65-2.7l4.65,2.7 M62.85,79.55v-5.4l4.65-2.7l4.65,2.7v5.4L67.5,82.2L62.85,79.55L58.2,82.2l-4.65-2.65
|
|
||||||
M72.15,74.15l4.7-2.7l4.65,2.7v5.4l-4.65,2.65l-4.7-2.65 M76.85,87.6v-5.4 M67.5,87.6v-5.4 M81.5,95.7l4.65,2.7l4.65-2.7l4.65,2.7
|
|
||||||
l4.65-2.7l4.65,2.7l4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4
|
|
||||||
l4.65-2.7v-5.4L109.4,31v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7
|
|
||||||
V-31l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4
|
|
||||||
l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7
|
|
||||||
l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7L7-98.4l-4.65,2.7l-4.65-2.7
|
|
||||||
l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7
|
|
||||||
l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7v5.4l-4.65,2.7
|
|
||||||
v5.4l4.65,2.65v5.4l-4.65,2.7v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65
|
|
||||||
v5.4l-4.65,2.7v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7V31l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7
|
|
||||||
v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7v5.4l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.7,2.7
|
|
||||||
l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.7,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7
|
|
||||||
l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7L7,95.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.7,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7
|
|
||||||
l4.65-2.7 M44.25,95.7v-5.4l4.65-2.7l4.65,2.7 M44.25,79.55v-5.4l4.65-2.7l4.65,2.7v5.4L48.9,82.2L44.25,79.55L39.6,82.2
|
|
||||||
l-4.65-2.65 M58.2,87.6v-5.4 M48.9,87.6v-5.4 M53.55,63.35v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L53.55,63.35l-4.65,2.7l-4.65-2.7
|
|
||||||
v-5.4l4.65-2.7l4.65,2.7 M62.85,74.15l-4.65-2.7v-5.4 M53.55,74.15l4.65-2.7 M48.9,71.45v-5.4 M48.9,55.25v-5.4l4.65-2.65
|
|
||||||
l4.65,2.65v5.4 M67.5,71.45v-5.4l4.65-2.7l4.7,2.7v5.4 M67.5,66.05l-4.65-2.7 M58.2,49.85l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
|
|
||||||
M72.15,63.35v-5.4l4.7-2.7l4.65,2.7v5.4l-4.65,2.7 M76.85,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M67.5,55.25l4.65,2.7
|
|
||||||
M34.95,95.7v-5.4l4.65-2.7l4.65,2.7 M16.3,95.7v-5.4l4.65-2.7l4.65,2.7v5.4 M25.6,90.3l4.7-2.7l4.65,2.7 M25.6,79.55v-5.4l4.7-2.7
|
|
||||||
l4.65,2.7v5.4L30.3,82.2L25.6,79.55l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M20.95,87.6v-5.4 M39.6,87.6v-5.4 M30.3,87.6
|
|
||||||
v-5.4 M7,95.7v-5.4l4.65-2.7l4.65,2.7 M-2.3,95.7v-5.4l4.65-2.7L7,90.3 M2.35,82.2l-4.65-2.65v-5.4l4.65-2.7L7,74.15v5.4L2.35,82.2
|
|
||||||
z M16.3,79.55l-4.65,2.65L7,79.55 M2.35,87.6v-5.4 M11.65,87.6v-5.4 M16.3,74.15l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M2.35,71.45
|
|
||||||
v-5.4L7,63.35l4.65,2.7 M2.35,49.85L7,47.2l4.65,2.65v5.4L7,57.95l-4.65-2.7V49.85L-2.3,47.2v-5.4l4.65-2.7L7,41.8v5.4
|
|
||||||
M11.65,55.25l4.65,2.7v5.4 M7,74.15l4.65-2.7 M7,57.95v5.4 M30.3,71.45v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M16.3,57.95
|
|
||||||
l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M30.3,66.05l-4.7-2.7 M30.3,49.85l4.65-2.65l4.65,2.65v5.4l-4.65,2.7l-4.65-2.7V49.85l-4.7-2.65
|
|
||||||
v-5.4l-4.65-2.7v-5.4L25.6,31l4.7,2.7v5.4l-4.7,2.7 M11.65,49.85l4.65-2.65l4.65,2.65v5.4 M25.6,57.95l4.7-2.7 M34.95,57.95v5.4
|
|
||||||
M34.95,47.2v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M25.6,31v-5.4l4.7-2.7l4.65,2.7V31l-4.65,2.7 M34.95,25.6l4.65-2.7l4.65,2.7
|
|
||||||
V31l-4.65,2.7L34.95,31 M30.3,39.1l4.65,2.7 M39.6,39.1v-5.4 M20.95,39.1l-4.65,2.7l-4.65-2.7v-5.4L16.3,31l4.65,2.7 M16.3,41.8
|
|
||||||
v5.4 M2.35,33.7L-2.3,31v-5.4l4.65-2.7L7,25.6V31L2.35,33.7z M7,25.6l4.65-2.7l4.65,2.7V31 M2.35,39.1v-5.4 M11.65,33.7L7,31
|
|
||||||
M7,41.8l4.65-2.7 M11.65,17.5L7,14.85v-5.4l4.65-2.7l4.65,2.7v5.4L11.65,17.5z M11.65,22.9v-5.4 M2.35,22.9v-5.4L7,14.85 M7,9.45
|
|
||||||
l-4.65-2.7v-5.4L7-1.35l4.65,2.7v5.4 M34.95,14.85v-5.4l4.65-2.7l4.65,2.7v5.4L39.6,17.5L34.95,14.85z M39.6,22.9v-5.4 M25.6,25.6
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.65l4.7,2.65v5.4 M16.3,9.45l4.65-2.7l4.65,2.7v5.4 M34.95,9.45l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4
|
|
||||||
M11.65,1.35l4.65-2.7l4.65,2.7v5.4 M25.6,9.45l4.7-2.7 M30.3,17.5l4.65-2.65 M16.3,25.6l4.65-2.7 M20.95,17.5l-4.65-2.65
|
|
||||||
M76.85,49.85l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7v5.4 M62.85,47.2v-5.4l4.65-2.7l4.65,2.7 M62.85,25.6l4.65-2.7l4.65,2.7V31
|
|
||||||
l-4.65,2.7L62.85,31V25.6l-4.65-2.7v-5.4 M72.15,25.6l4.7-2.7l4.65,2.7V31l-4.65,2.7l-4.7-2.7 M76.85,39.1v-5.4 M67.5,39.1v-5.4
|
|
||||||
M53.55,47.2v-5.4l4.65-2.7l4.65,2.7 M44.25,41.8l4.65-2.7l4.65,2.7 M44.25,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7L44.25,31
|
|
||||||
M62.85,31l-4.65,2.7L53.55,31 M58.2,39.1v-5.4 M48.9,39.1v-5.4 M53.55,14.85v-5.4l4.65-2.7l4.65,2.7v5.4L58.2,17.5L53.55,14.85
|
|
||||||
L48.9,17.5l-4.65-2.65 M48.9,22.9v-5.4 M53.55,9.45l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M44.25,9.45l4.65-2.7 M76.85,22.9v-5.4
|
|
||||||
l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M76.85,17.5l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7v5.4 M67.5,22.9v-5.4l4.65-2.65 M67.5,17.5
|
|
||||||
l-4.65-2.65 M72.15,9.45l-4.65-2.7v-5.4l4.65-2.7l4.7,2.7v5.4 M62.85,9.45l4.65-2.7 M53.55,25.6l4.65-2.7 M44.25,63.35l-4.65,2.7
|
|
||||||
M39.6,55.25l4.65,2.7 M39.6,71.45l4.65,2.7 M67.5,49.85l4.65-2.65 M48.9,49.85l-4.65-2.65 M25.6,47.2l-4.65,2.65 M104.75,87.6
|
|
||||||
l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65V87.6l4.65,2.7 M109.4,79.55l-4.65,2.65 M100.1,95.7v-5.4 M81.5,90.3l4.65-2.7
|
|
||||||
l4.65,2.7v5.4 M81.5,74.15l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65 M90.8,79.55l4.65,2.65 M86.15,87.6v-5.4 M90.8,90.3
|
|
||||||
l4.65-2.7 M95.45,71.45v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L95.45,71.45l-4.65,2.7 M86.15,55.25l4.65,2.7v5.4l-4.65,2.7
|
|
||||||
l-4.65-2.7 M86.15,71.45v-5.4 M95.45,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7L95.45,55.25l-4.65,2.7 M100.1,63.35v-5.4
|
|
||||||
M90.8,63.35l4.65,2.7 M109.4,63.35l-4.65,2.7 M104.75,71.45l4.65,2.7 M104.75,55.25l4.65,2.7 M100.1,79.55v-5.4 M100.1,47.2v-5.4
|
|
||||||
l4.65-2.7l4.65,2.7 M100.1,41.8l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M109.4,31l-4.65,2.7 M81.5,41.8l4.65-2.7l4.65,2.7v5.4
|
|
||||||
l-4.65,2.65 M86.15,22.9l4.65,2.7V31l-4.65,2.7L81.5,31 M100.1,31v-5.4l4.65-2.7l4.65,2.7 M90.8,31l4.65,2.7 M86.15,39.1v-5.4
|
|
||||||
M90.8,41.8l4.65-2.7 M86.15,17.5l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M90.8,14.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65
|
|
||||||
M81.5,9.45l4.65-2.7l4.65,2.7 M86.15,6.75v-5.4l4.65-2.7l4.65,2.7v5.4 M100.1,14.85l4.65,2.65v5.4 M109.4,14.85l-4.65,2.65
|
|
||||||
M100.1,9.45l4.65-2.7l4.65,2.7 M95.45,1.35l4.65-2.7l4.65,2.7v5.4 M95.45,22.9l4.65,2.7 M109.4,47.2l-4.65,2.65 M90.8,47.2
|
|
||||||
l4.65,2.65 M104.75-9.45l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65V-9.45l4.65,2.7 M109.4-17.5l-4.65,2.65 M100.1-1.35v-5.4
|
|
||||||
M90.8-1.35v-5.4l4.65-2.7 M81.5-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4L81.5-6.75v5.4l-4.65,2.7 M90.8-6.75l-4.65-2.7
|
|
||||||
M95.45-14.85L90.8-17.5v-5.4l4.65-2.7l4.65,2.7v5.4 M76.85-14.85l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7v5.4 M86.15-14.85l4.65-2.65
|
|
||||||
M95.45-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L95.45-31z M95.45-25.6V-31 M90.8-22.9l-4.65-2.7V-31l4.65-2.7 M86.15-31
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M86.15-41.8v-5.4l4.65-2.65l4.65,2.65v5.4 M100.1-33.7l4.65,2.7v5.4l-4.65,2.7 M109.4-33.7
|
|
||||||
l-4.65,2.7 M95.45-47.2l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M104.75-41.8l4.65,2.7 M81.5-22.9l4.65-2.7 M104.75-25.6l4.65,2.7
|
|
||||||
M100.1-49.85v-5.4l4.65-2.7l4.65,2.7 M109.4-66.05l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M104.75-63.35v5.4 M100.1-55.25
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.7 M86.15-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M86.15-74.15l4.65,2.7v5.4l-4.65,2.7l-4.65-2.7v-5.4
|
|
||||||
L86.15-74.15v-5.4l4.65-2.65l4.65,2.65 M90.8-71.45l4.65-2.7l4.65,2.7 M95.45-63.35l-4.65-2.7 M90.8-55.25l4.65-2.7 M86.15-57.95
|
|
||||||
v-5.4 M95.45-74.15v-5.4l4.65-2.65l4.65,2.65v5.4 M81.5-71.45l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65 M81.5-82.2v-5.4l4.65-2.7
|
|
||||||
l4.65,2.7v5.4 M86.15-90.3v-5.4 M104.75-95.7v5.4l-4.65,2.7l-4.65-2.7v-5.4 M100.1-82.2v-5.4 M95.45-90.3l-4.65,2.7 M109.4-82.2
|
|
||||||
l-4.65,2.65 M104.75-90.3l4.65,2.7 M109.4-49.85l-4.65,2.65 M72.15-1.35v-5.4l4.7-2.7 M67.5,1.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7
|
|
||||||
M72.15-17.5l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M67.5-14.85v5.4 M53.55-1.35v-5.4l4.65-2.7l4.65,2.7 M48.9,1.35
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M44.25-22.9l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65V-22.9l-4.65-2.7V-31 M53.55-17.5
|
|
||||||
l4.65,2.65v5.4 M48.9-9.45v-5.4 M53.55-33.7v-5.4l4.65-2.7l4.65,2.7v5.4L58.2-31L53.55-33.7z M62.85-22.9l-4.65-2.7V-31 M48.9-25.6
|
|
||||||
V-31l4.65-2.7 M48.9-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M48.9-41.8v-5.4l4.65-2.65l4.65,2.65v5.4 M76.85-25.6V-31l4.65-2.7
|
|
||||||
M76.85-31l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7 M62.85-33.7L67.5-31v5.4 M72.15-39.1l-4.65-2.7v-5.4l4.65-2.65l4.7,2.65v5.4
|
|
||||||
M62.85-39.1l4.65-2.7 M72.15-33.7L67.5-31 M53.55-22.9l4.65-2.7 M58.2-14.85l4.65-2.65 M30.3,1.35l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7
|
|
||||||
v5.4 M30.3-9.45v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M16.3-1.35v-5.4l4.65-2.7l4.65,2.7 M30.3-14.85l-4.7-2.65v-5.4l4.7-2.7
|
|
||||||
l4.65,2.7v5.4 M25.6-17.5l-4.65,2.65L16.3-17.5v-5.4l4.65-2.7l4.65,2.7 M20.95-14.85v5.4 M16.3-6.75l-4.65-2.7v-5.4l4.65-2.65
|
|
||||||
M2.35,1.35l-4.65-2.7v-5.4l4.65-2.7L7-6.75v5.4 M7-17.5l-4.65,2.65L-2.3-17.5v-5.4l4.65-2.7L7-22.9V-17.5l4.65,2.65 M11.65-9.45
|
|
||||||
L7-6.75 M2.35-9.45v-5.4 M11.65-31L7-33.7v-5.4l4.65-2.7l4.65,2.7v5.4L11.65-31z M16.3-22.9l-4.65-2.7V-31 M2.35-25.6V-31L7-33.7
|
|
||||||
M7-39.1l-4.65-2.7v-5.4L7-49.85l4.65,2.65v5.4 M44.25-33.7L39.6-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M20.95-25.6V-31l4.65-2.7
|
|
||||||
l4.7,2.7v5.4 M20.95-47.2l4.65-2.65l4.7,2.65v5.4l-4.7,2.7l-4.65-2.7V-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M30.3-47.2
|
|
||||||
l4.65-2.65l4.65,2.65v5.4 M30.3-41.8l4.65,2.7 M25.6-33.7v-5.4 M34.95-33.7L30.3-31 M34.95-22.9l4.65-2.7 M20.95-31l-4.65-2.7
|
|
||||||
M16.3-39.1l4.65-2.7 M7-22.9l4.65-2.7 M34.95-55.25l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L34.95-55.25v5.4 M25.6-49.85v-5.4
|
|
||||||
l4.7-2.7 M30.3-63.35l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7v5.4 M25.6-66.05l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M30.3-74.15
|
|
||||||
v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M20.95-63.35v5.4 M7-49.85v-5.4l4.65-2.7l4.65,2.7 M2.35-47.2l-4.65-2.65v-5.4l4.65-2.7
|
|
||||||
L7-55.25 M2.35-63.35l-4.65-2.7v-5.4l4.65-2.7L7-71.45v5.4L2.35-63.35z M16.3-71.45l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4
|
|
||||||
M11.65-57.95v-5.4l4.65-2.7 M2.35-57.95v-5.4 M7-66.05l4.65,2.7 M11.65-74.15L7-71.45 M2.35-74.15v-5.4L7-82.2l4.65,2.65
|
|
||||||
M11.65-95.7v5.4L7-87.6l-4.65-2.7v-5.4 M20.95-95.7v5.4l-4.65,2.7l-4.65-2.7 M7-87.6v5.4 M16.3-87.6v5.4 M20.95-90.3l4.65,2.7v5.4
|
|
||||||
l-4.65,2.65 M30.3-79.55l-4.7-2.65 M30.3-95.7v5.4l-4.7,2.7 M48.9-95.7v5.4l-4.65,2.7l-4.65-2.7v-5.4 M34.95-82.2v-5.4l4.65-2.7
|
|
||||||
M30.3-90.3l4.65,2.7 M72.15-49.85v-5.4l4.7-2.7l4.65,2.7 M67.5-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M67.5-74.15l4.65,2.7v5.4
|
|
||||||
l-4.65,2.7l-4.65-2.7v-5.4L67.5-74.15v-5.4l4.65-2.65l4.7,2.65 M81.5-66.05l-4.65,2.7l-4.7-2.7 M72.15-71.45l4.7-2.7 M76.85-63.35
|
|
||||||
v5.4 M67.5-57.95v-5.4 M53.55-49.85v-5.4l4.65-2.7l4.65,2.7 M48.9-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M44.25-66.05v-5.4
|
|
||||||
l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L44.25-66.05l-4.65,2.7 M62.85-66.05l-4.65,2.7l-4.65-2.7 M53.55-71.45l4.65-2.7l4.65,2.7
|
|
||||||
M58.2-57.95v-5.4 M48.9-57.95v-5.4 M48.9-74.15v-5.4l4.65-2.65l4.65,2.65v5.4 M48.9-79.55l-4.65-2.65v-5.4 M58.2-95.7v5.4
|
|
||||||
l-4.65,2.7l-4.65-2.7 M53.55-87.6v5.4 M58.2-79.55l4.65-2.65l4.65,2.65 M62.85-82.2v-5.4l4.65-2.7l4.65,2.7v5.4 M67.5-90.3v-5.4
|
|
||||||
M76.85-95.7v5.4l-4.7,2.7 M58.2-90.3l4.65,2.7 M44.25-17.5l-4.65,2.65 M39.6-9.45l4.65,2.7 M39.6-74.15l4.65,2.7 M39.6-57.95
|
|
||||||
l4.65,2.7 M44.25-49.85L39.6-47.2 M62.85-49.85L58.2-47.2 M16.3-49.85l-4.65,2.65 M44.25-82.2l-4.65,2.65 M76.85-90.3l4.65,2.7
|
|
||||||
M81.5-49.85l-4.65,2.65 M86.15,1.35l-4.65-2.7 M44.25-1.35l-4.65,2.7 M62.85-1.35l-4.65,2.7 M109.4-1.35l-4.65,2.7 M25.6-1.35
|
|
||||||
l-4.65,2.7 M-95.4,95.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-86.1,90.3l4.7-2.7l4.65,2.7v5.4 M-104.7,95.7v-5.4l4.65-2.7l4.65,2.7
|
|
||||||
M-100.05,82.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4L-100.05,82.2z M-95.4,74.15l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65
|
|
||||||
M-86.1,74.15l4.7-2.7l4.65,2.7v5.4l-4.65,2.65l-4.7-2.65 M-100.05,87.6v-5.4 M-90.75,87.6v-5.4 M-81.4,87.6v-5.4 M-109.35,87.6
|
|
||||||
l4.65,2.7 M-104.7,79.55l-4.65,2.65 M-109.35,55.25l4.65,2.7v5.4l-4.65,2.7 M-109.35,71.45l4.65,2.7 M-90.75,66.05l-4.65-2.7v-5.4
|
|
||||||
l4.65-2.7l4.65,2.7v5.4L-90.75,66.05v5.4 M-86.1,57.95l4.7-2.7l4.65,2.7v5.4l-4.65,2.7l-4.7-2.7 M-81.4,71.45v-5.4 M-100.05,71.45
|
|
||||||
v-5.4l4.65-2.7 M-95.4,57.95l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-81.4,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
|
|
||||||
M-100.05,66.05l-4.65-2.7 M-104.7,57.95l4.65-2.7 M-86.1,41.8l-4.65-2.7v-5.4l4.65-2.7l4.7,2.7v5.4L-86.1,41.8z M-81.4,49.85
|
|
||||||
l-4.7-2.65v-5.4 M-100.05,49.85l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-95.4,31l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7V31
|
|
||||||
l4.65,2.7 M-86.1,31v-5.4l4.7-2.7l4.65,2.7V31l-4.65,2.7 M-100.05,39.1v-5.4 M-90.75,39.1l-4.65,2.7 M-109.35,39.1l4.65,2.7
|
|
||||||
M-104.7,31l-4.65,2.7 M-109.35,6.75l4.65,2.7v5.4l-4.65,2.65 M-86.1,14.85v-5.4l4.7-2.7l4.65,2.7v5.4l-4.65,2.65L-86.1,14.85z
|
|
||||||
M-81.4,22.9v-5.4 M-86.1,25.6l-4.65-2.7v-5.4l4.65-2.65 M-100.05,22.9v-5.4l4.65-2.65l4.65,2.65 M-100.05,6.75v-5.4l4.65-2.7
|
|
||||||
l4.65,2.7v5.4l-4.65,2.7L-100.05,6.75z M-81.4,6.75v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-90.75,6.75l4.65,2.7 M-95.4,14.85v-5.4
|
|
||||||
M-95.4,25.6l4.65-2.7 M-100.05,17.5l-4.65-2.65 M-104.7,9.45l4.65-2.7 M-109.35,22.9l4.65,2.7 M-86.1,47.2l-4.65,2.65
|
|
||||||
M-104.7,47.2l-4.65,2.65 M-11.6,95.7v-5.4l4.65-2.7l4.65,2.7 M-20.9,95.7v-5.4l4.65-2.7l4.65,2.7 M-16.25,82.2l-4.65-2.65v-5.4
|
|
||||||
l4.65-2.7l4.65,2.7v5.4L-16.25,82.2v5.4 M-2.3,79.55l-4.65,2.65l-4.65-2.65 M-6.95,82.2v5.4 M-30.2,95.7v-5.4l4.65-2.7l4.65,2.7
|
|
||||||
M-39.55,95.7v-5.4l4.7-2.7l4.65,2.7 M-39.55,79.55v-5.4l4.7-2.7l4.65,2.7v5.4l-4.65,2.65L-39.55,79.55l-4.65,2.65l-4.65-2.65
|
|
||||||
M-20.9,79.55l-4.65,2.65l-4.65-2.65 M-34.85,87.6v-5.4 M-25.55,87.6v-5.4 M-20.9,74.15l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4
|
|
||||||
M-30.2,74.15l4.65-2.7 M-25.55,66.05l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-39.55,74.15l-4.65-2.7v-5.4l4.65-2.7l4.7,2.7v5.4
|
|
||||||
M-30.2,57.95l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-39.55,63.35v-5.4l4.7-2.7 M-30.2,63.35l-4.65,2.7 M-11.6,74.15l4.65-2.7
|
|
||||||
l4.65,2.7 M-6.95,66.05l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95,66.05v5.4 M-16.25,66.05l4.65-2.7 M-11.6,57.95l-4.65-2.7v-5.4
|
|
||||||
l4.65-2.65l4.65,2.65v5.4 M-16.25,55.25l-4.65,2.7 M-48.85,95.7v-5.4l4.65-2.7l4.65,2.7 M-58.15,95.7v-5.4l4.65-2.7l4.65,2.7
|
|
||||||
M-58.15,79.55v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65L-58.15,79.55l-4.65,2.65l-4.65-2.65 M-44.2,87.6v-5.4 M-53.5,87.6v-5.4
|
|
||||||
M-67.45,95.7v-5.4l4.65-2.7l4.65,2.7 M-76.75,90.3l4.65-2.7l4.65,2.7 M-76.75,74.15l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65
|
|
||||||
M-62.8,87.6v-5.4 M-72.1,87.6v-5.4 M-67.45,74.15l4.65-2.7l4.65,2.7 M-62.8,71.45v-5.4l4.65-2.7l4.65,2.7v5.4 M-62.8,66.05
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-76.75,63.35l4.65,2.7v5.4 M-62.8,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
|
|
||||||
M-67.45,63.35l-4.65,2.7 M-72.1,55.25l4.65,2.7 M-48.85,74.15l4.65-2.7 M-44.2,66.05l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7
|
|
||||||
M-53.5,49.85l4.65-2.65l4.65,2.65v5.4 M-53.5,66.05l4.65-2.7 M-53.5,55.25l4.65,2.7 M-48.85,47.2v-5.4l4.65-2.7l4.65,2.7v5.4
|
|
||||||
l-4.65,2.65 M-58.15,47.2v-5.4l4.65-2.7l4.65,2.7 M-58.15,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7l-4.65-2.7V25.6l-4.65-2.7v-5.4
|
|
||||||
M-48.85,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7l-4.65-2.7 M-44.2,39.1v-5.4 M-53.5,39.1v-5.4 M-62.8,49.85l-4.65-2.65v-5.4l4.65-2.7
|
|
||||||
l4.65,2.7 M-76.75,47.2v-5.4l4.65-2.7l4.65,2.7 M-76.75,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7l-4.65-2.7 M-58.15,31l-4.65,2.7
|
|
||||||
l-4.65-2.7 M-72.1,39.1v-5.4 M-62.8,39.1v-5.4 M-67.45,14.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65L-67.45,14.85l-4.65,2.65
|
|
||||||
l-4.65-2.65 M-72.1,22.9v-5.4 M-62.8,6.75v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-72.1,6.75l4.65,2.7 M-44.2,22.9v-5.4l4.65-2.65
|
|
||||||
l4.7,2.65v5.4l-4.7,2.7 M-44.2,17.5l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-48.85,14.85l-4.65,2.65l-4.65-2.65 M-53.5,22.9v-5.4
|
|
||||||
M-44.2,6.75v-5.4l4.65-2.7l4.7,2.7v5.4l-4.7,2.7 M-53.5,6.75l4.65,2.7 M-67.45,25.6l4.65-2.7 M-11.6,47.2v-5.4l4.65-2.7l4.65,2.7
|
|
||||||
M-11.6,41.8l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-16.25,33.7L-20.9,31v-5.4l4.65-2.7l4.65,2.7V31 M-2.3,31l-4.65,2.7
|
|
||||||
M-30.2,47.2v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-39.55,41.8l4.7-2.7l4.65,2.7 M-34.85,22.9l4.65,2.7V31l-4.65,2.7l-4.7-2.7
|
|
||||||
M-20.9,31l-4.65,2.7L-30.2,31 M-34.85,39.1v-5.4 M-25.55,39.1v-5.4 M-20.9,25.6l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4
|
|
||||||
M-25.55,17.5l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-25.55,6.75v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-30.2,14.85l-4.65,2.65
|
|
||||||
M-34.85,6.75l4.65,2.7 M-6.95,17.5l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95,17.5v5.4l-4.65,2.7 M-11.6,14.85l-4.65,2.65
|
|
||||||
M-16.25,6.75l4.65,2.7 M-16.25,1.35l4.65-2.7l4.65,2.7v5.4 M-6.95,22.9l4.65,2.7 M-30.2,25.6l4.65-2.7 M-16.25,39.1l-4.65,2.7
|
|
||||||
M-67.45,47.2l-4.65,2.65 M-2.3,47.2l-4.65,2.65 M-34.85,49.85l-4.7-2.65 M-16.25,49.85l-4.65-2.65 M-81.4,39.1l4.65,2.7
|
|
||||||
M-11.6-1.35v-5.4l4.65-2.7l4.65,2.7 M-11.6-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-16.25-14.85l-4.65-2.65v-5.4l4.65-2.7
|
|
||||||
l4.65,2.7v5.4 M-2.3-17.5l-4.65,2.65 M-20.9-1.35v-5.4l4.65-2.7 M-20.9-6.75l-4.65-2.7v-5.4l4.65-2.65 M-25.55-9.45l-4.65,2.7
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65 M-30.2-6.75v5.4l-4.65,2.7 M-39.55-1.35v-5.4l4.7-2.7 M-34.85-14.85l-4.7-2.65v-5.4l4.7-2.7
|
|
||||||
l4.65,2.7v5.4 M-30.2-33.7v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L-30.2-33.7l-4.65,2.7l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7 M-20.9-22.9
|
|
||||||
l-4.65-2.7V-31 M-34.85-25.6V-31 M-39.55-39.1l-4.65-2.7v-5.4l4.65-2.65l4.7,2.65v5.4 M-25.55-41.8v-5.4l4.65-2.65l4.65,2.65v5.4
|
|
||||||
l-4.65,2.7 M-6.95-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95-31v5.4l-4.65,2.7 M-16.25-25.6V-31l4.65-2.7 M-16.25-41.8
|
|
||||||
l4.65,2.7 M-16.25-47.2l4.65-2.65l4.65,2.65v5.4 M-30.2-22.9l4.65-2.7 M-16.25-31l-4.65-2.7 M-6.95-25.6l4.65,2.7 M-44.2,1.35
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-58.15-1.35v-5.4l4.65-2.7l4.65,2.7 M-58.15-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4
|
|
||||||
M-62.8-14.85l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-39.55-17.5l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M-44.2-9.45v-5.4
|
|
||||||
M-53.5-14.85l4.65-2.65 M-62.8,1.35l-4.65-2.7v-5.4l4.65-2.7 M-76.75-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4L-76.75-6.75
|
|
||||||
v5.4 M-76.75-17.5v-5.4l4.65-2.7l4.65,2.7 M-67.45-17.5l-4.65,2.65 M-72.1-9.45l4.65,2.7 M-67.45-33.7v-5.4l4.65-2.7l4.65,2.7v5.4
|
|
||||||
L-62.8-31L-67.45-33.7z M-62.8-25.6V-31 M-72.1-25.6V-31l4.65-2.7 M-72.1-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-76.75-39.1
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-62.8-41.8v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M-44.2-25.6V-31l4.65-2.7 M-44.2-31
|
|
||||||
l-4.65-2.7v-5.4l4.65-2.7 M-48.85-33.7L-53.5-31l-4.65-2.7 M-48.85-22.9l-4.65-2.7V-31 M-53.5-41.8l4.65,2.7 M-58.15-22.9l4.65-2.7
|
|
||||||
M-58.15-49.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-48.85-55.25l4.65-2.7l4.65,2.7v5.4 M-58.15-71.45l4.65-2.7l4.65,2.7v5.4
|
|
||||||
l-4.65,2.7l-4.65-2.7V-71.45z M-48.85-71.45l4.65-2.7l4.65,2.7v5.4l-4.65,2.7l-4.65-2.7 M-44.2-57.95v-5.4 M-53.5-57.95v-5.4
|
|
||||||
M-76.75-49.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-67.45-55.25l4.65-2.7l4.65,2.7 M-76.75-55.25l-4.65-2.7v-5.4l4.65-2.7
|
|
||||||
l4.65,2.7v5.4 M-81.4-63.35l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7v5.4 M-81.4-74.15v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
|
|
||||||
M-58.15-66.05l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-62.8-57.95v-5.4 M-72.1-74.15l4.65,2.7 M-67.45-66.05l-4.65,2.7
|
|
||||||
M-67.45-82.2v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65L-67.45-82.2l-4.65,2.65 M-76.75-82.2v-5.4l4.65-2.7l4.65,2.7 M-72.1-90.3
|
|
||||||
v-5.4 M-62.8-90.3v-5.4 M-53.5-74.15v-5.4l4.65-2.65l4.65,2.65v5.4 M-58.15-82.2l4.65,2.65 M-58.15-87.6l4.65-2.7l4.65,2.7v5.4
|
|
||||||
M-53.5-90.3v-5.4 M-44.2-95.7v5.4l-4.65,2.7 M-62.8-74.15v-5.4 M-11.6-49.85v-5.4l4.65-2.7l4.65,2.7 M-20.9-49.85v-5.4l4.65-2.7
|
|
||||||
l4.65,2.7 M-16.25-63.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L-16.25-63.35v5.4 M-2.3-66.05l-4.65,2.7l-4.65-2.7 M-11.6-71.45
|
|
||||||
l4.65-2.7l4.65,2.7 M-6.95-63.35v5.4 M-25.55-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M-39.55-55.25l4.7-2.7l4.65,2.7
|
|
||||||
M-39.55-71.45l4.7-2.7l4.65,2.7v5.4l-4.65,2.7l-4.7-2.7 M-20.9-71.45l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-20.9-66.05
|
|
||||||
l-4.65,2.7l-4.65-2.7 M-25.55-74.15l-4.65,2.7 M-34.85-63.35v5.4 M-25.55-57.95v-5.4 M-34.85-74.15v-5.4l4.65-2.65l4.65,2.65
|
|
||||||
M-44.2-79.55l4.65-2.65l4.7,2.65 M-39.55-82.2v-5.4l4.7-2.7l4.65,2.7v5.4 M-34.85-90.3v-5.4 M-16.25-95.7v5.4l-4.65,2.7l-4.65-2.7
|
|
||||||
v-5.4 M-25.55-90.3l-4.65,2.7 M-20.9-82.2v-5.4 M-6.95-79.55l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95-79.55v5.4 M-16.25-79.55
|
|
||||||
l4.65-2.65 M-11.6-87.6l-4.65-2.7 M-6.95-95.7v5.4 M-44.2-90.3l4.65,2.7 M-62.8-47.2l-4.65-2.65 M-44.2-47.2l-4.65-2.65
|
|
||||||
M-30.2-49.85l-4.65,2.65 M-2.3-49.85l-4.65,2.65 M-95.4-1.35v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-86.1-6.75l4.7-2.7
|
|
||||||
M-100.05,1.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-95.4-17.5l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7V-17.5z M-95.4-22.9
|
|
||||||
l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65 M-81.4-14.85l-4.7-2.65 M-100.05-9.45v-5.4 M-90.75-14.85v5.4 M-109.35-9.45
|
|
||||||
l4.65,2.7 M-104.7-17.5l-4.65,2.65 M-109.35-41.8l4.65,2.7v5.4l-4.65,2.7 M-90.75-25.6V-31l4.65-2.7l4.7,2.7v5.4l-4.7,2.7
|
|
||||||
M-100.05-25.6V-31l4.65-2.7l4.65,2.7 M-100.05-47.2l4.65-2.65l4.65,2.65v5.4l-4.65,2.7l-4.65-2.7V-47.2l-4.65-2.65 M-90.75-41.8
|
|
||||||
l4.65,2.7v5.4 M-86.1-39.1l4.7-2.7 M-95.4-33.7v-5.4 M-109.35-25.6l4.65,2.7 M-100.05-31l-4.65-2.7 M-104.7-39.1l4.65-2.7
|
|
||||||
M-95.4-49.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-86.1-55.25l4.7-2.7 M-95.4-55.25l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4
|
|
||||||
M-100.05-63.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-95.4-71.45l4.65-2.7l4.65,2.7 M-86.1-66.05l-4.65,2.7 M-109.35-57.95
|
|
||||||
l4.65,2.7v5.4l-4.65,2.65 M-109.35-74.15l4.65,2.7 M-104.7-66.05l-4.65,2.7 M-109.35-90.3l4.65,2.7v5.4l-4.65,2.65 M-81.4-79.55
|
|
||||||
l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7 M-86.1-82.2l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M-100.05-74.15v-5.4l4.65-2.65
|
|
||||||
M-95.4-87.6l-4.65-2.7v-5.4 M-81.4-95.7v5.4 M-90.75-95.7v5.4 M-90.75-79.55v5.4 M-104.7-55.25l4.65-2.7 M-100.05-79.55
|
|
||||||
l-4.65-2.65 M-104.7-87.6l4.65-2.7 M-81.4-47.2l-4.7-2.65 M-76.75-33.7L-81.4-31 M-81.4-25.6l4.65,2.7 M-67.45-1.35l-4.65,2.7
|
|
||||||
M-104.7-1.35l-4.65,2.7 M-81.4,1.35l-4.7-2.7 M-25.55,1.35l-4.65-2.7 M-53.5,1.35l4.65-2.7 M-2.3-1.35l-4.65,2.7 M-2.3,57.95
|
|
||||||
l4.65-2.7 M2.35,66.05l-4.65-2.7 M-2.3-39.1l4.65-2.7 M2.35-31l-4.65-2.7 M2.35-79.55L-2.3-82.2 M-2.3-87.6l4.65-2.7 M-2.3,9.45
|
|
||||||
l4.65-2.7 M2.35,17.5l-4.65-2.65"/>
|
|
||||||
</symbol>
|
|
||||||
<g id="Layer_1">
|
|
||||||
</g>
|
|
||||||
<g id="Layer_6">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#EFEEEE" d="M217.5,108.95c0,29.833-10.533,55.399-31.6,76.7
|
|
||||||
c-0.7,0.833-1.484,1.6-2.351,2.3c-3.466,3.399-7.134,6.483-11,9.25c-18.267,13.467-39.366,20.2-63.3,20.2
|
|
||||||
c-23.967,0-45.033-6.733-63.2-20.2c-4.8-3.4-9.3-7.25-13.5-11.55c-16.367-16.267-26.417-35.167-30.15-56.7
|
|
||||||
c-0.733-4.2-1.217-8.467-1.45-12.8c-0.1-2.4-0.15-4.801-0.15-7.2c0-2.534,0.05-4.95,0.15-7.25c0-0.233,0.066-0.467,0.2-0.7
|
|
||||||
c1.567-26.6,12.033-49.583,31.4-68.95C53.85,11.017,79.417,0.5,109.25,0.5c29.934,0,55.483,10.517,76.65,31.55
|
|
||||||
C206.967,53.483,217.5,79.117,217.5,108.95z"/>
|
|
||||||
</g>
|
|
||||||
<g id="Layer_5">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#010101" d="M195.45,43l-22.4,22.4c-8.833,13-13.25,27.867-13.25,44.6
|
|
||||||
c0,17.934,5.067,33.833,15.2,47.7l19,18.95c-2.5,3.066-5.2,6.066-8.1,9c-0.7,0.833-1.484,1.6-2.351,2.3
|
|
||||||
c-2.533,2.5-5.167,4.816-7.899,6.95L158.1,177.35c-13.934-10.733-30.133-16.1-48.6-16.1c-17.933,0-33.833,5.1-47.7,15.3
|
|
||||||
L43.25,195.15c-3.767-2.867-7.333-6.034-10.7-9.5c-2.8-2.801-5.417-5.667-7.85-8.601l19.15-19.2
|
|
||||||
c10.066-13.966,15.1-29.916,15.1-47.85c0-17.5-4.867-33.017-14.6-46.55l-21.05-21c2.833-3.6,5.917-7.067,9.25-10.4
|
|
||||||
c2.934-2.867,5.934-5.55,9-8.05L61.9,44.35C75.7,54.583,91.567,59.7,109.5,59.7c18.467,0,34.666-5.367,48.6-16.1L177.4,24.35
|
|
||||||
c2.899,2.367,5.732,4.933,8.5,7.7C189.367,35.583,192.55,39.233,195.45,43z"/>
|
|
||||||
</g>
|
|
||||||
<g id="Layer_4">
|
|
||||||
<defs>
|
|
||||||
<path id="SVGID_1_" d="M159.8,110c0-16.733,4.417-31.6,13.25-44.6l22.4-22.4c-2.9-3.767-6.083-7.417-9.55-10.95
|
|
||||||
c-2.768-2.767-5.601-5.333-8.5-7.7L158.1,43.6c-13.934,10.733-30.133,16.1-48.6,16.1c-17.933,0-33.8-5.117-47.6-15.35L41.55,24
|
|
||||||
c-3.066,2.5-6.066,5.183-9,8.05c-3.333,3.333-6.417,6.8-9.25,10.4l21.05,21c9.733,13.533,14.6,29.05,14.6,46.55
|
|
||||||
c0,17.934-5.034,33.884-15.1,47.85l-19.15,19.2c2.433,2.934,5.05,5.8,7.85,8.601c3.367,3.466,6.934,6.633,10.7,9.5L61.8,176.55
|
|
||||||
c13.867-10.2,29.767-15.3,47.7-15.3c18.467,0,34.666,5.366,48.6,16.1L175.65,194.9c2.732-2.134,5.366-4.45,7.899-6.95
|
|
||||||
c0.866-0.7,1.65-1.467,2.351-2.3c2.899-2.934,5.6-5.934,8.1-9l-19-18.95C164.867,143.833,159.8,127.934,159.8,110z"/>
|
|
||||||
</defs>
|
|
||||||
<clipPath id="SVGID_2_">
|
|
||||||
<use xlink:href="#SVGID_1_" overflow="visible"/>
|
|
||||||
</clipPath>
|
|
||||||
<g clip-path="url(#SVGID_2_)">
|
|
||||||
|
|
||||||
<use xlink:href="#hex_grid" width="228.55" height="197.233" x="-114.25" y="-98.617" transform="matrix(1.1415 0 0 -1.1415 105.5 107.75)" overflow="visible"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g id="Layer_2">
|
|
||||||
<g>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#35C6F4" d="M79.1,110.95c-0.033-0.667-0.05-1.333-0.05-2
|
|
||||||
c0-0.7,0.017-1.366,0.05-2c0-0.067,0.017-0.134,0.05-0.2c0.434-7.367,3.333-13.733,8.7-19.1c5.9-5.833,12.983-8.75,21.25-8.75
|
|
||||||
c8.301,0,15.384,2.917,21.25,8.75c5.834,5.934,8.75,13.033,8.75,21.3c0,8.267-2.916,15.35-8.75,21.25
|
|
||||||
c-0.199,0.233-0.416,0.45-0.649,0.649c-0.967,0.934-1.983,1.784-3.05,2.551c-5.066,3.733-10.917,5.6-17.551,5.6
|
|
||||||
c-6.633,0-12.466-1.866-17.5-5.6c-1.333-0.934-2.583-2-3.75-3.2c-4.533-4.5-7.317-9.733-8.35-15.7
|
|
||||||
C79.3,113.334,79.167,112.15,79.1,110.95z M126.1,127.25l3.601,3.6L126.1,127.25z"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="none" stroke="#35C6F4" stroke-width="2" stroke-miterlimit="1" d="
|
|
||||||
M158.6,60.25l-15,14.65 M31.7,33.1l40.75,40.65 M126.1,127.25l3.601,3.6 M157.05,158l27.65,28.6 M153.05,153.95l-10.75-11.2
|
|
||||||
M186.6,33l-28,27.25 M33.15,186.25l27.35-27.4"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="none" stroke="#35C6F4" stroke-width="7" stroke-miterlimit="1" d="
|
|
||||||
M158.6,60.25l-16.949,17.2 M59.4,61.35L76.6,78.5 M60.5,158.85l16.75-17.399 M153.05,153.95l4,4.05 M139.45,140.4l13.6,13.55"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 2.3 KiB |
@@ -0,0 +1,9 @@
|
|||||||
|
<svg height="216.9" viewBox="0 0 216.7 216.9" width="216.7" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path clip-rule="evenodd" d="M216.7 108.45c0 29.833-10.533 55.4-31.6 76.7-.7.833-1.483 1.6-2.35 2.3-3.466 3.4-7.133 6.484-11 9.25-18.267 13.467-39.367 20.2-63.3 20.2-23.967 0-45.033-6.733-63.2-20.2-4.8-3.4-9.3-7.25-13.5-11.55-16.367-16.266-26.417-35.167-30.15-56.7-.733-4.2-1.217-8.467-1.45-12.8-.1-2.4-.15-4.8-.15-7.2 0-2.533.05-4.95.15-7.25 0-.233.066-.467.2-.7 1.567-26.6 12.033-49.583 31.4-68.95C53.05 10.517 78.617 0 108.45 0c29.933 0 55.484 10.517 76.65 31.55 21.067 21.433 31.6 47.067 31.6 76.9z" fill="#EEE" fill-rule="evenodd"/>
|
||||||
|
<path clip-rule="evenodd" d="M194.65 42.5l-22.4 22.4C159.152 77.998 158 89.4 158 109.5c0 17.934 2.852 34.352 16.2 47.7 9.746 9.746 19 18.95 19 18.95-2.5 3.067-5.2 6.067-8.1 9-.7.833-1.483 1.6-2.35 2.3-2.533 2.5-5.167 4.817-7.9 6.95l-17.55-17.55c-15.598-15.6-27.996-17.1-48.6-17.1-19.77 0-33.223 1.822-47.7 16.3-8.647 8.647-18.55 18.6-18.55 18.6-3.767-2.867-7.333-6.034-10.7-9.5-2.8-2.8-5.417-5.667-7.85-8.6 0 0 9.798-9.848 19.15-19.2 13.852-13.853 16.1-29.916 16.1-47.85 0-17.5-2.874-33.823-15.6-46.55-8.835-8.836-21.05-21-21.05-21 2.833-3.6 5.917-7.067 9.25-10.4 2.934-2.867 5.934-5.55 9-8.05L61.1 43.85C74.102 56.852 90.767 60.2 108.7 60.2c18.467 0 35.077-3.577 48.6-17.1 8.32-8.32 19.3-19.25 19.3-19.25 2.9 2.367 5.733 4.933 8.5 7.7 3.467 3.533 6.65 7.183 9.55 10.95z" fill="#3A3F51" fill-rule="evenodd"/>
|
||||||
|
<g clip-rule="evenodd">
|
||||||
|
<path d="M78.7 114c-.2-1.167-.332-2.35-.4-3.55-.032-.667-.05-1.333-.05-2 0-.7.018-1.367.05-2 0-.067.018-.133.05-.2.435-7.367 3.334-13.733 8.7-19.1 5.9-5.833 12.984-8.75 21.25-8.75 8.3 0 15.384 2.917 21.25 8.75 5.834 5.934 8.75 13.033 8.75 21.3 0 8.267-2.916 15.35-8.75 21.25-.2.233-.416.45-.65.65-.966.933-1.982 1.783-3.05 2.55-5.065 3.733-10.916 5.6-17.55 5.6s-12.466-1.866-17.5-5.6c-1.332-.934-2.582-2-3.75-3.2-4.532-4.5-7.316-9.734-8.35-15.7z" fill="#0CF" fill-rule="evenodd"/>
|
||||||
|
<path d="M157.8 59.75l-15 14.65M30.785 32.526L71.65 73.25m84.6 84.25l27.808 28.78m1.855-153.894L157.8 59.75m-125.45 126l27.35-27.4" fill="none" stroke="#0CF" stroke-miterlimit="1" stroke-width="2"/>
|
||||||
|
<path d="M157.8 59.75l-16.95 17.2M58.97 60.604l17.2 17.15M59.623 158.43l16.75-17.4m61.928-1.396l18.028 17.945" fill="none" stroke="#0CF" stroke-miterlimit="1" stroke-width="7"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
@@ -20,33 +20,39 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
|
|||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
* Visual Studio 2015 (https://www.visualstudio.com/vs/)
|
* [Visual Studio 2017](https://www.visualstudio.com/vs/)
|
||||||
* [Git](https://git-scm.com/downloads)
|
* [Git](https://git-scm.com/downloads)
|
||||||
* [NodeJS](https://nodejs.org/en/download/)
|
* [NodeJS](https://nodejs.org/en/download/)
|
||||||
|
* [Yarn](https://yarnpkg.com/)
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|
||||||
* Make sure all the required software mentioned above are installed.
|
* Make sure all the required software mentioned above are installed
|
||||||
* Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories)
|
* Clone the repository into your development machine. [*info*](https://help.github.com/en/articles/working-with-forks)
|
||||||
* Grab the submodules `git submodule init && git submodule update`
|
* Grab the submodules `git submodule init && git submodule update`
|
||||||
* Install the required Node Packages `npm install`
|
* Install the required Node Packages `yarn`
|
||||||
* Start gulp to monitor your dev environment for any changes that need post processing using `npm start` command.
|
|
||||||
|
|
||||||
*Please note gulp must be running at all times while you are working with Sonarr client source files.*
|
### Backend Development
|
||||||
|
|
||||||
### Development
|
* Run `yarn build` to build the UI
|
||||||
|
* Open `Sonarr.sln` in Visual Studio
|
||||||
* Open `NzbDrone.sln` in Visual Studio
|
|
||||||
* Make sure `NzbDrone.Console` is set as the startup project
|
* Make sure `NzbDrone.Console` is set as the startup project
|
||||||
|
* Build `NzbDrone.Windows` and `NzbDrone.Mono` projects
|
||||||
|
* Build Solution
|
||||||
|
|
||||||
|
### UI Development
|
||||||
|
|
||||||
|
* Run `yarn watch` to build UI and rebuild automatically when changes are detected
|
||||||
|
* Run Sonarr.Console.exe (or debug in Visual Studio)
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
|
|
||||||
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
||||||
* Copyright 2010-2017
|
* Copyright 2010-2019
|
||||||
|
|
||||||
### Sponsors
|
### Sponsors
|
||||||
|
|
||||||
* [JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools
|
* [JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools
|
||||||
* [ReSharper](http://www.jetbrains.com/resharper/)
|
* [ReSharper](http://www.jetbrains.com/resharper/)
|
||||||
* [WebStorm](http://www.jetbrains.com/webstorm/)
|
|
||||||
* [TeamCity](http://www.jetbrains.com/teamcity/)
|
* [TeamCity](http://www.jetbrains.com/teamcity/)
|
||||||
|
|||||||
@@ -1,17 +1,22 @@
|
|||||||
#! /bin/bash
|
#! /bin/bash
|
||||||
msBuild='/c/Program Files (x86)/MSBuild/14.0/Bin'
|
msBuildVersion='15.0'
|
||||||
outputFolder='./_output'
|
outputFolder='./_output'
|
||||||
outputFolderMono='./_output_mono'
|
outputFolderWindows='./_output_windows'
|
||||||
outputFolderOsx='./_output_osx'
|
outputFolderLinux='./_output_linux'
|
||||||
outputFolderOsxApp='./_output_osx_app'
|
outputFolderMacOS='./_output_macos'
|
||||||
testPackageFolder='./_tests/'
|
outputFolderMacOSApp='./_output_macos_app'
|
||||||
testSearchPattern='*.Test/bin/x86/Release'
|
testPackageFolder='./_tests'
|
||||||
|
testPackageFolderWindows='./_tests_windows'
|
||||||
|
testPackageFolderLinux='./_tests_linux'
|
||||||
sourceFolder='./src'
|
sourceFolder='./src'
|
||||||
slnFile=$sourceFolder/NzbDrone.sln
|
slnFile=$sourceFolder/Sonarr.sln
|
||||||
updateFolder=$outputFolder/NzbDrone.Update
|
updateSubFolder=Sonarr.Update
|
||||||
updateFolderMono=$outputFolderMono/NzbDrone.Update
|
|
||||||
|
|
||||||
nuget='tools/nuget/nuget.exe';
|
nuget='tools/nuget/nuget.exe';
|
||||||
|
vswhere='tools/vswhere/vswhere.exe';
|
||||||
|
|
||||||
|
. ./version.sh
|
||||||
|
|
||||||
CheckExitCode()
|
CheckExitCode()
|
||||||
{
|
{
|
||||||
"$@"
|
"$@"
|
||||||
@@ -23,12 +28,44 @@ CheckExitCode()
|
|||||||
return $status
|
return $status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProgressStart()
|
||||||
|
{
|
||||||
|
echo "##teamcity[blockOpened name='$1']"
|
||||||
|
echo "##teamcity[progressStart '$1']"
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgressEnd()
|
||||||
|
{
|
||||||
|
echo "##teamcity[progressFinish '$1']"
|
||||||
|
echo "##teamcity[blockClosed name='$1']"
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateVersionNumber()
|
||||||
|
{
|
||||||
|
if [ "$BUILD_NUMBER" != "" ]; then
|
||||||
|
echo "Updating Version Info"
|
||||||
|
verMajorMinorRevision=`echo "$buildVersion" | cut -d. -f1,2,3`
|
||||||
|
verBuild=`echo "${BUILD_NUMBER}" | cut -d. -f4`
|
||||||
|
BUILD_NUMBER=$verMajorMinorRevision.$verBuild
|
||||||
|
echo "##teamcity[buildNumber '$BUILD_NUMBER']"
|
||||||
|
sed -i "s/<AssemblyVersion>[0-9.*]\+<\/AssemblyVersion>/<AssemblyVersion>$BUILD_NUMBER<\/AssemblyVersion>/g" ./src/Directory.Build.props
|
||||||
|
sed -i "s/<AssemblyConfiguration>[\$()A-Za-z-]\+<\/AssemblyConfiguration>/<AssemblyConfiguration>${BRANCH:-dev}<\/AssemblyConfiguration>/g" ./src/Directory.Build.props
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateReleaseInfo()
|
||||||
|
{
|
||||||
|
if [ "$BUILD_NUMBER" != "" ]; then
|
||||||
|
echo "Create Release Info"
|
||||||
|
echo -e "# Do Not Edit\nReleaseVersion=$BUILD_NUMBER\nBranch=${BRANCH:-dev}" > $outputFolder/release_info
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
CleanFolder()
|
CleanFolder()
|
||||||
{
|
{
|
||||||
local path=$1
|
local path=$1
|
||||||
local keepConfigFiles=$2
|
local keepConfigFiles=$2
|
||||||
|
|
||||||
|
|
||||||
find $path -name "*.transform" -exec rm "{}" \;
|
find $path -name "*.transform" -exec rm "{}" \;
|
||||||
|
|
||||||
if [ $keepConfigFiles != true ] ; then
|
if [ $keepConfigFiles != true ] ; then
|
||||||
@@ -39,9 +76,6 @@ CleanFolder()
|
|||||||
find $path -name "FluentValidation.resources.dll" -exec rm "{}" \;
|
find $path -name "FluentValidation.resources.dll" -exec rm "{}" \;
|
||||||
find $path -name "App.config" -exec rm "{}" \;
|
find $path -name "App.config" -exec rm "{}" \;
|
||||||
|
|
||||||
echo "Removing .less files"
|
|
||||||
find $path -name "*.less" -exec rm "{}" \;
|
|
||||||
|
|
||||||
echo "Removing vshost files"
|
echo "Removing vshost files"
|
||||||
find $path -name "*.vshost.exe" -exec rm "{}" \;
|
find $path -name "*.vshost.exe" -exec rm "{}" \;
|
||||||
|
|
||||||
@@ -52,19 +86,17 @@ CleanFolder()
|
|||||||
find $path -depth -empty -type d -exec rm -r "{}" \;
|
find $path -depth -empty -type d -exec rm -r "{}" \;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AddJsonNet()
|
|
||||||
{
|
|
||||||
rm $outputFolder/Newtonsoft.Json.*
|
|
||||||
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder
|
|
||||||
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder/NzbDrone.Update
|
|
||||||
}
|
|
||||||
|
|
||||||
BuildWithMSBuild()
|
BuildWithMSBuild()
|
||||||
{
|
{
|
||||||
export PATH=$msBuild:$PATH
|
msBuildPath=`$vswhere -latest -products \* -requires Microsoft.Component.MSBuild -find MSBuild\\\\\*\*\\\\Bin\\\\MSBuild.exe`
|
||||||
CheckExitCode MSBuild.exe $slnFile //t:Clean //m
|
msBuildPath=${msBuildPath/C:\\/\/c\/}
|
||||||
|
msBuildPath=${msBuildPath//\\/\/}
|
||||||
|
msBuildDir=$(dirname "$msBuildPath")
|
||||||
|
|
||||||
|
echo $msBuildDir
|
||||||
|
|
||||||
|
export PATH=$msBuildDir:$PATH
|
||||||
|
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Clean //m
|
||||||
$nuget restore $slnFile
|
$nuget restore $slnFile
|
||||||
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
|
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
|
||||||
}
|
}
|
||||||
@@ -72,16 +104,28 @@ BuildWithMSBuild()
|
|||||||
BuildWithXbuild()
|
BuildWithXbuild()
|
||||||
{
|
{
|
||||||
export MONO_IOMAP=case
|
export MONO_IOMAP=case
|
||||||
CheckExitCode xbuild /t:Clean $slnFile
|
CheckExitCode msbuild /t:Clean $slnFile
|
||||||
mono $nuget restore $slnFile
|
mono $nuget restore $slnFile
|
||||||
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
|
CheckExitCode msbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
|
||||||
|
}
|
||||||
|
|
||||||
|
LintUI()
|
||||||
|
{
|
||||||
|
ProgressStart 'ESLint'
|
||||||
|
CheckExitCode yarn lint
|
||||||
|
ProgressEnd 'ESLint'
|
||||||
|
|
||||||
|
ProgressStart 'Stylelint'
|
||||||
|
CheckExitCode yarn stylelint
|
||||||
|
ProgressEnd 'Stylelint'
|
||||||
}
|
}
|
||||||
|
|
||||||
Build()
|
Build()
|
||||||
{
|
{
|
||||||
echo "##teamcity[progressStart 'Build']"
|
ProgressStart 'Build'
|
||||||
|
|
||||||
rm -rf $outputFolder
|
rm -rf $outputFolder
|
||||||
|
rm -rf $testPackageFolder
|
||||||
|
|
||||||
if [ $runtime = "dotnet" ] ; then
|
if [ $runtime = "dotnet" ] ; then
|
||||||
BuildWithMSBuild
|
BuildWithMSBuild
|
||||||
@@ -91,23 +135,23 @@ Build()
|
|||||||
|
|
||||||
CleanFolder $outputFolder false
|
CleanFolder $outputFolder false
|
||||||
|
|
||||||
AddJsonNet
|
|
||||||
|
|
||||||
echo "Removing Mono.Posix.dll"
|
echo "Removing Mono.Posix.dll"
|
||||||
rm $outputFolder/Mono.Posix.dll
|
rm $outputFolder/Mono.Posix.dll
|
||||||
|
|
||||||
echo "##teamcity[progressFinish 'Build']"
|
ProgressEnd 'Build'
|
||||||
}
|
}
|
||||||
|
|
||||||
RunGulp()
|
RunGulp()
|
||||||
{
|
{
|
||||||
echo "##teamcity[progressStart 'npm install']"
|
ProgressStart 'yarn install'
|
||||||
npm-cache install npm || CheckExitCode npm install
|
yarn install
|
||||||
echo "##teamcity[progressFinish 'npm install']"
|
ProgressEnd 'yarn install'
|
||||||
|
|
||||||
echo "##teamcity[progressStart 'Running gulp']"
|
LintUI
|
||||||
CheckExitCode npm run build
|
|
||||||
echo "##teamcity[progressFinish 'Running gulp']"
|
ProgressStart 'Running gulp'
|
||||||
|
CheckExitCode yarn run build --production
|
||||||
|
ProgressEnd 'Running gulp'
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateMdbs()
|
CreateMdbs()
|
||||||
@@ -127,121 +171,252 @@ CreateMdbs()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PatchMono()
|
||||||
|
{
|
||||||
|
local path=$1
|
||||||
|
|
||||||
|
# Below we deal with some mono incompatibilities with windows-only dotnet core/standard libs
|
||||||
|
# See: https://github.com/mono/mono/blob/master/tools/nuget-hash-extractor/download.sh
|
||||||
|
# That list defines assemblies that are prohibited from being loaded from the appdir, instead loading from mono GAC.
|
||||||
|
|
||||||
|
# We have debian dependencies to get these installed or facades from mono 5.10+
|
||||||
|
for assembly in System.IO.Compression System.Runtime.InteropServices.RuntimeInformation System.Net.Http System.Globalization.Extensions System.Text.Encoding.CodePages System.Threading.Overlapped
|
||||||
|
do
|
||||||
|
if [ -e $path/$assembly.dll ]; then
|
||||||
|
if [ -e $sourceFolder/Libraries/Mono/$assembly.dll ]; then
|
||||||
|
echo "Copy Mono-specific facade $assembly.dll (uses win32 interop)"
|
||||||
|
cp $sourceFolder/Libraries/Mono/$assembly.dll $path/$assembly.dll
|
||||||
|
else
|
||||||
|
echo "Remove $assembly.dll (uses win32 interop)"
|
||||||
|
rm $path/$assembly.dll
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Copy more stable version of Vectors for mono <5.12
|
||||||
|
if [ -e $path/System.Numerics.Vectors.dll ]; then
|
||||||
|
packageDir="$HOME/.nuget/packages/system.numerics.vectors/4.5.0"
|
||||||
|
|
||||||
|
if [ ! -d "$HOME/.nuget/packages/system.numerics.vectors/4.5.0" ]; then
|
||||||
|
# May reside in the NuGetFallback folder, which is harder to find
|
||||||
|
# Download somewhere to get the real cache populated
|
||||||
|
if [ $runtime = "dotnet" ] ; then
|
||||||
|
$nuget install System.Numerics.Vectors -Version 4.5.0 -Output ./_temp/System.Numerics.Vectors
|
||||||
|
else
|
||||||
|
mono $nuget install System.Numerics.Vectors -Version 4.5.0 -Output ./_temp/System.Numerics.Vectors
|
||||||
|
fi
|
||||||
|
rm -rf ./_temp/System.Numerics.Vectors
|
||||||
|
fi
|
||||||
|
# Copy the netstandard2.0 version rather than net46
|
||||||
|
cp "$packageDir/lib/netstandard2.0/System.Numerics.Vectors.dll" $path/
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
PackageMono()
|
PackageMono()
|
||||||
{
|
{
|
||||||
echo "##teamcity[progressStart 'Creating Mono Package']"
|
ProgressStart 'Creating Mono Package'
|
||||||
rm -rf $outputFolderMono
|
|
||||||
cp -r $outputFolder $outputFolderMono
|
rm -rf $outputFolderLinux
|
||||||
|
|
||||||
|
echo "Copying Binaries"
|
||||||
|
cp -r $outputFolder $outputFolderLinux
|
||||||
|
|
||||||
echo "Creating MDBs"
|
echo "Creating MDBs"
|
||||||
CreateMdbs $outputFolderMono
|
CreateMdbs $outputFolderLinux
|
||||||
|
|
||||||
echo "Removing PDBs"
|
echo "Removing PDBs"
|
||||||
find $outputFolderMono -name "*.pdb" -exec rm "{}" \;
|
find $outputFolderLinux -name "*.pdb" -exec rm "{}" \;
|
||||||
|
|
||||||
echo "Removing Service helpers"
|
echo "Removing Service helpers"
|
||||||
rm -f $outputFolderMono/ServiceUninstall.*
|
rm -f $outputFolderLinux/ServiceUninstall.*
|
||||||
rm -f $outputFolderMono/ServiceInstall.*
|
rm -f $outputFolderLinux/ServiceInstall.*
|
||||||
|
|
||||||
echo "Removing native windows binaries Sqlite, MediaInfo"
|
echo "Removing native windows binaries Sqlite, MediaInfo"
|
||||||
rm -f $outputFolderMono/sqlite3.*
|
rm -f $outputFolderLinux/sqlite3.*
|
||||||
rm -f $outputFolderMono/MediaInfo.*
|
rm -f $outputFolderLinux/MediaInfo.*
|
||||||
|
|
||||||
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
|
PatchMono $outputFolderLinux
|
||||||
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $outputFolderMono
|
|
||||||
|
|
||||||
echo "Adding CurlSharp.dll.config (for dllmap)"
|
echo "Adding Sonarr.Core.dll.config (for dllmap)"
|
||||||
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $outputFolderMono
|
cp $sourceFolder/NzbDrone.Core/Sonarr.Core.dll.config $outputFolderLinux
|
||||||
|
|
||||||
echo "Renaming NzbDrone.Console.exe to NzbDrone.exe"
|
# Remove Http binding redirect by renaming it
|
||||||
rm $outputFolderMono/NzbDrone.exe*
|
# We don't need this anymore once our minimum mono version is 5.10
|
||||||
for file in $outputFolderMono/NzbDrone.Console.exe*; do
|
sed -i "s/System.Net.Http/System.Net.Http.Mono/g" $outputFolderLinux/Sonarr.Console.exe.config
|
||||||
|
|
||||||
|
echo "Renaming Sonarr.Console.exe to Sonarr.exe"
|
||||||
|
rm $outputFolderLinux/Sonarr.exe*
|
||||||
|
for file in $outputFolderLinux/Sonarr.Console.exe*; do
|
||||||
mv "$file" "${file//.Console/}"
|
mv "$file" "${file//.Console/}"
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "Removing NzbDrone.Windows"
|
echo "Removing Sonarr.Windows"
|
||||||
rm $outputFolderMono/NzbDrone.Windows.*
|
rm $outputFolderLinux/Sonarr.Windows.*
|
||||||
|
|
||||||
echo "Adding NzbDrone.Mono to UpdatePackage"
|
echo "Adding Sonarr.Mono to UpdatePackage"
|
||||||
cp $outputFolderMono/NzbDrone.Mono.* $updateFolderMono
|
cp $outputFolderLinux/Sonarr.Mono.* $outputFolderLinux/$updateSubFolder/
|
||||||
|
|
||||||
echo "##teamcity[progressFinish 'Creating Mono Package']"
|
ProgressEnd 'Creating Mono Package'
|
||||||
}
|
}
|
||||||
|
|
||||||
PackageOsx()
|
PackageMacOS()
|
||||||
{
|
{
|
||||||
echo "##teamcity[progressStart 'Creating OS X Package']"
|
ProgressStart 'Creating MacOS Package'
|
||||||
rm -rf $outputFolderOsx
|
|
||||||
cp -r $outputFolderMono $outputFolderOsx
|
|
||||||
|
|
||||||
echo "Adding sqlite dylibs"
|
rm -rf $outputFolderMacOS
|
||||||
cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderOsx
|
mkdir $outputFolderMacOS
|
||||||
|
|
||||||
echo "Adding MediaInfo dylib"
|
|
||||||
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderOsx
|
|
||||||
|
|
||||||
echo "Adding Startup script"
|
echo "Adding Startup script"
|
||||||
cp ./osx/Sonarr $outputFolderOsx
|
cp ./macOS/Sonarr $outputFolderMacOS
|
||||||
|
dos2unix $outputFolderMacOS/Sonarr
|
||||||
|
|
||||||
echo "##teamcity[progressFinish 'Creating OS X Package']"
|
echo "Copying Binaries"
|
||||||
|
cp -r $outputFolderLinux/* $outputFolderMacOS
|
||||||
|
|
||||||
|
echo "Adding sqlite dylibs"
|
||||||
|
cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderMacOS
|
||||||
|
|
||||||
|
echo "Adding MediaInfo dylib"
|
||||||
|
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderMacOS
|
||||||
|
|
||||||
|
ProgressEnd 'Creating MacOS Package'
|
||||||
}
|
}
|
||||||
|
|
||||||
PackageOsxApp()
|
PackageMacOSApp()
|
||||||
{
|
{
|
||||||
echo "##teamcity[progressStart 'Creating OS X App Package']"
|
ProgressStart 'Creating macOS App Package'
|
||||||
rm -rf $outputFolderOsxApp
|
|
||||||
mkdir $outputFolderOsxApp
|
|
||||||
|
|
||||||
cp -r ./osx/Sonarr.app $outputFolderOsxApp
|
rm -rf $outputFolderMacOSApp
|
||||||
cp -r $outputFolderOsx $outputFolderOsxApp/Sonarr.app/Contents/MacOS
|
mkdir $outputFolderMacOSApp
|
||||||
|
cp -r ./macOS/Sonarr.app $outputFolderMacOSApp
|
||||||
|
mkdir -p $outputFolderMacOSApp/Sonarr.app/Contents/MacOS
|
||||||
|
|
||||||
echo "##teamcity[progressFinish 'Creating OS X App Package']"
|
echo "Adding Startup script"
|
||||||
|
cp ./macOS/Sonarr $outputFolderMacOSApp/Sonarr.app/Contents/MacOS
|
||||||
|
dos2unix $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/Sonarr
|
||||||
|
|
||||||
|
echo "Copying Binaries"
|
||||||
|
cp -r $outputFolderLinux/* $outputFolderMacOSApp/Sonarr.app/Contents/MacOS
|
||||||
|
|
||||||
|
echo "Adding sqlite dylibs"
|
||||||
|
cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderMacOSApp/Sonarr.app/Contents/MacOS
|
||||||
|
|
||||||
|
echo "Adding MediaInfo dylib"
|
||||||
|
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderMacOSApp/Sonarr.app/Contents/MacOS
|
||||||
|
|
||||||
|
echo "Removing Update Folder"
|
||||||
|
rm -r $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/Sonarr.Update
|
||||||
|
|
||||||
|
ProgressEnd 'Creating macOS App Package'
|
||||||
}
|
}
|
||||||
|
|
||||||
PackageTests()
|
PackageTestsMono()
|
||||||
{
|
{
|
||||||
echo "Packaging Tests"
|
ProgressStart 'Creating Mono Test Package'
|
||||||
echo "##teamcity[progressStart 'Creating Test Package']"
|
|
||||||
rm -rf $testPackageFolder
|
|
||||||
mkdir $testPackageFolder
|
|
||||||
|
|
||||||
find $sourceFolder -path $testSearchPattern -exec cp -r -u -T "{}" $testPackageFolder \;
|
rm -rf $testPackageFolderLinux
|
||||||
|
|
||||||
|
echo "Copying Binaries"
|
||||||
|
cp -r $testPackageFolder $testPackageFolderLinux
|
||||||
|
|
||||||
if [ $runtime = "dotnet" ] ; then
|
if [ $runtime = "dotnet" ] ; then
|
||||||
$nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
|
$nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderLinux
|
||||||
else
|
else
|
||||||
mono $nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
|
mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderLinux
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cp $outputFolder/*.dll $testPackageFolder
|
echo "Creating MDBs"
|
||||||
cp ./*.sh $testPackageFolder
|
CreateMdbs $testPackageFolderLinux
|
||||||
|
|
||||||
echo "Creating MDBs for tests"
|
echo "Removing PDBs"
|
||||||
CreateMdbs $testPackageFolder
|
find $testPackageFolderLinux -name "*.pdb" -exec rm "{}" \;
|
||||||
|
|
||||||
rm -f $testPackageFolder/*.log.config
|
PatchMono $testPackageFolderLinux
|
||||||
|
|
||||||
CleanFolder $testPackageFolder true
|
echo "Adding Sonarr.Core.dll.config (for dllmap)"
|
||||||
|
cp $sourceFolder/NzbDrone.Core/Sonarr.Core.dll.config $testPackageFolderLinux
|
||||||
|
|
||||||
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
|
# Remove Http binding redirect by renaming it
|
||||||
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $testPackageFolder
|
# We don't need this anymore once our minimum mono version is 5.10
|
||||||
|
sed -i "s/System.Net.Http/System.Net.Http.Mono/g" $testPackageFolderLinux/Sonarr.Common.Test.dll.config
|
||||||
|
|
||||||
echo "Adding CurlSharp.dll.config (for dllmap)"
|
cp ./test.sh $testPackageFolderLinux/
|
||||||
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $testPackageFolder
|
dos2unix $testPackageFolderLinux/test.sh
|
||||||
|
|
||||||
echo "Copying CurlSharp libraries"
|
echo "Removing Sonarr.Windows"
|
||||||
cp $sourceFolder/ExternalModules/CurlSharp/libs/i386/* $testPackageFolder
|
rm $testPackageFolderLinux/Sonarr.Windows.*
|
||||||
|
|
||||||
echo "##teamcity[progressFinish 'Creating Test Package']"
|
rm -f $testPackageFolderLinux/*.log.config
|
||||||
|
|
||||||
|
CleanFolder $testPackageFolderLinux true
|
||||||
|
|
||||||
|
ProgressEnd 'Creating Linux Test Package'
|
||||||
}
|
}
|
||||||
|
|
||||||
CleanupWindowsPackage()
|
PackageTestsWindows()
|
||||||
{
|
{
|
||||||
echo "Removing NzbDrone.Mono"
|
ProgressStart 'Creating Windows Test Package'
|
||||||
rm -f $outputFolder/NzbDrone.Mono.*
|
|
||||||
|
|
||||||
echo "Adding NzbDrone.Windows to UpdatePackage"
|
rm -rf $testPackageFolderWindows
|
||||||
cp $outputFolder/NzbDrone.Windows.* $updateFolder
|
|
||||||
|
echo "Copying Binaries"
|
||||||
|
cp -r $testPackageFolder $testPackageFolderWindows
|
||||||
|
|
||||||
|
if [ $runtime = "dotnet" ] ; then
|
||||||
|
$nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderWindows
|
||||||
|
else
|
||||||
|
mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderWindows
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp ./test.sh $testPackageFolderWindows
|
||||||
|
|
||||||
|
echo "Removing Sonarr.Mono"
|
||||||
|
rm -f $testPackageFolderWindows/Sonarr.Mono.*
|
||||||
|
|
||||||
|
rm -f $testPackageFolderWindows/*.log.config
|
||||||
|
|
||||||
|
CleanFolder $testPackageFolderWindows true
|
||||||
|
|
||||||
|
ProgressEnd 'Creating Windows Test Package'
|
||||||
|
}
|
||||||
|
|
||||||
|
PackageWindows()
|
||||||
|
{
|
||||||
|
ProgressStart 'Creating Windows Package'
|
||||||
|
|
||||||
|
rm -rf $outputFolderWindows
|
||||||
|
|
||||||
|
echo "Copying Binaries"
|
||||||
|
cp -r $outputFolder $outputFolderWindows
|
||||||
|
|
||||||
|
echo "Removing Sonarr.Mono"
|
||||||
|
rm -f $outputFolderWindows/Sonarr.Mono.*
|
||||||
|
|
||||||
|
echo "Adding Sonarr.Windows to UpdatePackage"
|
||||||
|
cp $outputFolderWindows/Sonarr.Windows.* $outputFolderWindows/$updateSubFolder/
|
||||||
|
|
||||||
|
ProgressEnd 'Creating Windows Package'
|
||||||
|
}
|
||||||
|
|
||||||
|
PublishArtifacts()
|
||||||
|
{
|
||||||
|
ProgressStart 'Publishing Artifacts'
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
echo "##teamcity[publishArtifacts '$testPackageFolderWindows/** => tests.windows.zip']"
|
||||||
|
echo "##teamcity[publishArtifacts '$testPackageFolderLinux/** => tests.linux.zip']"
|
||||||
|
|
||||||
|
# Releases
|
||||||
|
echo "##teamcity[publishArtifacts '$outputFolderWindows/** => Sonarr.$BRANCH.$BUILD_NUMBER.windows.zip!Sonarr']"
|
||||||
|
echo "##teamcity[publishArtifacts '$outputFolderLinux/** => Sonarr.$BRANCH.$BUILD_NUMBER.linux.tar.gz!Sonarr']"
|
||||||
|
echo "##teamcity[publishArtifacts '$outputFolderMacOS/** => Sonarr.$BRANCH.$BUILD_NUMBER.macos.tar.gz!Sonarr']"
|
||||||
|
echo "##teamcity[publishArtifacts '$outputFolderMacOSApp/** => Sonarr.$BRANCH.$BUILD_NUMBER.macos.zip']"
|
||||||
|
|
||||||
|
# Debian Package
|
||||||
|
echo "##teamcity[publishArtifacts 'distribution/** => distribution.zip']"
|
||||||
|
|
||||||
|
ProgressEnd 'Publishing Artifacts'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Use mono or .net depending on OS
|
# Use mono or .net depending on OS
|
||||||
@@ -256,10 +431,14 @@ case "$(uname -s)" in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
UpdateVersionNumber
|
||||||
Build
|
Build
|
||||||
|
CreateReleaseInfo
|
||||||
RunGulp
|
RunGulp
|
||||||
PackageMono
|
PackageMono
|
||||||
PackageOsx
|
PackageMacOS
|
||||||
PackageOsxApp
|
PackageMacOSApp
|
||||||
PackageTests
|
PackageTestsMono
|
||||||
CleanupWindowsPackage
|
PackageTestsWindows
|
||||||
|
PackageWindows
|
||||||
|
PublishArtifacts
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
nzbdrone {version} {branch}; urgency=low
|
|
||||||
|
|
||||||
* Automatic Release.
|
|
||||||
|
|
||||||
-- NzbDrone <contact@nzbdrone.com> Mon, 26 Aug 2013 00:00:00 -0700
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Section: web
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Sonarr <contact@nzbdrone.com>
|
|
||||||
Source: nzbdrone
|
|
||||||
Homepage: https://sonarr.tv
|
|
||||||
Vcs-Git: git@github.com:Sonarr/Sonarr.git
|
|
||||||
Vcs-Browser: https://github.com/Sonarr/Sonarr
|
|
||||||
|
|
||||||
Package: nzbdrone
|
|
||||||
Architecture: all
|
|
||||||
Depends: libmono-cil-dev (>= 3.2), sqlite3 (>= 3.7), mediainfo (>= 0.7.52)
|
|
||||||
Description: Sonarr is an internet PVR
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
nzbdrone_bin/* opt/NzbDrone
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
# -*- makefile -*-
|
|
||||||
# Sample debian/rules that uses debhelper.
|
|
||||||
# This file was originally written by Joey Hess and Craig Small.
|
|
||||||
# As a special exception, when this file is copied by dh-make into a
|
|
||||||
# dh-make output file, you may use that output file without restriction.
|
|
||||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# Note, this script is only used for local dev tests, this is not the script used for building the official sonarr package
|
||||||
|
|
||||||
|
mkdir -p /${PWD}/../_output_debian
|
||||||
|
|
||||||
|
docker build -f docker-build/Dockerfile -t sonarr-packager ./docker-build
|
||||||
|
|
||||||
|
docker run --rm -v /${PWD}/../_output_linux:/data/sonarr_bin:ro -v /${PWD}:/data/build -v /${PWD}/../_output_debian:/data/output sonarr-packager
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
fromdos ./debian/*
|
||||||
|
cp -r ./debian ./debian_backup
|
||||||
|
|
||||||
|
BuildVersion=${dependent_build_number:-3.10.0.999}
|
||||||
|
BuildBranch=${dependent_build_branch:-master}
|
||||||
|
BootstrapVersion=`echo "$BuildVersion" | cut -d. -f1,2,3`
|
||||||
|
BootstrapUpdater="BuiltIn"
|
||||||
|
PackageUpdater="apt"
|
||||||
|
|
||||||
|
echo Version: "$BuildVersion" Branch: "$BuildBranch"
|
||||||
|
|
||||||
|
rm -r ./sonarr_bin/Sonarr.Update
|
||||||
|
chmod -R ugo-x,ugo+rwX,go-w ./sonarr_bin/*
|
||||||
|
|
||||||
|
echo Updating changelog for $BuildVersion
|
||||||
|
sed -i "s:{version}:$BuildVersion:g; s:{branch}:$BuildBranch:g;" debian/changelog
|
||||||
|
sed -i "s:{version}:$BuildVersion:g; s:{updater}:$PackageUpdater:g" debian/preinst debian/postinst debian/postrm
|
||||||
|
sed -i '/#BEGIN BUILTIN UPDATER/,/#END BUILTIN UPDATER/d' debian/preinst debian/postinst debian/postrm
|
||||||
|
echo "# Do Not Edit\nPackageVersion=$BuildVersion\nReleaseVersion=$BuildVersion\nUpdateMethod=$PackageUpdater\nBranch=$BuildBranch" > package_info
|
||||||
|
|
||||||
|
echo Running debuild for $BuildVersion
|
||||||
|
if [ -z "${TEST_OUTPUT}" ]; then
|
||||||
|
debuild -b
|
||||||
|
else
|
||||||
|
debuild -us -uc -b
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Restore debian directory to the original files
|
||||||
|
rm -rf ./debian
|
||||||
|
mv ./debian_backup ./debian
|
||||||
|
|
||||||
|
echo Updating changelog for $BootstrapVersion
|
||||||
|
sed -i "s:{version}:$BootstrapVersion:g; s:{branch}:$BuildBranch:g;" debian/changelog
|
||||||
|
sed -i "s:{version}:$BuildVersion:g; s:{updater}:$BootstrapUpdater:g" debian/preinst debian/postinst debian/postrm
|
||||||
|
sed -i '/#BEGIN BUILTIN UPDATER/d; /#END BUILTIN UPDATER/d' debian/preinst debian/postinst debian/postrm
|
||||||
|
echo "# Do Not Edit\nPackageVersion=$BootstrapVersion\nReleaseVersion=$BuildVersion\nUpdateMethod=$BootstrapUpdater\nBranch=$BuildBranch" > package_info
|
||||||
|
|
||||||
|
echo Running debuild for $BootstrapVersion
|
||||||
|
if [ -z "${TEST_OUTPUT}" ]; then
|
||||||
|
debuild -b
|
||||||
|
else
|
||||||
|
debuild -us -uc -b
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo Moving stuff around
|
||||||
|
mv ../sonarr_*.deb ./
|
||||||
|
mv ../sonarr_*.changes ./
|
||||||
|
rm ../sonarr_*.build
|
||||||
|
|
||||||
|
if [ -z "${TEST_OUTPUT}" ]; then
|
||||||
|
echo Signing Package
|
||||||
|
dpkg-sig -k 884589CE --sign builder "sonarr_${BuildVersion}_all.deb"
|
||||||
|
dpkg-sig -k 884589CE --sign builder "sonarr_${BootstrapVersion}_all.deb"
|
||||||
|
|
||||||
|
echo running alien
|
||||||
|
alien -r -v ./*.deb
|
||||||
|
else
|
||||||
|
echo "Exporting packages to ${TEST_OUTPUT}"
|
||||||
|
dpkg -e "sonarr_${BuildVersion}_all.deb" ${TEST_OUTPUT}/sonarr-build
|
||||||
|
dpkg -e "sonarr_${BootstrapVersion}_all.deb" ${TEST_OUTPUT}/sonarr-release
|
||||||
|
|
||||||
|
cp *.deb ${TEST_OUTPUT}/
|
||||||
|
fi
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
sonarr ({version}) {branch}; urgency=low
|
||||||
|
|
||||||
|
* Automatic Release.
|
||||||
|
|
||||||
|
-- Sonarr <hello@sonarr.tv> Sun, 28 Jan 2018 00:00:00 -0700
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. /usr/share/debconf/confmodule
|
||||||
|
|
||||||
|
db_beginblock
|
||||||
|
db_input high sonarr/owning_user || true
|
||||||
|
db_input high sonarr/owning_group || true
|
||||||
|
db_endblock
|
||||||
|
db_go
|
||||||
|
|
||||||
|
db_input low sonarr/config_directory || true
|
||||||
|
db_go
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
Section: web
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Sonarr <hello@sonarr.tv>
|
||||||
|
Source: sonarr
|
||||||
|
Homepage: https://sonarr.tv
|
||||||
|
Vcs-Git: git@github.com:Sonarr/Sonarr.git
|
||||||
|
Vcs-Browser: https://github.com/Sonarr/Sonarr
|
||||||
|
Build-Depends: debhelper (>= 9),
|
||||||
|
dh-systemd (>= 1.5),
|
||||||
|
mono-devel (>= 5.4),
|
||||||
|
libmono-cil-dev (>= 5.4),
|
||||||
|
cli-common-dev (>= 0.9+xamarin5)
|
||||||
|
|
||||||
|
Package: sonarr
|
||||||
|
Architecture: all
|
||||||
|
Provides: nzbdrone
|
||||||
|
Conflicts: nzbdrone
|
||||||
|
Replaces: nzbdrone
|
||||||
|
Depends: adduser, libsqlite3-0 (>= 3.7), libmediainfo0v5 (>= 0.7.52) | libmediainfo0 (>= 0.7.52), mono-runtime (>= 5.4), ca-certificates-mono, libmono-system-net-http4.0-cil (>= 4.0.0~alpha1), ${cli:Depends}, ${misc:Depends}
|
||||||
|
Recommends: libmediainfo0v5 (>= 18.03) | libmediainfo0 (>= 18.03)
|
||||||
|
Suggests: sqlite3 (>= 3.7), mediainfo (>= 0.7.52)
|
||||||
|
Description: Internet PVR
|
||||||
@@ -1,24 +1,24 @@
|
|||||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
Upstream-Name: nzbdrone
|
Upstream-Name: sonarr
|
||||||
Source: https://github.com/Sonarr/Sonarr
|
Source: https://github.com/Sonarr/Sonarr
|
||||||
|
|
||||||
Files: *
|
Files: *
|
||||||
Copyright: 2010-2016 Sonarr <hello@sonarr.tv>
|
Copyright: 2010-2016 Sonarr <hello@sonarr.tv>
|
||||||
|
|
||||||
License: GPL-3.0+
|
License: GPL-3.0+
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
.
|
.
|
||||||
This package is distributed in the hope that it will be useful,
|
This package is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
.
|
.
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
.
|
.
|
||||||
On Debian systems, the complete text of the GNU General
|
On Debian systems, the complete text of the GNU General
|
||||||
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
|
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
sonarr_3.0.0.0_all.deb web optional
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
sonarr_bin/* usr/lib/sonarr/bin
|
||||||
|
package_info usr/lib/sonarr
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BUILD_VERSION={version}
|
||||||
|
UPDATER={updater}
|
||||||
|
|
||||||
|
. /usr/share/debconf/confmodule
|
||||||
|
db_get sonarr/owning_user
|
||||||
|
USER="$RET"
|
||||||
|
db_get sonarr/owning_group
|
||||||
|
GROUP="$RET"
|
||||||
|
db_get sonarr/config_directory
|
||||||
|
CONFDIR="$RET"
|
||||||
|
|
||||||
|
# Add User and Group
|
||||||
|
if ! getent group "$GROUP" >/dev/null; then
|
||||||
|
groupadd "$GROUP"
|
||||||
|
fi
|
||||||
|
if ! getent passwd "$USER" >/dev/null; then
|
||||||
|
adduser --system --no-create-home --ingroup "$GROUP" "$USER"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $1 = "configure" ]; then
|
||||||
|
# Migrate old Sonarr v3 alpha data dir from /var/opt/sonarr or user home
|
||||||
|
if [ -d "/var/opt/sonarr" ] && [ "$CONFDIR" != "/var/opt/sonarr" ] && [ ! -d "$CONFDIR" ]; then
|
||||||
|
varoptRoot="/var/opt/sonarr"
|
||||||
|
varoptAppData="$varoptRoot/.config/Sonarr"
|
||||||
|
sonarrUserHome=`getent passwd $USER | cut -d ':' -f 6`
|
||||||
|
sonarrAppData="$sonarrUserHome/.config/Sonarr"
|
||||||
|
if [ -f "$varoptRoot/sonarr.db" ]; then
|
||||||
|
# Handle /var/opt/sonarr/sonarr.db
|
||||||
|
mv "$varoptRoot" "$CONFDIR"
|
||||||
|
elif [ -f "$varoptAppData/sonarr.db" ]; then
|
||||||
|
# Handle /var/opt/sonarr/.config/Sonarr/sonarr.db
|
||||||
|
mv "$varoptAppData" "$CONFDIR"
|
||||||
|
rm -rf "$varoptRoot"
|
||||||
|
elif [ -f "$sonarrAppData/sonarr.db" ]; then
|
||||||
|
# Handle ~/.config/Sonarr/sonarr.db
|
||||||
|
mv "$sonarrAppData" "$CONFDIR"
|
||||||
|
rm -rf "$sonarrAppData"
|
||||||
|
else
|
||||||
|
mv "$varoptRoot" "$CONFDIR"
|
||||||
|
fi
|
||||||
|
chown -R $USER:$GROUP "$CONFDIR"
|
||||||
|
chmod -R 775 "$CONFDIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Migrate old NzbDrone data dir
|
||||||
|
if [ -d "/usr/lib/sonarr/nzbdrone-appdata" ] && [ ! -d "$CONFDIR" ]; then
|
||||||
|
NZBDRONE_DATA=`readlink /usr/lib/sonarr/nzbdrone-appdata`
|
||||||
|
if [ -f "$NZBDRONE_DATA/config.xml" ] && [ -f "$NZBDRONE_DATA/nzbdrone.db" ]; then
|
||||||
|
echo "Found NzbDrone database in $NZBDRONE_DATA, copying to $CONFDIR."
|
||||||
|
mkdir -p "$CONFDIR"
|
||||||
|
cp $NZBDRONE_DATA/config.xml $NZBDRONE_DATA/nzbdrone.db* "$CONFDIR/"
|
||||||
|
chown -R $USER:$GROUP "$CONFDIR"
|
||||||
|
chmod -R 775 "$CONFDIR"
|
||||||
|
else
|
||||||
|
echo "Missing NzbDrone database in $NZBDRONE_DATA, skipping migration."
|
||||||
|
fi
|
||||||
|
rm /usr/lib/sonarr/nzbdrone-appdata
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create data directory
|
||||||
|
if [ ! -d "$CONFDIR" ]; then
|
||||||
|
mkdir -p "$CONFDIR"
|
||||||
|
chown -R $USER:$GROUP "$CONFDIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#BEGIN BUILTIN UPDATER
|
||||||
|
# Apply patch if present
|
||||||
|
if [ "$UPDATER" = "BuiltIn" ] && [ -f /usr/lib/sonarr/bin_patch/release_info ]; then
|
||||||
|
# It shouldn't be possible to get a wrong bin_patch, but let's check anyway and throw it away if it's wrong
|
||||||
|
currentVersion=`cat /usr/lib/sonarr/bin_patch/release_info | grep 'ReleaseVersion=' | cut -d= -f 2`
|
||||||
|
currentRelease=`echo "$currentVersion" | cut -d. -f1,2,3`
|
||||||
|
currentBuild=`echo "$currentVersion" | cut -d. -f4`
|
||||||
|
targetVersion=$BUILD_VERSION
|
||||||
|
targetRelease=`echo "$targetVersion" | cut -d. -f1,2,3`
|
||||||
|
targetBuild=`echo "$targetVersion" | cut -d. -f4`
|
||||||
|
|
||||||
|
if [ "$currentRelease" = "$targetRelease" ] && [ "$currentBuild" -gt "$targetBuild" ]; then
|
||||||
|
echo "Applying $currentVersion from BuiltIn updater instead of downgrading to $targetVersion"
|
||||||
|
rm -rf /usr/lib/sonarr/bin
|
||||||
|
mv /usr/lib/sonarr/bin_patch /usr/lib/sonarr/bin
|
||||||
|
else
|
||||||
|
rm -rf /usr/lib/sonarr/bin_patch
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
#END BUILTIN UPDATER
|
||||||
|
|
||||||
|
# Set permissions on /usr/lib/sonarr
|
||||||
|
chown -R $USER:$GROUP /usr/lib/sonarr
|
||||||
|
|
||||||
|
# Update sonarr.service file
|
||||||
|
sed -i "s:User=sonarr:User=$USER:g; s:Group=sonarr:Group=$GROUP:g; s:-data=/var/lib/sonarr:-data=$CONFDIR:g" /lib/systemd/system/sonarr.service
|
||||||
|
|
||||||
|
#BEGIN BUILTIN UPDATER
|
||||||
|
if [ $1 = "upgrade" ] && [ "$UPDATER" = "BuiltIn" ]; then
|
||||||
|
# If we upgraded, signal Sonarr to do an update check on startup instead of scheduled.
|
||||||
|
touch $CONFDIR/update_required
|
||||||
|
chown $USER:$GROUP $CONFDIR/update_required
|
||||||
|
fi
|
||||||
|
#END BUILTIN UPDATER
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BUILD_VERSION={version}
|
||||||
|
UPDATER={updater}
|
||||||
|
|
||||||
|
if [ $1 = "abort-install" ]; then
|
||||||
|
# preinst was aborted, possibly due to NzbDrone still running.
|
||||||
|
# Nothing to do here
|
||||||
|
:
|
||||||
|
fi
|
||||||
|
|
||||||
|
# The bin directory is expected to be empty, unless the BuiltIn updater added files.
|
||||||
|
if [ $1 = "remove" ] && [ -d /usr/lib/sonarr/bin ]; then
|
||||||
|
rm -rf /usr/lib/sonarr/bin
|
||||||
|
fi
|
||||||
|
|
||||||
|
#BEGIN BUILTIN UPDATER
|
||||||
|
# Remove any existing patch if still present
|
||||||
|
if [ $1 = "remove" ] && [ -d /usr/lib/sonarr/bin_patch ]; then
|
||||||
|
rm -rf /usr/lib/sonarr/bin_patch
|
||||||
|
fi
|
||||||
|
#END BUILTIN UPDATER
|
||||||
|
|
||||||
|
# Purge the entire sonarr configuration directory.
|
||||||
|
# TODO: Maybe move a minimal backup to tmp?
|
||||||
|
if [ $1 = "purge" ] && [ -e /usr/share/debconf/confmodule ]; then
|
||||||
|
. /usr/share/debconf/confmodule
|
||||||
|
db_get sonarr/config_directory
|
||||||
|
CONFDIR="$RET"
|
||||||
|
if [ -d "$CONFDIR" ]; then
|
||||||
|
rm -rf "$CONFDIR"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BUILD_VERSION={version}
|
||||||
|
UPDATER={updater}
|
||||||
|
|
||||||
|
# Deal with existing nzbdrone installs
|
||||||
|
#
|
||||||
|
# Existing nzbdrone packages do not have startup scripts and the process might still be running.
|
||||||
|
# If the user manually installed nzbdrone then the process might still be running too.
|
||||||
|
if [ $1 = "install" ]; then
|
||||||
|
psNzbDrone=`ps ax -o'user,pid,ppid,unit,args' | grep mono.*NzbDrone\\\\.exe || true`
|
||||||
|
if [ ! -z "$psNzbDrone" ]; then
|
||||||
|
# Get the user and optional systemd unit
|
||||||
|
psNzbDroneUser=`echo "$psNzbDrone" | tr -s ' ' | cut -d ' ' -f 1`
|
||||||
|
psNzbDroneUnit=`echo "$psNzbDrone" | tr -s ' ' | cut -d ' ' -f 4`
|
||||||
|
# Get the appdata from the cmdline or get it from the user dir
|
||||||
|
droneAppData=`echo "$psNzbDrone" | tr ' ' '\n' | grep -- "-data=" | cut -d= -f 2`
|
||||||
|
if [ "$droneAppData" = "" ]; then
|
||||||
|
droneUserHome=`getent passwd $psNzbDroneUser | cut -d ':' -f 6`
|
||||||
|
droneAppData="$droneUserHome/.config/NzbDrone"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$psNzbDroneUnit" != "-" ] && [ -d /run/systemd/system ]; then
|
||||||
|
if [ "$psNzbDroneUnit" = "sonarr.service" ]; then
|
||||||
|
# Conflicts with our new sonarr.service so we have to remove it
|
||||||
|
echo "NzbDrone systemd startup detected at $psNzbDroneUnit, stopping and removing..."
|
||||||
|
deb-systemd-invoke stop $psNzbDroneUnit >/dev/null
|
||||||
|
if [ -f "/etc/systemd/system/$psNzbDroneUnit" ]; then
|
||||||
|
rm /etc/systemd/system/$psNzbDroneUnit
|
||||||
|
fi
|
||||||
|
if [ -f "/usr/lib/systemd/system/$psNzbDroneUnit" ]; then
|
||||||
|
rm /usr/lib/systemd/system/$psNzbDroneUnit
|
||||||
|
fi
|
||||||
|
deb-systemd-helper purge $psNzbDroneUnit >/dev/null
|
||||||
|
deb-systemd-helper unmask $psNzbDroneUnit >/dev/null
|
||||||
|
systemctl --system daemon-reload >/dev/null || true
|
||||||
|
else
|
||||||
|
# Just disable it, so the user can revisit the settings later
|
||||||
|
echo "NzbDrone systemd startup detected at $psNzbDroneUnit, stopping and disabling..."
|
||||||
|
deb-systemd-invoke stop $psNzbDroneUnit >/dev/null
|
||||||
|
deb-systemd-invoke mask $psNzbDroneUnit >/dev/null
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# We don't support auto migration for other startup methods, so bail.
|
||||||
|
# This leaves the sonarr package in an incomplete state.
|
||||||
|
echo "ps: $psNzbDrone"
|
||||||
|
echo "Error: An existing Sonarr v2 (NzbDrone) process is running. Remove the NzbDrone auto-startup prior to installing sonarr."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We don't have the debconf configuration yet so we can't migrate the data.
|
||||||
|
# Instead we symlink so postinst knows where it's at.
|
||||||
|
if [ -f "/usr/lib/sonarr/nzbdrone-appdata" ]; then
|
||||||
|
rm "/usr/lib/sonarr/nzbdrone-appdata"
|
||||||
|
else
|
||||||
|
mkdir -p "/usr/lib/sonarr"
|
||||||
|
fi
|
||||||
|
ln -s $droneAppData /usr/lib/sonarr/nzbdrone-appdata
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#BEGIN BUILTIN UPDATER
|
||||||
|
# Check for supported upgrade paths
|
||||||
|
if [ $1 = "upgrade" ] && [ "$UPDATER" = "BuiltIn" ] && [ -f /usr/lib/sonarr/bin/release_info ]; then
|
||||||
|
# If we allow the Built-In updater to upgrade from 3.0.1.123 to 3.0.2.500 and now apt is catching up to 3.0.2.425
|
||||||
|
# then we need to deal with that 500->425 'downgrade'.
|
||||||
|
# We do that by preserving the binaries and using those instead for postinst.
|
||||||
|
|
||||||
|
currentVersion=`cat /usr/lib/sonarr/bin/release_info | grep 'ReleaseVersion=' | cut -d= -f 2`
|
||||||
|
currentRelease=`echo "$currentVersion" | cut -d. -f1,2,3`
|
||||||
|
currentBuild=`echo "$currentVersion" | cut -d. -f4`
|
||||||
|
targetVersion=$BUILD_VERSION
|
||||||
|
targetRelease=`echo "$targetVersion" | cut -d. -f1,2,3`
|
||||||
|
targetBuild=`echo "$targetVersion" | cut -d. -f4`
|
||||||
|
|
||||||
|
if [ -d /usr/lib/sonarr/bin_patch ]; then
|
||||||
|
rm -rf /usr/lib/sonarr/bin_patch
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if the existing version is already an upgrade for the included build
|
||||||
|
if [ "$currentRelease" = "$targetRelease" ] && [ "$currentBuild" -gt "$targetBuild" ]; then
|
||||||
|
echo "Preserving $currentVersion from BuiltIn updater instead of downgrading to $targetVersion"
|
||||||
|
cp -r /usr/lib/sonarr/bin /usr/lib/sonarr/bin_patch
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
#END BUILTIN UPDATER
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
# Uncomment this to turn on verbose mode.
|
||||||
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
EXCLUDE_MODULEREFS = crypt32 httpapi
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@ --with=systemd --with=cli
|
||||||
|
|
||||||
|
# No init script, only systemd
|
||||||
|
override_dh_installinit:
|
||||||
|
true
|
||||||
|
|
||||||
|
# Sonarr likes debug symbols for logging
|
||||||
|
override_dh_clistrip:
|
||||||
|
|
||||||
|
override_dh_makeclilibs:
|
||||||
|
|
||||||
|
override_dh_clideps:
|
||||||
|
dh_clideps -d -r $(patsubst %,--exclude-moduleref=%,$(EXCLUDE_MODULEREFS))
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
ignores msbuild
|
||||||
|
ignores libmediainfo0v5
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Sonarr Daemon
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=sonarr
|
||||||
|
Group=sonarr
|
||||||
|
UMask=002
|
||||||
|
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/mono --debug /usr/lib/sonarr/bin/Sonarr.exe -nobrowser -data=/var/lib/sonarr
|
||||||
|
TimeoutStopSec=20
|
||||||
|
KillMode=process
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
Template: sonarr/owning_user
|
||||||
|
Type: string
|
||||||
|
Default: sonarr
|
||||||
|
Description: Sonarr user:
|
||||||
|
Specify the user that is used to run Sonarr. The user will be created if it does not already exist.
|
||||||
|
The default 'sonarr' should work fine for most users. You can specify the user group next.
|
||||||
|
|
||||||
|
Template: sonarr/owning_group
|
||||||
|
Type: string
|
||||||
|
Default: sonarr
|
||||||
|
Description: Sonarr group:
|
||||||
|
Specify the group that is used to run Sonarr. The group will be created if it does not already exist.
|
||||||
|
If the user doesn't already exist then this group will be used as the user's primary group.
|
||||||
|
Any media files created by Sonarr will be writeable by this group.
|
||||||
|
It's advisable to keep the group the same between download client, Sonarr and media centers.
|
||||||
|
|
||||||
|
Template: sonarr/config_directory
|
||||||
|
Type: string
|
||||||
|
Default: /var/lib/sonarr
|
||||||
|
Description: Config directory:
|
||||||
|
Specify the directory where Sonarr stores the internal database and metadata. Media content will be stored elsewhere.
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
FROM ubuntu:xenial AS builder
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
ENV MONO_VERSION 5.14
|
||||||
|
|
||||||
|
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF && \
|
||||||
|
echo "deb http://download.mono-project.com/repo/debian stable-xenial/snapshots/$MONO_VERSION main" > /etc/apt/sources.list.d/mono-official-stable.list && \
|
||||||
|
apt-get update && apt-get install -y \
|
||||||
|
devscripts build-essential tofrodos \
|
||||||
|
dh-make dh-systemd \
|
||||||
|
cli-common-dev \
|
||||||
|
mono-complete \
|
||||||
|
sqlite3 libcurl3 mediainfo
|
||||||
|
|
||||||
|
RUN apt-cache policy mono-complete
|
||||||
|
RUN apt-cache policy cli-common-dev
|
||||||
|
|
||||||
|
COPY debian-start.sh /debian-start.sh
|
||||||
|
RUN fromdos /debian-start.sh
|
||||||
|
|
||||||
|
WORKDIR /data
|
||||||
|
VOLUME [ "/data/sonarr_bin", "/data/build", "/data/output" ]
|
||||||
|
CMD /debian-start.sh
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
echo "Debian Build Dev bootstrap..."
|
||||||
|
|
||||||
|
export TEST_OUTPUT=/data/output
|
||||||
|
|
||||||
|
mkdir ${TEST_OUTPUT}
|
||||||
|
|
||||||
|
mkdir /data/temp
|
||||||
|
|
||||||
|
cp -rf /data/build/debian.sh /data/temp
|
||||||
|
cp -rf /data/build/debian /data/temp
|
||||||
|
cp -rf /data/sonarr_bin /data/temp/sonarr_bin
|
||||||
|
|
||||||
|
cd /data/temp
|
||||||
|
|
||||||
|
ls -al .
|
||||||
|
|
||||||
|
fromdos debian.sh
|
||||||
|
sh debian.sh
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
FROM ubuntu:xenial
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
ARG MONO_VERSION=5.20
|
||||||
|
ARG MONO_URL=stable-xenial/snapshots/$MONO_VERSION
|
||||||
|
|
||||||
|
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF && \
|
||||||
|
echo "deb http://download.mono-project.com/repo/debian $MONO_URL main" > /etc/apt/sources.list.d/mono-official-stable.list && \
|
||||||
|
apt-get update && apt-get install -y \
|
||||||
|
tofrodos tzdata \
|
||||||
|
mono-complete \
|
||||||
|
sqlite3 mediainfo \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY startup.sh /startup.sh
|
||||||
|
RUN fromdos /startup.sh
|
||||||
|
|
||||||
|
WORKDIR /data/
|
||||||
|
VOLUME ["/data/_tests_linux", "/data/_output_linux", "/data/_tests_results"]
|
||||||
|
|
||||||
|
CMD bash /startup.sh
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
FROM ubuntu:xenial
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
ARG MONO_VERSION=5.20
|
||||||
|
ARG MONO_URL=stable-xenial/snapshots/$MONO_VERSION
|
||||||
|
|
||||||
|
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF && \
|
||||||
|
echo "deb http://download.mono-project.com/repo/debian $MONO_URL main" > /etc/apt/sources.list.d/mono-official-stable.list && \
|
||||||
|
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 2009837CBFFD68F45BC180471F4F90DE2A9B4BF8 && \
|
||||||
|
echo "deb http://apt.sonarr.tv/ubuntu xenial main" > /etc/apt/sources.list.d/sonarr.list && \
|
||||||
|
apt-get update && apt-get install -y \
|
||||||
|
tofrodos tzdata \
|
||||||
|
sonarr \
|
||||||
|
sqlite3 mediainfo \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
libmono-system-runtime4.0-cil \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY startup.sh /startup.sh
|
||||||
|
RUN fromdos /startup.sh
|
||||||
|
|
||||||
|
WORKDIR /data/
|
||||||
|
VOLUME ["/data/_tests_linux", "/data/_output_linux", "/data/_tests_results"]
|
||||||
|
|
||||||
|
CMD bash /startup.sh
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
echo "Preparing Test..."
|
||||||
|
mkdir -p /data/test
|
||||||
|
cp -r /data/_tests_linux/* /data/test/
|
||||||
|
cp -r /data/_output_linux /data/test/bin
|
||||||
|
|
||||||
|
cd /data/test
|
||||||
|
|
||||||
|
runTest()
|
||||||
|
{
|
||||||
|
bash test.sh Linux $1
|
||||||
|
cp TestResult.xml /data/_tests_results/TestResult_$1.xml
|
||||||
|
}
|
||||||
|
|
||||||
|
runTest Integration
|
||||||
|
runTest Unit
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
|
||||||
|
opt_parallel=
|
||||||
|
opt_version=
|
||||||
|
opt_mode=both
|
||||||
|
while getopts 'pv:m:?h' c
|
||||||
|
do
|
||||||
|
case $c in
|
||||||
|
p) opt_parallel=1 ;;
|
||||||
|
v) opt_version=$OPTARG ;;
|
||||||
|
m) opt_mode=$OPTARG ;;
|
||||||
|
?|h) printf "Usage: %s [-p] [-v mono-ver] [-m sonarr|complete]\n" $0
|
||||||
|
printf " -p run parallel\n"
|
||||||
|
printf " -v run specified mono version\n"
|
||||||
|
printf " -m run only mono-'complete' or 'sonarr' package variants\n"
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
# NOTE:
|
||||||
|
# each container has a 1gb tmpfs mounted since it greatly speeds up the normally intensive db operations
|
||||||
|
# make sure that the docker host has enough memory to handle about ~300 MB per container, so 2-3 GB total
|
||||||
|
# excess goes to the swap and will slow down the entire system
|
||||||
|
|
||||||
|
# Preferred versions
|
||||||
|
MONO_VERSIONS="6.8 6.6 6.4 6.0 5.20 5.18"
|
||||||
|
|
||||||
|
# Future versions
|
||||||
|
MONO_VERSIONS="$MONO_VERSIONS 6.10=preview-xenial"
|
||||||
|
|
||||||
|
# Supported versions
|
||||||
|
MONO_VERSIONS="$MONO_VERSIONS 5.16 5.14 5.12 5.10 5.8 5.4"
|
||||||
|
|
||||||
|
# Legacy unsupported versions
|
||||||
|
MONO_VERSIONS="$MONO_VERSIONS 5.0"
|
||||||
|
#MONO_VERSIONS="$MONO_VERSIONS 4.8=stable-wheezy/snapshots/4.8"
|
||||||
|
|
||||||
|
if [ "$opt_version" != "" ]; then
|
||||||
|
MONO_VERSIONS="$opt_version"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p ${PWD}/../../_tests_results
|
||||||
|
|
||||||
|
prepOne() {
|
||||||
|
local MONO_VERSION_PAIR=$1
|
||||||
|
|
||||||
|
MONO_VERSION_SPLIT=(${MONO_VERSION_PAIR//=/ })
|
||||||
|
MONO_VERSION=${MONO_VERSION_SPLIT[0]}
|
||||||
|
MONO_URL=${MONO_VERSION_SPLIT[1]:-"stable-xenial/snapshots/$MONO_VERSION"}
|
||||||
|
|
||||||
|
echo "Building Test Docker for mono $MONO_VERSION"
|
||||||
|
|
||||||
|
if [ "$opt_mode" != "sonarr" ]; then
|
||||||
|
docker build -t sonarr-test-$MONO_VERSION --build-arg MONO_VERSION=$MONO_VERSION --build-arg MONO_URL=$MONO_URL --file mono/complete/Dockerfile mono
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$opt_mode" != "complete" ] && [ "$MONO_VERSION" != "5.0" ]; then
|
||||||
|
docker build -t sonarr-test-$MONO_VERSION-sonarr --build-arg MONO_VERSION=$MONO_VERSION --build-arg MONO_URL=$MONO_URL --file mono/sonarr/Dockerfile mono
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
runOne() {
|
||||||
|
local MONO_VERSION_PAIR=$1
|
||||||
|
|
||||||
|
MONO_VERSION_SPLIT=(${MONO_VERSION_PAIR//=/ })
|
||||||
|
MONO_VERSION=${MONO_VERSION_SPLIT[0]}
|
||||||
|
|
||||||
|
echo "Running Test Docker for mono $MONO_VERSION"
|
||||||
|
|
||||||
|
if [ "$opt_mode" != "sonarr" ]; then
|
||||||
|
dockerArgs="--rm"
|
||||||
|
dockerArgs="$dockerArgs -v /${PWD}/../../_tests_linux:/data/_tests_linux:ro"
|
||||||
|
dockerArgs="$dockerArgs -v /${PWD}/../../_output_linux:/data/_output_linux:ro"
|
||||||
|
dockerArgs="$dockerArgs -v /${PWD}/../../_tests_results/mono-$MONO_VERSION:/data/_tests_results"
|
||||||
|
dockerArgs="$dockerArgs --mount type=tmpfs,destination=//data/test,tmpfs-size=1g"
|
||||||
|
docker run $dockerArgs sonarr-test-$MONO_VERSION
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$opt_mode" != "complete" ] && [ "$MONO_VERSION" != "5.0" ]; then
|
||||||
|
dockerArgs="--rm"
|
||||||
|
dockerArgs="$dockerArgs -v /${PWD}/../../_tests_linux:/data/_tests_linux:ro"
|
||||||
|
dockerArgs="$dockerArgs -v /${PWD}/../../_output_linux:/data/_output_linux:ro"
|
||||||
|
dockerArgs="$dockerArgs -v /${PWD}/../../_tests_results/mono-$MONO_VERSION-sonarr:/data/_tests_results"
|
||||||
|
dockerArgs="$dockerArgs --mount type=tmpfs,destination=//data/test,tmpfs-size=1g"
|
||||||
|
docker run $dockerArgs sonarr-test-$MONO_VERSION-sonarr
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Finished Test Docker for mono $MONO_VERSION"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$opt_parallel" == "1" ]; then
|
||||||
|
for MONO_VERSION_PAIR in $MONO_VERSIONS; do
|
||||||
|
prepOne "$MONO_VERSION_PAIR"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
for MONO_VERSION_PAIR in $MONO_VERSIONS; do
|
||||||
|
if [ "$opt_parallel" == "1" ]; then
|
||||||
|
runOne "$MONO_VERSION_PAIR" &
|
||||||
|
else
|
||||||
|
prepOne "$MONO_VERSION_PAIR"
|
||||||
|
runOne "$MONO_VERSION_PAIR"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$opt_parallel" == "1" ]; then
|
||||||
|
echo "Waiting for all runs to finish"
|
||||||
|
wait
|
||||||
|
echo "Finished all runs"
|
||||||
|
fi
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"remove-empty-rulesets": true,
|
||||||
|
"always-semicolon": true,
|
||||||
|
"color-case": "lower",
|
||||||
|
"block-indent": " ",
|
||||||
|
"color-shorthand": false,
|
||||||
|
"element-case": "lower",
|
||||||
|
"eof-newline": true,
|
||||||
|
"leading-zero": true,
|
||||||
|
"quotes": "double",
|
||||||
|
"sort-order-fallback": "abc",
|
||||||
|
"space-before-colon": "",
|
||||||
|
"space-after-colon": " ",
|
||||||
|
"space-before-combinator": " ",
|
||||||
|
"space-after-combinator": " ",
|
||||||
|
"space-between-declarations": "\n",
|
||||||
|
"space-before-opening-brace": " ",
|
||||||
|
"space-after-opening-brace": "\n",
|
||||||
|
"space-after-selector-delimiter": " ",
|
||||||
|
"space-before-selector-delimiter": "",
|
||||||
|
"space-before-closing-brace": "\n",
|
||||||
|
"strip-spaces": true,
|
||||||
|
"tab-size": true,
|
||||||
|
"unitless-zero": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,335 @@
|
|||||||
|
{
|
||||||
|
"indent": {
|
||||||
|
"value": " ",
|
||||||
|
"FunctionExpression": 1,
|
||||||
|
"ArrayExpression": 1,
|
||||||
|
"ObjectExpression": 1
|
||||||
|
},
|
||||||
|
"lineBreak": {
|
||||||
|
"value": "\n",
|
||||||
|
|
||||||
|
"before": {
|
||||||
|
"ArrayPatternClosing": 0,
|
||||||
|
"ArrayPatternComma": 0,
|
||||||
|
"ArrayPatternOpening": 0,
|
||||||
|
"ArrowFunctionExpressionArrow": 0,
|
||||||
|
"ArrowFunctionExpressionClosingBrace": ">=1",
|
||||||
|
"ArrowFunctionExpressionOpeningBrace": 0,
|
||||||
|
"AssignmentExpression": ">=1",
|
||||||
|
"AssignmentOperator": 0,
|
||||||
|
"BlockStatement": 0,
|
||||||
|
"BreakKeyword": ">=1",
|
||||||
|
"CallExpression": -1,
|
||||||
|
"CallExpressionClosingParentheses": -1,
|
||||||
|
"CallExpressionOpeningParentheses": 0,
|
||||||
|
"CatchClosingBrace": ">=1",
|
||||||
|
"CatchKeyword": 0,
|
||||||
|
"CatchOpeningBrace": 0,
|
||||||
|
"ClassDeclaration": ">=1",
|
||||||
|
"ClassDeclarationClosingBrace": ">=1",
|
||||||
|
"ClassDeclarationOpeningBrace": 0,
|
||||||
|
"ConditionalExpression": ">=1",
|
||||||
|
"DeleteOperator": ">=1",
|
||||||
|
"DoWhileStatement": ">=1",
|
||||||
|
"DoWhileStatementClosingBrace": ">=1",
|
||||||
|
"DoWhileStatementOpeningBrace": 0,
|
||||||
|
"ElseIfStatement": 0,
|
||||||
|
"ElseIfStatementClosingBrace": ">=1",
|
||||||
|
"ElseIfStatementOpeningBrace": 0,
|
||||||
|
"ElseStatement": 0,
|
||||||
|
"ElseStatementClosingBrace": ">=1",
|
||||||
|
"ElseStatementOpeningBrace": 0,
|
||||||
|
"EmptyStatement": -1,
|
||||||
|
"EndOfFile": -1,
|
||||||
|
"FinallyClosingBrace": ">=1",
|
||||||
|
"FinallyKeyword": -1,
|
||||||
|
"FinallyOpeningBrace": 0,
|
||||||
|
"ForInStatement": ">=1",
|
||||||
|
"ForInStatementClosingBrace": ">=1",
|
||||||
|
"ForInStatementExpressionClosing": 0,
|
||||||
|
"ForInStatementExpressionOpening": 0,
|
||||||
|
"ForInStatementOpeningBrace": 0,
|
||||||
|
"ForStatement": ">=1",
|
||||||
|
"ForStatementClosingBrace": ">=1",
|
||||||
|
"ForStatementExpressionClosing": "<2",
|
||||||
|
"ForStatementExpressionOpening": 0,
|
||||||
|
"ForStatementOpeningBrace": 0,
|
||||||
|
"FunctionDeclaration": ">=1",
|
||||||
|
"FunctionDeclarationClosingBrace": ">=1",
|
||||||
|
"FunctionDeclarationOpeningBrace": 0,
|
||||||
|
"FunctionExpression": 0,
|
||||||
|
"FunctionExpressionClosingBrace": 1,
|
||||||
|
"FunctionExpressionOpeningBrace":0,
|
||||||
|
"IIFEClosingParentheses": 0,
|
||||||
|
"IfStatement": ">=1",
|
||||||
|
"IfStatementClosingBrace": ">=1",
|
||||||
|
"IfStatementOpeningBrace": 0,
|
||||||
|
"LogicalExpression": -1,
|
||||||
|
"MemberExpressionClosing": 0,
|
||||||
|
"MemberExpressionOpening": 0,
|
||||||
|
"MemberExpressionPeriod": -1,
|
||||||
|
"MethodDefinition": ">=1",
|
||||||
|
"ObjectExpressionClosingBrace": "<=1",
|
||||||
|
"ObjectPatternClosingBrace": 0,
|
||||||
|
"ObjectPatternComma": 0,
|
||||||
|
"ObjectPatternOpeningBrace": 0,
|
||||||
|
"ParameterDefault": 0,
|
||||||
|
"Property": "<=2",
|
||||||
|
"PropertyValue": 0,
|
||||||
|
"ReturnStatement": -1,
|
||||||
|
"SwitchClosingBrace": ">=1",
|
||||||
|
"SwitchOpeningBrace": 0,
|
||||||
|
"ThisExpression": -1,
|
||||||
|
"ThrowStatement": ">=1",
|
||||||
|
"TryClosingBrace": ">=1",
|
||||||
|
"TryKeyword": -1,
|
||||||
|
"TryOpeningBrace": 0,
|
||||||
|
"VariableDeclaration": ">=1",
|
||||||
|
"VariableDeclarationSemiColon": 0,
|
||||||
|
"VariableDeclarationWithoutInit": ">=1",
|
||||||
|
"VariableName": ">=1",
|
||||||
|
"VariableValue": 0,
|
||||||
|
"WhileStatement": ">=1",
|
||||||
|
"WhileStatementClosingBrace": ">=1",
|
||||||
|
"WhileStatementOpeningBrace": 0
|
||||||
|
},
|
||||||
|
|
||||||
|
"after": {
|
||||||
|
"ArrayPatternClosing": 0,
|
||||||
|
"ArrayPatternComma": 0,
|
||||||
|
"ArrayPatternOpening": 0,
|
||||||
|
"ArrowFunctionExpressionArrow": 0,
|
||||||
|
"ArrowFunctionExpressionClosingBrace": -1,
|
||||||
|
"ArrowFunctionExpressionOpeningBrace": ">=1",
|
||||||
|
"AssignmentExpression": ">=1",
|
||||||
|
"AssignmentOperator": 0,
|
||||||
|
"BlockStatement": 0,
|
||||||
|
"BreakKeyword": -1,
|
||||||
|
"CallExpression": -1,
|
||||||
|
"CallExpressionClosingParentheses": -1,
|
||||||
|
"CallExpressionOpeningParentheses": -1,
|
||||||
|
"CatchClosingBrace": ">=0",
|
||||||
|
"CatchKeyword": 0,
|
||||||
|
"CatchOpeningBrace": ">=1",
|
||||||
|
"ClassDeclaration": ">=1",
|
||||||
|
"ClassDeclarationClosingBrace": ">=1",
|
||||||
|
"ClassDeclarationOpeningBrace": ">=1",
|
||||||
|
"ConditionalExpression": ">=1",
|
||||||
|
"DeleteOperator": ">=1",
|
||||||
|
"DoWhileStatement": ">=1",
|
||||||
|
"DoWhileStatementClosingBrace": 0,
|
||||||
|
"DoWhileStatementOpeningBrace": ">=1",
|
||||||
|
"ElseIfStatement": ">=1",
|
||||||
|
"ElseIfStatementClosingBrace": ">=1",
|
||||||
|
"ElseIfStatementOpeningBrace": ">=1",
|
||||||
|
"ElseStatement": ">=1",
|
||||||
|
"ElseStatementClosingBrace": ">=1",
|
||||||
|
"ElseStatementOpeningBrace": ">=1",
|
||||||
|
"EmptyStatement": -1,
|
||||||
|
"FinallyClosingBrace": ">=1",
|
||||||
|
"FinallyKeyword": -1,
|
||||||
|
"FinallyOpeningBrace": ">=1",
|
||||||
|
"ForInStatement": ">=1",
|
||||||
|
"ForInStatementClosingBrace": ">=1",
|
||||||
|
"ForInStatementExpressionClosing": -1,
|
||||||
|
"ForInStatementExpressionOpening": "<2",
|
||||||
|
"ForInStatementOpeningBrace": ">=1",
|
||||||
|
"ForStatement": ">=1",
|
||||||
|
"ForStatementClosingBrace": ">=1",
|
||||||
|
"ForStatementExpressionClosing": -1,
|
||||||
|
"ForStatementExpressionOpening": "<2",
|
||||||
|
"ForStatementOpeningBrace": ">=1",
|
||||||
|
"FunctionDeclaration": ">=1",
|
||||||
|
"FunctionDeclarationClosingBrace": ">=1",
|
||||||
|
"FunctionDeclarationOpeningBrace": ">=1",
|
||||||
|
"FunctionExpression": 0,
|
||||||
|
"FunctionExpressionClosingBrace": -1,
|
||||||
|
"FunctionExpressionOpeningBrace": 1,
|
||||||
|
"IIFEOpeningParentheses": 0,
|
||||||
|
"IfStatement": ">=1",
|
||||||
|
"IfStatementClosingBrace": ">=1",
|
||||||
|
"IfStatementOpeningBrace": ">=1",
|
||||||
|
"LogicalExpression": -1,
|
||||||
|
"MemberExpressionClosing": 0,
|
||||||
|
"MemberExpressionOpening": 0,
|
||||||
|
"MemberExpressionPeriod": 0,
|
||||||
|
"MethodDefinition": ">=1",
|
||||||
|
"ObjectExpressionOpeningBrace": "<=1",
|
||||||
|
"ObjectPatternClosingBrace": 0,
|
||||||
|
"ObjectPatternComma": 0,
|
||||||
|
"ObjectPatternOpeningBrace": 0,
|
||||||
|
"ParameterDefault": 0,
|
||||||
|
"Property": -1,
|
||||||
|
"PropertyName": 0,
|
||||||
|
"ReturnStatement": -1,
|
||||||
|
"SwitchCaseColon": ">=1",
|
||||||
|
"SwitchClosingBrace": ">=1",
|
||||||
|
"SwitchOpeningBrace": ">=1",
|
||||||
|
"ThisExpression": 0,
|
||||||
|
"ThrowStatement": ">=1",
|
||||||
|
"TryClosingBrace": 0,
|
||||||
|
"TryKeyword": -1,
|
||||||
|
"TryOpeningBrace": ">=1",
|
||||||
|
"VariableDeclaration": ">=1",
|
||||||
|
"VariableDeclarationSemiColon": ">=1",
|
||||||
|
"VariableValue": -1,
|
||||||
|
"WhileStatement": ">=1",
|
||||||
|
"WhileStatementClosingBrace": ">=1",
|
||||||
|
"WhileStatementOpeningBrace": ">=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"whiteSpace": {
|
||||||
|
"value": " ",
|
||||||
|
"removeTrailing": 1,
|
||||||
|
"before": {
|
||||||
|
"ArgumentComma": 0,
|
||||||
|
"ArgumentList": 0,
|
||||||
|
"ArgumentListArrayExpression": 0,
|
||||||
|
"ArgumentListFunctionExpression": 1,
|
||||||
|
"ArgumentListObjectExpression": 0,
|
||||||
|
"ArrayExpressionClosing": 0,
|
||||||
|
"ArrayExpressionComma": 0,
|
||||||
|
"ArrayExpressionOpening": 1,
|
||||||
|
"AssignmentOperator": 1,
|
||||||
|
"BinaryExpression": 0,
|
||||||
|
"BinaryExpressionOperator": 1,
|
||||||
|
"BlockComment": 1,
|
||||||
|
"CallExpression": 1,
|
||||||
|
"CatchClosingBrace": 1,
|
||||||
|
"CatchKeyword": 1,
|
||||||
|
"CatchOpeningBrace": 1,
|
||||||
|
"CatchParameterList": 0,
|
||||||
|
"CommaOperator": 0,
|
||||||
|
"ConditionalExpressionAlternate": 1,
|
||||||
|
"ConditionalExpressionConsequent": 1,
|
||||||
|
"DoWhileStatementClosingBrace": 1,
|
||||||
|
"DoWhileStatementConditional": 1,
|
||||||
|
"DoWhileStatementOpeningBrace": 1,
|
||||||
|
"ElseIfStatementClosingBrace": 1,
|
||||||
|
"ElseIfStatementOpeningBrace": 1,
|
||||||
|
"ElseStatementClosingBrace": 1,
|
||||||
|
"ElseStatementOpeningBrace": 1,
|
||||||
|
"EmptyStatement": 0,
|
||||||
|
"ExpressionClosingParentheses": 0,
|
||||||
|
"FinallyClosingBrace": 1,
|
||||||
|
"FinallyKeyword": -1,
|
||||||
|
"FinallyOpeningBrace": 1,
|
||||||
|
"ForInStatement": 1,
|
||||||
|
"ForInStatementClosingBrace": 1,
|
||||||
|
"ForInStatementExpressionClosing": 0,
|
||||||
|
"ForInStatementExpressionOpening": 1,
|
||||||
|
"ForInStatementOpeningBrace": 1,
|
||||||
|
"ForStatement": 1,
|
||||||
|
"ForStatementClosingBrace": 1,
|
||||||
|
"ForStatementExpressionClosing": 0,
|
||||||
|
"ForStatementExpressionOpening": 1,
|
||||||
|
"ForStatementOpeningBrace": 1,
|
||||||
|
"ForStatementSemicolon": 0,
|
||||||
|
"FunctionDeclarationClosingBrace": 1,
|
||||||
|
"FunctionDeclarationOpeningBrace": 1,
|
||||||
|
"FunctionExpressionClosingBrace": 1,
|
||||||
|
"FunctionExpressionOpeningBrace": 1,
|
||||||
|
"IfStatementClosingBrace": 1,
|
||||||
|
"IfStatementConditionalClosing": 0,
|
||||||
|
"IfStatementConditionalOpening": 1,
|
||||||
|
"IfStatementOpeningBrace": 1,
|
||||||
|
"LineComment": 1,
|
||||||
|
"LogicalExpressionOperator": 1,
|
||||||
|
"MemberExpressionClosing": 0,
|
||||||
|
"ObjectExpressionClosingBrace": 1,
|
||||||
|
"ParameterComma": 0,
|
||||||
|
"ParameterList": 0,
|
||||||
|
"Property": 1,
|
||||||
|
"PropertyName": 1,
|
||||||
|
"PropertyValue": 1,
|
||||||
|
"SwitchDiscriminantClosing": 0,
|
||||||
|
"SwitchDiscriminantOpening": 1,
|
||||||
|
"ThrowKeyword": 1,
|
||||||
|
"TryClosingBrace": 1,
|
||||||
|
"TryKeyword": -1,
|
||||||
|
"TryOpeningBrace": 1,
|
||||||
|
"UnaryExpressionOperator": 0,
|
||||||
|
"VariableName": 1,
|
||||||
|
"VariableValue": 1,
|
||||||
|
"WhileStatementClosingBrace": 1,
|
||||||
|
"WhileStatementConditionalClosing": 0,
|
||||||
|
"WhileStatementConditionalOpening": 1,
|
||||||
|
"WhileStatementOpeningBrace": 1
|
||||||
|
},
|
||||||
|
"after": {
|
||||||
|
"ArgumentComma": 1,
|
||||||
|
"ArgumentList": 0,
|
||||||
|
"ArgumentListArrayExpression": 1,
|
||||||
|
"ArgumentListFunctionExpression": 1,
|
||||||
|
"ArgumentListObjectExpression": 0,
|
||||||
|
"ArrayExpressionClosing": 0,
|
||||||
|
"ArrayExpressionComma": 1,
|
||||||
|
"ArrayExpressionOpening": 0,
|
||||||
|
"AssignmentOperator": 1,
|
||||||
|
"BinaryExpression": 0,
|
||||||
|
"BinaryExpressionOperator": 1,
|
||||||
|
"BlockComment": 1,
|
||||||
|
"CallExpression": 0,
|
||||||
|
"CatchClosingBrace": 1,
|
||||||
|
"CatchKeyword": 1,
|
||||||
|
"CatchOpeningBrace": 1,
|
||||||
|
"CatchParameterList": 0,
|
||||||
|
"CommaOperator": 1,
|
||||||
|
"ConditionalExpressionConsequent": 1,
|
||||||
|
"ConditionalExpressionTest": 1,
|
||||||
|
"DoWhileStatementBody": 1,
|
||||||
|
"DoWhileStatementClosingBrace": 1,
|
||||||
|
"DoWhileStatementOpeningBrace": 1,
|
||||||
|
"ElseIfStatementClosingBrace": 1,
|
||||||
|
"ElseIfStatementOpeningBrace": 1,
|
||||||
|
"ElseStatementClosingBrace": 1,
|
||||||
|
"ElseStatementOpeningBrace": 1,
|
||||||
|
"EmptyStatement": 0,
|
||||||
|
"ExpressionOpeningParentheses": 0,
|
||||||
|
"FinallyClosingBrace": 1,
|
||||||
|
"FinallyKeyword": -1,
|
||||||
|
"FinallyOpeningBrace": 1,
|
||||||
|
"ForInStatement": 1,
|
||||||
|
"ForInStatementClosingBrace": 1,
|
||||||
|
"ForInStatementExpressionClosing": 1,
|
||||||
|
"ForInStatementExpressionOpening": 0,
|
||||||
|
"ForInStatementOpeningBrace": 1,
|
||||||
|
"ForStatement": 1,
|
||||||
|
"ForStatementClosingBrace": 1,
|
||||||
|
"ForStatementExpressionClosing": 1,
|
||||||
|
"ForStatementExpressionOpening": 0,
|
||||||
|
"ForStatementOpeningBrace": 1,
|
||||||
|
"ForStatementSemicolon": 1,
|
||||||
|
"FunctionDeclarationClosingBrace": 0,
|
||||||
|
"FunctionDeclarationOpeningBrace": 0,
|
||||||
|
"FunctionExpressionClosingBrace": 0,
|
||||||
|
"FunctionExpressionOpeningBrace": 0,
|
||||||
|
"FunctionName": 0,
|
||||||
|
"FunctionReservedWord": 0,
|
||||||
|
"IfStatementClosingBrace": 1,
|
||||||
|
"IfStatementConditionalClosing": 0,
|
||||||
|
"IfStatementConditionalOpening": 0,
|
||||||
|
"IfStatementOpeningBrace": 1,
|
||||||
|
"LogicalExpressionOperator": 1,
|
||||||
|
"MemberExpressionOpening": 0,
|
||||||
|
"ObjectExpressionClosingBrace": 0,
|
||||||
|
"ObjectExpressionOpeningBrace": 1,
|
||||||
|
"ParameterComma": 1,
|
||||||
|
"ParameterList": 0,
|
||||||
|
"PropertyName": 0,
|
||||||
|
"PropertyValue": 0,
|
||||||
|
"SwitchDiscriminantClosing": 1,
|
||||||
|
"SwitchDiscriminantOpening": 0,
|
||||||
|
"ThrowKeyword": 1,
|
||||||
|
"TryClosingBrace": 1,
|
||||||
|
"TryKeyword": -1,
|
||||||
|
"TryOpeningBrace": 1,
|
||||||
|
"UnaryExpressionOperator": 0,
|
||||||
|
"VariableName": 1,
|
||||||
|
"WhileStatementClosingBrace": 1,
|
||||||
|
"WhileStatementConditionalClosing": 1,
|
||||||
|
"WhileStatementConditionalOpening": 0,
|
||||||
|
"WhileStatementOpeningBrace": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
**/JsLibraries/**
|
||||||
@@ -0,0 +1,293 @@
|
|||||||
|
{
|
||||||
|
"parser": "babel-eslint",
|
||||||
|
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"commonjs": true,
|
||||||
|
"node": true,
|
||||||
|
"es6": true
|
||||||
|
},
|
||||||
|
|
||||||
|
"globals": {
|
||||||
|
"expect": false,
|
||||||
|
"chai": false,
|
||||||
|
"sinon": false
|
||||||
|
},
|
||||||
|
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 6,
|
||||||
|
"sourceType": "module",
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"modules": true,
|
||||||
|
"impliedStrict": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"plugins": [
|
||||||
|
"filenames",
|
||||||
|
"react"
|
||||||
|
],
|
||||||
|
|
||||||
|
"settings": {
|
||||||
|
"react": {
|
||||||
|
"version": "detect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"rules": {
|
||||||
|
"filenames/match-exported": ["error"],
|
||||||
|
|
||||||
|
# ECMAScript 6
|
||||||
|
|
||||||
|
"arrow-body-style": [0],
|
||||||
|
"arrow-parens": ["error", "always"],
|
||||||
|
"arrow-spacing": ["error", { "before": true, "after": true }],
|
||||||
|
"constructor-super": "error",
|
||||||
|
"generator-star-spacing": "off",
|
||||||
|
"no-class-assign": "error",
|
||||||
|
"no-confusing-arrow": "error",
|
||||||
|
"no-const-assign": "error",
|
||||||
|
"no-dupe-class-members": "error",
|
||||||
|
"no-duplicate-imports": "error",
|
||||||
|
"no-new-symbol": "error",
|
||||||
|
"no-this-before-super": "error",
|
||||||
|
"no-useless-escape": "error",
|
||||||
|
"no-useless-computed-key": "error",
|
||||||
|
"no-useless-constructor": "error",
|
||||||
|
"no-var": "warn",
|
||||||
|
"object-shorthand": ["error", "properties"],
|
||||||
|
"prefer-arrow-callback": "error",
|
||||||
|
"prefer-const": "warn",
|
||||||
|
"prefer-reflect": "off",
|
||||||
|
"prefer-rest-params": "off",
|
||||||
|
"prefer-spread": "warn",
|
||||||
|
"prefer-template": "error",
|
||||||
|
"require-yield": "off",
|
||||||
|
"template-curly-spacing": ["error", "never"],
|
||||||
|
"yield-star-spacing": "off",
|
||||||
|
|
||||||
|
# Possible Errors
|
||||||
|
|
||||||
|
"comma-dangle": "error",
|
||||||
|
"no-cond-assign": "error",
|
||||||
|
"no-console": "off",
|
||||||
|
"no-constant-condition": "warn",
|
||||||
|
"no-control-regex": "error",
|
||||||
|
"no-debugger": "off",
|
||||||
|
"no-dupe-args": "error",
|
||||||
|
"no-dupe-keys": "error",
|
||||||
|
"no-duplicate-case": "error",
|
||||||
|
"no-empty": "warn",
|
||||||
|
"no-empty-character-class": "error",
|
||||||
|
"no-ex-assign": "error",
|
||||||
|
"no-extra-boolean-cast": "error",
|
||||||
|
"no-extra-parens": ["error", "functions"],
|
||||||
|
"no-extra-semi": "error",
|
||||||
|
"no-func-assign": "error",
|
||||||
|
"no-inner-declarations": "error",
|
||||||
|
"no-invalid-regexp": "error",
|
||||||
|
"no-irregular-whitespace": "error",
|
||||||
|
"no-negated-in-lhs": "error",
|
||||||
|
"no-obj-calls": "error",
|
||||||
|
"no-regex-spaces": "error",
|
||||||
|
"no-sparse-arrays": "error",
|
||||||
|
"no-unexpected-multiline": "error",
|
||||||
|
"no-unreachable": "warn",
|
||||||
|
"no-unsafe-finally": "error",
|
||||||
|
"use-isnan": "error",
|
||||||
|
"valid-jsdoc": "off",
|
||||||
|
"valid-typeof": "error",
|
||||||
|
|
||||||
|
# Best Practices
|
||||||
|
|
||||||
|
"accessor-pairs": "off",
|
||||||
|
"array-callback-return": "warn",
|
||||||
|
"block-scoped-var": "warn",
|
||||||
|
"consistent-return": "off",
|
||||||
|
"curly": "error",
|
||||||
|
"default-case": "error",
|
||||||
|
"dot-location": ["error", "property"],
|
||||||
|
"dot-notation": "error",
|
||||||
|
"eqeqeq": ["error", "smart"],
|
||||||
|
"guard-for-in": "error",
|
||||||
|
"no-alert": "warn",
|
||||||
|
"no-caller": "error",
|
||||||
|
"no-case-declarations": "error",
|
||||||
|
"no-div-regex": "error",
|
||||||
|
"no-else-return": "error",
|
||||||
|
"no-empty-function": ["error", {"allow": ["arrowFunctions"]}],
|
||||||
|
"no-empty-pattern": "error",
|
||||||
|
"no-eval": "error",
|
||||||
|
"no-extend-native": "error",
|
||||||
|
"no-extra-bind": "error",
|
||||||
|
"no-fallthrough": "error",
|
||||||
|
"no-floating-decimal": "error",
|
||||||
|
"no-implicit-coercion": ["error", {
|
||||||
|
"boolean": false,
|
||||||
|
"number": true,
|
||||||
|
"string": true,
|
||||||
|
"allow": [/* "!!", "~", "*", "+" */]
|
||||||
|
}],
|
||||||
|
"no-implicit-globals": "error",
|
||||||
|
"no-implied-eval": "error",
|
||||||
|
"no-invalid-this": "off",
|
||||||
|
"no-iterator": "error",
|
||||||
|
"no-labels": "error",
|
||||||
|
"no-lone-blocks": "error",
|
||||||
|
"no-loop-func": "error",
|
||||||
|
"no-magic-numbers": ["off", {"ignoreArrayIndexes": true, "ignore": [0, 1] }],
|
||||||
|
"no-multi-spaces": "error",
|
||||||
|
"no-multi-str": "error",
|
||||||
|
"no-native-reassign": ["error", {"exceptions": ["console"]}],
|
||||||
|
"no-new": "off",
|
||||||
|
"no-new-func": "error",
|
||||||
|
"no-new-wrappers": "error",
|
||||||
|
"no-octal": "error",
|
||||||
|
"no-octal-escape": "error",
|
||||||
|
"no-param-reassign": "off",
|
||||||
|
"no-process-env": "off",
|
||||||
|
"no-proto": "error",
|
||||||
|
"no-redeclare": "error",
|
||||||
|
"no-return-assign": "warn",
|
||||||
|
"no-script-url": "error",
|
||||||
|
"no-self-assign": "error",
|
||||||
|
"no-self-compare": "error",
|
||||||
|
"no-sequences": "error",
|
||||||
|
"no-throw-literal": "error",
|
||||||
|
"no-unmodified-loop-condition": "error",
|
||||||
|
"no-unused-expressions": "error",
|
||||||
|
"no-unused-labels": "error",
|
||||||
|
"no-useless-call": "error",
|
||||||
|
"no-useless-concat": "error",
|
||||||
|
"no-void": "error",
|
||||||
|
"no-warning-comments": "off",
|
||||||
|
"no-with": "error",
|
||||||
|
"radix": ["error", "as-needed"],
|
||||||
|
"vars-on-top": "off",
|
||||||
|
"wrap-iife": ["error", "inside"],
|
||||||
|
"yoda": "error",
|
||||||
|
|
||||||
|
# Strict Mode
|
||||||
|
|
||||||
|
"strict": ["error", "never"],
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
|
||||||
|
"init-declarations": ["error", "always"],
|
||||||
|
"no-catch-shadow": "error",
|
||||||
|
"no-delete-var": "error",
|
||||||
|
"no-label-var": "error",
|
||||||
|
"no-restricted-globals": "off",
|
||||||
|
"no-shadow": "error",
|
||||||
|
"no-shadow-restricted-names": "error",
|
||||||
|
"no-undef": "error",
|
||||||
|
"no-undef-init": "off",
|
||||||
|
"no-undefined": "off",
|
||||||
|
"no-unused-vars": ["error", { "args": "none", "ignoreRestSiblings": true }],
|
||||||
|
"no-use-before-define": "error",
|
||||||
|
|
||||||
|
# Node.js and CommonJS
|
||||||
|
|
||||||
|
"callback-return": "warn",
|
||||||
|
"global-require": "error",
|
||||||
|
"handle-callback-err": "warn",
|
||||||
|
"no-mixed-requires": "error",
|
||||||
|
"no-new-require": "error",
|
||||||
|
"no-path-concat": "error",
|
||||||
|
"no-process-exit": "error",
|
||||||
|
|
||||||
|
# Stylistic Issues
|
||||||
|
|
||||||
|
"array-bracket-spacing": ["error", "never"],
|
||||||
|
"block-spacing": ["error", "always"],
|
||||||
|
"brace-style": ["error", "1tbs", { "allowSingleLine": false }],
|
||||||
|
"camelcase": "off",
|
||||||
|
"comma-spacing": ["error", {"before": false, "after": true}],
|
||||||
|
"comma-style": ["error", "last"],
|
||||||
|
"computed-property-spacing": ["error", "never"],
|
||||||
|
"consistent-this": ["error", "self"],
|
||||||
|
"eol-last": "error",
|
||||||
|
"func-names": "off",
|
||||||
|
"func-style": ["error", "declaration"],
|
||||||
|
"indent": ["error", 2, {"SwitchCase": 1}],
|
||||||
|
"key-spacing": ["error", {"beforeColon": false, "afterColon": true}],
|
||||||
|
"keyword-spacing": ["error", { "before": true, "after": true}],
|
||||||
|
"lines-around-comment": ["error", { "beforeBlockComment": true, "afterBlockComment": false }],
|
||||||
|
"max-depth": ["error", {"maximum": 5}],
|
||||||
|
"max-nested-callbacks": ["error", 4],
|
||||||
|
"max-statements": "off",
|
||||||
|
"max-statements-per-line": ["error", { "max": 1 }],
|
||||||
|
"new-cap": ["error", {"capIsNewExceptions": ["$.Deferred", "DragDropContext", "DragLayer", "DragSource", "DropTarget"]}],
|
||||||
|
"new-parens": "error",
|
||||||
|
"newline-after-var": "off",
|
||||||
|
"newline-before-return": "off",
|
||||||
|
"newline-per-chained-call": "off",
|
||||||
|
"no-array-constructor": "error",
|
||||||
|
"no-bitwise": "error",
|
||||||
|
"no-continue": "error",
|
||||||
|
"no-inline-comments": "off",
|
||||||
|
"no-lonely-if": "warn",
|
||||||
|
"no-mixed-spaces-and-tabs": "error",
|
||||||
|
"no-multiple-empty-lines": ["error", { "max": 1 }],
|
||||||
|
"no-negated-condition": "warn",
|
||||||
|
"no-nested-ternary": "error",
|
||||||
|
"no-new-object": "error",
|
||||||
|
"no-plusplus": "off",
|
||||||
|
"no-restricted-syntax": "off",
|
||||||
|
"no-spaced-func": "error",
|
||||||
|
"no-ternary": "off",
|
||||||
|
"no-trailing-spaces": "error",
|
||||||
|
"no-underscore-dangle": ["error", { "allowAfterThis": true }],
|
||||||
|
"no-unneeded-ternary": "error",
|
||||||
|
"no-whitespace-before-property": "error",
|
||||||
|
"object-curly-spacing": ["error", "always"],
|
||||||
|
"one-var": ["error", "never"],
|
||||||
|
"one-var-declaration-per-line": ["error", "always"],
|
||||||
|
"operator-assignment": ["off", "never"],
|
||||||
|
"operator-linebreak": ["error", "after"],
|
||||||
|
"quote-props": ["error", "as-needed"],
|
||||||
|
"quotes": ["error", "single"],
|
||||||
|
"require-jsdoc": "off",
|
||||||
|
"semi": "error",
|
||||||
|
"semi-spacing": ["error", { "before": false, "after": true }],
|
||||||
|
"sort-vars": "off",
|
||||||
|
"space-before-blocks": ["error", "always"],
|
||||||
|
"space-before-function-paren": ["error", "never"],
|
||||||
|
"space-in-parens": "off",
|
||||||
|
"space-infix-ops": "off",
|
||||||
|
"space-unary-ops": "off",
|
||||||
|
"spaced-comment": "error",
|
||||||
|
"wrap-regex": "error",
|
||||||
|
|
||||||
|
# React
|
||||||
|
|
||||||
|
"react/jsx-boolean-value": [2, "always"],
|
||||||
|
"react/jsx-uses-vars": 2,
|
||||||
|
"react/jsx-closing-bracket-location": 2,
|
||||||
|
"react/jsx-tag-spacing": ["error"],
|
||||||
|
"react/jsx-curly-spacing": [2, "never"],
|
||||||
|
"react/jsx-equals-spacing": [2, "never"],
|
||||||
|
"react/jsx-indent-props": [2, 2],
|
||||||
|
"react/jsx-indent": [2, 2],
|
||||||
|
"react/jsx-key": 2,
|
||||||
|
"react/jsx-no-bind": [2, { "allowArrowFunctions": true }],
|
||||||
|
"react/jsx-no-duplicate-props": [2, { "ignoreCase": true }],
|
||||||
|
"react/jsx-max-props-per-line": [2, { "maximum": 2 }],
|
||||||
|
"react/jsx-handler-names": [2, { "eventHandlerPrefix": "(on|dispatch)", "eventHandlerPropPrefix": "on" }],
|
||||||
|
"react/jsx-no-undef": 2,
|
||||||
|
"react/jsx-pascal-case": 2,
|
||||||
|
"react/jsx-uses-react": 2,
|
||||||
|
// Explicitly disabled in case we want to enable them again
|
||||||
|
"react/no-did-mount-set-state": 0,
|
||||||
|
"react/no-did-update-set-state": 0,
|
||||||
|
"react/no-direct-mutation-state": 2,
|
||||||
|
"react/no-multi-comp": [2, { "ignoreStateless": true }],
|
||||||
|
"react/no-unknown-property": 2,
|
||||||
|
"react/prefer-es6-class": 2,
|
||||||
|
"react/prop-types": 2,
|
||||||
|
"react/react-in-jsx-scope": 2,
|
||||||
|
"react/self-closing-comp": 2,
|
||||||
|
"react/sort-comp": 2,
|
||||||
|
"react/jsx-wrap-multilines": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"js": {
|
||||||
|
"indent_size": 2,
|
||||||
|
"indent_char": " ",
|
||||||
|
"indent_level": 2,
|
||||||
|
"indent_with_tabs": false,
|
||||||
|
"preserve_newlines": true,
|
||||||
|
"brace_style": "collapse",
|
||||||
|
"max_preserve_newlines": 2,
|
||||||
|
"jslint_happy": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,396 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
"stylelint-order"
|
||||||
|
],
|
||||||
|
"ignoreFiles": [
|
||||||
|
"frontend/src/Styles/scaffolding.css",
|
||||||
|
"**/*.js"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"at-rule-empty-line-before": [
|
||||||
|
"always",
|
||||||
|
{
|
||||||
|
"except": [
|
||||||
|
"inside-block"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"at-rule-name-case": "lower",
|
||||||
|
"at-rule-name-newline-after": "always-multi-line",
|
||||||
|
"at-rule-name-space-after": "always",
|
||||||
|
"at-rule-no-unknown": [
|
||||||
|
true,
|
||||||
|
{
|
||||||
|
"ignoreAtRules": [
|
||||||
|
"/^add\\-mixin$/",
|
||||||
|
"/^define\\-mixin$/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"at-rule-no-vendor-prefix": true,
|
||||||
|
"at-rule-semicolon-newline-after": "always",
|
||||||
|
"at-rule-semicolon-space-before": "never",
|
||||||
|
"block-closing-brace-empty-line-before": "never",
|
||||||
|
"block-closing-brace-newline-after": "always",
|
||||||
|
"block-closing-brace-newline-before": "always",
|
||||||
|
"block-closing-brace-space-after": "always-single-line",
|
||||||
|
"block-closing-brace-space-before": "always-single-line",
|
||||||
|
"block-no-empty": true,
|
||||||
|
"block-opening-brace-newline-after": "always",
|
||||||
|
"block-opening-brace-newline-before": "never-single-line",
|
||||||
|
"block-opening-brace-space-after": "always-single-line",
|
||||||
|
"block-opening-brace-space-before": "always",
|
||||||
|
"color-hex-case": "lower",
|
||||||
|
"color-hex-length": "short",
|
||||||
|
"color-named": "never",
|
||||||
|
"color-no-invalid-hex": true,
|
||||||
|
"comment-whitespace-inside": "always",
|
||||||
|
"declaration-bang-space-after": "never",
|
||||||
|
"declaration-bang-space-before": "always",
|
||||||
|
"declaration-block-no-duplicate-properties": [
|
||||||
|
true,
|
||||||
|
{
|
||||||
|
"ignoreProperties": [
|
||||||
|
"composes"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"declaration-block-no-redundant-longhand-properties": true,
|
||||||
|
"declaration-block-no-shorthand-property-overrides": true,
|
||||||
|
"declaration-block-semicolon-newline-after": "always",
|
||||||
|
"declaration-block-semicolon-newline-before": "never-multi-line",
|
||||||
|
"declaration-block-semicolon-space-before": "never",
|
||||||
|
"declaration-block-single-line-max-declarations": 1,
|
||||||
|
"declaration-block-trailing-semicolon": "always",
|
||||||
|
"declaration-colon-space-after": "always",
|
||||||
|
"declaration-colon-space-before": "never",
|
||||||
|
"font-family-name-quotes": "always-unless-keyword",
|
||||||
|
"function-calc-no-unspaced-operator": true,
|
||||||
|
"function-comma-newline-after": "never-multi-line",
|
||||||
|
"function-comma-newline-before": "never-multi-line",
|
||||||
|
"function-comma-space-after": "always",
|
||||||
|
"function-comma-space-before": "never",
|
||||||
|
"function-linear-gradient-no-nonstandard-direction": true,
|
||||||
|
"function-name-case": "lower",
|
||||||
|
"function-parentheses-newline-inside": "never-multi-line",
|
||||||
|
"function-parentheses-space-inside": "never",
|
||||||
|
"function-url-quotes": "always",
|
||||||
|
"function-url-scheme-blacklist": [
|
||||||
|
"data"
|
||||||
|
],
|
||||||
|
"function-whitespace-after": "always",
|
||||||
|
"indentation": 2,
|
||||||
|
"keyframe-declaration-no-important": true,
|
||||||
|
"length-zero-no-unit": true,
|
||||||
|
"max-empty-lines": 1,
|
||||||
|
"max-line-length": [
|
||||||
|
100,
|
||||||
|
{
|
||||||
|
"ignore": [
|
||||||
|
"non-comments"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"max-nesting-depth": 2,
|
||||||
|
"media-feature-colon-space-after": "always",
|
||||||
|
"media-feature-colon-space-before": "never",
|
||||||
|
"media-feature-name-case": "lower",
|
||||||
|
"media-feature-name-no-vendor-prefix": true,
|
||||||
|
"media-feature-range-operator-space-after": "always",
|
||||||
|
"media-feature-range-operator-space-before": "always",
|
||||||
|
"no-empty-source": true,
|
||||||
|
"no-eol-whitespace": true,
|
||||||
|
"no-extra-semicolons": true,
|
||||||
|
"no-invalid-double-slash-comments": true,
|
||||||
|
"no-missing-end-of-source-newline": true,
|
||||||
|
"number-leading-zero": "always",
|
||||||
|
"number-no-trailing-zeros": true,
|
||||||
|
"order/order": [
|
||||||
|
"custom-properties",
|
||||||
|
"dollar-variables",
|
||||||
|
{
|
||||||
|
"hasBlock": false,
|
||||||
|
"name": "add-mixin",
|
||||||
|
"type": "at-rule"
|
||||||
|
},
|
||||||
|
"declarations",
|
||||||
|
"rules",
|
||||||
|
"at-rules"
|
||||||
|
],
|
||||||
|
"order/properties-order": [
|
||||||
|
{
|
||||||
|
"emptyLineBefore": "always",
|
||||||
|
"properties": [
|
||||||
|
"composes"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"emptyLineBefore": "always",
|
||||||
|
"properties": [
|
||||||
|
"position",
|
||||||
|
"top",
|
||||||
|
"right",
|
||||||
|
"bottom",
|
||||||
|
"left",
|
||||||
|
"z-index",
|
||||||
|
"display",
|
||||||
|
"visibility",
|
||||||
|
"align-content",
|
||||||
|
"align-items",
|
||||||
|
"align-self",
|
||||||
|
"justify-content",
|
||||||
|
"flex",
|
||||||
|
"flex-direction",
|
||||||
|
"flex-order",
|
||||||
|
"flex-pack",
|
||||||
|
"flex-align",
|
||||||
|
"flex-grow",
|
||||||
|
"flex-shrink",
|
||||||
|
"flex-basis",
|
||||||
|
"flex-wrap",
|
||||||
|
"flex-flow",
|
||||||
|
"float",
|
||||||
|
"clear",
|
||||||
|
"overflow",
|
||||||
|
"overflow-x",
|
||||||
|
"overflow-y",
|
||||||
|
"-webkit-overflow-scrolling",
|
||||||
|
"clip",
|
||||||
|
"box-sizing",
|
||||||
|
"margin",
|
||||||
|
"margin-top",
|
||||||
|
"margin-right",
|
||||||
|
"margin-bottom",
|
||||||
|
"margin-left",
|
||||||
|
"padding",
|
||||||
|
"padding-top",
|
||||||
|
"padding-right",
|
||||||
|
"padding-bottom",
|
||||||
|
"padding-left",
|
||||||
|
"min-width",
|
||||||
|
"min-height",
|
||||||
|
"max-width",
|
||||||
|
"max-height",
|
||||||
|
"width",
|
||||||
|
"height",
|
||||||
|
"outline",
|
||||||
|
"outline-width",
|
||||||
|
"outline-style",
|
||||||
|
"outline-color",
|
||||||
|
"outline-offset",
|
||||||
|
"border",
|
||||||
|
"border-spacing",
|
||||||
|
"border-collapse",
|
||||||
|
"border-width",
|
||||||
|
"border-style",
|
||||||
|
"border-color",
|
||||||
|
"border-top",
|
||||||
|
"border-top-width",
|
||||||
|
"border-top-style",
|
||||||
|
"border-top-color",
|
||||||
|
"border-right",
|
||||||
|
"border-right-width",
|
||||||
|
"border-right-style",
|
||||||
|
"border-right-color",
|
||||||
|
"border-bottom",
|
||||||
|
"border-bottom-width",
|
||||||
|
"border-bottom-style",
|
||||||
|
"border-bottom-color",
|
||||||
|
"border-left",
|
||||||
|
"border-left-width",
|
||||||
|
"border-left-style",
|
||||||
|
"border-left-color",
|
||||||
|
"border-radius",
|
||||||
|
"border-top-left-radius",
|
||||||
|
"border-top-right-radius",
|
||||||
|
"border-bottom-right-radius",
|
||||||
|
"border-bottom-left-radius",
|
||||||
|
"border-image",
|
||||||
|
"border-image-source",
|
||||||
|
"border-image-slice",
|
||||||
|
"border-image-width",
|
||||||
|
"border-image-outset",
|
||||||
|
"border-image-repeat",
|
||||||
|
"border-top-image",
|
||||||
|
"border-right-image",
|
||||||
|
"border-bottom-image",
|
||||||
|
"border-left-image",
|
||||||
|
"border-corner-image",
|
||||||
|
"border-top-left-image",
|
||||||
|
"border-top-right-image",
|
||||||
|
"border-bottom-right-image",
|
||||||
|
"border-bottom-left-image",
|
||||||
|
"background",
|
||||||
|
"background-color",
|
||||||
|
"background-image",
|
||||||
|
"background-attachment",
|
||||||
|
"background-position",
|
||||||
|
"background-position-x",
|
||||||
|
"background-position-y",
|
||||||
|
"background-clip",
|
||||||
|
"background-origin",
|
||||||
|
"background-size",
|
||||||
|
"background-repeat",
|
||||||
|
"box-decoration-break",
|
||||||
|
"box-shadow",
|
||||||
|
"color",
|
||||||
|
"table-layout",
|
||||||
|
"caption-side",
|
||||||
|
"empty-cells",
|
||||||
|
"list-style",
|
||||||
|
"list-style-position",
|
||||||
|
"list-style-type",
|
||||||
|
"list-style-image",
|
||||||
|
"quotes",
|
||||||
|
"content",
|
||||||
|
"counter-increment",
|
||||||
|
"counter-reset",
|
||||||
|
"-ms-writing-mode",
|
||||||
|
"vertical-align",
|
||||||
|
"text-align",
|
||||||
|
"text-align-last",
|
||||||
|
"text-decoration",
|
||||||
|
"text-emphasis",
|
||||||
|
"text-emphasis-position",
|
||||||
|
"text-emphasis-style",
|
||||||
|
"text-emphasis-color",
|
||||||
|
"text-indent",
|
||||||
|
"text-justify",
|
||||||
|
"text-outline",
|
||||||
|
"text-transform",
|
||||||
|
"text-wrap",
|
||||||
|
"text-overflow",
|
||||||
|
"text-overflow-ellipsis",
|
||||||
|
"text-overflow-mode",
|
||||||
|
"text-shadow",
|
||||||
|
"white-space",
|
||||||
|
"word-spacing",
|
||||||
|
"word-wrap",
|
||||||
|
"word-break",
|
||||||
|
"tab-size",
|
||||||
|
"hyphens",
|
||||||
|
"letter-spacing",
|
||||||
|
"font",
|
||||||
|
"font-weight",
|
||||||
|
"font-style",
|
||||||
|
"font-variant",
|
||||||
|
"font-size-adjust",
|
||||||
|
"font-stretch",
|
||||||
|
"font-size",
|
||||||
|
"font-family",
|
||||||
|
"font-smoothing",
|
||||||
|
"-moz-osx-font-smoothing",
|
||||||
|
"-webkit-font-smoothing",
|
||||||
|
"src",
|
||||||
|
"line-height",
|
||||||
|
"opacity",
|
||||||
|
"filter",
|
||||||
|
"resize",
|
||||||
|
"cursor",
|
||||||
|
"appearance",
|
||||||
|
"nav-index",
|
||||||
|
"nav-up",
|
||||||
|
"nav-right",
|
||||||
|
"nav-down",
|
||||||
|
"nav-left",
|
||||||
|
"transition",
|
||||||
|
"transition-delay",
|
||||||
|
"transition-timing-function",
|
||||||
|
"transition-duration",
|
||||||
|
"transition-property",
|
||||||
|
"transform",
|
||||||
|
"transform-origin",
|
||||||
|
"transform-style",
|
||||||
|
"backface-visibility",
|
||||||
|
"animation",
|
||||||
|
"animation-name",
|
||||||
|
"animation-duration",
|
||||||
|
"animation-play-state",
|
||||||
|
"animation-timing-function",
|
||||||
|
"animation-delay",
|
||||||
|
"animation-iteration-count",
|
||||||
|
"animation-direction",
|
||||||
|
"animation-fill-mode",
|
||||||
|
"pointer-events",
|
||||||
|
"user-select",
|
||||||
|
"touch-action",
|
||||||
|
"-webkit-tap-highlight-color",
|
||||||
|
"unicode-bidi",
|
||||||
|
"direction",
|
||||||
|
"columns",
|
||||||
|
"column-span",
|
||||||
|
"column-width",
|
||||||
|
"column-count",
|
||||||
|
"column-fill",
|
||||||
|
"column-gap",
|
||||||
|
"column-rule",
|
||||||
|
"column-rule-width",
|
||||||
|
"column-rule-style",
|
||||||
|
"column-rule-color",
|
||||||
|
"break-before",
|
||||||
|
"break-inside",
|
||||||
|
"break-after",
|
||||||
|
"page-break-before",
|
||||||
|
"page-break-inside",
|
||||||
|
"page-break-after",
|
||||||
|
"orphans",
|
||||||
|
"widows",
|
||||||
|
"zoom",
|
||||||
|
"max-zoom",
|
||||||
|
"min-zoom",
|
||||||
|
"user-zoom",
|
||||||
|
"orientation"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"property-case": "lower",
|
||||||
|
"property-no-vendor-prefix": true,
|
||||||
|
"rule-empty-line-before": [
|
||||||
|
"always",
|
||||||
|
{
|
||||||
|
"except": [
|
||||||
|
"first-nested"
|
||||||
|
],
|
||||||
|
"ignore": [
|
||||||
|
"after-comment"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"selector-attribute-brackets-space-inside": "never",
|
||||||
|
"selector-attribute-operator-space-after": "never",
|
||||||
|
"selector-attribute-operator-space-before": "never",
|
||||||
|
"selector-attribute-quotes": "never",
|
||||||
|
"selector-class-pattern": "^[A-Za-z0-9]+$",
|
||||||
|
"selector-combinator-space-after": "always",
|
||||||
|
"selector-combinator-space-before": "always",
|
||||||
|
"selector-descendant-combinator-no-non-space": true,
|
||||||
|
"selector-list-comma-newline-after": "always",
|
||||||
|
"selector-list-comma-newline-before": "never-multi-line",
|
||||||
|
"selector-list-comma-space-before": "never",
|
||||||
|
"selector-max-attribute": 0,
|
||||||
|
"selector-max-class": 3,
|
||||||
|
"selector-max-compound-selectors": 3,
|
||||||
|
"selector-max-empty-lines": 0,
|
||||||
|
"selector-max-id": 0,
|
||||||
|
"selector-max-universal": 0,
|
||||||
|
"selector-pseudo-class-case": "lower",
|
||||||
|
"selector-pseudo-class-parentheses-space-inside": "never",
|
||||||
|
"selector-pseudo-element-case": "lower",
|
||||||
|
"selector-pseudo-element-colon-notation": "double",
|
||||||
|
"selector-pseudo-element-no-unknown": true,
|
||||||
|
"selector-type-case": "lower",
|
||||||
|
"selector-type-no-unknown": true,
|
||||||
|
"shorthand-property-no-redundant-values": true,
|
||||||
|
"string-no-newline": true,
|
||||||
|
"string-quotes": "single",
|
||||||
|
"time-min-milliseconds": 100,
|
||||||
|
"unit-case": "lower",
|
||||||
|
"unit-no-unknown": true,
|
||||||
|
"value-list-comma-newline-after": "never-multi-line",
|
||||||
|
"value-list-comma-newline-before": "never-multi-line",
|
||||||
|
"value-list-comma-space-after": "always",
|
||||||
|
"value-list-comma-space-before": "never",
|
||||||
|
"value-list-max-empty-lines": 0,
|
||||||
|
"value-no-vendor-prefix": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"ecmaVersion": 6,
|
||||||
|
"libs": [
|
||||||
|
"browser",
|
||||||
|
"jquery"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
const loose = true;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
plugins: [
|
||||||
|
// Stage 1
|
||||||
|
'@babel/plugin-proposal-export-default-from',
|
||||||
|
['@babel/plugin-proposal-optional-chaining', { loose }],
|
||||||
|
['@babel/plugin-proposal-nullish-coalescing-operator', { loose }],
|
||||||
|
|
||||||
|
// Stage 2
|
||||||
|
'@babel/plugin-proposal-export-namespace-from',
|
||||||
|
|
||||||
|
// Stage 3
|
||||||
|
['@babel/plugin-proposal-class-properties', { loose }],
|
||||||
|
'@babel/plugin-syntax-dynamic-import'
|
||||||
|
],
|
||||||
|
env: {
|
||||||
|
development: {
|
||||||
|
presets: [
|
||||||
|
['@babel/preset-react', { development: true }]
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'babel-plugin-inline-classnames'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
production: {
|
||||||
|
presets: [
|
||||||
|
'@babel/preset-react'
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'babel-plugin-transform-react-remove-prop-types'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
const gulp = require('gulp');
|
||||||
|
|
||||||
|
require('./clean');
|
||||||
|
require('./copy');
|
||||||
|
require('./webpack');
|
||||||
|
|
||||||
|
gulp.task('build',
|
||||||
|
gulp.series('clean',
|
||||||
|
gulp.parallel(
|
||||||
|
'webpack',
|
||||||
|
'copyHtml',
|
||||||
|
'copyFonts',
|
||||||
|
'copyImages',
|
||||||
|
'copyJs'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
const gulp = require('gulp');
|
||||||
|
const del = require('del');
|
||||||
|
|
||||||
|
const paths = require('./helpers/paths');
|
||||||
|
|
||||||
|
gulp.task('clean', () => {
|
||||||
|
return del([paths.dest.root]);
|
||||||
|
});
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const gulp = require('gulp');
|
||||||
|
const print = require('gulp-print').default;
|
||||||
|
const cache = require('gulp-cached');
|
||||||
|
const livereload = require('gulp-livereload');
|
||||||
|
const paths = require('./helpers/paths.js');
|
||||||
|
|
||||||
|
gulp.task('copyJs', () => {
|
||||||
|
return gulp.src(
|
||||||
|
[
|
||||||
|
path.join(paths.src.root, 'polyfills.js')
|
||||||
|
], { base: paths.src.root })
|
||||||
|
.pipe(cache('copyJs'))
|
||||||
|
.pipe(print())
|
||||||
|
.pipe(gulp.dest(paths.dest.root))
|
||||||
|
.pipe(livereload());
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('copyHtml', () => {
|
||||||
|
return gulp.src(paths.src.html, { base: paths.src.root })
|
||||||
|
.pipe(cache('copyHtml'))
|
||||||
|
.pipe(print())
|
||||||
|
.pipe(gulp.dest(paths.dest.root))
|
||||||
|
.pipe(livereload());
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('copyFonts', () => {
|
||||||
|
return gulp.src(
|
||||||
|
path.join(paths.src.fonts, '**', '*.*'), { base: paths.src.root }
|
||||||
|
)
|
||||||
|
.pipe(cache('copyFonts'))
|
||||||
|
.pipe(print())
|
||||||
|
.pipe(gulp.dest(paths.dest.root))
|
||||||
|
.pipe(livereload());
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('copyImages', () => {
|
||||||
|
return gulp.src(
|
||||||
|
path.join(paths.src.images, '**', '*.*'), { base: paths.src.root }
|
||||||
|
)
|
||||||
|
.pipe(cache('copyImages'))
|
||||||
|
.pipe(print())
|
||||||
|
.pipe(gulp.dest(paths.dest.root))
|
||||||
|
.pipe(livereload());
|
||||||
|
});
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
require('./build.js');
|
||||||
|
require('./clean.js');
|
||||||
|
require('./copy.js');
|
||||||
|
require('./watch.js');
|
||||||
|
require('./webpack.js');
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
const colors = require('ansi-colors');
|
||||||
|
|
||||||
|
module.exports = function errorHandler(error) {
|
||||||
|
console.log(colors.red(`Error (${error.plugin}): ${error.message}`));
|
||||||
|
this.emit('end');
|
||||||
|
};
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
const root = './frontend/src';
|
||||||
|
|
||||||
|
const paths = {
|
||||||
|
src: {
|
||||||
|
root,
|
||||||
|
html: `${root}/*.html`,
|
||||||
|
scripts: `${root}/**/*.js`,
|
||||||
|
content: `${root}/Content/`,
|
||||||
|
fonts: `${root}/Content/Fonts/`,
|
||||||
|
images: `${root}/Content/Images/`,
|
||||||
|
exclude: {
|
||||||
|
libs: `!${root}/JsLibraries/**`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dest: {
|
||||||
|
root: './_output/UI/',
|
||||||
|
content: './_output/UI/Content/',
|
||||||
|
fonts: './_output/UI/Content/Fonts/',
|
||||||
|
images: './_output/UI/Content/Images/'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = paths;
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
const gulp = require('gulp');
|
||||||
|
const livereload = require('gulp-livereload');
|
||||||
|
const gulpWatch = require('gulp-watch');
|
||||||
|
const paths = require('./helpers/paths.js');
|
||||||
|
|
||||||
|
require('./copy.js');
|
||||||
|
require('./webpack.js');
|
||||||
|
|
||||||
|
function watch() {
|
||||||
|
livereload.listen({ start: true });
|
||||||
|
|
||||||
|
gulp.task('webpackWatch')();
|
||||||
|
gulpWatch(paths.src.html, gulp.series('copyHtml'));
|
||||||
|
gulpWatch(`${paths.src.fonts}**/*.*`, gulp.series('copyFonts'));
|
||||||
|
gulpWatch(`${paths.src.images}**/*.*`, gulp.series('copyImages'));
|
||||||
|
}
|
||||||
|
|
||||||
|
gulp.task('watch', gulp.series('build', watch));
|
||||||
@@ -0,0 +1,230 @@
|
|||||||
|
const gulp = require('gulp');
|
||||||
|
const webpackStream = require('webpack-stream');
|
||||||
|
const livereload = require('gulp-livereload');
|
||||||
|
const path = require('path');
|
||||||
|
const webpack = require('webpack');
|
||||||
|
const errorHandler = require('./helpers/errorHandler');
|
||||||
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||||
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||||
|
|
||||||
|
const uiFolder = 'UI';
|
||||||
|
const frontendFolder = path.join(__dirname, '..');
|
||||||
|
const srcFolder = path.join(frontendFolder, 'src');
|
||||||
|
const isProduction = process.argv.indexOf('--production') > -1;
|
||||||
|
|
||||||
|
const distFolder = path.resolve(frontendFolder, '..', '_output', uiFolder);
|
||||||
|
|
||||||
|
console.log('Source Folder:', srcFolder);
|
||||||
|
console.log('Output Folder:', distFolder);
|
||||||
|
console.log('isProduction:', isProduction);
|
||||||
|
|
||||||
|
const cssVarsFiles = [
|
||||||
|
'../src/Styles/Variables/colors',
|
||||||
|
'../src/Styles/Variables/dimensions',
|
||||||
|
'../src/Styles/Variables/fonts',
|
||||||
|
'../src/Styles/Variables/animations',
|
||||||
|
'../src/Styles/Variables/zIndexes'
|
||||||
|
].map(require.resolve);
|
||||||
|
|
||||||
|
// Override the way HtmlWebpackPlugin injects the scripts
|
||||||
|
HtmlWebpackPlugin.prototype.injectAssetsIntoHtml = function(html, assets, assetTags) {
|
||||||
|
const head = assetTags.head.map((v) => {
|
||||||
|
v.attributes = { rel: 'stylesheet', type: 'text/css', href: `/${v.attributes.href.replace('\\', '/')}` };
|
||||||
|
return this.createHtmlTag(v);
|
||||||
|
});
|
||||||
|
const body = assetTags.body.map((v) => {
|
||||||
|
v.attributes = { src: `/${v.attributes.src}` };
|
||||||
|
return this.createHtmlTag(v);
|
||||||
|
});
|
||||||
|
|
||||||
|
return html
|
||||||
|
.replace('<!-- webpack bundles head -->', head.join('\r\n '))
|
||||||
|
.replace('<!-- webpack bundles body -->', body.join('\r\n '));
|
||||||
|
};
|
||||||
|
|
||||||
|
const plugins = [
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
__DEV__: !isProduction,
|
||||||
|
'process.env.NODE_ENV': isProduction ? JSON.stringify('production') : JSON.stringify('development')
|
||||||
|
}),
|
||||||
|
|
||||||
|
new MiniCssExtractPlugin({
|
||||||
|
filename: path.join('Content', 'styles.css')
|
||||||
|
}),
|
||||||
|
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
template: 'frontend/src/index.html',
|
||||||
|
filename: 'index.html'
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
mode: isProduction ? 'production' : 'development',
|
||||||
|
devtool: '#source-map',
|
||||||
|
|
||||||
|
stats: {
|
||||||
|
children: false
|
||||||
|
},
|
||||||
|
|
||||||
|
watchOptions: {
|
||||||
|
ignored: /node_modules/
|
||||||
|
},
|
||||||
|
|
||||||
|
entry: {
|
||||||
|
index: 'index.js'
|
||||||
|
},
|
||||||
|
|
||||||
|
resolve: {
|
||||||
|
modules: [
|
||||||
|
srcFolder,
|
||||||
|
path.join(srcFolder, 'Shims'),
|
||||||
|
'node_modules'
|
||||||
|
],
|
||||||
|
alias: {
|
||||||
|
jquery: 'jquery/src/jquery'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
output: {
|
||||||
|
path: distFolder,
|
||||||
|
filename: '[name].js',
|
||||||
|
sourceMapFilename: '[file].map'
|
||||||
|
},
|
||||||
|
|
||||||
|
optimization: {
|
||||||
|
chunkIds: 'named',
|
||||||
|
splitChunks: {
|
||||||
|
chunks: 'initial'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
performance: {
|
||||||
|
hints: false
|
||||||
|
},
|
||||||
|
|
||||||
|
plugins,
|
||||||
|
|
||||||
|
resolveLoader: {
|
||||||
|
modules: [
|
||||||
|
'node_modules',
|
||||||
|
'frontend/gulp/webpack/'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.js?$/,
|
||||||
|
exclude: /(node_modules|JsLibraries)/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'babel-loader',
|
||||||
|
options: {
|
||||||
|
configFile: `${frontendFolder}/babel.config.js`,
|
||||||
|
envName: isProduction ? 'production' : 'development',
|
||||||
|
presets: [
|
||||||
|
[
|
||||||
|
'@babel/preset-env',
|
||||||
|
{
|
||||||
|
modules: false,
|
||||||
|
loose: true,
|
||||||
|
debug: false,
|
||||||
|
useBuiltIns: 'entry',
|
||||||
|
corejs: 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// CSS Modules
|
||||||
|
{
|
||||||
|
test: /\.css$/,
|
||||||
|
exclude: /(node_modules|globals.css)/,
|
||||||
|
use: [
|
||||||
|
{ loader: MiniCssExtractPlugin.loader },
|
||||||
|
{
|
||||||
|
loader: 'css-loader',
|
||||||
|
options: {
|
||||||
|
importLoaders: 1,
|
||||||
|
modules: {
|
||||||
|
localIdentName: '[name]/[local]/[hash:base64:5]'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
loader: 'postcss-loader',
|
||||||
|
options: {
|
||||||
|
ident: 'postcss',
|
||||||
|
config: {
|
||||||
|
ctx: {
|
||||||
|
cssVarsFiles
|
||||||
|
},
|
||||||
|
path: 'frontend/postcss.config.js'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// Global styles
|
||||||
|
{
|
||||||
|
test: /\.css$/,
|
||||||
|
include: /(node_modules|globals.css)/,
|
||||||
|
use: [
|
||||||
|
'style-loader',
|
||||||
|
{
|
||||||
|
loader: 'css-loader'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// Fonts
|
||||||
|
{
|
||||||
|
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'url-loader',
|
||||||
|
options: {
|
||||||
|
limit: 10240,
|
||||||
|
mimetype: 'application/font-woff',
|
||||||
|
emitFile: false,
|
||||||
|
name: 'Content/Fonts/[name].[ext]'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
test: /\.(ttf|eot|eot?#iefix|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: 'file-loader',
|
||||||
|
options: {
|
||||||
|
emitFile: false,
|
||||||
|
name: 'Content/Fonts/[name].[ext]'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
gulp.task('webpack', () => {
|
||||||
|
return webpackStream(config)
|
||||||
|
.pipe(gulp.dest('_output/UI'));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('webpackWatch', () => {
|
||||||
|
config.watch = true;
|
||||||
|
|
||||||
|
return webpackStream(config)
|
||||||
|
.on('error', errorHandler)
|
||||||
|
.pipe(gulp.dest('_output/UI'))
|
||||||
|
.on('error', errorHandler)
|
||||||
|
.pipe(livereload())
|
||||||
|
.on('error', errorHandler);
|
||||||
|
});
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
const loaderUtils = require('loader-utils');
|
||||||
|
|
||||||
|
module.exports = function cssVariablesLoader(source) {
|
||||||
|
const options = loaderUtils.getOptions(this);
|
||||||
|
|
||||||
|
options.cssVarsFiles.forEach((cssVarsFile) => {
|
||||||
|
this.addDependency(cssVarsFile);
|
||||||
|
});
|
||||||
|
|
||||||
|
return source;
|
||||||
|
};
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
const reload = require('require-nocache')(module);
|
||||||
|
|
||||||
|
module.exports = (ctx, configPath, options) => {
|
||||||
|
const config = {
|
||||||
|
plugins: {
|
||||||
|
'postcss-mixins': {
|
||||||
|
mixinsDir: [
|
||||||
|
'frontend/src/Styles/Mixins'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'postcss-simple-vars': {
|
||||||
|
variables: () =>
|
||||||
|
ctx.options.cssVarsFiles.reduce((acc, vars) => {
|
||||||
|
return Object.assign(acc, reload(vars));
|
||||||
|
}, {})
|
||||||
|
},
|
||||||
|
'postcss-color-function': {},
|
||||||
|
'postcss-nested': {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return config;
|
||||||
|
};
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// Place your settings in this file to overwrite default and user settings.
|
||||||
|
{
|
||||||
|
"files.insertFinalNewline": true
|
||||||
|
}
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { align, icons } from 'Helpers/Props';
|
||||||
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
|
import Table from 'Components/Table/Table';
|
||||||
|
import TableBody from 'Components/Table/TableBody';
|
||||||
|
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
||||||
|
import TablePager from 'Components/Table/TablePager';
|
||||||
|
import PageContent from 'Components/Page/PageContent';
|
||||||
|
import PageContentBodyConnector from 'Components/Page/PageContentBodyConnector';
|
||||||
|
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
|
||||||
|
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
|
||||||
|
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
|
||||||
|
import BlacklistRowConnector from './BlacklistRowConnector';
|
||||||
|
|
||||||
|
class Blacklist extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
isFetching,
|
||||||
|
isPopulated,
|
||||||
|
error,
|
||||||
|
items,
|
||||||
|
columns,
|
||||||
|
totalRecords,
|
||||||
|
isClearingBlacklistExecuting,
|
||||||
|
onClearBlacklistPress,
|
||||||
|
...otherProps
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PageContent title="Blacklist">
|
||||||
|
<PageToolbar>
|
||||||
|
<PageToolbarSection>
|
||||||
|
<PageToolbarButton
|
||||||
|
label="Clear"
|
||||||
|
iconName={icons.CLEAR}
|
||||||
|
isSpinning={isClearingBlacklistExecuting}
|
||||||
|
onPress={onClearBlacklistPress}
|
||||||
|
/>
|
||||||
|
</PageToolbarSection>
|
||||||
|
|
||||||
|
<PageToolbarSection alignContent={align.RIGHT}>
|
||||||
|
<TableOptionsModalWrapper
|
||||||
|
{...otherProps}
|
||||||
|
columns={columns}
|
||||||
|
>
|
||||||
|
<PageToolbarButton
|
||||||
|
label="Options"
|
||||||
|
iconName={icons.TABLE}
|
||||||
|
/>
|
||||||
|
</TableOptionsModalWrapper>
|
||||||
|
</PageToolbarSection>
|
||||||
|
</PageToolbar>
|
||||||
|
|
||||||
|
<PageContentBodyConnector>
|
||||||
|
{
|
||||||
|
isFetching && !isPopulated &&
|
||||||
|
<LoadingIndicator />
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!isFetching && !!error &&
|
||||||
|
<div>Unable to load blacklist</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
isPopulated && !error && !items.length &&
|
||||||
|
<div>
|
||||||
|
No history blacklist
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
isPopulated && !error && !!items.length &&
|
||||||
|
<div>
|
||||||
|
<Table
|
||||||
|
columns={columns}
|
||||||
|
{...otherProps}
|
||||||
|
>
|
||||||
|
<TableBody>
|
||||||
|
{
|
||||||
|
items.map((item) => {
|
||||||
|
return (
|
||||||
|
<BlacklistRowConnector
|
||||||
|
key={item.id}
|
||||||
|
columns={columns}
|
||||||
|
{...item}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
|
||||||
|
<TablePager
|
||||||
|
totalRecords={totalRecords}
|
||||||
|
isFetching={isFetching}
|
||||||
|
{...otherProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</PageContentBodyConnector>
|
||||||
|
</PageContent>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Blacklist.propTypes = {
|
||||||
|
isFetching: PropTypes.bool.isRequired,
|
||||||
|
isPopulated: PropTypes.bool.isRequired,
|
||||||
|
error: PropTypes.object,
|
||||||
|
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
totalRecords: PropTypes.number,
|
||||||
|
isClearingBlacklistExecuting: PropTypes.bool.isRequired,
|
||||||
|
onClearBlacklistPress: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Blacklist;
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
|
||||||
|
import withCurrentPage from 'Components/withCurrentPage';
|
||||||
|
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
|
||||||
|
import * as blacklistActions from 'Store/Actions/blacklistActions';
|
||||||
|
import { executeCommand } from 'Store/Actions/commandActions';
|
||||||
|
import * as commandNames from 'Commands/commandNames';
|
||||||
|
import Blacklist from './Blacklist';
|
||||||
|
|
||||||
|
function createMapStateToProps() {
|
||||||
|
return createSelector(
|
||||||
|
(state) => state.blacklist,
|
||||||
|
createCommandExecutingSelector(commandNames.CLEAR_BLACKLIST),
|
||||||
|
(blacklist, isClearingBlacklistExecuting) => {
|
||||||
|
return {
|
||||||
|
isClearingBlacklistExecuting,
|
||||||
|
...blacklist
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapDispatchToProps = {
|
||||||
|
...blacklistActions,
|
||||||
|
executeCommand
|
||||||
|
};
|
||||||
|
|
||||||
|
class BlacklistConnector extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Lifecycle
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
const {
|
||||||
|
useCurrentPage,
|
||||||
|
fetchBlacklist,
|
||||||
|
gotoBlacklistFirstPage
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
registerPagePopulator(this.repopulate);
|
||||||
|
|
||||||
|
if (useCurrentPage) {
|
||||||
|
fetchBlacklist();
|
||||||
|
} else {
|
||||||
|
gotoBlacklistFirstPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps) {
|
||||||
|
if (prevProps.isClearingBlacklistExecuting && !this.props.isClearingBlacklistExecuting) {
|
||||||
|
this.props.gotoBlacklistFirstPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.props.clearBlacklist();
|
||||||
|
unregisterPagePopulator(this.repopulate);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Control
|
||||||
|
|
||||||
|
repopulate = () => {
|
||||||
|
this.props.fetchBlacklist();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Listeners
|
||||||
|
|
||||||
|
onFirstPagePress = () => {
|
||||||
|
this.props.gotoBlacklistFirstPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onPreviousPagePress = () => {
|
||||||
|
this.props.gotoBlacklistPreviousPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onNextPagePress = () => {
|
||||||
|
this.props.gotoBlacklistNextPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onLastPagePress = () => {
|
||||||
|
this.props.gotoBlacklistLastPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onPageSelect = (page) => {
|
||||||
|
this.props.gotoBlacklistPage({ page });
|
||||||
|
}
|
||||||
|
|
||||||
|
onSortPress = (sortKey) => {
|
||||||
|
this.props.setBlacklistSort({ sortKey });
|
||||||
|
}
|
||||||
|
|
||||||
|
onTableOptionChange = (payload) => {
|
||||||
|
this.props.setBlacklistTableOption(payload);
|
||||||
|
|
||||||
|
if (payload.pageSize) {
|
||||||
|
this.props.gotoBlacklistFirstPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onClearBlacklistPress = () => {
|
||||||
|
this.props.executeCommand({ name: commandNames.CLEAR_BLACKLIST });
|
||||||
|
}
|
||||||
|
|
||||||
|
onTableOptionChange = (payload) => {
|
||||||
|
this.props.setBlacklistTableOption(payload);
|
||||||
|
|
||||||
|
if (payload.pageSize) {
|
||||||
|
this.props.gotoBlacklistFirstPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Blacklist
|
||||||
|
onFirstPagePress={this.onFirstPagePress}
|
||||||
|
onPreviousPagePress={this.onPreviousPagePress}
|
||||||
|
onNextPagePress={this.onNextPagePress}
|
||||||
|
onLastPagePress={this.onLastPagePress}
|
||||||
|
onPageSelect={this.onPageSelect}
|
||||||
|
onSortPress={this.onSortPress}
|
||||||
|
onTableOptionChange={this.onTableOptionChange}
|
||||||
|
onClearBlacklistPress={this.onClearBlacklistPress}
|
||||||
|
{...this.props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BlacklistConnector.propTypes = {
|
||||||
|
useCurrentPage: PropTypes.bool.isRequired,
|
||||||
|
isClearingBlacklistExecuting: PropTypes.bool.isRequired,
|
||||||
|
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
fetchBlacklist: PropTypes.func.isRequired,
|
||||||
|
gotoBlacklistFirstPage: PropTypes.func.isRequired,
|
||||||
|
gotoBlacklistPreviousPage: PropTypes.func.isRequired,
|
||||||
|
gotoBlacklistNextPage: PropTypes.func.isRequired,
|
||||||
|
gotoBlacklistLastPage: PropTypes.func.isRequired,
|
||||||
|
gotoBlacklistPage: PropTypes.func.isRequired,
|
||||||
|
setBlacklistSort: PropTypes.func.isRequired,
|
||||||
|
setBlacklistTableOption: PropTypes.func.isRequired,
|
||||||
|
clearBlacklist: PropTypes.func.isRequired,
|
||||||
|
executeCommand: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default withCurrentPage(
|
||||||
|
connect(createMapStateToProps, mapDispatchToProps)(BlacklistConnector)
|
||||||
|
);
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import Button from 'Components/Link/Button';
|
||||||
|
import DescriptionList from 'Components/DescriptionList/DescriptionList';
|
||||||
|
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
|
||||||
|
import Modal from 'Components/Modal/Modal';
|
||||||
|
import ModalContent from 'Components/Modal/ModalContent';
|
||||||
|
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||||
|
import ModalBody from 'Components/Modal/ModalBody';
|
||||||
|
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||||
|
|
||||||
|
class BlacklistDetailsModal extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
isOpen,
|
||||||
|
sourceTitle,
|
||||||
|
protocol,
|
||||||
|
indexer,
|
||||||
|
message,
|
||||||
|
onModalClose
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
isOpen={isOpen}
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
>
|
||||||
|
<ModalContent
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
>
|
||||||
|
<ModalHeader>
|
||||||
|
Details
|
||||||
|
</ModalHeader>
|
||||||
|
|
||||||
|
<ModalBody>
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Name"
|
||||||
|
data={sourceTitle}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Protocol"
|
||||||
|
data={protocol}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{
|
||||||
|
!!message &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Indexer"
|
||||||
|
data={indexer}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!message &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Message"
|
||||||
|
data={message}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</DescriptionList>
|
||||||
|
</ModalBody>
|
||||||
|
|
||||||
|
<ModalFooter>
|
||||||
|
<Button onPress={onModalClose}>
|
||||||
|
Close
|
||||||
|
</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalContent>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BlacklistDetailsModal.propTypes = {
|
||||||
|
isOpen: PropTypes.bool.isRequired,
|
||||||
|
sourceTitle: PropTypes.string.isRequired,
|
||||||
|
protocol: PropTypes.string.isRequired,
|
||||||
|
indexer: PropTypes.string,
|
||||||
|
message: PropTypes.string,
|
||||||
|
onModalClose: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BlacklistDetailsModal;
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
.language,
|
||||||
|
.quality {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.indexer {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.actions {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 70px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { icons, kinds } from 'Helpers/Props';
|
||||||
|
import IconButton from 'Components/Link/IconButton';
|
||||||
|
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
|
||||||
|
import TableRow from 'Components/Table/TableRow';
|
||||||
|
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||||
|
import EpisodeLanguage from 'Episode/EpisodeLanguage';
|
||||||
|
import EpisodeQuality from 'Episode/EpisodeQuality';
|
||||||
|
import SeriesTitleLink from 'Series/SeriesTitleLink';
|
||||||
|
import BlacklistDetailsModal from './BlacklistDetailsModal';
|
||||||
|
import styles from './BlacklistRow.css';
|
||||||
|
|
||||||
|
class BlacklistRow extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Lifecycle
|
||||||
|
|
||||||
|
constructor(props, context) {
|
||||||
|
super(props, context);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
isDetailsModalOpen: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Listeners
|
||||||
|
|
||||||
|
onDetailsPress = () => {
|
||||||
|
this.setState({ isDetailsModalOpen: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
onDetailsModalClose = () => {
|
||||||
|
this.setState({ isDetailsModalOpen: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
series,
|
||||||
|
sourceTitle,
|
||||||
|
language,
|
||||||
|
quality,
|
||||||
|
date,
|
||||||
|
protocol,
|
||||||
|
indexer,
|
||||||
|
message,
|
||||||
|
columns,
|
||||||
|
onRemovePress
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRow>
|
||||||
|
{
|
||||||
|
columns.map((column) => {
|
||||||
|
const {
|
||||||
|
name,
|
||||||
|
isVisible
|
||||||
|
} = column;
|
||||||
|
|
||||||
|
if (!isVisible) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'series.sortTitle') {
|
||||||
|
return (
|
||||||
|
<TableRowCell key={name}>
|
||||||
|
<SeriesTitleLink
|
||||||
|
titleSlug={series.titleSlug}
|
||||||
|
title={series.title}
|
||||||
|
/>
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'sourceTitle') {
|
||||||
|
return (
|
||||||
|
<TableRowCell key={name}>
|
||||||
|
{sourceTitle}
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'language') {
|
||||||
|
return (
|
||||||
|
<TableRowCell
|
||||||
|
key={name}
|
||||||
|
className={styles.language}
|
||||||
|
>
|
||||||
|
<EpisodeLanguage
|
||||||
|
language={language}
|
||||||
|
/>
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'quality') {
|
||||||
|
return (
|
||||||
|
<TableRowCell
|
||||||
|
key={name}
|
||||||
|
className={styles.quality}
|
||||||
|
>
|
||||||
|
<EpisodeQuality
|
||||||
|
quality={quality}
|
||||||
|
/>
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'date') {
|
||||||
|
return (
|
||||||
|
<RelativeDateCellConnector
|
||||||
|
key={name}
|
||||||
|
date={date}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'indexer') {
|
||||||
|
return (
|
||||||
|
<TableRowCell
|
||||||
|
key={name}
|
||||||
|
className={styles.indexer}
|
||||||
|
>
|
||||||
|
{indexer}
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'actions') {
|
||||||
|
return (
|
||||||
|
<TableRowCell
|
||||||
|
key={name}
|
||||||
|
className={styles.actions}
|
||||||
|
>
|
||||||
|
<IconButton
|
||||||
|
name={icons.INFO}
|
||||||
|
onPress={this.onDetailsPress}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<IconButton
|
||||||
|
title="Remove from blacklist"
|
||||||
|
name={icons.REMOVE}
|
||||||
|
kind={kinds.DANGER}
|
||||||
|
onPress={onRemovePress}
|
||||||
|
/>
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
<BlacklistDetailsModal
|
||||||
|
isOpen={this.state.isDetailsModalOpen}
|
||||||
|
sourceTitle={sourceTitle}
|
||||||
|
protocol={protocol}
|
||||||
|
indexer={indexer}
|
||||||
|
message={message}
|
||||||
|
onModalClose={this.onDetailsModalClose}
|
||||||
|
/>
|
||||||
|
</TableRow>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BlacklistRow.propTypes = {
|
||||||
|
id: PropTypes.number.isRequired,
|
||||||
|
series: PropTypes.object.isRequired,
|
||||||
|
sourceTitle: PropTypes.string.isRequired,
|
||||||
|
language: PropTypes.object.isRequired,
|
||||||
|
quality: PropTypes.object.isRequired,
|
||||||
|
date: PropTypes.string.isRequired,
|
||||||
|
protocol: PropTypes.string.isRequired,
|
||||||
|
indexer: PropTypes.string,
|
||||||
|
message: PropTypes.string,
|
||||||
|
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
onRemovePress: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BlacklistRow;
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import { removeFromBlacklist } from 'Store/Actions/blacklistActions';
|
||||||
|
import createSeriesSelector from 'Store/Selectors/createSeriesSelector';
|
||||||
|
import BlacklistRow from './BlacklistRow';
|
||||||
|
|
||||||
|
function createMapStateToProps() {
|
||||||
|
return createSelector(
|
||||||
|
createSeriesSelector(),
|
||||||
|
(series) => {
|
||||||
|
return {
|
||||||
|
series
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMapDispatchToProps(dispatch, props) {
|
||||||
|
return {
|
||||||
|
onRemovePress() {
|
||||||
|
dispatch(removeFromBlacklist({ id: props.id }));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect(createMapStateToProps, createMapDispatchToProps)(BlacklistRow);
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.description {
|
||||||
|
composes: description from '~Components/DescriptionList/DescriptionListItemDescription.css';
|
||||||
|
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
@@ -0,0 +1,278 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React from 'react';
|
||||||
|
import formatDateTime from 'Utilities/Date/formatDateTime';
|
||||||
|
import formatAge from 'Utilities/Number/formatAge';
|
||||||
|
import Link from 'Components/Link/Link';
|
||||||
|
import DescriptionList from 'Components/DescriptionList/DescriptionList';
|
||||||
|
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
|
||||||
|
import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionListItemTitle';
|
||||||
|
import DescriptionListItemDescription from 'Components/DescriptionList/DescriptionListItemDescription';
|
||||||
|
import styles from './HistoryDetails.css';
|
||||||
|
|
||||||
|
function HistoryDetails(props) {
|
||||||
|
const {
|
||||||
|
eventType,
|
||||||
|
sourceTitle,
|
||||||
|
data,
|
||||||
|
shortDateFormat,
|
||||||
|
timeFormat
|
||||||
|
} = props;
|
||||||
|
|
||||||
|
if (eventType === 'grabbed') {
|
||||||
|
const {
|
||||||
|
indexer,
|
||||||
|
releaseGroup,
|
||||||
|
nzbInfoUrl,
|
||||||
|
downloadClient,
|
||||||
|
downloadId,
|
||||||
|
age,
|
||||||
|
ageHours,
|
||||||
|
ageMinutes,
|
||||||
|
publishedDate
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Name"
|
||||||
|
data={sourceTitle}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{
|
||||||
|
!!indexer &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Indexer"
|
||||||
|
data={indexer}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!releaseGroup &&
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Release Group"
|
||||||
|
data={releaseGroup}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!nzbInfoUrl &&
|
||||||
|
<span>
|
||||||
|
<DescriptionListItemTitle>
|
||||||
|
Info URL
|
||||||
|
</DescriptionListItemTitle>
|
||||||
|
|
||||||
|
<DescriptionListItemDescription>
|
||||||
|
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
|
||||||
|
</DescriptionListItemDescription>
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!downloadClient &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Download Client"
|
||||||
|
data={downloadClient}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!downloadId &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Grab ID"
|
||||||
|
data={downloadId}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!indexer &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Age (when grabbed)"
|
||||||
|
data={formatAge(age, ageHours, ageMinutes)}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!publishedDate &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Published Date"
|
||||||
|
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</DescriptionList>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventType === 'downloadFailed') {
|
||||||
|
const {
|
||||||
|
message
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Name"
|
||||||
|
data={sourceTitle}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{
|
||||||
|
!!message &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Message"
|
||||||
|
data={message}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</DescriptionList>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventType === 'downloadFolderImported') {
|
||||||
|
const {
|
||||||
|
droppedPath,
|
||||||
|
importedPath
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Name"
|
||||||
|
data={sourceTitle}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{
|
||||||
|
!!droppedPath &&
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Source"
|
||||||
|
data={droppedPath}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!importedPath &&
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Imported To"
|
||||||
|
data={importedPath}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</DescriptionList>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventType === 'episodeFileDeleted') {
|
||||||
|
const {
|
||||||
|
reason
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
let reasonMessage = '';
|
||||||
|
|
||||||
|
switch (reason) {
|
||||||
|
case 'Manual':
|
||||||
|
reasonMessage = 'File was deleted by via UI';
|
||||||
|
break;
|
||||||
|
case 'MissingFromDisk':
|
||||||
|
reasonMessage = 'Sonarr was unable to find the file on disk so it was removed';
|
||||||
|
break;
|
||||||
|
case 'Upgrade':
|
||||||
|
reasonMessage = 'File was deleted to import an upgrade';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reasonMessage = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Name"
|
||||||
|
data={sourceTitle}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Reason"
|
||||||
|
data={reasonMessage}
|
||||||
|
/>
|
||||||
|
</DescriptionList>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventType === 'episodeFileRenamed') {
|
||||||
|
const {
|
||||||
|
sourcePath,
|
||||||
|
sourceRelativePath,
|
||||||
|
path,
|
||||||
|
relativePath
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Source Path"
|
||||||
|
data={sourcePath}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Source Relative Path"
|
||||||
|
data={sourceRelativePath}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Destination Path"
|
||||||
|
data={path}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Destination Relative Path"
|
||||||
|
data={relativePath}
|
||||||
|
/>
|
||||||
|
</DescriptionList>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventType === 'downloadIgnored') {
|
||||||
|
const {
|
||||||
|
message
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Name"
|
||||||
|
data={sourceTitle}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{
|
||||||
|
!!message &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title="Message"
|
||||||
|
data={message}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</DescriptionList>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DescriptionList>
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title="Name"
|
||||||
|
data={sourceTitle}
|
||||||
|
/>
|
||||||
|
</DescriptionList>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
HistoryDetails.propTypes = {
|
||||||
|
eventType: PropTypes.string.isRequired,
|
||||||
|
sourceTitle: PropTypes.string.isRequired,
|
||||||
|
data: PropTypes.object.isRequired,
|
||||||
|
shortDateFormat: PropTypes.string.isRequired,
|
||||||
|
timeFormat: PropTypes.string.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default HistoryDetails;
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import _ from 'lodash';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||||
|
import HistoryDetails from './HistoryDetails';
|
||||||
|
|
||||||
|
function createMapStateToProps() {
|
||||||
|
return createSelector(
|
||||||
|
createUISettingsSelector(),
|
||||||
|
(uiSettings) => {
|
||||||
|
return _.pick(uiSettings, [
|
||||||
|
'shortDateFormat',
|
||||||
|
'timeFormat'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect(createMapStateToProps)(HistoryDetails);
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.markAsFailedButton {
|
||||||
|
composes: button from '~Components/Link/Button.css';
|
||||||
|
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React from 'react';
|
||||||
|
import { kinds } from 'Helpers/Props';
|
||||||
|
import Button from 'Components/Link/Button';
|
||||||
|
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||||
|
import Modal from 'Components/Modal/Modal';
|
||||||
|
import ModalContent from 'Components/Modal/ModalContent';
|
||||||
|
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||||
|
import ModalBody from 'Components/Modal/ModalBody';
|
||||||
|
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||||
|
import HistoryDetails from './HistoryDetails';
|
||||||
|
import styles from './HistoryDetailsModal.css';
|
||||||
|
|
||||||
|
function getHeaderTitle(eventType) {
|
||||||
|
switch (eventType) {
|
||||||
|
case 'grabbed':
|
||||||
|
return 'Grabbed';
|
||||||
|
case 'downloadFailed':
|
||||||
|
return 'Download Failed';
|
||||||
|
case 'downloadFolderImported':
|
||||||
|
return 'Episode Imported';
|
||||||
|
case 'episodeFileDeleted':
|
||||||
|
return 'Episode File Deleted';
|
||||||
|
case 'episodeFileRenamed':
|
||||||
|
return 'Episode File Renamed';
|
||||||
|
case 'downloadIgnored':
|
||||||
|
return 'Download Ignored';
|
||||||
|
default:
|
||||||
|
return 'Unknown';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function HistoryDetailsModal(props) {
|
||||||
|
const {
|
||||||
|
isOpen,
|
||||||
|
eventType,
|
||||||
|
sourceTitle,
|
||||||
|
data,
|
||||||
|
isMarkingAsFailed,
|
||||||
|
shortDateFormat,
|
||||||
|
timeFormat,
|
||||||
|
onMarkAsFailedPress,
|
||||||
|
onModalClose
|
||||||
|
} = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
isOpen={isOpen}
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
>
|
||||||
|
<ModalContent onModalClose={onModalClose}>
|
||||||
|
<ModalHeader>
|
||||||
|
{getHeaderTitle(eventType)}
|
||||||
|
</ModalHeader>
|
||||||
|
|
||||||
|
<ModalBody>
|
||||||
|
<HistoryDetails
|
||||||
|
eventType={eventType}
|
||||||
|
sourceTitle={sourceTitle}
|
||||||
|
data={data}
|
||||||
|
shortDateFormat={shortDateFormat}
|
||||||
|
timeFormat={timeFormat}
|
||||||
|
/>
|
||||||
|
</ModalBody>
|
||||||
|
|
||||||
|
<ModalFooter>
|
||||||
|
{
|
||||||
|
eventType === 'grabbed' &&
|
||||||
|
<SpinnerButton
|
||||||
|
className={styles.markAsFailedButton}
|
||||||
|
kind={kinds.DANGER}
|
||||||
|
isSpinning={isMarkingAsFailed}
|
||||||
|
onPress={onMarkAsFailedPress}
|
||||||
|
>
|
||||||
|
Mark as Failed
|
||||||
|
</SpinnerButton>
|
||||||
|
}
|
||||||
|
|
||||||
|
<Button
|
||||||
|
onPress={onModalClose}
|
||||||
|
>
|
||||||
|
Close
|
||||||
|
</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalContent>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
HistoryDetailsModal.propTypes = {
|
||||||
|
isOpen: PropTypes.bool.isRequired,
|
||||||
|
eventType: PropTypes.string.isRequired,
|
||||||
|
sourceTitle: PropTypes.string.isRequired,
|
||||||
|
data: PropTypes.object.isRequired,
|
||||||
|
isMarkingAsFailed: PropTypes.bool.isRequired,
|
||||||
|
shortDateFormat: PropTypes.string.isRequired,
|
||||||
|
timeFormat: PropTypes.string.isRequired,
|
||||||
|
onMarkAsFailedPress: PropTypes.func.isRequired,
|
||||||
|
onModalClose: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
HistoryDetailsModal.defaultProps = {
|
||||||
|
isMarkingAsFailed: false
|
||||||
|
};
|
||||||
|
|
||||||
|
export default HistoryDetailsModal;
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { align, icons } from 'Helpers/Props';
|
||||||
|
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
|
||||||
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
|
import Table from 'Components/Table/Table';
|
||||||
|
import TableBody from 'Components/Table/TableBody';
|
||||||
|
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
||||||
|
import TablePager from 'Components/Table/TablePager';
|
||||||
|
import PageContent from 'Components/Page/PageContent';
|
||||||
|
import PageContentBodyConnector from 'Components/Page/PageContentBodyConnector';
|
||||||
|
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
|
||||||
|
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
|
||||||
|
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
|
||||||
|
import FilterMenu from 'Components/Menu/FilterMenu';
|
||||||
|
import HistoryRowConnector from './HistoryRowConnector';
|
||||||
|
|
||||||
|
class History extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Lifecycle
|
||||||
|
|
||||||
|
shouldComponentUpdate(nextProps) {
|
||||||
|
// Don't update when fetching has completed if items have changed,
|
||||||
|
// before episodes start fetching or when episodes start fetching.
|
||||||
|
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
this.props.isFetching &&
|
||||||
|
nextProps.isPopulated &&
|
||||||
|
hasDifferentItems(this.props.items, nextProps.items)
|
||||||
|
) ||
|
||||||
|
(!this.props.isEpisodesFetching && nextProps.isEpisodesFetching)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
isFetching,
|
||||||
|
isPopulated,
|
||||||
|
error,
|
||||||
|
items,
|
||||||
|
columns,
|
||||||
|
selectedFilterKey,
|
||||||
|
filters,
|
||||||
|
totalRecords,
|
||||||
|
isEpisodesFetching,
|
||||||
|
isEpisodesPopulated,
|
||||||
|
episodesError,
|
||||||
|
onFilterSelect,
|
||||||
|
onFirstPagePress,
|
||||||
|
...otherProps
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
const isFetchingAny = isFetching || isEpisodesFetching;
|
||||||
|
const isAllPopulated = isPopulated && (isEpisodesPopulated || !items.length);
|
||||||
|
const hasError = error || episodesError;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PageContent title="History">
|
||||||
|
<PageToolbar>
|
||||||
|
<PageToolbarSection>
|
||||||
|
<PageToolbarButton
|
||||||
|
label="Refresh"
|
||||||
|
iconName={icons.REFRESH}
|
||||||
|
isSpinning={isFetching}
|
||||||
|
onPress={onFirstPagePress}
|
||||||
|
/>
|
||||||
|
</PageToolbarSection>
|
||||||
|
|
||||||
|
<PageToolbarSection alignContent={align.RIGHT}>
|
||||||
|
<TableOptionsModalWrapper
|
||||||
|
{...otherProps}
|
||||||
|
columns={columns}
|
||||||
|
>
|
||||||
|
<PageToolbarButton
|
||||||
|
label="Options"
|
||||||
|
iconName={icons.TABLE}
|
||||||
|
/>
|
||||||
|
</TableOptionsModalWrapper>
|
||||||
|
|
||||||
|
<FilterMenu
|
||||||
|
alignMenu={align.RIGHT}
|
||||||
|
selectedFilterKey={selectedFilterKey}
|
||||||
|
filters={filters}
|
||||||
|
customFilters={[]}
|
||||||
|
onFilterSelect={onFilterSelect}
|
||||||
|
/>
|
||||||
|
</PageToolbarSection>
|
||||||
|
</PageToolbar>
|
||||||
|
|
||||||
|
<PageContentBodyConnector>
|
||||||
|
{
|
||||||
|
isFetchingAny && !isAllPopulated &&
|
||||||
|
<LoadingIndicator />
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!isFetchingAny && hasError &&
|
||||||
|
<div>Unable to load history</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// If history isPopulated and it's empty show no history found and don't
|
||||||
|
// wait for the episodes to populate because they are never coming.
|
||||||
|
|
||||||
|
isPopulated && !hasError && !items.length &&
|
||||||
|
<div>
|
||||||
|
No history found
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
isAllPopulated && !hasError && !!items.length &&
|
||||||
|
<div>
|
||||||
|
<Table
|
||||||
|
columns={columns}
|
||||||
|
{...otherProps}
|
||||||
|
>
|
||||||
|
<TableBody>
|
||||||
|
{
|
||||||
|
items.map((item) => {
|
||||||
|
return (
|
||||||
|
<HistoryRowConnector
|
||||||
|
key={item.id}
|
||||||
|
columns={columns}
|
||||||
|
{...item}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
|
||||||
|
<TablePager
|
||||||
|
totalRecords={totalRecords}
|
||||||
|
isFetching={isFetchingAny}
|
||||||
|
onFirstPagePress={onFirstPagePress}
|
||||||
|
{...otherProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</PageContentBodyConnector>
|
||||||
|
</PageContent>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
History.propTypes = {
|
||||||
|
isFetching: PropTypes.bool.isRequired,
|
||||||
|
isPopulated: PropTypes.bool.isRequired,
|
||||||
|
error: PropTypes.object,
|
||||||
|
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
selectedFilterKey: PropTypes.string.isRequired,
|
||||||
|
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
totalRecords: PropTypes.number,
|
||||||
|
isEpisodesFetching: PropTypes.bool.isRequired,
|
||||||
|
isEpisodesPopulated: PropTypes.bool.isRequired,
|
||||||
|
episodesError: PropTypes.object,
|
||||||
|
onFilterSelect: PropTypes.func.isRequired,
|
||||||
|
onFirstPagePress: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default History;
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
|
||||||
|
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
|
||||||
|
import selectUniqueIds from 'Utilities/Object/selectUniqueIds';
|
||||||
|
import withCurrentPage from 'Components/withCurrentPage';
|
||||||
|
import * as historyActions from 'Store/Actions/historyActions';
|
||||||
|
import { fetchEpisodes, clearEpisodes } from 'Store/Actions/episodeActions';
|
||||||
|
import { clearEpisodeFiles } from 'Store/Actions/episodeFileActions';
|
||||||
|
import History from './History';
|
||||||
|
|
||||||
|
function createMapStateToProps() {
|
||||||
|
return createSelector(
|
||||||
|
(state) => state.history,
|
||||||
|
(state) => state.episodes,
|
||||||
|
(history, episodes) => {
|
||||||
|
return {
|
||||||
|
isEpisodesFetching: episodes.isFetching,
|
||||||
|
isEpisodesPopulated: episodes.isPopulated,
|
||||||
|
episodesError: episodes.error,
|
||||||
|
...history
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapDispatchToProps = {
|
||||||
|
...historyActions,
|
||||||
|
fetchEpisodes,
|
||||||
|
clearEpisodes,
|
||||||
|
clearEpisodeFiles
|
||||||
|
};
|
||||||
|
|
||||||
|
class HistoryConnector extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Lifecycle
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
const {
|
||||||
|
useCurrentPage,
|
||||||
|
fetchHistory,
|
||||||
|
gotoHistoryFirstPage
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
registerPagePopulator(this.repopulate);
|
||||||
|
|
||||||
|
if (useCurrentPage) {
|
||||||
|
fetchHistory();
|
||||||
|
} else {
|
||||||
|
gotoHistoryFirstPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps) {
|
||||||
|
if (hasDifferentItems(prevProps.items, this.props.items)) {
|
||||||
|
const episodeIds = selectUniqueIds(this.props.items, 'episodeId');
|
||||||
|
|
||||||
|
if (episodeIds.length) {
|
||||||
|
this.props.fetchEpisodes({ episodeIds });
|
||||||
|
} else {
|
||||||
|
this.props.clearEpisodes();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
unregisterPagePopulator(this.repopulate);
|
||||||
|
this.props.clearHistory();
|
||||||
|
this.props.clearEpisodes();
|
||||||
|
this.props.clearEpisodeFiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Control
|
||||||
|
|
||||||
|
repopulate = () => {
|
||||||
|
this.props.fetchHistory();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Listeners
|
||||||
|
|
||||||
|
onFirstPagePress = () => {
|
||||||
|
this.props.gotoHistoryFirstPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onPreviousPagePress = () => {
|
||||||
|
this.props.gotoHistoryPreviousPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onNextPagePress = () => {
|
||||||
|
this.props.gotoHistoryNextPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onLastPagePress = () => {
|
||||||
|
this.props.gotoHistoryLastPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
onPageSelect = (page) => {
|
||||||
|
this.props.gotoHistoryPage({ page });
|
||||||
|
}
|
||||||
|
|
||||||
|
onSortPress = (sortKey) => {
|
||||||
|
this.props.setHistorySort({ sortKey });
|
||||||
|
}
|
||||||
|
|
||||||
|
onFilterSelect = (selectedFilterKey) => {
|
||||||
|
this.props.setHistoryFilter({ selectedFilterKey });
|
||||||
|
}
|
||||||
|
|
||||||
|
onTableOptionChange = (payload) => {
|
||||||
|
this.props.setHistoryTableOption(payload);
|
||||||
|
|
||||||
|
if (payload.pageSize) {
|
||||||
|
this.props.gotoHistoryFirstPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<History
|
||||||
|
onFirstPagePress={this.onFirstPagePress}
|
||||||
|
onPreviousPagePress={this.onPreviousPagePress}
|
||||||
|
onNextPagePress={this.onNextPagePress}
|
||||||
|
onLastPagePress={this.onLastPagePress}
|
||||||
|
onPageSelect={this.onPageSelect}
|
||||||
|
onSortPress={this.onSortPress}
|
||||||
|
onFilterSelect={this.onFilterSelect}
|
||||||
|
onTableOptionChange={this.onTableOptionChange}
|
||||||
|
{...this.props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HistoryConnector.propTypes = {
|
||||||
|
useCurrentPage: PropTypes.bool.isRequired,
|
||||||
|
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
fetchHistory: PropTypes.func.isRequired,
|
||||||
|
gotoHistoryFirstPage: PropTypes.func.isRequired,
|
||||||
|
gotoHistoryPreviousPage: PropTypes.func.isRequired,
|
||||||
|
gotoHistoryNextPage: PropTypes.func.isRequired,
|
||||||
|
gotoHistoryLastPage: PropTypes.func.isRequired,
|
||||||
|
gotoHistoryPage: PropTypes.func.isRequired,
|
||||||
|
setHistorySort: PropTypes.func.isRequired,
|
||||||
|
setHistoryFilter: PropTypes.func.isRequired,
|
||||||
|
setHistoryTableOption: PropTypes.func.isRequired,
|
||||||
|
clearHistory: PropTypes.func.isRequired,
|
||||||
|
fetchEpisodes: PropTypes.func.isRequired,
|
||||||
|
clearEpisodes: PropTypes.func.isRequired,
|
||||||
|
clearEpisodeFiles: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default withCurrentPage(
|
||||||
|
connect(createMapStateToProps, mapDispatchToProps)(HistoryConnector)
|
||||||
|
);
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
.cell {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 35px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React from 'react';
|
||||||
|
import { icons, kinds } from 'Helpers/Props';
|
||||||
|
import Icon from 'Components/Icon';
|
||||||
|
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||||
|
import styles from './HistoryEventTypeCell.css';
|
||||||
|
|
||||||
|
function getIconName(eventType) {
|
||||||
|
switch (eventType) {
|
||||||
|
case 'grabbed':
|
||||||
|
return icons.DOWNLOADING;
|
||||||
|
case 'seriesFolderImported':
|
||||||
|
return icons.DRIVE;
|
||||||
|
case 'downloadFolderImported':
|
||||||
|
return icons.DOWNLOADED;
|
||||||
|
case 'downloadFailed':
|
||||||
|
return icons.DOWNLOADING;
|
||||||
|
case 'episodeFileDeleted':
|
||||||
|
return icons.DELETE;
|
||||||
|
case 'episodeFileRenamed':
|
||||||
|
return icons.ORGANIZE;
|
||||||
|
case 'downloadIgnored':
|
||||||
|
return icons.IGNORE;
|
||||||
|
default:
|
||||||
|
return icons.UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getIconKind(eventType) {
|
||||||
|
switch (eventType) {
|
||||||
|
case 'downloadFailed':
|
||||||
|
return kinds.DANGER;
|
||||||
|
default:
|
||||||
|
return kinds.DEFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTooltip(eventType, data) {
|
||||||
|
switch (eventType) {
|
||||||
|
case 'grabbed':
|
||||||
|
return `Episode grabbed from ${data.indexer} and sent to ${data.downloadClient}`;
|
||||||
|
case 'seriesFolderImported':
|
||||||
|
return 'Episode imported from series folder';
|
||||||
|
case 'downloadFolderImported':
|
||||||
|
return 'Episode downloaded successfully and picked up from download client';
|
||||||
|
case 'downloadFailed':
|
||||||
|
return 'Episode download failed';
|
||||||
|
case 'episodeFileDeleted':
|
||||||
|
return 'Episode file deleted';
|
||||||
|
case 'episodeFileRenamed':
|
||||||
|
return 'Episode file renamed';
|
||||||
|
case 'downloadIgnored':
|
||||||
|
return 'Episode Download Ignored';
|
||||||
|
default:
|
||||||
|
return 'Unknown event';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function HistoryEventTypeCell({ eventType, data }) {
|
||||||
|
const iconName = getIconName(eventType);
|
||||||
|
const iconKind = getIconKind(eventType);
|
||||||
|
const tooltip = getTooltip(eventType, data);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRowCell
|
||||||
|
className={styles.cell}
|
||||||
|
title={tooltip}
|
||||||
|
>
|
||||||
|
<Icon
|
||||||
|
name={iconName}
|
||||||
|
kind={iconKind}
|
||||||
|
/>
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
HistoryEventTypeCell.propTypes = {
|
||||||
|
eventType: PropTypes.string.isRequired,
|
||||||
|
data: PropTypes.object
|
||||||
|
};
|
||||||
|
|
||||||
|
HistoryEventTypeCell.defaultProps = {
|
||||||
|
data: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default HistoryEventTypeCell;
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
.downloadClient {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.indexer {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.releaseGroup {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 110px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details {
|
||||||
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
|
width: 30px;
|
||||||
|
}
|
||||||