Child pages
  • Foundset property type

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejs
titleBrowser side provided property content in model
myFoundset: {
    serverSize: 44, // the size of the foundset on server (so not necessarily the total record count
                    // in case of large DB tables)
    viewPort: {
        // this is the data you need to have loaded on client (just request what you need via provided
        // loadRecordsAsync or loadExtraRecordsAsync)
        startIndex: 15,
        size: 5,
        rows: [ { _svyRowId: 'someRowIdHASH1', name: "Bubu", type: 2 },
                { _svyRowId: 'someRowIdHASH2', name: "Ranger", type: 1 },
                { _svyRowId: 'someRowIdHASH3', name: "Yogy", type: 2 },
                { _svyRowId: 'someRowIdHASH4', name: "Birdy", type: 3 },
                { _svyRowId: 'someRowIdHASH5', name: "Wolfy", type: 4 } ]
    },
    selectedRowIndexes: [16], // array of selected records in foundset; indexes can be out of current
                              // viewPort as well
    multiSelect: false, // the multiselect mode of the server's foundset; if this is false,
                        // selectedRowIndexes can only have one item in it
    hasMoreRows: false, // if the foundset is large and on server-side only part of it is loaded (so
                        // there are records in the foundset beyond 'serverSize') this is set to true;
                        // in this way you know you can load records even after 'serverSize' (requesting
                        // viewport to load records at index serverSize-1 or greater will load more
                        // records in the foundset)
    columnFormats: { name: (...), type: (...) }, // columnFormats is only present if you specify
                        // "provideColumnFormats": true inside the .spec file for this foundset property;
                        // it gives the default column formatting that Servoy would normally use for
                        // each column of the viewport - which you can then also use in the browser yourself

    /**
     * Request a change of viewport bounds from the server; the requested data will be loaded
     * asynchronously in 'viewPort'
     *
     * @param startIndex the index that you request the first record in "viewPort.rows" to have in
     *                   the real foundset (so the beginning of the viewPort).
     * @param size the number of records to load in viewPort.
     */
    loadRecordsAsync: function(startIndex, size),

    /**
     * Request more records for your viewPort; if the argument is positive more records will be
     * loaded at the end of the 'viewPort', when negative more records will be loaded at the beginning
     * of the 'viewPort' - asynchronously.
     *
     * @param negativeOrPositiveCount the number of records to extend the viewPort.rows with before or
     *                                after the current loaded records.
     */
    loadExtraRecordsAsync: function(negativeOrPositiveCount),
 
    /**
     * Sort the foundset by the dataproviders/columns containedidentified inby sortColumns.
The  name property can be*
     * The name property of each sortColumn can be filled with the dataprovider name the foundset provides
or specifies, or if the foundset* isor specifies. If the foundset is * used with a component type (like ain portaltable-view) then the name is the
name   of the component* name of the component on who's *first ondataprovider whichproperty the sort should happen on. If the foundset
  *   * is used *with @param {JSONArray} sortColumns an array of JSONObjects {name:dataprovider, direction:sortDirection},another foundset-linked property type (dataprovider/tagstring linked to foundsets) then
     * the name you should give in the sortColumn is that property's 'idForFoundset' value (for example a
   where the sortDirection* canrecord be "asc" or "desc".
     */
    sort: function(sortColumns),'dataprovider' property linked to the foundset will be an array of values representing the
     * viewport, but /**it will also have a 'idForFoundset' *prop. Requestthat acan selectionbe changeused offor thesorting selectedin rowthis indexescall).
Returns a promise that is resolved*
      * when@param the{JSONArray} clientsortColumns receivesan thearray updatedof selectionJSONObjects from{ thename server. If successful, the array: dataprovider_id,
     * selectedRowIndexes will also be updated. If the server does not allow the selection change,      *direction the: rejectsortDirection function}, willwhere getthe calledsortDirection withcan the 'old' selection as parameterbe "asc" or "desc".
      */
     * If requestSelectionUpdate is called a second time, before the first call is resolved, thesort: function(sortColumns),
 
    /**
     * firstRequest calla willselection bechange rejected andof the callerselected willrow receiveindexes. theReturns stringa 'canceled'promise asthat theis valueresolved
     * forwhen the parameterclient serverRows.receives the updated selection from the * E.g.: foundset.requestSelectionUpdate([2,3,4]).then(function(serverRows){},function(serverRows){});server. If successful, the array
     */ selectedRowIndexes will also be requestSelectionUpdateupdated. : function(selectedRowIdxs),
 
    /**If the server does not allow the selection change,
     * Sets the preferredreject viewport size on the server for this foundset, so that the next (initial) loadfunction will get called with the 'old' selection as parameter. 
     *
     * willIf giverequestSelectionUpdate backis thatcalled viewport.a Usesecond thistime, whenbefore the componentfirst resizescall itselfis and doesn't know initiallyresolved, the
     * first call *will whatbe itrejected canand show before hand.the caller will receive the string 'canceled' as the value
     */ for the parameter serverRows.
     setPreferredViewportSize: function(size)

}

 

