-*- outline -*-

* Core RERL

** Add a clean argument to shutdown server/backend

** Multithreading

Need to think about how the multiple threads interact better.

We should serialize the processing of requests coming to a session.

Locking at many places could use a read-write lock.

** Actions

After calling callbacks in the action-dispatcher, we always save
the backtracked places, but most of the time it's a waste. Add a
parameter to make-callback that controls this?

** Encoding

There are too many and too arbitrary things to control encoding
(as string external format): APPLICATION.CHARSET, the ENCODING
generic, (EXTERNAL-FORMAT-FOR :HTTP), EXTERNAL-FORMAT slot in
HTTPD-RESPONSE, others?

** AJAX

Currently the result of ajax requests travel back as xml. But probably
it would yield a more compatible and flexible result if the ajax
communication were based on some form of js rpc. Then there were two
kind of results: 1) text/javascript, which when evaluated yields the
result of the call; and 2) text/html, encoding some html fragment.

But then how could we return back multiple dirty components, the
multiple dom node replacements that travel currently in the
DOM-REPLACEMENTS xml tag?

It's not that simple as wrapping it in a DIV and enumerating the child
nodes: e.g. a TR my not appear in a DIV...

** File uploading

While this currently works it's very rudimentary and could use some
thought.

* Component Library

** Tree Component

provide support for viewing dynamically generated collapsable trees.

** Grib/Table Component

** Area Maps

This is a simple matter of being able to put ucw:action attributes on
map tags.

** Cleanup, seperated and publish octane.

standard-component-class should be split. the functionality that
handles the component (and bracktracked?) slots should be cut into a
standalone metaclass, so that it's usable without the other stuff
component provides/requires (most importantly that the instantiation
of standard-component requires a bound request context).

** Web Components:

you define a component of type web-component (as opposed to
standard-component-class). this causes a url (probably the name of the
class) to be published. the entry-point on on this url calls an action
on the component. (web-component can have request or session scope. in
the later case a new component will be created for each session (when
the first action is called) and resued.

web components must be creatable via (make-instance component-type).

it would be nice, though not required, if web component would also
produce readable links (instead of using the action parameter).

** Nobody uses active-components and attached-components. remove them.

* Documentation

** Write HOW-TOs

- Write a simple UCW Application

- Create your own Component

- Write a Web Menus - Navigation bars, tabbed panes and containers

- Validate an Input Field

* rename the presentation's render method to present

* document all the exported symbols

* This is a _really_ nice way to create a componnet and its nested components:

(capi:define-interface login-dialog ()
   ()
   (:panes
    (user capi:text-input-pane
          :text ""
          :callback-type :interface
          :callback 'exit-login-dialog)
    (pass capi:password-pane
          :text ""
          :callback-type :interface
          :callback 'exit-login-dialog)
    (ok capi:push-button
        :text "Login" :data 'login
        :callback 'exit-login-dialog)
    (cancel capi:push-button
            :text "Cancel" :data 'cancel
            :callback 'capi:abort-dialog))
   (:layouts
    (main capi:column-layout '(input-pane-layout buttons))
    (input-pane-layout capi:grid-layout
                       '("Username:" user
                         "Password:" pass))
    (buttons capi:row-layout '(ok cancel)))
   (:default-initargs
    :title "Login"
    :min-width 256))

which in a ucw syntax would be:

(define-component login-dialog ()
  ()
  (:panes
   ;; this sholud translate into a shared-initialize :after, panes
   ;; would be visibli to the init forms of other panes
   (username text-field :size 10)
   (password password-field :size 10)
   (ok submit-button :text "Ok" :action #'try-login)
   (cancel submit-button :text "Cancel" :action (lambda (c) (ok c nil))))
  (:layout grid-layout ;; we need to write a grid-layout component which uses div to spread out the fields
   '(("Username:" username)
     ("Password:" password)))
  (:default-initargs))

   
* when we have mime data:

in order to keep mime stuff and non mime stuff as similar as possible we'll do this:

1) when we get a mime post we put associate the body with the nome in
   the request params as normal. we'll add a function GET-MIME-INFO
   which, given the name of the parameter, returns the mime headers.

* live-updating form values

we have the accessor, we have the forms, we have a way to generate
actions and callbacks, how hard can it be to automatically pass the
form values to the server when they change? (easy).

what's harder is passing new values from the server to the client.

* URLS

1) drop the entry point stuff and replace it with a url mapping.

   also read: http://hop.inria.fr/usr/local/share/hop/weblets/home/articles/hop-kit/article.html#Requests-to-Responses

   basicalyl each application has a list of urls -> (web-method).
   based on the url we call a particular method on an instance of a
   particular class. (nb: this will require all entry points to become
   start methods on task-components).

   whenever we see an :action (foo bar baz) and we have FOO defined a
   web method we write out the url according to the same mapping whcih
   converts urls to web-methods.

   ex:

   we have a mapping from: /article/YEAR/MONTH to (view-article YEAR MONTH)

   whenevr we have an action like (view-article foo bar) we spit out
   the corresponding url. (instead of our s=...&f=...&a=... gunk.

