GithubHelp home page GithubHelp logo

mariodavid / cuba-component-attachable Goto Github PK

View Code? Open in Web Editor NEW
7.0 4.0 2.0 888 KB

CUBA component that lets you add attachments to any entity

License: Apache License 2.0

Groovy 49.23% Java 41.11% Shell 0.11% TSQL 9.55%
cuba-component cuba-platform attachments

cuba-component-attachable's Introduction

Download license Build Status Coverage Status

CUBA Platform Component - Attachable

This application component lets you easily add attachments to any entity in your application.

Just add @WithAttachments on the browse screen of your entity and the rest will be done by this app-component.

1-browse-with-attachments

Installation

  1. attachable is available in the CUBA marketplace
  2. Select a version of the add-on which is compatible with the platform version used in your project:
Platform Version Add-on Version
7.2.x 0.9.x
7.1.x 0.7.x - 0.8.x
7.0.x 0.6.x
6.10.x 0.5.x
6.9.x 0.2.x - 0.4.x
6.8.x 0.1.x

The latest version is: Download

Add custom application component to your project:

  • Artifact group: de.diedavids.cuba.attachable
  • Artifact name: attachable-global
  • Version: add-on version

Supported DBMS

The following databases are supported by this application component:

  • HSQLDB
  • PostgreSQL
  • MySQL

All other DBMS systems are supported in the way, that CUBA studio automatically creates DDL scripts. Therefore it is totally possible to use the application component even without dedicated SQL scripts directly from this application component.

Using the application component

Browse Screens

Annotate your browse screens with the @WithAttachments annotation or by implementing the WithAttachmentsSupport interface, depending on which version of CUBA screen APIs is used in the target screen.

@WithAttachments annotation (CUBA 6 screens)

@WithAttachments(listComponent = "productsTable")
class ProductBrowse extends AnnotatableAbstractLookup {
}

For the @WithAttachments annotation you need to define the list component on which it should add the attachments button. Normally this is the id of the table you defined in your browse screen.

This annotation will create a button in the buttonsPanel of the table and add the Attachments button after the default CUBA buttons.

The @WithAttachments annotations can be customized through the following attributes:

  • String listComponent - the id of the list component / table where the button will be added - REQUIRED
  • String buttonId - the id of the newly created button that will be created ("attachmentBtn" by default)
  • String buttonsPanel - the id of the buttons panel where the new button will be added ("buttonsPanel" by default)

WithAttachmentsSupport interface (CUBA 7 screens)

public class CustomerBrowse extends StandardLookup<Customer> implements WithAttachmentsSupport {

    @Inject
    protected GroupTable<Customer> customersTable;

    @Inject
    protected ButtonsPanel buttonsPanel;

    @Override
    public ListComponent getListComponentForAttachments() {
        return customersTable;
    }

    @Override
    public ButtonsPanel getButtonsPanelForAttachments() {
        return buttonsPanel;
    }

    @Override
    public WindowManager.OpenType attachmentListOpenType() {
        return WindowManager.OpenType.NEW_TAB;
    }
}

In the Interface variant the following attributes have to be defined by implementing methods instead of annotation attributes:

  • getListComponentForAttachments defines the list component to target for the attachable functionality
  • getButtonsPanelForAttachments defines the button panel on which a button will be placed
  • attachmentListOpenType optionally defines the open type for the attachment list

Edit Screens (CUBA 7 screens)

Besides using Attachments in the Browse Screen of the Entity, it is also possible to show Attachments as part of an Edit Screen.

In order to do display attachments of a particular Entity there is a fragment which can be used in the Edit Screen:

<fragment screen="ddca_EntityAttachmentsFragment">
    <properties>
        <property name="attachableDc" ref="customerDc"/>
    </properties>
</fragment>

It is required to pass in the reference to the attachableDc of the entity (customerDc in the example above).

An example can be found in the customer-edit.xml.

Example usage

To see this application component in action, check out this example: cuba-example-using-attachable.

Attachment list

The attachment button will show all attachments that have been added to a particular selected entity. It allows to add, edit & remove attachments to this entity. 2-attachments-list

Attachment preview

Furthermore it gives the user the option to preview the attachment directly in the browser or download the attachment.

3-attachment-preview

The ability to do the preview depends on the attachment type and the browser capabilities.

Configuration options

The application components adds the following application properties, that can be changed in the corresponding screen (Administration > Application Properties):

  • attachable.updateAttachmentCounterOnSelect - whether or not a counter of attachments should be displayed after a particular entity is selected in the table

cuba-component-attachable's People

Contributors

mariodavid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

cuba-component-attachable's Issues

java.lang.NullPointerException

