OSDir


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Wrong MySQL(The RuntimeException could not be mapped to a response, re-throwing to the HTTP container)


Hi Emmanuel -

We do have a project that allows us to work with MySQL 5.7 and fixes all of
the group by clauses in Fineract. But that code has not been pushed into
any of the active branches as far as I know. I think we had identified a
large testing task for this summer's GSoC to make sure we had covered
everything.

If you want to use MySQL 5.7, you can pull from my fork:
https://github.com/conradsp/fineract/tree/mysql-5.7
Otherwise, you'll have to use MySQL 5.6

Thanks,
Steve


On Sat, Jun 9, 2018 at 11:07 AM, Emmanuel Njoku <einjoku@xxxxxxxxx> wrote:

> The solution is below query
>
> select x.* from (SELECT x.* FROM m_client c, m_office o,
> (SELECT a.loanCycle, a.activeLoans, b.lastLoanAmount, d.activeSavings,
> d.totalSavings FROM
>   (SELECT IFNULL(MAX(l.loan_counter),0) AS loanCycle, COUNT(l.id) AS
> activeLoans FROM m_loan l WHERE l.loan_status_id=300 AND l.client_id=8) a,
>   (SELECT count(l.id), IFNULL(l.principal_amount,0) AS 'lastLoanAmount'
> FROM m_loan l WHERE l.client_id=8
>   AND l.disbursedon_date = (SELECT IFNULL(MAX(disbursedon_date),NOW())
> FROM
> m_loan where client_id=8 and loan_status_id=300) group by
> l.principal_amount) b,
>  (SELECT COUNT(s.id) AS 'activeSavings',
> IFNULL(SUM(s.account_balance_derived),0) AS 'totalSavings'
>  FROM m_savings_account s WHERE s.status_enum=300 AND s.client_id=8) d) x
> WHERE c.id=8 AND o.id = c.office_id AND o.hierarchy LIKE CONCAT('.', '%'))
> x;
>
> But i need the class where it was defined so that it can be update.
>
> Regards
>
> On Sat, Jun 9, 2018 at 4:54 PM, Emmanuel Njoku <einjoku@xxxxxxxxx> wrote:
>
> > please assist on this request. I have identify the issue and solution to
> > it but i am seriously looking on the code "incubator-fineract" so that i
> > can update it. There is no "group by" on the Mysql query.
> >
> > Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In
> > aggregated query without GROUP BY, expression #2 of SELECT list contains
> > nonaggregated column 'mifostenant-default.l.principal_amount'; this is
> > incompatible with sql_mode=only_full_group_by
> >
> >
> > /v1/runreports/ClientSummary","parameters":{"
> genericResultSet":["false"],"
> > R_clientId":["10"]}}
> > 197280 [http-bio-443-exec-1] ERROR o.s.b.context.web.ErrorPageFilter -
> > Forwarding to error page from request [/api/v1/runreports/ClientSummary]
> > due to exception [StatementCallback; bad SQL grammar [select x.* from
> > (SELECT x.* FROM m_client c, m_office o,
> > (
> >        SELECT a.loanCycle, a.activeLoans, b.lastLoanAmount,
> > d.activeSavings, d.totalSavings FROM
> >   (SELECT IFNULL(MAX(l.loan_counter),0) AS loanCycle, COUNT(l.id) AS
> > activeLoans FROM m_loan l WHERE l.loan_status_id=300 AND l.client_id=10)
> a,
> >   (SELECT count(l.id), IFNULL(l.principal_amount,0) AS 'lastLoanAmount'
> > FROM m_loan l WHERE l.client_id=10 AND l.disbursedon_date = (SELECT
> > IFNULL(MAX(disbursedon_date),NOW()) FROM m_loan where client_id=10 and
> > loan_status_id=300)) b,
> >  (SELECT COUNT(s.id) AS 'activeSavings', IFNULL(SUM(s.account_balance_
> derived),0)
> > AS 'totalSavings' FROM m_savings_account s WHERE s.status_enum=300 AND
> > s.client_id=10) d
> > ) x
> > WHERE c.id=10 AND o.id = c.office_id AND o.hierarchy LIKE CONCAT('.',
> > '%')) x]; nested exception is com.mysql.jdbc.exceptions.jdbc4.
> MySQLSyntaxErrorException:
> > In aggregated query without GROUP BY, expression #2 of SELECT list
> contains
> > nonaggregated column 'mifostenant-default.l.principal_amount'; this is
> > incompatible with sql_mode=only_full_group_by]
> > org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad
> > SQL grammar [select x.* from (SELECT x.* FROM m_client c, m_office o,
> > (
> >        SELECT a.loanCycle, a.activeLoans, b.lastLoanAmount,
> > d.activeSavings, d.totalSavings FROM
> >   (SELECT IFNULL(MAX(l.loan_counter),0) AS loanCycle, COUNT(l.id) AS
> > activeLoans FROM m_loan l WHERE l.loan_status_id=300 AND l.client_id=10)
> a,
> >   (SELECT count(l.id), IFNULL(l.principal_amount,0) AS 'lastLoanAmount'
> > FROM m_loan l WHERE l.client_id=10 AND l.disbursedon_date = (SELECT
> > IFNULL(MAX(disbursedon_date),NOW()) FROM m_loan where client_id=10 and
> > loan_status_id=300)) b,
> >  (SELECT COUNT(s.id) AS 'activeSavings', IFNULL(SUM(s.account_balance_
> derived),0)
> > AS 'totalSavings' FROM m_savings_account s WHERE s.status_enum=300 AND
> > s.client_id=10) d
> > ) x
> > WHERE c.id=10 AND o.id = c.office_id AND o.hierarchy LIKE CONCAT('.',
> > '%')) x]; nested exception is com.mysql.jdbc.exceptions.jdbc4.
> MySQLSyntaxErrorException:
> > In aggregated query without GROUP BY, expression #2 of SELECT list
> contains
> > nonaggregated column 'mifostenant-default.l.principal_amount'; this is
> > incompatible with sql_mode=only_full_group_by
> >         at org.springframework.jdbc.support.
> SQLExceptionSubclassTranslator
> > .doTranslate(SQLExceptionSubclassTranslator.java:91)
> > ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE]
> >         at org.springframework.jdbc.support.
> AbstractFallbackSQLExceptionTr
> > anslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
> > ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE]
> >         at org.springframework.jdbc.support.
> AbstractFallbackSQLExceptionTr
> > anslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
> > ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE]
> >         at org.springframework.jdbc.core.JdbcTemplate.execute(
> JdbcTemplate.java:413)
> > ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE]
> >         at org.springframework.jdbc.core.JdbcTemplate.query(
> JdbcTemplate.java:468)
> > ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE]
> >         at org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(
> JdbcTemplate.java:523)
> > ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE]
> >         at org.apache.fineract.infrastructure.dataqueries.service.
> > GenericDataServiceImpl.fillGenericResultSet(GenericDataServiceImpl.java:
> 59)
> > ~[classes/:na]
> >         at org.apache.fineract.infrastructure.dataqueries.service.
> > ReadReportingServiceImpl.retrieveGenericResultset(
> > ReadReportingServiceImpl.java:181) ~[classes/:na]
> >         at org.apache.fineract.infrastructure.dataqueries.
> > api.RunreportsApiResource.runReport(RunreportsApiResource.java:121)
> > ~[classes/:na]
> >         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > ~[na:1.8.0_171]
> >         at sun.reflect.NativeMethodAccessorImpl.invoke(
> > NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
> >         at sun.reflect.DelegatingMethodAccessorImpl.invoke(
> > DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
> >         at java.lang.reflect.Method.invoke(Method.java:498)
> > ~[na:1.8.0_171]
> >         at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.
> invoke(
> > JavaMethodInvokerFactory.java:60) ~[jersey-server-1.17.jar:1.17]
> >         at com.sun.jersey.server.impl.model.method.dispatch.
> > AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(
> > AbstractResourceMethodDispatchProvider.java:205)
> > ~[jersey-server-1.17.jar:1.17]
> >
> >
> >
> > On Sat, Jun 9, 2018 at 3:25 PM, Ed Cable <edcable@xxxxxxxxx> wrote:
> >
> >> Emmanuel,
> >>
> >> Please start a new message thread if you have a different support query.
> >> You can do so my creating a new email with a relevant subject line and
> >> sending it to the respective mailing list.
> >>
> >> We need to keep each discussion thread relevant and on-topic. Thank you
> >> for using the mailing lists though!
> >>
> >> Cheers,
> >>
> >> Ed
> >>
> >> On Sat, Jun 9, 2018 at 3:00 AM Emmanuel Njoku <einjoku@xxxxxxxxx>
> wrote:
> >>
> >>> who can assist me on this error message. I obtain this message after
> >>> creation of new Data table mapped to client*.*
> >>>
> >>>
> >>> Jun 09, 2018 10:45:22 AM com.sun.jersey.spi.container.
> ContainerResponse
> >>> mapMappableContainerException
> >>> SEVERE: The RuntimeException could not be mapped to a response,
> >>> re-throwing
> >>> to the HTTP container
> >>> java.lang.NullPointerException
> >>> at
> >>> org.apache.fineract.infrastructure.security.utils.SQLInjecti
> >>> onValidator.validateSQLInput(SQLInjectionValidator.java:36)
> >>> at
> >>> org.apache.fineract.infrastructure.security.utils.ColumnVali
> >>> dator.validateSqlInjection(ColumnValidator.java:95)
> >>> at
> >>> org.apache.fineract.infrastructure.dataqueries.service.ReadW
> >>> riteNonCoreDataServiceImpl.retrieveDataTableGenericResultSet
> >>> (ReadWriteNonCoreDataServiceImpl.java:1190)
> >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>> at
> >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce
> >>> ssorImpl.java:62)
> >>> at
> >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
> >>> thodAccessorImpl.java:43)
> >>> at java.lang.reflect.Method.invoke(Method.java:498)
> >>> at
> >>> org.springframework.aop.support.AopUtils.invokeJoinpointUsin
> >>> gReflection(AopUtils.java:317)
> >>> at
> >>> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
> >>> JdkDynamicAopProxy.java:201)
> >>> at com.sun.proxy.$Proxy148.retrieveDataTableGenericResultSet(Unknown
> >>> Source)
> >>> at
> >>> org.apache.fineract.infrastructure.dataqueries.api.
> >>> DatatablesApiResource.getDatatable(DatatablesApiResource.java:174)
> >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>> at
> >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce
> >>> ssorImpl.java:62)
> >>> at
> >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
> >>> thodAccessorImpl.java:43)
> >>> at java.lang.reflect.Method.invoke(Method.java:498)
> >>> at
> >>> com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invo
> >>> ke(JavaMethodInvokerFactory.java:60)
> >>> at
> >>> com.sun.jersey.server.impl.model.method.dispatch.AbstractRes
> >>> ourceMethodDispatchProvider$TypeOutInvoker._dispatch(Abstr
> >>> actResourceMethodDispatchProvider.java:185)
> >>> at
> >>> com.sun.jersey.server.impl.model.method.dispatch.ResourceJav
> >>> aMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
> >>> at
> >>> com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(
> >>> HttpMethodRule.java:302)
> >>> at
> >>> com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accep
> >>> t(RightHandPathRule.java:147)
> >>> at
> >>> com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accep
> >>> t(ResourceClassRule.java:108)
> >>> at
> >>> com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accep
> >>> t(RightHandPathRule.java:147)
> >>> at
> >>> com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule
> >>> .accept(RootResourceClassesRule.java:84)
> >>> at
> >>> com.sun.jersey.server.impl.application.WebApplicationImpl._h
> >>> andleRequest(WebApplicationImpl.java:1511)
> >>> at
> >>> com.sun.jersey.server.impl.application.WebApplicationImpl._h
> >>> andleRequest(WebApplicationImpl.java:1442)
> >>> at
> >>> com.sun.jersey.server.impl.application.WebApplicationImpl.ha
> >>> ndleRequest(WebApplicationImpl.java:1391)
> >>> at
> >>> com.sun.jersey.server.impl.application.WebApplicationImpl.ha
> >>> ndleRequest(WebApplicationImpl.java:1381)
> >>> at
> >>> com.sun.jersey.spi.container.servlet.WebComponent.service(We
> >>> bComponent.java:416)
> >>> at
> >>> com.sun.jersey.spi.container.servlet.ServletContainer.servic
> >>> e(ServletContainer.java:538)
> >>> at
> >>> com.sun.jersey.spi.container.servlet.ServletContainer.servic
> >>> e(ServletContainer.java:716)
> >>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.internalDoFi
> >>> lter(ApplicationFilterChain.java:303)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.doFilter(App
> >>> licationFilterChain.java:208)
> >>> at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilte
> >>> r.java:52)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.internalDoFi
> >>> lter(ApplicationFilterChain.java:241)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.doFilter(App
> >>> licationFilterChain.java:208)
> >>> at
> >>> org.springframework.security.web.access.intercept.FilterSecu
> >>> rityInterceptor.invoke(FilterSecurityInterceptor.java:108)
> >>> at
> >>> org.springframework.security.web.access.intercept.FilterSecu
> >>> rityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.internalDoFi
> >>> lter(ApplicationFilterChain.java:241)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.doFilter(App
> >>> licationFilterChain.java:208)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:330)
> >>> at
> >>> org.springframework.security.web.access.intercept.FilterSecu
> >>> rityInterceptor.invoke(FilterSecurityInterceptor.java:118)
> >>> at
> >>> org.springframework.security.web.access.intercept.FilterSecu
> >>> rityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.access.ExceptionTranslation
> >>> Filter.doFilter(ExceptionTranslationFilter.java:113)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.authentication.AnonymousAut
> >>> henticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.servletapi.SecurityContextH
> >>> olderAwareRequestFilter.doFilter(SecurityContextHolder
> >>> AwareRequestFilter.java:154)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.apache.fineract.infrastructure.security.filter.TwoFactor
> >>> AuthenticationFilter.doFilter(TwoFactorAuthenticationFilter.java:122)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.context.request.async.WebAs
> >>> yncManagerIntegrationFilter.doFilterInternal(WebAsyncManag
> >>> erIntegrationFilter.java:50)
> >>> at
> >>> org.springframework.web.filter.OncePerRequestFilter.doFilter
> >>> (OncePerRequestFilter.java:107)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.authentication.www.BasicAut
> >>> henticationFilter.doFilter(BasicAuthenticationFilter.java:201)
> >>> at
> >>> org.apache.fineract.infrastructure.security.filter.TenantAwa
> >>> reBasicAuthenticationFilter.doFilter(TenantAwareBasicAuthe
> >>> nticationFilter.java:153)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.context.SecurityContextPers
> >>> istenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.access.channel.ChannelProce
> >>> ssingFilter.doFilter(ChannelProcessingFilter.java:144)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy$VirtualFil
> >>> terChain.doFilter(FilterChainProxy.java:342)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy.doFilterIn
> >>> ternal(FilterChainProxy.java:192)
> >>> at
> >>> org.springframework.security.web.FilterChainProxy.doFilter(F
> >>> ilterChainProxy.java:160)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.internalDoFi
> >>> lter(ApplicationFilterChain.java:241)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.doFilter(App
> >>> licationFilterChain.java:208)
> >>> at
> >>> org.springframework.boot.context.web.ErrorPageFilter.doFilte
> >>> r(ErrorPageFilter.java:108)
> >>> at
> >>> org.springframework.boot.context.web.ErrorPageFilter.access$
> >>> 000(ErrorPageFilter.java:58)
> >>> at
> >>> org.springframework.boot.context.web.ErrorPageFilter$1.doFil
> >>> terInternal(ErrorPageFilter.java:87)
> >>> at
> >>> org.springframework.web.filter.OncePerRequestFilter.doFilter
> >>> (OncePerRequestFilter.java:107)
> >>> at
> >>> org.springframework.boot.context.web.ErrorPageFilter.doFilte
> >>> r(ErrorPageFilter.java:100)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.internalDoFi
> >>> lter(ApplicationFilterChain.java:241)
> >>> at
> >>> org.apache.catalina.core.ApplicationFilterChain.doFilter(App
> >>> licationFilterChain.java:208)
> >>> at
> >>> org.apache.catalina.core.StandardWrapperValve.invoke(Standar
> >>> dWrapperValve.java:219)
> >>> at
> >>> org.apache.catalina.core.StandardContextValve.invoke(Standar
> >>> dContextValve.java:110)
> >>> at
> >>> org.apache.catalina.authenticator.AuthenticatorBase.invoke(A
> >>> uthenticatorBase.java:506)
> >>> at
> >>> org.apache.catalina.core.StandardHostValve.invoke(StandardHo
> >>> stValve.java:169)
> >>> at
> >>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorRepo
> >>> rtValve.java:103)
> >>> at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogVa
> >>> lve.java:962)
> >>> at
> >>> org.apache.catalina.core.StandardEngineValve.invoke(Standard
> >>> EngineValve.java:116)
> >>> at
> >>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAd
> >>> apter.java:445)
> >>> at
> >>> org.apache.coyote.http11.AbstractHttp11Processor.process(Abs
> >>> tractHttp11Processor.java:1115)
> >>> at
> >>> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler
> >>> .process(AbstractProtocol.java:637)
> >>> at
> >>> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(
> >>> JIoEndpoint.java:318)
> >>> at
> >>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool
> >>> Executor.java:1149)
> >>> at
> >>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo
> >>> lExecutor.java:624)
> >>> at
> >>> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.
> >>> run(TaskThread.java:61)
> >>> at java.lang.Thread.run(Thread.java:748)
> >>>
> >>> On Sat, Jun 9, 2018 at 7:20 AM, Raunak Sett <sett.raunak@xxxxxxxxx>
> >>> wrote:
> >>>
> >>> > We should use Angular Material. We should have consistent experience
> >>> > across all platforms and given that we are already following material
> >>> > design guidelines on a lot of our android clients as well as web. So
> it
> >>> > would be easier if we just have a common UI/UX guidelines for the
> >>> > consistency.
> >>> >
> >>> > On Fri, Jun 8, 2018 at 10:13 PM Abhay Chawla <
> abhay.chawla97@xxxxxxxxx
> >>> >
> >>> > wrote:
> >>> >
> >>> >> Hello everyone,
> >>> >>
> >>> >> After some discussion, Anwesh and I have a come up with the
> following
> >>> >> points regarding the decision to use Angular Material or bootswatch
> >>> and
> >>> >> ng-bootstrap for the new MifosX Web App (Angular 6):
> >>> >>
> >>> >> 1) ng-bootstrap is a wrapper over bootstrap.js which contains a set
> of
> >>> >> Angular Directives that can be implemented without any dependencies
> on
> >>> >> jQuery or popper.js  https://ng-bootstrap.github.io/#/home
> >>> >> 2) Bootswatch provides a collection of themes(21 + 1 default) for
> >>> >> Bootstrap  https://github.com/thomaspark/bootswatch/
> >>> >> 3) Bootswatch provides with an API which can be integrated with the
> >>> >> platform for theme configuration easily and provide the
> organizations
> >>> with
> >>> >> a choice from these 21 themes  https://bootswatch.com/api/4.json
> >>> >> 4) We are currently using the bootswatch material theme to compete
> and
> >>> >> provide with a similar kind of look as by angular-material
> >>> >> 5) New themes if required can be configured easily using bootstrap,
> >>> as a
> >>> >> simple example I have created a demonstration here:
> >>> https://abhaychawla.
> >>> >> github.io/angular-theme/
> >>> >> 6) We can also provide instructions so that the organizations will
> be
> >>> >> able to clone the project, create their own custom theme, build the
> >>> app and
> >>> >> use that theme.
> >>> >> 7) Overall, ng-bootstrap and bootswatch built on top of bootstrap
> are
> >>> >> easy to implement and could be modified and used to suit our needs
> >>> >>
> >>> >> 8) On the other hand, angular-material provides with 4 inbuilt
> >>> material
> >>> >> themes to chose from  https://material.angular.io/
> >>> >> 9) More custom themes can be configured according to organizations
> >>> needs
> >>> >> using angular-material as well but it will be a bit more complex
> >>> >> 10) Overall, angular-material will be more time consuming and a
> little
> >>> >> difficult to implement
> >>> >>
> >>> >> We would like to share this with the community and get their opinion
> >>> >> regarding our choice of design framework so that we can finalize the
> >>> same
> >>> >> as soon as possible in the initial stage of the project.
> >>> >>
> >>> >> Looking forward to your responses.
> >>> >>
> >>> >> Thanks
> >>> >> Abhay.
> >>> >>
> >>> >> --
> >>> >> You received this message because you are subscribed to the Google
> >>> Groups
> >>> >> "Mifos Google Summer of Code 2018" group.
> >>> >> To unsubscribe from this group and stop receiving emails from it,
> >>> send an
> >>> >> email to gsoc-2018+unsubscribe@xxxxxxxxx.
> >>> >>
> >>> >
> >>> >
> >>> > --
> >>> > Raunak Sett
> >>> >
> >>> > ------------------------------------------------------------
> >>> > ------------------
> >>> > Check out the vibrant tech community on one of the world's most
> >>> > engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> >>> > Mifos-developer mailing list
> >>> > mifos-developer@xxxxxxxxxxxxxxxxxxxxx
> >>> > Unsubscribe or change settings at:
> >>> > https://lists.sourceforge.net/lists/listinfo/mifos-developer
> >>> >
> >>>
> >>
> >>
> >> --
> >> *Ed Cable*
> >> President/CEO, Mifos Initiative
> >> edcable@xxxxxxxxx | Skype: edcable | Mobile: +1.484.477.8649
> >>
> >> *Collectively Creating a World of 3 Billion Maries | *http://mifos.org
> >> <http://facebook.com/mifos>  <http://www.twitter.com/mifos>
> >>
> >>
> >
>