Dark style in progress, Octopus sync optimized
authorelgekko <vasary@elgekko.net>
Thu, 1 Dec 2022 17:25:47 +0000 (18:25 +0100)
committerelgekko <vasary@elgekko.net>
Thu, 1 Dec 2022 17:25:47 +0000 (18:25 +0100)
44 files changed:
server/-product/.project
server/-product/production/HIRTV/jobs/executors.xml
server/-product/production/HIRTV/jobs/schedules.json
server/-product/production/HIRTV/jobs/steps/ProjectCleanupMountedLocationStep.java [deleted file]
server/-product/production/HIRTV/jobs/steps/shared/MetadataType.java [deleted file]
server/-product/production/HIRTV/jobs/steps/shared/MetadataTypeDetector.java [deleted file]
server/-product/production/HIRTV/settings/mediacube.yaml
server/hu.user.mediacube.executors.tests/src/hu/user/mediacube/executors/tests/SmallTests.java
server/user.commons.zk/.classpath
server/user.commons.zk/META-INF/MANIFEST.MF
server/user.commons.zk/build.properties
server/user.commons.zk/lib/userdark-8.0.3.jar [new file with mode: 0644]
server/user.commons.zk/pom.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/SyncOCTOPUSDataStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/shared/OctopusDataMiner.java
server/user.jobengine.osgi.db/META-INF/MANIFEST.MF
server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/SearchOptions.java
server/user.jobengine.osgi.db/src/user/jobengine/search/IMediaFinder.java
server/user.jobengine.osgi.db/src/user/jobengine/search/LuceneMediaFinder.java
server/user.jobengine.osgi.db/src/user/jobengine/search/MediaFinder.java
server/user.jobengine.osgi.db/src/user/jobengine/search/SearchResult.java
server/user.mediacube.gui/WEB-INF/zk.xml
server/user.mediacube.gui/css/archivum.css
server/user.mediacube.gui/css/searchitems.css
server/user.mediacube.gui/index.zul
server/user.mediacube.gui/pages/alternate_retrievebatchselector.zul
server/user.mediacube.gui/pages/directorylist.zul
server/user.mediacube.gui/pages/jobeditor.zul
server/user.mediacube.gui/pages/jobeditor2.zul
server/user.mediacube.gui/pages/joblist.zul
server/user.mediacube.gui/pages/login.zul
server/user.mediacube.gui/pages/menu.zul
server/user.mediacube.gui/pages/metadatadetails.zul
server/user.mediacube.gui/pages/missingmaterials.zul
server/user.mediacube.gui/pages/retrievebatchselector.zul
server/user.mediacube.gui/pages/searchitems.zul
server/user.mediacube.gui/pages/searchitems/details.zul
server/user.mediacube.gui/pages/searchitems/filters.zul
server/user.mediacube.gui/pages/statisticsdetails.zul
server/user.mediacube.gui/pages/storeeditor.zul
server/user.mediacube.gui/resources/i3-label_hu.properties
server/user.mediacube.gui/src/user/jobengine/zk/model/GridSearchModel.java

index 81835c3da4992d443a7c517cd23a8c61f123aae3..61c030e0ac71a3450e63aa90e5db3d7d6d4b8ed7 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<!DOCTYPE xml>\r
-\r
 <projectDescription>\r
        <name>-product</name>\r
        <comment></comment>\r
index b22f568976362f6dbaac1ad088a711a898e35e75..08332f195f26a400389104f2659d1e224dd3d6f9 100644 (file)
@@ -6,6 +6,8 @@
 \r
        <executor className="TestForkCancelableStep.java" maxConcurrent="1" />\r
        <executor className="CancelableStep.java" maxConcurrent="50" />\r
+       <executor className="ForkMissingLowresStep.java" maxConcurrent="1" />\r
+       \r
        <executor className="CopyForArchiveNEXIOMaterialsStep.java" maxConcurrent="1" />\r
        <executor className="DeleteNEXIOMaterialsStep.java" maxConcurrent="1" />\r
 \r
