Umožněn upload obrázku podpisu uživatele. Menu Nastavení -> Uživatelské

nastavení.
refs #132
multitenant
Josef Rokos 10 years ago
parent d454c211f8
commit d108f4a070

@ -0,0 +1,18 @@
package info.bukova.isspst.storage;
import java.io.File;
public interface FileStorage {
// public String getRootPath();
public void saveFile(byte[] data, String fileName);
public void saveFile(File file, String path);
public void removeFile(String fileName);
public void moveFile(String source, String destination);
public void createDirectory(String dir);
public byte[] fileData(String fileName);
public File file(String fileName);
public boolean dirExists(String path);
public String serverPath(String fileName);
}

@ -0,0 +1,146 @@
package info.bukova.isspst.storage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletContext;
public class LocalFileStorage implements FileStorage {
private String rootPath;
private ServletContext context;
public void setRootPath(String rootPath) {
this.rootPath = rootPath;
}
public void setContext(ServletContext ctx) {
this.context = ctx;
}
private String getFullPath() {
return context.getRealPath(rootPath) + File.separator;
}
@Override
public void saveFile(byte[] data, String fileName) {
File file = new File(getFullPath() + fileName);
FileOutputStream os = null;
try {
os = new FileOutputStream(file);
os.write(data);
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.flush();
os.close();
}
} catch (IOException e) {
throw new StorageException("Cannot close stream", e.getCause());
}
}
}
@Override
public void saveFile(File file, String path) {
File dest = new File(getFullPath() + path + File.pathSeparator + file.getName());
FileOutputStream fos = null;
try {
fos = new FileOutputStream(dest);
fos.write(fileData(file.getName()));
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
throw new StorageException("Cannot move file: " + file.getName(), e.getCause());
} catch (IOException e) {
throw new StorageException("Cannot move file: " + file.getName(), e.getCause());
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
throw new StorageException("Cannot close stream", e.getCause());
}
}
}
}
@Override
public void removeFile(String fileName) {
File f = new File(getFullPath() + fileName);
if (!f.delete()) {
throw new StorageException("Cannot delete file: " + getFullPath()
+ fileName);
}
}
@Override
public byte[] fileData(String fileName) {
File f = new File(getFullPath() + fileName);
byte[] out = new byte[(int) f.length()];
FileInputStream fis = null;
try {
fis = new FileInputStream(f);
fis.read(out);
fis.close();
} catch (FileNotFoundException e) {
throw new StorageException("File cannot be found: " + fileName, e.getCause());
} catch (IOException e) {
throw new StorageException("Cannot read file: " + fileName, e.getCause());
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
throw new StorageException("Cannot close stream", e.getCause());
}
}
}
return out;
}
@Override
public File file(String fileName) {
return new File(getFullPath() + fileName);
}
@Override
public void moveFile(String source, String destination) {
saveFile(new File(getFullPath() + source), destination);
}
@Override
public void createDirectory(String dir) {
File f = new File(getFullPath() + dir);
if (!f.mkdir()) {
throw new StorageException("Cannot create directory: "
+ getFullPath() + dir);
}
}
@Override
public boolean dirExists(String path) {
File f = new File(getFullPath() + path);
return f.exists() && f.isDirectory();
}
@Override
public String serverPath(String fileName) {
return context.getRealPath(rootPath + File.separator + fileName);
}
}

@ -0,0 +1,17 @@
package info.bukova.isspst.storage;
import info.bukova.isspst.services.IsspstException;
public class StorageException extends IsspstException {
private static final long serialVersionUID = -1303880908451845756L;
public StorageException(String reason) {
super(reason);
}
public StorageException(String reason, Throwable cause) {
super(reason, cause);
}
}

@ -48,4 +48,11 @@ public class MainMenu
Window window = (Window) Executions.createComponents("/settings/globalSettings.zul", null, null);
window.doModal();
}
@Command
public void userSettings()
{
Window window = (Window) Executions.createComponents("/settings/userSettings.zul", null, null);
window.doModal();
}
}

