OK, so on re-read I totally misunderstood the question :P. If you write your
own maven project you could put the scripts under
src/main/resources/toserve/extjs (per your Boot example setting up
ResourceServer). No need to hack on the lift module itself.

Derek

On Wed, Aug 5, 2009 at 4:23 AM, Derek Chen-Becker <dchenbec...@gmail.com>wrote:

> Your guess is correct. The jquery-ui-min.js contains the datePicker. We
> used to use datePicker.js but then we switched to the datePicker that's in
> jquery UI.
>
> As for your question about where to put the scripts, you don't want to put
> them in src/main/resources/toserve unless you're writing a widget or some
> other programmatic user of the scripts. If you'll just be using the scripts
> directly in your templates you can just put them in the normal
> src/main/webapp tree (I usually make a scripts subdir to segregate things).
> Let me know if that doesn't work or if I'm misunderstanding the question.
>
> Derek
>
>
> On Tue, Aug 4, 2009 at 5:47 PM, Stefan Scott 
> <stefanscottal...@gmail.com>wrote:
>
>>
>> Thanks for this info, Marius.
>>
>> To get started with Lift I'm reading through the excellent book
>> "Exploring Lift" you wrote with Eric and Tyler (version 27 July 2009),
>> plus the source for the PocketChange app and liftweb, downloaded from
>> GitHub.
>>
>> As I'm still finding my way through the various packages and file
>> locations, I hope you can bear with me a bit while I think out loud
>> here to make sure I understand where to put the .js files and the
>> references for JavaScript resources which aren't integrated into
>> lift.
>>
>>
>> ***********************************************************
>> The only real question I have is way down towards the end of this
>> message, at the end of point (a):
>>
>> "Where do I put the 'toserve' directory, and how do I make sure that
>> Maven uses it?"
>>
>> Feel free to skip most of this lengthy message and just read point (a)
>> which is the only real question I have. I'm still just getting used to
>> Maven and how it pulls files from various locations either locally or
>> online.
>>
>> ***********************************************************
>>
>>
>> (1) Searching in directory C:\www\work\PocketChange\ (I'm currently
>> serving lift web apps just locally, running Jetty under Windows), I
>> see several .js files for JQuery:
>>
>> date.js
>> jquery.datePicker.js
>> jquery.tablesorter.min.js
>> jquery-ui.min.js
>>
>> in directory:
>>
>> C:\www\work\PocketChange\src\main\webapp\scripts\
>>
>> So it looks like I could put any needed .js files in that directory.
>>
>>
>> Searching for the string ".js" *inside* all .html files in directory C:
>> \www\work\PocketChange, I find the file:
>>
>> C:\www\work\PocketChange\src\main\webapp\index.html
>>
>> which contains the tag:
>>
>> <script type="text/javascript" src="/scripts/jquery-ui.min.js"></
>> script>
>>
>> referencing the file:
>>
>> jquery-ui.min.js
>>
>> in directory C:\www\work\PocketChange\src\main\webapp\scripts\ above.
>>
>>
>> So again it looks like I can put any needed .js files in that
>> directory, and reference them in the app's .html file(s) as shown
>> above.
>>
>> (One strange minor thing I noticed: if I search inside all .html files
>> in directory C:\www\work\PocketChange\ for the string "datePicker.js",
>> it only shows up in lines that have been commented out. So one minor
>> curiosity I have is: how is the code for datePicker.js being used?
>> There appears to be a definition of it in jquery-ui.min.js, as well as
>> a more readable definition of it in datePicker.js as well. I
>> understand that JavaScript files are "minified" to remove unnecessary
>> characters - does jquery-ui.min.js include the "minified" version of
>> datePicker? Is file datePicker.js never sent to the browser?)
>>
>>
>> (2) The search for the string ".js" inside all .html files also turned
>> up two occurences in file:
>>
>> C:\www\work\PocketChange\src\main\webapp\templates-hidden\default.html
>>
>> in the tags:
>>
>> <script id="jquery" src="/classpath/jquery.js" type="text/
>> javascript"></script>
>> <script id="json" src="/classpath/json.js" type="text/javascript"></
>> script>
>>
>> These seem to be referring not to individual JavaScript widgets - but
>> maybe to entire JavaScript libraries.
>>
>> I couldn't find any relevant files called "jquery.js" on my machine -
>> but reading section 7.8 "Resource Server" in the "Exploring Lift" book
>> (pp. 119-120) I see it says that Maven puts .css (and presumably .js)
>> resources to be served *inside* the WAR/JAR file, and lift uses the
>> var LiftRules.resourceServerPath:
>>
>> var resourceServerPath = "classpath"
>>
>> to find these resources.
>>
>>
>> The book goes on to say that in order to find a .css resource in a
>> subdirectory such as:
>>
>> <my-project>\src\main\resources\toserve\css\mystyle.css
>>
>> I would call the following in Boot:
>>
>> ResourceServer.allow {
>>  case "css" :: _ => true
>> }
>>
>>
>> So, examining the lift source code for object ResourceServer in
>> package net.liftweb.http (in directory ...\liftweb\lift\src\main\scala
>> \net\liftweb\http\), I think I see how this is all put together:
>>
>> object ResourceServer {
>>  private var allowedPaths: PartialFunction[List[String], Boolean] = {
>>    case "jquery.js" :: Nil => true
>>    case "yui" :: _ => true
>>    case "liftYUI.js" :: Nil => true
>>    case "json2.js" :: Nil => true
>>    case "json.js" :: Nil => true
>>    case "jlift.js" :: Nil => true
>>    case bp @ ("blueprint" :: _) if bp.last.endsWith(".css") ||
>> bp.last.endsWith(".png") => true
>>    case "jquery-autocomplete" :: "jquery.autocomplete.js" :: Nil =>
>> true
>>    case "jquery-autocomplete" :: "jquery.autocomplete.css" :: Nil =>
>> true
>>    case "jquery-autocomplete" :: "indicator.gif" :: Nil => true
>>  }
>>
>> //...
>>
>>  var baseResourceLocation = "toserve"
>>
>> //...
>>
>>  def allow(path: PartialFunction[List[String], Boolean]) {
>>    allowedPaths = path orElse allowedPaths
>>  }
>>
>> }
>>
>> Looking at the lift source from GitHub, I see that there are 6
>> subdirectories and files:
>>
>> blueprint\
>> yui\
>> jlift.js
>> jquery-1.3.2.js
>> json2.js
>> liftYUI.js
>>
>> (the JavaScript base libraries?), in directory:
>>
>> ...\liftweb\lift\src\main\resources\toserve\
>>
>> These correspond to the first 6 clauses in the case statement in
>> object ResourceServer.
>>
>> (I can see that the wildcard in "yui" :: _ and "blueprint" :: _
>> represents possible further Strings in the List, indicating that these
>> are *subdirectories* - versus *files* which are indicated by a one-
>> element List such as "jquery.js" :: Nil.)
>>
>>
>> And looking at the source for PocketChangeApp also from GitHub, I
>> already saw that there are JavaScript files:
>>
>> date.js
>> jquery.datePicker.js
>> jquery.tablesorter.min.js
>> jquery-ui.min.js
>>
>> (for individual widgets?) in directory:
>>
>> ...\PocketChange\src\main\webapp\scripts\
>>
>> so this is where the JavaScript for any individual widgets would go.
>>
>>
>>
>> So this is my overall plan:
>>
>>
>> (a) Following the instructions here:
>>
>> http://extjs.com/learn/Ext_Getting_Started
>>
>> or on page 20 of the book "Practical Ext JS Projects with Gears" from
>> Apress by Frank Zammetti, I would reference the additional libraries
>> by modifying the suggested tags:
>>
>> <script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></
>> script>
>> <script type="text/javascript" src="extjs/ext-all.js"></script> <!--
>> or my choice of files -->
>>
>> to read something like:
>>
>> <script type="text/javascript" src="classpath/ext-base.js"></script>
>> <script type="text/javascript" src="classpath/ext-all.js"></script>
>> <!-- or my choice of files -->
>>
>> and putting these tags in the file:
>>
>> <my-project>\src\main\webapp\templates-hidden\default.html
>>
>> and placing the JavaScript libraries themselves in the toserve
>> directory described on page 120 of "Exploring Lift".
>>
>> Now here's where I have a question...
>>
>> ************************* QUESTION *************************
>>
>> Which of 2 possible toserve directories below should I put the .js
>> files in?
>>
>> <my-project>\src\main\resources\toserve\
>> or
>> ...\liftweb\lift\src\main\resources\toserve\
>>
>> I'm concerned that lift will search only in its own toserve directory:
>>
>> ...\liftweb\lift\src\main\resources\toserve\
>>
>> Should I put additional files in there? Can I?
>>
>> On the one hand, I'm not sure if I *should* put any additional files
>> in the liftweb project - and from my understanding of how Maven works
>> online (reading dependencies in the project's pom.xml file), I'm not
>> sure if I even *can*.
>>
>> As far as I know, Maven running in online mode gets liftweb from
>> liftweb.net online - so I don't think I even can add a file to the
>> directory:
>>
>> ...\liftweb\lift\src\main\resources\toserve\
>>
>> because I don't want to add anything on GitHub (I'm far from being a
>> committer!) and I don't understand how I could create a local copy of
>> lift for Maven to use and add things to that local copy.
>>
>>
>> If I add a JavaScript file to a directory in my *project*:
>>
>> <my-project>\src\main\resources\toserve\
>>
>> then will ResourceServer.allow look in there? Somehow I don't think so
>> - I think it looks in *liftweb's* directory:
>>
>> ...\liftweb\lift\src\main\resources\toserve\
>>
>>
>> I guess a third possibility might be downloading the liftweb source
>> from GitHub, adding any additional JavaScript libraries to the local
>> copy of the liftweb directory which I'm assuming ResourceServer always
>> looks in:
>>
>> ...\liftweb\lift\src\main\resources\toserve\
>>
>> (ie, the directory belonging to the liftweb project, not to my
>> project), and then running Maven in offline mode (so it won't pull
>> updates from liftweb.net), or maybe modifying the pom.xml for my
>> project only for the liftweb dependency, to instruct Maven to use the
>> local, augmented copy of liftweb rather than the online one from
>> liftweb.net.
>>
>> But maybe I'm making things more complicated than they need to be here
>> - so this is the question where I could use some additional help:
>>
>> >>> Where do I put the toserve directory, and how do I make sure that
>> Maven uses it? <<<
>>
>> ************************************************************
>>
>> Continuing...
>>
>> (b) I would reference .js files for individual JavaScript widgets in
>> specific .html files as needed, say:
>>
>> <my-project>\src\main\webapp\index.html
>>
>> and place them in the directory:
>>
>> <my-project>\src\main\webapp\scripts\
>>
>>
>> (c) As Marius stated above (and as I now see in section 8.2 "JQuery
>> and other JavaScript frameworks" in "Exploring Lift", page 129), I
>> would implement the trait net.liftweb.http.js.JsArtifacts in a class
>> like ExtJsArtifacts and then reference it in Boot.
>>
>> This trait net.liftweb.http.js.JsArtifacts has method signature:
>>
>>  def toggle(id: String): JsExp
>>  def hide(id: String): JsExp
>>  def show(id: String): JsExp
>>  def showAndFocus(id: String): JsExp
>>  def serialize(id: String): JsExp
>>  def setHtml(id: String, xml: NodeSeq): JsCmd
>>  def onLoad(cmd: JsCmd): JsCmd
>>  def ajax(data: AjaxInfo): String
>>  def comet(data: AjaxInfo): String
>>  def jsonStringify(in: JsExp) : JsExp
>>  def formToJSON(formId: String): JsExp
>>
>> and it looks straightforward to use
>> net.liftweb.http.js.jquery.JQueryArtifacts and
>> net.liftweb.http.js.yui.YUIArtifacts as "models" for implementing
>> something like net.liftweb.http.js.extjs.ExtJsArtifacts.
>>
>>
>> (d) In Boot, I would do the following:
>>
>> import net.liftweb.http.js.extjs.ExtJSArtifacts
>>
>> class Boot {
>>
>>  def boot = {
>>  //...
>>  LiftRules.jsArtifacts = ExtJSArtifacts
>>  //...
>>  }
>>
>>  //...
>>
>>  ResourceServer.allow {
>>    case "css" :: _ => true
>>    case "extjs" :: _ => true
>>  }
>> }
>>
>> as explained on pages 120 and 129 of "Exploring Lift".
>>
>> The code in ResourceServer.allow above assumes creating a directory
>> extjs under toserve.
>>
>> Again, as mentioned in (a) above, I'm not sure if toserve would be
>> placed in a local copy of liftweb which I can somehow force Maven to
>> use:
>>
>> ...\liftweb\lift\src\main\resources\toserve\
>>
>> or if I should create a toserve directory inside my project and tell
>> lift to look there:
>>
>> <my-project>\src\main\resources\toserve\
>>
>>
>> Sorry this has been so long-winded - as I learn more about lift, I'll
>> feel more comfortable saying less rather than more in these messages.
>> Right now I'm erring on the side of spelling everything out, to make
>> sure I'm not getting anything wrong.
>>
>> Thanks for pointing me in the right direction!
>>
>>
>>
>> On Aug 4, 11:16 am, Stefan Scott <stefanscottal...@gmail.com> wrote:
>> > Thanks, your instructions sound very straightforward.
>> >
>> > On Aug 4, 11:00 am, "marius d." <marius.dan...@gmail.com> wrote:
>> >
>> >
>> >
>> > > To make lift work with ExtJS you need to implement
>> > > net.liftweb.http.js.JsArtifacts trait and provide your implementation
>> > > in boot such as:
>> >
>> > > LiftRules.jsArtifacts = YourImplementationOfJsArtifacts
>> >
>> > > of course on top of this you would likely need to have specific .js
>> > > files. take a look on the current implementations for JQuery and YUI
>> > > to get an idea and get the ball rolling. Of course if you run into
>> > > problems, just post on this list.
>> >
>> > > Br's,
>> > > Marius
>> >
>> > > On Aug 4, 4:44 pm, Stefan Scott <stefanscottal...@gmail.com> wrote:
>> >
>> > > > I understand Lift works well with various Ajax frameworks such as
>> YUI
>> > > > and JQuery, and I really like the "rich internet application" (RIA)
>> > > > look-and-feel provided by the Ajax framework ExtJShttp://extjs.com,
>> > > > which currently is dual-licensed (commercial or GPL).
>> >
>> > > > I was wondering if it's possible / advisable to use ExtJS with Lift
>> -
>> > > > and if so, how I would get started using ExtJS with Lift?
>> >
>> > > > Thanks.
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to