提交 d8121d89 编写于 作者: NoSubject's avatar NoSubject

Merge branch 'release' into 'master'

Release

See merge request o2oa/o2oa!2501
......@@ -55,7 +55,7 @@ public class General extends ConfigObject {
private static final Boolean DEFAULT_STATENABLE = false;
private static final String DEFAULT_STATEXCLUSIONS = "*.js,*.gif,*.jpg,*.png,*.css,*.ico";
private static final Boolean DEFAULT_EXPOSEJEST = true;
private static final Boolean DEFAULT_EXPOSEJEST = false;
private static final String DEFAULT_REFERERHEADCHECKREGULAR = "";
private static final String DEFAULT_ACCESSCONTROLALLOWORIGIN = "";
private static final String DEFAULT_IDFORMATCHECKREGULAR = "";
......
package com.x.base.core.project.jaxrs;
import com.x.base.core.project.config.Config;
import org.apache.commons.lang3.BooleanUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
public class ApiAccessFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
try {
if (BooleanUtils.isFalse(Config.general().getExposeJest())) {
HttpServletResponse response = (HttpServletResponse) res;
response.setStatus(403);
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("<html><body><div align='center'><h2>403 Forbidden</h2></div></body></html>");
} else {
chain.doFilter(req, res);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// nothing
}
@Override
public void destroy() {
// nothing
}
}
package com.x.server.console.server.application;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.TimeZone;
import java.util.stream.Collectors;
import javax.servlet.DispatcherType;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.file.PathUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.eclipse.jetty.quickstart.QuickStartWebApp;
import org.eclipse.jetty.server.AsyncRequestLogWriter;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.w3c.dom.Document;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.x.base.core.project.Applications;
......@@ -48,26 +8,52 @@ import com.x.base.core.project.annotation.ModuleCategory;
import com.x.base.core.project.annotation.ModuleType;
import com.x.base.core.project.config.ApplicationServer;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.jaxrs.DenialOfServiceFilter;
import com.x.base.core.project.jaxrs.ApiAccessFilter;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.ClassLoaderTools;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.base.core.project.tools.FileTools;
import com.x.base.core.project.tools.JarTools;
import com.x.base.core.project.tools.ListTools;
import com.x.base.core.project.tools.PathTools;
import com.x.base.core.project.tools.StringTools;
import com.x.base.core.project.tools.*;
import com.x.server.console.node.RegistApplicationsEvent;
import com.x.server.console.node.UpdateApplicationsEvent;
import com.x.server.console.server.JettySeverTools;
import com.x.server.console.server.ServerRequestLog;
import com.x.server.console.server.ServerRequestLogBody;
import com.x.server.console.server.center.CenterServerTools;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ScanResult;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.file.PathUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.eclipse.jetty.quickstart.QuickStartWebApp;
import org.eclipse.jetty.server.AsyncRequestLogWriter;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.w3c.dom.Document;
import javax.servlet.DispatcherType;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
public class ApplicationServerTools extends JettySeverTools {
......@@ -191,7 +177,7 @@ public class ApplicationServerTools extends JettySeverTools {
webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed",
BooleanUtils.toStringTrueFalse(false));
setStat(applicationServer, webApp);
setExposeJest(applicationServer, webApp);
setExposeJest(webApp);
handlers.addHandler(webApp);
webApp.start();
} else if (Files.exists(dir)) {
......@@ -203,12 +189,10 @@ public class ApplicationServerTools extends JettySeverTools {
});
}
private static void setExposeJest(ApplicationServer applicationServer, QuickStartWebApp webApp) throws Exception {
if (BooleanUtils.isFalse(Config.general().getExposeJest())) {
FilterHolder denialOfServiceFilterHolder = new FilterHolder(new DenialOfServiceFilter());
webApp.addFilter(denialOfServiceFilterHolder, "/jest/*", EnumSet.of(DispatcherType.REQUEST));
webApp.addFilter(denialOfServiceFilterHolder, "/describe/sources/*", EnumSet.of(DispatcherType.REQUEST));
}
private static void setExposeJest(QuickStartWebApp webApp) {
FilterHolder denialOfServiceFilterHolder = new FilterHolder(new ApiAccessFilter());
webApp.addFilter(denialOfServiceFilterHolder, "/jest/*", EnumSet.of(DispatcherType.REQUEST));
webApp.addFilter(denialOfServiceFilterHolder, "/describe/sources/*", EnumSet.of(DispatcherType.REQUEST));
}
private static void setStat(ApplicationServer applicationServer, QuickStartWebApp webApp) throws Exception {
......@@ -251,7 +235,7 @@ public class ApplicationServerTools extends JettySeverTools {
webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed",
BooleanUtils.toStringTrueFalse(false));
setStat(applicationServer, webApp);
setExposeJest(applicationServer, webApp);
setExposeJest(webApp);
handlers.addHandler(webApp);
webApp.start();
} else if (Files.exists(dir)) {
......
package com.x.server.console.server.center;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet;
import java.util.Objects;
import java.util.TimeZone;
import javax.servlet.DispatcherType;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.x.base.core.project.config.CenterServer;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.jaxrs.ApiAccessFilter;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.base.core.project.tools.FileTools;
import com.x.base.core.project.tools.JarTools;
import com.x.base.core.project.tools.PathTools;
import com.x.base.core.project.x_program_center;
import com.x.server.console.server.JettySeverTools;
import com.x.server.console.server.ServerRequestLog;
import com.x.server.console.server.ServerRequestLogBody;
import com.x.server.console.server.Servers;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.file.PathUtils;
import org.apache.commons.lang3.BooleanUtils;
......@@ -27,22 +32,15 @@ import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.x.base.core.project.x_program_center;
import com.x.base.core.project.config.CenterServer;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.jaxrs.DenialOfServiceFilter;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.base.core.project.tools.FileTools;
import com.x.base.core.project.tools.JarTools;
import com.x.base.core.project.tools.PathTools;
import com.x.server.console.server.JettySeverTools;
import com.x.server.console.server.ServerRequestLog;
import com.x.server.console.server.ServerRequestLogBody;
import com.x.server.console.server.Servers;
import javax.servlet.DispatcherType;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet;
import java.util.Objects;
import java.util.TimeZone;
public class CenterServerTools extends JettySeverTools {
......@@ -145,7 +143,7 @@ public class CenterServerTools extends JettySeverTools {
webApp.getInitParams().put("org.eclipse.jetty.servlet.Default.dirAllowed",
BooleanUtils.toStringTrueFalse(false));
setStat(centerServer, webApp);
setExposeJest(centerServer, webApp);
setExposeJest(webApp);
return webApp;
}
......@@ -160,12 +158,10 @@ public class CenterServerTools extends JettySeverTools {
}
}
private static void setExposeJest(CenterServer centerServer, QuickStartWebApp webApp) throws Exception {
if (BooleanUtils.isFalse(Config.general().getExposeJest())) {
FilterHolder denialOfServiceFilterHolder = new FilterHolder(new DenialOfServiceFilter());
webApp.addFilter(denialOfServiceFilterHolder, "/jest/*", EnumSet.of(DispatcherType.REQUEST));
webApp.addFilter(denialOfServiceFilterHolder, "/describe/sources/*", EnumSet.of(DispatcherType.REQUEST));
}
private static void setExposeJest( QuickStartWebApp webApp) throws Exception {
FilterHolder denialOfServiceFilterHolder = new FilterHolder(new ApiAccessFilter());
webApp.addFilter(denialOfServiceFilterHolder, "/jest/*", EnumSet.of(DispatcherType.REQUEST));
webApp.addFilter(denialOfServiceFilterHolder, "/describe/sources/*", EnumSet.of(DispatcherType.REQUEST));
}
private static RequestLog requestLog(CenterServer centerServer) throws Exception {
......@@ -222,4 +218,4 @@ public class CenterServerTools extends JettySeverTools {
}
}
}
}
\ No newline at end of file
}
package com.x.server.console.server.web;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.*;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.TimeZone;
import java.util.stream.Stream;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.WebServer;
import com.x.base.core.project.config.WebServers;
import com.x.base.core.project.jaxrs.ApiAccessFilter;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.base.core.project.x_program_center;
import com.x.server.console.server.JettySeverTools;
import com.x.server.console.server.ServerRequestLog;
import com.x.server.console.server.Servers;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.BooleanUtils;
......@@ -18,21 +20,25 @@ import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.ResourceCollection;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import com.x.base.core.project.x_program_center;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.WebServer;
import com.x.base.core.project.config.WebServers;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.DefaultCharset;
import com.x.server.console.server.JettySeverTools;
import com.x.server.console.server.ServerRequestLog;
import com.x.server.console.server.Servers;
import javax.servlet.DispatcherType;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.EnumSet;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.TimeZone;
import java.util.stream.Stream;
public class WebServerTools extends JettySeverTools {
......@@ -146,9 +152,15 @@ public class WebServerTools extends JettySeverTools {
context.setGzipHandler(new GzipHandler());
context.setParentLoaderPriority(true);
context.getMimeTypes().addMimeMapping("wcss", "application/json");
setExposeApi(context);
return context;
}
private static void setExposeApi(WebAppContext webApp) {
FilterHolder denialOfServiceFilterHolder = new FilterHolder(new ApiAccessFilter());
webApp.addFilter(denialOfServiceFilterHolder, "/api/*", EnumSet.of(DispatcherType.REQUEST));
}
private static void moveNonDefaultDirectoryToWebroot() throws Exception {
// 将webServer目录下的自定义目录移动到webroot
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Config.path_servers_webServer(true),
......
......@@ -243,6 +243,9 @@ public class Business {
if (effectivePerson.isSecurityManager()) {
return true;
}
if(role!=null && OrganizationDefinition.Manager.equals(role.getName())){
return false;
}
if (this.hasAnyRole(effectivePerson, OrganizationDefinition.Manager, OrganizationDefinition.OrganizationManager,
OrganizationDefinition.RoleManager, OrganizationDefinition.SecurityManager)) {
return true;
......
......@@ -6,6 +6,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.persistence.Basic;
import javax.persistence.Column;
......@@ -43,11 +44,11 @@ import com.x.base.core.project.gson.XGsonBuilder;
import com.x.base.core.project.organization.OrganizationDefinition;
import com.x.base.core.project.processplatform.ManualTaskIdentityMatrix;
import com.x.base.core.project.tools.DateTools;
import com.x.base.core.project.tools.ListTools;
import com.x.base.core.project.tools.StringTools;
import com.x.processplatform.core.entity.PersistenceProperties;
import com.x.processplatform.core.entity.content.WorkProperties.GoBackStore;
import com.x.processplatform.core.entity.element.ActivityType;
import com.x.processplatform.core.entity.ticket.Ticket;
import com.x.processplatform.core.entity.ticket.Tickets;
import io.swagger.v3.oas.annotations.media.Schema;
......@@ -99,13 +100,11 @@ public class Work extends SliceJpaObject implements ProjectionInterface {
if (StringTools.utf8Length(this.getProperties().getTitle()) > length_255B) {
this.title = StringTools.utf8SubString(this.getProperties().getTitle(), length_255B - 3) + "...";
}
// 填入处理人文本
if (ListTools.isEmpty(this.getManualTaskIdentityMatrix().flat())) {
if (null == this.getTickets()) {
this.manualTaskIdentityText = "";
} else {
String text = StringUtils.join(OrganizationDefinition.name(this.getManualTaskIdentityMatrix().flat()), ",");
text = StringTools.utf8SubString(text, length_255B);
this.setManualTaskIdentityText(text);
this.setManualTaskIdentityText(this.getTickets().bubble().stream().map(Ticket::distinguishedName)
.map(OrganizationDefinition::name).filter(Objects::nonNull).collect(Collectors.joining(",")));
}
}
......@@ -128,6 +127,7 @@ public class Work extends SliceJpaObject implements ProjectionInterface {
this.serviceValue = this.getProperties().getServiceValue();
this.manualEmpowerMap = this.getProperties().getManualEmpowerMap();
this.forceRouteEnable = this.getProperties().getForceRouteEnable();
this.manualTaskIdentityText = this.getProperties().getManualTaskIdentityText();
}
}
......@@ -306,6 +306,18 @@ public class Work extends SliceJpaObject implements ProjectionInterface {
this.forceRouteEnable = forceRouteEnable;
}
public String getManualTaskIdentityText() {
if ((null == this.manualTaskIdentityText) && (null != this.properties)) {
this.manualTaskIdentityText = this.getProperties().getManualTaskIdentityText();
}
return manualTaskIdentityText;
}
public void setManualTaskIdentityText(String manualTaskIdentityText) {
this.getProperties().setManualTaskIdentityText(manualTaskIdentityText);
this.manualTaskIdentityText = manualTaskIdentityText;
}
public static final String MANUALEMPOWERMAP_FIELDNAME = "manualEmpowerMap";
@Transient
@Deprecated(since = "8.2", forRemoval = true)
......@@ -372,6 +384,11 @@ public class Work extends SliceJpaObject implements ProjectionInterface {
@FieldDescribe("强制路由.")
private Boolean forceRouteEnable;
public static final String MANUALTASKIDENTITYTEXT_FIELDNAME = "manualTaskIdentityText";
@Transient
@FieldDescribe("当前处理人身份合并文本,用','分割,此字段仅用于显示当前工作的处理人,不索引.")
private String manualTaskIdentityText;
public static final String job_FIELDNAME = "job";
@FieldDescribe("工作")
@Column(length = JpaObject.length_id, name = ColumnNamePrefix + job_FIELDNAME)
......@@ -560,11 +577,12 @@ public class Work extends SliceJpaObject implements ProjectionInterface {
@CheckPersist(allowEmpty = true)
private Boolean beforeExecuted;
public static final String MANUALTASKIDENTITYTEXT_FIELDNAME = "manualTaskIdentityText";
@FieldDescribe("当前处理人身份合并文本,用','分割,超长截断,此字段仅用于显示当前工作的处理人,不索引.")
@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + MANUALTASKIDENTITYTEXT_FIELDNAME)
@CheckPersist(allowEmpty = true)
private String manualTaskIdentityText;
// @Deprecated(since = "8.2,使用tickets后将删除此字段.", forRemoval = true)
// public static final String MANUALTASKIDENTITYTEXT_FIELDNAME = "manualTaskIdentityText";
// @FieldDescribe("当前处理人身份合并文本,用','分割,超长截断,此字段仅用于显示当前工作的处理人,不索引.")
// @Column(length = JpaObject.length_255B, name = ColumnNamePrefix + MANUALTASKIDENTITYTEXT_FIELDNAME)
// @CheckPersist(allowEmpty = true)
// private String manualTaskIdentityText;
/** Split Attribute */
public static final String splitting_FIELDNAME = "splitting";
......@@ -1176,14 +1194,6 @@ public class Work extends SliceJpaObject implements ProjectionInterface {
this.dataChanged = dataChanged;
}
public String getManualTaskIdentityText() {
return manualTaskIdentityText;
}
public void setManualTaskIdentityText(String manualTaskIdentityText) {
this.manualTaskIdentityText = manualTaskIdentityText;
}
public String getStringValue01() {
return stringValue01;
}
......
......@@ -64,6 +64,17 @@ public class WorkProperties extends JsonProperties {
@FieldDescribe("强制路由.")
private Boolean forceRouteEnable;
@FieldDescribe("当前处理人身份合并文本,用','分割,此字段仅用于显示当前工作的处理人,不索引.")
private String manualTaskIdentityText;
public String getManualTaskIdentityText() {
return manualTaskIdentityText;
}
public void setManualTaskIdentityText(String manualTaskIdentityText) {
this.manualTaskIdentityText = manualTaskIdentityText;
}
public Boolean getForceRouteEnable() {
return forceRouteEnable;
}
......
......@@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Triple;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.project.bean.tuple.Pair;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.logger.Logger;
......
......@@ -461,7 +461,9 @@ abstract class BaseAction extends StandardJaxrsAction {
if (null != jsonElement) {
if (jsonElement.isJsonPrimitive()) {
JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive();
if (jsonPrimitive.isNumber()) {
if (jsonPrimitive.isBoolean()) {
value = jsonPrimitive.getAsBoolean();
}else if (jsonPrimitive.isNumber()) {
value = jsonPrimitive.getAsBoolean();
}
} else if (jsonElement.isJsonArray()) {
......
......@@ -120,6 +120,9 @@ o2.widget.AttachmentController = o2.widget.ATTER = new Class({
}
this.checkActions();
//this.attachments = atts;
if( layout.mobile ){
this.checkActionsZoom();
}
},
loadMin: function(){
......@@ -350,6 +353,10 @@ o2.widget.AttachmentController = o2.widget.ATTER = new Class({
if( !hiddenGroup.contains("list") )this.createListGroupActions();
if( !hiddenGroup.contains("view") )this.createViewGroupActions();
if( layout.mobile ){
this.checkActionsZoom();
}
//this.topNode = new Element("div", {"styles": this.css.topNode}).inject(this.node);
//this.createEditGroupActions();
//this.createReadGroupActions();
......@@ -358,6 +365,46 @@ o2.widget.AttachmentController = o2.widget.ATTER = new Class({
//this.createConfigGroupActions();
},
checkActionsZoom: function(){
var width = 0;
this.topNode.getChildren().each(function( node ){
if(node.offsetParent)width = width + node.getSize().x + this.getOffsetX(node)
}.bind(this));
var topSize = this.topNode.getSize();
if( (topSize.x - 5) < width ){
var zoom = this.getDecimals((topSize.x - 5) / width);
this.topNode.setStyle( "zoom", zoom*100+"%" );
}
},
getDecimals: function(v){ //截取两位小数
var decimals = 4;
var p = Math.pow(10,decimals);
var f_x = Math.round(v*p)/p;
var str = f_x.toString();
if (decimals>0){
var pos_decimal = str.indexOf('.');
if (pos_decimal < 0){
pos_decimal = str.length;
str += '.';
}
var decimalStr = (str).substr(pos_decimal+1, (str).length);
while (decimalStr.length < decimals){
str += '0';
decimalStr += 0;
}
}
return str;
},
getOffsetX : function(node){
return (node.getStyle("margin-left").toInt() || 0 ) +
(node.getStyle("margin-right").toInt() || 0 ) +
(node.getStyle("padding-left").toInt() || 0 ) +
(node.getStyle("padding-right").toInt() || 0 )+
(node.getStyle("border-left-width").toInt() || 0 ) +
(node.getStyle("border-right-width").toInt() || 0 );
},
reloadTopNode : function(){
this.createTopNode();
},
......@@ -647,6 +694,9 @@ o2.widget.AttachmentController = o2.widget.ATTER = new Class({
this.setAttachmentsAction("download", true );
}
},
isAttDblclickAvailable : function( att ){
return this.options.dblclick && this.options.dblclick !== "hidden";
},
isAttDownloadAvailable : function( att ){
if( this.options.toolbarGroupHidden.contains("read") )return false;
return this.options.isDownload && this.options.isDownload !== "hidden";
......@@ -1939,6 +1989,12 @@ o2.widget.AttachmentController.AttachmentMin = new Class({
this.actionAreaNode = new Element("div", {"styles": this.css.minAttachmentActionAreaNode}).inject(this.node);
if( this.controller.isAttDblclickAvailable(this) ){
this.openAction = this.createAction(this.actionAreaNode, "open_single", "open_single_over", o2.LP.widget.open, function (e, node) {
this.controller.dblclickAttachment(e, node, [this]);
}.bind(this));
}
if ( this.controller.isAttDownloadAvailable(this) ) {
this.downloadAction = this.createAction(this.actionAreaNode, "download_single", "download_single_over", o2.LP.widget.download, function (e, node) {
this.controller.downloadAttachment(e, node);
......@@ -2007,6 +2063,12 @@ o2.widget.AttachmentController.AttachmentMin = new Class({
this.actionAreaNode = new Element("div", {"styles":this.css.minAttachmentActionAreaNode}).inject(this.node);
if( this.controller.isAttDblclickAvailable(this) ){
this.openAction = this.createAction(this.actionAreaNode, "open_single", "open_single_over", o2.LP.widget.open, function (e, node) {
this.controller.dblclickAttachment(e, node, [this]);
}.bind(this));
}
if ( this.controller.isAttDownloadAvailable(this) ) {
this.downloadAction = this.createAction(this.actionAreaNode, "download_single", "download_single_over", o2.LP.widget.download, function (e, node) {
this.controller.downloadAttachment(e, node);
......
......@@ -1075,7 +1075,7 @@ o2.widget.Calendar = o2.Calendar = new Class({
}
if (!this.okButton){
this.okButton = new Element("button", {"text": o2.LP.widget.ok }).inject(this.showActionNode);
this.okButton = new Element("button.mainColor_bg", {"text": o2.LP.widget.ok }).inject(this.showActionNode);
this.okButton.addEvent("click", function(){
this._selectTime();
this.hide();
......
......@@ -491,6 +491,10 @@ MWF.xApplication.process.Xform.AttachmentController = new Class({
if (!hiddenGroup.contains("view")) this.createViewGroupActions();
this.checkActions();
if( layout.mobile && this.checkActionsZoom ){
this.checkActionsZoom();
}
},
checkActions: function () {
// if (this.options.readonly){
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册