Minor Update
git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-information-widget@97523 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
965cea7b50
commit
188e139dec
|
@ -1,25 +1,35 @@
|
||||||
package org.gcube.portlets.user.td.informationwidget.client;
|
package org.gcube.portlets.user.td.informationwidget.client;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
|
import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
|
||||||
import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException;
|
import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException;
|
||||||
|
import org.gcube.portlets.user.td.gwtservice.shared.share.Contacts;
|
||||||
|
import org.gcube.portlets.user.td.gwtservice.shared.share.ShareInfo;
|
||||||
import org.gcube.portlets.user.td.gwtservice.shared.tr.TabResource;
|
import org.gcube.portlets.user.td.gwtservice.shared.tr.TabResource;
|
||||||
import org.gcube.portlets.user.td.gwtservice.shared.tr.TableData;
|
import org.gcube.portlets.user.td.gwtservice.shared.tr.TableData;
|
||||||
|
import org.gcube.portlets.user.td.informationwidget.client.custom.IconButton;
|
||||||
import org.gcube.portlets.user.td.informationwidget.client.resources.ResourceBundle;
|
import org.gcube.portlets.user.td.informationwidget.client.resources.ResourceBundle;
|
||||||
import org.gcube.portlets.user.td.informationwidget.client.util.InfoMessageBox;
|
import org.gcube.portlets.user.td.informationwidget.client.util.InfoMessageBox;
|
||||||
import org.gcube.portlets.user.td.metadatawidget.client.TRMetadataAccordionPanel;
|
import org.gcube.portlets.user.td.metadatawidget.client.TRMetadataAccordionPanel;
|
||||||
import org.gcube.portlets.user.td.metadatawidget.client.TableMetadataAccordionPanel;
|
import org.gcube.portlets.user.td.metadatawidget.client.TableMetadataAccordionPanel;
|
||||||
|
import org.gcube.portlets.user.td.widgetcommonevent.client.event.RibbonEvent;
|
||||||
import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent;
|
import org.gcube.portlets.user.td.widgetcommonevent.client.event.SessionExpiredEvent;
|
||||||
import org.gcube.portlets.user.td.widgetcommonevent.client.event.WidgetRequestEvent;
|
import org.gcube.portlets.user.td.widgetcommonevent.client.event.WidgetRequestEvent;
|
||||||
|
import org.gcube.portlets.user.td.widgetcommonevent.client.type.RibbonType;
|
||||||
import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType;
|
import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType;
|
||||||
import org.gcube.portlets.user.td.widgetcommonevent.client.type.WidgetRequestType;
|
import org.gcube.portlets.user.td.widgetcommonevent.client.type.WidgetRequestType;
|
||||||
import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
|
import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
|
||||||
|
|
||||||
import com.allen_sauer.gwt.log.client.Log;
|
import com.allen_sauer.gwt.log.client.Log;
|
||||||
|
import com.google.gwt.event.dom.client.ClickEvent;
|
||||||
|
import com.google.gwt.event.dom.client.ClickHandler;
|
||||||
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
||||||
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
||||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||||
|
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
|
||||||
|
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||||
import com.google.web.bindery.event.shared.EventBus;
|
import com.google.web.bindery.event.shared.EventBus;
|
||||||
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
|
||||||
import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode;
|
import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode;
|
||||||
|
@ -27,9 +37,9 @@ import com.sencha.gxt.core.client.util.Margins;
|
||||||
import com.sencha.gxt.widget.core.client.FramedPanel;
|
import com.sencha.gxt.widget.core.client.FramedPanel;
|
||||||
import com.sencha.gxt.widget.core.client.box.AlertMessageBox;
|
import com.sencha.gxt.widget.core.client.box.AlertMessageBox;
|
||||||
import com.sencha.gxt.widget.core.client.button.TextButton;
|
import com.sencha.gxt.widget.core.client.button.TextButton;
|
||||||
|
import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData;
|
||||||
import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer;
|
import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer;
|
||||||
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
|
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
|
||||||
import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData;
|
|
||||||
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData;
|
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData;
|
||||||
import com.sencha.gxt.widget.core.client.event.HideEvent;
|
import com.sencha.gxt.widget.core.client.event.HideEvent;
|
||||||
import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler;
|
import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler;
|
||||||
|
@ -57,8 +67,11 @@ public class TabularResourceProperties extends FramedPanel {
|
||||||
protected TextField agencyField;
|
protected TextField agencyField;
|
||||||
protected TextField dateField;
|
protected TextField dateField;
|
||||||
protected TextArea rightField;
|
protected TextArea rightField;
|
||||||
|
protected TextField ownerField;
|
||||||
protected CheckBox finalizedField;
|
protected CheckBox finalizedField;
|
||||||
protected TextField typeField;
|
protected TextField typeField;
|
||||||
|
|
||||||
|
protected IconButton btnShare;
|
||||||
|
|
||||||
protected TRMetadataAccordionPanel trMetadataPanel;
|
protected TRMetadataAccordionPanel trMetadataPanel;
|
||||||
protected VerticalLayoutContainer layoutTabularResource;
|
protected VerticalLayoutContainer layoutTabularResource;
|
||||||
|
@ -128,6 +141,34 @@ public class TabularResourceProperties extends FramedPanel {
|
||||||
rightField.setValue("");
|
rightField.setValue("");
|
||||||
layoutTabularResource.add(new FieldLabel(rightField, "Rights"),
|
layoutTabularResource.add(new FieldLabel(rightField, "Rights"),
|
||||||
new VerticalLayoutData(1, -1));
|
new VerticalLayoutData(1, -1));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ownerField = new TextField();
|
||||||
|
ownerField.setReadOnly(true);
|
||||||
|
ownerField.setValue("");
|
||||||
|
|
||||||
|
btnShare = new IconButton();
|
||||||
|
btnShare.setIcon(ResourceBundle.INSTANCE.share());
|
||||||
|
btnShare.addClickHandler(new ClickHandler() {
|
||||||
|
|
||||||
|
public void onClick(ClickEvent event) {
|
||||||
|
Log.debug("Clicked btnShare");
|
||||||
|
eventBus.fireEvent(new RibbonEvent(RibbonType.SHARE));
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
btnShare.setVisible(false);
|
||||||
|
|
||||||
|
HorizontalPanel hp = new HorizontalPanel();
|
||||||
|
hp.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
|
||||||
|
hp.add(ownerField);
|
||||||
|
hp.add(btnShare);
|
||||||
|
FieldLabel ownerLabel = new FieldLabel(hp, "Owner");
|
||||||
|
|
||||||
|
layoutTabularResource.add(ownerLabel,
|
||||||
|
new VerticalLayoutData(1, -1));
|
||||||
|
|
||||||
|
|
||||||
finalizedField = new CheckBox();
|
finalizedField = new CheckBox();
|
||||||
// finalizedField.setBoxLabel("");
|
// finalizedField.setBoxLabel("");
|
||||||
|
@ -194,6 +235,7 @@ public class TabularResourceProperties extends FramedPanel {
|
||||||
dateField.setValue(tabResource.getDate());
|
dateField.setValue(tabResource.getDate());
|
||||||
typeField.setValue(tabResource.getTrId().getTabularResourceType());
|
typeField.setValue(tabResource.getTrId().getTabularResourceType());
|
||||||
rightField.setValue(tabResource.getRight());
|
rightField.setValue(tabResource.getRight());
|
||||||
|
ownerField.setValue(tabResource.getOwner().getLogin());
|
||||||
if (tabResource.isFinalized()) {
|
if (tabResource.isFinalized()) {
|
||||||
finalizedField.setEnabled(false);
|
finalizedField.setEnabled(false);
|
||||||
finalizedField.setValue(true);
|
finalizedField.setValue(true);
|
||||||
|
@ -201,9 +243,19 @@ public class TabularResourceProperties extends FramedPanel {
|
||||||
finalizedField.setEnabled(true);
|
finalizedField.setEnabled(true);
|
||||||
finalizedField.setValue(false);
|
finalizedField.setValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void updateShareInfo(ShareInfo result){
|
||||||
|
ArrayList<Contacts> contacts=result.getContacts();
|
||||||
|
if(contacts!=null&& contacts.size()>0){
|
||||||
|
btnShare.setVisible(true);
|
||||||
|
} else {
|
||||||
|
btnShare.setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void addTable() {
|
public void addTable() {
|
||||||
tableFieldSet = new FieldSet();
|
tableFieldSet = new FieldSet();
|
||||||
tableFieldSet.setHeadingText("Table");
|
tableFieldSet.setHeadingText("Table");
|
||||||
|
@ -248,15 +300,15 @@ public class TabularResourceProperties extends FramedPanel {
|
||||||
layoutTable.add(tableMetadataPanel, new VerticalLayoutData(-1, -1));
|
layoutTable.add(tableMetadataPanel, new VerticalLayoutData(-1, -1));
|
||||||
tableFieldSet.add(layoutTable);
|
tableFieldSet.add(layoutTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
TDGWTServiceAsync.INSTANCE
|
TDGWTServiceAsync.INSTANCE
|
||||||
.getTabResourceInformation(new AsyncCallback<TabResource>() {
|
.getTabResourceInformation(new AsyncCallback<TabResource>() {
|
||||||
|
|
||||||
public void onSuccess(TabResource result) {
|
public void onSuccess(TabResource result) {
|
||||||
updateTabularResource(result);
|
|
||||||
Log.info("Retrived TR: " + result.getTrId());
|
Log.info("Retrived TR: " + result.getTrId());
|
||||||
getLastTable(result.getTrId());
|
updateTabularResource(result);
|
||||||
|
getShareInformation(result.getTrId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onFailure(Throwable caught) {
|
public void onFailure(Throwable caught) {
|
||||||
|
@ -282,14 +334,48 @@ public class TabularResourceProperties extends FramedPanel {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void getShareInformation(TRId trId){
|
||||||
|
TDGWTServiceAsync.INSTANCE.getShareInfo(trId,
|
||||||
|
new AsyncCallback<ShareInfo>() {
|
||||||
|
|
||||||
|
public void onSuccess(ShareInfo result) {
|
||||||
|
Log.debug("Retrived share info:" + result);
|
||||||
|
updateShareInfo(result);
|
||||||
|
getLastTable(tabResource.getTrId());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onFailure(Throwable caught) {
|
||||||
|
if (caught instanceof TDGWTSessionExpiredException) {
|
||||||
|
eventBus.fireEvent(new SessionExpiredEvent(
|
||||||
|
SessionExpiredType.EXPIREDONSERVER));
|
||||||
|
} else {
|
||||||
|
AlertMessageBox d = new AlertMessageBox("Error",
|
||||||
|
"Error retrienving Share Informations: "
|
||||||
|
+ caught.getLocalizedMessage());
|
||||||
|
d.addHideHandler(new HideHandler() {
|
||||||
|
|
||||||
|
public void onHide(HideEvent event) {
|
||||||
|
//
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
d.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected void getLastTable(TRId trId) {
|
protected void getLastTable(TRId trId) {
|
||||||
TDGWTServiceAsync.INSTANCE.getLastTable(trId,
|
TDGWTServiceAsync.INSTANCE.getLastTable(trId,
|
||||||
new AsyncCallback<TableData>() {
|
new AsyncCallback<TableData>() {
|
||||||
|
|
||||||
public void onSuccess(TableData result) {
|
public void onSuccess(TableData result) {
|
||||||
updateTable(result);
|
|
||||||
Log.debug("Retrived LastTable:" + result);
|
Log.debug("Retrived LastTable:" + result);
|
||||||
|
updateTable(result);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onFailure(Throwable caught) {
|
public void onFailure(Throwable caught) {
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
package org.gcube.portlets.user.td.informationwidget.client.custom;
|
||||||
|
|
||||||
|
|
||||||
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.google.gwt.dom.client.Element;
|
||||||
|
import com.google.gwt.resources.client.ClientBundle;
|
||||||
|
import com.google.gwt.resources.client.CssResource;
|
||||||
|
import com.google.gwt.resources.client.ImageResource;
|
||||||
|
import com.google.gwt.safehtml.shared.SafeHtml;
|
||||||
|
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
|
||||||
|
import com.google.gwt.user.client.ui.Image;
|
||||||
|
import com.sencha.gxt.core.client.XTemplates;
|
||||||
|
import com.sencha.gxt.core.client.dom.XElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author "Giancarlo Panichi"
|
||||||
|
* <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DefaultAppearance implements IconButtonAppearance {
|
||||||
|
|
||||||
|
public interface Template extends XTemplates {
|
||||||
|
@XTemplate(source = "IconButton.html")
|
||||||
|
SafeHtml template(IconButtonStyle style);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IconButtonStyle extends CssResource {
|
||||||
|
@ClassName("iconButton")
|
||||||
|
public String getIconButton();
|
||||||
|
|
||||||
|
@ClassName("iconButtonImage")
|
||||||
|
public String getIconButtonImage();
|
||||||
|
|
||||||
|
@ClassName("iconButtonRef")
|
||||||
|
public String getIconButtonRef();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private final IconButtonStyle style;
|
||||||
|
private final Template template;
|
||||||
|
|
||||||
|
public interface IconButtonResources extends ClientBundle {
|
||||||
|
public static final IconButtonResources INSTANCE = GWT.create(IconButtonResources.class);
|
||||||
|
|
||||||
|
@Source("IconButtonStyle.css")
|
||||||
|
IconButtonStyle style();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DefaultAppearance() {
|
||||||
|
this(IconButtonResources.INSTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DefaultAppearance(IconButtonResources resources) {
|
||||||
|
this.style = resources.style();
|
||||||
|
this.style.ensureInjected();
|
||||||
|
|
||||||
|
this.template = GWT.create(Template.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void onUpdateIcon(XElement parent, ImageResource icon) {
|
||||||
|
XElement element = parent.selectNode("." + style.getIconButtonImage());
|
||||||
|
Image image=new Image(icon);
|
||||||
|
Element img=image.getElement();
|
||||||
|
img.setClassName(style.getIconButtonRef());
|
||||||
|
element.appendChild(img);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void render(SafeHtmlBuilder sb) {
|
||||||
|
sb.append(template.template(style));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
<!-- file: ./IconButton.html -->
|
||||||
|
<div class="{style.iconButton}">
|
||||||
|
<div class="{style.iconButtonImage}"></div>
|
||||||
|
</div>
|
|
@ -0,0 +1,47 @@
|
||||||
|
package org.gcube.portlets.user.td.informationwidget.client.custom;
|
||||||
|
|
||||||
|
|
||||||
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.google.gwt.event.dom.client.ClickEvent;
|
||||||
|
import com.google.gwt.event.dom.client.ClickHandler;
|
||||||
|
import com.google.gwt.event.dom.client.HasClickHandlers;
|
||||||
|
import com.google.gwt.event.shared.HandlerRegistration;
|
||||||
|
import com.google.gwt.resources.client.ImageResource;
|
||||||
|
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
|
||||||
|
import com.google.gwt.user.client.Event;
|
||||||
|
import com.sencha.gxt.core.client.dom.XDOM;
|
||||||
|
import com.sencha.gxt.widget.core.client.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author "Giancarlo Panichi"
|
||||||
|
* <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class IconButton extends Component implements HasClickHandlers {
|
||||||
|
|
||||||
|
private IconButtonAppearance appearance;
|
||||||
|
|
||||||
|
public IconButton() {
|
||||||
|
this((IconButtonAppearance) GWT.create(DefaultAppearance.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
public IconButton(IconButtonAppearance appearance) {
|
||||||
|
this.appearance = appearance;
|
||||||
|
|
||||||
|
SafeHtmlBuilder sb = new SafeHtmlBuilder();
|
||||||
|
this.appearance.render(sb);
|
||||||
|
|
||||||
|
setElement(XDOM.create(sb.toSafeHtml()));
|
||||||
|
sinkEvents(Event.ONCLICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HandlerRegistration addClickHandler(ClickHandler handler) {
|
||||||
|
return addDomHandler(handler, ClickEvent.getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setIcon(ImageResource icon) {
|
||||||
|
appearance.onUpdateIcon(getElement(), icon);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package org.gcube.portlets.user.td.informationwidget.client.custom;
|
||||||
|
|
||||||
|
import com.google.gwt.resources.client.ImageResource;
|
||||||
|
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
|
||||||
|
import com.sencha.gxt.core.client.dom.XElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author "Giancarlo Panichi"
|
||||||
|
* <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IconButtonAppearance {
|
||||||
|
void render(SafeHtmlBuilder sb);
|
||||||
|
void onUpdateIcon(XElement parent, ImageResource icon);
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
@CHARSET "UTF-8";
|
||||||
|
|
||||||
|
.iconButton {
|
||||||
|
border: none;
|
||||||
|
font-size: 12px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconButton .iconButtonImage {
|
||||||
|
vertical-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconButtonRef {
|
||||||
|
vertical-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
|
@ -29,6 +29,12 @@ public interface ResourceBundle extends ClientBundle {
|
||||||
@Source("table-validation_32.png")
|
@Source("table-validation_32.png")
|
||||||
ImageResource tableValidation32();
|
ImageResource tableValidation32();
|
||||||
|
|
||||||
|
@Source("page-white-share.png")
|
||||||
|
ImageResource share();
|
||||||
|
|
||||||
|
@Source("page-white-share_32.png")
|
||||||
|
ImageResource share32();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Binary file not shown.
After Width: | Height: | Size: 830 B |
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,4 @@
|
||||||
|
<!-- file: ./IconButton.html -->
|
||||||
|
<div class="{style.iconButton}">
|
||||||
|
<div class="{style.iconButtonImage}"></div>
|
||||||
|
</div>
|
|
@ -0,0 +1,17 @@
|
||||||
|
@CHARSET "UTF-8";
|
||||||
|
|
||||||
|
.iconButton {
|
||||||
|
border: none;
|
||||||
|
font-size: 12px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconButton .iconButtonImage {
|
||||||
|
vertical-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconButtonRef {
|
||||||
|
vertical-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 830 B |
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
Loading…
Reference in New Issue