From 1d9c6428b3b806e73831e638414188d7f4346ad2 Mon Sep 17 00:00:00 2001 From: "vasary.daniel" Date: Mon, 13 Dec 2021 13:25:12 +0000 Subject: [PATCH] git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C32570 --- .../pages/searchitems/results.zul | 79 +- .../jobengine/zk/model/GridSearchModel.java | 1175 +++++++++++++++++ 2 files changed, 1253 insertions(+), 1 deletion(-) create mode 100644 server/user.mediacube.gui/src/user/jobengine/zk/model/GridSearchModel.java diff --git a/server/user.mediacube.gui/pages/searchitems/results.zul b/server/user.mediacube.gui/pages/searchitems/results.zul index 3cb307bb..e0713f92 100644 --- a/server/user.mediacube.gui/pages/searchitems/results.zul +++ b/server/user.mediacube.gui/pages/searchitems/results.zul @@ -18,4 +18,81 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/user.mediacube.gui/src/user/jobengine/zk/model/GridSearchModel.java b/server/user.mediacube.gui/src/user/jobengine/zk/model/GridSearchModel.java new file mode 100644 index 00000000..b44d8b38 --- /dev/null +++ b/server/user.mediacube.gui/src/user/jobengine/zk/model/GridSearchModel.java @@ -0,0 +1,1175 @@ +package user.jobengine.zk.model; + +import static java.time.temporal.TemporalAdjusters.firstDayOfMonth; +import static java.time.temporal.TemporalAdjusters.firstDayOfNextMonth; +import static java.time.temporal.TemporalAdjusters.firstDayOfNextYear; +import static java.time.temporal.TemporalAdjusters.firstDayOfYear; + +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +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; +import org.zkoss.bind.annotation.BindingParam; +import org.zkoss.bind.annotation.Command; +import org.zkoss.bind.annotation.ContextParam; +import org.zkoss.bind.annotation.ContextType; +import org.zkoss.bind.annotation.NotifyChange; +import org.zkoss.json.JSONObject; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zk.ui.event.KeyEvent; +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.Combobox; +import org.zkoss.zul.Detail; +import org.zkoss.zul.Grid; +import org.zkoss.zul.Hbox; +import org.zkoss.zul.Hlayout; +import org.zkoss.zul.ListModelList; +import org.zkoss.zul.Menuitem; +import org.zkoss.zul.Menupopup; +import org.zkoss.zul.Messagebox; +import org.zkoss.zul.Paging; +import org.zkoss.zul.Panel; +import org.zkoss.zul.Row; +import org.zkoss.zul.Timer; +import org.zkoss.zul.Toolbar; +import org.zkoss.zul.Toolbarbutton; +import org.zkoss.zul.Vlayout; +import org.zkoss.zul.West; +import org.zkoss.zul.Window; + +import user.commons.ListUtils; +import user.commons.StoreUri; +import user.commons.remotestore.RemoteStoreProtocol; +import user.jobengine.db.ArchivedMedia; +import user.jobengine.db.IItemManager; +import user.jobengine.db.ItemManager; +import user.jobengine.db.ItemType; +import user.jobengine.db.MediaFile; +import user.jobengine.db.SearchOptions; +import user.jobengine.db.Store; +import user.jobengine.gui.ComponentBinder; +import user.jobengine.server.IJobEngine; +import user.jobengine.server.JobEngineException; +import user.jobengine.server.scheduler.ScheduledJob; +import user.jobengine.zk.util.SessionUtil; + +public class GridSearchModel extends AsyncBaseModel { + private static final String TAGTYPE_REMOVE = "remove"; + private static final String TAGTYPE_ADD = "add"; + private static final String TAGEVT_TAGTEXT = "tagtext"; + private static final String TAGEVT_TYPE = "type"; + private static final String TAGSRC_FILTER = "filter"; + private static final String TAGSRC_MEDIA = "media"; + private static final String TAGEVT_SOURCE = "source"; + private static final String CREATE_LOWRES_TEMPLATE = "create-lowres-ondemand.xml"; + private static final String ARG = "arg"; + private static final String MEDIA_ID = "showMediaID"; + private static final Logger logger = LogManager.getLogger(); + private List topTypeFilters; + private List bottomTypeFilters; + private Map typeFilters; + private Map columnHeaders; + private CachedListModel searchResult = null; + private ArchivedMedia selectedObject = null; + private Validator allFilterCheckedValidator; + private Validator itemSelectedValidator; + private boolean allChecked = true; + private boolean rowsExpanded = true; + private boolean allSelected; + private boolean itemSelected; + private int descLength; + private Map tags = null; + private List searchTags = new ArrayList<>(); + protected IItemManager itemManager = null; + + @Wire + Timer timer; + @Wire + Grid itemsGrid; + @Wire + Button backToVideoButton; + @Wire + Combobox search; + @Wire + Toolbar tagsToolbar; + @Wire + Button btnSearch; + @Wire + Hbox searchFiltersMenu; + @Wire + Toolbarbutton toggleShowTypeFilters; + @Wire + Panel serachDetails; + @Wire + Toolbar filterToolbar; + + @Wire + Menupopup searchSettings; + @Wire + Vlayout mediaDetails; + @Wire + West searchWest; + + private String orderBy; + + private boolean orderAscending; + private Map topColorClasses; + private int selectedRowIndex = -1; + private volatile boolean preventAfterRender; + private int positionToScroll = -1; + private ListModelList searchHistory; + private Map columnOrder; + private Date searchFrom; + private Date searchTo; + private boolean missingProxy; + private int selectedDateOption; + private Window metaWindow; + + public GridSearchModel() { + this.itemManager = ItemManager.getInstance(); + + typeFilters = new LinkedHashMap<>(); + MediaCubeConfig mediaCubeConfig = SessionUtil.getMediaCubeConfig(); + setTopTypeFilters(mediaCubeConfig.getTopTypeFilters()); + setBottomTypeFilters(mediaCubeConfig.getBottomTypeFilters()); + + columnHeaders = new LinkedHashMap<>(); + columnHeaders.put("ID", "mediahouseid"); + columnHeaders.put("Cím", "mediatitle"); + columnHeaders.put("Hossz", "length"); + columnHeaders.put("Fájlnév", "mediafilehouseid"); + columnHeaders.put("Archiválva", "archived"); + + allFilterCheckedValidator = new Validator() { + @Override + public void validate(ValidationContext ctx) { + try { + + TypeFilter typeFilter = (TypeFilter) ctx.getProperty().getBase(); + boolean isChecked = (boolean) ctx.getProperty().getValue(); + typeFilter.setChecked(isChecked); + // logger.info("{} {}", label, isChecked); + } catch (Exception e) { + + } + updateAllChecked(); + } + }; + + itemSelectedValidator = new Validator() { + @Override + public void validate(ValidationContext ctx) { + try { + + ArchivedMedia item = (ArchivedMedia) ctx.getValidatorArg(ARG); + boolean select = (boolean) ctx.getProperty().getValue(); + MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL); + model.selectArchivedMedia(item, select); + } catch (Exception e) { + + } + } + }; + + // searchHistory = new ListModelList<>(SessionUtil.getUserSearchHistory()); + // setColumnOrder(); + // setUserSelectedFilters(); + } + + private void addTypeFilters(List filters) { + for (TypeFilter typeFilter : filters) + typeFilters.put(typeFilter.getName(), typeFilter); + } + + @AfterCompose + public void afterCompose(@ContextParam(ContextType.VIEW) Component view) { + // A MediaFileServlet a services/proxy alatt szolgal ki + // Clients.evalJavaScript("setSource('http://localhost:9080/services/proxy/20209535_1-20205617.mp4', + // 'video/mp4')"); + + try { + + Selectors.wireComponents(view, this, false); + Selectors.wireEventListeners(view, this); + + boolean typeFiltersVisible = SessionUtil.getTypeFiltersVisibility(); + if (typeFiltersVisible) { + toggleShowTypeFilters.setChecked(true); + toggleTypeFiltersCheck(); + search.setFocus(true); + } + + configureSearchResultGrid(); + showExternalMediaID(); + + searchHistory = new ListModelList<>(SessionUtil.getUserSearchHistory()); + setColumnOrder(); + setUserSelectedFilters(); + + if (SessionUtil.getUserPageSize() != 0) + itemsGrid.setPageSize(SessionUtil.getUserPageSize()); + setSettingsPageSize(itemsGrid.getPageSize()); + if (!allChecked) + showSearchTypeWarning(); + + tags = itemManager.getAllTags(); + // lekerdezesi hiba + if (tags == null) + Clients.showNotification("A cimkék inicializálása sikertelen!", "error", tagsToolbar, "start_center", + 3000); + else + setSearchTags(); + + } catch (Exception e) { + handleSearchError(e); + } + + } + + private void clearAllFilters() { + for (String filter : typeFilters.keySet()) { + typeFilters.get(filter).setChecked(false); + } + } + + @Command + @NotifyChange("searchHistory") + public void clearHistory() { + setSearchHistory(new ListModelList<>()); + SessionUtil.putUserSearchHistory(searchHistory); + } + + private void configureSearchResultGrid() { + Paging paging = itemsGrid.getPagingChild(); + paging.setAutohide(false); + + for (Component child : itemsGrid.getColumns().getChildren()) { + Column column = (Column) child; + if (columnOrder != null) + if (column.getLabel().equals(columnOrder.entrySet().iterator().next().getKey())) + column.setSortDirection(columnOrder.entrySet().iterator().next().getValue()); + column.addEventListener("onSort", evt -> doSort(evt)); + } + } + + @Command + public void copyMediaIdToClipboard() { + String port = (Executions.getCurrent().getServerPort() == 80) ? "" + : (":" + Executions.getCurrent().getServerPort()); + String baseURL = Executions.getCurrent().getScheme() + "://" + Executions.getCurrent().getServerName() + port + + Executions.getCurrent().getContextPath(); + String url = String.format("%s/?%s=%d", baseURL, MEDIA_ID, selectedObject.getMedia().getId()); + String email = String.format("mailto:?subject=Média címe: %s &body=A média itt tekinthető meg: %s", + selectedObject.getMedia().getTitle(), url); + Executions.getCurrent().sendRedirect(email); + } + + @Command + public void createLowres() { + IJobEngine jobEngine = ComponentBinder.getJobEngine(); + + ScheduledJob scheduledJob = jobEngine.getScheduledJob(CREATE_LOWRES_TEMPLATE); + Map parameters = scheduledJob.getJobParameters(); + parameters.put("mediaCubeMedia", selectedObject.getMedia()); + parameters.put("deleteSource", true); + parameters.put("killDateDays", 0); + parameters.put("targetNamePattern", "%s"); + parameters.put("successRecipient", SessionUtil.getUserPrincipal().getEmail()); + + try { + jobEngine.submit(CREATE_LOWRES_TEMPLATE, scheduledJob.getJobName(), parameters, + SessionUtil.getUserPrincipal().getDisplayName()); + Messagebox.show("A proxy pótlása elindult, emailben értesíti a rendszer a folyamat végeztével.", + "Információ", Messagebox.OK, Messagebox.INFORMATION); + } catch (JobEngineException e) { + logger.info("Hiba a feladat indításakor", e); + Messagebox.show("Hiba a feladat indításakor. A rendszer üzenete: " + e.getMessage(), "Hiba", Messagebox.OK, + Messagebox.ERROR); + } + } + + @Command + @NotifyChange({ "searchResult", "selectedObject", "hasTSMMediaFile", "hasLowresMediaFile", "lowresMediaFilePath" }) + public void doSearch() { + try { + search.close(); + search.select(); + searchResult = null; + itemsGrid.setActivePage(0); + setSelectedObject(null); + String searchValue = search.getText(); + + if (StringUtils.isNotBlank(searchValue) && !searchHistory.contains(searchValue)) { + searchHistory.add(0, searchValue); + SessionUtil.putUserSearchHistory(searchHistory); + } + + List searchFilters = getSelectedFilters(); + SessionUtil.putUserSearchFilter(searchFilters); + + if (SessionUtil.getUserColumnOrder() != null) { + orderBy = columnHeaders.get(columnOrder.entrySet().iterator().next().getKey()); + orderAscending = columnOrder.entrySet().iterator().next().getValue().equals("ascending"); + } + + if (searchFilters == null || searchFilters.size() == 0) + throw new Exception("Anyag típus kiválasztása kötelező!"); + + List selectedTypeIds = getTypeIDs(searchFilters); + + SearchOptions options = SearchOptions.create().setText(searchValue).setTypes(selectedTypeIds) + .setTags(searchTags).setFrom(searchFrom).setTo(searchTo).setMissingProxy(missingProxy) + .setDescLength(descLength).setOrder(orderBy, orderAscending); + + if (!options.isValid()) + throw new Exception( + "Legalább egy keresési opció használata kötelező: 3 karakter, hiányzó proxy, dátum, típus, cimke!"); + searchResult = new CachedListModel(options); + searchResult.addEventListener(e -> { + if (e.getName().equals(Events.ON_ERROR)) { + Exception ex = (Exception) e.getData(); + handleSearchError(ex); + } + }); + + if (!allChecked) + showSearchTypeWarning(); + + } catch (Exception e) { + handleSearchError(e); + } + } + + public void doSort(Event event) throws Exception { + itemsGrid.getColumns().getChildren().forEach(c -> ((Column) c).setSortDirection("natural")); + SortEvent evt = (SortEvent) event; + Column column = (Column) evt.getTarget(); + column.setSortDirection(evt.isAscending() ? "ascending" : "descending"); + logger.info("{} {}", column.getLabel(), evt.isAscending()); + + columnOrder = new HashMap<>(); + columnOrder.put(column.getLabel(), column.getSortDirection()); + SessionUtil.putUserColumnOrder(columnOrder); + + orderBy = columnHeaders.get(column.getLabel()); + orderAscending = evt.isAscending(); + doSearch(); + notifyChange("searchResult", "selectedObject", "hasLowresMediaFile", "lowresMediaFilePath"); + evt.stopPropagation(); + } + + @Command + public void downloadMedia() { + if (!getHasTSMMediaFile()) + return; + // Map arguments = new HashMap(); + // arguments.put(MEDIACUBEMEDIA, this.selectedObject.getMedia()); + // Window window = (Window) + // Executions.createComponents(PAGES_RETRIEVESELECTOR_ZUL, null, + // arguments); + // window.doModal(); + + MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL); + model.selectArchivedMedia(this.selectedObject, true); + } + + void ensureVisible(int pos) { + + registerTask(() -> { + logger.info("Scrolling to pos {} begin", pos); + List children = itemsGrid.getRows().getChildren(); + if (children.size() > 0) { + Component top = children.get(pos); + Clients.scrollIntoView(top); + logger.info("Scrolled into the {}. row on the page.", pos); + } + + if (positionToScroll > -1) { + highlight(selectedObject, true); + positionToScroll = -1; + } + + logger.info("Scrolling to pos {} end", pos); + preventAfterRender = false; + }); + timer.start(); + } + + public Validator getAllFilterCheckedValidator() { + return allFilterCheckedValidator; + } + + public List getBottomTypeFilters() { + return bottomTypeFilters; + } + + public int getDescLength() { + return descLength; + } + + public boolean getHasLowresMediaFile() { + boolean ret = false; + if (selectedObject != null) { + List mediaFiles = selectedObject.getMedia().getMediaFiles(); + if (mediaFiles != null) { + for (MediaFile mf : mediaFiles) { + if (mf.getStore().isLowres()) { + return true; + } + } + } + } + return ret; + } + + public boolean getHasTSMMediaFile() { + return selectedObject != null; + } + + public Validator getItemSelectedValidator() { + return itemSelectedValidator; + } + + public String getLowresMediaFilePath() throws Exception { + String ret = null; + if (selectedObject != null) { + List mediaFiles = selectedObject.getMedia().getMediaFiles(); + if (mediaFiles != null) { + for (MediaFile mf : mediaFiles) { + Store store = mf.getStore(); + if (store == null) + continue; + // TODO a tartalek nem tud lowres lenni, de a TSM-nek nincs HTTP bejegyzese + // if (store.isLowres()) { + // StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP); + // URL base = new URL(sourceStoreUri.toString()); + // String relative = mf.getRelativePath().replace("\\", "/"); + // ret = new URL(base, relative).toString(); + // break; + // } + + // relative cim a sajat kiszolgalo miatt + StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP); + + if (sourceStoreUri != null && sourceStoreUri.isStream()) { + + String noProtocolUri = sourceStoreUri.toString(true); + String base = noProtocolUri.startsWith("/") ? noProtocolUri : sourceStoreUri.toString(false); + if (!base.endsWith("/")) + base += "/"; + String relative = mf.getRelativePath().replace("\\", "/"); + ret = base + relative; + logger.info("Found lowres on store {}, url is {}", store.getName(), ret); + break; + } + } + } + } + return ret; + } + + public Date getSearchFrom() { + return searchFrom; + } + + public ListModelList getSearchHistory() { + return searchHistory; + } + + public ListModelList getSearchResult() { + return searchResult; + } + + public Date getSearchTo() { + return searchTo; + } + + public int getSelectedDateOption() { + return selectedDateOption; + } + + private List getSelectedFilters() { + List result = null; + for (String label : typeFilters.keySet()) { + boolean isChecked = typeFilters.get(label).isChecked(); + if (!isChecked) + continue; + if (result == null) + result = new ArrayList<>(); + result.add(label); + } + return result; + } + + public ArchivedMedia getSelectedObject() { + return selectedObject; + } + + public Map getTopColorClasses() { + return topColorClasses; + } + + public List getTopTypeFilters() { + return topTypeFilters; + } + + public String getTSMMediaFilePath() throws Exception { + String ret = ""; + if (selectedObject != null) { + List mediaFiles = selectedObject.getMedia().getMediaFiles(); + for (MediaFile mf : mediaFiles) { + Store store = mf.getStore(); + if (mf.getStore().isSystem()) + ret = Paths.get(store.getStoreUris().get(0).toString(false), mf.getRelativePath()).toString(); + } + } + return ret; + } + + public Map getTypeFilters() { + return typeFilters; + } + + private List getTypeIDs(List searchFilters) { + if (allChecked) + return null; + List result = null; + if (searchFilters != null) { + for (String typeName : searchFilters) { + ItemType itemType = itemManager.getItemType(typeName); + if (itemType == null) + continue; + if (result == null) + result = new ArrayList<>(); + result.add(itemType.getId()); + } + } + return result; + } + + private void handleSearchError(Exception e) { + if (e instanceof NullPointerException) + Clients.showNotification("Database query error!", "error", btnSearch, "start_center", 3000); + else + Clients.showNotification(e.getMessage(), "error", btnSearch, "start_center", 3000); + logger.error(e); + } + + private void highlight(ArchivedMedia am, boolean highlight) { + if (am == null) + return; + List components = itemsGrid.getRows().getChildren(); + for (int i = 0; i < components.size(); i++) { + Row row = (Row) components.get(i); + ArchivedMedia archivedMedia = (ArchivedMedia) row.getValue(); + if (archivedMedia != null && am.getMedia().getId() == archivedMedia.getMedia().getId()) { + Detail detail = (Detail) row.getChildren().get(0); + Hlayout hlayout = (Hlayout) detail.getChildren().get(0); + if (highlight) { + selectedRowIndex = i; + row.setStyle("background: #F1F8E9;"); + hlayout.setStyle("border-bottom: 1px solid #C5E1A5; background: #F1F8E9;"); + } else { + row.setStyle("background: none;"); + hlayout.setStyle("border-bottom: 1px solid #ebebeb; background: none;"); + } + break; + + } + } + } + + public boolean isAllChecked() { + return allChecked; + } + + public boolean isAllSelected() { + return allSelected; + } + + public boolean isItemSelected() { + return itemSelected; + } + + public boolean isMissingProxy() { + return missingProxy; + } + + public boolean isRowsExpanded() { + return rowsExpanded; + } + + @Command + public void onAfterRenderGrid() { + logger.info("onAfterRenderGrid begin"); + // aszinkron fut le, kulon kezelendo a hiba + try { + + if (searchResult != null) + logger.info("isempty {}", searchResult.isEmpty()); + + String mediaID = SessionUtil.getQueryParameter(MEDIA_ID); + if (mediaID != null) { + selectedObject = searchResult.getElementAt(0); + highlight(selectedObject, true); + notifyChange("selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath"); + logger.info("onAfterRenderGrid end"); + return; + } + + if (preventAfterRender) { + logger.info("onAfterRenderGrid end"); + return; + } + preventAfterRender = true; + + if (positionToScroll != -1) { + ensureVisible(positionToScroll); + } + } catch (Exception e) { + handleSearchError(e); + } + logger.info("onAfterRenderGrid end"); + } + + @Command + public void onChangingCombo(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { + logger.info(((KeyEvent) ctx.getTriggerEvent()).getKeyCode()); + logger.info("onChanging"); + } + + @Command + public void onPaging() { + logger.info("onPaging"); + } + + @Command + public void onTagChanged(@ContextParam(ContextType.TRIGGER_EVENT) Event event) { + // source: filter | media, + // type : add | remove, + // tagtext: e.detail.data.value, + // index: e.detail.index + + JSONObject jsObject = (JSONObject) event.getData(); + if (!jsObject.containsKey(TAGEVT_SOURCE)) + return; + String source = String.valueOf(jsObject.get(TAGEVT_SOURCE)); + + if (TAGSRC_MEDIA.equals(source)) + processMediaTagChanged(jsObject); + + if (TAGSRC_FILTER.equals(source)) + processFilterTagChanged(jsObject); + + logger.info(event); + } + + @Command + public void onTcIn(@ContextParam(ContextType.TRIGGER_EVENT) Event event) throws Exception { + JSONObject jsObject = (JSONObject) event.getData(); + Double doubleVar = 0.0; + if (!jsObject.get("meta").equals(0)) { + doubleVar = (Double) jsObject.get("meta"); + } + + if (doubleVar.floatValue() >= ((selectedObject.getTcOut() == null) ? 9999999999999999999999.9 + : selectedObject.getTcOut())) { + throw new Exception("A kilépés időpontjának későbbinek kell lennie mint a belépés időpontja!"); + } else { + selectedObject.setTcIn(new Float(doubleVar.floatValue())); + } + } + + @Command + public void onTcOut(@ContextParam(ContextType.TRIGGER_EVENT) Event event) throws Exception { + JSONObject jsObject = (JSONObject) event.getData(); + Double doubleVar = 0.0; + if (!jsObject.get("meta").equals(0)) { + doubleVar = (Double) jsObject.get("meta"); + } + + if (doubleVar.floatValue() <= ((selectedObject.getTcIn() == null) ? 0.0 : selectedObject.getTcIn())) { + throw new Exception("A kilépés időpontjának későbbinek kell lennie mint a belépés időpontja!"); + } else { + selectedObject.setTcOut(new Float(doubleVar.floatValue())); + } + } + + @Command + public void onWestResize() { + filterToolbar.invalidate(); + } + + @Command + public void openMetaDataDialog() { + if (metaWindow != null) + return; + + // EventListener eventListener = e -> { + // EventQueues.lookup("my super queue", EventQueues.APPLICATION, + // true).unsubscribe(this); + // }; + // EventQueues.lookup("my super queue", EventQueues.APPLICATION, + // true).subscribe(eventListener); + String template = "/pages/metadatadetails.zul"; + EventListener listener = e -> { + logger.info("Meta window closed"); + + notifyChange("selectedObject", "itemsGrid"); + + metaWindow = null; + }; + + metaWindow = (Window) Executions.createComponents(template, null, + ListUtils.asMap("selectedObject", selectedObject, "listener", listener)); + metaWindow.doOverlapped(); + metaWindow.addEventListener("onClose", listener); + } + + private void processFilterTagChanged(JSONObject jsObject) { + if (tags == null) + return; + + if (!jsObject.containsKey(TAGEVT_TYPE)) + return; + String type = String.valueOf(jsObject.get(TAGEVT_TYPE)); + + if (!jsObject.containsKey(TAGEVT_TAGTEXT)) + return; + String tagText = String.valueOf(jsObject.get(TAGEVT_TAGTEXT)); + + long id = tags.get(tagText); + + switch (type) { + case TAGTYPE_ADD: + searchTags.add(id); + break; + case TAGTYPE_REMOVE: + searchTags.remove(id); + break; + } + } + + private void processMediaTagChanged(JSONObject jsObject) { + if (selectedObject == null || !SessionUtil.isEditor() || tags == null) { + setMediaTags(0); + return; + } + + if (!jsObject.containsKey(TAGEVT_TYPE)) + return; + String type = String.valueOf(jsObject.get(TAGEVT_TYPE)); + + if (!jsObject.containsKey(TAGEVT_TAGTEXT)) + return; + String tagText = String.valueOf(jsObject.get(TAGEVT_TAGTEXT)); + + long id = 0; + if (tags.containsKey(tagText)) + id = tags.get(tagText); + + List mediaTags = selectedObject.getTags(); + switch (type) { + case TAGTYPE_ADD: + if (mediaTags.contains(tagText.toLowerCase())) + return; + if (id == 0) { + id = itemManager.addMediaTag(tagText, selectedObject.getMedia().getId()); + // frissitjuk az osszes Tagify control whitelist-jet + tags.put(tagText, id); + setSearchTags(); + } else + itemManager.addMediaTag(id, selectedObject.getMedia().getId()); + + mediaTags.add(tagText); + break; + case TAGTYPE_REMOVE: + mediaTags.remove(tagText.toLowerCase()); + if (id == 0) { + Messagebox.show("A cimke már nem található az adatbázisban: " + tagText, "Belső hiba!", Messagebox.OK, + Messagebox.EXCLAMATION); + return; + } + itemManager.removeMediaTag(id, selectedObject.getMedia().getId()); + break; + } + } + + @Command + public void rowMouseOut(@BindingParam("evt") MouseEvent event) { + logger.info(event); + } + + // public void rowSelected(@BindingParam("item") Object media, + // @BindingParam("isChecked") boolean isChecked) { + @Command + public void rowMouseOver(@BindingParam("evt") MouseEvent event) { + logger.info(event); + } + + @Command + @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" }) + public void select(@BindingParam("selectedObject") ArchivedMedia selectedObject, + @ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) { + Event event = ctx.getTriggerEvent(); + // Nem mindig a row a target, ha a kepre kattintunk akkor az image + // selectedRowIndex = ((Row) event.getTarget()).getIndex(); + highlight(this.selectedObject, false); + setSelectedObject(selectedObject); + highlight(this.selectedObject, true); + Clients.scrollIntoView(mediaDetails.getFirstChild()); + logger.info("Media was selected. Selected media archive:{}", selectedObject.getMedia().getId()); + } + + @NotifyChange({ "typeFilters", "topTypeFilters", "bottomTypeFilters" }) + public void setAllChecked(boolean allChecked) { + this.allChecked = allChecked; + for (String key : typeFilters.keySet()) + typeFilters.get(key).setChecked(allChecked); + for (TypeFilter topTypeFilter : topTypeFilters) + topTypeFilter.setChecked(allChecked); + for (TypeFilter bottomTypeFilter : bottomTypeFilters) + bottomTypeFilter.setChecked(allChecked); + } + + public void setAllFilterCheckedValidator(Validator allFilterCheckedValidator) { + this.allFilterCheckedValidator = allFilterCheckedValidator; + } + + public void setAllSelected(boolean allSelected) { + this.allSelected = allSelected; + // itemsGrid.renderAll(); + List components = itemsGrid.getRows().getChildren(); + for (Component obj : components) { + Row row = (Row) obj; + List children = row.getChildren(); + if (children.size() < 2) + continue; + Component component = children.get(1); + if (!(component instanceof Checkbox)) + continue; + Checkbox ck = (Checkbox) component; + ck.setChecked(allSelected); + MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL); + model.selectArchivedMedia(row.getValue(), allSelected); + } + + } + + public void setBottomTypeFilters(List bottomTypeFilters) { + this.bottomTypeFilters = bottomTypeFilters; + addTypeFilters(bottomTypeFilters); + + } + + @Command + @NotifyChange({ "searchFrom", "searchTo", "selectedDateOption" }) + public void setCalendar(@BindingParam(TAGEVT_SOURCE) Menuitem source) { + int value = Integer.parseInt(source.getValue()); + LocalDate now = LocalDate.now(); + ZoneId zoneId = ZoneId.systemDefault(); + // az elozo, kovetkezo lepteteshez kell + selectedDateOption = value; + switch (value) { + // nap + case 1: + searchFrom = Date.from(now.atStartOfDay(zoneId).toInstant()); + searchTo = Date.from(now.plusDays(1).atStartOfDay(zoneId).toInstant()); + break; + // het + case 2: + ZonedDateTime zdt = now.atStartOfDay(zoneId); + // ISO 8601, Monday is first day of week + ZonedDateTime firstOfWeek = zdt.with(ChronoField.DAY_OF_WEEK, 1); + searchFrom = Date.from(firstOfWeek.toInstant()); + ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks(1); + searchTo = Date.from(firstOfNextWeek.toInstant()); + break; + // honap + case 3: + searchFrom = Date.from(now.with(firstDayOfMonth()).atStartOfDay(zoneId).toInstant()); + searchTo = Date.from(now.with(firstDayOfNextMonth()).atStartOfDay(zoneId).toInstant()); + break; + // ev + case 4: + searchFrom = Date.from(now.with(firstDayOfYear()).atStartOfDay(zoneId).toInstant()); + searchTo = Date.from(now.with(firstDayOfNextYear()).atStartOfDay(zoneId).toInstant()); + break; + // elozo + case 100: + break; + // kovetkezo + case 200: + break; + case 300: + searchFrom = null; + searchTo = null; + break; + } + } + + private void setColumnOrder() { + if (SessionUtil.getUserColumnOrder() != null) { + columnOrder = new HashMap<>(); + columnOrder.put(SessionUtil.getUserColumnOrder().entrySet().iterator().next().getKey(), + (String) SessionUtil.getUserColumnOrder().entrySet().iterator().next().getValue()); + } + } + + public void setDescLength(int descLength) { + this.descLength = descLength; + } + + public void setItemSelected(boolean itemSelected) { + this.itemSelected = itemSelected; + } + + public void setItemSelectedValidator(Validator itemSelectedValidator) { + this.itemSelectedValidator = itemSelectedValidator; + } + + private void setMediaTags(long mediaId) { + // JavaScript : addMediaTags(['aaa']); + + List mediaTags = null; + + if (mediaId > 0) + mediaTags = itemManager.getMediaTags(mediaId); + + // inicializaljuk, hogy az addTag event ezeket mar ne akarja meg 1x hozzadni + StringBuilder sb = new StringBuilder(); + if (mediaTags != null) { + for (String tag : mediaTags) { + selectedObject.getTags().add(tag.toLowerCase()); + if (tag.contains("'")) + continue; + if (sb.length() > 0) + sb.append(","); + sb.append(String.format("'%s'", tag)); + } + } + sb.insert(0, "addMediaTags(["); + sb.append("]);"); + + String js = sb.toString(); + logger.info(js); + Clients.evalJavaScript(js); + } + + public void setMissingProxy(boolean missingProxy) { + this.missingProxy = missingProxy; + } + + @Command + public void setPageSize(@BindingParam(TAGEVT_SOURCE) Menuitem source) { + if (source.isChecked()) + return; + int pageSize = Integer.parseInt(source.getValue()); + setSettingsPageSize(pageSize); + itemsGrid.setPageSize(pageSize); + itemsGrid.setActivePage(0); + SessionUtil.putUserPageSize(pageSize); + } + + public void setRowsExpanded(boolean rowsExpanded) { + this.rowsExpanded = rowsExpanded; + } + + public void setSearchFrom(Date searchFrom) { + this.searchFrom = searchFrom; + } + + public void setSearchHistory(ListModelList searchHistory) { + this.searchHistory = searchHistory; + } + + private void setSearchTags() { + // JavaScript : addAllTags(['aaa', 'bbb', 'ccc']); + if (tags == null) + return; + + StringBuilder sb = new StringBuilder(); + for (String tag : tags.keySet()) { + if (tag.contains("'")) + continue; + if (sb.length() > 0) + sb.append(","); + sb.append(String.format("'%s'", StringUtils.escape(tag))); + } + if (sb.length() > 0) { + sb.insert(0, "addAllTags(["); + sb.append("]);"); + + String js = sb.toString(); + logger.info(js); + Clients.evalJavaScript(js); + } + } + + public void setSearchTo(Date searchTo) { + this.searchTo = searchTo; + } + + public void setSelectedDateOption(int selectedDateOption) { + this.selectedDateOption = selectedDateOption; + } + + @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" }) + public void setSelectedObject(ArchivedMedia selectedObject) { + this.selectedObject = selectedObject; + if (selectedObject != null) { + long mediaId = selectedObject.getMedia().getId(); + selectedObject.setMedia(itemManager.getMedia(mediaId)); + selectedObject.setItem(itemManager.getItem(selectedObject.getMedia().getItemId())); + + // tags + setMediaTags(mediaId); + + try { + // proxy + String video = getLowresMediaFilePath(); + if (video == null) { + Clients.evalJavaScript("setSource(null, null)"); + } else { + String srcType = null; + if (video.endsWith(".m3u8")) + srcType = "application/x-mpegURL"; + else + srcType = "video/mp4"; + + Clients.evalJavaScript(String.format("setSource('%s', '%s')", video, srcType)); + } + + } catch (Exception e) { + logger.error(e); + } + + } else + Clients.evalJavaScript("addMediaTags([]);"); + + } + + private void setSettingsPageSize(int pageSize) { + List searchSettingItems = searchSettings.getChildren(); + for (Component c : searchSettingItems) { + if (!(c instanceof Menuitem)) + continue; + Menuitem menuItem = (Menuitem) c; + String value = menuItem.getValue(); + if (String.valueOf(pageSize).equals(value)) + menuItem.setChecked(true); + else + menuItem.setChecked(false); + } + } + + public void setTopTypeFilters(List topTypeFilters) { + this.topTypeFilters = topTypeFilters; + addTypeFilters(topTypeFilters); + } + + private void setUserSelectedFilters() { + List selectedFilters = SessionUtil.getUserSearchFilter(); + if (selectedFilters != null) { + clearAllFilters(); + for (String filter : selectedFilters) { + if (typeFilters.containsKey(filter)) { + TypeFilter typeFilter = typeFilters.get(filter); + typeFilter.setChecked(true); + typeFilters.put(filter, typeFilter); + } + } + if (typeFilters.size() != selectedFilters.size()) + allChecked = false; + } + } + + private void showExternalMediaID() { + String mediaId = SessionUtil.getQueryParameter(MEDIA_ID); + if (mediaId == null) + return; + try { + SearchOptions options = SearchOptions.create().setMediaId(Long.parseLong(mediaId)); + searchResult = new InitializedCachedListModel(options); + } catch (Exception e) { + Messagebox.show(e.getMessage(), "Hiba!", Messagebox.OK, Messagebox.ERROR); + } + } + + @Command + @NotifyChange("itemsGrid") + public void showInResults() { + if (selectedObject == null) + return; + int activePageIndex = selectedRowIndex / itemsGrid.getPageSize(); + positionToScroll = selectedRowIndex - itemsGrid.getPageSize() * activePageIndex; + // preventAfterRender = true; + if (activePageIndex != itemsGrid.getActivePage()) { + itemsGrid.setActivePage(activePageIndex); + logger.info( + "Selected media is shown in the results, which can be found on {} page and also it will be highlighted.", + activePageIndex + 1); + } else { + // TODO for debug purposes + // onAfterRenderGrid(); + logger.info("Selected media is shown in the results, which can be found on opened page."); + } + } + + private void showSearchTypeWarning() { + Clients.showNotification(String.format( + "Figyelem!

A keresés eredménye nem tartalmazza az összes típust."), + "warning", toggleShowTypeFilters, "end_center", 3000); + } + + @Command + public void toggleTypeFiltersCheck() { + boolean visible = toggleShowTypeFilters.isChecked(); + toggleShowTypeFilters.setIconSclass(visible ? "z-icon-caret-up" : "z-icon-caret-down"); + serachDetails.setOpen(visible); + SessionUtil.putUserTypeFiltersVisibility(visible); + } + + public void updateAllChecked() { + final boolean[] check = { true }; + for (String key : typeFilters.keySet()) { + if (!typeFilters.get(key).isChecked()) { + check[0] = false; + break; + } + } + + registerTask(() -> { + allChecked = check[0]; + notifyChange("allChecked"); + }); + timer.start(); + } + +} -- 2.54.0