When you attach a file, the following error is generated
java.lang.NullPointerException at de.diedavids.cuba.entitysoftreference.EntitySoftReferenceConverter.loadEntity(EntitySoftReferenceConverter.java:45) at de.diedavids.cuba.entitysoftreference.EntitySoftReferenceConverter.convertToEntityAttribute(EntitySoftReferenceConverter.java:38) at de.diedavids.cuba.entitysoftreference.EntitySoftReferenceConverter.convertToEntityAttribute(EntitySoftReferenceConverter.java:11) at org.eclipse.persistence.mappings.converters.ConverterClass.convertDataValueToObjectValue(ConverterClass.java:124) at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.getObjectValue(AbstractDirectMapping.java:636) at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.valueFromRow(AbstractDirectMapping.java:1252) at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.buildCloneFromRow(AbstractDirectMapping.java:224) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildAttributesIntoWorkingCopyClone(ObjectBuilder.java:1997) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneFromRow(ObjectBuilder.java:2258) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:848) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:735) at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:689) at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:802) at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:962) at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:573) at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1172) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:904) at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1131) at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:460) at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1219) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2944) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1854) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1836) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1801) at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:473) at com.haulmont.cuba.core.sys.QueryImpl.getResultFromCache(QueryImpl.java:658) at com.haulmont.cuba.core.sys.QueryImpl.getResultList(QueryImpl.java:342) at de.diedavids.cuba.entitysoftreference.SoftReferenceServiceBean.loadEntitiesForSoftReference(SoftReferenceServiceBean.java:63) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:96) at sun.reflect.GeneratedMethodAccessor161.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) at com.sun.proxy.$Proxy297.loadEntitiesForSoftReference(Unknown Source) at de.diedavids.cuba.entitysoftreference.SoftReferenceService$loadEntitiesForSoftReference$0.call(Unknown Source) at de.diedavids.cuba.attachable.service.AttachmentServiceBean.getAttachments(AttachmentServiceBean.groovy:35) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:117) at sun.reflect.GeneratedMethodAccessor161.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) at com.sun.proxy.$Proxy318.getAttachments(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154) at com.sun.proxy.$Proxy71.getAttachments(Unknown Source) at de.diedavids.cuba.attachable.web.attachment.AttachmentBrowseDatasource.getEntities(AttachmentBrowseDatasource.java:19) at com.haulmont.cuba.gui.data.impl.CustomCollectionDatasource.loadData(CustomCollectionDatasource.java:45) at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refresh(CollectionDatasourceImpl.java:161) at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refresh(CollectionDatasourceImpl.java:121) at com.haulmont.cuba.gui.data.Datasource$refresh.call(Unknown Source) at de.diedavids.cuba.attachable.web.attachment.AttachmentBrowse$1.windowClosedWithCommitAction(AttachmentBrowse.groovy:76) at com.haulmont.cuba.web.gui.WebWindow$CloseListenerAdapter.windowClosed(WebWindow.java:1980) at com.haulmont.cuba.web.gui.WebWindow.fireWindowClosed(WebWindow.java:910) at com.haulmont.cuba.web.gui.WebWindow.onClose(WebWindow.java:902) at com.haulmont.cuba.web.gui.WebWindow.close(WebWindow.java:1199) at com.haulmont.cuba.gui.components.AbstractWindow.close(AbstractWindow.java:283) at com.haulmont.cuba.gui.app.core.file.MultiUploader.close(MultiUploader.java:103) at com.haulmont.cuba.gui.app.core.file.MultiUploader.commitAndClose(MultiUploader.java:126) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.haulmont.cuba.gui.xml.DeclarativeAction.actionPerform(DeclarativeAction.java:92) at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:45) at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:37) at sun.reflect.GeneratedMethodAccessor421.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200) at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163) at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037) at com.vaadin.ui.Button.fireClick(Button.java:377) at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54) at com.vaadin.ui.Button$1.click(Button.java:54) at sun.reflect.GeneratedMethodAccessor451.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158) at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119) at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444) at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409) at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435) at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361) at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:312) at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:203) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:232) at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:209) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

support version 7

hello!
now we have problem with cuba 7

can we have hope for support?

Multi-upload Feature

It would be good to have a multi-upload option as well as the single file upload.

Also a dragzone for dragging file for upload might be a nice touch.

Support fragment?

Hi Mario,

A user reported he tried to use this in screen fragment, but failed with error:

From the source I understand that this add-on doesn't support fragment, do you have a plan for this, or if you can suggest how to change?

Component conflicts with Add To Set Folder Functionality

Hi Mario -

Thank you for the great work on this component. I have run into an issue with this component that I would like to bring to your attention.