@ -0,0 +1,86 @@
package info.bukova.isspst.ui.settings;
import info.bukova.isspst.data.UserSettingsData;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.storage.FileStorage;
import java.awt.image.RenderedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
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.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Window;
public class UserSettingsVM {
@WireVariable
private UserService userService;
@WireVariable
private FileStorage storage;
private UserSettingsData settings;
@Init
public void init() {
settings = userService.getUserSettings();
}
public UserSettingsData getSettings() {
return settings;
}
@Command
@NotifyChange({"settings", "signatureImg"})
public void uploadSignature(@ContextParam(ContextType.TRIGGER_EVENT) UploadEvent upEvent) {
int i = upEvent.getMedia().getName().lastIndexOf(".");
String fileName = "SignatureImageFile_" + userService.getCurrent().getUsername() + upEvent.getMedia().getName().substring(i);
storage.saveFile(upEvent.getMedia().getByteData(), fileName);
settings.setSignatureFile(fileName);
}
@Command
@NotifyChange("signatureImg")
public void removeSignature() {
settings.setSignatureFile(null);
}
@Command
public void save(@BindingParam("window") Window window) {
userService.setUserSettings(settings);
userService.update(userService.getCurrent());
onClose();
window.detach();
}
@Command
public void onClose() {
if (userService.getUserSettings().getSignatureFile() == null && settings.getSignatureFile() != null) {
storage.removeFile(settings.getSignatureFile());
}
}
public boolean isCanSave() {
return true;
}
public RenderedImage getSignatureImg() {
if (settings.getSignatureFile() == null || settings.getSignatureFile().isEmpty()) {
return null;
}
try {
return ImageIO.read(storage.file(settings.getSignatureFile()));
} catch (IOException e) {
return null;
}
}
}

@ -165,6 +165,8 @@ GlobalSettingsRefunds=Náhrady
GlobalSettingsFreeMealsCount=Počet jídel zdarma
GlobalSettingsHours=Hodin
UserSettings=Uživatelské nastavení
TravelOrdersFormTitle=Vyúčtování služební cesty
TravelOrdersGridNumser=Číslo
TravelOrdersGridReqDate=Datum požadavku

@ -159,6 +159,12 @@
<aop:scoped-proxy/>
</bean>
<!-- File storage -->
<bean id="storage" class="info.bukova.isspst.storage.LocalFileStorage">
<property name="context" ref="servletContext"/>
<property name="rootPath" value="/WEB-INF/upload"/>
</bean>
<bean id="definitionFiller" class="info.bukova.isspst.reporting.DefinitionFiller"/>
<bean id="genFactory" class="info.bukova.isspst.reporting.GeneratorFactory"/>

@ -74,6 +74,9 @@
image="/img/global-setting-016.png"
label="${labels.GlobalSettings}…"
onClick="@command('globalSettings')" />
<menuitem
label="${labels.UserSettings}…"
onClick="@command('userSettings')" />
<menuitem
label="${labels.AgendaWorkflow}"
href="/settings/workflow"

@ -0,0 +1,30 @@
<?page title="UserSettings" contentType="text/html;charset=UTF-8"?>
<zk>
<window id="editWin" border="normal"
closable="true"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('info.bukova.isspst.ui.settings.UserSettingsVM')"
onClose="@command('onClose')"
width="700px">
<caption
zclass="form-caption"
label="${labels.UserSettings}" />
<vbox>
<label value="Podpis:"/>
<hbox>
<button label="Nahrát obrázek podpisu"
upload="true,maxsize=600,accept=image/*"
onUpload="@command('uploadSignature')"
sclass="nicebutton"/>
<div width="400px" height="110px" style="border: 1px solid black;">
<image height="100px" content="@load(vm.signatureImg)"/>
</div>
</hbox>
<button label="Smazat" onClick="@command('removeSignature')" sclass="nicebutton"/>
</vbox>
<include src="/app/formButtons.zul"/>
</window>
</zk>
Loading…
Cancel
Save