All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.viaoa.jsp.OACroppieFileInput Maven / Gradle / Ivy

There is a newer version: 3.7.10
Show newest version
/*  Copyright 1999 Vince Via [email protected]
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/
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.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 OACroppieFileInput(Hub hub, String property) {
        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 setId(String id) {
        this.id = 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