index b31018c747d6db3646b02bf4b4eefc4444ea3ac9..48954e2a7e2aefac2572fbaa36d497dfd6d439d2 100644 (file)
@@ -1,28 +1,5 @@
 {\r
        "joblist": [\r
-       {\r
-      "active": true,\r
-      "executeimmediate": false,\r
-         "name" : "Lejárt ISISLON/PROMO_NLE mappák törlése",\r
-      "template": "delete-promo-materials.xml",\r
-      "cronexpression": "0 0 6 * * ?",\r
-      "parameters": [ \r
-       {"name": "sourcePath", "value": "/mnt/ISILON/PROMO_NLE", "type": "java.lang.String"}\r
-      ]\r
-       },      \r
-               {\r
-             "template": "dummy-test-job.xml",\r
-             "name": "dummy test job",\r
-             "active": true,\r
-             "executeimmediate": false,\r
-             "parameters": [ \r
-                         {\r
-                             "name": "param1", "value": "Jozsi", \r
-                                 "type": "java.lang.String"\r
-                         }\r
-                 ], \r
-               "cronexpression": "0/3 * * * * ?"\r
-               },\r
                {\r
                        "active": false,\r
                        "cronexpression": "0/2 * * * * ?",\r
                        ]\r
                },\r
                {\r
-                       "active": false,\r
                        "cronexpression": "0/2 * * * * ?",\r
-                       "template": "cancelable.xml",\r
-                       "parameters": [\r
-                               {\r
-                                       "name": "param",\r
-                                       "value": 200,\r
-                                       "type": "java.lang.Integer"\r
-                               }\r
-                       ]\r
-               },\r
-               {\r
-                       "active": false,\r
-                       "template": "test-fork-cancelable.xml",\r
+                       "template": "sys-fork-recreate-lowres.xml",\r
                        "parameters": [\r
                                {\r
-                                       "name": "count",\r
-                                       "value": 2,\r
-                                       "type": "java.lang.Integer"\r
-                               }\r
-                       ]\r
-               },\r
-               {\r
-                       "active": true,\r
-                       "executeimmediate": true,\r
-                       "name": "OCTOPUS adatok szinkronizálása",\r
-                       "template": "sync-octopus.xml",\r
-                       "cronexpression": "0/30 * * * * ?",\r
-                       "parameters": [\r
-                               {\r
-                                       "name": "includeArchived",\r
-                                       "value": false,\r
-                                       "type": "java.lang.Boolean"\r
-                               },\r
-                               {\r
-                                       "name": "address",\r
-                                       "value": "http://10.10.1.11/api/v1",\r
-                                       "type": "java.lang.String"\r
-                               },\r
-                               {\r
-                                       "name": "user",\r
-                                       "value": "mam",\r
-                                       "type": "java.lang.String"\r
-                               },\r
-                               {\r
-                                       "name": "pwd",\r
-                                       "value": "napocska",\r
+                                       "name": "localHiresPath",\r
+                                       "value": "c:/temp",\r
                                        "type": "java.lang.String"\r
                                }\r
                        ]\r
diff --git a/server/-product/production/HIRTV/jobs/steps/ProjectCleanupMountedLocationStep.java b/server/-product/production/HIRTV/jobs/steps/ProjectCleanupMountedLocationStep.java
deleted file mode 100644 (file)
index ce9c3c0..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-package user.jobengine.server.steps;\r
-\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.nio.file.DirectoryStream;\r
-import java.nio.file.FileVisitResult;\r
-import java.nio.file.FileVisitor;\r
-import java.nio.file.Files;\r
-import java.nio.file.Path;\r
-import java.nio.file.Paths;\r
-import java.nio.file.SimpleFileVisitor;\r
-import java.nio.file.attribute.BasicFileAttributes;\r
-import java.text.ParseException;\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.Date;\r
-import java.util.List;\r
-\r
-import org.apache.commons.io.FileUtils;\r
-import org.apache.commons.lang.StringUtils;\r
-import org.apache.logging.log4j.LogManager;\r
-import org.apache.logging.log4j.Logger;\r
-import org.apache.logging.log4j.Marker;\r
-\r
-import user.jobengine.server.IJobEngine;\r
-import user.jobengine.server.IJobRuntime;\r
-import user.jobengine.server.steps.shared.MetadataType;\r
-import user.jobengine.server.steps.shared.MetadataTypeDetector;\r
-\r
-public class ProjectCleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {\r
-\r
-       private static final Logger logger = LogManager.getLogger();\r
-       private static final String DATEFORMAT = "yyyyMMdd";\r
-       private static final String DOT = ".";\r
-       private static final String STATUSFOLDER = ".STATUS";\r
-       private static final String KILLDATEEXT = ".killdate";\r
-       private Marker marker;\r
-       final int[] allCount = { 0 };\r
-       final int[] currentCount = { 0 };\r
-       private Path sourcePath;\r
-       private SimpleDateFormat dateFormat;\r
-\r
-       private Date checkExpiration(List<Path> killDateFiles) {\r
-               Date killDate = null;\r
-               for (Path killDateFile : killDateFiles) {\r
-                       Date currentKillDate = getKillDate(killDateFile);\r
-                       if (currentKillDate == null)\r
-                               continue;\r
-                       if ((killDate != null && currentKillDate.after(killDate)) || killDate == null)\r
-                               killDate = currentKillDate;\r
-               }\r
-               return new Date().after(killDate) ? killDate : null;\r
-       }\r
-\r
-       @StepEntry\r
-       public Object[] execute(String sourceFolder, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
-               marker = jobRuntime.getSessionMarker();\r
-               sourcePath = Paths.get(sourceFolder);\r
-               DirectoryStream<Path> directoryStream = null;\r
-               if (StringUtils.isBlank(sourcePath.toString())) {\r
-                       logger.error(marker, "A folyamat 'sourcePath' bemeneti paramétere üres.");\r
-                       throw new NullPointerException(\r
-                                       "System is not configured properly, 'sourceFolder' input parameter missing.");\r
-               }\r
-\r
-               if (!sourcePath.toFile().exists() || !sourcePath.toFile().isDirectory()) {\r
-                       logger.error(marker, "A(z) {} mappa nem létezik.", sourceFolder);\r
-                       throw new NullPointerException(String.format("Directory %s does not exist.", sourceFolder));\r
-               }\r
-               try {\r
-                       setProgress(1);\r
-                       dateFormat = new SimpleDateFormat(DATEFORMAT);\r
-                       Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {\r
-                               @Override\r
-                               public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
-                                       allCount[0]++;\r
-                                       return super.visitFile(file, attrs);\r
-                               }\r
-                       });\r
-                       Files.walkFileTree(sourcePath, this);\r
-               } catch (Exception e) {\r
-                       logger.catching(e);\r
-                       logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath,\r
-                                       e.getMessage());\r
-                       throw e;\r
-               } finally {\r
-                       if (directoryStream != null) {\r
-                               try {\r
-                                       directoryStream.close();\r
-                               } catch (IOException e) {\r
-                               }\r
-                       }\r
-               }\r
-               return null;\r
-       }\r
-\r
-       private Date getKillDate(Path killDateFile) {\r
-               String fileName = killDateFile.getFileName().toString();\r
-               int end = fileName.lastIndexOf(DOT);\r
-               if (end < 1)\r
-                       return null;\r
-               int start = fileName.lastIndexOf(DOT, end - 1);\r
-               if (start < 0)\r
-                       return null;\r
-               String strKillDate = fileName.substring(start + 1, end);\r
-               Date result = null;\r
-               if (StringUtils.isNumeric(strKillDate)) {\r
-                       try {\r
-                               result = dateFormat.parse(strKillDate);\r
-                       } catch (ParseException e) {\r
-                               logger.error(marker,\r
-                                               "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.",\r
-                                               fileName, strKillDate);\r
-                               return null;\r
-                       }\r
-               } else\r
-                       logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.",\r
-                                       fileName, strKillDate);\r
-               return result;\r
-       }\r
-\r
-       private List<Path> getKillDateFiles(Path filePath) {\r
-               String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);\r
-               List<Path> result = new ArrayList<>();\r
-               Path statusPath = null;\r
-               try {\r
-                       statusPath = Paths.get(filePath.getParent().toString(), STATUSFOLDER);\r
-               } catch (Exception e) {\r
-                       logger.catching(e);\r
-                       return null;\r
-               }\r
-               File statusPathFile = statusPath.toFile();\r
-               if (statusPathFile.exists() && statusPathFile.isDirectory()) {\r
-                       try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {\r
-                               stream.forEach(p -> result.add(p));\r
-                       } catch (Exception e) {\r
-                               logger.catching(e);\r
-                       }\r
-               }\r
-               Collections.sort(result);\r
-               return result;\r
-       }\r
-\r
-       private Path getProjectRootPath(Path filePath) {\r
-               Path result = null;\r
-               if (filePath.getNameCount() > sourcePath.getNameCount()) {\r
-                       String dir = filePath.getName(sourcePath.getNameCount()).toString();\r
-                       String[] tokens = dir.split("-");\r
-                       if (tokens.length != 0 && MetadataTypeDetector.GuessMetadataType(tokens[0]) == MetadataType.TrafficPromo)\r
-                               result = Paths.get(sourcePath.toAbsolutePath().toString(), dir);\r
-               }\r
-               return result;\r
-       }\r
-\r
-       @Override\r
-       public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {\r
-               return FileVisitResult.CONTINUE;\r
-       }\r
-\r
-       @Override\r
-       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
-               if (dir.equals(sourcePath))\r
-                       return FileVisitResult.CONTINUE;\r
-\r
-               Path parent = getProjectRootPath(dir);\r
-               if (parent == null) {\r
-                       System.out.println("Skipping " + dir);\r
-                       return FileVisitResult.SKIP_SUBTREE;\r
-               }\r
-\r
-               return FileVisitResult.CONTINUE;\r
-       }\r
-\r
-       private boolean processPathItem(Path filePath) {\r
-               currentCount[0]++;\r
-               int progress = currentCount[0] * 100 / allCount[0];\r
-               setProgress(progress);\r
-\r
-               if (filePath.toFile().isDirectory() || !filePath.toString().toUpperCase().endsWith(".EZP"))\r
-                       return false;\r
-\r
-               // level check\r
-               if (filePath.getNameCount() != sourcePath.getNameCount() + 3) {\r
-                       // logger.warn(marker, "A {} fájl elérési útja a várttól eltérő.", filePath);\r
-                       return false;\r
-               }\r
-\r
-               List<Path> killDateFiles = getKillDateFiles(filePath);\r
-               if (killDateFiles == null || killDateFiles.size() == 0) {\r
-                       logger.warn(marker, "A {} fájlhoz nem található 'killdate' állomány.", filePath);\r
-                       return false;\r
-               }\r
-\r
-               if (killDateFiles.size() != 1)\r
-                       logger.warn(marker,\r
-                                       "A {} fájlhoz több 'killdate' állomány található, a legújabb dátum határozza meg a törlés időpontját.",\r
-                                       filePath);\r
-\r
-               Date killDate = checkExpiration(killDateFiles);\r
-               if (killDate == null)\r
-                       return false;\r
-\r
-               Path parent = getProjectRootPath(filePath);\r
-               if (parent != null) {\r
-                       Path pathToDelete = Paths.get(sourcePath.toAbsolutePath().toString(),\r
-                                       filePath.getName(sourcePath.getNameCount()).toString());\r
-                       try {\r
-                               FileUtils.deleteDirectory(pathToDelete.toFile());\r
-                               logger.info(marker, "A {} mappa sikeresen törlődött. Lejárat: {}", pathToDelete,\r
-                                               dateFormat.format(killDate));\r
-                       } catch (Exception e) {\r
-                               logger.error(marker, "A {} mappa törlése nem lehetséges, a rendszer üzenete: {}", pathToDelete,\r
-                                               e.getMessage());\r
-                               logger.error(e);\r
-                       }\r
-               }\r
-               // else\r
-               // logger.warn(marker, "A {} fájlhoz nem határozható meg a törlendő\r
-               // szülőkönyvtár.", filePath);\r
-               return true;\r
-       }\r
-\r
-       @Override\r
-       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
-               processPathItem(file);\r
-               return FileVisitResult.CONTINUE;\r
-       }\r
-\r
-       @Override\r
-       public FileVisitResult visitFileFailed(Path file, IOException e) throws IOException {\r
-               logger.error(marker, "A {} fájl nem érhető el. A rendszer hibaüzenete: {}", file.toString(), e.getMessage());\r
-               return FileVisitResult.CONTINUE;\r
-       }\r
-}\r
diff --git a/server/-product/production/HIRTV/jobs/steps/shared/MetadataType.java b/server/-product/production/HIRTV/jobs/steps/shared/MetadataType.java
deleted file mode 100644 (file)
index 0e27bf3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package user.jobengine.server.steps.shared;\r
-\r
-public enum MetadataType {\r
-       TrafficMaterial, TrafficPromo, TrafficAD, OctopusStory, OctopusPlaceholder, Generic\r
-}\r
diff --git a/server/-product/production/HIRTV/jobs/steps/shared/MetadataTypeDetector.java b/server/-product/production/HIRTV/jobs/steps/shared/MetadataTypeDetector.java
deleted file mode 100644 (file)
index 9e9e6be..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package user.jobengine.server.steps.shared;\r
-\r
-import org.apache.commons.lang.StringUtils;\r
-\r
-public class MetadataTypeDetector {\r
-\r
-       private static final String HYPHEN = "-";\r
-       private static final String DOT = ".";\r
-\r
-       private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}";\r
-       private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}";\r
-       private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}";\r
-       private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+";\r
-       private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+";\r
-       private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}";\r
-\r
-       public static MetadataType GuessMetadataType(String id) {\r
-               if (StringUtils.isBlank(id))\r
-                       return MetadataType.Generic;\r
-               if (id.matches(REGEXP_TRAFFICMATERIALID))\r
-                       return MetadataType.TrafficMaterial;\r
-               if (id.matches(REGEXP_TRAFFICPROMOID))\r
-                       return MetadataType.TrafficPromo;\r
-               if (id.matches(REGEXP_TRAFFICADID))\r
-                       return MetadataType.TrafficAD;\r
-               if (id.matches(REGEXP_OCTOPUSSTORYID))\r
-                       return MetadataType.OctopusStory;\r
-               if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
-                       return MetadataType.OctopusPlaceholder;\r
-               if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
-                       return MetadataType.OctopusPlaceholder;\r
-               return MetadataType.Generic;\r
-       }\r
-\r
-       public static String truncateExtension(String name) {\r
-               String result = name;\r
-               if (result != null && result.contains(DOT))\r
-                       result = result.substring(0, result.lastIndexOf(DOT));\r
-               return result;\r
-       }\r
-\r
-       public static String truncateVersion(String name) {\r
-               String result = name;\r
-               if (result != null && result.contains(HYPHEN))\r
-                       result = result.split(HYPHEN)[0];\r
-               return result;\r
-       }\r
-\r
-}\r
index e192f33566bab07050ddd238910682a87146596d..356014aae782fbf89e4c078354b5ee8f8c55368c 100644 (file)
@@ -24,8 +24,8 @@ bottomTypeFilters:
 - name: Reklám nyers\r
 authentication:\r
   authEnabled: true\r
-  defaultUser: root\r
-  defaultPassword: password\r
+#  defaultUser: root\r
+#  defaultPassword: password\r
   adHost: 10.10.254.11\r
   adNonSecurePort: 3268\r
   adBaseDn: DC=intra,DC=echotv,DC=hu\r
index 19bb773f29ac58884edfa808cd7e6b526d661803..70089a5c54b2cdde2614b04ea16f439b9e423ad6 100644 (file)
@@ -19,6 +19,7 @@ import java.text.NumberFormat;
 import java.text.SimpleDateFormat;\r
 import java.time.Duration;\r
 import java.time.Instant;\r
+import java.time.LocalDate;\r
 import java.time.LocalDateTime;\r
 import java.time.ZoneOffset;\r
 import java.time.format.DateTimeFormatter;\r
