diff --git a/archive/community.applications-2020.09.19-x86_64-1.txz b/archive/community.applications-2020.09.19-x86_64-1.txz deleted file mode 100644 index 155a8b7e..00000000 Binary files a/archive/community.applications-2020.09.19-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.01-x86_64-1.txz b/archive/community.applications-2020.12.01-x86_64-1.txz deleted file mode 100644 index 9f3f921a..00000000 Binary files a/archive/community.applications-2020.12.01-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.02-x86_64-1.txz b/archive/community.applications-2020.12.02-x86_64-1.txz deleted file mode 100644 index cf049870..00000000 Binary files a/archive/community.applications-2020.12.02-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.14-x86_64-1.txz b/archive/community.applications-2020.12.14-x86_64-1.txz deleted file mode 100644 index 2a026b75..00000000 Binary files a/archive/community.applications-2020.12.14-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.14a-x86_64-1.txz b/archive/community.applications-2020.12.14a-x86_64-1.txz deleted file mode 100644 index f9f63a8b..00000000 Binary files a/archive/community.applications-2020.12.14a-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.19-x86_64-1.txz b/archive/community.applications-2020.12.19-x86_64-1.txz deleted file mode 100644 index fb0b2e18..00000000 Binary files a/archive/community.applications-2020.12.19-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.29-x86_64-1.txz b/archive/community.applications-2020.12.29-x86_64-1.txz deleted file mode 100644 index 4b3012cf..00000000 Binary files a/archive/community.applications-2020.12.29-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.30-x86_64-1.txz b/archive/community.applications-2020.12.30-x86_64-1.txz deleted file mode 100644 index d4ad48f0..00000000 Binary files a/archive/community.applications-2020.12.30-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2020.12.31-x86_64-1.txz b/archive/community.applications-2020.12.31-x86_64-1.txz deleted file mode 100644 index 09d3dbce..00000000 Binary files a/archive/community.applications-2020.12.31-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.01-x86_64-1.txz b/archive/community.applications-2021.01.01-x86_64-1.txz deleted file mode 100644 index 3c00fd50..00000000 Binary files a/archive/community.applications-2021.01.01-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.02-x86_64-1.txz b/archive/community.applications-2021.01.02-x86_64-1.txz deleted file mode 100644 index dea81553..00000000 Binary files a/archive/community.applications-2021.01.02-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.03-x86_64-1.txz b/archive/community.applications-2021.01.03-x86_64-1.txz deleted file mode 100644 index fd87785d..00000000 Binary files a/archive/community.applications-2021.01.03-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.05-x86_64-1.txz b/archive/community.applications-2021.01.05-x86_64-1.txz deleted file mode 100644 index f185665e..00000000 Binary files a/archive/community.applications-2021.01.05-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.09-x86_64-1.txz b/archive/community.applications-2021.01.09-x86_64-1.txz deleted file mode 100644 index 076ccc1d..00000000 Binary files a/archive/community.applications-2021.01.09-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.20-x86_64-1.txz b/archive/community.applications-2021.01.20-x86_64-1.txz deleted file mode 100644 index 5b84e5ab..00000000 Binary files a/archive/community.applications-2021.01.20-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.21-x86_64-1.txz b/archive/community.applications-2021.01.21-x86_64-1.txz deleted file mode 100644 index 6180d911..00000000 Binary files a/archive/community.applications-2021.01.21-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.22-x86_64-1.txz b/archive/community.applications-2021.01.22-x86_64-1.txz deleted file mode 100644 index 40b69118..00000000 Binary files a/archive/community.applications-2021.01.22-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.26-x86_64-1.txz b/archive/community.applications-2021.01.26-x86_64-1.txz deleted file mode 100644 index d65c18a6..00000000 Binary files a/archive/community.applications-2021.01.26-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.27-x86_64-1.txz b/archive/community.applications-2021.01.27-x86_64-1.txz deleted file mode 100644 index 2f5ed75b..00000000 Binary files a/archive/community.applications-2021.01.27-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.30-x86_64-1.txz b/archive/community.applications-2021.01.30-x86_64-1.txz deleted file mode 100644 index ebc1b298..00000000 Binary files a/archive/community.applications-2021.01.30-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.01.31-x86_64-1.txz b/archive/community.applications-2021.01.31-x86_64-1.txz deleted file mode 100644 index 424b23dd..00000000 Binary files a/archive/community.applications-2021.01.31-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.15-x86_64-1.txz b/archive/community.applications-2021.02.15-x86_64-1.txz deleted file mode 100644 index 7c97ee56..00000000 Binary files a/archive/community.applications-2021.02.15-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.18-x86_64-1.txz b/archive/community.applications-2021.02.18-x86_64-1.txz deleted file mode 100644 index b75d6729..00000000 Binary files a/archive/community.applications-2021.02.18-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.19-x86_64-1.txz b/archive/community.applications-2021.02.19-x86_64-1.txz deleted file mode 100644 index eb0a0e89..00000000 Binary files a/archive/community.applications-2021.02.19-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.19a-x86_64-1.txz b/archive/community.applications-2021.02.19a-x86_64-1.txz deleted file mode 100644 index 279cbcb9..00000000 Binary files a/archive/community.applications-2021.02.19a-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.20-x86_64-1.txz b/archive/community.applications-2021.02.20-x86_64-1.txz deleted file mode 100644 index 56e492a9..00000000 Binary files a/archive/community.applications-2021.02.20-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.21-x86_64-1.txz b/archive/community.applications-2021.02.21-x86_64-1.txz deleted file mode 100644 index 9d5fe2b4..00000000 Binary files a/archive/community.applications-2021.02.21-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.22-x86_64-1.txz b/archive/community.applications-2021.02.22-x86_64-1.txz deleted file mode 100644 index 76dcbc9c..00000000 Binary files a/archive/community.applications-2021.02.22-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.23-x86_64-1.txz b/archive/community.applications-2021.02.23-x86_64-1.txz deleted file mode 100644 index b800a4bd..00000000 Binary files a/archive/community.applications-2021.02.23-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.24-x86_64-1.txz b/archive/community.applications-2021.02.24-x86_64-1.txz deleted file mode 100644 index d655f085..00000000 Binary files a/archive/community.applications-2021.02.24-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.25-x86_64-1.txz b/archive/community.applications-2021.02.25-x86_64-1.txz deleted file mode 100644 index 4ae1756d..00000000 Binary files a/archive/community.applications-2021.02.25-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.26-x86_64-1.txz b/archive/community.applications-2021.02.26-x86_64-1.txz deleted file mode 100644 index 65e7b6d5..00000000 Binary files a/archive/community.applications-2021.02.26-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.27-x86_64-1.txz b/archive/community.applications-2021.02.27-x86_64-1.txz deleted file mode 100644 index 397ece1f..00000000 Binary files a/archive/community.applications-2021.02.27-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.02.27a-x86_64-1.txz b/archive/community.applications-2021.02.27a-x86_64-1.txz deleted file mode 100644 index df1e7aa0..00000000 Binary files a/archive/community.applications-2021.02.27a-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.02-x86_64-1.txz b/archive/community.applications-2021.03.02-x86_64-1.txz deleted file mode 100644 index b2f95203..00000000 Binary files a/archive/community.applications-2021.03.02-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.07-x86_64-1.txz b/archive/community.applications-2021.03.07-x86_64-1.txz deleted file mode 100644 index b155b44a..00000000 Binary files a/archive/community.applications-2021.03.07-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.09-x86_64-1.txz b/archive/community.applications-2021.03.09-x86_64-1.txz deleted file mode 100644 index 2065ae60..00000000 Binary files a/archive/community.applications-2021.03.09-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.10-x86_64-1.txz b/archive/community.applications-2021.03.10-x86_64-1.txz deleted file mode 100644 index 2016f015..00000000 Binary files a/archive/community.applications-2021.03.10-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.11-x86_64-1.txz b/archive/community.applications-2021.03.11-x86_64-1.txz deleted file mode 100644 index 5345b6be..00000000 Binary files a/archive/community.applications-2021.03.11-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.12-x86_64-1.txz b/archive/community.applications-2021.03.12-x86_64-1.txz deleted file mode 100644 index 40b5cbaa..00000000 Binary files a/archive/community.applications-2021.03.12-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.13-x86_64-1.txz b/archive/community.applications-2021.03.13-x86_64-1.txz deleted file mode 100644 index cee409a6..00000000 Binary files a/archive/community.applications-2021.03.13-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.15-x86_64-1.txz b/archive/community.applications-2021.03.15-x86_64-1.txz deleted file mode 100644 index 6d504c7e..00000000 Binary files a/archive/community.applications-2021.03.15-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.25-x86_64-1.txz b/archive/community.applications-2021.03.25-x86_64-1.txz deleted file mode 100644 index e290943f..00000000 Binary files a/archive/community.applications-2021.03.25-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.27-x86_64-1.txz b/archive/community.applications-2021.03.27-x86_64-1.txz deleted file mode 100644 index c25cbe5d..00000000 Binary files a/archive/community.applications-2021.03.27-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.27a-x86_64-1.txz b/archive/community.applications-2021.03.27a-x86_64-1.txz deleted file mode 100644 index d8f14402..00000000 Binary files a/archive/community.applications-2021.03.27a-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.03.28-x86_64-1.txz b/archive/community.applications-2021.03.28-x86_64-1.txz deleted file mode 100644 index eb122207..00000000 Binary files a/archive/community.applications-2021.03.28-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.03-x86_64-1.txz b/archive/community.applications-2021.04.03-x86_64-1.txz deleted file mode 100644 index 1603fa59..00000000 Binary files a/archive/community.applications-2021.04.03-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.08-x86_64-1.txz b/archive/community.applications-2021.04.08-x86_64-1.txz deleted file mode 100644 index 45508a1e..00000000 Binary files a/archive/community.applications-2021.04.08-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.11-x86_64-1.txz b/archive/community.applications-2021.04.11-x86_64-1.txz deleted file mode 100644 index f4d7c3ff..00000000 Binary files a/archive/community.applications-2021.04.11-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.17-x86_64-1.txz b/archive/community.applications-2021.04.17-x86_64-1.txz deleted file mode 100644 index 1bdb5092..00000000 Binary files a/archive/community.applications-2021.04.17-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.18-x86_64-1.txz b/archive/community.applications-2021.04.18-x86_64-1.txz deleted file mode 100644 index d716e7f0..00000000 Binary files a/archive/community.applications-2021.04.18-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.19-x86_64-1.txz b/archive/community.applications-2021.04.19-x86_64-1.txz deleted file mode 100644 index bf6e6602..00000000 Binary files a/archive/community.applications-2021.04.19-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.22-x86_64-1.txz b/archive/community.applications-2021.04.22-x86_64-1.txz deleted file mode 100644 index 618c82ca..00000000 Binary files a/archive/community.applications-2021.04.22-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.23-x86_64-1.txz b/archive/community.applications-2021.04.23-x86_64-1.txz deleted file mode 100644 index 93bf31f8..00000000 Binary files a/archive/community.applications-2021.04.23-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.28-x86_64-1.txz b/archive/community.applications-2021.04.28-x86_64-1.txz deleted file mode 100644 index f083152f..00000000 Binary files a/archive/community.applications-2021.04.28-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.04.29-x86_64-1.txz b/archive/community.applications-2021.04.29-x86_64-1.txz deleted file mode 100644 index 640c584f..00000000 Binary files a/archive/community.applications-2021.04.29-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.05-x86_64-1.txz b/archive/community.applications-2021.05.05-x86_64-1.txz deleted file mode 100644 index 0145fbae..00000000 Binary files a/archive/community.applications-2021.05.05-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.09-x86_64-1.txz b/archive/community.applications-2021.05.09-x86_64-1.txz deleted file mode 100644 index 09711c31..00000000 Binary files a/archive/community.applications-2021.05.09-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.11-x86_64-1.txz b/archive/community.applications-2021.05.11-x86_64-1.txz deleted file mode 100644 index 831970fb..00000000 Binary files a/archive/community.applications-2021.05.11-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.16-x86_64-1.txz b/archive/community.applications-2021.05.16-x86_64-1.txz deleted file mode 100644 index 8ee2aedf..00000000 Binary files a/archive/community.applications-2021.05.16-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.16a-x86_64-1.txz b/archive/community.applications-2021.05.16a-x86_64-1.txz deleted file mode 100644 index fa033192..00000000 Binary files a/archive/community.applications-2021.05.16a-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.16b-x86_64-1.txz b/archive/community.applications-2021.05.16b-x86_64-1.txz deleted file mode 100644 index b782f690..00000000 Binary files a/archive/community.applications-2021.05.16b-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.16c-x86_64-1.txz b/archive/community.applications-2021.05.16c-x86_64-1.txz deleted file mode 100644 index 119d2361..00000000 Binary files a/archive/community.applications-2021.05.16c-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.22-x86_64-1.txz b/archive/community.applications-2021.05.22-x86_64-1.txz deleted file mode 100644 index 31ca5293..00000000 Binary files a/archive/community.applications-2021.05.22-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.23-x86_64-1.txz b/archive/community.applications-2021.05.23-x86_64-1.txz deleted file mode 100644 index 0140d87d..00000000 Binary files a/archive/community.applications-2021.05.23-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.25-x86_64-1.txz b/archive/community.applications-2021.05.25-x86_64-1.txz deleted file mode 100644 index a43a29cb..00000000 Binary files a/archive/community.applications-2021.05.25-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.27-x86_64-1.txz b/archive/community.applications-2021.05.27-x86_64-1.txz deleted file mode 100644 index a08036f2..00000000 Binary files a/archive/community.applications-2021.05.27-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.29-x86_64-1.txz b/archive/community.applications-2021.05.29-x86_64-1.txz deleted file mode 100644 index 00bf8654..00000000 Binary files a/archive/community.applications-2021.05.29-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.05.31-x86_64-1.txz b/archive/community.applications-2021.05.31-x86_64-1.txz deleted file mode 100644 index bffaf6f2..00000000 Binary files a/archive/community.applications-2021.05.31-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.04-x86_64-1.txz b/archive/community.applications-2021.06.04-x86_64-1.txz deleted file mode 100644 index 2dd8f51f..00000000 Binary files a/archive/community.applications-2021.06.04-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.05-x86_64-1.txz b/archive/community.applications-2021.06.05-x86_64-1.txz deleted file mode 100644 index 21e9f6fe..00000000 Binary files a/archive/community.applications-2021.06.05-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.06-x86_64-1.txz b/archive/community.applications-2021.06.06-x86_64-1.txz deleted file mode 100644 index 60784fa4..00000000 Binary files a/archive/community.applications-2021.06.06-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.10-x86_64-1.txz b/archive/community.applications-2021.06.10-x86_64-1.txz deleted file mode 100644 index 4615efd3..00000000 Binary files a/archive/community.applications-2021.06.10-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.11-x86_64-1.txz b/archive/community.applications-2021.06.11-x86_64-1.txz deleted file mode 100644 index 0e2d0eb2..00000000 Binary files a/archive/community.applications-2021.06.11-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.13-x86_64-1.txz b/archive/community.applications-2021.06.13-x86_64-1.txz deleted file mode 100644 index 3e056017..00000000 Binary files a/archive/community.applications-2021.06.13-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.21-x86_64-1.txz b/archive/community.applications-2021.06.21-x86_64-1.txz deleted file mode 100644 index 991bc8d2..00000000 Binary files a/archive/community.applications-2021.06.21-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.22-x86_64-1.txz b/archive/community.applications-2021.06.22-x86_64-1.txz deleted file mode 100644 index a966ab10..00000000 Binary files a/archive/community.applications-2021.06.22-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.23-x86_64-1.txz b/archive/community.applications-2021.06.23-x86_64-1.txz deleted file mode 100644 index 14ff9da7..00000000 Binary files a/archive/community.applications-2021.06.23-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.26-x86_64-1.txz b/archive/community.applications-2021.06.26-x86_64-1.txz deleted file mode 100644 index 94fcce3a..00000000 Binary files a/archive/community.applications-2021.06.26-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.06.27-x86_64-1.txz b/archive/community.applications-2021.06.27-x86_64-1.txz deleted file mode 100644 index 43d5bb60..00000000 Binary files a/archive/community.applications-2021.06.27-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.05-x86_64-1.txz b/archive/community.applications-2021.07.05-x86_64-1.txz deleted file mode 100644 index 0d9513b9..00000000 Binary files a/archive/community.applications-2021.07.05-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.09-x86_64-1.txz b/archive/community.applications-2021.07.09-x86_64-1.txz deleted file mode 100644 index 536b180b..00000000 Binary files a/archive/community.applications-2021.07.09-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.10-x86_64-1.txz b/archive/community.applications-2021.07.10-x86_64-1.txz deleted file mode 100644 index c6d68512..00000000 Binary files a/archive/community.applications-2021.07.10-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.12-x86_64-1.txz b/archive/community.applications-2021.07.12-x86_64-1.txz deleted file mode 100644 index 7444e911..00000000 Binary files a/archive/community.applications-2021.07.12-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.13-x86_64-1.txz b/archive/community.applications-2021.07.13-x86_64-1.txz deleted file mode 100644 index 66e43c77..00000000 Binary files a/archive/community.applications-2021.07.13-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.15-x86_64-1.txz b/archive/community.applications-2021.07.15-x86_64-1.txz deleted file mode 100644 index df814831..00000000 Binary files a/archive/community.applications-2021.07.15-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.16-x86_64-1.txz b/archive/community.applications-2021.07.16-x86_64-1.txz deleted file mode 100644 index 721a8f8d..00000000 Binary files a/archive/community.applications-2021.07.16-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.17-x86_64-1.txz b/archive/community.applications-2021.07.17-x86_64-1.txz deleted file mode 100644 index 3b30986c..00000000 Binary files a/archive/community.applications-2021.07.17-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.18-x86_64-1.txz b/archive/community.applications-2021.07.18-x86_64-1.txz deleted file mode 100644 index 096854bb..00000000 Binary files a/archive/community.applications-2021.07.18-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.19-x86_64-1.txz b/archive/community.applications-2021.07.19-x86_64-1.txz deleted file mode 100644 index 2a243ab0..00000000 Binary files a/archive/community.applications-2021.07.19-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.23-x86_64-1.txz b/archive/community.applications-2021.07.23-x86_64-1.txz deleted file mode 100644 index 76b4c635..00000000 Binary files a/archive/community.applications-2021.07.23-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.24-x86_64-1.txz b/archive/community.applications-2021.07.24-x86_64-1.txz deleted file mode 100644 index 706c556d..00000000 Binary files a/archive/community.applications-2021.07.24-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.27-x86_64-1.txz b/archive/community.applications-2021.07.27-x86_64-1.txz deleted file mode 100644 index 0a8395a5..00000000 Binary files a/archive/community.applications-2021.07.27-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.28-x86_64-1.txz b/archive/community.applications-2021.07.28-x86_64-1.txz deleted file mode 100644 index ecd2ce5a..00000000 Binary files a/archive/community.applications-2021.07.28-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.07.31-x86_64-1.txz b/archive/community.applications-2021.07.31-x86_64-1.txz deleted file mode 100644 index aecf5f66..00000000 Binary files a/archive/community.applications-2021.07.31-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.05-x86_64-1.txz b/archive/community.applications-2021.08.05-x86_64-1.txz deleted file mode 100644 index 2b684ef8..00000000 Binary files a/archive/community.applications-2021.08.05-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.06-x86_64-1.txz b/archive/community.applications-2021.08.06-x86_64-1.txz deleted file mode 100644 index f90cde48..00000000 Binary files a/archive/community.applications-2021.08.06-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.07-x86_64-1.txz b/archive/community.applications-2021.08.07-x86_64-1.txz deleted file mode 100644 index e9fb8461..00000000 Binary files a/archive/community.applications-2021.08.07-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.08-x86_64-1.txz b/archive/community.applications-2021.08.08-x86_64-1.txz deleted file mode 100644 index 3bba56e5..00000000 Binary files a/archive/community.applications-2021.08.08-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.08a-x86_64-1.txz b/archive/community.applications-2021.08.08a-x86_64-1.txz deleted file mode 100644 index dd6ddf4e..00000000 Binary files a/archive/community.applications-2021.08.08a-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.10-x86_64-1.txz b/archive/community.applications-2021.08.10-x86_64-1.txz deleted file mode 100644 index 8885ff55..00000000 Binary files a/archive/community.applications-2021.08.10-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.11-x86_64-1.txz b/archive/community.applications-2021.08.11-x86_64-1.txz deleted file mode 100644 index 49cc8b05..00000000 Binary files a/archive/community.applications-2021.08.11-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.12-x86_64-1.txz b/archive/community.applications-2021.08.12-x86_64-1.txz deleted file mode 100644 index ccfe0249..00000000 Binary files a/archive/community.applications-2021.08.12-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.14-x86_64-1.txz b/archive/community.applications-2021.08.14-x86_64-1.txz deleted file mode 100644 index cd78ceb4..00000000 Binary files a/archive/community.applications-2021.08.14-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.15-x86_64-1.txz b/archive/community.applications-2021.08.15-x86_64-1.txz deleted file mode 100644 index a4e333f5..00000000 Binary files a/archive/community.applications-2021.08.15-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.16-x86_64-1.txz b/archive/community.applications-2021.08.16-x86_64-1.txz deleted file mode 100644 index f42c3554..00000000 Binary files a/archive/community.applications-2021.08.16-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.18-x86_64-1.txz b/archive/community.applications-2021.08.18-x86_64-1.txz deleted file mode 100644 index 489352dd..00000000 Binary files a/archive/community.applications-2021.08.18-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.21-x86_64-1.txz b/archive/community.applications-2021.08.21-x86_64-1.txz deleted file mode 100644 index 72ffe644..00000000 Binary files a/archive/community.applications-2021.08.21-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.08.28-x86_64-1.txz b/archive/community.applications-2021.08.28-x86_64-1.txz deleted file mode 100644 index 846d1dbd..00000000 Binary files a/archive/community.applications-2021.08.28-x86_64-1.txz and /dev/null differ diff --git a/archive/community.applications-2021.10.17-x86_64-1.txz b/archive/community.applications-2021.10.17-x86_64-1.txz new file mode 100644 index 00000000..eed46ee8 Binary files /dev/null and b/archive/community.applications-2021.10.17-x86_64-1.txz differ diff --git a/plugins/community.applications.plg b/plugins/community.applications.plg index 6a28cf6a..d98ca386 100644 --- a/plugins/community.applications.plg +++ b/plugins/community.applications.plg @@ -2,17 +2,42 @@ - - + + ]> - + +###2021.10.17 +- Complete overhaul of GUI +- Fixed: Disable categories after performing a dockerHub search +- Removed: Compatibility with OS versions prior to 6.9.0 +- Fixed: Attempting to sort a repository display would return errors if only a single repository was present +- Added: When installing a second instance, automatically change the app name +- Changed: Priority of support options is now Project, Discord, Support Forum +- Removed: Help text (unnecessary with replacement GUI) +- Fixed: Setting a favourite repository would change all of CA's settings back to defaults +- Added: Support ReadMe files on templates +- Fixed: Multiple instances of apps installed using the same tag would only appear once within installed apps +- Removed: dockerHub searches (See release post) +- Fixed: All steamcmd apps would show as being installed if any of them were. +- Changed: Dim background on any sweet alerts (eg: choose branch) +- Fixed: Display aberrations if app's name didn't fit within designated area +- Fixed: Entering a search term (but not searching for it) followed by selecting a category would return errors +- Added: Languages show up within Installed Apps (plugins subsection) +- Added: Identification of apps which are currently installed +- Fixed: Second instance would show up within Previous Apps (and give installed options) if original instance was installed, then second instance was not installed and both used the same tag +- Added: Fatal error if docker image / folder is either completely full or mounted read-only +- Fixed: Hover area / click area of left menus extended into blank area to the right +- Fixed: Deleting the entire private repository storage location (/boot/config/plugins/community.applications/private) would result in the private applications still appearing until the next appfeed update +- Fixed: Various issues related to installing 2nd instances +- Rediscovered: A profound appreciation of the phrase 'Nothing takes 5 minutes' + ###2021.08.31 - Security updates - Fixed: Always reload CA if installing language updates diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/Apps.page b/source/community.applications/usr/local/emhttp/plugins/community.applications/Apps.page index 0fd53fca..13d944e0 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/Apps.page +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/Apps.page @@ -3,3 +3,2161 @@ Name="Apps" Type="xmenu" Tabs="true" Code="e942" +--- +"); + +// Check md5's of files +exec("cd /usr/local/emhttp/plugins/$plugin/ && md5sum -c ca.md5",$output,$md5Error); + +$previousLocale = $_COOKIE["locale"]; + +switch ($theme) { + case 'black': + $swalBackground = "black"; + $tooltipsterContent = "#f2f2f2"; + $chartGrid = "#222222"; + break; + case 'azure': + $swalBackground = "white"; + $tooltipsterContent = "#101010"; + $chartGrid = "#dddddd"; + + break; + case 'gray': + $swalBackground = "black"; + $tooltipsterContent = "#f2f2f2"; + $chartGrid = "#222222"; + break; + case 'white': + $swalBackground = "white"; + $tooltipsterContent = "#101010"; + $chartGrid = "#dddddd"; + break; + default: + $swalBackground = "black"; // default to black. This should only be when someone adds a new theme. It is NOT the default that the OS uses + $tooltipsterContent = "#f2f2f2"; + $chartGrid = "#222222"; + break; +} + +if ( is_file($caPaths['addConverted']) ) { + $dockerConvertFlag = "true"; +} +$date = (date("n/d")); + +$startupDisplayed = is_file($caPaths['startupDisplayed']) ? "true" : "false"; +if ( $startupDisplayed == "true" && $_COOKIE['ca_languageSwitch'] ) { + $killCookie = "true"; +} + +// Only check for updates to containers / plugins max once per hour +exec("mkdir -p {$caPaths['tempFiles']}"); +if ( $cfg['updateCheck'] == "yes" ) { + if ( ( time() - @filemtime($caPaths['updateTime']) ) > 3600 ) { + touch($caPaths['updateTime']); + exec("echo '/usr/local/emhttp/plugins/community.applications/scripts/checkForUpdates.php >/dev/null 2>&1' | at now >/dev/null"); + } +} + +function tr($string,$ret=false) { + $string = str_replace('"',""",str_replace("'","'",_($string))); + if ( $ret ) + return $string; + else + echo $string; +} + +?> + +" > + + + + + + + + + + + + diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/CommunityApps.page b/source/community.applications/usr/local/emhttp/plugins/community.applications/CommunityApps.page deleted file mode 100644 index 805d7af4..00000000 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/CommunityApps.page +++ /dev/null @@ -1,2091 +0,0 @@ -Menu="Apps" -Icon="community.applications.png" -Title="Community Applications" -Tag="users" ---- -"); -$unRaid68 = version_compare($unRaidSettings['version'],"6.7.9",">"); -$unRaid69 = version_compare($unRaidSettings['version'],"6.8.2",">"); -$translations = is_file("$docroot/plugins/dynamix/include/Translations.php"); -$unRaid69B2 = version_compare($unRaidSettings['version'],"6.9.0-beta1",">"); -$unRaid610 = version_compare($unRaidSettings['version'],"6.10.0-beta17",">"); - -// Check md5's of files -exec("cd /usr/local/emhttp/plugins/$plugin/ && md5sum -c ca.md5",$output,$md5Error); - -$previousLocale = $_COOKIE["locale"]; - -if ( $unRaid69B2 ) { - switch ($theme) { - case 'black': - $swalBackground = "black"; - $tooltipsterContent = "#f2f2f2"; - break; - case 'azure': - $swalBackground = "white"; - $tooltipsterContent = "#101010"; - break; - case 'gray': - $swalBackground = "black"; - $tooltipsterContent = "#f2f2f2"; - break; - case 'white': - $swalBackground = "white"; - $tooltipsterContent = "#101010"; - break; - default: - $swalBackground = "black"; // default to black. This should only be when someone adds a new theme. It is NOT the default that the OS uses - $tooltipsterContent = "#f2f2f2"; - break; - } -} else { - $swalBackground = "white"; -} - -if ( is_file($caPaths['addConverted']) ) { - $dockerConvertFlag = "true"; -} -$date = (date("n/d")); - -// Only check for updates to containers / plugins max once per hour -exec("mkdir -p {$caPaths['tempFiles']}"); -if ( $cfg['updateCheck'] == "yes" ) { - if ( ( time() - @filemtime($caPaths['updateTime']) ) > 3600 ) { - touch($caPaths['updateTime']); - exec("echo '/usr/local/emhttp/plugins/community.applications/scripts/checkForUpdates.php >/dev/null 2>&1' | at now >/dev/null"); - } -} - -function tr($string,$ret=false) { - if ( function_exists("_") ) - $string = str_replace('"',""",str_replace("'","'",_($string))); - if ( $ret ) - return $string; - else - echo $string; -} - -?> - - - -" > - - - - - - - - - - - ->
->
->
->
->
->
->
->
->
->
->
->
->
->
-> -> - - - diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/ca.md5 b/source/community.applications/usr/local/emhttp/plugins/community.applications/ca.md5 index 10fb28c1..b9ad6d01 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/ca.md5 +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/ca.md5 @@ -1,22 +1,15 @@ -767d6f2203fed9541daeb57bbf7b58b3 ./Apps.page +9c0350429bd1d79fe3e43b7100755e3a ./Apps.page 83b3f89cd42e8601c7c217d5b4889c81 ./CA_notices.page -2cdb7da0d67a11278ada7fd029707738 ./ca_settings.page -6da0e468ad8553d9e4882c5ff4ffd814 ./CommunityApps.page -7c88ace586933a4a60b0ef2f8a97a662 ./default.cfg -4344942541019c3b5464d508c7f0dd30 ./images/community.applications.png -6e48a62b91bdd066f023f46c6b491afd ./images/discord-azure.svg -389e13f48a67895377189b855b950497 ./images/discord-black.svg -6e48a62b91bdd066f023f46c6b491afd ./images/discord-gray.svg -8e7dc33512b8a78f28d7179a972c7c34 ./images/discord-hover.svg -54e46db492ddb033dfeb2827c5efd4a8 ./images/discord-white.svg -5aa58127b80715b769bcfd4634b89f34 ./include/exec.php -00068044737bb1c08f2c0bad98b97646 ./include/helpers.php -3893704ad833c765384c5fcf3147a7f7 ./include/paths.php +a7d2bd7a00a40feea38c424b3ab3af78 ./ca_settings.page +1a8d4d4ff5e8ddf8e911280e39e3d10d ./default.cfg +185a4f43f645d444ffd4a79bac3106ca ./include/exec.php +881abd00cf784d706bba6a06f3b8c810 ./include/helpers.php +4eaa5bd1f2e88781133c1571a81e6d0c ./include/paths.php eb76c1b6ed3da5e5b393f22d2ec18430 ./javascript/libraries.js 8c24d585c7dd3ff9ef961bb2c2705711 ./PluginAPI.page b398273cf7daa62ab00d2de2336ca25f ./README.md 717f49d6faabd7e1d7cf0940beb5cd5e ./scripts/checkForUpdates.php -c83dee5045392761136e6330e896d959 ./scripts/installMulti.php +1e2b902321d4bb7efe0d0b78c8130a73 ./scripts/installMulti.php 2242d19776185c3f99e4dbc8bdc3a8d9 ./scripts/installMultiPlugin.php 524afab04ca930f59117a846f819fb2f ./scripts/installPluginUpdate.sh 92028dcc61f62158cbc7064e6143d287 ./scripts/installUpdate.php @@ -24,9 +17,9 @@ c83dee5045392761136e6330e896d959 ./scripts/installMulti.php 729c178196af99c94116246f0c8be7a5 ./scripts/notices.php 430966e5646376b62905b63a30de7102 ./scripts/PluginAPI.php 9c7608a4a2cf279c8a2af88960e1642d ./scripts/pluginInstall.php -f9c3f431935fb20801f3fef152dc7b58 ./scripts/showStatistics.php +9eba209fba4bbf1a02e57ddafebfdf8c ./scripts/showStatistics.php 4425f8fd4ef662a7dc65cee01de3e419 ./scripts/updatePLG.sh -02759ea835ee4ce5a051fead96ab9b9b ./scripts/updatePluginSupport.php -a3d43f2efec8a7435e32f6c7d31b5d16 ./skins/Narrow/css.php -b5bfdf941393ebfa940ab4b0518bd9ff ./skins/Narrow/skin.html -e3597826774e1f7daefa33cd913da38e ./skins/Narrow/skin.php +2bd671daecaf01549f8cc0202cb184b3 ./scripts/updatePluginSupport.php +289acc42c9cde7699c9c6f6e2815c6e1 ./skins/Narrow/css.php +4ff34c148d3dde1a420303faecd414ae ./skins/Narrow/skin.html +0dec26e10cd9028694cd1fb24226740b ./skins/Narrow/skin.php diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/ca_settings.page b/source/community.applications/usr/local/emhttp/plugins/community.applications/ca_settings.page index 14eb7b8b..b71f6052 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/ca_settings.page +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/ca_settings.page @@ -1,6 +1,5 @@ Menu="hidden" Title="Community Applications" -Icon="community.applications.png" --- - + : - - - - -> - : + + + + +> +   : " id='Apply'>" onclick="done()"> diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/default.cfg b/source/community.applications/usr/local/emhttp/plugins/community.applications/default.cfg index de2e7b01..b1acd996 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/default.cfg +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/default.cfg @@ -1,7 +1,7 @@ hideIncompatible="true" -dockerSearch="no" hideDeprecated="true" defaultReinstall="false" notifications="no" debugging="no" -updateCheck="yes" \ No newline at end of file +updateCheck="yes" +dev="no" \ No newline at end of file diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/community.applications.png b/source/community.applications/usr/local/emhttp/plugins/community.applications/images/community.applications.png deleted file mode 100644 index e132e309..00000000 Binary files a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/community.applications.png and /dev/null differ diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-azure.svg b/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-azure.svg deleted file mode 100644 index e5ef8f36..00000000 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-azure.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-black.svg b/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-black.svg deleted file mode 100644 index dd8ae4e0..00000000 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-black.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-gray.svg b/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-gray.svg deleted file mode 100644 index e5ef8f36..00000000 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-gray.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-hover.svg b/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-hover.svg deleted file mode 100644 index 72f2e5fe..00000000 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-hover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-white.svg b/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-white.svg deleted file mode 100644 index 031c66c3..00000000 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/images/discord-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/include/exec.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/include/exec.php index 678adea9..b584e8f4 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/include/exec.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/include/exec.php @@ -6,16 +6,13 @@ # # ############################################################### $unRaidSettings = parse_ini_file("/etc/unraid-version"); - ### Translations section has to be first so that nothing else winds up caching the file(s) $docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: "/usr/local/emhttp"; -$translationsAllowed = is_file("$docroot/plugins/dynamix/include/Translations.php"); -if ( $translationsAllowed ) { - $_SERVER['REQUEST_URI'] = "docker/apps"; - require_once("$docroot/plugins/dynamix/include/Translations.php"); -} +$_SERVER['REQUEST_URI'] = "docker/apps"; + +require_once("$docroot/plugins/dynamix/include/Translations.php"); require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php"; # must be first include due to paths defined require_once "$docroot/plugins/community.applications/include/paths.php"; @@ -31,9 +28,10 @@ require_once "$docroot/webGui/include/Markdown.php"; $caSettings = parse_plugin_cfg("community.applications"); -$caSettings['maxPerPage'] = isMobile() ? 12 : 24; +$caSettings['dockerSearch'] = "yes"; +$caSettings['maxPerPage'] = 18; $caSettings['unRaidVersion'] = $unRaidSettings['version']; -$caSettings['favourite'] = str_replace("*","'",$caSettings['favourite']); +$caSettings['favourite'] = str_replace("*","'",$caSettings['favourite']); if ( ! is_file($caPaths['warningAccepted']) ) $caSettings['NoInstalls'] = true; @@ -62,6 +60,7 @@ if ($caSettings['debugging'] == "yes") { $caVersion = plugin("version","/var/log/plugins/community.applications.plg"); file_put_contents($caPaths['logging'],"Community Applications Version: $caVersion\n"); + file_put_contents($caPaths['logging'],"Unraid version: {$caSettings['unRaidVersion']}\n\n",FILE_APPEND); file_put_contents($caPaths['logging'],"MD5's: \n".shell_exec("cd /usr/local/emhttp/plugins/community.applications && md5sum -c ca.md5")."\n",FILE_APPEND); $lingo = $_SESSION['locale'] ?: "en_US"; file_put_contents($caPaths['logging'],"Language: $lingo\n\n",FILE_APPEND); @@ -75,7 +74,6 @@ if ( ! $sortOrder ) { $sortOrder['sortDir'] = "Up"; writeJsonFile($caPaths['sortOrder'],$sortOrder); } - ############################################ ## ## ## BEGIN MAIN ROUTINES CALLED BY THE HTML ## @@ -92,12 +90,6 @@ switch ($_POST['action']) { case 'display_content': display_content(); break; - case 'convert_docker': - convert_docker(); - break; - case 'search_dockerhub': - search_dockerhub(); - break; case 'dismiss_warning': dismiss_warning(); break; @@ -179,6 +171,9 @@ switch ($_POST['action']) { case 'javascriptError': javascriptError(); break; + case 'onStartupScreen': + onStartupScreen(); + break; ############################################### # Return an error if the action doesn't exist # ############################################### @@ -189,7 +184,7 @@ switch ($_POST['action']) { # DownloadApplicationFeed MUST BE CALLED prior to DownloadCommunityTemplates in order for private repositories to be merged correctly. function DownloadApplicationFeed() { - global $caPaths, $caSettings, $statistics, $translationsAllowed; + global $caPaths, $caSettings, $statistics; exec("rm -rf '{$caPaths['tempFiles']}'"); @mkdir($caPaths['templates-community'],0777,true); @@ -218,10 +213,7 @@ function DownloadApplicationFeed() { $invalidXML[] = $o; continue; } - if ( ! $translationsAllowed && $o['Language'] ) { - $invalidXML[] = $o; - continue; - } + unset($o['Category']); if ( $o['CategoryList'] ) { foreach ($o['CategoryList'] as $cat) { @@ -232,6 +224,8 @@ function DownloadApplicationFeed() { } } $o['Category'] = trim($o['Category']); + if ( $o['RecommendedDate'] ) + $o['Category'] .= " spotlight:"; if ( $o['Language'] ) { $o['Category'] = "Language:"; @@ -247,18 +241,16 @@ function DownloadApplicationFeed() { $o['SortAuthor'] = $o['Author']; $o['SortName'] = str_replace("-"," ",$o['Name']); $o['SortName'] = preg_replace('/\s+/',' ',$o['SortName']); + $o['random'] = rand(); $des = $o['OriginalOverview'] ?: $o['Overview']; $des = $o['Language'] ? $o['Description'] : $des; if ( ! $des && $o['Description'] ) $des = $o['Description']; - $des = str_replace(["[","]"],["<",">"],$des); - $des = str_replace("\n"," ",$des); - $des = html_entity_decode($des); - - $o['CardDescription'] = strip_tags(markdown(trim($des)),$o['Language'] ? "
" : ""); - - if ( $o['IconHTTPS'] ) - $o['IconHTTPS'] = $caPaths['iconHTTPSbase'] .$o['IconHTTPS']; + if ( ! $Language ) { + $des = str_replace(["[","]"],["<",">"],$des); + $des = str_replace("\n"," ",$des); + $des = html_entity_decode($des); + } if ( $o['PluginURL'] ) { $o['Author'] = $o['PluginAuthor']; @@ -370,6 +362,7 @@ function getConvertedTemplates() { $templates = readJsonFile($caPaths['community-templates-info']); if ( empty($templates) ) return false; + exec("logger getConvertedTemplates"); foreach ($templates as $template) { if ( ! $template['Private'] ) @@ -379,7 +372,10 @@ function getConvertedTemplates() { $i = $appCount; unset($Repos); - if ( ! is_dir($caPaths['convertedTemplates']) ) return; + if ( ! is_dir($caPaths['convertedTemplates']) ) { + writeJsonFile($caPaths['community-templates-info'],$myTemplates); + return; + } $privateTemplates = glob($caPaths['convertedTemplates']."*/*.xml"); foreach ($privateTemplates as $template) { @@ -399,7 +395,6 @@ function getConvertedTemplates() { $myTemplates[$i] = $o; $i = ++$i; } - writeJsonFile($caPaths['community-templates-info'],$myTemplates); return true; } @@ -439,16 +434,6 @@ function appOfDay($file) { } writeJsonFile($caPaths['appOfTheDay'],$appOfDay); break; - case "new": - $sortOrder['sortBy'] = "Date"; - $sortOrder['sortDir'] = "Down"; - usort($file,"mySort"); - foreach ($file as $template) { - if ( ! checkRandomApp($template) ) continue; - $appOfDay[] = $template['ID']; - if (count($appOfDay) == 25) break; - } - break; case "onlynew": $sortOrder['sortBy'] = "FirstSeen"; $sortOrder['sortDir'] = "Down"; @@ -467,12 +452,16 @@ function appOfDay($file) { $sortOrder['sortBy'] = "trending"; $sortOrder['sortDir'] = "Down"; usort($file,"mySort"); + $repos = []; foreach ($file as $template) { if ( ! is_array($template['trends']) ) continue; if ( count($template['trends']) < 6 ) continue; if ( startsWith($template['Repository'],"ich777/steamcmd") ) continue; // because a ton of apps all use the same repo if ( $template['trending'] && ($template['downloads'] > 100000) ) { if ( checkRandomApp($template) ) { + if ( in_array($template['Repository'],$repos) ) + continue; + $repos[] = $template['Repository']; $appOfDay[] = $template['ID']; if ( count($appOfDay) == 25 ) break; } @@ -483,17 +472,35 @@ function appOfDay($file) { $sortOrder['sortBy'] = "trendDelta"; $sortOrder['sortDir'] = "Down"; usort($file,"mySort"); + $repos = []; foreach ($file as $template) { if ( count($template['trends'] ) < 3 ) continue; if ( startsWith($template['Repository'],"ich777/steamcmd") ) continue; // because a ton of apps all use the same repo` if ( $template['trending'] && ($template['downloads'] > 10000) ) { if ( checkRandomApp($template) ) { + if ( in_array($template['Repository'],$repos) ) + continue; + $repos[] = $template['Repository']; $appOfDay[] = $template['ID']; if ( count($appOfDay) == 25 ) break; } } } break; + case "spotlight": + $sortOrder['sortBy'] = "RecommendedDate"; + $sortOrder['sortDir'] = "Down"; + usort($file,"mySort"); + foreach($file as $template) { + if ($template['RecommendedDate']) { + $appOfDay[] = $template['ID']; + if ( count($appOfDay) == 25 ) break; + } else { + break; + } + } + break; + } return $appOfDay ?: array(); } @@ -511,7 +518,7 @@ function checkRandomApp($test,$info=array(),$random=false) { if ( $test['Blacklist'] ) return false; if ( $test['Deprecated'] && ( $caSettings['hideDeprecated'] == "true" ) ) return false; if ( $random ) return ! appInstalled($test,$info); - + return true; } ############################################################## @@ -612,10 +619,8 @@ function get_content() { $newAppTime = strtotime($caSettings['timeNew']); - if ( file_exists($caPaths['addConverted']) ) { - @unlink($caPaths['addConverted']); - getConvertedTemplates(); - } + getConvertedTemplates(); + if ( strpos($category,":") && $filter ) { $disp = readJsonFile($caPaths['community-templates-allSearchResults']); $file = $disp['community']; @@ -626,43 +631,105 @@ function get_content() { if ( $category === "/NONE/i" ) { file_put_contents($caPaths['startupDisplayed'],"startup"); - $displayApplications = array(); + $displayApplications = []; + $displayApplications['community'] = []; if ( count($file) > 200) { - $appsOfDay = appOfDay($file); + $startupTypes = [ - $displayApplications['community'] = array(); - for ($i=0;$i<$caSettings['maxPerPage'];$i++) { - if ( ! $appsOfDay[$i]) continue; - $file[$appsOfDay[$i]]['NewApp'] = ($caSettings['startup'] != "random"); - $displayApplications['community'][] = $file[$appsOfDay[$i]]; - } - if ( $displayApplications['community'] ) { - writeJsonFile($caPaths['community-templates-displayed'],$displayApplications); - @unlink($caPaths['community-templates-allSearchResults']); - @unlink($caPaths['community-templates-catSearchResults']); - $o['display'] = my_display_apps($displayApplications['community'],"1"); - $o['script'] = "$('#templateSortButtons,#sortButtons').hide();enableIcon('#sortIcon',false);"; - postReturn($o); - return; - } else { - switch ($caSettings['startup']) { - case "onlynew": - $startupType = "New"; break; - case "new": - $startupType = "Updated"; break; - case "trending": - $startupType = "Top Performing"; break; - case "random": - $startupType = "Random"; break; - case "upandcoming": - $startupType = "Trending"; break; + [ + "type"=>"onlynew", + "text1"=>tr("Recently Added"), + "text2"=>tr("Check out these newly added applications from our awesome community"), + "cat"=>"All", + "sortby"=>"FirstSeen", + "sortdir"=>"Down" + ], + [ + "type"=>"spotlight", + "text1"=>tr("Spotlight Apps"), + "text2"=>tr("Each month we highlight some of the amazing work from our community"), + "cat"=>"spotlight:", + "sortby"=> "RecommendedDate", + "sortdir"=> "Down", + "class"=>"spotlightHome" + ], + [ + "type"=>"trending", + "text1"=>tr("Top Trending Apps"), + "text2"=>tr("Check out these up and coming apps"), + "cat"=>"All", + "sortby"=>"topTrending", + "sortdir"=>"Down" + ], + [ + "type"=>"topperforming", + "text1"=>tr("Top New Installs"), + "text2"=>tr("These apps have the highest percentage of new installs"), + "cat"=>"All", + "sortby"=>"topPerforming", + "sortdir"=>"Down" + ], + [ + "type"=>"random", + "text1"=>tr("Random Apps"), + "text2"=>tr("An assortment of randomly chosen apps"), + "cat"=>"All", + "sortby"=>"random", + "sortdir"=>"Down" + ] + ]; + foreach ($startupTypes as $type) { + $display = []; + $caSettings['startup'] = $type['type']; + $appsOfDay = appOfDay($file); + + for ($i=0;$i<$caSettings['maxPerPage'];$i++) { + if ( ! $appsOfDay[$i]) continue; + $file[$appsOfDay[$i]]['NewApp'] = ($caSettings['startup'] != "random"); + $spot = $file[$appsOfDay[$i]]; + $spot['class'] = $type['class']; + + $displayApplications['community'][] = $spot; + $display[] = $spot; } + if ( $displayApplications['community'] ) { - $o['display'] = "
".sprintf(tr("An error occurred. Could not find any %s Apps"),$startupType)."

"; - $o['script'] = "$('#templateSortButtons,#sortButtons').hide();enableIcon('#sortIcon',false);"; - postReturn($o); - return; + $o['display'] .= "
{$type['text1']}
"; + $o['display'] .= "
{$type['text2']} "; + if ( $type['cat'] ) + $o['display'] .= "".tr("SHOW MORE"); + $o['display'] .= "
"; + $homeClass = $type['type'] == "spotlight" ? "caHomeSpotlight" : ""; + $o['display'] .= "
".my_display_apps($display,"1")."
"; + $o['script'] = "$('#templateSortButtons,#sortButtons').hide();$('.ca_holder').addClass('mobileHolderFix');"; + + } else { + switch ($caSettings['startup']) { + case "onlynew": + $startupType = "New"; break; + case "new": + $startupType = "Updated"; break; + case "trending": + $startupType = "Top Performing"; break; + case "random": + $startupType = "Random"; break; + case "upandcoming": + $startupType = "Trending"; break; + } + + $o['display'] .= "
".sprintf(tr("An error occurred. Could not find any %s Apps"),$startupType)."

"; + $o['script'] = "$('#templateSortButtons,#sortButtons').hide();"; + + writeJsonFile($caPaths['community-templates-displayed'],$displayApplications); + postReturn($o); + return; + } } + @unlink($caPaths['community-templates-allSearchResults']); + @unlink($caPaths['community-templates-catSearchResults']); + writeJsonFile($caPaths['community-templates-displayed'],$displayApplications); + postReturn($o); + return; } } else { @unlink($caPaths['startupDisplayed']); @@ -704,7 +771,12 @@ function get_content() { $template['NewApp'] = $newApp; - if ( $category && ! preg_match($category,$template['Category'])) continue; + if ( $category && ! preg_match($category,$template['Category'])) { + continue; + } + if ( $category == "/spotlight:/i" ) + $template['class'] = "spotlightHome"; + if ( $displayPrivates && ! $template['Private'] ) continue; if ($filter) { @@ -716,28 +788,16 @@ function get_content() { continue; } if ( filterMatch($filter,array($template['SortName'])) && $caSettings['favourite'] == $template['RepoName']) { - $template['Name_highlighted'] = highlight($filter,$template['Name']); $searchResults['favNameHit'][] = $template; continue; } if ( filterMatch($filter,array($template['SortName'],$template['RepoName'],$template['Language'],$template['LanguageLocal'],$template['ExtraSearchTerms'])) ) { - $template['Name_highlighted'] = highlight($filter,$template['Name']); - $template['Description'] = highlight($filter, $template['Description']); - $template['Author'] = highlight($filter, $template['Author']); - $template['CardDescription'] = highlight($filter,$template['CardDescription']); - $template['RepoName_highlighted'] = highlight($filter,$template['RepoName']); - if ($template['Language']) { - $template['Language'] = highlight($filter,$template['Language']); - $template['LanguageLocal'] = highlight($filter,$template['LanguageLocal']); - } + if ( filterMatch($filter,array($template['ExtraSearchTerms'])) && $template['Plugin'] && $template['Author'] == "limetech" ) $searchResults['extraHit'][] = $template; else $searchResults['nameHit'][] = $template; - } else if ( filterMatch($filter,array($template['Author'],$template['CardDescription'],$template['translatedCategories'])) ) { - $template['Description'] = highlight($filter, $template['Description']); - $template['Author'] = highlight($filter, $template['Author']); - $template['CardDescription'] = highlight($filter,$template['CardDescription']); + } elseif ( filterMatch($filter,array($template['Author'],$template['Overview'],$template['translatedCategories'])) ) { if ( $template['RepoName'] == $caSettings['favourite'] ) { $searchResults['nameHit'][] = $template; } else { @@ -792,7 +852,7 @@ function get_content() { @unlink($caPaths['community-templates-allsearchResults']); @unlink($caPaths['community-templates-catSearchResults']); } - $o['display'] = display_apps(); + $o['display'] = "
".display_apps()."
"; postReturn($o); } @@ -868,7 +928,7 @@ function display_content() { $o['display'] = ""; if ( file_exists($caPaths['community-templates-displayed']) || file_exists($caPaths['repositoriesDisplayed']) ) { - $o['display'] = display_apps($pageNumber,$selectedApps,$startup); + $o['display'] = "
".display_apps($pageNumber,$selectedApps,$startup)."
"; } $displayedApps = readJsonFile($caPaths['community-templates-displayed']); @@ -877,97 +937,6 @@ function display_content() { postReturn($o); } -####################################################################### -# convert_docker - called when system adds a container from dockerHub # -####################################################################### -function convert_docker() { - global $caPaths; - - $dockerID = getPost("ID",""); - - $file = readJsonFile($caPaths['dockerSearchResults']); - $docker = $file['results'][$dockerID]; - $docker['Description'] = str_replace("&", "&", $docker['Description']); - @unlink($caPaths['Dockerfile']); - - $dockerfile['Name'] = $docker['Name']; - $dockerfile['Support'] = $docker['DockerHub']; - $dockerfile['Description'] = $docker['Description']." Converted By Community Applications Always verify this template (and values) against the dockerhub support page for the container"; - $dockerfile['Overview'] = $dockerfile['Description']; - $dockerfile['Registry'] = $docker['DockerHub']; - $dockerfile['Repository'] = $docker['Repository']; - $dockerfile['BindTime'] = "true"; - $dockerfile['Privileged'] = "false"; - $dockerfile['Networking']['Mode'] = "bridge"; - $dockerfile['Icon'] = "/plugins/dynamix.docker.manager/images/question.png"; - $dockerXML = makeXML($dockerfile); - - $xmlFile = $caPaths['convertedTemplates']."DockerHub/"; - @mkdir($xmlFile,0777,true); - $xmlFile .= str_replace("/","-",$docker['Repository']).".xml"; - file_put_contents($xmlFile,$dockerXML); - file_put_contents($caPaths['addConverted'],"Dante"); - postReturn(['xml'=>$xmlFile]); -} - -######################################################### -# search_dockerhub - returns the results from dockerHub # -######################################################### -function search_dockerhub() { - global $caPaths; - - $filter = getPost("filter",""); - $pageNumber = getPost("page","1"); - - $communityTemplates = readJsonFile($caPaths['community-templates-info']); - $filter = str_replace(" ","%20",$filter); - $filter = str_replace("/","%20",$filter); - $jsonPage = shell_exec("curl -s -X GET 'https://registry.hub.docker.com/v1/search?q=$filter&page=$pageNumber'"); - $pageresults = json_decode($jsonPage,true); - $num_pages = $pageresults['num_pages']; - - if ($pageresults['num_results'] == 0) { - $o['display'] = "
".tr("No Matching Applications Found On Docker Hub")."
"; - $o['script'] = "$('#dockerSearch').hide();"; - postReturn($o); - @unlink($caPaths['dockerSerchResults']); - return; - } - - $i = 0; - foreach ($pageresults['results'] as $result) { - unset($o); - $o['Repository'] = $result['name']; - $details = explode("/",$result['name']); - $o['Author'] = $details[0]; - $o['Name'] = $details[1]; - $o['Description'] = $result['description']; - $o['CardDescription'] = $o['Description']; - $o['Automated'] = $result['is_automated']; - $o['Stars'] = $result['star_count']; - $o['Official'] = $result['is_official']; - $o['Trusted'] = $result['is_trusted']; - if ( $o['Official'] ) { - $o['DockerHub'] = "https://hub.docker.com/_/".$result['name']."/"; - $o['Name'] = $o['Author']; - } else - $o['DockerHub'] = "https://hub.docker.com/r/".$result['name']."/"; - - $o['ID'] = $i; - $searchName = str_replace("docker-","",$o['Name']); - $searchName = str_replace("-docker","",$searchName); - - $dockerResults[$i] = $o; - $i=++$i; - } - $dockerFile['num_pages'] = $num_pages; - $dockerFile['page_number'] = $pageNumber; - $dockerFile['results'] = $dockerResults; - - writeJsonFile($caPaths['dockerSearchResults'],$dockerFile); - postReturn(['display'=>displaySearchResults($pageNumber)]); -} - ##################################################################### # dismiss_warning - dismisses the warning from appearing at startup # ##################################################################### @@ -992,7 +961,6 @@ function previous_apps() { $installed = getPost("installed",""); $filter = getPost("filter",""); -// $dockerUpdateStatus = readJsonFile($caPaths['dockerUpdateStatus']); $info = $caSettings['dockerRunning'] ? $DockerClient->getDockerContainers() : array(); @unlink($caPaths['community-templates-allSearchResults']); @@ -1001,7 +969,6 @@ function previous_apps() { @unlink($caPaths['startupDisplayed']); $file = readJsonFile($caPaths['community-templates-info']); - # $info contains all installed containers # now correlate that to a template; # this section handles containers that have not been renamed from the appfeed @@ -1017,7 +984,6 @@ function previous_apps() { $o['CardDescription'] = $o['Overview']; $o['InstallPath'] = $xmlfile; $o['UnknownCompatible'] = true; - $flag = false; $containerID = false; foreach ($file as $templateDocker) { @@ -1035,8 +1001,8 @@ function previous_apps() { foreach ($info as $installedDocker) { $installedImage = str_replace("library/","",$installedDocker['Image']); $installedName = $installedDocker['Name']; - if ( startsWith($installedImage, $o['Repository']) ) { - if ( $installedName == $o['Name'] ) { + if ( $installedName == $o['Name'] ) { + if ( startsWith($installedImage, $o['Repository']) ) { $runningflag = true; $searchResult = searchArray($file,'Repository',$o['Repository']); if ( ! $searchResult ) { @@ -1052,9 +1018,6 @@ function previous_apps() { $o['CardDescription'] = $tmpOvr; $o['InstallPath'] = $tempPath; $o['SortName'] = str_replace("-"," ",$installedName); -/* if ( $dockerUpdateStatus[$installedImage]['status'] == "false" || $dockerUpdateStatus[$template['Name']] == "false" ) { - $o['UpdateAvailable'] = true; - } */ } break; } @@ -1067,12 +1030,12 @@ function previous_apps() { # handle a PR from LT where it is possible for an identical template (xml) to be present twice, with different filenames. # Without this, an app could appear to be shown in installed apps twice - $fat32Fix[$searchResult]++; - if ($fat32Fix[$searchResult] > 1) continue; +/* $fat32Fix[$searchResult]++; + if ($fat32Fix[$searchResult] > 1) continue; */ if ($o['testrepo']) continue; $displayed[] = $o; } - } + } } } } else { @@ -1120,7 +1083,7 @@ function previous_apps() { break; } } - + if ( ! $o['Blacklist'] ) $displayed[] = $o; } @@ -1144,6 +1107,15 @@ function previous_apps() { $displayed[] = $template; } } + $installedLanguages = array_diff(scandir($caPaths['languageInstalled']),array(".","..","en_US")); + foreach ($installedLanguages as $language) { + $index = searchArray($file,"LanguagePack",$language); + if ( $index !== false ) { + $tmpL = $file[$index]; + $tmpL['Uninstall'] = true; + $displayed[] = $tmpL; + } + } } } else { if ( ! $filter || $filter == "plugins" ) { @@ -1305,7 +1277,8 @@ function pinnedApps() { ################################################ function displayTags() { $leadTemplate = getPost("leadTemplate","oops"); - postReturn(['tags'=>formatTags($leadTemplate)]); + $rename = getPost("rename","false"); + postReturn(['tags'=>formatTags($leadTemplate,$rename)]); } ########################################### @@ -1323,7 +1296,7 @@ function statistics() { $templates = readJsonFile($caPaths['community-templates-info']); pluginDupe($templates); $invalidXML = readJsonFile($caPaths['invalidXML_txt']); - + $statistics['private'] = 0; foreach ($templates as $template) { if ( $template['Deprecated'] && ! $template['Blacklist'] && ! $template['BranchID']) $statistics['totalDeprecated']++; @@ -1372,27 +1345,126 @@ function statistics() { $statistics['invalidXML'] = @count($invalidXML) ?: tr("unknown"); $statistics['repositories'] = @count($repositories) ?: tr("unknown"); - $o = "
"; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; + + $o = " +
+
Community Applications
".tr("Last Change To Application Feed")."$updateTime
".tr($currentServer)."
".tr("Number Of Docker Applications")."{$statistics['docker']}
".tr("Number Of Plugin Applications")."{$statistics['plugin']}
".tr("Number Of Templates")."{$statistics['totalApplications']}
".tr("Number Of Repositories")."{$statistics['repositories']}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + "; if ($statistics['private']) { - $o .= ""; + $o .= ""; } - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= ""; - $o .= "
+
+ +
+
+
+ Community Applications +
+
+ ".tr("Last Change To Application Feed")." + + $updateTime
".tr($currentServer)." +
+ ".tr("Docker Applications")." + + {$statistics['docker']} +
+ ".tr("Plugin Applications")." + + {$statistics['plugin']} +
+ ".tr("Templates")." + + {$statistics['totalApplications']} +
+ ".tr("Repositories")." + + {$statistics['repositories']} +
".tr("Number Of Private Docker Applications")."{$statistics['private']}
".tr("Private Docker Applications")."{$statistics['private']}
".tr("Number Of Invalid Templates")."{$statistics['invalidXML']}
".tr("Number Of Template Errors")."{$statistics['caFixed']}+
".tr("Number Of Blacklisted Apps")."{$statistics['blacklist']}
".tr("Number Of Incompatible Applications")."{$statistics['totalIncompatible']}
".tr("Number Of Deprecated Applications")."{$statistics['totalDeprecated']}
".tr("Number Of Moderation Entries")."{$statistics['totalModeration']}+
".tr("Primary Server")." / ".tr("Backup Server")."
"; - $o .= ""; + $o .= " + + + ".tr("Invalid Templates")." + + + {$statistics['invalidXML']} + + + + + ".tr("Template Errors")." + + + {$statistics['caFixed']}+ + + + + + ".tr("Blacklisted Apps")." + + + {$statistics['blacklist']} + + + + + ".tr("Incompatible Applications")." + + + {$statistics['totalIncompatible']} + + + + + ".tr("Deprecated Applications")." + + + {$statistics['totalDeprecated']} + + + + + ".tr("Moderation Entries")." + + + {$statistics['totalModeration']}+ + + + + + ".tr("Primary Server")." / ".tr("Backup Server")." + + + + "; postReturn(['statistics'=>$o]); } @@ -1475,8 +1547,7 @@ function populateAutoComplete() { } } } - if ( version_compare("6.9.0-beta1",$caSettings['unRaidVersion'],"<") ) - $autoComplete[tr("language")] = tr("Language"); + $autoComplete[tr("language")] = tr("Language"); postReturn(['autocomplete'=>array_values(array_filter(array_unique($autoComplete)))]); } @@ -1494,16 +1565,15 @@ function caChangeLog() { # Populates the category list # ############################### function get_categories() { - global $caPaths, $sortOrder, $translationsAllowed; + global $caPaths, $sortOrder; $categories = readJsonFile($caPaths['categoryList']); if ( ! is_array($categories) || empty($categories) ) { $cat = " Category list N/A

"; postReturn(['categories'=>$cat]); return; } else { - if ($translationsAllowed) { - $categories[] = array("Des"=>"Language","Cat"=>"Language:"); - } + $categories[] = array("Des"=>"Language","Cat"=>"Language:"); + foreach ($categories as $category) { $category['Des'] = tr($category['Des']); if ( is_array($category['Sub']) ) { @@ -1564,6 +1634,7 @@ function createXML() { global $caPaths; $xmlFile = getPost("xml",""); + $type = getPost("type",""); if ( ! $xmlFile ) { postReturn(["error"=>"CreateXML: XML file was missing"]); return; @@ -1644,6 +1715,11 @@ function createXML() { $template['Config'] = $testarray; } $template['Name'] = str_replace(" ","-",$template['Name']); + for ( ;; ) { + if ($type == "second" && is_file("{$caPaths['dockerManTemplates']}/my-{$template['Name']}.xml") ) { + $template['Name'] .= "-1"; + } else break; + } $xml = makeXML($template); @mkdir(dirname($xmlFile)); file_put_contents($xmlFile,$xml); @@ -1726,12 +1802,15 @@ function getCategoriesPresent() { # Set's the favourite repository # ################################## function toggleFavourite() { - global $caPaths; + global $caPaths, $caSettings; $repository = html_entity_decode(getPost("repository",""),ENT_QUOTES); + if ( $caSettings['favourite'] == $repository ) + $repository = ""; + $caSettings['favourite'] = $repository; write_ini_file($caPaths['pluginSettings'],$caSettings); - postReturn(['status'=>"ok"]); + postReturn(['status'=>"ok",'fav'=>$repository]); } #################################### @@ -1771,6 +1850,8 @@ function changeSortOrder() { } if ( is_file($caPaths['repositoriesDisplayed']) ) { $reposDisplayed = readJsonFile($caPaths['repositoriesDisplayed']); + $bio = []; + $nonbio = []; foreach ($reposDisplayed['community'] as $repo) { if ($repo['bio']) $bio[] = $repo; @@ -1782,7 +1863,6 @@ function changeSortOrder() { $reposDisplayed['community'] = array_merge($bio,$nonbio); writeJsonFile($caPaths['repositoriesDisplayed'],$reposDisplayed); } - postReturn(['status'=>"ok"]); } ############################################ @@ -1805,6 +1885,12 @@ function defaultSortOrder() { writeJsonFile($caPaths['sortOrder'],$sortOrder); postReturn(['status'=>"ok"]); } + +function onStartupScreen() { + global $caPaths; + + postReturn(['status'=>is_file($caPaths['startupDisplayed'])]); +} ####################################### # Logs Javascript errors being caught # ####################################### diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/include/helpers.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/include/helpers.php index b6380e24..60b53f0f 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/include/helpers.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/include/helpers.php @@ -183,12 +183,6 @@ function searchArray($array,$key,$value,$startingIndex=0) { } return $result; } -############################# -# Highlights search results # -############################# -function highlight($text, $search) { - return preg_replace('#'. preg_quote($text,'#') .'#si', '\\0', $search); -} ######################################################## # Fix common problems (maintainer errors) in templates # ######################################################## @@ -239,7 +233,7 @@ function makeXML($template) { $template['@attributes'] = array("version"=>2); if ($template['Overview']) $template['Description'] = $template['Overview']; - + fixAttributes($template,"Network"); fixAttributes($template,"Config"); @@ -541,9 +535,10 @@ function fixDescription($Description) { ############################ # displays the branch tags # ############################ -function formatTags($leadTemplate) { +function formatTags($leadTemplate,$rename="false") { global $caPaths; + $type = $rename == "true" ? "second" : "default"; $file = readJsonFile($caPaths['community-templates-info']); $template = $file[$leadTemplate]; $childTemplates = $file[$leadTemplate]['BranchID']; @@ -551,11 +546,11 @@ function formatTags($leadTemplate) { $o = tr("Something really went wrong here"); else { $defaultTag = $template['BranchDefault'] ? $template['BranchDefault'] : "latest"; - + $o = ""; - $o .= ""; + $o .= ""; foreach ($childTemplates as $child) { - $o .= ""; + $o .= ""; } $o .= "
      Default".tr("Install Using The Template's Default Tag")." (:$defaultTag)
      Default".tr("Install Using The Template's Default Tag")." (:$defaultTag)
      {$file[$child]['BranchName']}{$file[$child]['BranchDescription']}
      {$file[$child]['BranchName']}{$file[$child]['BranchDescription']}
"; } @@ -583,16 +578,13 @@ function postReturn($retArray) { #################################### if ( ! function_exists("tr") ) { function tr($string,$options=-1) { - if ( function_exists("_") ) { - $translated = _($string,$options); - if ( startsWith($translated,""") && endsWith($translated,""") ) - $translated = first_str_replace(last_str_replace($translated,""",""),""",""); + $translated = _($string,$options); + if ( startsWith($translated,""") && endsWith($translated,""") ) + $translated = first_str_replace(last_str_replace($translated,""",""),""",""); - $translated = str_replace('"',""",str_replace("'","'",$translated)); + $translated = str_replace('"',""",str_replace("'","'",$translated)); - return $translated; - } - return $string; + return $translated; } } ############################# diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/include/paths.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/include/paths.php index c7298bbd..842686cd 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/include/paths.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/include/paths.php @@ -32,13 +32,9 @@ $caPaths['lastUpdated'] = $caPaths['tempFiles']."/lastUp $caPaths['lastUpdated-old'] = $caPaths['tempFiles']."/lastUpdated-old.json"; $caPaths['addConverted'] = $caPaths['tempFiles']."/TrippingTheRift"; /* flag to indicate a rescan needed since a dockerHub container was added */ $caPaths['convertedTemplates'] = "{$caPaths['flashDrive']}/private/"; /* path to private repositories on flash drive */ -$caPaths['dockerSearchResults'] = $caPaths['tempFiles']."/docker_search.json"; /* The displayed docker search results */ -$caPaths['dockerfilePage'] = $caPaths['tempFiles']."/dockerfilePage"; /* the downloaded webpage to scrape the dockerfile from */ -$caPaths['Dockerfile'] = $caPaths['tempFiles']."/Dockerfile"; $caPaths['moderationURL'] = "https://raw.githubusercontent.com/Squidly271/Community-Applications-Moderators/master/Moderation.json"; $caPaths['moderation'] = $caPaths['tempFiles']."/moderation.json"; /* json file that has all of the moderation */ $caPaths['unRaidVersion'] = "/etc/unraid-version"; -$caPaths['logos'] = $caPaths['tempFiles']."/logos.json"; $caPaths['unRaidVars'] = "/var/local/emhttp/var.ini"; $caPaths['docker_cfg'] = "/boot/config/docker.cfg"; $caPaths['dockerUpdateStatus'] = "/var/lib/docker/unraid-update-status.json"; @@ -63,5 +59,7 @@ $caPaths['LanguageErrors'] = "https://squidly271.github.io/ $caPaths['CA_languageBase'] = "https://raw.githubusercontent.com/Squidly271/AppFeed/master/languages/"; $caPaths['CA_logs'] = "/tmp/CA_logs"; $caPaths['logging'] = "{$caPaths['CA_logs']}/ca_log.txt"; +$caPaths['languageInstalled'] = "/usr/local/emhttp/languages/"; $caPaths['updateTime'] = "/tmp/$CA/checkForUpdatesTime"; # can't be in /tmp/community.applications/tempFiles because new feed downloads erases everything there +$caPaths['dockerWriteTest'] = "/var/lib/docker/communityApplicationsWriteTest"; ?> \ No newline at end of file diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/installMulti.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/installMulti.php index 4cc6af24..4f4e4f08 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/installMulti.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/installMulti.php @@ -7,16 +7,13 @@ ############################################################### $docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: "/usr/local/emhttp"; -if ( $translations ) { - $_SERVER['REQUEST_URI'] = "docker/apps"; - require_once "$docroot/plugins/dynamix/include/Translations.php"; -} +$_SERVER['REQUEST_URI'] = "docker/apps"; +require_once "$docroot/plugins/dynamix/include/Translations.php"; require_once "$docroot/plugins/community.applications/include/paths.php"; require_once "$docroot/plugins/dynamix/include/Wrappers.php"; $unRaidVersion = parse_ini_file($caPaths['unRaidVersion']); -$translations = is_file("$docroot/plugins/dynamix/include/Translations.php"); function tr($string,$ret=true) { if ( function_exists("_") ) diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/showStatistics.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/showStatistics.php index ff1769cf..b88b67d0 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/showStatistics.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/showStatistics.php @@ -12,18 +12,13 @@ require_once "$docroot/plugins/community.applications/include/paths.php"; require_once "$docroot/plugins/dynamix/include/Wrappers.php"; require_once "$docroot/plugins/dynamix/include/Helpers.php"; -$translations = is_file("$docroot/plugins/dynamix/include/Translations.php"); - -if ( $translations ) { - $_SERVER['REQUEST_URI'] = "docker/apps"; - require_once "$docroot/plugins/dynamix/include/Translations.php"; -} +$_SERVER['REQUEST_URI'] = "docker/apps"; +require_once "$docroot/plugins/dynamix/include/Translations.php"; require_once "$docroot/plugins/community.applications/include/helpers.php"; function tr($string,$ret=true) { - if ( function_exists("_") ) - $string = str_replace('"',""",str_replace("'","'",_($string))); + $string = str_replace('"',""",str_replace("'","'",_($string))); if ( $ret ) return $string; else diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/updatePluginSupport.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/updatePluginSupport.php index c10bff87..2ab8be99 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/updatePluginSupport.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/scripts/updatePluginSupport.php @@ -16,14 +16,10 @@ require_once "$docroot/plugins/dynamix/include/Wrappers.php"; $dynamix = parse_plugin_cfg("dynamix"); -$translations = is_file("$docroot/plugins/dynamix/include/Translations.php"); - -if ( $translations ) { - session_start(); - $_SESSION['locale'] = $dynamix['locale']; - $_SERVER['REQUEST_URI'] = "apps"; - require_once("$docroot/plugins/dynamix/include/Translations.php"); -} +session_start(); +$_SESSION['locale'] = $dynamix['locale']; +$_SERVER['REQUEST_URI'] = "apps"; +require_once("$docroot/plugins/dynamix/include/Translations.php"); $plugins = glob("/boot/config/plugins/*.plg"); $templates = readJsonFile($caPaths['community-templates-info']); diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/css.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/css.php index 8dcf9903..fa753453 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/css.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/css.php @@ -11,6 +11,7 @@ header("Content-type: text/css; charset: UTF-8"); $docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: "/usr/local/emhttp"; require_once "$docroot/plugins/dynamix/include/Wrappers.php"; +require_once "$docroot/plugins/community.applications/include/helpers.php"; $dynamix = parse_plugin_cfg("dynamix"); @@ -18,59 +19,86 @@ $theme = $dynamix['theme']; $unRaidSettings = parse_ini_file("/etc/unraid-version"); -$unRaid67 = version_compare($unRaidSettings['version'],"6.7.0-rc4",">"); -$unRaid69 = version_compare($unRaidSettings['version'],"6.9.0-beta1",">"); +$mobile = isMobile(); + $unRaid66color = "#FF8C2F"; $linkColor = "#486dba"; $startupColor = "#FF8C2F"; switch ($theme) { case 'black': - $donateBackground = "#f2f2f2"; - $donateText = "#1c1b1b"; - $templateBackground = "#0f0f0f"; + $donateBackground = "#ffffff"; + $donateText = "#000000"; + $templateBackground = "#191818"; + $templateHoverBackground = "#121212"; $templateFavourite = "#333333"; $hrColor = "#2b2b2b"; $borderColor = "#2b2b2b"; $watermarkColor = "rgba(43, 43, 43, 0.4)"; - $tooltipsterBackground = "linear-gradient(90deg,#303030 0,#707070)"; - $tooltipsterContent = "#f2f2f2"; $aColor = "#00b8d6"; + $sidebarBackground = "#000000"; + $sidebarText = "#f2f2f2"; + $betaPopupOffset = "0"; + $supportPopupText = "#000000"; + $supportPopupBackground = "#ffffff"; + $modCommentBorder = "#cf3131"; + $sidebarCloseBackground = "rgba(0,0,0,0.7)"; break; case 'white': $donateBackground = "#1c1b1b"; $donateText = "#f2f2f2"; - $templateBackground = "#ffffff"; + $templateBackground = "#f5f5f5"; + $templateHoverBackground = "#ffffff"; $templateFavourite = "#d0d0d0"; $hrColor = "lightgrey"; - $borderColor = "lightgrey"; + $borderColor = "#e3e3e3"; $watermarkColor = "rgba(211, 211, 211, 0.8)"; - $tooltipsterBackground = "linear-gradient(90deg,#e2e2e2 0,#f2f2f2)"; - $tooltipsterContent = "#101010"; $aColor = "#486dba"; + $sidebarBackground = "#ffffff"; + $sidebarText = "#000000"; + $betaPopupOffset = "0"; + $supportPopupText = "#f2f2f2"; + $supportPopupBackground = "#1c1b1b"; + $modCommentBorder = "#cf3131"; + $sidebarCloseBackground = "rgba(0,0,0,0.7)"; + break; case 'azure': $donateBackground = "#606e7f"; $donateText = "#e4e2e4"; - $templateBackground = "#ffffff"; + $templateBackground = "transparent"; + $templateHoverBackground = "#edeaef"; $templateFavourite = "#e0e0e0"; $hrColor = "#606e7f"; - $border = "#606e7f"; + $border = "#9794a7"; $watermarkColor = "rgba(96, 110, 127, 0.1)"; - $tooltipsterBackground = "linear-gradient(90deg,#e2e2e2 0,#f2f2f2)"; - $tooltipsterContent = "#101010"; $aColor = "#486dba"; + $sidebarBackground = "#edeaef"; + $sidebarText = "#606e7f"; + $betaPopupOffset = "1.5rem;"; + $supportPopupText = "#1b1d1b"; + $supportPopupBackground = "#ffffff"; + $modCommentBorder = "#cf3131"; + $sidebarCloseBackground = "rgba(0,0,0,0.7)"; + break; case 'gray': $donateBackground = "#606e7f"; $donateText = "#1b1d1b"; - $templateBackground = "#121212"; + $templateBackground = "transparent"; + $templateHoverBackground = "#0c0f0b"; $templateFavourite = "#2b2b2b"; $hrColor = "#606e7f"; $border = "#606e7f"; $watermarkColor = "rgba(96, 110, 127, 0.1)"; - $tooltipsterBackground = "linear-gradient(90deg,#303030 0,#707070)"; - $tooltipsterContent = "#f2f2f2"; $aColor = "#00b8d6"; + $sidebarBackground = "#121510"; + $sidebarText = "#f2f2f2"; + $betaPopupOffset = "1.5rem;"; + $supportPopupText = "#1b1d1b"; + $supportPopupBackground = "#ffffff"; + $modCommentBorder = "#cf3131"; + $sidebarCloseBackground = "rgba(0,0,0,0.7)"; + break; // Use settings for black as a fallback default: @@ -81,253 +109,313 @@ switch ($theme) { $hrColor = "#2b2b2b"; $borderColor = "#2b2b2b"; $watermarkColor = "rgba(43, 43, 43, 0.4)"; - $tooltipsterBackground = "linear-gradient(90deg,#303030 0,#707070)"; - $tooltipsterContent = "#f2f2f2"; + $aColor = "#00b8d6"; + $sidebarBackground = "#000000"; + $sidebarText = "#f2f2f2"; + $betaPopupOffset = "0"; + $supportPopupText = "#000000"; + $supportPopupBackground = "#ffffff"; + $modCommentBorder = "#cf3131"; + $sidebarCloseBackground = "rgba(0,0,0,.7)"; break; } ?> -.tooltipster-box{background:!important} -.additionalRequirementsHeader {font-size:1.5rem;color:#d67777;font-weight:bold;} -.additionalRequirements {margin-left:2rem;} -.modComment {color:#d67777;} a {color:;} -.tooltipster-content{color:!important} +.actionsPopup a {text-decoration:none;color:;cursor:pointer;} +.actionsPopup {margin-right:1rem;font-size:1.5rem;line-height:2rem;cursor:pointer;display:inline-block;color:!important;background: ;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%),linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 100% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px;} +.actionsPopup:hover{background-color:;} +.additionalRequirements {margin-left:2rem;} +.additionalRequirementsHeader {font-size:1.5rem;color:#d67777;font-weight:bold;} +.appIconsPopUp {font-size:2rem !important;cursor:pointer;padding-left:.5rem;padding-right:.5rem;color:default;display:inline-block;margin-right:5rem;} +.appIconsPopUp:hover {text-decoration:none;color:;} +a.appIconsPopUp { text-decoration:none;color:inherit;} +.appDocker{float:right;font-size:2rem;opacity:0.7;margin-left:1rem;} +.appDocker::before{font-family:'Unraid';content:'\e90b';} +.appLanguage{float:right;font-size:2rem;opacity:0.7;margin-left:1rem;} +.appLanguage::before{font-family:'Unraid';content:'\e987';} +.appDriver{float:right;font-size:1.8rem;opacity:0.7;margin-left:1rem;} +.appDriver::before{content:"\f085";font-family:fontAwesome;} +.appsPerPage{float:right;} +.appsPerPage::before{content:"\f009";font-family:fontAwesome;} +.appsPerPage:hover{color:;} +.appPlugin{float:right;font-size:2rem;opacity:0.7;margin-left:1rem;} +.appPlugin::before{font-family:'Unraid';content:'\e986';} +.appRepository{float:right;font-size:2rem;opacity:0.7;margin-left:1rem;} +.appRepository::before{font-family:'fontAwesome';content:'\f2be';} +.back_to_top_hide{z-index:0;} + +.betaCardBackground{clip-path: polygon(0 0,100% 0, 100% 100%);background-color: #FF8C2F;top:0px;height:9rem;width:9rem;position: relative;left:-10rem;margin-right:-9rem;} +.betaPopupBackground{clip-path: polygon(0 0,100% 0, 100% 100%);background-color: #FF8C2F;top:;height:9rem;width:9rem;position: absolute;right: 0;} +.betaPopupText{position:absolute;transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform: rotate(45deg);color:white;font-size:2rem;position:absolute;top:2.25rem;right:-1rem;width:100%;overflow:hidden;height:2.5rem;} body.stop-scrolling{height:70%;overflow:inherit;} /* disable SweetAlert killing the scroll bar ( stops the wiggle ) */ -.sweet-alert table{margin-top:0px} -.popupHolder,.tooltipster-box {max-height:500px;} -.sweet-overlay{background-color:rgba(0, 0, 0, 0) !important;} /* don't dim if spinner is displayed */ -.popupTable{font-size:1.5rem;width:55rem;margin-top:0px;margin-left:auto;} -.popupTable td {width:30%;text-align:left;} -.ca_LanguageDisclaimer {cursor:pointer;font-size:.9rem;} -.ca_LanguageDisclaimer:hover {color:;} -a.ca_LanguageDisclaimer {text-decoration:none;} -.ca_display_beta {font-size:1rem;color:#FF8C2F;} -.ca_display_beta::after{content:"(BETA)"} -.ca_iconArea {width:100%;height:8rem;margin:1rem;} -.ca_icon {width:8rem;height:9rem;display:inline-block;padding-top:0.5rem;padding-left:1rem;} -.ca_infoArea {height:10rem;margin:1rem;display:inline-block;position:absolute;width:auto;} -.ca_applicationInfo {display:inline-block;position:absolute;width:25rem;} +body{scrollbar-gutter:stable;} +.caChangeLog {cursor:pointer;} +.caChart {display:none;border:none;} +. {display:inline-block;width:7rem;height:3rem;} +.caHighlight {color:#d27676;} +.caHomeSpotlight{height:29rem !important;} +.caMenuDisabled {cursor:default;opacity:0.5;} +.caMenuEnabled {cursor:pointer;opacity:1;} +.ca_applicationName {font-size:2rem;max-height:6rem;overflow:hidden;font-weight:bold;padding-top:1.5rem;margin-left:0.75rem;} +a.ca_appPopup {text-decoration:none;cursor:pointer;} +.ca_appPopup {cursor:pointer;} +div.ca_appPopup{cursor:pointer;} +.ca_author {font-size:1rem;margin-left:0.75rem;;margin-top:0.75rem;} +a.ca_author {text-decoration:none;color:inherit;} +.ca_backgroundClickable{height:18.5rem;cursor:pointer;} +.ca_bold {font-weight:bold;} +.ca_bottomLine {display:block;position:relative;top:18rem;} +.ca_bottomLineSpotLight {top:15rem !important;} .ca_categories {font-size:1rem;font-style:italic;} a.ca_categories {text-decoration:none;color:inherit;} -.ca_applicationName {font-size:1.5rem;} -a.ca_applicationName {text-decoration:none;color:inherit;} -.ca_author {cursor:pointer;font-size:1rem;font-style:italic;} -a.ca_author {text-decoration:none;color:inherit;} -.ca_categoryLink {color:;font-weight:normal;} -.moderationLink {color:;font-weight:normal;} -a.ca_categoryLink {text-decoration:none;color:inherit;} -.ca_descriptionArea {margin:1rem;width:auto;max-height:6rem;position:relative;margin-top:-11rem;} -.ca_descriptionArea:hover {color:;} -.ca_descriptionArea:hover span {filter: invert(100%);} -.ca_descriptionAreaRepository {margin:1rem;width:auto;max-height:6rem;position:relative;margin-top:-12rem;} -.ca_descriptionAreaRepository:hover {color:;} -.ca_descriptionAreaRepository:hover span {filter: invert(100%);} -.ca_holderDocker {background-color:;display:inline-block;float:left;height:24rem;min-width:37rem;max-width:50rem;flex-grow:1;flex-basis:37rem;overflow:hidden;padding:0px;margin-left:0px;margin-top:0px;margin-bottom:1rem;margin-right:1rem;border:1px solid;border-color:;border-radius:10px 10px 10px 10px;} -.ca_holderPlugin {background-color:;display:inline-block;float:left;height:24rem;min-width:37rem;max-width:50rem;flex-grow:1;flex-basis:37rem;overflow:hidden;padding:0px;margin-left:0px;margin-top:0px;margin-bottom:1rem;margin-right:1rem;border:1px solid;border-color:;border-radius:10px 10px 10px 10px;} -.ca_holderFav {background-color: !important;} -.ca_holderLanguage {background-color:;display:inline-block;float:left;height:24rem;min-width:37rem;max-width:50rem;flex-grow:1;flex-basis:37rem;overflow:hidden;padding:0px;margin-left:0px;margin-top:0px;margin-bottom:1rem;margin-right:1rem;border:1px solid;border-color:;border-radius:10px 10px 10px 10px;} -.ca_holderRepository {background-color:;display:inline-block;float:left;height:24rem;min-width:37rem;max-width:50rem;flex-grow:1;flex-basis:37rem;overflow:hidden;padding:0px;margin-left:0px;margin-top:0px;margin-bottom:1rem;margin-right:1rem;border:1px solid;border-color:;border-radius:10px 10px 10px 10px;} -.ca_holderDriver {background-color:;display:inline-block;float:left;height:24rem;min-width:37rem;max-width:50rem;flex-grow:1;flex-basis:37rem;overflow:hidden;padding:0px;margin-left:0px;margin-top:0px;margin-bottom:1rem;margin-right:1rem;border:1px solid;border-color:;border-radius:10px 10px 10px 10px;} - - -.ca_holderPlugin::before{position:relative;float:right;margin-top:1rem;margin-right:3rem;font-family:'fontAwesome';content:'\f12e';font-size:8rem;color:;} - -.ca_holderPlugin::before{position:relative;float:right;margin-top:1rem;margin-right:3rem;font-family:'Unraid';content:'\e986';font-size:8rem;color:;} - - - -.ca_holderDocker::before{position:relative;float:right;margin-top:.5rem;margin-right:3rem;font-family:'Unraid';content:'\e90b';font-size:9rem;color:;} - -.ca_holderLanguage::before{position:relative;float:right;margin-right:3rem;font-family:'Unraid';content:'\e987';font-size:9rem;color:;} -.ca_holderRepository::before{position:relative;float:right;margin-top:1.5rem;margin-right:3rem;margin-bottom:2rem;font-family:'fontAwesome';content:'\f2be';font-size:7rem;color:;} -.ca_holderDriver::before{position:relative;float:right;margin-top:1.5rem;margin-right:3rem;margin-bottom:2rem;font-family:'fontAwesome';content:'\f013';font-size:7rem;color:;} -.ca_topRightArea {display:block;position:relative;margin-top:.5rem;margin-right:2rem;z-index:9999;float:right;} -img.displayIcon {height:6.4rem;width:6.4rem;border-radius:1rem 1rem 1rem 1rem;} -i.displayIcon {font-size:5.5rem;color:#626868;padding-top:0.25rem;} -.ca_bottomLine {display:block;position:relative;padding-top:9.5rem;margin-left:1.5rem;} -.ca_bottomRight {float:right;margin-right:2rem;padding-top:0.5rem;} -.ca_hr {margin-left:10px;margin-right:10px;border:1px; border-color:; border-top-style:solid;border-right-style:none;border-bottom-style:none;border-left-style:none;} -.categoryLine {margin-left:10px;margin-top:-15px;font-size:1.5rem;font-weight:normal;color:#6363ca;} -.searchArea {float:right;z-index:2;width:auto;position:static;} -.sortIcons {font-size:1.8rem;margin-right:20px;cursor:pointer;} -ul.caMenu {list-style-type: none;margin:0px 0px 20px 0px;padding: 0;font-size:1.5rem;} -.caMenuEnabled {cursor:pointer;opacity:1;} -.caMenuDisabled {cursor:default;opacity:0.5;} -ul.nonselectMenu {list-style-type: none;margin:0px 0px 20px 0px;padding: 0;font-size:1.5rem;} -li.caMenuItem {padding:0px 0px 5px 0px;} -ul.subCategory {list-style-type:none;margin-left:2rem;padding:0px;cursor:pointer;display:none;} -li.debugging {cursor:pointer;} -.menuHeader { font-size:2rem; margin-bottom:1rem;margin-top:1rem;} -.selectedMenu {color:;font-weight:bold;} -.hoverMenu {color:;} -table {background-color:transparent;} -table tbody td {line-height:1.8rem;} -.startup-icon {color:lightblue;font-size:1.5rem;cursor:pointer;} -.ca_serverWarning {color:#cecc31} -.ca_template_icon {color:#606E7F;width:37rem;float:left;display:inline-block;background-color: #C7C5CB;margin:0px 0px 0px 0px;height:15rem;padding-top:1rem;} -.ca_template {color:#606E7F;border-radius:0px 0px 2rem 2rem;display:inline-block;text-align:left;overflow:auto;height:27rem;width:36rem;padding-left:.5rem;padding-right:.5rem; background-color:#DDDADF;} -.ca_icon_wide {display:inline-block;float:left;width:9.5rem;margin-left:2.5rem;} -.ca_wide_info {display: inline-block;float:left;text-align:left;margin-left:1rem;margin-top:1.5rem;width:20rem;} -.ca_description {color:#505E6F;} -.cardDescription {cursor:pointer;} -a.ca_appPopup {text-decoration:none;cursor:pointer;} -.ca_repoPopup {text-decoration:none!important;cursor:pointer;color:inherit;} -a.ca_repoPopup:hover {color:;} -.ca_href {cursor:pointer;} -input[type=checkbox] {width:2rem;height:2rem;margin-right:1rem;margin-top:-.5rem;margin-left:0rem;} -.enabledIcon {cursor:pointer;color:;} -.disabledIcon {color:#040404;font-size:2.5rem;} -.pinned {font-size:2rem;cursor:pointer;padding-left:.5rem;padding-right:.5rem;cursor:pointer;color:#1fa67a;padding:.3rem;} -.unpinned {font-size:2rem;cursor:pointer;padding-left:.5rem;padding-right:.5rem;cursor:pointer;padding:.3rem;} -.pinned::after {content:"\f08d";font-family:fontAwesome;} -.unpinned::after {content:"\f08d";font-family:fontAwesome;display:inline-block;-webkit-transform: rotate(20deg);-moz-transform: rotate(20deg);-ms-transform: rotate(20deg); -o-transform: rotate(20deg); transform: rotate(20deg);} -.ca_favouriteRepo {font-size:2rem;cursor:pointer;margin-left:2.5rem !important;padding-right:.5rem;cursor:pointer;color:#1fa67a !important;padding:.3rem;} -.ca_favouriteRepo::before {content:"\f2be";font-family:fontAwesome;} -.ca_non_favouriteRepo {font-size:2rem;cursor:pointer;margin-left:2.5rem !important;padding-right:.5rem;cursor:pointer;padding:.3rem;} -.ca_non_favouriteRepo::before {content:"\f2be";font-family:fontAwesome;} -.ca_repoSearch {font-size:2rem;cursor:pointer;padding-left:.5rem;padding-right:.5rem;cursor:pointer;padding:.3rem;} -.ca_repoSearchPopup {font-size:2rem;cursor:pointer;padding-left:.5rem;padding-right:.5rem;cursor:pointer;padding:.3rem;} -.ca_repoSearch::after {content:"\f002";font-family:fontAwesome;} -.appIcons {font-size:2.3rem;color:inherit;cursor:pointer;padding-left:.5rem;padding-right:.5rem;} -.appIcons:hover {text-decoration:none;color: ! important;} -.pinned:hover {text-decoration:none;color:;} -.unpinned:hover {text-decoration:none;color:;} -a.appIcons {text-decoration:none;} -.appIconsPopUp {font-size:2rem !important;cursor:pointer;padding-left:.5rem;padding-right:.5rem;color:default;} -.appIconsPopUp:hover {text-decoration:none;color:;} -.myReadmoreButton {color:#6363ca;} -.supportLink {color:inherit;padding-left:.5rem;padding-right:.5rem;} -.donateLink {font-size:1.2rem;} -.donate:hover {text-decoration:none;background-color:;} -.dockerHubStar {font-size:1rem;} -.dockerDisabled {display:none;} -.displayBeta {margin-left:2rem;cursor:pointer;} -.newApp {color:red;font-size:1.5rem;cursor:pointer;} -.ca_fa-support::before {content:"\f059";font-family:fontAwesome;} - -.ca_fa-delete {color:#882626;font-size:1.5rem;cursor:pointer;} -.ca_fa-delete::before {content:"\e92f";font-family:Unraid;} -.ca_fa-delete:hover {color:;} -.ca_fa-project::before {content:"\e953";font-family:Unraid;} -.dockerHubStar::before{content:"\e95a";font-family:UnRaid;} - -.ca_fa-delete {color:#882626;font-size:2rem;cursor:pointer;} -.ca_fa-delete::before {content:"\f00d";font-family:fontAwesome;} -.ca_fa-project::before {content:"\f08e";font-family:fontAwesome;} -.dockerHubStar:before {content:"\f005";font-family:fontAwesome;} - -a.ca_fa-delete{text-decoration:none;margin-left:1rem;} -.ca_fa-install::before {content:"\f019";font-family:fontAwesome;} -.ca_fa-edit::before {content:"\f044";font-family:fontAwesome;} -.ca_fa-globe::before {content:"\f0ac";font-family:fontAwesome;} -.ca_fa-update::before {content:"\f0ed";font-family:fontAwesome;} -.ca_fa-info::before {content:"\f05a";font-family:fontAwesome;} -.ca_repoinfo::before {content:"\f05a";font-family:fontAwesome;} -.ca_fa-warning::before {content:"\f071";font-family:fontAwesome;} -.ca_fa-switchto::before {content:"\e982";font-family:Unraid;} -.ca_favourite::before {content:"\f2be";font-family:fontAwesome;color:#1fa67a;} -.ca_favourite {cursor:default !important;} -.ca_twitter::before {content:"\f099";font-family:fontAwesome;} -.ca_reddit::before {content:"\f281";font-family:fontAwesome;} -.ca_facebook::before {content:"\f09a";font-family:fontAwesome;} -.ca_showRepo::before {content:"\f002";font-family:fontAwesome;} -.ca_repository::before {content:"\f2be";font-family:fontAwesome;} -")):?> -.ca_discord::before{content:"\e988";font-family:Unraid;font-size:2.8rem;vertical-align:bottom;} -.ca_discord_popup::before{content:"\e988";font-family:Unraid;font-size:2.2rem;vertical-align:middle;} - -.ca_discord {height:2.9rem; margin-top:-8px;cursor:pointer;} - -.ca_forum::before {content:"\f1cd";font-family:fontAwesome;} -.ca_webpage::before {content:"\f0ac";font-family:fontAwesome;} -.ca_profile::before {content:"\f2bb";font-family:fontAwesome;} -.trendingUp::before {content:"\f062";font-family:fontAwesome;} -.trendingDown::before {content:"\f063";font-family:fontAwesome;} -.ca_private::after {content:"\f069";font-family:fontAwesome;} -.ca_private{color:#882626;} -.warning-red {color:#882626;} -.warning-yellow {color:#FF8C2F;} -.ca_fa-pluginSettings::before {content:"\f013";font-family:fontAwesome;} -.ca_donate {position:relative;margin-left:18rem;} -.ca_multiselect {cursor:pointer;padding-right:5rem;} -.pageNumber{margin-left:1rem;margin-right:1rem;cursor:pointer;text-decoration:none !important;} -.pageDots{color:grey;cursor:default;} -.pageDots::after {content:"...";} -.pageNavigation {font-size:2.0rem;} -.pageNavNoClick {font-size:2.0rem;color:grey;cursor:default;} -.pageSelected {cursor:default;} -.pageRight::after {content:"\f138";font-family:fontAwesome;font-weight:bold;} -.pageLeft::after {content:"\f137";font-family:fontAwesome;font-weight:bold;} -.specialCategory {font-size:1.5rem;} -.ca_table { padding:.5rem 2rem .5rem 0; font-size:1.5rem;} -.ca_stat {color:coral; font-size:1.5rem;line-height:1.7rem;} +.ca_center {margin:auto;text-align:center;} .ca_credit { padding:.5rem 0 1rem 0; font-size:1.5rem;line-height:2rem; font-style:italic;} .ca_creditheader { font-size:2rem; padding-top:1rem;} -.ca_dateUpdatedDate {font-weight:normal;} +.ca_discord::before{content:"\e988";font-family:Unraid;} +.ca_discord_popup::before{content:"\e988";font-family:Unraid;font-size:2.2rem;vertical-align:middle;} +img.ca_displayIcon{height:8rem;width:8rem;} +.ca_fa-delete {color:#882626;} +.ca_fa-delete::before {content:"\f00d";font-family:fontAwesome;} +a.ca_fa-delete{text-decoration:none;margin-left:1rem;font-size:2rem;margin-top:-0.25rem;cursor:pointer;float:right;} +.ca_fa-docker::before{font-family:'Unraid';content:'\e90b';} +.ca_fa-edit::before {content:"\f044";font-family:fontAwesome;} +.ca_fa-globe::before {content:"\f0ac";font-family:fontAwesome;} +.ca_fa-info::before {content:"\f05a";font-family:fontAwesome;} +.ca_fa-install::before {content:"\f019";font-family:fontAwesome;} +.ca_fa-pluginSettings::before {content:"\f013";font-family:fontAwesome;} +.ca_fa-project::before {content:"\e953";font-family:Unraid;} +.ca_fa-readme::before {content:"\f02d";font-family:fontAwesome;} +.ca_fa-support::before {content:"\f059";font-family:fontAwesome;} +.ca_fa-switchto::before {content:"\e982";font-family:Unraid;} +.ca_fa-template::before {content:"\f08e";font-family:fontAwesome;} +.ca_fa-uninstall::before {content:"\e92f";font-family:Unraid;} +.ca_fa-update::before {content:"\f0ed";font-family:fontAwesome;} +.ca_fa-warning::before {content:"\f071";font-family:fontAwesome;} +.ca_facebook::before {content:"\f09a";font-family:fontAwesome;} +.ca_favouriteRepo {margin-right:1rem;margin-bottom:1rem;font-size:1.5rem;line-height:2rem;cursor:pointer;display:inline-block;color:!important;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%),linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 100% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px;} +.ca_favouriteRepo:hover {text-decoration:none;background-color:;} +.ca_forum::before {content:"\f1cd";font-family:fontAwesome;} +.ca_holder {background-color:;display:inline-block;float:left;height:20rem;min-width:24rem;max-width:24rem;overflow:hidden;padding:20px;margin-top:0px;margin-bottom:1rem;margin-right:1rem;border:1px solid;border-color:;} +.ca_holder:hover{background-color:;} +.ca_holderFav {background-color: !important;} +.ca_homeTemplates{display:flex;flex-wrap:wrap;height:24.5rem;overflow:hidden;} +.ca_homeTemplatesHeader{font-size:2rem;margin-top:1rem;margin-bottom:0.5rem;} +.ca_homeTemplatesLine2{font-size:1.5rem;margin-bottom:1rem;} +.ca_hr {margin-left:10px;margin-right:10px;border:1px; border-color:; border-top-style:solid;border-right-style:none;border-bottom-style:none;border-left-style:none;} +.ca_href {cursor:pointer;} +.ca_icon {width:6.4rem;height:6.4rem;} +.ca_iconArea {width:100%;height:6.4rem;margin-top:-2rem;margin-left:1rem;} +.ca_italic {font-style:italic;} +ul.caMenu {list-style-type: none;margin:0px 0px 20px 0px;padding: 0;font-size:1.5rem;} +li.caMenuItem {padding:0px 0px 5px 0px; width:fit-content;} +.ca_multiselect {float:right;cursor:pointer;padding-right:1rem;} +.ca_NoAppsFound {font-size:3rem;margin:auto;text-align:center;} +.ca_NoDockerAppsFound {font-size:3rem;margin:auto;text-align:center;} +.ca_non_favouriteRepo {font-size:2rem;cursor:pointer;margin-left:2.5rem !important;padding-right:.5rem;cursor:pointer;padding:.3rem;} +.ca_non_favouriteRepo::before {content:"\f2be";font-family:fontAwesome;} +ul.nonselectMenu {list-style-type: none;margin:0px 0px 20px 0px;padding: 0;font-size:1.5rem;} +.ca_normal {font-size:1.4rem !important;} +.ca_popupIconArea{height:14.4rem;} +.ca_private::after {content:"\f069";font-family:fontAwesome;} +.ca_private{color:#882626;} +.ca_profile::before {content:"\f2bb";font-family:fontAwesome;} +.ca_readmore {color:;font-size:1.5rem !important;cursor:pointer;padding-left:.5rem;padding-right:.5rem;padding-top:1rem;display:inline-block;margin-bottom:2rem;} +.ca_readmore:hover {text-decoration:none;color:#d67777;} +.ca_reddit::before {content:"\f281";font-family:fontAwesome;} +.ca_red{color:#882626;} +.ca_repoPopup {display:inline-block;text-decoration:none!important;cursor:pointer;color:inherit;} +a.ca_repoPopup:hover {color:;} +.ca_repoSearch {font-size:2rem;cursor:pointer;padding-left:.5rem;padding-right:.5rem;cursor:pointer;padding:.3rem;} +.ca_repoSearch::after {content:"\f002";font-family:fontAwesome;} +.ca_repoSearchPopup {font-size:2rem;cursor:pointer;padding-left:.5rem;padding-right:.5rem;cursor:pointer;padding:.3rem;} +.ca_serverWarning {color:#cecc31} +.ca_stat {color:coral; font-size:1.5rem;line-height:1.7rem;} +.ca_table { padding:.5rem 2rem .5rem 0; font-size:1.5rem;} +.ca_template {color:#606E7F;border-radius:0px 0px 2rem 2rem;display:inline-block;text-align:left;overflow:auto;height:27rem;width:36rem;padding-left:.5rem;padding-right:.5rem; background-color:#DDDADF;} +.ca_templatesDisplay {display:flex;flex-wrap:wrap;margin-bottom:5rem;} +.ca_template_icon {color:#606E7F;width:37rem;float:left;display:inline-block;background-color: #C7C5CB;margin:0px 0px 0px 0px;height:15rem;padding-top:1rem;} +.ca_twitter::before {content:"\f099";font-family:fontAwesome;} +.ca_webpage::before {content:"\f0ac";font-family:fontAwesome;} +.changelogMessage{font-size:1rem;line-height:1rem;margin-top:1rem;} +.cardCategory{font-size:1rem;margin-left:0.75rem;} +.cardDescription{cursor: pointer;display: block;position: relative;top:0.5rem;max-height: 5rem;overflow: hidden;} +.cardDesc{display:inline-block;max-height:6rem;overflow:hidden;} +.card_readmore{color:;} +#Category{font-size:2rem;margin-bottom:0.5rem;} +.changelogTitle{font-size:2rem;line-height:2rem;margin-top:2rem;font-weight:normal;} +.changelog{font-size:1.2rem;line-height:1.4rem;margin-top:1.5rem;} +.chartMenu{padding-left:2rem;cursor:pointer;} +.chartMenu:hover{color:;} +.charts{font-size:1.5rem;} +.chartTitle{margin-top:1.5rem;font-size:2.5rem;} +ul.context{list-style-type:none;padding:0;margin:0;} +a.context{text-decoration:none;color:currentColor;margin:5px;} +li.context{margin-top:0.5rem;margin-bottom:0.5rem;font-size:1.5rem;} +li.context:hover{color:;} +li.debugging {cursor:pointer;} +.disabledIcon {color:#040404;font-size:2.5rem;} +i.displayIcon {font-size:5.5rem;color:#626868;padding-top:0.25rem;} +img.displayIcon {height:6.4rem;width:6.4rem;border-radius:1rem 1rem 1rem 1rem;} #cookieWarning {display:none;} +.docker::after{font-family:'Unraid';content:'\e90b';font-size:2.5rem;} +.dockerHubStar {font-size:1rem;} +.dockerHubStar::before{content:"\e95a";font-family:UnRaid;} +.dockerSearch{display:inline-block;float:right;} +.donate {color:!important;background: ;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%),linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 200% 100%; border-radius: 15px; color: #000000; padding: 1px 10px 1px 10px;} +.donate:hover {text-decoration:none;background-color:;} +.donateDiv{margin-top:1rem;} +.donate a {text-decoration:none;color:} +.donateArea{margin-top:2rem;} +.donateLink {font-size:1.2rem;} +.donateText{margin-top:2rem;} +.enabledIcon {cursor:pointer;color: !important;} +.fav{background-color:#009900;} +.nonfav{background-color: ;} +.favCardSpotlight{left:-40.25rem !important;} + .favCardBackground{float:right;color:#bb0000;padding-top:.25rem;} + .favCardBackground::before{content:"\f004";font-family:fontAwesome;} +.homeMore{color:;cursor:pointer;} +.homeMore:hover{color:#d67777;} +.homespotlightIconArea{display: inline-block;position: relative;top: -23rem;left: 30rem;cursor:pointer;} +.hoverMenu {color:;} +.infoIcon::before{content:"\f05a";font-family:fontAwesome;} +.infoButton {line-height:2rem;cursor:pointer;display:inline-block;color:!important;background: ;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%),linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 100% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px;} +.infoButton:hover{background:} +.initDockerSearch{cursor:pointer;text-decoration:none;font-size:1.5rem;} +.initDockerSearch:hover{color:} +a.initDockerSearch{cursor:pointer;text-decoration:none;color:unset;} +.installedCardBackground{clip-path: polygon(0 0,100% 0, 100% 100%);background-color: #322fff;top:0px;height:9rem;width:9rem;position: relative;left:-10rem;margin-right:-9rem;} +.installedCardText{position:absolute;transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform: rotate(45deg);color:white;font-size:1.5rem;position:absolute;top:2.5rem;right:-1rem;width:100%;overflow:hidden;height:2rem;} + +input[type=checkbox] {width:2rem;height:2rem;margin-left:0rem;} +input[type=button]{background:none;font-size:1.5rem;} +input:hover[type=button]{color:;background:none !important;} +input:hover[type=button][disabled]{background:none !important;color:currentColor !important;font-size:1.5rem;} +input[type=button][disabled]{background:none;} +.mainArea {position:absolute;left:18.5rem;right:0px;top:2rem;display:block;overflow-x:hidden;min-height:90vh;} +.menuHeader { font-size:2rem; margin-bottom:1rem;margin-top:1rem;} +.menuItems {position:absolute;top:2rem;left:0px;width:14rem;height:auto;} +.mobileHolderFix{margin-bottom:2rem !important;} +.modComment {padding:2rem;border:1px solid;border-color:;} +.moderatorCommentHeader {font-size:2rem;font-weight:normal;} +.moderatorCommentHeader:before{content:"\e97d";font-family:Unraid;color:;} +.moderatorComment {font-size:1.2rem;font-style:italic;line-height:1.5rem;} +.moderationLink {color:;font-weight:normal;} +.multi_installDiv {width:100%; display:none;padding-bottom:20px;} +.myReadmoreButton {color:#6363ca;} .notice.shift {margin-top:0px;} -#searchBox{top:-0.6rem;padding:0.6rem;} -.searchSubmit{height:3.4rem;} -.startupMessage{font-size:2.5rem;} -.startupMessage2{font-size:1rem;} -.donate {background: ;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%),linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 200% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px; text-shadow: 1px 1px 5px #666;} -a.donate {text-decoration:none;font-style:italic;color:;} -.popup-donate {background:black;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%), linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 200% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px; text-shadow: 1px 1px 5px #666;} -a.popup-donate {text-decoration:none;font-style:italic;color:white;font-size:1.5rem;} -a.popup-donate:hover {color:;background-color:} - -.searchSubmit{font-family:'FontAwesome';width:2.9rem;height:2.9rem;border:.1rem solid #dadada;border-radius:4px 4px 4px 4px;font-size:1.1rem;position:relative; top:-.7rem;padding:0px .2rem;background:transparent;border:none;cursor:pointer;} -#searchBox{margin-left:1rem;margin-right:0;position:relative;top:-.6rem;border:none;} - - -.searchSubmit{font-family:'FontAwesome';width:2.9rem;height:3.4rem;border:1px solid #dadada;border-radius:4px 4px 4px 4px;font-size:1.1rem;position:relative; top:-6px;padding:0px 2px;background:transparent;border:none;cursor:pointer;} -#searchBox{margin-left:1rem;margin-right:0;position:relative;top:-.6rem;border:none;padding:0.6rem;} - - -.searchSubmit{font-family:'FontAwesome';width:2.9rem;height:2.9rem;border:.1rem solid #dadada;border-radius:4px 4px 4px 4px;font-size:1.1rem;position:relative; top:-.7rem;padding:0px .2rem;background:transparent;border:none;cursor:pointer;} -#searchBox{margin-left:1rem;margin-right:0;position:relative;top:-.6rem;border:none;} - - -.searchSubmit{font-family:'FontAwesome';width:2.9rem;height:3.4rem;border:1px; solid #dadada;border-radius:4px 4px 4px 4px;font-size:1.1rem;position:relative; top:-6px;padding:0px 2px;background:transparent;border:none;cursor:pointer;} -#searchBox{margin-left:1rem;margin-right:0;position:relative;top:-.6rem;border:none;padding:0.6rem;} - +p {margin:auto;text-align:left;margin-bottom:10px;} /* override dynamix styling for popup */ +.pageDots::after {content:"...";} +.pageDots{color:grey;cursor:default;} +.pageLeft::after {content:"\f137";font-family:fontAwesome;} +.pageNavigation {font-size:1.5rem;} +.pageNavNoClick {font-size:1.5rem;cursor:default !important;} +.pageNavNoClick:hover{color:initial !important;} +.pageNumber{margin-left:1rem;margin-right:1rem;cursor:pointer;text-decoration:none !important;} +.pageNumber:hover{color:;} +.pageRight::after {content:"\f138";font-family:fontAwesome;} +.pageSelected {cursor:default;color:;} +.pinned {margin-left:1rem;font-size:2rem;cursor:pointer;padding-left:.5rem;padding-right:.5rem;cursor:pointer;color:#1fa67a;padding:.3rem;} +.pinned::after {content:"\f08d";font-family:fontAwesome;} +.pinned:hover {text-decoration:none;color:;} +.plugin::after {font-family:'Unraid';content:'\e986';font-size:2.5rem;} +.popup-donate {background:white;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%), linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 200% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px; text-shadow: 1px 1px 5px #666;} +.popupAuthor{font-size:1.7rem;line-height:2rem;;margin-bottom:0.5rem;margin-top:0.5rem;display:inline-block;} +.popupAuthorMain{font-size:1.7rem;line-height:2rem;margin-bottom:0.5rem;margin-top:0.5rem;} +.popupAuthorIcon{display:inline-block;float:right;} +img.popupAuthorIcon{height:7.2rem;width:7.2rem;border-radius:1rem 1rem 1rem 1rem;} +.popupAuthorTitle{font-size:2.5rem;margin-top:2rem;margin-bottom:2rem;} +.popupCategory{font-size:1rem;line-height:1rem;} +.popUpBack{font-size:1.5rem;color:#f34646;font-weight:bold;cursor:pointer;top:-2rem;display:inline-block;padding-left:3rem;} +.popUpClose {margin-top:2rem;font-size:1.5rem;color:#f34646;font-weight:bold;cursor:pointer;display:inline-block;} +.popUpClose:hover {color:;} +.popUpDeprecated {color:#FF8C2F;} +.popupDescriptionArea{display:block;font-size:1rem;color:;} +.popupDescription{font-size:1.5rem;line-height:1.7rem !important;margin-top:1.5rem;margin-left:1rem;margin-right:1rem;margin-bottom:0px;} +.popupIcon {display:inline-block;} +i.popupIcon {color:#626868;font-size:10rem;padding-left:1rem;padding-top:2.2rem;} +img.popupIcon {width:10rem;height:10rem;padding:0.3rem;margin-top:2.2rem;border-radius:1rem 1rem 1rem 1rem;} +.popupInfo{position:absolute;top:10rem;left:15rem;} +.popupInfoLeft{min-width:45%;max-width:45%;width:50rem;float:left;display:inline-block;margin-right:10px;} +.popupInfoRight{min-width:45%;max-width:45%;float:left;display:inline-block;} +.popupInfoSection{line-height:2rem;font-size:1.5rem;display:inline-block;} .popUpLink {cursor:pointer;color:;} a.popUpLink {text-decoration:none;} a.popUpLink:hover {color:;} -.popUpDeprecated {color:#FF8C2F;} -i.popupIcon {color:#626868;font-size:14.4rem;padding-left:1rem;width:14.4rem} -img.popupIcon {width:14.4rem;height:14.4rem;padding:0.3rem;border-radius:1rem 1rem 1rem 1rem;} -.display_beta {color:#FF8C2F;} -a.appIconsPopUp { text-decoration:none;color:inherit;} -.ca_italic {font-style:italic;} -.ca_bold {font-weight:bold;} -.ca_center {margin:auto;text-align:center;} -.ca_large {font-size:2rem;} -.ca_normal {font-size:1.4rem !important;} -.ca_readmore {font-size:2rem !important;margin-top:10px;cursor:pointer;padding-left:.5rem;padding-right:.5rem;color:#6363ca;} -.ca_readmore:hover {text-decoration:none;color:;} -.popUpClose {font-size:1.5rem;color:#f34646;font-weight:bold;cursor:pointer;} -.popUpClose:hover {color:;} -p {margin:auto;text-align:left;margin-bottom:10px;} /* override dynamix styling for popup */ -h1 {font-size:1.5rem;} /* override dynamix styling for popup */ -.ca_NoAppsFound {font-size:3rem;margin:auto;text-align:center;} -.ca_NoDockerAppsFound {font-size:3rem;margin:auto;text-align:center;} -.ca_templatesDisplay {display:flex;flex-wrap:wrap;justify-content:center;overflow-x:hidden;} +.popupName{display:block;font-size:3rem;line-height:4rem;font-weight:bold;max-height:4rem;overflow:hidden;} +.popupProfile {margin-right:1rem;margin-bottom:1rem;font-size:1.5rem;line-height:2rem;cursor:pointer;display:inline-block;color:!important;background: ;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%),linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 100% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px;} +.popupProfile:hover {text-decoration:none;background-color:;} +.popupRepoDescription{font-size:1.5rem;margin-bottom:1rem;} +.popupTable td {width:30%;text-align:left;} +.popupTable{font-size:1.5rem;width:55rem;margin-top:0px;margin-left:auto;} +.popupTableLeft{vertical-align:top;padding-right:15px;} +.popupTableRight{max-width:20rem;overflow:hidden;} +.popupTitle{margin:auto;text-align:center;font-weight:bold;font-size:2rem;line-height} +.popup{margin:1.5rem;margin-bottom:15rem;margin-top:-2rem;} +a.popup-donate {text-decoration:none;font-style:italic;color:black;font-size:1.5rem;} +a.popup-donate:hover {color:;background-color:} +.readmore-js-collapsed{-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0.1)));} +.repoDonateText{margin-bottom:0.5rem;} +.repoLinks{margin-top:3rem;} +.repoPopup {margin-right:1rem;font-size:1.5rem;line-height:2rem;cursor:pointer;display:inline-block;color:!important;background: ;background: -webkit-linear-gradient(top, transparent 0%, rgba(0,0,0,0.4) 100%),-webkit-linear-gradient(left, lighten(, 15%) 0%, 50%, lighten(, 15%) 100%); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.4) 100%),linear-gradient(to right, lighten(#E68321, 15%) 0%, #E68321 50%, lighten(#E68321, 15%) 100%); background-position: 0 0; background-size: 100% 100%; border-radius: 15px; color: #fff; padding: 1px 10px 1px 10px;} +.repoPopup:hover {text-decoration:none;background-color:;} +.repoStats{font-size:2rem;margin-top:2rem;} +.repoTable{margin-top:15px;width:70%;} +.repoLeft{width:50%;} +.repoLinkArea{margin-top:1.5rem;} +.repoRight{text-align:right;} +.rightTitle{font-size:2.5rem;margin-top:2rem;margin-bottom:2rem;} +.searchArea {z-index:2;width:auto;position:static;} +.searchSubmit{font-family:'FontAwesome';width:2rem;min-width:2rem;height:3.4rem;font-size:1.1rem;position:relative;padding-top:1.1rem;padding-bottom:1rem;padding-right:1rem;background:;border:none;cursor:pointer;background:;} +#searchBox{margin-left:0rem;margin-right:0;margin-bottom:1rem;top:-.6rem;border:none;padding:0.6rem;background:;padding-right:0.5rem;} +#searchButton:hover{color:;} +.sidebar{z-index:998;position:fixed;top:0;right:0;bottom:1.6rem;margin-bottom:10px;width:100%;height:100vh;display:none;background-color:;} +.sidebarClose{width: 100%;height: 100vh;position: fixed;top: 0;left: 0;} +.selectedMenu {color:;font-weight:bold;} +.sidenavHide{width:0px;} +.sidenavShow{width: } +.sidenav{position:fixed;top:0;right:0;bottom:1.6rem;margin-bottom:10px;background-color:;color:;overflow-x:hidden;transition:0.5s;padding-top:60px;overflow-y:scroll;} +#sortIconArea{padding-bottom:1rem;} +.sortIcons {font-size:1.2rem;margin-right:10px;margin-left:10px;cursor:pointer;text-decoration:none !important;color:;} +.sortIcons:hover{color:;} +.specialCategory {font-size:1.5rem;} +.spinner{z-index:999999 !important;} /* ensure always ontop */ +.spinnerBackground {position:fixed;top:0;left:0;width:100%;height:100vh;display:none;background:transparent;z-index:9999;} +.spotlightDate{font-size:1.5rem;} +.spotlightCardBackground{clip-path: polygon(0 0,100% 0, 100% 100%);background-color: #009900;top:0px;height:9rem;width:9rem;position: relative;left:-10rem;margin-right:-9rem;} +.spotlightHome{min-width:45rem !important;max-width:45rem !important;height:24rem !important;margin-bottom:1rem;} +.spotlightPopupBackground{clip-path: polygon(0 0,100% 0, 100% 100%);background-color: #009900;top:;height:9rem;width:9rem;position: absolute;right: 0;} +.spotlightHeader{font-size:2rem;} +.spotlightIconArea{display:inline-block;float:left;width:10rem;} +.spotlightIcon{height:3.6rem;margin-top:1rem;margin-bottom:0.5rem;} +.spotlightInfoArea{margin-left:2rem;padding-left:10rem;} +.spotlightPopup{display:inline-block;} +.spotlightPopupText{position:absolute;color:white;font-size:2rem;position:absolute;top:1.2rem;right:2rem;} +.spotlightPopupText::after{content:"\f005";font-family:fontAwesome;} +.spotlightWho{font-style:italic;} +.spotlightWhy{font-weight:bold;font-size:1.6rem;line-height:1.8rem;} +.spotlightMessage{margin-top:0.8rem;line-height:1.5rem;} +.spotlightMessage a{color:;text-decoration:none;} +.spotlightMessage a:hover{color:#d67777;} +ul.subCategory {list-style-type:none;margin-left:2rem;padding:0px;cursor:pointer;display:none;} +.supportButton {line-height:2rem;cursor:pointer;display:inline-block;background-position: 0 0; background-size: 100% 100%; border-radius: 15px; ; padding: 1px 10px 1px 10px;margin-left:1rem;border-style:solid;border-width:1px;} +.supportButton a {text-decoration:none;} +.supportButton:hover{background:;border-color:;} +.supportLink {color:inherit;padding-left:.5rem;padding-right:.5rem;} +.supportPopup a {text-decoration:none;color:inherit;cursor:pointer;} +.supportPopup {margin-right:1rem;font-size:1.5rem;line-height:2rem;cursor:pointer;display:inline-block;background-position: 0 0; background-size: 100% 100%; border-radius: 15px; padding: 1px 10px 1px 10px;border-style:solid;border-width:1px;} +.supportPopup:hover{background-color:;} +.sweet-alert table{margin-top:0px} +table tbody td {line-height:1.8rem;} +table {background-color:transparent;} +#templates_content {overflow-x:hidden;margin-bottom:5rem;} +.trendingDown::before {content:"\f063";font-family:fontAwesome;} +.trendingUp::before {content:"\f062";font-family:fontAwesome;} +.unpinned {font-size:2rem;cursor:pointer;margin-left:1rem;padding-left:.5rem;padding-right:.5rem;cursor:pointer;padding:.3rem;} +.unpinned::after {content:"\f08d";font-family:fontAwesome;display:inline-block;-webkit-transform: rotate(20deg);-moz-transform: rotate(20deg);-ms-transform: rotate(20deg); -o-transform: rotate(20deg); transform: rotate(20deg);} +.unpinned:hover {text-decoration:none;color:;} +.unraidIcon {margin-top:4rem;} #warningNotAccepted {display:none;} -.menuItems {position:absolute; left:0px;width:14rem;height:auto;} -.mainArea {position:absolute;left:18.5rem;right:0px; display:block;overflow-x:hidden;min-height:90vh;} -.multi_installDiv {width:100%; display:none;padding-bottom:20px;} -.ca_toolsView {font-size:2.3rem; position:relative;top:-0.2rem;} -#templates_content {overflow-x:hidden;} -.graphLink {cursor:pointer;text-decoration:none;} -.caChart {display:none;border:none;} -.caHighlight {color:#d27676;} -.caChangeLog {cursor:pointer;} -.caInstallLinePopUp {display:flex;flex-wrap:wrap;justify-content:space-around;} -.caHelpIconSpacing {display:inline-block;width:7rem;height:3rem;} - -.popupDescriptionArea{display:block;font-size:1.5rem;;} -.popupTitle{margin:auto;text-align:center;font-weight:bold;font-size:2rem;} .awesomplete [hidden] {display: none;} .awesomplete .visually-hidden {position: absolute;clip: rect(0, 0, 0, 0);} diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.html b/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.html index 033d79a6..45a289fa 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.html +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.html @@ -1,8 +1,8 @@ -
 
+
@@ -70,7 +70,7 @@
Andrew Zawadzki, Kode, Limetech
-
CHBMB, SpaceInvaderOne, Sparklyballs, wgstarks, DJoss, Zer0Nin3r, Mex, prostuff1, bonienl, ljm42, kizer, trurl, Jos, Limetech
+
CHBMB, SpaceInvaderOne, Sparklyballs, wgstarks, DJoss, Zer0Nin3r, Mex, prostuff1, bonienl, ljm42, kizer, trurl, Jos, Limetech, SimonF, ich777, jimmy898, Alex.b, neruve, Eugeni_CAT, ChaseCares, TheEyeTGuy
Awesomeplete (Lea Verou)
Chart.js (various)
chartjs-plugin-trendline (Marcus Alsterfjord)
XML2Array/Array2XML (Miles Johnson)
sprintf.js (Alexandru Mărășteanu) (< Unraid 6.10 only)

diff --git a/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.php b/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.php index 5544bd5a..ffa0abc1 100644 --- a/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.php +++ b/source/community.applications/usr/local/emhttp/plugins/community.applications/skins/Narrow/skin.php @@ -21,16 +21,28 @@ function display_apps($pageNumber=1,$selectedApps=false,$startup=false) { $communityApplications = is_array($file['community']) ? $file['community'] : array(); $totalApplications = count($communityApplications); - $display = ( $totalApplications ) ? my_display_apps($communityApplications,$pageNumber,$selectedApps,$startup) : "
".tr("No Matching Applications Found")."
"; + $display = ( $totalApplications ) ? my_display_apps($communityApplications,$pageNumber,$selectedApps,$startup) : "
".tr("No Matching Applications Found")."
"; return $display; } function my_display_apps($file,$pageNumber=1,$selectedApps=false,$startup=false) { - global $caPaths, $caSettings, $plugin, $displayDeprecated, $sortOrder; - - $info = getRunningContainers(); + global $caPaths, $caSettings, $plugin, $displayDeprecated, $sortOrder, $DockerTemplates, $DockerClient; + $dockerUpdateStatus = readJsonFile($caPaths['dockerUpdateStatus']); + $repositories = readJsonFile($caPaths['repositoryList']); + + if ( is_file("/var/run/dockerd.pid") && is_dir("/proc/".@file_get_contents("/var/run/dockerd.pid")) ) { + $caSettings['dockerRunning'] = "true"; + $info = $DockerTemplates->getAllInfo(); + $dockerRunning = $DockerClient->getDockerContainers(); + $dockerUpdateStatus = readJsonFile($caPaths['dockerUpdateStatus']); + } else { + unset($caSettings['dockerRunning']); + $info = array(); + $dockerRunning = array(); + $dockerUpdateStatus = array(); + } if ( ! $selectedApps ) $selectedApps = array(); @@ -42,8 +54,6 @@ function my_display_apps($file,$pageNumber=1,$selectedApps=false,$startup=false) $checkedOffApps = arrayEntriesToObject(@array_merge(@array_values($selectedApps['docker']),@array_values($selectedApps['plugin']))); - $displayHeader .= getPageNavigation($pageNumber,count($file),false)."
"; - $columnNumber = 0; $appCount = 0; $startingApp = ($pageNumber -1) * $caSettings['maxPerPage'] + 1; @@ -59,34 +69,12 @@ function my_display_apps($file,$pageNumber=1,$selectedApps=false,$startup=false) $displayedTemplates[] = $template; } - $ct .= "
"; - - $iconClass = "displayIcon"; - $currentServer = @file_get_contents($caPaths['currentServer']); # Create entries for skins. foreach ($displayedTemplates as $template) { if ( $template['RepositoryTemplate'] ) { - if ( ! $theme ) { - $dynamix = parse_ini_file($caPaths['dynamixSettings'],true); - switch ($dynamix['display']['theme']) { - case 'white': - case 'black': - case 'azure': - case 'gray': - $theme = $dynamix['display']['theme']; - break; - default: - $theme = "black"; - break; - } - } - - - $template['icon'] = $template['icon'] ?: "/plugins/dynamix.docker.manager/images/question.png"; - $template['display_iconClickable'] = ""; - $template['display_infoIcon'] = ""; + $template['Icon'] = $template['icon'] ?: "/plugins/dynamix.docker.manager/images/question.png"; if ( ! $template['bio'] ) $template['CardDescription'] = tr("No description present"); @@ -96,27 +84,6 @@ function my_display_apps($file,$pageNumber=1,$selectedApps=false,$startup=false) $template['display_dockerName'] = $template['RepoName']; - $template['display_DonateImage'] = $template['DonateLink'] ? "" : ""; - - if ( $template['Forum'] ) - $template['display_faSupport'] = ""; - if ( $template['Twitter'] ) - $template['display_twitter'] = ""; - if ( $template['Reddit'] ) - $template['display_reddit'] = ""; - if ( $template['Facebook'] ) - $template['display_facebook'] = ""; - if ( $template['Discord'] ) { - if (version_compare($caSettings['unRaidVersion'],"6.9.0-beta37",">")) { - $template['display_discord'] = ""; - } else { - $template['display_discord'] = ""; - } - } - if ( $template['WebPage'] ) - $template['display_webpage'] = ""; - if ( $template['profile'] ) - $template['display_profile'] = ""; $favClass = ( $caSettings['favourite'] && ($caSettings['favourite'] == $template['RepoName']) ) ? "ca_favouriteRepo" : "ca_non_favouriteRepo"; $template['ca_fav'] = $caSettings['favourite'] && ($caSettings['favourite'] == $template['RepoName']); $niceRepoName = str_replace("'s Repository","",$template['RepoName']); @@ -124,250 +91,50 @@ function my_display_apps($file,$pageNumber=1,$selectedApps=false,$startup=false) $niceRepoName = str_replace(" Repository","",$niceRepoName); $favMsg = ($favClass == "ca_favouriteRepo") ? tr("Click to remove favourite repository") : tr(sprintf("Click to set %s as favourite repository",$niceRepoName)); - $template['display_favouriteButton'] = ""; - $template['display_repoSearch'] = ""; $ct .= displayCard($template); $count++; if ( $count == $caSettings['maxPerPage'] ) break; } else { - if ( $currentServer == "Primary Server" && $template['IconHTTPS']) - $template['Icon'] = $template['IconHTTPS']; + $template['ca_fav'] = $caSettings['favourite'] && ($caSettings['favourite'] == $template['RepoName']); + $template['Pinned'] = $pinnedApps["{$template['Repository']}&{$template['SortName']}"]; + $template['Twitter'] = $repositories[$template['Repo']]['Twitter']; + $template['Reddit'] = $repositories[$template['Repo']]['Reddit']; + $template['Facebook'] = $repositories[$template['Repo']]['Facebook']; + $template['Discord'] = $repositories[$template['RepoName']]['Discord']; - $name = $template['Name']; - $appName = str_replace(" ","",$template['SortName']); - $ID = $template['ID']; + $template['checked'] = $checkedOffApps[$previousAppName] ? "checked" : ""; - $tmpRepo = strpos($template['Repository'],":") ? $template['Repository'] : $template['Repository'].":latest"; - $tmpRepo = strpos($tmpRepo,"/") ? $tmpRepo : "library/$tmpRepo"; - if ( ! filter_var($dockerUpdateStatus[$tmpRepo]['status'],FILTER_VALIDATE_BOOLEAN) ) { - $template['UpdateAvailable'] = true; - } else { - $template['UpdateAvailable'] = false; + if ( ! $template['Plugin'] ) { + $tmpRepo = $template['Repository']; + if ( ! strpos($tmpRepo,"/") ) { + $tmpRepo = "library/$tmpRepo"; + } + foreach ($dockerRunning as $testDocker) { + if ( $tmpRepo == $testDocker['Image'] || "$tmpRepo:latest" == $testDocker['Image'] && $template['Name'] == $testDocker['Name'] && ! $template['Uninstall']) { + $template['Installed'] = true; + break; + } + } + } else { + $pluginName = basename($template['PluginURL']); + $template['Installed'] = checkInstalledPlugin($template) && ! $template['Uninstall']; + } - $template['ModeratorComment'] .= $template['CAComment']; - $template['RepoName_highlighted'] = $template['RepoName_highlighted'] ?: $template['RepoName']; - - $selected = appInstalled($template,$info); - $selected = $template['Uninstall'] ? true : $selected; - - $appType = $template['Plugin'] ? "plugin" : "docker"; - $previousAppName = $template['Plugin'] ? $template['PluginURL'] : $template['Name']; - $checked = $checkedOffApps[$previousAppName] ? "checked" : ""; - - $template['OriginalCategories'] = $template['Category']; - $template['Category'] = categoryList($template['Category']); - - $template['display_Private'] = ( $template['Private'] == "true" ) ? "" : ""; - - if ( $selected ) - $template['display_DonateImage'] = $template['DonateLink'] ? "" : ""; - $template['display_faProject'] = $template['Project'] ? "" : ""; - $supportText = $template['SupportClickLanguage'] ?: tr("Go to the support thread"); - $template['display_faSupport'] = $template['Support'] ? "" : ""; - $favClass = ( $caSettings['favourite'] == $template['RepoName'] ) ? "ca_favouriteRepo" : "ca_non_favouriteRepo"; - $niceRepoName = str_replace("'s Repository","",$template['RepoName']); - $niceRepoName = str_replace("' Repository","",$niceRepoName); - $niceRepoName = str_replace(" Repository","",$niceRepoName); - $favMsg = ($favClass == "ca_favouriteRepo") ? tr("Click to remove favourite repository") : tr(sprintf("Click to set %s as favourite repository",$niceRepoName)); - $template['ca_fav'] = ($caSettings['favourite'] && $caSettings['favourite'] == $template['RepoName']); - - if ( $template['RepoName'] ) { - $template['display_favouriteButton'] = ""; - } - - $template['display_ModeratorComment'] .= $template['ModeratorComment'] ? "{$template['ModeratorComment']}" : ""; - if ( $pinnedApps["{$template['Repository']}&{$template['SortName']}"] ) { - $pinned = "pinned"; - $pinnedTitle = tr("Click to unpin this application"); - } else { - $pinned = "unpinned"; - $pinnedTitle = tr("Click to pin this application"); - } - $template['display_pinButton'] = $template['LanguagePack'] !== "en_US" ? "" : ""; - if ($template['Blacklist']) - unset($template['display_pinButton']); - - if ( $template['Uninstall'] && $template['Name'] != "Community Applications" ) { - $template['display_Uninstall'] = "" : "data-type='docker' data-app='{$info[$name]['template']}' data-name='{$template['Name']}'>"; - $template['display_Uninstall'] .= ""; - } else { - if ( $template['Private'] == "true" ) - $template['display_Uninstall'] = ""; - } - $template['display_removable'] = $template['Removable'] && ! $selected ? "" : ""; - if ( $template['display_Uninstall'] && $template['display_removable'] ) - unset($template['display_Uninstall']); # prevent previously installed private apps from having 2 x's in previous apps section - - $template['display_humanDate'] = date("F j, Y",$template['Date']); - $template['display_multi_install'] = ($template['Removable']) ? "" : ""; - if (! $caSettings['dockerRunning'] && ! $template['Plugin']) - unset($template['display_multi_install']); - - if ( $template['Plugin'] ) - $template['UpdateAvailable'] = checkPluginUpdate($template['PluginURL']); - if ( ! $template['NoInstall'] && ! $caSettings['NoInstalls'] ){ # certain "special" categories (blacklist, deprecated, etc) don't allow the installation etc icons - if ( $template['Plugin'] ) { - $pluginName = basename($template['PluginURL']); - if ( checkInstalledPlugin($template) ) { - $pluginSettings = $pluginName == "community.applications.plg" ? "ca_settings" : plugin("launch","/var/log/plugins/$pluginName"); - $tmpVar = $pluginSettings ? "" : " disabled "; - $template['display_pluginSettingsIcon'] = $pluginSettings ? "" : ""; - unset($template['display_multi_install']); - unset($template['display_removable']); - } else { - $template['display_pluginInstallIcon'] = ""; - } - if ( $template['UpdateAvailable'] ) { - $template['display_pluginUpdate'] = ""; - } - } else { - if ( $caSettings['dockerRunning'] ) { - if ( $selected ) { - $template['InstallPath'] = $template['InstallPath'] ?: $template['Path']; - $template['display_dockerDefaultIcon'] = ""; - $template['display_dockerDefaultIcon'] = $template['BranchID'] ? "" : $template['display_dockerDefaultIcon']; - $template['display_dockerEditIcon'] = ""; - - if ( $caSettings['defaultReinstall'] == "true" ) { - if ( $template['BranchID'] ) - $template['display_dockerReinstallIcon'] = ""; - else - $template['display_dockerReinstallIcon'] = ""; - } -// $template['display_dockerReinstallIcon'] = $caSettings['defaultReinstall'] == "true" ? "" : ""; - $template['display_dockerUpdate'] = $template['UpdateAvailable'] ? "" : ""; - unset($template['display_multi_install']); - - if ( $info[$name]['url'] && $info[$name]['running'] ) - $template['dockerWebIcon'] = ""; - } else { - if ( $template['InstallPath'] ) - $template['display_dockerReinstallIcon'] = ""; - else { - $template['display_dockerInstallIcon'] = ""; - $template['display_dockerInstallIcon'] = $template['BranchID'] ? "" : $template['display_dockerInstallIcon']; - } - } - } - } - } else - $specialCategoryComment = $template['NoInstall']; - - $template['display_beta'] = $template['Beta'] ? "" : ""; - - $warningColor = "warning-white"; - - if ( $template['Deprecated'] ) { - $template['display_compatible'] .= tr("This application template has been deprecated")."
"; - $warningColor = "warning-yellow"; - } - if ( ! $template['Compatible'] && ! $template['UnknownCompatible'] ) { - $template['display_compatible'] .= tr("This application is not compatible with your version of Unraid")."
"; - $warningColor = "warning-red"; - } - if ( $template['Blacklist'] ) { - $template['display_compatible'] .= tr("This application template has been blacklisted")."
"; - $warningColor = "warning-red"; - } - - if ( $template['Requires'] ) - $template['display_warning-text'] = tr("This application has additional requirements"); - if ( $template['ModeratorComment'] ) - $template['display_warning-text'] = $template['ModeratorComment']; - if ( $template['Deprecated'] || ! $template['Compatible'] || $template['Blacklist'] ) - $template['display_warning-text'] .= $template['display_warning-text'] ? "
" : ""; - - $template['display_warning-text'] .= "{$template['display_compatible']}"; - - $template['display_faWarning'] = $template['display_warning-text'] ? "" : ""; - - if ( $template['RepoName'] ) { - if ( $template['Private'] ) { - $template['display_author'] = "{$template['Author']} - {$template['RepoName_highlighted']}"; - } else { - $template['display_repoName'] = "".$template['RepoName_highlighted'].""; - } - } else { - $template['display_author'] = $template['Author']; - } - $displayIcon = $template['Icon']; - $displayIcon = $displayIcon ? $displayIcon : "/plugins/dynamix.docker.manager/images/question.png"; - $template['display_iconSelectable'] = ""; - $moreInfoTxt = $template['InfoLanguage'] ?: tr("Click for more information"); - $appInfoBeta = $template['Beta'] ? "(Beta)" : ""; - $template['display_infoIcon'] = ""; - if ( isset($ID) ) { - $template['display_iconClickable'] = "".$template['display_iconSelectable'].""; - } else { - $template['display_iconClickable'] = $template['display_iconSelectable']; - } - if ( $template['IconFA'] ) { - $displayIcon = $template['IconFA'] ?: $template['Icon']; - $displayIconClass = startsWith($displayIcon,"icon-") ? $displayIcon : "fa fa-$displayIcon"; - $template['display_iconSelectable'] = "
"; - if ( isset($ID) ) { - $template['display_iconClickable'] = "".$template['display_iconSelectable'].""; - } else { - $template['display_iconClickable'] = $template['display_iconSelectable']; - } - } - - $template['display_dockerName'] = ""; - $template['display_dockerName'] .= $template['Name_highlighted'] ?: $template['Name']; - $template['display_dockerName'] .= ""; - - $template['Category'] = ($template['Category'] == "UNCATEGORIZED") ? tr("Uncategorized") : $template['Category']; - - // Language Specific if ( $template['Language'] ) { - if ( ! $currentLanguage ) { - $dynamixSettings = @parse_ini_file($caPaths['dynamixSettings'],true); - $currentLanguage = $dynamixSettings['display']['locale'] ?: "en_US"; - $installedLanguages = array_diff(scandir("/usr/local/emhttp/languages"),array(".","..")); - $installedLanguages = array_filter($installedLanguages,function($v) { - return is_file("/boot/config/plugins/lang-$v.xml"); - }); - $installedLanguages[] = "en_US"; - } - $currentLanguage = is_dir("/usr/local/emhttp/languages/$currentLanguage") ? $currentLanguage : "en_US"; - $countryCode = $template['LanguageDefault'] ? "en_US" : $template['LanguagePack']; - if ( in_array($countryCode,$installedLanguages) ) { - $template['display_languageUpdate'] = languageCheck($template) ? "" : ""; - unset($template['display_dockerInstallIcon']); - if ( $currentLanguage != $countryCode ) { - $template['display_language_switch'] = ""; - if ( $countryCode !== "en_US" ) - $template['display_Uninstall'] = ""; - } - } else { - unset($template['display_dockerInstallIcon']); - $template['display_languageInstallIcon'] = ""; - } - if ( $countryCode !== "en_US" ) { - $template['ca_LanguageDisclaimer'] = " {$template['disclaimLanguage']}"; - } - //$template['display_author'] = languageAuthorList($template['Author']); + $template['Installed'] = is_dir("{$caPaths['languageInstalled']}{$template['LanguagePack']}") && ! $template['Uninstall']; } - # Entries created. Now display it $ct .= displayCard($template); $count++; if ( $count == $caSettings['maxPerPage'] ) break; } } - $ct .= "
"; - $ct .= getPageNavigation($pageNumber,count($file),false,false)."


"; - - if ( $specialCategoryComment ) { - $displayHeader .= "
".tr("This display is informational ONLY.")."

"; - $displayHeader .= "
$specialCategoryComment
"; - } + $ct .= getPageNavigation($pageNumber,count($file),false,true)."


"; if ( ! $count ) - $displayHeader .= "
".tr("No Matching Applications Found")."
"; + $displayHeader .= "
".tr("No Matching Applications Found")."
"; return "$displayHeader$ct"; } @@ -377,9 +144,7 @@ function getPageNavigation($pageNumber,$totalApps,$dockerSearch,$displayCount = if ( $caSettings['maxPerPage'] < 0 ) return; $swipeScript = ""; $o .= "
"; return $o.$swipeScript; } -######################################################################################## -# function used to display the navigation (page up/down buttons) for dockerHub results # -######################################################################################## -function dockerNavigate($num_pages, $pageNumber) { - return getPageNavigation($pageNumber,$num_pages * 25, true); -} - -############################################################## -# function that actually displays the results from dockerHub # -############################################################## -function displaySearchResults($pageNumber) { - global $caPaths, $caSettings, $plugin; - - $tempFile = readJsonFile($caPaths['dockerSearchResults']); - $num_pages = $tempFile['num_pages']; - $file = $tempFile['results']; - $templates = readJsonFile($caPaths['community-templates-info']); - - $ct = dockerNavigate($num_pages,$pageNumber)."
"; - $ct .= "
"; - - $columnNumber = 0; - foreach ($file as $result) { - $result['Icon'] = "/plugins/dynamix.docker.manager/images/question.png"; - $result['display_dockerName'] = "{$result['Name']}"; - $result['display_author'] = "{$result['Author']}"; - $result['Category'] = "Docker Hub Search"; - $result['display_iconClickable'] = ""; - $result['Description'] = $result['Description'] ?: "No description present"; - $result['display_faProject'] = ""; - $result['display_dockerInstallIcon'] = $caSettings['NoInstalls'] ? "" : ""; - $ct .= displayCard($result); - $count++; - } - $ct .= "
"; - - return $ct.dockerNavigate($num_pages,$pageNumber); -} ###################################### # Generate the display for the popup # @@ -478,6 +204,7 @@ function getPopupDescriptionSkin($appNumber) { $tabMode = '_parent'; $allRepositories = readJsonFile($caPaths['repositoryList']); + $pinnedApps = readJsonFile($caPaths['pinnedV2']); if ( is_file("/var/run/dockerd.pid") && is_dir("/proc/".@file_get_contents("/var/run/dockerd.pid")) ) { $caSettings['dockerRunning'] = "true"; @@ -501,27 +228,35 @@ function getPopupDescriptionSkin($appNumber) { else $displayed = readJsonFile($caPaths['community-templates-displayed']); - foreach ($displayed as $file) { - $index = searchArray($file,"Path",$appNumber); - if ( $index === false ) { - continue; - } else { - $template = $file[$index]; - $Displayed = true; - break; + $index = searchArray($displayed['community'],"InstallPath",$appNumber); + if ( $index === false ) { + $index = searchArray($displayed['community'],"Path",$appNumber); + $ind = $index; + while ( true ) { + if ( $template['Name'] == $displayed['community'][$ind]['Name'] ) { + $index = $ind; + break; + } + $ind = searchArray($displayed['community'],"Path",$ind+1); + if ( $ind === false ) + break; } } + + if ( $index !== false ) { +/* $Displayed = true; + */ $template = $displayed['community'][$index]; + } + # handle case where the app being asked to display isn't on the most recent displayed list (ie: multiple browser tabs open) if ( ! $template ) { $file = readJsonFile($caPaths['community-templates-info']); $index = searchArray($file,"Path",$appNumber); - if ( $index === false ) { echo json_encode(array("description"=>tr("Something really wrong happened. Reloading the Apps tab will probably fix the problem"))); return; } $template = $file[$index]; - $Displayed = false; } $currentServer = file_get_contents($caPaths['currentServer']); @@ -531,6 +266,7 @@ function getPopupDescriptionSkin($appNumber) { $ID = $template['ID']; $template['Profile'] = $allRepositories[$template['RepoName']]['profile']; + $template['ProfileIcon'] = $allRepositories[$template['RepoName']]['icon']; // Hack the system so that language's popups always appear in the appropriate language if ( $template['Language'] ) { @@ -555,9 +291,7 @@ function getPopupDescriptionSkin($appNumber) { $template['Repository'] = "library/{$template['Repository']}"; } foreach ($dockerRunning as $testDocker) { - $templateRepo = explode(":",$template['Repository']); - $testRepo = explode(":",$testDocker['Image']); - if ($templateRepo[0] == $testRepo[0]) { + if ( ($template['Repository'] == $testDocker['Image'] || "{$template['Repository']}:latest" == $testDocker['Image']) && ($template['Name'] == $testDocker['Name']) ) { $selected = true; $name = $testDocker['Name']; break; @@ -581,12 +315,11 @@ function getPopupDescriptionSkin($appNumber) { if ( ! $ovr ) $ovr = $template['OriginalDescription'] ?: $template['Description']; $ovr = html_entity_decode($ovr); -// $ovr = str_replace(" ","
",$ovr); $ovr = str_replace(["[","]"],["<",">"],$ovr); -// $ovr = str_replace("
","\n",$ovr); $ovr = str_replace("\n","
",$ovr); $ovr = str_replace(" ","    ",$ovr); $ovr = markdown(strip_tags($ovr,"
")); + $template['display_ovr'] = $ovr; $template['ModeratorComment'] .= $template['CAComment']; @@ -594,9 +327,11 @@ function getPopupDescriptionSkin($appNumber) { $templateURL = $template['PluginURL']; download_url($templateURL,$caPaths['pluginTempDownload']); $template['Changes'] = @plugin("changes",$caPaths['pluginTempDownload']); + $template['pluginVersion'] = @plugin("version",$caPaths['pluginTempDownload']) ?: $template['pluginVersion']; + } else { - if ( ! $template['Changes'] ) { + if ( ! $template['Changes'] && $template['ChangeLogPresent']) { $templateURL = $template['caTemplateURL'] ?: $template['TemplateURL']; download_url($templateURL,$caPaths['pluginTempDownload']); $xml = readXmlFile($caPaths['pluginTempDownload']); @@ -605,78 +340,85 @@ function getPopupDescriptionSkin($appNumber) { } $template['Changes'] = str_replace(" ","    ",$template['Changes']); // Prevent inadvertent code blocks $template['Changes'] = Markdown(strip_tags(str_replace(["[","]"],["<",">"],$template['Changes']),"
")); + if ( trim($template['Changes']) ) + $template['display_changes'] = trim($template['Changes']); -// $templateDescription .= "
".tr("CLOSE")."
"; - $templateDescription .= "
{$template['Name']}
"; - $templateDescription .= "
"; - $templateDescription .= "
"; if ( $template['IconFA'] ) { $template['IconFA'] = $template['IconFA'] ?: $template['Icon']; - $templateIcon = startsWith($template['IconFA'],"icon-") ? $template['IconFA'] : "fa fa-{$template['IconFA']}"; - $templateDescription .= ""; + $templateIcon = startsWith($template['IconFA'],"icon-") ? "{$template['IconFA']} unraidIcon" : "fa fa-{$template['IconFA']}"; + $template['display_icon'] = ""; } else - $templateDescription .= ""; + $template['display_icon'] = ""; - $templateDescription .= "
"; - - $templateDescription .= "
"; - $templateDescription .= "
$ovr
"; if ( $template['Requires'] ) { $template['Requires'] = Markdown(strip_tags(str_replace(["\r","\n"," "],["","
",""],trim($template['Requires'])),"
")); - $templateDescription .= "

".tr("Additional Requirements")."
{$template['Requires']}
"; } - $templateDescription .= "
"; - if ( $donatelink ) - $templateDescription .= "$donatetext  ".tr("Donate")."

"; - - $templateDescription .= $template['disclaimLine1'] && ! $template['LanguageDefault'] ? "" : ""; - $templateDescription .= "
"; - $templateDescription .= "
"; - $installLine = "
"; + $actionsContext = []; if ( ! $template['Language'] ) { - if ( $Displayed && ! $template['NoInstall'] && ! $caSettings['NoInstalls']) { + if ( ! $template['NoInstall'] && ! $caSettings['NoInstalls']) { if ( ! $template['Plugin'] ) { if ( $caSettings['dockerRunning'] ) { if ( $selected ) { + if ( $info[$name]['url'] && $info[$name]['running'] ) { + $actionsContext[] = array("icon"=>"ca_fa-globe","text"=>"WebUI","action"=>"openNewWindow('{$info[$name]['url']}','_blank');"); + } $tmpRepo = strpos($template['Repository'],":") ? $template['Repository'] : $template['Repository'].":latest"; $tmpRepo = strpos($tmpRepo,"/") ? $tmpRepo : "library/$tmpRepo"; if ( ! filter_var($dockerUpdateStatus[$tmpRepo]['status'],FILTER_VALIDATE_BOOLEAN) ) { - $installLine .= ""; + $actionsContext[] = array("icon"=>"ca_fa-update","text"=>tr("Update"),"action"=>"updateDocker('$name');"); } if ( $caSettings['defaultReinstall'] == "true" ) { if ( $template['BranchID'] ) - $installLine .= ""; + $actionsContext[] = array("icon"=>"ca_fa-install","text"=>tr("Install second instance"),"action"=>"displayTags('{$template['ID']}',true);"); else - $installLine .= ""; + $actionsContext[] = array("icon"=>"ca_fa-install","text"=>tr("Install second instance"),"action"=>"popupInstallXML('".addslashes($template['Path'])."','second');"); } - $installLine .= ""; - if ( $info[$name]['url'] && $info[$name]['running'] ) { - $installLine .= ""; - } - } else { - if ( $template['InstallPath'] ) - $installLine .= ""; - else { - $install = ""; - $installLine .= $template['BranchID'] ? "" : $install; + $actionsContext[] = array("icon"=>"ca_fa-edit","text"=>tr("Edit"),"action"=>"popupInstallXML('".addslashes($info[$name]['template'])."','edit');"); + $actionsContext[] = array("divider"=>true); + $actionsContext[] = array("icon"=>"ca_fa-delete","text"=>"".tr("Uninstall")."","action"=>"uninstallDocker('".addslashes($info[$name]['template'])."','{$template['Name']}');"); + + } elseif ( ! $template['Blacklist'] || ! $template['Compatible']) { + if ( $template['InstallPath'] ) { + $actionsContext[] = array("icon"=>"ca_fa-install","text"=>tr("Reinstall"),"action"=>"popupInstallXML('".addslashes($template['InstallPath'])."','user');"); + $actionsContext[] = array("divider"=>true); + $actionsContext[] = array("icon"=>"ca_fa-delete","text"=>"".tr("Remove from Previous Apps")."","action"=>"removeApp('{$template['InstallPath']}','{$template['Name']}');"); + } else { + if ( ! $template['BranchID'] ) { + $template['newInstallAction'] = "popupInstallXML('".addslashes($template['Path'])."','default');"; + + } else { + $template['newInstallAction'] = "displayTags('{$template['ID']}');"; + } } } } } else { if ( file_exists("/var/log/plugins/$pluginName") ) { - if ( plugin("version","/var/log/plugins/$pluginName") != plugin("version",$caPaths['pluginTempDownload']) ) { - copy($caPaths['pluginTempDownload'],"/tmp/plugins/$pluginName"); - $installLine .= ""; + if ( plugin("version","/var/log/plugins/$pluginName") != $template['pluginVersion'] ) { + @copy($caPaths['pluginTempDownload'],"/tmp/plugins/$pluginName"); + $actionsContext[] = array("icon"=>"ca_fa-update","text"=>tr("Update"),"action"=>"installPlugin('$pluginName',true);"); } - } - if ( file_exists("/var/log/plugins/$pluginName") ) { $pluginSettings = $pluginName == "community.applications.plg" ? "ca_settings" : plugin("launch","/var/log/plugins/$pluginName"); - if ( $pluginSettings ) - $installLine .= ""; - } else { + if ( $pluginSettings ) { + $actionsContext[] = array("icon"=>"ca_fa-pluginSettings","text"=>tr("Settings"),"action"=>"openNewWindow('/Apps/$pluginSettings');"); + } + if ( ! empty($actionsContext) ) + $actionsContext[] = array("divider"=>true); + + $actionsContext[] = array("icon"=>"ca_fa-delete","text"=>"".tr("Uninstall")."","action"=>"uninstallApp('/var/log/plugins/$pluginName','{$template['Name']}');"); + } elseif ( ! $template['Blacklist'] || ! $template['Compatible'] ) { $buttonTitle = $template['InstallPath'] ? tr("Reinstall") : tr("Install"); - $installLine .= ""; + $actionsContext[] = array("icon"=>"ca_fa-install","text"=>$buttonTitle,"action"=>"installPlugin('{$template['PluginURL']}');"); + if ( $template['InstallPath'] ) { + if ( ! empty($actionsContext) ) + $actionsContext[] = array("divider"=>true); + $actionsContext[] = array("icon"=>"ca_fa-delete","text"=>"".tr("Remove from Previous Apps")."","action"=>"removeApp('{$template['InstallPath']}','$pluginName');"); + } + if ( count($actionsContext) == 1 ) { + $template['newInstallAction'] = "installPlugin('{$template['PluginURL']}')"; + unset($actionsContext); + } } } } @@ -692,14 +434,19 @@ function getPopupDescriptionSkin($appNumber) { $currentLanguage = (is_dir("/usr/local/emhttp/languages/$currentLanguage") ) ? $currentLanguage : "en_US"; if ( in_array($countryCode,$installedLanguages) ) { if ( $currentLanguage != $countryCode ) { - $installLine .= ""; + $actionsContext[] = array("icon"=>"ca_fa-switchto","text"=>$template['SwitchLanguage'],"action"=>"CAswitchLanguage('$countryCode');"); } } else { - $installLine .= ""; + $actionsContext[] = array("icon"=>"ca_fa-install","text"=>$template['InstallLanguage'],"action"=>"installLanguage('{$template['TemplateURL']}','$countryCode');"); } if ( file_exists("/var/log/plugins/lang-$countryCode.xml") ) { if ( languageCheck($template) ) { - $installLine .= ""; + $actionsContext[] = array("icon"=>"ca_fa-update","text"=>$template['UpdateLanguage'],"action"=>"updateLanguage('$countryCode');"); + } + if ( $currentLanguage != $countryCode ) { + if ( ! empty($actionsContext) ) + $actionsContext[] = array("divider"=>true); + $actionsContext[] = array("icon"=>"ca_fa-delete","text"=>"".tr("Remove Language Pack")."","action"=>"removeLanguage('$countryCode');"); } } if ( $countryCode !== "en_US" ) { @@ -709,133 +456,24 @@ function getPopupDescriptionSkin($appNumber) { } } - if ( $template['Support'] || $template['Project'] ) { - $supportText = $template['SupportLanguage'] ?: tr("Support"); - $installLine .= $template['Support'] ? "" : ""; - $installLine .= $template['Project'] ? "" : ""; - } - $installLine .= ""; - $installLine .= "
"; + $supportContext = array(); + if ( $template['ReadMe'] ) + $supportContext[] = array("icon"=>"ca_fa-readme","link"=>$template['ReadMe'],"text"=>tr("Read Me First")); + if ( $template['Project'] ) + $supportContext[] = array("icon"=>"ca_fa-project","link"=>$template['Project'],"text"=> tr("Project")); - if ( $installLine ) { - $templateDescription .= "$installLine"; - if ($template['BranchID']) { - $templateDescription .= ""; - } - } - $templateDescription .= "
"; - $templateDescription .= "
"; + if ( $allRepositories[$template['Repo']]['Discord'] ) + $supportContext[] = array("icon"=>"ca_discord","link"=>$allRepositories[$template['Repo']]['Discord'],"text"=>tr("Discord")); + if ( $template['Support'] ) + $supportContext[] = array("icon"=>"ca_fa-support","link"=>$template['Support'],"text"=> $template['SupportLanguage'] ?: tr("Support Forum")); - $templateDescription .= ""; + if ( $template['Registry'] ) + $supportContext[] = array("icon"=>"ca_fa-docker","link"=>$template['Registry'],"text"=> tr("Registry")); + if ( $caSettings['dev'] == "yes" ) + $supportContext[] = array("icon"=>"ca_fa-template","link"=> $template['caTemplateURL'] ?: $template['TemplateURL'],"text"=>tr("Application Template")); $author = $template['PluginURL'] ? $template['PluginAuthor'] : $template['SortAuthor']; - $templateDescription .= ""; - if ( ! $template['Plugin'] && ! $template['Language']) { - $templateDescription .= ""; - } - $templateDescription .= ""; - $templateDescription .= ($template['Private'] == "true") ? "" : ""; - $templateDescription .= ( $dockerVars['DOCKER_AUTHORING_MODE'] == "yes" && $templateURL) ? "" : ""; - if ( $template['Category'] ) { - $templateDescription .= ""; - } - if ( $template['Language'] ) { - $templateDescription .= ""; - $templateDescription .= ""; - if ( ! $countryCode || $countryCode == "en_US" ) - $templateDescription .= ""; - } - if ( filter_var($template['multiLanguage'],FILTER_VALIDATE_BOOLEAN) ) - $templateDescription .= ""; - - $templateDescription .= $template['stars'] ? "" : ""; - - if ( $template['FirstSeen'] > 1 && $template['Name'] != "Community Applications" && $countryCode != "en_US") - $templateDescription .= ""; - - # In this day and age with auto-updating apps, NO ONE keeps up to date with the date updated. Remove from docker containers to avoid confusion - if ( $template['Date'] && $template['Plugin'] ) { - $niceDate = tr(date("F",$template['Date']),0).date(" j, Y",$template['Date']); - $templateDescription .= ""; - } - if ( $template['Plugin'] ) { - $template['pluginVersion'] = $template['pluginVersion'] ?: tr("unknown"); - $templateDescription .= ""; - } - if ($template['Language'] && $template['LanguageURL']) { - $templateDescription .= ""; - if ( is_file("{$caPaths['installedLanguages']}/dynamix.$countryCode.xml") ) { - $installedVersion = exec("/usr/local/emhttp/plugins/dynamix.plugin.manager/scripts/language Version /var/log/plugins/lang-$countryCode.xml"); - $templateDescription .= ""; - } - } - - $unraidVersion = parse_ini_file($caPaths['unRaidVersion']); - $templateDescription .= ( $template['MinVer'] > "6.4.0" ) ? "" : ""; - - $template['MaxVer'] = $template['MaxVer'] ?: $template['DeprecatedMaxVer']; - $templateDescription .= $template['MaxVer'] ? "" : ""; - $downloads = getDownloads($template['downloads']); - if ($downloads) - $templateDescription .= ""; - - $templateDescription .= $template['Licence'] ? "" : ""; - if ( $template['trending'] ) { - $templateDescription .= ""; - $templateDescription .= ""; - } - $templateDescription .= "
".tr("Author:")."$author
".tr("DockerHub:")."{$template['Repository']}
".tr("Repository:").""; - $templateDescription .= " "; - $templateDescription .= str_ireplace("Repository","",$template['RepoName']).tr("Repository").""; - if ( ($template['Repo'] == str_replace("*","'",$caSettings['favourite'])) && $caSettings['favourite'] ) - $templateDescription .= " "; - $templateDescription .= "
Private Repository
".tr("Application Template")."
".tr("Categories:")."".$template['Category']; - $templateDescription .= "
".tr("Language").":{$template['Language']}"; - if ( $template['LanguageLocal'] ) - $templateDescription .= " - {$template['LanguageLocal']}"; - $templateDescription .= "
".tr("Country Code:")."$countryCode
 
".tr("Multi Language Support")."".tr("Yes")."
".tr("DockerHub Stars:")." ".$template['stars']."
".tr("Added to CA:")."".tr(date("F",$template['FirstSeen']),0).date(" j, Y",$template['FirstSeen'])."
".tr("Date Updated:")."$niceDate
".tr("Current Version:")."{$template['pluginVersion']}
".tr("Current Version:")."{$template['Version']}
".tr("Installed Version:")."$installedVersion
".tr("Minimum OS:")."Unraid v".$template['MinVer']."
".tr("Max OS:")."Unraid v".$template['MaxVer']."
".tr("Total Downloads:")."$downloads
".tr("Licence:")."".$template['Licence']."
".tr("30 Day Trend:")."".sprintf(tr("Ranked #%s"),$trendRank); - if (is_array($template['trends']) && (count($template['trends']) > 1) ){ - $templateDescription .= " ".sprintf(tr("Trending %s"), (end($template['trends']) > $template['trends'][count($template['trends'])-2]) ? " " : " "); - } - $templateDescription .= "
".sprintf(tr("(As of %s)"),tr(date("F",$template['LastUpdateScan']),0).date(" j, Y g:i a",$template['LastUpdateScan']),0)."
"; - - $templateDescription .= "
"; - if ($template['Blacklist']) - $templateDescription .= tr("This application / template has been blacklisted")."
"; - - if ($template['Deprecated']) - $templateDescription .= tr("This application / template has been deprecated")."
"; - - if ( !$template['Compatible'] ) - $templateDescription .= tr("This application is not compatible with your version of Unraid")."
"; - - $templateDescription .= "
"; - $templateDescription .= "
"; - if ( ! $Displayed ) - $templateDescription .= "
  ".tr("Another browser tab or device has updated the displayed templates. Some actions are not available")."
"; - - - $templateDescription .= $template['ModeratorComment'] ? "

".tr("Moderator Comments:")." ".$template['ModeratorComment'] : ""; - $templateDescription .= "


"; - - - $templateDescription .= "
"; - if ($template['Plugin']) { - $dupeList = readJsonFile($caPaths['pluginDupes']); - if ( $dupeList[basename($template['Repository'])] == 1 ){ - $allTemplates = readJsonFile($caPaths['community-templates-info']); - foreach ($allTemplates as $testTemplate) { - if ($testTemplate['Repository'] == $template['Repository']) continue; - - if ($testTemplate['Plugin'] && (basename($testTemplate['Repository']) == basename($template['Repository']))) - $duplicated .= $testTemplate['Author']." - ".$testTemplate['Name']; - } - $templateDescription .= "
".sprintf(tr("This plugin has a duplicated name from another plugin %s. This will impact your ability to install both plugins simultaneously"),$duplicated)."
"; - } - } if (is_array($template['trends']) && (count($template['trends']) > 1) ){ if ( $template['downloadtrend'] ) { $templateDescription .= "
"; @@ -847,25 +485,7 @@ function getPopupDescriptionSkin($appNumber) { $changeLogMessage = "Note: not all "; $changeLogMessage .= $template['PluginURL'] || $template['Language'] ? "authors" : "maintainers"; $changeLogMessage .= " keep up to date on change logs
"; - $changeLogMessage = "
".tr($changeLogMessage)."

"; - } - if ( trim($template['Changes']) ) { - if ( $template['Plugin'] ) { - - $appInformation .= $template['Changes']; - } elseif ($template['Language']) { - $appInformation .= trim($template['Changes']); - } else { - $appInformation = $template['Changes']; - } - if ( ! $template['Language'] ) { - $templateDescription .= "

".tr("Change Log")."

$changeLogMessage$appInformation"; - } else { - $templateDescription .= "

$appInformation
"; - } - if ( $template['Language'] ) { - $templateDescription .= ""; - } + $template['display_changelogMessage'] = tr($changeLogMessage); } if (is_array($template['trendsDate']) ) { @@ -891,9 +511,19 @@ function getPopupDescriptionSkin($appNumber) { } $down = is_array($down) ? $down : array(); } - $templateDescription = "
".tr("CLOSE")."
$templateDescription
"; + + if ( $pinnedApps["{$template['Repository']}&{$template['SortName']}"] ) { + $template['pinned'] = "pinned"; + $template['pinnedTitle'] = tr("Click to unpin this application"); + } else { + $template['pinned'] = "unpinned"; + $template['pinnedTitle'] = tr("Click to pin this application"); + } + $template['actionsContext'] = $actionsContext; + $template['supportContext'] = $supportContext; @unlink($caPaths['pluginTempDownload']); - return array("description"=>$templateDescription,"trendData"=>$template['trends'],"trendLabel"=>$chartLabel,"downloadtrend"=>$down,"downloadLabel"=>$downloadLabel,"totaldown"=>$totalDown,"totaldownLabel"=>$downloadLabel); + + return array("description"=>displayPopup($template),"trendData"=>$template['trends'],"trendLabel"=>$chartLabel,"downloadtrend"=>$down,"downloadLabel"=>$downloadLabel,"totaldown"=>$totalDown,"totaldownLabel"=>$downloadLabel,"supportContext"=>$supportContext,"actionsContext"=>$actionsContext); } ##################################### @@ -907,52 +537,11 @@ function getRepoDescriptionSkin($repository) { $templates = readJsonFile($caPaths['community-templates-info']); $repo = $repositories[$repository]; $repo['icon'] = $repo['icon'] ?: "/plugins/dynamix.docker.manager/images/question.png"; - - $t .= "
".tr("CLOSE")."
"; - $t .= "
$repository
"; - $t .= "
"; - $t .= "
"; $repo['bio'] = $repo['bio'] ? markdown($repo['bio']) : "
".tr("No description present"); - $t .= "

".strip_tags($repo['bio'])."
"; - - if ( $repo['DonateLink'] ) { - $t .= "


"; - } else { - $t .= "

"; - } - - $t .= "
"; - - if ( $caSettings['favourite'] == $repository ) - $t .= "
".tr("Favourite Repository")."
"; - else - $t .= "
".tr("Set as favourite repository")."
"; - - $installLine = "
"; - $installLine .= ""; - if ( $repo['WebPage'] ) - $installLine .= ""; - if ( $repo['Forum'] ) - $installLine .= ""; - if ( $repo['profile'] ) - $installLine .= ""; - if ( $repo['Facebook'] ) - $installLine .= ""; - if ( $repo['Reddit'] ) - $installLine .= ""; - if ( $repo['Twitter'] ) - $installLine .= ""; - if ( $repo['Discord'] ) { - if (version_compare($caSettings['unRaidVersion'],"6.9.0-beta37",">")) { - $installLine .= ""; - } else { - $installLine .= ""; - } - } - - $t .= "$installLine
"; + $favRepoClass = ($caSettings['favourite'] == $repository) ? "fav" : "nonfav"; $totalApps = $totalPlugins = $totalDocker = $totalDownloads = 0; + foreach ($templates as $template) { if ( $template['RepoName'] !== $repository ) continue; if ( $template['BranchID'] ) continue; @@ -977,31 +566,82 @@ function getRepoDescriptionSkin($repository) { $totalApps++; } - $t .= "
"; - $t .= "
"; - $t .= ""; - if ( $repo['FirstSeen'] > 1 ) - $t .= ""; - $t .= ""; - $t .= ""; - if ( $totalLanguage ) - $t .= ""; - if ($dockerVars['DOCKER_AUTHORING_MODE'] == "yes") - $t .= ""; - $t .= ""; + $t .= " +
".tr("CLOSE")."
+
".tr("BACK")."
+
+
+ +
+
+
$repository
+
".tr("See All Apps")."
+
".tr("Favourite")."
+
+
+

".strip_tags($repo['bio'])."
+ "; + if ( $repo['DonateLink'] ) { + $t .= " +
+
{$repo['DonateText']}
+ +
+
".tr("Added to CA")."".date("F j, Y",$repo['FirstSeen'])."
".tr("Total Docker Applications")."$totalDocker
".tr("Total Plugin Applications")."$totalPlugins
".tr("Total Languages")."$totalLanguage
".tr("Repository URL")."
".tr("Total Applications")."$totalApps
+ "; + if ( $repo['FirstSeen'] > 1 ) + $t .= ""; + + $t .= " + + + "; + if ( $totalLanguage ) + $t .= " + + "; + if ( $caSettings['dev'] == "yes") + $t .= " + + "; + + $t .= " + + "; if ( $downloadDockerCount && $totalDownloads ) { $avgDownloads = intval($totalDownloads / $downloadDockerCount); - $t .= ""; - $t .= ""; + $t .= ""; + $t .= ""; } $t .= "
".tr("Added to CA")."".date("F j, Y",$repo['FirstSeen'])."
".tr("Total Docker Applications")."$totalDocker
".tr("Total Plugin Applications")."$totalPlugins
".tr("Total Languages")."$totalLanguage
".tr("Repository URL")."
".tr("Total Applications")."$totalApps
".tr("Total Known Downloads")."".number_format($totalDownloads)."
".tr("Average Downloads Per App")."".number_format($avgDownloads)."
".tr("Total Known Downloads")."".number_format($totalDownloads)."
".tr("Average Downloads Per App")."".number_format($avgDownloads)."
"; $t .= "
"; - - - $t = "
$t
"; + $t = ""; return array("description"=>$t); } @@ -1009,64 +649,345 @@ function getRepoDescriptionSkin($repository) { # Generate the app's card # ########################### function displayCard($template) { - global $ca_settings; - + global $caSettings; + $appName = str_replace("-"," ",$template['display_dockerName']); - $dockerReinstall = $ca_Settings['defaultReinstall'] == "true" ? $template['display_dockerDefaultIcon'] : ""; - $holder = $template['Plugin'] ? "ca_holderPlugin" : "ca_holderDocker"; - $holder = $template['Language'] ? "ca_holderLanguage" : $holder; - $holder = $template['RepositoryTemplate'] ? "ca_holderRepository" : $holder; - $holder = (strpos($template['OriginalCategories'],"Drivers") !== false) && $template['Plugin'] ? "ca_holderDriver" : $holder; - if ( $template['ca_fav'] ) - $holder .= " ca_holderFav"; - - $descriptionArea = $template['RepositoryTemplate'] ? "ca_descriptionAreaRepository" : "ca_descriptionArea"; $popupType = $template['RepositoryTemplate'] ? "ca_repoPopup" : "ca_appPopup"; + if ( $template['Category'] == "Docker Hub Search" ) + unset($popupType); if ($template['Language']) { $language = "{$template['Language']}"; $language .= $template['LanguageLocal'] ? " - {$template['LanguageLocal']}" : ""; $template['Category'] = ""; } + extract($template); + + $appType = $Plugin ? "appPlugin" : "appDocker"; + $appType = $Language ? "appLanguage": $appType; + $appType = (strpos($Category,"Drivers") !== false) && $Plugin ? "appDriver" : $appType; + $appType = $RepositoryTemplate ? "appRepository" : $appType; + + if ($InstallPath) + $Path = $InstallPath; + + $Category = explode(" ",$Category)[0]; + $Category = explode(":",$Category)[0]; + + $author = $RepoShort ?: $RepoName; + if ( $Plugin ) + $author = $Author; + if ( $Language ) + $author = "Unraid"; + + + if ( !$RepositoryTemplate ) { + $cardClass = "ca_appPopup"; + $supportContext = array(); + if ( $template['ReadMe'] ) + $supportContext[] = array("icon"=>"ca_fa-readme","link"=>$template['ReadMe'],"text"=>tr("Read Me First")); + if ( $template['Project'] ) + $supportContext[] = array("icon"=>"ca_fa-project","link"=>$template['Project'],"text"=> tr("Project")); + if ( $Discord ) + $supportContext[] = array("icon"=>"ca_discord","link"=>$Discord,"text"=>tr("Discord")); + if ( $template['Support'] ) + $supportContext[] = array("icon"=>"ca_fa-support","link"=>$template['Support'],"text"=> $template['SupportLanguage'] ?: tr("Support Forum")); + + } else { + $cardClass = "ca_repoinfo"; + $ID = str_replace(" ","",$RepoName); + $supportContext = array(); + if ( $profile ) + $supportContext[] = array("icon"=>"ca_profile","link"=>$profile,"text"=>tr("Profile")); + if ( $Forum ) + $supportContext[] = array("icon"=>"ca_forum","link"=>$Forum,"text"=>tr("Forum")); + if ( $Twitter ) + $supportContext[] = array("icon"=>"ca_twitter","link"=>$Twitter,"text"=>tr("Twitter")); + if ( $Reddit ) + $supportContext[] = array("icon"=>"ca_reddit","link"=>$Reddit,"text"=>tr("Reddit")); + if ( $Facebook ) + $supportContext[] = array("icon"=>"ca_facebook","link"=>$Facebook,"text"=>tr("Facebook")); + + if ( $WebPage ) + $supportContext[] = array("icon"=>"ca_webpage","link"=>$WebPage,"text"=>tr("Web Page")); + + + $Name = str_replace("' Repository","",str_replace("'s Repository","",$author)); + $Name = str_replace(" Repository","",$Name); + $author = ""; + + } + $display_repoName = str_replace("' Repository","",str_replace("'s Repository","",$display_repoName)); - $card = " -
-
-
- $display_iconClickable -
-
-
- - $appName $display_faWarning$display_beta - - $display_Private -
- $display_repoName$display_author -
- - $Category$language - -
$display_DonateImage$ca_LanguageDisclaimer -
-
-
-
-
- $display_multi_install$display_dockerUpdate$display_pluginUpdate$display_languageUpdate$display_languageInstallIcon$display_language_switch$display_pluginInstallIcon$display_dockerInstallIcon $dockerReinstall $display_dockerReinstallIcon $display_dockerEditIcon $display_pluginSettingsIcon$display_infoIcon $dockerWebIcon$display_profile$display_webpage$display_faSupport$display_twitter$display_reddit$display_discord$display_facebook $display_faProject $display_pinButton$display_repoSearch$display_faFavourite$display_favouriteButton - - $display_removable $display_Uninstall - -
-
- $CardDescription -
-
+ + $bottomClass = $class ? "ca_bottomLineSpotLight" : ""; + $card .= " +
+
+
".tr("Info")."
"; + if ( count($supportContext) == 1) + $card .= "
{$supportContext[0]['text']}
"; + elseif (!empty($supportContext)) + $card .= " +
".tr("Support")."
+ "; + + $card .= " + + "; + if ( $ca_fav ) + $card .= ""; + else + $card .= ""; + + + + if ($Removable && !$DockerInfo) { + $previousAppName = $Plugin ? $PluginURL : $Name; + $type = ($appType == "appDocker") ? "docker" : "plugin"; + $card .= ""; + } + $card .= "
"; + $card .= "
"; + $card .= "
"; + if ( ! $IconFA ) + $card .= " + + "; + else { + $displayIcon = $template['IconFA'] ?: $template['Icon']; + $displayIconClass = startsWith($displayIcon,"icon-") ? $displayIcon : "fa fa-$displayIcon"; + $card .= ""; + } + $card .= "
"; + + + $card .= " +
$Name
+
$author
+
$Category
+ "; + + $card .= " +
+ "; + if ( $class=='spotlightHome' ) { + $ovr = html_entity_decode($Overview); + $ovr = trim($ovr); + $ovr = str_replace(["[","]"],["<",">"],$ovr); + $ovr = str_replace("\n","
",$ovr); + + $ovr = str_replace(" ","    ",$ovr); + $ovr = markdown(strip_tags($ovr,"
")); + + $ovr = str_replace("\n","
",$ovr); + $Overview = explode("
",$ovr)[0]; + $card .= " +
$Overview
+
+
+
".tr(date("M Y",$RecommendedDate),0)."
+
+ "; + } + $card .= "
"; + if ( $Installed ) { + $card .= "
"; + $card .= "
".tr("INSTALLED")."
"; + $card .= "
"; + } else if ( $Beta ) { + $card .= "
"; + $card .= "
".tr("BETA")."
"; + $card .= "
"; + } else if ( $RecommendedDate ) { + $card .= "
"; + $card .= "
"; + $card .= "
"; + } return str_replace(["\t","\n"],"",$card); } +function displayPopup($template) { + global $caSettings; + + extract($template); + + if ( !$Private) + $RepoName = str_replace("' Repository","",str_replace("'s Repository","",$Repo)); + else { + $RepoName = str_replace("' Repository","",str_replace("'s Repository","",$RepoName)); + $Repo = $RepoName; + } + if ( $RepoShort ) $RepoName = $RepoShort; + + $FirstSeen = ($FirstSeen < 1433649600 ) ? 1433000000 : $FirstSeen; + $DateAdded = date("M j, Y",$FirstSeen); + $favRepoClass = ($caSettings['favourite'] == $Repo) ? "fav" : "nonfav"; + + $card = " +