mariodavid / cuba-component-data-import Goto Github PK
View Code? Open in Web Editor NEWCUBA component for easy data import
License: Apache License 2.0
CUBA component for easy data import
License: Apache License 2.0
In the wizard it should be able to map columns to Enums via its ordinal values.
MlbPlayer
N:1 MlbTeam
through the attribute team
. Now MlbTeam
has attributes name
and code
.
In the CSV file there is a reference to team
and it contains the code
of the MlbTeam
entity.
The equivalent in Excel is vlookup :)
Here's the full example:
It should be possible to define in the wizard that the column team
belongs to the entity attribute team.code
and this leads to the correct import behavior as described in this example.
Testing the component by importing records that are related to another table generates the following error
java.lang.IllegalStateException: No valid Attribute binder for AttributeBindRequest: de.diedavids.cuba.dataimport.binding.AttributeBindRequest@3cc02566 found at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83) at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77) at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247) at de.diedavids.cuba.dataimport.binding.AttributeBinderFactory.createAttributeBinderFromBindingRequest(AttributeBinderFactory.groovy:40) at de.diedavids.cuba.dataimport.binding.AttributeBinderFactory$createAttributeBinderFromBindingRequest.call(Unknown Source) at de.diedavids.cuba.dataimport.binding.EntityBinderImpl.bindAttribute(EntityBinderImpl.groovy:37) at sun.reflect.GeneratedMethodAccessor259.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:190) at de.diedavids.cuba.dataimport.binding.EntityBinderImpl$_bindAttributes_closure1.doCall(EntityBinderImpl.groovy:28) at sun.reflect.GeneratedMethodAccessor258.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022) at groovy.lang.Closure.call(Closure.java:414) at groovy.lang.Closure.call(Closure.java:430) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2040) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2025) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2066) at org.codehaus.groovy.runtime.dgm$163.invoke(Unknown Source) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at de.diedavids.cuba.dataimport.binding.EntityBinderImpl.bindAttributes(EntityBinderImpl.groovy:27) at de.diedavids.cuba.dataimport.binding.EntityBinder$bindAttributes.call(Unknown Source) at de.diedavids.cuba.dataimport.service.GenericDataImporterServiceBean.bindAttributes(GenericDataImporterServiceBean.groovy:232) at de.diedavids.cuba.dataimport.service.GenericDataImporterServiceBean$bindAttributes$0.callCurrent(Unknown Source) at de.diedavids.cuba.dataimport.service.GenericDataImporterServiceBean.createEntityFromRow(GenericDataImporterServiceBean.groovy:226) at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174) at de.diedavids.cuba.dataimport.service.GenericDataImporterServiceBean$_createEntities_closure5.doCall(GenericDataImporterServiceBean.groovy:218) at sun.reflect.GeneratedMethodAccessor275.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022) at groovy.lang.Closure.call(Closure.java:414) at groovy.lang.Closure.call(Closure.java:430) at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3202) at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3172) at org.codehaus.groovy.runtime.dgm$67.invoke(Unknown Source) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at de.diedavids.cuba.dataimport.service.GenericDataImporterServiceBean.createEntities(GenericDataImporterServiceBean.groovy:217) at de.diedavids.cuba.dataimport.service.GenericDataImporterServiceBean$createEntities.callCurrent(Unknown Source) at de.diedavids.cuba.dataimport.service.GenericDataImporterServiceBean.doDataImport(GenericDataImporterServiceBean.groovy:49) 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.GeneratedMethodAccessor147.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.$Proxy147.doDataImport(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.$Proxy298.doDataImport(Unknown Source) at de.diedavids.cuba.dataimport.service.GenericDataImporterService$doDataImport.call(Unknown Source) at de.diedavids.cuba.dataimport.web.importwizard.ImportWizard.startImport(ImportWizard.groovy:239) 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:44) at com.haulmont.cuba.web.gui.components.WebButton.lambda$new$61446b05$1(WebButton.java:36) at sun.reflect.GeneratedMethodAccessor300.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.GeneratedMethodAccessor299.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:300) at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:191) 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 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.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 com.haulmont.cuba.web.sys.singleapp.SingleAppWebContextLoader$SetClassLoaderFilter.doFilter(SingleAppWebContextLoader.java:277) 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:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) 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.valves.RemoteIpValve.invoke(RemoteIpValve.java:677) 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:790) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) 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)
Entity
`@Entity(name = "mdsf$CtlGrupo")
public class CtlGrupo extends BaseStringIdEntity implements Updatable, Creatable {
private static final long serialVersionUID = -5560200675400158080L;
@Id
@Column(name = "ID", nullable = false, length = 3)
private String id;
@NotNull
@Column(name = "NOM_GRUPO", nullable = false, length = 200)
private String nombre;
@Lookup(type = LookupType.DROPDOWN)
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "CAPITULO_ID")
private CtlCapitulo capitulo;
@Composition
@OnDeleteInverse(DeletePolicy.CASCADE)
@OneToMany(mappedBy = "grupo")
private List<CtlCategoria> categorias;
@Column(name = "FH_CREACION")
private Date createTs;
@Column(name = "CREADO_POR", length = 50)
private String createdBy;
@Column(name = "FH_MODIFICADO")
private Date updateTs;
@Column(name = "MODIFICADO_POR", length = 50)
private String updatedBy;`
Nelson F.
Lets try to make clear, that it is not about data export. CUBA already has capabilities for data export: Excel export, reports, Entity Inspector export.
We should get a clear idea about what this is and what it is not. From my point of view: it is only data import from files.
Currenty there are several Helper components in the web module that are only annotated with @component, but without a proper unique (with app component prefix) name.
In order to minimize future collisions, it should be changed to add a proper NAME field with the app-component prefix
the app component should support Oracle out of the box.
TODO:
As an Import user
When i run the import wizard
Then i want to be able to manually change attributes in the preview, so that I can manually adjust the import data
Currently when the wizard ends, there is a question, if something should be really closed, because of some technical reason.
Let's get rid of that...
In the wizard when changing the entity attribute in the mapping there has to be the prefix of the Entity class (e.g. ddcdit$MlbTeam.code
instead of just code
). The latter would be better --> refactoring
Let's talk about what the TOP 5 features and the most common use cases for this component would be.
move to cuba-component-data-import-test
we should try to scope it to something that it definivitly is and descope something that it is not. Import is a very broad term. Webservice import, only File import, only CSV file import etc.?
As a user of the import wizard
When I upload a File that has the name Users.xlsx or my-users.csv
Then the entity type should find the best match and prefill the entity type selection
Mario,
Thank you for providing a valuable component to the community. I'm currently not able to set a category and dynamic attribute on an imported entity. Is this not supported and if not, do you plan to?
Thanks!
Currently, it is always the case, that a success message will be shown when the import process is complete.
Let's do a "Yes, cool" - "No, didn't work" message after the import.
As a user of the wizard
When I try to import data via the wizard
And I configure a unique configuration for the column "customer.firstName"
And I configure the strategy "skip if found"
Then this item should not be imported
As a user of the wizard
When I try to import data via the wizard
And I configure a unique configuration for the column "customer.firstName"
And I configure the strategy "update if found"
Then this item should be imported and update the attributes of the existing entity instance
In order to enable an escape mode for more complex situations, there should be a way for the user to define for every attribute how the mapping from the CSV / Excel value to the entity attribute should happen.
This will be an alternative to the already implemented "easy" cases, like N:1 association lookup, Enum parsing etc.
Currently the SimpleDataLoader is based on BaseUuidEntity / Subclass of BaseUuidEntity. Instead it should be based on Entity / Subclass of Entity.
Hello Mario,
Neat tool - thanks for your contribution.
I'm unable to import a BigDecimal-formatted field. Please take a look if you have time, I have some info below that could help you fix this:
It appears BigDecimal format is not handled in the getValue method for the DatatypeAttributeBinder.groovy file (dataimport-core-0.2.0.jar/de.diedavids.cuba.dataimport/binding/DataTypeAttributeBinder.groovy):
private getValue(AttributeBindRequest bindRequest) {
switch (bindRequest.metaProperty.javaType) {
case Integer: return getIntegerValue(bindRequest.rawValue, bindRequest.dataRow)
case Double: return getDoubleValue(bindRequest.rawValue, bindRequest.dataRow)
case Date: return getDateValue(bindRequest.importConfiguration, bindRequest.rawValue)
case Boolean: return getBooleanValue(bindRequest.importConfiguration, bindRequest.rawValue, bindRequest.dataRow)
case String: return getStringValue(bindRequest.rawValue)
}
}
the app component should support PostgreSQL out of the box.
TODO:
There are cases where either a single-transaction mode makes sense. All Entities are processed by a single transaction. If any of the entities have validation errors or unique constraints, none of the entities should be processes.
But there is also the case, where the user only wants to see which rows were not processed because of the failure, but for all other entities, they should have imported (transaction-per-entity).
The ImportConfiguration
should allow to define, for which configuration which import strategy is used.
Currently when an N:1 association is configured in the import mapper and the imported is started with a data row that has a reference to a non-existing enity reference, then an exception is thrown:
NoSuchElementException: Cannot access first() element from an empty List
instead it should just not get bound.
As a user of the wizard
When I configure the entity attribute mapper configuration for "Customer.firstName"
Then I want to select the entity attribute via a tree selection just like in the "generic filter > add filter condition dialog"
As a user of the wizard
When I configure the entity attribute mapper configuration for "MlbPlayer.team.code"
Then I want to select the entity attribute via a tree selection just like in the "generic filter > add filter condition dialog"
As a user of the import system
When I open the import configuration browse screen
Then I want to be able to select an existing import configuration and trigger an import
Where the only parameter is the import file
As an Import user
When I run the import wizard
Then I should see the preview of the entity instances in step "Import preview" besides the CSV preview table
As a user of the import wizard
When I have made a mistake in a previous step
Then I would like to have the ability to go one step back in the wizard so that I can correct my mistake
As a user of the import system
When I open the import wizard and uploaded a file
Then I want to be able to select an existing import configuration after selecting a entity class
So that I don't need to define the different configurations every time I want to import the same kind of file
Hi,
There seems to be a bug on import of inherited entities. The importer picks the class for the parent entity instead of the entity i am trying to import, when i change the mapping to be the inherited, i get 0 imports.
Is it possible to cast the entity to the type on the dropdown?
Just like the CSV file, an excel file should also be possible to upload and import.
It should be possible to exclude columns from the import process. One candidate in the example would be the position column, that is available in the CSV file, but not included in the domain model.
topics:
IllegalStateException: No valid Attribute binder for AttributeBindRequest: de.diedavids.cuba.dataimport.binding.AttributeBindRequest@1ffc1404 found
Since I upgraded to 0.3.0
As a user of the wizard
When I start the Import wizard
Then I want to import a XML file and map the attributes of the file to the entity attributes as with CSV files
As a User of the wizard
When I configure the entity attribute mapping for a String attribute in the import configuration
Then I want to configure a default value in case there is no value defined in the import file
As a user of the wizard
When I start the Import wizard
Then I want to import a JSON file and map the attributes of the file to the entity attributes as with CSV files
the app component should support MySQL out of the box.
TODO:
As a development / development alike user of the system
When I create an import configuration
Then I want to configure a custom "preCommit" groovy script, which will be executed right before the the import is started (and bean validation is executed)
So that I can programmatically define certain behavior on a per entity basis
Hi Mario,
Grate add-on! I remember proposed to cuba forum for a such module, and finally you did it, really great! ๐
However, I'm getting an error when starting to upload the data :
NullPointerException: Cannot get property 'metaProperties' on null object
Do you have any idea why this property is null?
Besides the already existing excel import we should try to come up with a similar thing that can import CSV files. It should in the first phase be at the same abstraction level as the excel import.
Then we can create abstractions in form of configurations which allow to more easily define the import.
As a user of the import system
When I open a browse screen of an entity which is importable
Then I want to be able to trigger an import and only configure the import configuration as well as the upload file as the only parameter
it should be possible to parse a boolean value in the import process. The already existing global configuration options for booleanTrueValue
and booleanFalseValue
can be used.
What happens in case of: True --> "X", False --> ""? That should be supported as well (false as no value)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.