In my project, I use this component on a Table alongside the "Add to Set" (https://doc.cuba-platform.com/manual-6.9/folders_pane.html) functionality of the platform. In this scenario, when I select a single row in the table and hit "Search" on the filters panel, I receive an ArrayIndexOutOfBounds Exception. It is important to note that no exception is received when a row is not selected and the Search button is clicked.

In tracing this exception, I have found that the issue exists on this line:
https://github.com/cuba-platform/cuba/blob/2a3d0a97ba475ce31c00e018161575d623614e85/modules/gui/src/com/haulmont/cuba/gui/components/filter/FilterDelegateImpl.java#L1967

The platform code is looking for the size of the "actions" array on the table and attempting to add the "Add To Set" action to that array per this line of code:

https://github.com/cuba-platform/cuba/blob/e70a3bb1660e836fe7e6313d8825ec350796d1f7/modules/web/src/com/haulmont/cuba/web/gui/components/WebAbstractActionsHolderComponent.java#L109

In my scenario, the following actions exist on the Table:
Create create (0)
Edit edit (1)
Remove remove (2)
System Information showSystemInfo (3)
attachment (4)
Add to set filter.addToSet (5)

The Exception I receive has the following text; IndexOutOfBoundsException: Index: 5, Size: 4

I suspect that this is because somehow, the component's action is not registering properly (I am not too sure about this).

I am interested in your thoughts on how I can fix this. I attempted to look through the component's code and wasn't able to readily identify the issue. My hope is that you have an insight that can help resolve this issue for me.

My suspicion is that moving the code from init to ready in this block should resolve the problem:

void init(WithAttachments annotation, Window.Lookup browse, Map<String, Object> params) {

For your reference, the full stack trace is listed below:

2018-09-10 08:30:26.520 ERROR [http-nio-8080-exec-13] com.haulmont.cuba.web.log.AppLog - Exception in com.haulmont.cuba.web.toolkit.ui.CubaButton: com.vaadin.server.ServerRpcManager$RpcInvocationException: Unable to invoke method click in com.vaadin.shared.ui.button.ButtonServerRpc at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:160) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:444) [vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:409) [vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274) [vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90) [vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435) [vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361) [vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:312) [cuba-web-6.9.5.jar:6.9.5] at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:203) [cuba-web-6.9.5.jar:6.9.5] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23] at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) [spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE] at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) [spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE] at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107) [cuba-web-6.9.5.jar:6.9.5] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:8.5.23] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.23] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [catalina.jar:8.5.23] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.23] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.23] at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) [catalina.jar:8.5.23] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.23] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:8.5.23] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-coyote.jar:8.5.23] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.23] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-coyote.jar:8.5.23] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-coyote.jar:8.5.23] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.23] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_181] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_181] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.23] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181] Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] ... 38 common frames omitted Caused by: com.vaadin.event.ListenerMethod$MethodException: Invocation of method buttonClick in com.haulmont.cuba.web.gui.components.WebButton$$Lambda$162/696634900 failed. at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:530) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.vaadin.ui.Button.fireClick(Button.java:377) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54) ~[cuba-web-6.9.5.jar:6.9.5] at com.vaadin.ui.Button$1.click(Button.java:54) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] ... 43 common frames omitted Caused by: java.lang.IndexOutOfBoundsException: Index: 5, Size: 4 at java.util.LinkedList.checkPositionIndex(LinkedList.java:560) ~[na:1.8.0_181] at java.util.LinkedList.add(LinkedList.java:507) ~[na:1.8.0_181] at com.vaadin.ui.AbstractOrderedLayout.addComponent(AbstractOrderedLayout.java:148) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11] at com.haulmont.cuba.web.gui.components.WebAbstractActionsHolderComponent.addAction(WebAbstractActionsHolderComponent.java:137) ~[cuba-web-6.9.5.jar:6.9.5] at com.haulmont.cuba.web.gui.components.WebAbstractActionsHolderComponent.addAction(WebAbstractActionsHolderComponent.java:103) ~[cuba-web-6.9.5.jar:6.9.5] at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.fillTableActions(FilterDelegateImpl.java:1909) ~[cuba-gui-6.9.5.jar:6.9.5] at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.setFilterActionsEnabled(FilterDelegateImpl.java:678) ~[cuba-gui-6.9.5.jar:6.9.5] at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.apply(FilterDelegateImpl.java:1480) ~[cuba-gui-6.9.5.jar:6.9.5] at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl$1.actionPerform(FilterDelegateImpl.java:288) ~[cuba-gui-6.9.5.jar:6.9.5] at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:46) ~[cuba-web-6.9.5.jar:6.9.5] at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:38) ~[cuba-web-6.9.5.jar:6.9.5] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510) ~[vaadin-server-7.7.13.cuba.11.jar:7.7.13.cuba.11]

Tags Feature

As a feature it would be nice to be able to add TAGS to files. Perhaps with the TokenList as the control for this.

Tags would help with searching and grouping.

MySQL Support?

Hello Mario,

I just found out about cuba platform and its possibilites - along with the marketplace. Your "Attachable" component seems very useful. However I noticed that it does not support MySQL yet. Are there any plans to include MySQL as well further down the road?

Best,
Uwe

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.