@@ -1593,9 +1594,14 @@ public class SmallTests {
 \r
        @Test\r
        public void test9999993() throws Exception {\r
-               Path sut = Paths.get("/opt/test/media.mxf");\r
-               System.out.println(EscortFiles.constructMetadataPath(sut));\r
+               System.out.println(String.format("%s LIKE('%%%s%%')", "10", "20"));\r
+       }\r
+\r
+       @Test\r
+       public void test9999994() throws Exception {\r
+               LocalDate date = LocalDate.parse("2022-12-02T19:10:00.000+01:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME);\r
 \r
+               System.out.println(date.toString());\r
        }\r
 \r
 }\r
index 9c8687fbe7cce7c9b51362e40305924447c2c8c8..50934149e8fabdfd37a4f872b5c322f0952dc204 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
+       <classpathentry exported="true" kind="lib" path="lib/userdark-8.0.3.jar"/>\r
        <classpathentry exported="true" kind="lib" path="lib/datahandler-syntax-highlight-1.0.0.jar"/>\r
        <classpathentry exported="true" kind="lib" path="lib/commons-codec-1.10.jar"/>\r
        <classpathentry exported="true" kind="lib" path="lib/commons-fileupload-1.2.1.jar"/>\r
index 9e618fa5d0e4e46670664fcbd710811246eb6d8d..32f6ee7a2d520edfb12d14e9836a507c549c7f11 100644 (file)
@@ -47,7 +47,8 @@ Bundle-ClassPath: .,
  lib/zul.jar,
  lib/zuti.jar,
  lib/zweb.jar,
- lib/datahandler-syntax-highlight-1.0.0.jar
+ lib/datahandler-syntax-highlight-1.0.0.jar,
+ lib/userdark-8.0.3.jar
 Export-Package: bsh,
  bsh.classpath,
  bsh.collection,
@@ -374,6 +375,7 @@ Export-Package: bsh,
  org.zkoss.theme.___THEME_NAME___,
  org.zkoss.theme.sapphire,
  org.zkoss.theme.silvertail,
+ org.zkoss.theme.userdark,
  org.zkoss.util,
  org.zkoss.util.logging,
  org.zkoss.util.media,
@@ -515,6 +517,8 @@ Export-Package: bsh,
  org.zkoss.zuti.bind,
  org.zkoss.zuti.zul,
  web,
+ web.WEB-INF.tld.web,
+ web.WEB-INF.tld.zk,
  web.aud,
  web.dsp.action.html,
  web.html,
@@ -825,8 +829,6 @@ Export-Package: bsh,
  web.zul.img.tree,
  web.zul.img.wnd,
  web.zul.less,
- web.zul.less.font,
- web.WEB-INF.tld.web,
- web.WEB-INF.tld.zk
+ web.zul.less.font
 Require-Bundle: javax.servlet-api;bundle-version="3.1.0"
 Import-Package: org.slf4j;version="1.7.2"
index 4faffaf1cd7440c604b9ffc7a46c01589389a40c..7796f6998072023a7bb362fd4f9dd9578a3abb46 100644 (file)
@@ -43,4 +43,5 @@ bin.includes = META-INF/,\
                lib/zul.jar,\\r
                lib/zuti.jar,\\r
                lib/zweb.jar,\\r
-               lib/datahandler-syntax-highlight-1.0.0.jar\r
+               lib/datahandler-syntax-highlight-1.0.0.jar,\\r
+               lib/userdark-8.0.3.jar\r
diff --git a/server/user.commons.zk/lib/userdark-8.0.3.jar b/server/user.commons.zk/lib/userdark-8.0.3.jar
new file mode 100644 (file)
index 0000000..0e1464b
Binary files /dev/null and b/server/user.commons.zk/lib/userdark-8.0.3.jar differ
index 40de24e7ba60fc8e90b151b27777e8d74b70e815..944ecb303313413a946387333f018b4298bc52b9 100644 (file)
        <artifactId>user.commons.zk</artifactId>\r
        <packaging>eclipse-plugin</packaging>\r
        <version>8.0.3</version>\r
+       <build>\r
+               <plugins>\r
+                       <plugin>\r
+                               <groupId>org.apache.maven.plugins</groupId>\r
+                               <artifactId>maven-resources-plugin</artifactId>\r
+                               <version>2.7</version>\r
+                               <executions>\r
+                                       <execution>\r
+                                               <id>copy-jar</id>\r
+                                               <phase>install</phase>\r
+                                               <goals>\r
+                                                       <goal>copy-resources</goal>\r
+                                               </goals>\r
+                                               <configuration>\r
+                                                       <outputDirectory>${project.basedir}/../-product/target/deploy</outputDirectory>\r
+                                                       <resources>\r
+                                                               <resource>\r
+                                                                       <directory>target</directory>\r
+                                                                       <includes>\r
+                                                                               <include>${project.artifactId}_${project.version}.jar</include>\r
+                                                                       </includes>\r
+                                                               </resource>\r
+                                                       </resources>\r
+                                                       <encoding>UTF-8</encoding>\r
+                                               </configuration>\r
+                                       </execution>\r
+                               </executions>\r
+                       </plugin>\r
+               </plugins>\r
+       </build>\r
 </project>
\ No newline at end of file
index 2560cfb5947e46a071642a29e10fd42a1e1159da..98136041566377bc3a4d9d2f4a8edde0dc0f145f 100644 (file)
@@ -11,10 +11,10 @@ public class SyncOCTOPUSDataStep extends JobStep {
        private IProgressEventListener progressListener;\r
 \r
        @StepEntry\r
-       public Object[] execute(boolean includeArchived, String address, String user, String pwd) throws Exception {\r
+       public Object[] execute(boolean includeArchived, int maxPastDays, String address, String user, String pwd) throws Exception {\r
                OctopusDataMiner dataMiner = null;\r
                try {\r
-                       dataMiner = new OctopusDataMiner(address, user, pwd);\r
+                       dataMiner = new OctopusDataMiner(address, user, pwd, maxPastDays);\r
                        dataMiner.addProgressListener(e -> {\r
                                setProgress(e.getProgress());\r
                        });\r
index e01b46136c2b17aa330c616c59ecde2ba6b0c01c..a49e4e7f81efa354d1a12c131139e135ccf158df 100644 (file)
@@ -1,5 +1,8 @@
 package user.jobengine.server.steps.shared;\r
 \r
+import java.time.LocalDate;\r
+import java.time.Period;\r
+import java.time.format.DateTimeFormatter;\r
 import java.util.Calendar;\r
 import java.util.Date;\r
 import java.util.HashMap;\r
@@ -42,6 +45,7 @@ public class OctopusDataMiner {
        private static final String MOS_ABSTRACT_END = "</mosAbstract>";\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final String ARCHIVED = "archived";\r
+       private static final String SCHEDULEDSTART = "scheduledStart";\r
        private static final String FILTER = "filter";\r
        private static final String LINEFEED = "\r\n";\r
        private static final String SIMPLE_LINEFEED = "\n";\r
@@ -80,6 +84,7 @@ public class OctopusDataMiner {
        private int objectCount;\r
        private int currentObjectIndex;\r
        private boolean disableWrite = false;\r
+       private int maxPastDays;\r
 \r
        public OctopusDataMiner(String address, String user, String pwd) {\r
                db = NoSQLUtils.getNoSQLDB();\r
@@ -87,6 +92,11 @@ public class OctopusDataMiner {
                webTarget = client.target(address).register(new BasicAuthentication(user, pwd));\r
        }\r
 \r
+       public OctopusDataMiner(String address, String user, String pwd, int maxPastDays) {\r
+               this(address, user, pwd);\r
+               this.maxPastDays = maxPastDays;\r
+       }\r
+\r
        public void addProgressListener(IProgressEventListener listener) {\r
                if (progressListenerList == null)\r
                        progressListenerList = new EventListenerList();\r
@@ -502,13 +512,33 @@ public class OctopusDataMiner {
                Response response = null;\r
                if (includeArchived) {\r
                        response = query.post(Entity.entity(new BasicDBObject(FILTER, new BasicDBObject(ARCHIVED, true)).toString(), MediaType.APPLICATION_JSON));\r
-               } else\r
+               } else {\r
                        response = query.get();\r
+               }\r
 \r
                String json = response.readEntity(String.class);\r
                BasicDBObject resultObject = getDbObject(json);\r
                if (resultObject != null)\r
                        result = NoSQLUtils.asDBList(resultObject, RESULT);\r
+\r
+               if (maxPastDays > 0 && result != null) {\r
+                       logger.info("Using maxPastDays {} limit", maxPastDays);\r
+                       List<BasicDBObject> rundownList = NoSQLUtils.asList(result);\r
+                       result = new BasicDBList();\r
+                       // "2022-12-02T19:10:00.000+01:00"\r
+                       LocalDate oldestScheduleDate = LocalDate.now().minus(Period.ofDays(maxPastDays + 1));\r
+                       for (BasicDBObject rundown : rundownList) {\r
+                               String scheduledStart = rundown.getString(SCHEDULEDSTART);\r
+                               if (scheduledStart == null)\r
+                                       continue;\r
+                               LocalDate scheduleDate = LocalDate.parse(scheduledStart, DateTimeFormatter.ISO_OFFSET_DATE_TIME);\r
+                               if (scheduleDate.isAfter(oldestScheduleDate)) {\r
+                                       result.add(rundown);\r
+                               }\r
+\r
+                       }\r
+               }\r
+\r
                logger.trace(EXIT);\r
                return result;\r
        }\r
index 74b2c8a0492d7eb7218a60690fa4eae2218cc09a..13fe3c40f5115c883eac516b02a5f06f40cceb9d 100644 (file)
@@ -20,6 +20,7 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
  javax.ws.rs.client,
  javax.ws.rs.core,
  org.apache.commons.io;version="2.2.0",
+ org.apache.ibatis.jdbc;version="3.5.2",
  org.apache.logging.log4j,
  sqlj.runtime.ref
 Export-Package: user.jobengine.db,
index 1a33ad4a2efe86bdc3ff966d3989fce85a595802..d32e41eedd898ecc04037d9e32278744db809d6a 100644 (file)
@@ -46,8 +46,7 @@ public interface IItemManager extends IEntityPersister {
         */\r
        void connect();\r
 \r
-       FileType createFileType(String name, String description, String videoCodec, String audioCodec, int videoTracks,\r
-                       int audioTracks, float frameRate);\r
+       FileType createFileType(String name, String description, String videoCodec, String audioCodec, int videoTracks, int audioTracks, float frameRate);\r
 \r
        Item createItem(String name, String description, String houseId);\r
 \r
@@ -65,8 +64,8 @@ public interface IItemManager extends IEntityPersister {
 \r
        Metadata createMetadata(MetadataElement mde, ListType listType, GuiType guiType, MdType... flags);\r
 \r
-       Metadata createMetadata(MetadataElement mde, ListType listType, GuiType guiType, String sqlField,\r
-                       StaticTables staticTable, String pojoField, MdType... flags);\r
+       Metadata createMetadata(MetadataElement mde, ListType listType, GuiType guiType, String sqlField, StaticTables staticTable, String pojoField,\r
+                       MdType... flags);\r
 \r
        Metadata createMetadata(MetadataElement mde, MdType... flags);\r
 \r
@@ -88,15 +87,15 @@ public interface IItemManager extends IEntityPersister {
 \r
        StoreUri createStoreUri(RemoteStoreProtocol protocol, String uri);\r
 \r
-       StoreUri createStoreUri(RemoteStoreProtocol protocol, String uri, int portNumber, boolean isStream,\r
-                       boolean isSource, boolean isTarget, String userName, String password, String rootPath);\r
+       StoreUri createStoreUri(RemoteStoreProtocol protocol, String uri, int portNumber, boolean isStream, boolean isSource, boolean isTarget, String userName,\r
+                       String password, String rootPath);\r
 \r
        StoreUri createStoreUri(URI uri);\r
 \r
        UserInfo createUser(String fullName, String userName, String password, UserRight[] rights);\r
 \r
-       WorkflowAction createWorkflowAction(Timestamp touched, Timestamp started, Timestamp finished, boolean successful,\r
-                       String houseId, String description, String source, String destination, String tag, long size);\r
+       WorkflowAction createWorkflowAction(Timestamp touched, Timestamp started, Timestamp finished, boolean successful, String houseId, String description,\r
+                       String source, String destination, String tag, long size);\r
 \r
        void disconnect();\r
 \r
@@ -106,8 +105,7 @@ public interface IItemManager extends IEntityPersister {
 \r
        boolean executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator);\r
 \r
-       int executeUpdate(Connection connection, String query, IStatementDecorator decorator,\r
-                       IResultSetConsumer keysConsumer);\r
+       int executeUpdate(Connection connection, String query, IStatementDecorator decorator, IResultSetConsumer keysConsumer);\r
 \r
        // long getExistingRundownMedia(String houseid);\r
 \r
@@ -465,4 +463,6 @@ public interface IItemManager extends IEntityPersister {
         * @param classInfo\r
         */\r
        void truncate(Class<? extends IEntityBase> classInfo);\r
+\r
+       List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria);\r
 }
\ No newline at end of file
index 0641a583673291c54fda116beb5e70243bc0e701..4ca0eb2a8b850bd2fb8747de67383f663edf46ed 100644 (file)
@@ -1315,6 +1315,15 @@ public class ItemManager extends MemoryCache implements IItemManager {
                return result;\r
        }\r
 \r
+       @Override\r
+       public List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria) {\r
+               traceIn();\r
+               IMediaFinder finder = createFinder();\r
+               List<ArchivedMedia> result = finder.getGroupChildren(master, criteria);\r
+               traceOut();\r
+               return result;\r
+       }\r
+\r
        @Override\r
        public List<SearchResult<Item>> searchItem(QueryObject parameter) {\r
                // traceIn();\r
index cf74a7a5f3cf028ddcc2d477337debde462af69b..55ffa8d9452f541d86a14a9769050cf240446cd2 100644 (file)
@@ -21,6 +21,7 @@ public class SearchOptions {
        private int fromResult;\r
        private int toResult;\r
        private boolean countOnly;\r
+       private boolean grouping;\r
 \r
        public StringBuilder getCriteriaForTag() {\r
                StringBuilder result = null;\r
@@ -183,4 +184,13 @@ public class SearchOptions {
                this.countOnly = countOnly;\r
        }\r
 \r
+       public boolean isGrouping() {\r
+               return grouping;\r
+       }\r
+\r
+       public SearchOptions setGrouping(boolean grouping) {\r
+               this.grouping = grouping;\r
+               return this;\r
+       }\r
+\r
 }\r
index f2579122e5ca3cee6fd24b9e88a6efefa53db60c..e808962a8cd8130f1033edaeb25a6beaf5204308 100644 (file)
@@ -1,5 +1,7 @@
 package user.jobengine.search;\r
 \r
+import java.util.List;\r
+\r
 import user.jobengine.db.ArchivedMedia;\r
 import user.jobengine.db.SearchOptions;\r
 \r
@@ -7,4 +9,6 @@ public interface IMediaFinder {
 \r
        SearchResult<ArchivedMedia> search(SearchOptions options);\r
 \r
+       List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria);\r
+\r
 }\r
index 683372a8e0863b6f71c8177521e49bda0dbbd552..ddd71715e34681a7f7332d358cd4ba98db6fa923 100644 (file)
@@ -1,5 +1,7 @@
 package user.jobengine.search;\r
 \r
+import java.util.List;\r
+\r
 import user.jobengine.db.ArchivedMedia;\r
 import user.jobengine.db.SearchOptions;\r
 \r
@@ -39,4 +41,10 @@ public class LuceneMediaFinder implements IMediaFinder {
                return ret;\r
        }\r
 \r
+       @Override\r
+       public List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria) {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+\r
 }\r
index 4662bbc057d34021fba0017c19b20dbd0988c613..6caa1006a076a3b4bef95f2a30efe4478318f6b5 100644 (file)
@@ -8,6 +8,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
+import org.apache.ibatis.jdbc.SQL;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
@@ -127,6 +128,118 @@ public class MediaFinder implements IMediaFinder {
                return st;\r
        }\r
 \r
+       private PreparedStatement createGroupingChildrenStatement(Connection connection, String fileName, String criteria) throws SQLException {\r
+               SQL sql = new SQL();\r
+               sql.SELECT("vi.itemid", "vi.itemtitle", "vi.mediaid", "vi.mediatitle", "vi.mediaarchived archived", "vi.mediacreation creation",\r
+                               "vi.mediacreated created", "vi.mediamodified modified", "vi.medialength length", "vi.mediaitemtypeid", "vi.mediaitemtypename",\r
+                               "vi.mediahouseid", "vi.mediafilehouseid", "vf.mediafilecount");\r
+\r
+               sql.FROM("VW_ITEMS_WITH_PATH vi", "VW_MEDIAFILES vf");\r
+               sql.WHERE("vf.mediaid = vi.mediaid");\r
+               sql.AND();\r
+               sql.WHERE(String.format("vi.mediarelativepath = '%s'", fileName));\r
+               sql.ORDER_BY("vi.mediacreation DESC");\r
+               String query = sql.toString();\r
+               logger.info(query);\r
+\r
+               return connection.prepareStatement(sql.toString(), ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);\r
+       }\r
+\r
+       private PreparedStatement createGroupingStatement(Connection connection, String criteria, SearchOptions options) throws Exception {\r
+               boolean simpleSearch = manager.getSystemConfig().value("datasource.mediacube.simple-search", true);\r
+               String criteriasPattern = getCriteriasRegexPattern(criteria);\r
+\r
+               SQL innerSql = new SQL();\r
+               innerSql.SELECT("max(vi.mediaid)");\r
+               innerSql.FROM("VW_ITEMS_WITH_PATH vi", "MEDIADESCRIPTION md");\r
+               innerSql.WHERE("vi.mediafileid = md.mediafileid");\r
+\r
+               if (simpleSearch) {\r
+                       // TODO ezen az agon nem jo!!!!!\r
+                       String simpleTextCriteria = formatSimpleSearchValue(criteria);\r
+                       if (simpleTextCriteria != null && simpleTextCriteria.trim().length() > 0) {\r
+                               innerSql.AND();\r
+                               innerSql.WHERE("(");\r
+                               innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediatitle", simpleTextCriteria));\r
+                               innerSql.OR();\r
+                               innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.itemtitle", simpleTextCriteria));\r
+                               innerSql.OR();\r
+                               innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediarelativepath", simpleTextCriteria));\r
+                               innerSql.WHERE(")");\r
+                       }\r
+               } else {\r
+                       String textCriteria = formatSearchValue(criteria);\r
+                       if (textCriteria != null && textCriteria.trim().length() > 0) {\r
+                               innerSql.AND();\r
+                               innerSql.WHERE(String.format("CONTAINS(md.description, '%s') >= 1", textCriteria));\r
+                       }\r
+               }\r
+               innerSql.GROUP_BY("vi.mediarelativepath");\r
+\r
+               SQL mainSql = new SQL();\r
+               if (options.isCountOnly())\r
+                       mainSql.SELECT("COUNT(1) AS NumberOfRecords");\r
+               else\r
+                       mainSql.SELECT("vi.itemid", "vi.itemtitle", "vi.mediaid", "vi.mediatitle", "vi.mediarelativepath", "vi.mediaarchived", "vi.mediacreation",\r
+                                       "vi.medialength", "vf.mediafilecount",\r
+                                       String.format("HIGHLIGHT(md.description, '<span class=''rhl''>', '</span>', '%s') description", criteriasPattern));\r
+\r
+               mainSql.FROM("VW_ITEMS_WITH_PATH vi", "VW_MEDIAFILES vf", "MEDIADESCRIPTION md");\r
+               mainSql.WHERE("vf.mediaid = vi.mediaid");\r
+               mainSql.AND();\r
+               mainSql.WHERE("vi.mediafileid = md.mediafileid");\r
+               mainSql.AND();\r
+               mainSql.WHERE(String.format("vi.mediaid IN (\r\n%s\r\n)", innerSql.toString()));\r
+\r
+               StringBuilder criteriaForType = options.getCriteriaForType();\r
+               if (criteriaForType != null) {\r
+                       mainSql.AND();\r
+                       mainSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForType.toString()));\r
+               }\r
+\r
+               StringBuilder criteriaForTag = options.getCriteriaForTag();\r
+               if (criteriaForTag != null) {\r
+                       SQL tagSql = new SQL();\r
+                       tagSql.SELECT("mediaid");\r
+                       tagSql.FROM("MEDIATAGS");\r
+                       tagSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForTag.toString()));\r
+\r
+                       mainSql.AND();\r
+                       mainSql.WHERE(String.format("vi.mediaid IN (%s)", tagSql.toString()));\r
+               }\r
+\r
+               if (options.getFrom() != null) {\r
+                       mainSql.AND();\r
+                       mainSql.WHERE(String.format("vi.mediacreation > '%s'", df.format(options.getFrom())));\r
+               }\r
+\r
+               if (options.getTo() != null) {\r
+                       mainSql.AND();\r
+                       mainSql.WHERE(String.format("vi.mediacreation < '%s'", df.format(options.getTo())));\r
+               }\r
+\r
+               if (options.isMissingProxy()) {\r
+                       mainSql.AND();\r
+                       mainSql.WHERE("vf.mediafilecount = 1");\r
+               }\r
+\r
+               if (options.getDescLength() > 0) {\r
+                       mainSql.AND();\r
+                       mainSql.WHERE(String.format("LENGTH(vi.mediadescription) < %s", options.getDescLength()));\r
+               }\r
+\r
+               if (!options.isCountOnly() && (options.getToResult() != 0)) {\r
+                       mainSql.ORDER_BY("vi.mediacreation DESC");\r
+                       mainSql.LIMIT((options.getToResult() - options.getFromResult()));\r
+                       mainSql.OFFSET(options.getFromResult());\r
+               }\r
+\r
+               String query = mainSql.toString();\r
+               logger.info(query);\r
+               PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);\r
+               return st;\r
+       }\r
+\r
        private String formatSearchValue(String value) {\r
                String[] specials = new String[] { ":", "?", "%", "(", ")" };\r
                String result = value;\r
@@ -165,7 +278,11 @@ public class MediaFinder implements IMediaFinder {
                        logger.info("Checking size");\r
                        options.setCountOnly(true);\r
                        // creating a query for checking resultset size\r
-                       st = createStatement(connection, options.getText(), options);\r
+\r
+                       if (options.isGrouping())\r
+                               st = createGroupingStatement(connection, options.getText(), options);\r
+                       else\r
+                               st = createStatement(connection, options.getText(), options);\r
                        rs = st.executeQuery();\r
                        if (rs.next()) {\r
                                result = rs.getLong("NumberOfRecords");\r
@@ -209,21 +326,30 @@ public class MediaFinder implements IMediaFinder {
 \r
                try {\r
                        options.setCountOnly(false);\r
-                       st = createStatement(connection, options.getText(), options);\r
+                       if (options.isGrouping())\r
+                               st = createGroupingStatement(connection, options.getText(), options);\r
+                       else\r
+                               st = createStatement(connection, options.getText(), options);\r
                        rs = st.executeQuery();\r
 \r
                        List<ArchivedMedia> resultList = null;\r
                        while (rs.next()) {\r
-                               ArchivedMedia am = createArchiveMedia(rs);\r
 \r
-                               if (resultList == null)\r
+                               ArchivedMedia am = null;\r
+                               if (options.isGrouping())\r
+                                       am = createGroupedArchiveMedia(rs, searchResults);\r
+                               else {\r
+                                       am = createArchiveMedia(rs);\r
+                                       am.setRelevant(rs.getString("description"));\r
+                               }\r
+\r
+                               if (resultList == null) {\r
                                        resultList = new ArrayList<>();\r
+                                       searchResults.setItems(resultList);\r
+                               }\r
                                resultList.add(am);\r
-\r
-                               am.setRelevant(rs.getString("description"));\r
                        }\r
                        logger.info("Query result processed");\r
-                       searchResults.setItems(resultList);\r
                        connection.commit();\r
                } catch (Exception e) {\r
                        try {\r
@@ -250,6 +376,37 @@ public class MediaFinder implements IMediaFinder {
                logger.info("getSearchResults execution time is {} s", (float) (end - start) / 1000);\r
        }\r
 \r
+       private String formatSimpleSearchValue(String value) {\r
+               String result = value;\r
+               if (value.endsWith("*"))\r
+                       result = value.replace("*", "");\r
+               result = result.trim();\r
+               return result;\r
+       }\r
+\r
+       private ArchivedMedia createGroupedArchiveMedia(ResultSet rs, SearchResult<ArchivedMedia> searchResult) throws SQLException {\r
+               Item item = new Item();\r
+               item.setId(rs.getLong("itemid"));\r
+               item.setTitle(rs.getString("itemtitle"));\r
+\r
+               Media media = new Media();\r
+               media.setMediaFilesName(rs.getString("mediarelativepath"));\r
+               media.setId(rs.getLong("mediaid"));\r
+               media.setTitle(rs.getString("mediatitle"));\r
+\r
+               media.setCreation(rs.getTimestamp("mediacreation"));\r
+               media.setArchived(rs.getTimestamp("mediaarchived"));\r
+               media.setLength(rs.getLong("medialength"));\r
+               media.setMediaFilesCount(rs.getInt("mediafilecount"));\r
+\r
+               ArchivedMedia am = new ArchivedMedia();\r
+               am.setMedia(media);\r
+               am.setItem(item);\r
+               am.setRelevant(rs.getString("description"));\r
+               return am;\r
+\r
+       }\r
+\r
        private ArchivedMedia createArchiveMedia(ResultSet rs) throws SQLException {\r
                ItemType it = new ItemType();\r
                it.setId(rs.getLong("mediaitemtypeid"));\r
@@ -297,4 +454,49 @@ public class MediaFinder implements IMediaFinder {
                return result;\r
        }\r
 \r
+       @Override\r
+       public List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria) {\r
+               ResultSet rs = null;\r
+               PreparedStatement st = null;\r
+\r
+               DefaultContext context = manager.getDbContext();\r
+               Connection connection = context.getConnection();\r
+\r
+               List<ArchivedMedia> resultList = null;\r
+               try {\r
+                       st = createGroupingChildrenStatement(connection, master.getMedia().getMediaFilesName(), criteria);\r
+                       rs = st.executeQuery();\r
+\r
+                       while (rs.next()) {\r
+\r
+                               ArchivedMedia am = createArchiveMedia(rs);\r
+                               if (resultList == null)\r
+                                       resultList = new ArrayList<>();\r
+                               resultList.add(am);\r
+                       }\r
+                       connection.commit();\r
+               } catch (Exception e) {\r
+                       try {\r
+                               connection.rollback();\r
+                       } catch (Exception e1) {\r
+                               logger.throwing(e1);\r
+                       }\r
+                       manager.throwError(e);\r
+               } finally {\r
+                       try {\r
+                               if (rs != null)\r
+                                       rs.close();\r
+                       } catch (Exception e1) {\r
+                       }\r
+                       try {\r
+                               if (st != null)\r
+                                       st.close();\r
+                       } catch (Exception e1) {\r
+                       }\r
+\r
+                       manager.putDbContext(context);\r
+               }\r
+               return resultList;\r
+       }\r
+\r
 }\r
index 4e34f4fdfadbde20c989cdb7786c440021d132e8..34299a5807a2003ec165f35a6bf5d3091536fd12 100644 (file)
@@ -22,4 +22,5 @@ public class SearchResult<T> {
        public void setItems(List<T> items) {\r
                this.items = items;\r
        }\r
+\r
 }
\ No newline at end of file
index 39f79d9d201723e69d9ff164e9e8fdce51bacc9a..054d39f7ee3bfe9d25ee829a412ce7375747fe14 100644 (file)
@@ -7,6 +7,13 @@ https://www.zkoss.org/wiki/ZK_Configuration_Reference/zk.xml
 <!DOCTYPE xml>\r
 \r
 <zk>\r
+<!-- \r
+-->\r
+       <library-property>\r
+           <name>org.zkoss.theme.preferred</name>\r
+           <value>userdark</value>\r
+       </library-property>\r
+       \r
        <library-property>\r
            <name>org.zkoss.web.preferred.locale</name>\r
        <value>hu</value>\r
index 8a40170aa8b64dbbebe58bb49eeca181373224d3..b1e9fb059c9ff971e64f024e622fbee289d1249a 100644 (file)
@@ -240,25 +240,4 @@ body *:not([class*="z-icon-"]) {
         padding: 5px;\r
 }\r
 \r
-/*\r
-VideoJS controls never hide\r
-https://player.support.brightcove.com/styling/customizing-player-appearance.html\r
-https://www.endpointdev.com/blog/2016/03/creating-video-player-with-time-markers/\r
-*/\r
-/* .video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
-/* .video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
-/* .video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
-/* .video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
-/* .video-js.vjs-has-started.vjs-paused.vjs-ad-playing.vjs-user-inactive .vjs-control-bar, */\r
-/* .video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible){ */\r
-/*     transform: none; */\r
-/*     -webkit-transform: none; */\r
-/*     -ms-transform: none; */\r
-/* } */\r
-\r
-.video-js .vjs-time-control {\r
-    display: block;\r
-}\r
-/* .video-js .vjs-remaining-time { */\r
-/*     display: none; */\r
-/* } */\r
\ No newline at end of file
index 4c7832aab3868d29e6243ec11555e93cc3376c3a..880fae40137e37b74040bb628f6a0ca4041a8b6a 100644 (file)
@@ -221,6 +221,31 @@ LIST
        background: #F1F8E9;\r
 }\r
 \r
+\r
+\r
+/*\r
+VideoJS controls never hide\r
+https://player.support.brightcove.com/styling/customizing-player-appearance.html\r
+https://www.endpointdev.com/blog/2016/03/creating-video-player-with-time-markers/\r
+*/\r
+/* .video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
+/* .video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
+/* .video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
+/* .video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible), */\r
+/* .video-js.vjs-has-started.vjs-paused.vjs-ad-playing.vjs-user-inactive .vjs-control-bar, */\r
+/* .video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar:not(.vjs-focus-within):not(.vjs-control-bar-visible){ */\r
+/*     transform: none; */\r
+/*     -webkit-transform: none; */\r
+/*     -ms-transform: none; */\r
+/* } */\r
+\r
+.video-js .vjs-time-control {\r
+    display: block;\r
+}\r
+/* .video-js .vjs-remaining-time { */\r
+/*     display: none; */\r
+/* } */\r
+\r
 .video-js .vjs-remaining-time,\r
 .vjs-no-flex .vjs-remaining-time {\r
     display: none;\r
@@ -271,4 +296,5 @@ LIST
   font-family: Arial, Helvetica, sans-serif;\r
   overflow: auto;\r
   z-index: 2;\r
-}
\ No newline at end of file
+}\r
+\r
index 821c540d172934cbd0aae1cdd791172c5db693bc..76205d89a8d92fa3673f07c2d0afc054ccaca718 100644 (file)
@@ -6,7 +6,7 @@
 \r
 <!DOCTYPE xml>\r
 <zk xmlns:w="http://www.zkoss.org/2005/zk/client">\r
-       <style src="/css/archivum.css" />\r
+<!--   <style src="/css/archivum.css" /> -->\r
        <zscript>\r
                <![CDATA[\r
                // Chrome F5 bug workaround (miscalculates 100% width on second refresh)\r
                                </div>\r
                        </north>\r
                        <center border="0">\r
-                               <include style="background: #e3e3e3;" id="includeContent" src="@load(im.page)" />\r
+                               <include id="includeContent" src="@load(im.page)" />\r
                        </center>\r
 <!--                   <east> -->\r
 <!--                           <sidewindow /> -->\r
index a684a646bdfbeba5cefeae288ba5521a8ca60d55..e16e851d29caf38c1efd2fbbfa0c2044545a2c16 100644 (file)
                        </row>\r
                        <row>\r
                                <cell colspan="2">\r
+<!--                                           style="border: none; background: #e3e3e3 !important;"  -->\r
                                        <listbox ctrlKeys="#del" onCtrlKey="@command('remove')" height="400px" id="basketList" \r
                                                sizedByContent="false" model="@load(arbsm.basketItems)"\r
-                                               multiple="true" checkmark="true" style="border: none; background: #e3e3e3 !important;" \r
+                                               multiple="true" checkmark="true" \r
                                                oddRowSclass="listbox-odd-style" sclass="listbox-normal-style"\r
                                                emptyMessage="Üres" selectedItems="@save(arbsm.selectedItems)">\r
                                                <listhead>\r
index ab652582a861a9771fd33d27357eb263af1e2975..5482b28bc05ce5e30241894d229f4fad1f765425 100644 (file)
@@ -16,8 +16,8 @@
                        </hbox>\r
                        \r
                        <!-- Forrás file lista -->\r
+<!--                               oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" style="border: none; background: #e3e3e3 !important;" -->\r
                        <listbox id="srcbox" vflex="true" sizedByContent="true" model="@load(vm.files)" multiple="false" checkmark="true" \r
-                                   oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" style="border: none; background: #e3e3e3 !important;"\r
                                     ctrlKeys="#bak" onCtrlKey="@command('onBack')" onSelect="@command('selectedItemChanged')"\r
                                     onAfterRender="srcbox.focus()">\r
                            <custom-attributes org.zkoss.zul.listbox.selectOnHighlight.disabled="true" />\r
index 7a194d85b87c5651cebab3ef0e66998d8c1ef598..7d12aeab5a39c47ef79ff2832a12bb24a5e40b19 100644 (file)
@@ -42,7 +42,7 @@
                                                        <borderlayout>\r
                                                                <north size="50%" splittable="true">\r
                                                                        <grid visible="@bind(not empty jlm.selectedJob)" sizedByContent="false" span="true" vflex="true"\r
-                                                                               style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" \r
+                                                                               style="border: none;" oddRowSclass="listbox-odd-style" \r
                                                                                sclass="listbox-normal-style"\r
                                                                                emptyMessage="A részletek megtekintéséhez jelöljön ki egy folyamatot.">\r
                                                                                <columns>\r
@@ -79,7 +79,7 @@
 \r
                                                                </north>\r
                                                                <center border="none" flex="true">\r
-                                                                       <grid model="@load(jlm.selectedJob.parameters)" style="border: none; background: #e3e3e3 !important;"\r
+                                                                       <grid model="@load(jlm.selectedJob.parameters)" style="border: none;"\r
                                                                                oddRowSclass="listbox-odd-style" sclass="listbox-normal-style">\r
                                                                                <columns sizable="true">\r
                                                                                        <column label="Name" hflex="1"/>\r
index 89db33a7fba51c48852a56938a1d8e00ec080667..326986d1c895595e0a2423e8376eae994f9c4131 100644 (file)
@@ -45,9 +45,9 @@
                                                <tabpanels>\r
                                                        <tabpanel>\r
                                                                <vlayout vflex="true" hflex="true">\r
+<!--                                                                           style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style"  -->\r
+<!--                                                                           sclass="listbox-normal-style" -->\r
                                                                        <grid visible="@bind(not empty jem2.editingJob)" sizedByContent="false" span="true" \r
-                                                                               style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" \r
-                                                                               sclass="listbox-normal-style"\r
                                                                                emptyMessage="A részletek megtekintéséhez jelöljön ki egy folyamatot.">\r
                                                                                <columns>\r
                                                                                        <column hflex="min"/>\r
@@ -87,8 +87,8 @@
                                                                                        iconSclass="z-icon-plus"/>\r
                                                                        </toolbar>\r
                                                                        <vlayout hflex="true" vflex="true" style="overflow: auto !important;">\r
-                                                                               <grid model="@load(jem2.editingJob.parameters)" style="border: none; background: #e3e3e3 !important;"\r
-                                                                                       oddRowSclass="listbox-odd-style"  sclass="listbox-normal-style">\r
+<!--                                                                   style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style"  sclass="listbox-normal-style" -->\r
+                                                                               <grid model="@load(jem2.editingJob.parameters)">\r
                                                                                        <columns sizable="true">\r
                                                                                                <column label="Name" hflex="4"/>\r
                                                                                                <column label="Value" hflex="9"/>\r
index 50a823c1b4872e1b68ce22871e2ba24f83d4afcd..c78c4947404f990ca8139d227bccd73308e7cecf 100644 (file)
@@ -12,7 +12,7 @@
        <custom-attributes org.zkoss.zul.listbox.preloadSize="50" />\r
        <custom-attributes org.zkoss.zul.listbox.selectOnHighlight.disabled="true" />\r
 \r
-       <div width="100%" height="100%" viewModel="@id('jlm') @init('user.jobengine.zk.model.JobListModel')" \r
+       <vlayout width="100%" height="100%" viewModel="@id('jlm') @init('user.jobengine.zk.model.JobListModel')" \r
                onClientInfo="@command('onClientInfo', event=event)">\r
                <timer id="timer" delay="500" repeats="true" onTimer="@command('uiTick')" />\r
 \r
 <!--                   <charts id="chart" type="spline" title="Feladatok" marginRight="10"/> -->\r
 <!--           </div> -->\r
 \r
-               <div height="100%" width="100%">\r
-                       <groupbox height="94%" closable="false">\r
-                               <caption sclass="boldfont" label="Aktív folyamatok" />\r
+               <borderlayout vflex="true">\r
+                       <center border="none" vflex="true">\r
                                <listbox id="jobsListBox" sizedByContent="false" span="false" model="@load(jlm.jobList)" multiple="true" \r
                                        pagingPosition="top" autopaging="true" mold="paging"\r
-                                       vflex="true" checkmark="true" style="border: none; background: #e3e3e3 !important;\r
+                                       vflex="true" checkmark="true" style="border: none;" \r
                                        oddRowSclass="listbox-odd-style" sclass="listbox-normal-style"\r
                                        emptyMessage="Nincs futó folyamat" onSelect="@command('onSelect')" >\r
                                        <listhead sizable="true">\r
@@ -95,8 +94,8 @@
                                                </listitem>\r
                                        </template>\r
                                </listbox>\r
-                       </groupbox>\r
-               </div>\r
+               </center>\r
+               </borderlayout>\r
 \r
-       </div>\r
+       </vlayout>\r
 </zk>
\ No newline at end of file
index 0caf8d71cd6c0e845f16ad97713004c4057d53ad..fc7f58f453760294b74ec0fe43f0ef85eae91962 100644 (file)
@@ -2,10 +2,18 @@
 \r
 <!DOCTYPE xml>\r
 <zk>\r
+<style>\r
+input:-webkit-autofill,\r
+input:-webkit-autofill:hover, \r
+input:-webkit-autofill:focus, \r
+input:-webkit-autofill:active{\r
+    -webkit-box-shadow: 0 0 0 30px yellow inset !important;\r
+}\r
+</style>\r
 <hbox self="@define(content)" vflex="1" hflex="1" align="center" pack="center" spacing="20px">\r
         <vlayout>\r
             <window id="loginWin" viewModel="@id('jlm') @init('user.jobengine.zk.model.LoginModel')"\r
-                border="normal" hflex="min" style="background-color: #212121">\r
+                border="normal" hflex="min" >\r
                                <caption>\r
                                        <hbox>\r
                                                <image src="/img/mediacube_logo_v2_50x50.png" width="20px" height="20px" />\r
@@ -34,8 +42,8 @@
                             </row>\r
                         </rows>\r
                     </grid>\r
-                    <label id="message" sclass="warn" value="@bind(jlm.message)" />\r
-                    <button id="login" label="Bejelentkezés" onClick="@command('authenticate')"/>\r
+                    <label value="@bind(jlm.message)" />\r
+                    <button label="Bejelentkezés" onClick="@command('authenticate')"/>\r
                 </vbox>\r
             </window>\r
         </vlayout>\r
index a24895aac387195fd25a30c37156005f923b889a..ce97a3bc11598b98f9eafbcf49bcc4f49d905d32 100644 (file)
@@ -3,42 +3,42 @@
 \r
 <!DOCTYPE xml>\r
 <zk>\r
-       <style src="/css/menu.css"/>\r
+<!--   <style src="/css/menu.css"/> -->\r
        <div viewModel="@id('lm') @init('user.jobengine.zk.model.MenuModel')">\r
-               <menubar id="menubar" hflex="max" sclass="redmenubar">\r
-                       <menuitem sclass="whitemenu" label="Keresés" onClick="@command('navigate', action='/')" disabled="false" />\r
-                       <menuitem sclass="whitemenu" label="Folyamatok" onClick="@command('navigate', action='jobs')" \r
+               <menubar id="menubar" hflex="max" >\r
+                       <menuitem label="Keresés" onClick="@command('navigate', action='/')" disabled="false" />\r
+                       <menuitem label="Folyamatok" onClick="@command('navigate', action='jobs')" \r
                                disabled="${(not sessionScope.userPrincipal.pooler and not sessionScope.userPrincipal.submitter) or sessionScope.userPrincipal.anonymous}" />\r
-                       <menuitem sclass="whitemenu" label="Maestro" onClick="@command('navigate', action='maestro')" visible="${lm.maestroAvailable}" />\r
-                       <menu sclass="whitemenu" label="Statisztikák" visible="${not sessionScope.guiStatisticsDisable}">\r
+                       <menuitem label="Maestro" onClick="@command('navigate', action='maestro')" visible="${lm.maestroAvailable}" />\r
+                       <menu label="Statisztikák" visible="${not sessionScope.guiStatisticsDisable}">\r
                                <menupopup>\r
-                                       <menuitem sclass="rozsda" label="Folyamat tevékenységek" onClick="@command('navigate', action='statistics')" \r
+                                       <menuitem label="Folyamat tevékenységek" onClick="@command('navigate', action='statistics')" \r
                                                disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
-                                       <menuitem sclass="rozsda" label="Híranyag gyártás" onClick="@command('navigate', action='newshistory')" \r
+                                       <menuitem label="Híranyag gyártás" onClick="@command('navigate', action='newshistory')" \r
                                                disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
-                                       <menuitem sclass="rozsda" label="Meta-adat szerkesztés" onClick="@command('navigate', action='edithistory')" \r
+                                       <menuitem label="Meta-adat szerkesztés" onClick="@command('navigate', action='edithistory')" \r
                                                disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
                                </menupopup>\r
                        </menu>\r
-                       <menu sclass="whitemenu" label="Továbbiak" visible="${sessionScope.userPrincipal.submitter}">\r
+                       <menu label="Továbbiak" visible="${sessionScope.userPrincipal.submitter}">\r
                                <menupopup>\r
-                                       <menuitem sclass="rozsda" label="Jelszógenerátor" onClick="@command('navigate', action='pwdgen')" \r
+                                       <menuitem label="Jelszógenerátor" onClick="@command('navigate', action='pwdgen')" \r
                                                disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
-                                       <menuitem sclass="rozsda" label="Hiányzó anyagok" onClick="@command('navigate', action='missingmaterials')" \r
+                                       <menuitem label="Hiányzó anyagok" onClick="@command('navigate', action='missingmaterials')" \r
                                                disabled="${not sessionScope.userPrincipal.submitter or sessionScope.userPrincipal.anonymous}" />\r
                                </menupopup>\r
                        </menu>\r
-                       <menu sclass="whitemenu" label="${labels.menu_help}" visible="${not sessionScope.guiHelpDisable}">\r
+                       <menu label="${labels.menu_help}" visible="${not sessionScope.guiHelpDisable}">\r
                                <menupopup>\r
-                                       <menuitem sclass="rozsda" label="${labels.menu_content}" href="http://10.10.1.27:90/docs" target="_blank" />\r
-                                       <menuitem sclass="rozsda" label="${labels.menu_version}" href="/resource/help.html" target="_blank" />\r
+                                       <menuitem label="${labels.menu_content}" href="http://10.10.1.27:90/docs" target="_blank" />\r
+                                       <menuitem label="${labels.menu_version}" href="/resource/help.html" target="_blank" />\r
                                </menupopup>\r
                        </menu>\r
-                       <menuitem sclass="whitemenu" label="Mini monitor" onClick="@command('createFloatingJobMonitor')" />\r
+                       <menuitem label="Mini monitor" onClick="@command('createFloatingJobMonitor')" />\r
 \r
-                       <menuitem id="basketIMenuItem" label="@load(lm.basketMenuLabel)" image="/img/ic_shopping_cart_black_24dp.png" sclass="whitemenu\r
+                       <menuitem id="basketIMenuItem" label="@load(lm.basketMenuLabel)" iconSclass="z-icon-shopping-cart\r
                                style="float: right" onClick="@command('showBasket')" disabled="false" />\r
-                       <menuitem id="logoutMenuItem" label="Kilépés" style="float: right" sclass="whitemenu" onClick="@command('doLogout')" disabled="false" />\r
+                       <menuitem id="logoutMenuItem" label="Kilépés" style="float: right" onClick="@command('doLogout')" disabled="false" />\r
                </menubar>\r
        </div>\r
 </zk>\r
index c855d6370b2adbc5db413581fadfa41badda681b..dc2e6369a9d6276dc089aa5fbd675495c64ed179 100644 (file)
@@ -58,7 +58,7 @@
                        </tabs>\r
                        <tabpanels>\r
                                <tabpanel>\r
-                                       <listbox vflex="true" style="border: none; background: white !important;">\r
+                                       <listbox vflex="true">\r
                                                <listhead>\r
                                                        <listheader hflex="min" />\r
                                                        <listheader width="90%" />\r
index b6cef3931960daff3782fd4b0731e381ac0e8c92..1d1a8048a76b3f70c76be19f8f381c1c2432920c 100644 (file)
                        <button label="Visszaállítás" onClick="@command('executeRestoreJobs')" autodisable="self" disabled="@load(jlm.selectedJobs eq null)" />\r
                </div>\r
 \r
-               <div height="100%" width="100%" style="background: #e3e3e3" align="left">\r
+<!-- style="background: #e3e3e3" -->\r
+               <div height="100%" width="100%" align="left">\r
                        <groupbox height="94%" closable="false">\r
                                <caption sclass="boldfont" label="Adásanyagok" />\r
+<!--                                   style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" -->\r
                                <listbox id="lbJobList" sizedByContent="false" model="@load(jlm.jobList)" multiple="true" pagingPosition="top"\r
-                                       vflex="true" checkmark="true" style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style"\r
+                                       vflex="true" checkmark="true" \r
                                        emptyMessage="Nincs hiányzó anyag." selectedItems="@bind(jlm.selectedJobs)">\r
                                        <auxhead sclass="category-center">\r
                                                <auxheader colspan="4">\r
index 4c0e7d8dd26c24a3c2201afd2e083ed95c4ea6b8..a0bdd24d3f1a67a144bb6e76295c505c2e64c9ea 100644 (file)
@@ -23,8 +23,9 @@
                        </row>\r
                        <row>\r
                                <cell colspan="2">\r
+<!--                                           style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" -->\r
                                        <listbox ctrlKeys="#del" onCtrlKey="@command('remove')" height="400px" id="basketList" sizedByContent="false" model="@load(jlm.basketItems)"\r
-                                               multiple="true" checkmark="true" style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style"\r
+                                               multiple="true" checkmark="true" \r
                                                emptyMessage="Üres" selectedItems="@save(jlm.selectedItems)">\r
                                                <listhead>\r
                                                        <listheader label="Azonosító" hflex="min" align="left" sort="auto" />\r
index bc238a1b3b79702616b980a5d945de42896c66fa..a570cf6d09666ac6233fccf5966c7cacd529f78c 100644 (file)
@@ -4,6 +4,7 @@
 <!-- tag deklarációja -->\r
 <?component name="search-filters" inline="true" macroURI="searchitems/filters.zul"?>\r
 <?component name="search-results" if inline="true" macroURI="searchitems/gridresults.zul"?>\r
+<?component name="grouped-search-results" if inline="true" macroURI="searchitems/groupedgridresults.zul"?>\r
 <?component name="item-details" inline="true" macroURI="searchitems/details.zul"?>\r
 \r
 <!DOCTYPE xml>\r
@@ -13,7 +14,7 @@
 <!--   <h:script src="https://vjs.zencdn.net/7.18.1/video.min.js"/> -->\r
 \r
        <style src="/css/video-js.css" />\r
-       <style src="/css/searchitems.css" />\r
+<!--   <style src="/css/searchitems.css" /> -->\r
        <style src="/css/tagify.css" />\r
        \r
        <h:script src="/js/tagify.min.js" />\r
                                        <search-filters />\r
                                        \r
                                        <groupbox vflex="true" closable="false">\r
-                                               <search-results />\r
+                                       \r
+                                               <tabbox id="resultsTab" vflex="true" hflex="true" orient="top">\r
+                                                       <tabs visible="true">\r
+                                                               <tab id="tab0" label="Lista"  />\r
+                                                               <tab id="tab1" label="Fa" selected="true" />\r
+                                                       </tabs>\r
+                                                       <tabpanels>\r
+                                                               <tabpanel>\r
+                                                                       <search-results />\r
+                                                               </tabpanel>                                     \r
+                                                               <tabpanel>\r
+                                                                       <grouped-search-results />\r
+                                                               </tabpanel>                                     \r
+                                                       </tabpanels>\r
+                                               </tabbox>                                       \r
+                                       \r
                                        </groupbox>\r
                                </div>\r
                        </west>\r
index eac5951b6c91f9217fb3fbd79740b8df3e8935be..d4a4ccc0636a3f1110e3b24ae20a0561c6594548 100644 (file)
@@ -1,19 +1,19 @@
 <zk xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:h="xhtml" xmlns:c="client">\r
        <div height="100%" width="100%">\r
-               <toolbar width="100%" style="min-height:40px; font-size:8px;border-bottom:1px solid darkgray">\r
-                       <toolbarbutton image="/img/ic_compare_arrows_black_18dp.png" autodisable="self" onClick="@command('showInResults')"\r
+               <toolbar width="100%" style="min-height:40px; border-bottom:1px solid darkgray">\r
+                       <toolbarbutton iconSclass="z-icon-reply" autodisable="self" onClick="@command('showInResults')"\r
                                disabled="@load(vm.selectedObject eq null)" label="Szinkronizálás" />\r
-                       <toolbarbutton sclass="col-xs-12" image="/img/ic_shopping_cart_black_18dp.png" autodisable="self" onClick="@command('downloadMedia')"\r
+                       <toolbarbutton iconSclass="z-icon-shopping-cart" autodisable="self" onClick="@command('downloadMedia')"\r
                                disabled="@load(not vm.hasTSMMediaFile)" label="Kosárba" />\r
-                       <toolbarbutton image="/img/baseline_share_black_18dp.png" autodisable="self" onClick="@command('copyMediaIdToClipboard')"\r
+                       <toolbarbutton iconSclass="z-icon-share-square-o" autodisable="self" onClick="@command('copyMediaIdToClipboard')"\r
                                disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Megosztás" />\r
-                       <toolbarbutton image="/img/outline_theaters_black_18dp.png" autodisable="self" onClick="@command('createLowres')"\r
+                       <toolbarbutton iconSclass="z-icon-youtube-play" autodisable="self" onClick="@command('createLowres')"\r
                                disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Proxy pótlása" />\r
-                       <toolbarbutton image="/img/baseline_edit_black_18dp.png" autodisable="self" onClick="@command('openMetaDataDialog')"\r
+                       <toolbarbutton iconSclass="z-icon-edit" autodisable="self" onClick="@command('openMetaDataDialog')"\r
                                disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Szerkesztés" />\r
                </toolbar>\r
 \r
-               <vlayout id="mediaDetails" width="100%" vflex="true" style="padding: 4px; overflow:auto; background-color: white">\r
+               <vlayout id="mediaDetails" width="100%" vflex="true" style="padding: 4px; overflow:auto">\r
                        <hlayout style="border-bottom: 1px solid lightgray">\r
                                <vlayout style="width: 120px; border-right: 1px solid lightgray; padding-right: 10px">\r
                                        <label style="font-size:8pt; color: gray" value="Gyűjtő azonosító" />\r
index 1650b0a91c23611a44f85f6d28c97a81fef8f6aa..315f1cc6a7f2dd34e5901116ad23d76cc7875f7a 100644 (file)
                <menuitem label="Törlés" value="300" onClick="@command('setCalendar', source=self)" />\r
        </menupopup>\r
 \r
-       <toolbar id="tagsToolbar" width="100%" style="background: transparent">\r
+       <toolbar id="tagsToolbar" width="100%" >\r
                <h:textarea name='filterTags' placeholder='Címkék'/>\r
        </toolbar>\r
-       <toolbar id="filterToolbar" width="100%" style="background: transparent">\r
+       <toolbar id="filterToolbar" width="100%">\r
                <toolbarbutton id="toggleShowTypeFilters" iconSclass="z-icon-caret-down" mode="toggle" onCheck="@command('toggleTypeFiltersCheck')"/>       \r
         <toolbarbutton iconSclass="z-icon-th" popup="searchSettings, after_start" />\r
                <separator orient="vertical" />\r
index 385777d91c7f1ae8714990b80ce953e0e08886cd..5f79d98a98578e049019c4fa8b086f99e93c5c19 100644 (file)
@@ -3,7 +3,8 @@
        viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsDetailsModel')" forward="onCancel=closeButton.onClick">\r
        <vlayout height="100%">\r
                <div vflex="10">\r
-                       <grid id="grid" sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true" style="border: none; background: #e3e3e3 !important;">\r
+<!--  style="border: none; background: #e3e3e3 !important;"             -->\r
+                       <grid id="grid" sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true">\r
                                <columns sizable="true">\r
                                        <column forEach="${vm.columnList}" label="${each}"></column>\r
                                </columns>\r
index 7766b0c069985f22321c08d0788cf863b27effc1..c5b100fbf1344686d68ed28a535b99c975ca4661 100644 (file)
@@ -18,7 +18,7 @@
                                </tabs>\r
                                <tabpanels>\r
                                        <tabpanel>\r
-                                               <listbox vflex="true" style="border: none; background: white !important;">\r
+                                               <listbox vflex="true" style="border: none;">\r
                                                        <listhead>\r
                                                                <listheader hflex="min" />\r
                                                                <listheader width="90%" />\r
index cfe25737f63654f962a297d4eb1ffcef4192b727..cce7c797a12cd2c6e29ae78b34f41a5531cf8d33 100644 (file)
@@ -1,5 +1,6 @@
-version=2.8.1\r
-#!!!2.8.0 Keresofelulet modositas (hardkodolt)\r
+version=2.8.2\r
+#2.8.2 Kereses csoportos listazasa \r
+#2.8.0 Keresofelulet modositas (hardkodolt)\r
 #2.7.9 Keresofelulet modositas (hardkodolt)\r
 #2.7.8 Classloader mechanizmus atalakitasa, metadata editor history\r
 #2.7.7 Folyamat inditas dblclik tiltas\r
index d20a1c1247a1564675c381536884aa31c3c2f08d..f71849be064541c8ae16983df67442ab1a4bceb6 100644 (file)
@@ -6,6 +6,8 @@ import static java.time.temporal.TemporalAdjusters.firstDayOfNextYear;
 import static java.time.temporal.TemporalAdjusters.firstDayOfYear;\r
 \r
 import java.nio.file.Paths;\r
+import java.time.Duration;\r
+import java.time.Instant;\r
 import java.time.LocalDate;\r
 import java.time.ZoneId;\r
 import java.time.ZonedDateTime;\r
@@ -19,6 +21,7 @@ import java.util.Map;
 import java.util.Map.Entry;\r
 \r
 import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.lang.time.DurationFormatUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 import org.zkoss.bind.BindContext;\r
@@ -38,6 +41,7 @@ import org.zkoss.zk.ui.event.EventListener;
 import org.zkoss.zk.ui.event.Events;\r
 import org.zkoss.zk.ui.event.KeyEvent;\r
 import org.zkoss.zk.ui.event.MouseEvent;\r
+import org.zkoss.zk.ui.event.OpenEvent;\r
 import org.zkoss.zk.ui.event.SortEvent;\r
 import org.zkoss.zk.ui.select.Selectors;\r
 import org.zkoss.zk.ui.select.annotation.Wire;\r
@@ -57,6 +61,7 @@ import org.zkoss.zul.Messagebox;
 import org.zkoss.zul.Paging;\r
 import org.zkoss.zul.Panel;\r
 import org.zkoss.zul.Row;\r
+import org.zkoss.zul.Tabbox;\r
 import org.zkoss.zul.Timer;\r
 import org.zkoss.zul.Toolbar;\r
 import org.zkoss.zul.Toolbarbutton;\r
@@ -97,6 +102,7 @@ public class GridSearchModel extends AsyncBaseModel {
        private Map<String, TypeFilter> typeFilters;\r
        private Map<String, String> columnHeaders;\r
        private CachedListModel searchResult = null;\r
+       private CachedListModel groupedSearchResult = null;\r
        private ArchivedMedia selectedObject = null;\r
        private Validator allFilterCheckedValidator;\r
        private Validator itemSelectedValidator;\r
@@ -108,12 +114,17 @@ public class GridSearchModel extends AsyncBaseModel {
        private Map<String, Long> tags = null;\r
        private List<Long> searchTags = new ArrayList<Long>();\r
        protected IItemManager itemManager = null;\r
+       private Map<ArchivedMedia, ListModelList<ArchivedMedia>> groupItemDetails = new HashMap<>();\r
 \r
+       @Wire\r
+       Tabbox resultsTab;\r
        @Wire\r
        Timer timer;\r
        @Wire\r
        Grid itemsGrid;\r
        @Wire\r
+       Grid groupedItemsGrid;\r
+       @Wire\r
        Button backToVideoButton;\r
        @Wire\r
        Combobox search;\r
@@ -151,6 +162,7 @@ public class GridSearchModel extends AsyncBaseModel {
        private boolean missingProxy;\r
        private int selectedDateOption;\r
        private Window metaWindow;\r
+       private Instant startSearch;\r
 \r
        public GridSearchModel() {\r
                this.itemManager = ItemManager.getInstance();\r
@@ -314,54 +326,103 @@ public class GridSearchModel extends AsyncBaseModel {
        }\r
 \r
        @Command\r
-       @NotifyChange({ "searchResult", "selectedObject", "hasTSMMediaFile", "hasLowresMediaFile", "lowresMediaFilePath" })\r
+       @NotifyChange({ "searchResult", "groupedSearchResult", "selectedObject", "hasTSMMediaFile", "hasLowresMediaFile", "lowresMediaFilePath" })\r
        public void doSearch() {\r
+               startSearch = Instant.now();\r
 \r
                try {\r
                        search.close();\r
                        search.select();\r
-                       searchResult = null;\r
+\r
                        itemsGrid.setActivePage(0);\r
                        setSelectedObject(null);\r
-                       String searchValue = search.getText();\r
 \r
-                       if (StringUtils.isNotBlank(searchValue) && !searchHistory.contains(searchValue)) {\r
-                               searchHistory.add(0, searchValue);\r
-                               SessionUtil.putUserSearchHistory(searchHistory);\r
-                       }\r
+                       if (resultsTab.getSelectedIndex() == 0)\r
+                               showExpandedSearchResult();\r
+                       else\r
+                               showGroupedSearchResult();\r
+\r
+               } catch (Exception e) {\r
+                       handleSearchError(e);\r
+               }\r
+       }\r
+\r
+       private void showExpandedSearchResult() throws Exception {\r
+               String searchValue = search.getText();\r
+\r
+               if (StringUtils.isNotBlank(searchValue) && !searchHistory.contains(searchValue)) {\r
+                       searchHistory.add(0, searchValue);\r
+                       SessionUtil.putUserSearchHistory(searchHistory);\r
+               }\r
+\r
+               List<String> searchFilters = getSelectedFilters();\r
+               SessionUtil.putUserSearchFilter(searchFilters);\r
+\r
+               if (SessionUtil.getUserColumnOrder() != null) {\r
+                       orderBy = columnHeaders.get(columnOrder.entrySet().iterator().next().getKey());\r
+                       orderAscending = columnOrder.entrySet().iterator().next().getValue().equals("ascending");\r
+               }\r
+\r
+               if (searchFilters == null || searchFilters.size() == 0)\r
+                       throw new Exception("Anyag típus kiválasztása kötelező!");\r
 \r
-                       List<String> searchFilters = getSelectedFilters();\r
-                       SessionUtil.putUserSearchFilter(searchFilters);\r
+               List<Long> selectedTypeIds = getTypeIDs(searchFilters);\r
 \r
-                       if (SessionUtil.getUserColumnOrder() != null) {\r
-                               orderBy = columnHeaders.get(columnOrder.entrySet().iterator().next().getKey());\r
-                               orderAscending = columnOrder.entrySet().iterator().next().getValue().equals("ascending");\r
+               SearchOptions options = SearchOptions.create().setText(searchValue).setTypes(selectedTypeIds).setTags(searchTags).setFrom(searchFrom).setTo(searchTo)\r
+                               .setMissingProxy(missingProxy).setDescLength(descLength).setOrder(orderBy, orderAscending);\r
+\r
+               if (!options.isValid())\r
+                       throw new Exception("Legalább egy keresési opció használata kötelező: 3 karakter, hiányzó proxy, dátum, típus, cimke!");\r
+               searchResult = new CachedListModel(options);\r
+               searchResult.addEventListener(e -> {\r
+                       if (e.getName().equals(Events.ON_ERROR)) {\r
+                               Exception ex = (Exception) e.getData();\r
+                               handleSearchError(ex);\r
                        }\r
+               });\r
 \r
-                       if (searchFilters == null || searchFilters.size() == 0)\r
-                               throw new Exception("Anyag típus kiválasztása kötelező!");\r
+               if (!allChecked)\r
+                       showSearchTypeWarning();\r
 \r
-                       List<Long> selectedTypeIds = getTypeIDs(searchFilters);\r
+       }\r
 \r
-                       SearchOptions options = SearchOptions.create().setText(searchValue).setTypes(selectedTypeIds).setTags(searchTags).setFrom(searchFrom)\r
-                                       .setTo(searchTo).setMissingProxy(missingProxy).setDescLength(descLength).setOrder(orderBy, orderAscending);\r
+       private void showGroupedSearchResult() throws Exception {\r
+               String searchValue = search.getText();\r
 \r
-                       if (!options.isValid())\r
-                               throw new Exception("Legalább egy keresési opció használata kötelező: 3 karakter, hiányzó proxy, dátum, típus, cimke!");\r
-                       searchResult = new CachedListModel(options);\r
-                       searchResult.addEventListener(e -> {\r
-                               if (e.getName().equals(Events.ON_ERROR)) {\r
-                                       Exception ex = (Exception) e.getData();\r
-                                       handleSearchError(ex);\r
-                               }\r
-                       });\r
+               if (StringUtils.isNotBlank(searchValue) && !searchHistory.contains(searchValue)) {\r
+                       searchHistory.add(0, searchValue);\r
+                       SessionUtil.putUserSearchHistory(searchHistory);\r
+               }\r
 \r
-                       if (!allChecked)\r
-                               showSearchTypeWarning();\r
+               List<String> searchFilters = getSelectedFilters();\r
+               SessionUtil.putUserSearchFilter(searchFilters);\r
 \r
-               } catch (Exception e) {\r
-                       handleSearchError(e);\r
+               if (SessionUtil.getUserColumnOrder() != null) {\r
+                       orderBy = columnHeaders.get(columnOrder.entrySet().iterator().next().getKey());\r
+                       orderAscending = columnOrder.entrySet().iterator().next().getValue().equals("ascending");\r
                }\r
+\r
+               if (searchFilters == null || searchFilters.size() == 0)\r
+                       throw new Exception("Anyag típus kiválasztása kötelező!");\r
+\r
+               List<Long> selectedTypeIds = getTypeIDs(searchFilters);\r
+\r
+               SearchOptions options = SearchOptions.create().setText(searchValue).setTypes(selectedTypeIds).setTags(searchTags).setFrom(searchFrom).setTo(searchTo)\r
+                               .setMissingProxy(missingProxy).setDescLength(descLength).setOrder(orderBy, orderAscending).setGrouping(true);\r
+\r
+               if (!options.isValid())\r
+                       throw new Exception("Legalább egy keresési opció használata kötelező: 3 karakter, hiányzó proxy, dátum, típus, cimke!");\r
+               groupedSearchResult = new CachedListModel(options);\r
+               groupedSearchResult.addEventListener(e -> {\r
+                       if (e.getName().equals(Events.ON_ERROR)) {\r
+                               Exception ex = (Exception) e.getData();\r
+                               handleSearchError(ex);\r
+                       }\r
+               });\r
+\r
+               if (!allChecked)\r
+                       showSearchTypeWarning();\r
+\r
        }\r
 \r
        public void doSort(Event event) throws Exception {\r
@@ -401,7 +462,13 @@ public class GridSearchModel extends AsyncBaseModel {
 \r
                registerTask(() -> {\r
                        logger.info("Scrolling to pos {} begin", pos);\r
-                       List<Component> children = itemsGrid.getRows().getChildren();\r
+                       List<Component> children = null;\r
+\r
+                       if (resultsTab.getSelectedIndex() == 0)\r
+                               children = itemsGrid.getRows().getChildren();\r
+                       else\r
+                               children = groupedItemsGrid.getRows().getChildren();\r
+\r
                        if (children.size() > 0) {\r
                                Component top = children.get(pos);\r
                                Clients.scrollIntoView(top);\r
@@ -504,6 +571,10 @@ public class GridSearchModel extends AsyncBaseModel {
                return searchResult;\r
        }\r
 \r
+       public ListModelList<ArchivedMedia> getGroupedSearchResult() {\r
+               return groupedSearchResult;\r
+       }\r
+\r
        public Date getSearchTo() {\r
                return searchTo;\r
        }\r
@@ -582,20 +653,28 @@ public class GridSearchModel extends AsyncBaseModel {
        private void highlight(ArchivedMedia am, boolean highlight) {\r
                if (am == null)\r
                        return;\r
-               List<Component> components = itemsGrid.getRows().getChildren();\r
+\r
+               List<Component> components = null;\r
+               if (resultsTab.getSelectedIndex() == 0)\r
+                       components = itemsGrid.getRows().getChildren();\r
+               else\r
+                       components = groupedItemsGrid.getRows().getChildren();\r
+\r
                for (int i = 0; i < components.size(); i++) {\r
                        Row row = (Row) components.get(i);\r
                        ArchivedMedia archivedMedia = (ArchivedMedia) row.getValue();\r
                        if (archivedMedia != null && am.getMedia().getId() == archivedMedia.getMedia().getId()) {\r
-                               Detail detail = (Detail) row.getChildren().get(0);\r
-                               Hlayout hlayout = (Hlayout) detail.getChildren().get(0);\r
-                               if (highlight) {\r
-                                       selectedRowIndex = i;\r
-                                       row.setStyle("background: #F1F8E9;");\r
-                                       hlayout.setStyle("border-bottom: 1px solid #C5E1A5; background: #F1F8E9;");\r
-                               } else {\r
-                                       row.setStyle("background: none;");\r
-                                       hlayout.setStyle("border-bottom: 1px solid #ebebeb; background: none;");\r
+                               if (row.getChildren().size() > 0) {\r
+                                       Detail detail = (Detail) row.getChildren().get(0);\r
+                                       Hlayout hlayout = (Hlayout) detail.getChildren().get(0);\r
+                                       if (highlight) {\r
+                                               selectedRowIndex = i;\r
+                                               row.setStyle("background: #F1F8E9;");\r
+                                               hlayout.setStyle("border-bottom: 1px solid #C5E1A5; background: #F1F8E9;");\r
+                                       } else {\r
+                                               row.setStyle("background: none;");\r
+                                               hlayout.setStyle("border-bottom: 1px solid #ebebeb; background: none;");\r
+                                       }\r
                                }\r
                                break;\r
 \r
@@ -625,6 +704,13 @@ public class GridSearchModel extends AsyncBaseModel {
 \r
        @Command\r
        public void onAfterRenderGrid() {\r
+               if (startSearch != null) {\r
+                       Instant finishSearch = Instant.now();\r
+                       String duration = DurationFormatUtils.formatDuration(Duration.between(startSearch, finishSearch).toMillis(), "H:mm:ss.S", true);\r
+                       logger.info("Search duration {}", duration);\r
+                       startSearch = null;\r
+               }\r
+\r
                logger.info("onAfterRenderGrid begin");\r
                // aszinkron fut le, kulon kezelendo a hiba\r
                try {\r
@@ -994,7 +1080,12 @@ public class GridSearchModel extends AsyncBaseModel {
        }\r
 \r
        public void setRowsExpanded(boolean rowsExpanded) {\r
-               this.rowsExpanded = rowsExpanded;\r
+\r
+               if (this.rowsExpanded != rowsExpanded) {\r
+                       this.rowsExpanded = rowsExpanded;\r
+                       doSearch();\r
+               }\r
+\r
        }\r
 \r
        public void setSearchFrom(Date searchFrom) {\r
@@ -1166,4 +1257,27 @@ public class GridSearchModel extends AsyncBaseModel {
                timer.start();\r
        }\r
 \r
+       public ListModelList<ArchivedMedia> getGroupChildrens(ArchivedMedia master) {\r
+               ListModelList<ArchivedMedia> result = groupItemDetails.get(master);\r
+               if (result == null) {\r
+                       result = new ListModelList<>();\r
+                       groupItemDetails.put(master, result);\r
+                       // logger.info("Child list request");\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Command\r
+       public void onGroupDetailRequest(@ContextParam(ContextType.TRIGGER_EVENT) OpenEvent evt, @BindingParam("item") ArchivedMedia master) {\r
+               if (!evt.isOpen())\r
+                       return;\r
+\r
+               ListModelList<ArchivedMedia> model = groupItemDetails.get(master);\r
+               if (model.size() > 0)\r
+                       return;\r
+\r
+               List<ArchivedMedia> children = itemManager.getGroupChildren(master, search.getText());\r
+               if (children != null)\r
+                       children.forEach(am -> model.add(am));\r
+       }\r
 }\r