<?xml version="1.0" encoding="UTF-8"?>\r
-<!DOCTYPE xml>\r
-\r
<projectDescription>\r
<name>-product</name>\r
<comment></comment>\r
\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
{\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
+++ /dev/null
-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
+++ /dev/null
-package user.jobengine.server.steps.shared;\r
-\r
-public enum MetadataType {\r
- TrafficMaterial, TrafficPromo, TrafficAD, OctopusStory, OctopusPlaceholder, Generic\r
-}\r
+++ /dev/null
-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
- 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
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
\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
<?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
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,
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,
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,
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"
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
<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
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
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
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
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
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
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
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,
*/\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
\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
\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
\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
* @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
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
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
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
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
\r
SearchResult<ArchivedMedia> search(SearchOptions options);\r
\r
+ List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria);\r
+\r
}\r
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
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
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
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
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
\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
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
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
public void setItems(List<T> items) {\r
this.items = items;\r
}\r
+\r
}
\ No newline at end of file
<!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
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
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
font-family: Arial, Helvetica, sans-serif;\r
overflow: auto;\r
z-index: 2;\r
-}
\ No newline at end of file
+}\r
+\r
\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
</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
</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
<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
\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
<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
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
<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
</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
\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
</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
\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
</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
<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
</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
<!-- 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
<!-- <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
<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
<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
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
</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
-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
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
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
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
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
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
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
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
}\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
\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
return searchResult;\r
}\r
\r
+ public ListModelList<ArchivedMedia> getGroupedSearchResult() {\r
+ return groupedSearchResult;\r
+ }\r
+\r
public Date getSearchTo() {\r
return searchTo;\r
}\r
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
\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
}\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
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