From 31e1c936d8d3999f58bdfe78004667d0f31758d6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?M=C3=A1rk=20M=C3=A9r=C3=A9sz?= Date: Mon, 16 Jul 2018 14:51:11 +0000 Subject: [PATCH] git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31175 --- server/-configuration/scheduledjobs.json | 1 - .../config/config.xml | 1 + .../jobtemplates/batch-retrieve-ondemand.xml | 4 ++ .../jobtemplates/retrieve-ondemand.xml | 15 ++-- .../server/steps/BatchRetrieveForkStep.java | 10 ++- .../steps/OutputPathAndNameSelectorStep.java | 68 +++++++++++++------ .../server/steps/TSMExtendedRetrieveStep.java | 50 ++++++++++++++ .../server/steps/TSMRestoreStep.java | 10 ++- .../org.eclipse.core.resources.prefs | 1 + .../pages/retrievebatchselector.zul | 12 ++-- .../pages/searchitems.zul | 32 +++++---- .../zk/model/RetrieveBatchSelectorModel.java | 35 +++++++++- .../user/jobengine/zk/model/SearchModel.java | 42 ++++++++---- 13 files changed, 213 insertions(+), 68 deletions(-) create mode 100644 server/user.jobengine.executors/src/user/jobengine/server/steps/TSMExtendedRetrieveStep.java diff --git a/server/-configuration/scheduledjobs.json b/server/-configuration/scheduledjobs.json index de2427f5..9c0dfcc3 100644 --- a/server/-configuration/scheduledjobs.json +++ b/server/-configuration/scheduledjobs.json @@ -22,7 +22,6 @@ {"name": "trafficOutputFolder", "value": "PLAYOUT_NLE", "type": "java.lang.String"}, {"name": "octopusOutputFolder", "value": "OCTOPUS", "type": "java.lang.String"}, {"name": "genericOutputFolder", "value": "ARCHIVE_RESTORE", "type": "java.lang.String"}, - {"name": "retrieveToNexio", "value": false, "type": "java.lang.Boolean"}, {"name": "killDateDays", "value": 7, "type": "java.lang.Integer"} ] }, diff --git a/server/user.jobengine.executors/config/config.xml b/server/user.jobengine.executors/config/config.xml index 216ae54f..16370083 100644 --- a/server/user.jobengine.executors/config/config.xml +++ b/server/user.jobengine.executors/config/config.xml @@ -26,6 +26,7 @@ + diff --git a/server/user.jobengine.executors/jobtemplates/batch-retrieve-ondemand.xml b/server/user.jobengine.executors/jobtemplates/batch-retrieve-ondemand.xml index 141af1e4..b5ae11e4 100644 --- a/server/user.jobengine.executors/jobtemplates/batch-retrieve-ondemand.xml +++ b/server/user.jobengine.executors/jobtemplates/batch-retrieve-ondemand.xml @@ -5,6 +5,7 @@ + @@ -19,6 +20,9 @@ + + + diff --git a/server/user.jobengine.executors/jobtemplates/retrieve-ondemand.xml b/server/user.jobengine.executors/jobtemplates/retrieve-ondemand.xml index 5e776672..b3501f3d 100644 --- a/server/user.jobengine.executors/jobtemplates/retrieve-ondemand.xml +++ b/server/user.jobengine.executors/jobtemplates/retrieve-ondemand.xml @@ -7,15 +7,16 @@ - + + @@ -34,10 +35,10 @@ - + - + @@ -47,9 +48,12 @@ + + + - + @@ -72,6 +76,9 @@ + + + diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java index 6024566f..cf2bc4df 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java @@ -13,6 +13,7 @@ import user.jobengine.server.IJobRuntime; import user.jobengine.server.scheduler.ScheduledJob; public class BatchRetrieveForkStep extends JobStep { + private static final String TARGET_PATH_TYPE = "targetPathType"; private static final Logger logger = LogManager.getLogger(); private static final String CHILD_TEMPLATE = "retrieve-ondemand.xml"; private static final String MEDIACUBEMEDIA = "mediaCubeMedia"; @@ -21,7 +22,8 @@ public class BatchRetrieveForkStep extends JobStep { private MediaCubeMarker marker; @StepEntry - public Object[] execute(List basket, String houseId, String recipient, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { + public Object[] execute(List basket, String houseId, String recipient, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime) + throws Exception { marker = (MediaCubeMarker) jobRuntime.getMarker(); marker.setTo(recipient); @@ -30,7 +32,7 @@ public class BatchRetrieveForkStep extends JobStep { setProgress(10); if (jobRuntime.forkPrepare()) { for (Media mediaCubeMedia : basket) { - submit(mediaCubeMedia, recipient, houseId, jobEngine, jobRuntime); + submit(mediaCubeMedia, recipient, houseId, targetPathType, jobEngine, jobRuntime); } } setProgress(50); @@ -39,13 +41,15 @@ public class BatchRetrieveForkStep extends JobStep { return null; } - public void submit(Media mediaCubeMedia, String recipient, String houseId, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { + public void submit(Media mediaCubeMedia, String recipient, String houseId, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime) + throws Exception { try { ScheduledJob scheduledJob = jobEngine.getScheduledJob(CHILD_TEMPLATE); Map parameters = scheduledJob.getJobParameters(); parameters.put(MEDIACUBEMEDIA, mediaCubeMedia); parameters.put(HOUSEID, houseId); parameters.put(RECIPIENT, recipient); + parameters.put(TARGET_PATH_TYPE, targetPathType); IJobRuntime child = jobEngine.submit(jobRuntime, null, CHILD_TEMPLATE, String.format("Visszatöltés %s részére", recipient), parameters); ((MediaCubeMarker) child.getMarker()).setTo(recipient); } catch (Exception e) { diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java index c4413249..9e1d0231 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java @@ -12,6 +12,7 @@ import java.nio.file.attribute.BasicFileAttributes; import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; import user.jobengine.server.IJobEngine; import user.jobengine.server.IJobRuntime; @@ -23,59 +24,74 @@ public class OutputPathAndNameSelectorStep extends JobStep { private static final Logger logger = LogManager.getLogger(); - private void check(String localRetrievePath, String trafficOutputFolder, String octopusOutputFolder, String genericOutputFolder, String houseId) { + private Marker marker; + + private void check(String localRetrievePath, String trafficOutputFolder, String octopusOutputFolder, String genericOutputFolder, String houseId, + String targetPathType) { if (StringUtils.isBlank(localRetrievePath)) { - logger.error(getMarker(), "A folyamat 'localRetrievePath' bemeneti paramétere üres."); + logger.error(marker, "A folyamat 'localRetrievePath' bemeneti paramétere üres."); throw new NullPointerException("System is not configured properly, 'localRetrievePath' input parameter missing."); } if (StringUtils.isBlank(trafficOutputFolder)) { - logger.error(getMarker(), "A folyamat 'trafficOutputFolder' bemeneti paramétere üres."); + logger.error(marker, "A folyamat 'trafficOutputFolder' bemeneti paramétere üres."); throw new NullPointerException("System is not configured properly, 'trafficOutputFolder' input parameter missing."); } if (StringUtils.isBlank(octopusOutputFolder)) { - logger.error(getMarker(), "A folyamat 'octopusOutputFolder' bemeneti paramétere üres."); + logger.error(marker, "A folyamat 'octopusOutputFolder' bemeneti paramétere üres."); throw new NullPointerException("System is not configured properly, 'octopusOutputFolder' input parameter missing."); } if (StringUtils.isBlank(genericOutputFolder)) { - logger.error(getMarker(), "A folyamat 'genericOutputFolder' bemeneti paramétere üres."); + logger.error(marker, "A folyamat 'genericOutputFolder' bemeneti paramétere üres."); throw new NullPointerException("System is not configured properly, 'genericOutputFolder' input parameter missing."); } if (StringUtils.isBlank(houseId)) { - logger.error(getMarker(), "A folyamat 'houseId' bemeneti paramétere üres."); + logger.error(marker, "A folyamat 'houseId' bemeneti paramétere üres."); throw new NullPointerException("System is not configured properly, 'houseId' input parameter missing."); } + if (StringUtils.isBlank(targetPathType)) { + logger.error(marker, "A folyamat 'targetPathType' bemeneti paramétere üres."); + throw new NullPointerException("System is not configured properly, 'targetPathType' input parameter missing."); + } } @StepEntry public Object[] execute(String localRetrievePath, String trafficOutputFolder, String octopusOutputFolder, String genericOutputFolder, - boolean retrieveToNexio, String houseId, IJobEngine jobEngine, IJobRuntime jobRuntime) throws IOException { - check(localRetrievePath, trafficOutputFolder, octopusOutputFolder, genericOutputFolder, houseId); + String onlineOutputFolder, boolean retrieveToNexio, String houseId, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime) + throws IOException { + marker = jobRuntime.getMarker(); + check(localRetrievePath, trafficOutputFolder, octopusOutputFolder, genericOutputFolder, houseId, targetPathType); + Object[] result = null; + switch (Integer.parseInt(targetPathType)) { + case 0: + String outputFolder = getFolderById(trafficOutputFolder, octopusOutputFolder, genericOutputFolder, houseId); + return localTargetInit(localRetrievePath, outputFolder, houseId, jobRuntime); + case 1: + return localTargetInit(localRetrievePath, onlineOutputFolder, houseId, jobRuntime); + case 2: + return new Object[] { null, houseId + TARGETNAMEPATTERN, true }; + } + return result; + } + private String getFolderById(String trafficOutputFolder, String octopusOutputFolder, String genericOutputFolder, String houseId) { String id = houseId.toUpperCase(); MetadataType mdType = MetadataTypeDetector.GuessMetadataType(id); - String targetPath = null; + String result = null; switch (mdType) { case Generic: - targetPath = Paths.get(localRetrievePath, genericOutputFolder, id).toString(); + result = genericOutputFolder; break; case OctopusPlaceholder: case OctopusStory: - targetPath = getPossiblePath(id, Paths.get(localRetrievePath, octopusOutputFolder, id)).toString(); + result = octopusOutputFolder; break; case TrafficMaterial: case TrafficPromo: case TrafficAD: - targetPath = getPossiblePath(id, Paths.get(localRetrievePath, trafficOutputFolder, id)).toString(); + result = trafficOutputFolder; break; } - String targetNamePattern = houseId + TARGETNAMEPATTERN; - try { - EscortFiles.ensureUNCFolder(Paths.get(targetPath)); - } catch (Exception e) { - logger.error(jobRuntime.getMarker(), "A cél mappa '{}' nem létezik és nem hozható létre. A rendszer hibaüzenete: {}", targetPath, e.getMessage()); - throw e; - } - return new Object[] { targetPath, targetNamePattern }; + return result; } private String getPossiblePath(String id, Path targetPath) throws IOException { @@ -95,4 +111,16 @@ public class OutputPathAndNameSelectorStep extends JobStep { return result[0]; } + private Object[] localTargetInit(String localRetrievePath, String outputFolder, String houseId, IJobRuntime jobRuntime) throws IOException { + String id = houseId.toUpperCase(); + String targetPath = getPossiblePath(id, Paths.get(localRetrievePath, outputFolder, id)).toString(); + String targetNamePattern = houseId + TARGETNAMEPATTERN; + try { + EscortFiles.ensureUNCFolder(Paths.get(targetPath)); + } catch (Exception e) { + logger.error(jobRuntime.getMarker(), "A cél mappa '{}' nem létezik és nem hozható létre. A rendszer hibaüzenete: {}", targetPath, e.getMessage()); + throw e; + } + return new Object[] { targetPath, targetNamePattern, false }; + } } diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMExtendedRetrieveStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMExtendedRetrieveStep.java new file mode 100644 index 00000000..9d1d5fd7 --- /dev/null +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMExtendedRetrieveStep.java @@ -0,0 +1,50 @@ +package user.jobengine.server.steps; + +import user.commons.StoreUri; +import user.commons.remotestore.RemoteStoreProtocol; +import user.jobengine.db.IItemManager; +import user.jobengine.db.Media; +import user.jobengine.server.IJobEngine; +import user.jobengine.server.IJobRuntime; + +public class TSMExtendedRetrieveStep extends TSMRestoreStep { + private boolean useNexioTarget; + + @Override + protected StoreUri createTargetUri(IItemManager manager, String targetPath) throws NullPointerException { + StoreUri result = null; + if (useNexioTarget) { + String nexioHost = System.getProperty("nexio.host"), nexioPassword = System.getProperty("nexioPassword"), + nexioUserName = System.getProperty("nexioUserName"); + Integer nexioPort = Integer.parseInt(System.getProperty("nexioPort")); + if (nexioHost == null) { + throw new NullPointerException("Missing system property on 'nexio.host' name"); + } + if (nexioPassword == null) { + throw new NullPointerException("Missing system property on 'nexioPassword' name"); + } + if (nexioPort == 0) { + throw new NullPointerException("Missing system property on 'nexioPort' name"); + } + if (nexioUserName == null) { + throw new NullPointerException("Missing system property on 'nexioUserName' name"); + } + result = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost); + result.setPortNumber(nexioPort); + result.setUserName(nexioUserName); + result.setPassword(nexioPassword); + + } else + result = super.createTargetUri(manager, targetPath); + return result; + } + + @StepEntry + public Object[] execute(Media mediaCubeMedia, String targetPath, String targetNamePattern, String successRecipient, int killDateDays, + String localRetrievePath, String globalRetrievePath, boolean useNexioTarget, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { + this.useNexioTarget = useNexioTarget; + return super.execute(mediaCubeMedia, targetPath, targetNamePattern, successRecipient, killDateDays, localRetrievePath, globalRetrievePath, jobEngine, + jobRuntime); + } + +} diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMRestoreStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMRestoreStep.java index 65827e65..02190245 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMRestoreStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMRestoreStep.java @@ -33,6 +33,10 @@ public class TSMRestoreStep extends JobStep { private String sourceFileName; private Marker marker; + protected StoreUri createTargetUri(IItemManager manager, String targetPath) { + return manager.createStoreUri(RemoteStoreProtocol.LOCAL, targetPath); + } + @StepEntry public Object[] execute(Media mediaCubeMedia, String targetPath, String targetNamePattern, String successRecipient, int killDateDays, String localRetrievePath, String globalRetrievePath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { @@ -40,7 +44,7 @@ public class TSMRestoreStep extends JobStep { setAndCheck(mediaCubeMedia, targetPath, targetNamePattern, localRetrievePath, globalRetrievePath, jobEngine); String targetFileName = null; try { - //TODO check file existance? + // TODO check file existance? final IJobRuntime runtime = jobRuntime; sourceUri.addProgressListener(new IProgressEventListener() { @Override @@ -73,7 +77,7 @@ public class TSMRestoreStep extends JobStep { } catch (Exception e) { Message msg = LogUtils.format("Az '{}' állomány visszatöltése sikertelen. A rendszer hibaüzenete: {}", sourceFileName, e.getMessage()); logger.error(marker, msg); - //logger.error(jobRuntime.marker, msg); + // logger.error(jobRuntime.marker, msg); logger.catching(e); throw e; } @@ -125,7 +129,7 @@ public class TSMRestoreStep extends JobStep { logger.error(marker, "A TSM rendszer beállítás paraméterei nem elérhetőek."); throw new NullPointerException("System is not configured properly, missing TSM StoreUri."); } - targetUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, targetPath); + targetUri = createTargetUri(manager, targetPath); sourceFileName = getSourceFileName(mediaCubeMedia, tsmStore); if (sourceFileName == null) { logger.error(marker, "Adatbázis bejegyzés hiba, a visszatöltendő fájl neve nem található."); diff --git a/server/user.jobengine.osgi.server/.settings/org.eclipse.core.resources.prefs b/server/user.jobengine.osgi.server/.settings/org.eclipse.core.resources.prefs index 54d10621..3d9a8da3 100644 --- a/server/user.jobengine.osgi.server/.settings/org.eclipse.core.resources.prefs +++ b/server/user.jobengine.osgi.server/.settings/org.eclipse.core.resources.prefs @@ -2,3 +2,4 @@ eclipse.preferences.version=1 encoding//pages/login.zul=UTF-8 encoding//resources/i3-label_hu.properties=UTF-8 encoding//src/user/jobengine/server/JobRuntime.java=UTF-8 +encoding//src/user/jobengine/zk/model/SearchModel.java=UTF-8 diff --git a/server/user.jobengine.osgi.server/pages/retrievebatchselector.zul b/server/user.jobengine.osgi.server/pages/retrievebatchselector.zul index fcfd7e15..75149595 100644 --- a/server/user.jobengine.osgi.server/pages/retrievebatchselector.zul +++ b/server/user.jobengine.osgi.server/pages/retrievebatchselector.zul @@ -17,11 +17,15 @@ + + + + - + @@ -41,7 +45,7 @@ - + diff --git a/server/user.jobengine.osgi.server/pages/searchitems.zul b/server/user.jobengine.osgi.server/pages/searchitems.zul index 3d3212d8..13f6e05d 100644 --- a/server/user.jobengine.osgi.server/pages/searchitems.zul +++ b/server/user.jobengine.osgi.server/pages/searchitems.zul @@ -122,10 +122,10 @@ - - - - + + + + @@ -201,7 +201,11 @@
- +
+
+
- - - - - - - - - + +
@@ -273,7 +276,6 @@
- diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/RetrieveBatchSelectorModel.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/RetrieveBatchSelectorModel.java index 13b30a59..e687a0a2 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/RetrieveBatchSelectorModel.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/RetrieveBatchSelectorModel.java @@ -16,6 +16,8 @@ import org.zkoss.bind.annotation.NotifyChange; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.select.Selectors; import org.zkoss.zk.ui.select.annotation.Wire; +import org.zkoss.zul.ListModel; +import org.zkoss.zul.ListModelList; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Window; @@ -27,17 +29,38 @@ import user.jobengine.server.scheduler.ScheduledJob; import user.jobengine.zk.util.SessionUtil; public class RetrieveBatchSelectorModel extends BaseModel { + private enum Types { + Automatikus("0"), Online("1"), Nexio("2"); + private final String value; + + Types(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + } + + private static final String TARGET_PATH_TYPE = "targetPathType"; + private static final Logger logger = LogManager.getLogger(); private static final String BASKET = "basket"; private static final String RECIPIENT = "recipient"; private static final String HOUSEID = "houseId"; private static final String RESTORE = "Visszatöltés"; + private static final String JOBTEMPLATE = "batch-retrieve-ondemand.xml"; + + private ListModelList reloadTypes = new ListModelList<>(Types.values()); + private List selectedItems; - private boolean disabled; + private boolean disabled; @Wire() private Window wndRetrieveBatch; + private String houseId; private String email; private MenuModel menuModel; @@ -46,6 +69,7 @@ public class RetrieveBatchSelectorModel extends BaseModel { public void afterCompose(@ContextParam(ContextType.VIEW) Component view) { menuModel = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL); Selectors.wireComponents(view, this, false); + reloadTypes.addToSelection(Types.values()[0]); } @Command @@ -68,6 +92,7 @@ public class RetrieveBatchSelectorModel extends BaseModel { parameters.put(HOUSEID, houseId); parameters.put(RECIPIENT, email); parameters.put(BASKET, getMedias()); + parameters.put(TARGET_PATH_TYPE, Types.valueOf(reloadTypes.getSelection().iterator().next().toString()).value); jobEngine.submit(JOBTEMPLATE, RESTORE, parameters); menuModel.clearBasket(); @@ -101,6 +126,10 @@ public class RetrieveBatchSelectorModel extends BaseModel { return result; } + public ListModel getReloadTypes() { + return reloadTypes; + } + public List getSelectedItems() { return selectedItems; } @@ -132,8 +161,8 @@ public class RetrieveBatchSelectorModel extends BaseModel { this.houseId = houseId; } - public void setSelectedItems(List selectedItems) { - this.selectedItems = selectedItems; + public void setReloadTypes(ListModelList reloadTypes) { + this.reloadTypes = reloadTypes; } } \ No newline at end of file diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java index 966f73a3..0d43bc19 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java @@ -13,6 +13,7 @@ import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.zkoss.bind.BindContext; import org.zkoss.bind.ValidationContext; import org.zkoss.bind.Validator; import org.zkoss.bind.annotation.AfterCompose; @@ -28,7 +29,7 @@ import org.zkoss.zk.ui.event.MouseEvent; import org.zkoss.zk.ui.event.SortEvent; import org.zkoss.zk.ui.select.Selectors; import org.zkoss.zk.ui.select.annotation.Wire; -import org.zkoss.zk.ui.util.Clients; +import org.zkoss.zul.Button; import org.zkoss.zul.Checkbox; import org.zkoss.zul.Column; import org.zkoss.zul.Detail; @@ -81,10 +82,15 @@ public class SearchModel extends AsyncBaseModel { Timer timer; @Wire Grid itemsGrid; + @Wire + Button backToVideoButton; private String orderBy; private boolean orderAscending; private Map topColorClasses; + private int selectedRowIndex; + private int selectedPageIndex; + private String mediaID; public SearchModel() { typeFilters = new LinkedHashMap<>(); @@ -154,7 +160,7 @@ public class SearchModel extends AsyncBaseModel { column.addEventListener("onSort", evt -> doSort(evt)); } - String mediaID = SessionUtil.getQueryParameter(MEDIA_ID); + mediaID = SessionUtil.getQueryParameter(MEDIA_ID); if (mediaID != null) searchResult = new InitializedCachedListModel(mediaID, searchValue, new ArrayList(), orderBy, orderAscending); } @@ -169,7 +175,9 @@ public class SearchModel extends AsyncBaseModel { Clipboard clipboard = toolkit.getSystemClipboard(); StringSelection strSel = new StringSelection(url); clipboard.setContents(strSel, null); - Messagebox.show("A médiához szükséges URL a vágólapra másolva, az URL a következő:\n" + url, "", Messagebox.OK, Messagebox.NONE); + String email = String.format("mailto:?subject=Média címe: %s &body=A média itt tekinthető meg: %s", selectedObject.getMedia().getTitle(), url); + // Messagebox.show("A médiához szükséges URL a vágólapra másolva, az URL a következő:\n" + email, "", Messagebox.OK, Messagebox.NONE); + Executions.getCurrent().sendRedirect(email, "_blank"); } @Command @@ -373,17 +381,18 @@ public class SearchModel extends AsyncBaseModel { } @Command - public void onAfterRenderGrid() { - registerTask(() -> { - logger.info("onAfterRenderGrid"); - List children = itemsGrid.getRows().getChildren(); - if (children.size() > 0) { - int pos = itemsGrid.getPageSize() * itemsGrid.getActivePage(); - Component top = children.get(pos); - Clients.scrollIntoView(top); - } - }); - timer.start(); + @NotifyChange("itemsGrid") + public void jumpToPosition(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { + itemsGrid.setActivePage(selectedPageIndex); + } + + @Command + public void onPaging() { + if (mediaID != null) { + selectedObject = searchResult.getElementAt(0); + highlight(selectedObject, true); + notifyChange("selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath"); + } } @Command @@ -406,9 +415,12 @@ public class SearchModel extends AsyncBaseModel { @Command @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" }) - public void selectMediaArchive(@BindingParam("selectedObject") ArchivedMedia selectedObject) { + public void selectMediaArchive(@BindingParam("selectedObject") ArchivedMedia selectedObject, @ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { + Event event = ctx.getTriggerEvent(); + selectedRowIndex = ((Row) event.getTarget()).getIndex(); highlight(this.selectedObject, false); this.selectedObject = selectedObject; + selectedPageIndex = itemsGrid.getActivePage(); highlight(this.selectedObject, true); logger.info(itemsGrid.getActivePage()); -- 2.54.0