--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/3a7092a8-a24c-4e5a-925d-ea426566561d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/54a3ffe7-6766-4741-8f8c-9f945c46d305%40googlegroups.com.
UiBinder: Would need a rewrite to use APT. I guess no one has looked into it yet. One main issue is that APT won't get triggered when updating resources (*.ui.xml)
So the absolute safest solution is to use JsInterop + any JavaScript framework. If that framework uses HTML templates then you still have that UiBinder feeling. You are not required to use Angular, but its a nice fit. The next best solution is probably GQuery and/or Elemento but you should expect some refactor work.
-- J.
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/d92e7eec-fe04-48fa-ba9a-bcf4c5ed5620%40googlegroups.com.
Yeah. The conundrum for me is that I'm addicted to the pure-JVM unit testing/debugging that MVP gives you.
The important thing is to keep an open mind, not trying to force JS frameworks into our current best practices, and willingness to be inspired by the best practices of the chosen JS framework.Our best practices has emerged from the constraints of GWT, and those constraints has just changed.
My worry about "just pick a mainstream JS framework and use it via JSInterop" is that if you're a) coupled to a JS environment for unit testing and b) interfacing with a framework that is inherently dynamic/untyped, what's the benefit of using GWT in the first place?
Well the hope is that someone will step in and port existing js libraries to gwt 3 or create new one ? See vaadin sencha etc .. We will def port our ext js wrapper to gwt3
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/342561ff-64da-4e7a-aec4-6e9b84846f09%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAGw%3D_ty7rjFQmUZhYv95aQBj8KgwSKcGk0nEyUkdTd4upBNtdA%40mail.gmail.com.
On Sunday, 15 November 2015 15:37:29 UTC, Stephen Haberman wrote:My worry about "just pick a mainstream JS framework and use it via JSInterop" is that if you're a) coupled to a JS environment for unit testing and b) interfacing with a framework that is inherently dynamic/untyped, what's the benefit of using GWT in the first place?And this for me sums up GWTs main issues going forward. The benefit before was that existing Java devs could use GWT to work on all the layers of an application. GWT 3 will force (not a bad thing) Java devs to use JavaScript for their views and will also force them to deal with integrating JS and Java code.
At this point, you have to ask 'Why bother with Java/GWT at all' - switch the full application to pure JS.
For existing large projects, switching to GWT 3 is almost a non-starter as there will be far too much existing view code to convert over so they will have to stick with the GWT 2 stream and hope that it remains well supported. This is the situation my company face with one of our products.So GWT 3 is not ideal for new projects and doesn't help with existing projects. Where is it's market?
Thanks for all the feedback. But it does not put my mind at rest right now.It would have been much better if GWT 2.8 would have provided at least the basis for the future of GUI development - because that was one of its main selling points for me.I understand why element/widget/uibinder are going away, but right now there is no low-level alternative that would allow a less painful migration later on.I am not expecting a 100% backward compatibility with 3.0, but at least some certainty that the code rewrites will be limited or easy, if we restrain from using certain technologies. The only certainty we have right now is that GWT 3.0 will compile Java into JavaScript, and all the rest will change or will just disappear assuming that there will be 3rd party extensions.If GWT does not offer a basis for widget and UI development then there will be multiple incompatible GUI libraries or frameworks that will make it difficult to mix.
I could take the approach of JsInterop with AngularJS, but Angular 2,x is also not going to offer backward compatibility. So I solve one problem and end up with another one.I guess I will be trying UiBinder with GQuery and not rely on Widget for my project. The UiBinder might disappear, but we are using mostly plain HTML and Bootstrap styles. So we are only interested in binding events. The UiBinder templates will be easy to migrate later on.Any idea what is going on with Singular ? Is it also abandoned or will it finally appear after GWT 2.8 is final ?
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/02a9f89b-1420-4289-be10-f8094decdfe7%40googlegroups.com.
On Monday, November 16, 2015 at 11:29:14 AM UTC+1, Robert Stone wrote:
On Sunday, 15 November 2015 15:37:29 UTC, Stephen Haberman wrote:My worry about "just pick a mainstream JS framework and use it via JSInterop" is that if you're a) coupled to a JS environment for unit testing and b) interfacing with a framework that is inherently dynamic/untyped, what's the benefit of using GWT in the first place?And this for me sums up GWTs main issues going forward. The benefit before was that existing Java devs could use GWT to work on all the layers of an application. GWT 3 will force (not a bad thing) Java devs to use JavaScript for their views and will also force them to deal with integrating JS and Java code.I think Vaadin and Julien Dramaix showed during the last months how you can use GWT to create Web Components (through Polymer), so no J2CL or GWT 3 won't "force Java devs to use JavaScript for their views".As for "forc[ing] them to deal with integrating JS and Java code", it shouldn't be much different from the current situation dealing with Element and NativeEvent (com.google.gwt.dom.*), Storage, Geolocation, etc. and Elemental 2 (to be released shortly after 2.8 AFAIK) should help bridging this gap.
At this point, you have to ask 'Why bother with Java/GWT at all' - switch the full application to pure JS.If you have the luxury to "switch the full application" to another stack (i.e. "big rewrite") and you have devs whose JS skills are comparable to their (or the other team's) Java skills, then why not?
For existing large projects, switching to GWT 3 is almost a non-starter as there will be far too much existing view code to convert over so they will have to stick with the GWT 2 stream and hope that it remains well supported. This is the situation my company face with one of our products.So GWT 3 is not ideal for new projects and doesn't help with existing projects. Where is it's market?I think Google is increasingly building "hybrid apps" where they want/need to share "business code" between several platforms rather than rewrite the same thing in 3 languages: server, web client, android, and iOS. Server and Android can be coded right in Java, GWT will bring the shared Java code to the web client (where the UI could be written in JS, as is the case for “Inbox by Gmail” or Google Spreadsheets), and J2ObjC will bring that code to iOS (that's actually exactly the pitch in the J2ObjC homepage introduction: http://j2objc.org/).So GWT becomes more about "sharing/integrating Java with JS" than "using Java instead of JS".But keep in mind that there still are apps at Google that use widgets (Google Groups, where I'm writing this, to begin with), and Google likely won't maintain J2CL and the GWT compiler in parallel (at least not for long) so they'll have to find a migration path for their apps: either rewrite their UI in JS (Closure), or make widgets J2CL-compatible, or something in between (rewrite the UI without widgets, but still in Java, using Web Components or some new widgets library).
On Monday, November 16, 2015 at 1:28:16 PM UTC+1, stuckagain wrote:Thanks for all the feedback. But it does not put my mind at rest right now.It would have been much better if GWT 2.8 would have provided at least the basis for the future of GUI development - because that was one of its main selling points for me.I understand why element/widget/uibinder are going away, but right now there is no low-level alternative that would allow a less painful migration later on.I am not expecting a 100% backward compatibility with 3.0, but at least some certainty that the code rewrites will be limited or easy, if we restrain from using certain technologies. The only certainty we have right now is that GWT 3.0 will compile Java into JavaScript, and all the rest will change or will just disappear assuming that there will be 3rd party extensions.If GWT does not offer a basis for widget and UI development then there will be multiple incompatible GUI libraries or frameworks that will make it difficult to mix.Web Components to the rescue?As I just wrote above, Web Components can be written in Java with JsInterop, and can be consumed quite easily with GWT too (whether the component was written with GWT or not).I know that answer won't satisfies you as you have to deal with ancient IEs, but Google has no such need, and has, over the past year(s?), expressed its will to simply stop supporting them in GWT altogether (Vaadin and Sencha were those asking for keeping support in); so they won't invest in such backwards-compatibility (I'm talking about browser here).
I'm not talking about a re-write here, I'm talking about new projects. For new projects, I can't see a compelling reason for picking GWT, if the devs are going to have to understand JS to use GWT then it is better to invest up front time in getting them familiar enough with JS to use it for the whole project. This is the decision we have taken in my organization.
I guess I will be trying UiBinder with GQuery and not rely on Widget for my project. The UiBinder might disappear, but we are using mostly plain HTML and Bootstrap styles. So we are only interested in binding events. The UiBinder templates will be easy to migrate later on.
Any idea what is going on with Singular ? Is it also abandoned or will it finally appear after GWT 2.8 is final ?--On Mon, Nov 16, 2015 at 12:10 PM, Alain Ekambi <jazzma...@gmail.com> wrote:Well the hope is that someone will step in and port existing js libraries to gwt 3 or create new one ? See vaadin sencha etc .. We will def port our ext js wrapper to gwt3
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAGw%3D_ty7rjFQmUZhYv95aQBj8KgwSKcGk0nEyUkdTd4upBNtdA%40mail.gmail.com.On 16 Nov 2015 11:29, "Robert Stone" <rob.a...@gmail.com> wrote:----
On Sunday, 15 November 2015 15:37:29 UTC, Stephen Haberman wrote:My worry about "just pick a mainstream JS framework and use it via JSInterop" is that if you're a) coupled to a JS environment for unit testing and b) interfacing with a framework that is inherently dynamic/untyped, what's the benefit of using GWT in the first place?And this for me sums up GWTs main issues going forward. The benefit before was that existing Java devs could use GWT to work on all the layers of an application. GWT 3 will force (not a bad thing) Java devs to use JavaScript for their views and will also force them to deal with integrating JS and Java code. At this point, you have to ask 'Why bother with Java/GWT at all' - switch the full application to pure JS.For existing large projects, switching to GWT 3 is almost a non-starter as there will be far too much existing view code to convert over so they will have to stick with the GWT 2 stream and hope that it remains well supported. This is the situation my company face with one of our products.So GWT 3 is not ideal for new projects and doesn't help with existing projects. Where is it's market?
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/342561ff-64da-4e7a-aec4-6e9b84846f09%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CABrJHW2uZjj_BAdr8WZJCN%2BQX_p91zvUxE%2BTMBa%3DZpjijaDRyA%40mail.gmail.com.
Errai UI ?
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CANnRKuW3FS6EcB4cP6wyfrv_Ozuj9T%2Bgh3cLf%2BM%2Bi2tLQxS4Yg%40mail.gmail.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAGw%3D_twBmnjAwHT_%2BfkWSRyA6yDMxg7x91koxH6m%2BdL%3DchuKUg%40mail.gmail.com.
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/d03c7beb-f1ff-46ac-873c-5ad1b13a4438%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAPVRV7fXyXkij3C0fH%2Bgbd%3DO2z6FrrT%2BJtLKC-D_P-f3qamhmA%40mail.gmail.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAN%3DyUA1zSRm-wxacCtHfmgCu9%3DV4et3dogQUPr5L5wKyyFPBoA%40mail.gmail.com.
This is very good question and actually one of the biggest problem not only in this particular situation but also in general software development.
Imagine you decide to build something large like ERP or Banking Information system for an example (with hundreds even thousands of tables and forms) You didn’t even finish it because of its complexity and one day you find out that Swing or Angular1 or Flex or “something else” come to its end of living and you are not able to switch easily to anything else?
I happened to me once long time ago with some other widget library, so I am talking from the personal experience :-(
I will try to explain our strategy how to solve this problem:
We are using GWT and we are really enjoying to use it but:
We are not using WindowBuilder (it’s not supported anymore since version GWT 2.6 and it’s also useless when you are creating large application because it’s to slow), not using UIBinder because it generates to much boilerplate that we do not need at all, not using Request Factory that generates who knows what, not using MVP… nothing that is too specific or bound too much for the platform. The only thing that we use and is specific is Code Splitting but it’s totally hidden from developers and done automatically for each controller. We are not using any external library to do this. It’s simple to implement and it would be probably easy to replace it with something else tomorrow. Everything is done with a single annotation.
GWT-RPC may also disappear? We are using JPA classes (with Hibernate) but we don’t use DTOs because there is simply no need to pack and unpack everything. We do not write code for every document we need to save (create, update, delete), there is only ONE class that is doing the job via GWT-RPC. Exceptions are rare (less than 10%) that you have to do something special while persisting the document and you are able to do that as a custom business logic that executes in the same transaction. Current implementation is GWT-RPC based, but when we decide to change this, it can be done in a single day (probably in couple of hours) because its’ ONE class and not hundreds/thousands of classes that we have to change. We are not afraid of changes when someone decide to stop supporting GWT-RPC or it’s suddenly surprisingly proven that it is prone to vulnerabilities. We have less than 10 services to change and note that we are dealing with >650 forms/JPA classes in this moment. All custom actions go via ONE custom action service, we do not create 100 services because it is used in 100 controllers.
About UI: We are using something that I call “meta description approach” for UI. Describe you fields, views and forms on technology agnostic way including events. Your views should only describe the view, you should never see any TextBox or any other concrete widget in your code. Use interfaces in your controller and never use concrete GWT/GXT/GwtBootstrap widget. Current implementation is GXT 3 based but there is also ongoing GwtBootstrap 3 version that works equally well but it looks (much) better but that is personal opinion. You can even mix this libraries. In GwtBootstrap version you can create fields as widgets or you can use Bootstrap HTML and CSS, even jQuery JavaScript that sometimes comes with it, from any source and bind existing tag like this one:
<input class="form-control" type="text" placeholder="User name" id="name">
to your meta field named “name”. The beauty of this is that you can do it even without any compile, it will simply work instantly. You do not need to add any annotations or even write any controller code if there is no need for it. We have a youtube movie that proves this: https://www.youtube.com/watch?v=ROZ5Oa6DoUg
No widgets anymore? Ok, let’s rework engine not to use widgets and implement new version of your metafields that is using Elemental2, JsInetrop2 or whatever it is called today/tomorrow. You do this on engine level and nothing changes in your views, controllers or model. You like GXT, and they decide to do this? Great, make your new implementation in the meta platform engine to use GXT5(?) and you are ready to go. You like Vaadin webcomponent gwtpolymer ? GwtMaterial ? … Add this to the engine/platform. You do not need to change your controller, model, or view code because of this. Don’t want to use Bootstrap templates any more, and you want to use some other templates instead? When all mappings, field properties and events are in meta descriptions it would be much easier to replace it comparing to dealing with concrete widgets. When you think “meta way”, you are not bound to concrete technology and that is the way we decide to go.
I am not concerned about the future, I am prepared for the changes this time.
Hope this helps.
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/72e2237e-12b7-4e3f-8537-7536212089a9%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CABrJHW0f1Zr9toH9ZGpmU7FiAYuHZM89yn_z1wWqB5j4%3D62%3DBg%40mail.gmail.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAFHJR8Wpeq1HqUG8OsGfxgcLqnnXwtgAmNh-ig5bm%2BwYkv4q1Q%40mail.gmail.com.
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/9bebcf1f-96a0-41de-91ac-150c192cc581%40googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CABrJHW2%3DXVz00WfwniVwqmTuCJ69HfnSKyxxYt_LC-RCo-ENqg%40mail.gmail.com.
--
You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/432020a6-7b7d-4c94-96c6-a397b59be007%40googlegroups.com.
<app
ref = "root"
title = "Hi"
data =
{
// The one button uses postIncrement++ so we start its count at 1
one: 1,
// The two button uses ++preIncrement, so we start its count at 0
two: 0,
text: ""
}
class = .{
.cls{
background-color: #011151;
}
.cls .btn {
background-color: #010931;
color: white;
}
}
>
<box
size = ( 300 * (()->150 + 10 * $root.data.one) )
align = center
>
<button ref="one" text="Button 1" class="btn button1" onClick=e-> {
$one.setText("You clicked one " + $root.data.one++ + " times");
} />
<button ref="two" text="Button 2" class="btn button2" onClick=e-> {
$two.setText("You clicked two " + ++$root.data.two + " times");
} />
</box>
<box align = center>
<button text="Close" onClick=System.exit(0) />
</box>
</app>
<define-tag
name = "Point"
tagName = "wti-point"
model =
@Extend("HasAuthors")
@Import("de.mocra.cy.shared.model.*")
{
lines: @Many // Ensures treatment of field as List-Type.
IntTo.class.$generic(ModelText.class),
title: String.class,
hasLinks: public boolean hasLinks(){
return getLines().hasMatch(t->t.allText().hasMatch(TextNode::isLink));
}
}
api = [
public String getTitle() {
return $model.getTitle();
}
,
public $Self setTitle(String text) {
$model.setTitle(text);
return this;
}
]
impl =
@Import({
"de.mocra.cy.shared.ast.WtiParser",
"de.mocra.cy.shared.css.HasWtiStyle",
"de.mocra.cy.shared.css.WtiStyle"
})
[
private HasWtiStyle resources;, // ugh;, semicolon comma on purpose. , is for json array parser
// Either make it a statement w/ semi-colon, or use (parens)
public HasWtiStyle getResources() {
return resources;
},
public WtiStyle getStyle() {
return resources.css();
},
public $Self ui() {
return this;
}
]
ui =
<box>
<if notNull=$model.title>
<wti-title ref="title">$model::title</wti-title>
</if>
<for allOf=$model.lines as=text>
// setting the model directly is the cue for the generator
// that this is going to be an ElementWithModel that has a .fromModel method.
<wti-text model=text style=getResources() />
</for>
</box>
/define-tag>
package xapi.fu.out;
@Generate(
in = {
<var name = "max"
default = 5 />,
<var name = "types"
default = ["Type", "Int", "Long", "Double", "Bool"] />
},
out = {
<loop
from = 1
to = $max
var = "size"
>
<generateInterface
var = {
typeParams :
$range(1, $size, $i->`O$i`),
wrappedParams :
$range(1, $size, $i->`Out1<O$i>`)
}
template =
@Import({
"xapi.fu.HasOutput",
"xapi.fu.Rethrowable",
"xapi.fu.Lambda"
})
public interface Out$size <$typeParams>
extends HasOutput, Rethrowable, Lambda {
Immutable$size <$wrappedParams> outAll();
@unfold(from = 1, to = $size, var = "n")
default O$n out$n(){
return out$nProvider().out1();
}
@unfold(from = 1, to = $size, var = "n")
default Out1<O$n> out$nProvider(){
return outAll().out$n();
}
@unfold(from = 1, to = $size, var = "n")
default Out$size<$typeParams> read$n(In1<O$n> callback){
callback.in(out$n());
return this;
}
@unfold(from = 1, to = $size, var = "n")
@var(
name = "outParams",
value = $range(1, $size, $p ->
$p == $n ? "To" : `O$p`)
)
default <To> Out$size<$outParams> mapped$n(In1Out1<O$n, To> mapper){
return Out.out3(
$range(1, $size, $p ->
$p == $n ? mapper.supplyDeferred(out$pProvider()) : out$pProvider()
)
);
}
@unfold(from = 1, to = $size, var = "n")
default <To> Out$size<$typeParams> spy$n(In1<O$n> callback){
return
$if($size == 1, $print(()->{
O1 out = out1();
callback.in(out);
return out;
}))
.$else(
Out.out$size(
$range(1, $size, $p ->
$p == $n ? out$pProvider().spy1(callback) : out$pProvider()
)
)
);
}
}
/generateInterface>
</loop>,
<loop
from = 1
to = 3
var = "size">
<var name = "asPrimitive"
value = {
Type:"O$n",
Int:"int",
Long:"long",
Double:"double",
Bool:"boolean"
} />,
<var name = "asObject"
value = {
Type:"O$n",
Int: "Integer",
Long: "Long",
Double: "Double",
Bool: "Boolean"
} />
</loop>
})
public class Out {
}
Wow that looks too weird for me to see any value in it :D