...

serverSize is controlled by the server; you should not change it

...

* E.g.: foundset.requestSelectionUpdate([2,3,4]).then(function(serverRows){},function(serverRows){});
     */
    requestSelectionUpdate : function(selectedRowIdxs),
 
    /**
     * Sets the preferred viewport size on the server for this foundset, so that the next (initial) load
     * will give back that viewport. Use this when the component resizes itself and doesn't know initially 
     * what it can show before hand.
     */
    setPreferredViewportSize: function(size)

}

 

  • serverSize is controlled by the server; you should not change it

  • viewPort initially has size 0, and startIndex 0. When the component detects that records are available (serverSize > 0) it care request viewPort contents using one of the two load async methods
    • viewPort.startIndex and viewPort.size will have the values requested by the async load methods. But if for example you are using data at the end of the foundset and records are deleted from there then viewport.size will be corrected/decreased from server (as there aren't enough records). A similar thing can happen to viewPort.startIndex. Do not modify these directly as that will have no effect. Use the load async methods instead.
    • viewPort.rows contains the viewPort data. Each item of the array represents data from a server-side record. Each item will always contain a "_svyRowId" ($foundsetTypeConstants.ROW_ID_COL_KEY in angular world) entry that uniquely identifies the record on server. Then there's one entry for every dataprovider that the component needs to use (how those are selected is described below). You should never change the "_svyRowId" entry, but it is possible to change the values of any of the other entries - the new values will be pushed back into the server side record that they belong to (if pushToServer is set on the foundset property to allow/shallow or deep; see "Data synchronization" section of https://wiki.servoy.com/display/public/DOCS/Specification).
  • selectedRowIndexes is an array of selected foundset record indexes. This can get updated by the server if foundset selection changes server side. You can change the contents of this array to change foundset selection (new selection will be pushed to server). However, the preferred way of changing the record selection is by using "requestSelectionUpdate".
  • multiselect represents the foundset multiselect state; do not change it as it will not be pushed to server.
  • columnFormats represents the default column formats for the columns given in the viewport; do not change this - only server pushes this information to the client if asked to do so by the .spec file. It is only present if you specify "provideColumnFormats": true inside the .spec file for this foundset property.
  • hasMoreRows true if the server side foundset has loaded only a part/chunk of it's records (in case of very large foundsets). In that case there are records even after 'serverSize'.  It is controlled and updated by the server; you should not change it.

...

Examples of foundset aware types are 'component', 'dataprovider', 'tagstring'.

.spec file

One child component linked to the foundset:

Code Block
languagejs
"myFoundset": "foundset",
"childElement" : { "type" : "component", "forFoundset": "myFoundset" }

...

Have a look at 'component' page to see how these two properties above will look like in browser js.

 

'Configuration' object for sending several "foundset aware" types as viewPorts (Note: the

 

'Configuration' object for sending other "foundset aware" types as viewPorts follows. In this case the value of those properties - so for example 'myconfigurations[0].mydataprovider' or 'myconfiguration.mydataprovider' will be arrays representing the foundset's viewport, not simple values. If the property is really linked to the record (so not global/form variables but record DP/column) then it will get a special 'idForFoundset' value - for example 'myconfiguration.mydataprovider.idForFoundset' - in it as well; that can be used with the foundset property's sort API. (Note: that "forFoundset" usage for "dataprovider" and "tagstring" types is not yet implemented in first 8.0 public alpha, but it is implemented in first public beta):does not yet allow changing the value, but there is a case for making that work)

Code Block
languagejs
"myFoundset": "foundset",
"myconfiguration": "MyConfig", // or:
"myconfigurations": "MyConfig[]"
(...)
"types": {
    "MyConfig": { 
        "mydataprovider" : { "type" : "dataprovider", "forFoundset": "myFoundset"}
        "mytagstring" : { "type" : "tagstring", "forFoundset": "myFoundset"}
    }
}

...