npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@reaqtive/q

v0.0.0-beta.18

Published

A react library to connect React to the QIX engine and to Qlik Capability APIs

Downloads

3

Readme

@reaqtive/q

This package provides a set of hooks, contexts and components to interact with the Qlik Engine APIs and the Qlik Capability APIs. Its purpose is to simplify the interaction with the engine and provide a set of tested APIs to easily retrieve data and interfaces from the engine. @reaqtive/q does not provide any layout components, it only allows you to interact with the Qlik engine. You can use it as a stand alone package and develop your layout components using its APIs, as described below. Depending on your needs and you can install @reaqtive/components instead. It provides a set of ready to use layout components to build data visualization apps on top o Qlik APIs, and depends on @reaqtive/q.

Installation

npm install @reaqtive/q

PROVIDED FEATURES

REAQTIVE

Reaqtive

Reaqtive is the main component of the library. It provides Reaqtive contexts to its child or children. Contexts allows you to interact with Qlik APIs. To have access to Qlik APIs you have to wrap your main component in a <Reaqtive> tag. Reaqtive allows to connect the same React app to multiple Qlik apps. If you use only the Engine APIs you just have render multiple <Reaqtive> components in your app remembering to set to false the qCapabilityApiRequired prop. Instead, if you want to use also the capability APIs you have to use the QShareCapabilityApi component to avoid to download AngularJS twice. You can find an example here Provided contexts are:

Example:

import React from 'react'
import Reaqtive from '@reaqtive/q'
import {MyComponentWithQGlobal, MyComponentWithQDoc, MyComponentWithQCapabilityApi, MyComponentWithQApp, MyQGenericObject, MyQVariable} from './index'
import {MyRqtvNavbar, MyRqtvListbox, MyRqtvDropdownFilter, MyRqtvButtonBar, MyRqtvModalListbox, MyRqtvSearchField, MyRqtvMultibox, MyQVizExamples, MyRqtvContainerExample,MyRqtvCurrentSelections, MyRqtvSearchObject} from '../components/index'

const MyReaqtiveComponent = props => {
  // This qConfig allows to connect to on Qlik Sense Desktop and open the app called Executive Dashboard
  const qConfig = {                                 //For QS Desktop
      host: 'YOUR HOST ADDRESS',                        //localhost
      secure: true,                                 //false
      port: 443,                                    //4848
      prefix: '',                                   //''
      appId: 'bc1566bc-6299-4d8b-8976-d5b60225ded8'//'8aa3a035-0689-4aab-a920-d6722509ed51' //your app file name (e.g. 'Executive dashboard.qvf')
  };

  return (
    <Reaqtive qConfig={qConfig}>
      {props.children}
      {/*<div className="container">
        <Wrapper>
         <MyRqtvListbox/>
        </Wrapper>
        <Wrapper>
         <MyQVizExamples/>
        </Wrapper>
        <Wrapper>
          <div>...</div>
        </Wrapper>
      </div>*/}
    </Reaqtive>
  )
}

const Wrapper = props => <div style={{marginBottom:'2rem'}}>{props.children}</div>

export default MyReaqtiveComponent

Props:

prop | type | default | required | description ---- | :----: | :-------: | :--------: | ----------- qCapabilityApiRequired | Boolean | true | :x: | if true Reaqtive downloads capability APIs from Qlik server and provides the qlik object and the qApp to its children qConfig | Shape | | :white_check_mark: | qConfig is an object that provides reaqtive the params needed to connect to the Qlik server. params are: host, port, secure, prefix, appId: the id of the app reaqtive should connect to qConfig.appId | String | | :white_check_mark: | appId: the id of the app reaqtive should connect to qConfig.host | String | | :white_check_mark: | host: the ip address or domain of the Qlik SystemProvider qConfig.port | Number | | :white_check_mark: | port: the port on which Qlik server is listening qConfig.prefix | String | | :white_check_mark: | prefix: Qlik's virtual proxy path qConfig.secure | Boolean | | :white_check_mark: | secure: true if the Qlik server uses https, false otherwise

CONTEXTS

QGlobal

QGlobal This context provides a handler for the qGlobal provided by Qlik engine Api. The handler is an object with 3 props: qGlobal: the actual qGlobal provided by the qEngine. It is initially null and it is set when the promis is resolved qError: initially null it is set to true if the promise for the qGlobal returns an error qLoading: initially true, it is set to false when the promise to get the qGlobal is resolved https://help.qlik.com/en-US/sense-developer/February2019/APIs/EngineAPI/index.html

Example:

import React, {useContext} from 'react'
import {QGlobal} from '@reaqtive/q'

const MyComponentWithQGlobal = props => {
  const qGlobalHandler = useContext(QGlobal)
  console.log(qGlobalHandler)
  return(
    /*
      This component must be wrapped by Reaqtive to use the desired context.
      Since contexts are provided as promises you must always check if they are available or still loading using the handler properties
    */
    <div>This comoponent have access to the qGlobal class and call its methods</div>
  )
}

export default MyComponentWithQGlobal

QDoc

QDoc This context provides a handler for the qDoc provided by Qlik engine Api. The handler is an object with 3 props: qDoc: the actual qDoc provided by the qEngine. It is initially null and it is set when the promis is resolved qError: initially null it is set to true if the promise for the qDoc returns an error qLoading: initially true, it is set to false when the promise to get the qDoc is resolved https://help.qlik.com/en-US/sense-developer/February2019/APIs/EngineAPI/index.html

Example:

import React, {useContext} from 'react'
import {QDoc} from '@reaqtive/q'

const MyComponentWithQDoc = props => {
  const qDocHandler = useContext(QDoc)
  console.log(qDocHandler)
  return(
    /*
      This component must be wrapped by Reaqtive to use the desired context.
      Since contexts are provided as promises you must always check if they are available or still loading using the handler properties
    */
    <div>This comoponent have access to the qDoc class and call its methods</div>
  )
}

export default MyComponentWithQDoc

QCapabilityApi

QCapabilityApi This context provides a handler for the qlik object provided by Qlik Capability APIs. The handler is an object with 5 props: qLoadingRequireJS: initially true, it is set to false when the promise to get requireJS is resolved qLoadingQlikJS: initially true, it is set to false when the promise to get qlikJS is resolved qLoadingCss: initially true, it is set to false when the promise to get qlikCSS is resolved qlik: the qlik provided by the qlik Capability APIs. It is initially null and it is set when the promis is resolved qError: initially null it is set to true if one of the promises to load requireJS or the qlik object or the css fails

Example:

import React, {useContext} from 'react'
import {QCapabilityApi} from '@reaqtive/q'

const MyComponentWithQCapabilityApi = props => {
  const qCapabilityApiHandler = useContext(QCapabilityApi)
  console.log(qCapabilityApiHandler)
  return(
    /*
      This component must be wrapped by Reaqtive to use the desired context.
      Since contexts are provided as promises you must always check if they are available or still loading using the handler properties
    */
    <div>This comoponent have access to the  qlik class provided by the qCapabilityApi and call its methods</div>
  )
}

export default MyComponentWithQCapabilityApi

QApp

QApp This context provides a handler for the application (qApp) object provided by Qlik Capability APIs. The handler is an object with 3 props: qLoading: initially true, it is set to false when the promise to get the qApp is resolved qApp: the app provided by the qlik Capability APIs. It is initially null and it is set when the promis is resolved qError: initially null it is set to true if the promise to get the qApp returns an error

Example:

import React, {useContext} from 'react'
import {QApp} from '@reaqtive/q'

const MyComponentWithQApp = props => {
  const qAppHandler = useContext(QApp)
  console.log(qAppHandler)
  return(
    /*
      This component must be wrapped by Reaqtive to use the desired context.
      Since contexts are provided as promises you must always check if they are available or still loading using the handler properties
    */
    <div>This comoponent have access to the qApp class and call its methods</div>
  )
}

export default MyComponentWithQApp

COMPONENTS

QGenericObject

QGenericObject Creates a generic object and provides qObject and qLayout to its clid. It expects only 1 child It attaches an onChange event-listener to the qObject and automatically updates the layout when the event fires. For example it can provide a listobject or a hypercube to its children.

QGenericObject must have one and only one child. The child can be a React element (external layout mode) or a function that returns a React element (inline layout mode).

See the example below for details

Example:

import React from 'react'
import {QGenericObject} from '@reaqtive/q'

const qObjectDef = {
  "qInfo": { "qId": "", "qType": "FieldList" },
  "qFieldListDef": {
    "qShowSystem": false,
    "qShowHidden": false,
    "qShowSemantic": true,
    "qShowSrcTables": true
  }
}

const MyQGenericObject = props => {
  return (
    <div className="row">
      {/*Externallayout mode*/}
      <QGenericObject qObjectDef={qObjectDef}>
        {
         /**
          *You can define the view of your generic object in a separate component that we call Layout as a convention.
          *The Layout will received the interfaces provided by the QGenericObject as props.
          */
        }
        <Layout/>
      </QGenericObject>

      {/*Inline layout mode*/}
      <QGenericObject qObjectDef={qObjectDef}>
        {
          /**
           *You can define the view of your generic object in line using a function.
           *The function accept one argument which is an object that contains all the interfaces provided by the QGenericObject.
           *You will have access to the interfaces in the body of the function.
           */}
        {(qGenericObject)=>{
          console.log('inline layout', qGenericObject)
          return (
            <div className="col-md-6">
              <div>My Generic Object - Inline layout mode</div>
              <div style={{maxHeight:300, overflowY:'auto'}}>
                <ul className="list-group">
                  {
                    qGenericObject.qLayoutHandler.qLayout&&qGenericObject.qLayoutHandler.qLayout.qFieldList.qItems.map(item=>
                      <li key={item.qName} className="list-group-item">{item.qName}</li>
                    )
                  }
                </ul>
              </div>
            </div>
          )
        }}
      </QGenericObject>
    </div>
  )
}

const Layout = props => {
  console.log('external layout', props)
  return (
    <div className="col-md-6">
      <div>My Generic Object - External layout mode</div>
      <div style={{maxHeight:300, overflowY:'auto'}}>
        <ul className="list-group">
          {
            props.qLayoutHandler.qLayout&&props.qLayoutHandler.qLayout.qFieldList.qItems.map(item=>
              <li key={item.qName} className="list-group-item">{item.qName}</li>
            )
          }
        </ul>
      </div>
    </div>
  )
}

export default MyQGenericObject

Props:

prop | type | default | required | description ---- | :----: | :-------: | :--------: | ----------- qObjectDef | Object | | :white_check_mark: | The definition of the qObject. Check the following links for details https://help.qlik.com/en-US/sense-developer/February2019/APIs/EngineAPI/genericobject.html quickSelectionMode | Boolean | true | :x: | If true the object will handle selections using Qlik Sense mode (user will have to accept selections) If set to false the object will handle selections using QlikView mode (selection immediately applied)

QShareCapabilityApi

QShareCapabilityApi

This component is needed when you wan to display in the same React app Qlik Visualizations taken from 2 or more Qlik Sense apps. It wraps the Reaqtive component and provides the QCapabilityAPI context to the components downstream. This work around is needed to avoid to download QCapabilityAPI and AngularJS more than once.

Example:

import React from 'react'
import {QShareCapabilityApi, Reaqtive} from '@reaqtive/q'

const qConfig = {                                 //For QS Desktop
      host: 'YOUR HOST ADDRESS',                        //localhost
      secure: true,                                 //false
      port: 443,                                    //4848
      prefix: '',                                   //''
  };
const app1 = '8aa3a035-0689-4aab-a920-d6722509ed51'
const app2 = '58d7234b-b31c-4f24-b1f8-2c7453e557fa' 

const MySharedCapabilityApis = props =>
<QShareCapabilityApi qConfig={qConfig}>
  <Reaqtive qConfig={...qConfig, appId:app1}>
    ... your components here
  </Reaqtive>
  <Reaqtive qConfig={...qConfig, appId:app2}>
    ... your components here
  </Reaqtive>
</QShareCapabilityApi>

export default MySharedCapabilityApis

Props:

prop | type | default | required | description ---- | :----: | :-------: | :--------: | ----------- qConfig | Shape | | :white_check_mark: | qConfig is an object that provides reaqtive the params needed to connect to the Qlik server. params are: host, port, secure, prefix. appId is not needed in this case since the only purpose of this component is to download Qlik Capability APIs and provide it downstream. qConfig.host | String | | :white_check_mark: | host: the ip address or domain of the Qlik SystemProvider qConfig.port | Number | | :white_check_mark: | port: the port on which Qlik server is listening qConfig.prefix | String | | :white_check_mark: | prefix: Qlik's virtual proxy path qConfig.secure | Boolean | | :white_check_mark: | secure: true if the Qlik server uses https, false otherwise

QVariable

QVariable It provides a variable and its layout to its child. It automatically aupdate layout everytime the variable is updated by the engine calculations.

QVariable must have one and only one child. The child can be a React element (external layout mode) or a function that returns a React element (inline layout mode).

See the example below for details

Example:

import React from 'react'
import {QVariable} from '@reaqtive/q'

const MyQVariable = props => {
  const variableName = 'MonthNames';
  return(
    <div className="row">
      {/*Inline layout*/}
      <QVariable variableName={variableName}>
        {(qVariable)=>{
            console.log('variable', qVariable)
            return (
              <div className="col-md-6">
                <div>
                  <span>MyVariable name is: </span>
                  <span>{variableName}</span>
                </div>
                <span>MyVariable value is: </span>
                {qVariable.qLayoutHandler.qLayout&&<span>{qVariable.qLayoutHandler.qLayout.qText}</span>}
              </div>
            )
          }
        }
      </QVariable>
      {/*External layout*/}
      <QVariable variableName={variableName}>
        <Layout variableName={variableName}/>
      </QVariable>
    </div>
  )
}

const Layout = props =>
<div className="col-md-6">
  <div>
    <span>MyVariable name is: </span>
    <span>{props.variableName}</span>
  </div>
  <div>
    <span>MyVariable value is: </span>
    {props.qLayoutHandler.qLayout&&
      <span>{props.qLayoutHandler.qLayout.qText}</span>
    }
  </div>
</div>
export default MyQVariable

Props:

prop | type | default | required | description ---- | :----: | :-------: | :--------: | ----------- variableId | String | | :x: | The id of the variable. It must not be provided if variableName is provided variableName | String | | :x: | The name of the variable. It must not be provided if variableId is provided

HOOKS

useQFieldReducer

Description

a hook to retrieve a field from qDoc. if provided a defaulta value it selecte the value when it mounts and set the field to always one selected if isAlwaysOneSelected is set to true

Params

param | type | default value | required | description ---- | :----: | :-------: | :--------: | ----------- qFieldName | string | | :white_check_mark: | the name of the field qState | string | | :x: | the the alternate state the field will be linked to isAlwaysOneSelected | boolean | | :x: | flag to set isAlwaysOneSelected defaultValue | string | | :x: | the defaultValue to be selected before setting isAlwaysOneSelected to true resetOnUnmount | boolean | | :x: | if set to true it set isAlwaysOneSelected to false when unmount

Returns

It returns a qfieldHandler: the handler of the qlik field

name | type | description ---- | :----: | ------- qLoading | boolean| if true the the handler is still waiting for response from the qlik server qError | boolean| if true there was an error retrieving the qField from the engine qField | object| the object returned from the server to interact with the field

useQLayoutReducer

Description

a hook to create and retrieve a the layout of a qObject (tested with generic objects and variables)

Params

param | type | default value | required | description ---- | :----: | :-------: | :--------: | ----------- qObjectHandler | qObjectHandler | | :white_check_mark: | the handler retrieved by useQObjectReducer qSelectionHandler | qSelectionHandler | | :x: | the handler that manages the selection state of the generic object, it is not needed if the qObject does not have a selection state to handle

Returns

It returns a qLayoutHandler: the handler of the qLayout

name | type | description ---- | :----: | ------- qLoading | boolean| if true the the handler is still waiting for response from the qlik server qError | boolean| if true there was an error retrieving the qLayout from the engine qLayout | object| the object returned from the server which contains the layout returned from the qlik server setLayoutUpdater | function| a method that accept a function that can be defined inside the view using the layout. by default the layout updater is qObject.getLayout(). it could be useful to change the layout updater when the generic object is in selecting mode applyQLayoutPatch | function| a function that allow to change the shape of the layout from the view. it is inteneded to be used when the qDisplayArea changes: the view asks the server for a new data page and the apply the patch to the already existing layout

useQObjectReducer

Description

a hook to create and retrieve a generic object from the qlik engine

Params

param | type | default value | required | description ---- | :----: | :-------: | :--------: | ----------- qObjectDef | qObjectDef | | :white_check_mark: | The object that tells to the qlik engine what object you want

Returns

It returns a qObjectHandler: the handler of the newly created object

name | type | description ---- | :----: | ------- qLoading | boolean| if true the the handler is still waiting for response from the qlik server qError | boolean| if true there was an error retrieving the qObject from the engine qObject | object| the object returned from the server reloadObject | function| a method to ask the qlik engine to recalculate the qObject shouldUpdate | boolean| a boolean variable which is set to true when the object is recalculated and you should ask the engine fro the layou (e.g. after selections) setShouldUpdate | function| a function to clean up the shouldupdate property after the needed effects have run

useQVariableReducer

Description

hook to retrieve a variable already available in the qDoc

Params

param | type | default value | required | description ---- | :----: | :-------: | :--------: | ----------- id | string | | :white_check_mark: | the name or id of the variable idType | string |name | :x: | tells to the variable reducer whether to use the name or id to retrieve the variable

Returns

It returns a qVariableHandler: the handler of the variable

name | type | description ---- | :----: | ------- qLoading | boolean| if true the the handler is still waiting for response from the qlik server qError | boolean| if true there was an error retrieving the qVariable from the engine qVariable | object| the object returned from the server to interact with the variable shouldUpdate | boolean| a boolean variable which is set to true when the object is recalculated and you should ask the engine fro the layou (e.g. after selections) setShouldUpdate | function| a function to clean up the shouldupdate property after the needed effects have run

useQVizHandler

Description

a hook to retrieve a variable already available in the qDoc

Params

param | type | default value | required | description ---- | :----: | :-------: | :--------: | ----------- qApp | object | | :white_check_mark: | the qApp object provided by the qApp context id | string | | :x: | if id is defined and chartProps are not, the useQVizHandler will ask for an already existing viz to the qApp chartProps | object | | :x: | if the chartProps is defined the useQVizHandler will create the visualization on the fly not considering an eventually provided id

Returns

It returns a qVizHandler: - handler to interact with the visualization retrieved from the qApp

name | type | description ---- | :----: | ------- qVizLoading | boolean| if true the the handler is still waiting for response from the qlik server qViz | object| the interface to interact with the visualization (e.g. to export it in excel, to resize it, etc.)