
com.viaoa.jsp.OACroppieFileInput Maven / Gradle / Ivy
package com.viaoa.jsp;
import java.awt.image.BufferedImage;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.viaoa.hub.*;
import com.viaoa.jfc.image.OAImageUtil;
import com.viaoa.object.*;
import com.viaoa.util.*;
import com.viaoa.util.Base64;
/**
* Allows for uploading and saving (as java jpg) using the Croppie + File input.
*
* http://foliotek.github.io/Croppie/#documentation
*
* This uses an Html Label, or other component that supports onClick, to then
* popup a file input and then croppie, and then uses ajax submit to save the
* image.
*
*
protected OACroppieFileInput cfi;
public OACroppieFileInput getCroppieFileInput() {
if (cfi != null) return cfi;
cfi = new OACroppieFileInput("cfiUpload", modelEmployee.getHub(), EmployeePP.avatar().bytes()) {
@Override
protected void onSetValue(byte[] bs) {
if (bs == null) return;
Employee emp = modelEmployee.getEmployee();
if (emp != null) {
// make sure that an Avatar exists
if (emp.getAvatar() == null) {
emp.setAvatar(new ImageStore());
}
}
super.onSetValue(bs);
if (emp != null) emp.save();
}
};
return cfi;
}
* @author vvia
*
*/
public class OACroppieFileInput implements OAJspComponent, OAJspRequirementsInterface {
private static final long serialVersionUID = 1L;
protected Hub hub;
protected String id;
protected String property;
protected OAForm form;
protected String lastAjaxSent;
public OACroppieFileInput(String id, Hub hub, String property) {
this.id = id;
this.hub = hub;
this.property = property;
}
public Hub getHub() {
return hub;
}
@Override
public boolean isChanged() {
return false;
}
@Override
public String getId() {
return id;
}
@Override
public void reset() {
}
@Override
public void setForm(OAForm form) {
this.form = form;
}
@Override
public OAForm getForm() {
return this.form;
}
@Override
public boolean _beforeFormSubmitted() {
return true;
}
@Override
public boolean _onFormSubmitted(HttpServletRequest req, HttpServletResponse resp, HashMap hmNameValue) {
String s = req.getParameter("oacommand");
if (s == null && hmNameValue != null) {
String[] ss = hmNameValue.get("oacommand");
if (ss != null && ss.length > 0) s = ss[0];
}
boolean bWasSubmitted = (id != null && id.equals(s));
if (bWasSubmitted && hmNameValue != null) {
String[] ss = hmNameValue.get("oahidden"+id);
if (ss != null && ss.length > 0 && ss[0] != null && ss[0].length() != 0) {
s = ss[0];
if (s.startsWith("data:image")) {
String s2 = ";base64,";
int pos = s.indexOf(s2);
if (pos > 0) s = s.substring(pos+s2.length());
}
char[] c = new char[s.length()];
s.getChars(0, s.length(), c, 0);
byte[] bs = Base64.decode(c);
try {
BufferedImage bi = OAImageUtil.convertToBufferedImage(bs);
byte[] bs2 = OAImageUtil.convertToJavaJPG(bi); // this is the format for storing images internally (ex: database)
bs = bs2;
}
catch (Exception e) {
throw new RuntimeException("exception while storing image", e);
}
onSetValue(bs);
}
}
return bWasSubmitted;
}
/**
* only called when the image for croppie is submitted (ajax)
*/
protected void onSetValue(byte[] bs) {
if (bs != null && hub != null && property != null) {
Object objx = hub.getAO();
if (objx instanceof OAObject) {
((OAObject) objx).setProperty(property, bs);
}
}
}
@Override
public String _onSubmit(String forwardUrl) {
return onSubmit(forwardUrl);
}
@Override
public String onSubmit(String forwardUrl) {
return forwardUrl;
}
@Override
public String _afterFormSubmitted(String forwardUrl) {
return afterFormSubmitted(forwardUrl);
}
@Override
public String afterFormSubmitted(String forwardUrl) {
return forwardUrl;
}
@Override
public String getScript() {
lastAjaxSent = null;
StringBuilder sb = new StringBuilder(1024);
sb.append("\n");
// Bind OACroppieFileInput to id='cfiUpload'
// create hidden input for storing base64 img
sb.append("$('form').prepend(\"\");\n");
// create hidden fileInput to invoke have user select an image file
sb.append("$('#cfiUpload').after(\"\");\n");
// listen for user selecting an image to then use croppie
sb.append("$('#cfiUploadFileInput').on('change', function() {\n");
sb.append(" if (!this.files || !this.files[0]) return;\n");
sb.append(" var reader = new FileReader();\n");
sb.append(" reader.onload = function(e) {\n");
sb.append(" cfiUploadCroppie.croppie('bind', {\n");
sb.append(" url : e.target.result\n");
sb.append(" });\n");
sb.append(" };\n");
sb.append(" reader.readAsDataURL(this.files[0]);\n");
sb.append(" this.value = null;\n");
sb.append(" $('#cfiUploadDlg').dialog('open');\n");
sb.append("});\n");
// have mouse click invoke the hidden file input to have user select a file
sb.append("$('#cfiUpload').attr('for', 'cfiUploadFileInput');\n");
// add modal dialog, with croppie component
sb.append("$('#cfiUpload').after(\"\");\n");
sb.append("$('#cfiUploadDlg').dialog({\n");
sb.append(" autoOpen : false,\n");
sb.append(" modal : true,\n");
sb.append(" resizable : false,\n");
sb.append(" draggable : false,\n");
sb.append(" width : 500,\n");
sb.append(" buttons : {\n");
sb.append(" 'Cancel' : function() {\n");
sb.append(" $(this).dialog('close');\n");
sb.append(" },\n");
sb.append(" 'Ok' : function() {\n");
sb.append(" cfiUploadSubmit(this);\n");
sb.append(" $(this).dialog('close');\n");
sb.append(" }\n");
sb.append(" }\n");
sb.append("});\n");
// croppie
sb.append("var cfiUploadCroppie = $('#cfiUploadCroppie').croppie({\n");
sb.append(" viewport : {\n");
sb.append(" width : 250,\n");
sb.append(" height : 250,\n");
sb.append(" type : 'circle'\n");
sb.append(" },\n");
sb.append(" boundary : {\n");
sb.append(" width : 300,\n");
sb.append(" height : 300\n");
sb.append(" }\n");
sb.append("});\n");
sb.append("function cfiUploadSubmit() {\n");
sb.append(" cfiUploadCroppie.croppie('result', {\n");
sb.append(" type : 'base64',\n");
sb.append(" format : 'jpg',\n");
sb.append(" size : {\n");
sb.append(" width : 240,\n");
sb.append(" height : 240\n");
sb.append(" }\n");
sb.append(" }).then(function(resp) {\n");
sb.append(" $('#oahiddencfiUpload').val(resp);\n");
sb.append(" var args = $('form:eq(0)').serialize();\n");
sb.append(" args = 'oacommand=cfiUpload&' + args;\n");
sb.append(" $.ajax({\n");
sb.append(" type : 'POST',\n");
sb.append(" data : args,\n");
sb.append(" url : 'oaajax.jsp',\n");
sb.append(" success : function(data) {\n");
sb.append(" if (data) eval(data);\n");
sb.append(" },\n");
sb.append(" dataType : 'text'\n");
sb.append(" });\n");
sb.append(" });\n");
sb.append("}\n");
String s = getAjaxScript();
if (s != null) sb.append(s);
String js = sb.toString();
js = OAString.convert(js, "cfiUpload", getId());
return js;
}
@Override
public String getVerifyScript() {
return null;
}
@Override
public String getAjaxScript() {
StringBuilder sb = new StringBuilder(1024);
sb.append("$('#oahidden"+id+"').val('');");
String js = sb.toString();
return js;
}
@Override
public void setEnabled(boolean b) {
}
@Override
public boolean getEnabled() {
return hub == null || hub.isValid();
}
@Override
public void setVisible(boolean b) {
}
@Override
public boolean getVisible() {
return true;
}
@Override
public String getForwardUrl() {
return null;
}
public String[] getRequiredJsNames() {
ArrayList al = new ArrayList<>();
al.add(OAJspDelegate.JS_jquery);
al.add(OAJspDelegate.JS_croppie);
String[] ss = new String[al.size()];
return al.toArray(ss);
}
@Override
public String[] getRequiredCssNames() {
ArrayList al = new ArrayList<>();
al.add(OAJspDelegate.CSS_bootstrap);
al.add(OAJspDelegate.CSS_croppie);
String[] ss = new String[al.size()];
return al.toArray(ss);
}
@Override
public String getEditorHtml(OAObject obj) {
return null;
}
@Override
public String getRenderHtml(OAObject obj) {
return null;
}
@Override
public void _beforeOnSubmit() {
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy