@reaqtive/q
Version:
A react library to connect React to the QIX engine and to Qlik Capability APIs
259 lines (217 loc) • 8.21 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _qDoc = require("../contexts/q-doc");
var _layout = require("@reaqtive/layout");
/**
* @typedef {object} triggerState - the object returned by useQLayoutReducer
* @property {boolean} qLoading - if true the the handler is still waiting for response from the qlik server
* @property {boolean} qError - if true there was an error retrieving the qLayout from the engine
* @property {boolean} done - all triggers have been fired with no errors
*/
/**
* @typedef {function} hook
* @type {function}
*/
/**
*@typedef {object} trigger
*@type{object}
*@property {string} type - the type of the trigger
*@property {object} params - the params accepted by the specific trigger type
*/
/**
*@typedef {object} selectFieldValue
*@property {string} fieldName - the name of the field to select
*@property {string} value - the exact value to be selected
*@property {boolean} alwaysOneSelected - if true the field will be set to alwaysOneSelected after the value has been selected
*/
/**
*@typedef {object} selectFieldValues
*@property {string} fieldName - the name of the field to select
*@property {object[]} value - the exact value to be selected
*/
/**
*@typedef {object} value
*@property {string} qText - the name of the field to select
*@property {boolean} qIsNumeric - true if the value to be selected is a number
*@property {number} qNumber - the number to be selected
*/
/**
*@function useTrigger
*@description a hook to handle triggers and send specific command to the engine. Currently only field selections are supported
*@kind hook
*@param {trigger[]} triggers - the qApp object provided by the qApp context
*@return {triggerState} qVizHandler - return the handler to interact with the visualization retrieved from the qApp
*/
const useTriggers = triggers => {
///////////////////////////////////////////////////////////////
// handle state
///////////////////////////////////////////////////////////////
const _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
done = _useState2[0],
setDone = _useState2[1];
const _useState3 = (0, _react.useState)(true),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
qLoading = _useState4[0],
setQLoading = _useState4[1];
const _useState5 = (0, _react.useState)(false),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
qError = _useState6[0],
setQError = _useState6[1];
const _useState7 = (0, _react.useState)(false),
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
progress = _useState8[0],
setProgress = _useState8[1];
const qDocHandler = (0, _react.useContext)(_qDoc.QDoc);
const triggersMemo = (0, _layout.useDeepCompareMemo)(triggers);
(0, _react.useEffect)(() => {
if (triggersMemo && triggersMemo.length === 0 || progress === (triggersMemo && triggersMemo.length)) {
setDone(true);
setQLoading(false);
}
return () => {
if (qLoading === false) {
setDone(false);
setQLoading(true);
setProgress(false);
}
};
}, [progress, triggersMemo]);
(0, _react.useEffect)(() => {
if (qDocHandler.qDoc && triggersMemo && triggersMemo.length > 0 && qLoading === true) {
triggersMemo && triggersMemo.forEach(trigger => fire(trigger));
}
return () => {
qDocHandler.qDoc && triggersMemo && triggersMemo.length > 0 && triggersMemo.forEach(trigger => {
if (trigger.type === 'fieldSelection' && trigger.params.alwaysOneSelected === true) {
removeAlwaysOneSelected(trigger.params);
}
});
};
}, [qDocHandler, triggersMemo, qLoading]); ///////////////////////////////////////////////////////////////
// fire the right trigger
///////////////////////////////////////////////////////////////
const fire = trigger => {
if (qError === false) switch (trigger.type) {
case 'fieldSelection':
trigger.params && selectFieldValue(trigger.params);
trigger.params && setProgress(progress => progress + 1);
break;
case 'fieldSelections':
trigger.params && selectFieldValues(trigger.params);
trigger.params && setProgress(progress => progress + 1);
break;
case 'clearField':
trigger.params && clearField(trigger.params);
trigger.params && setProgress(progress => progress + 1);
break;
default:
console.log('unkown trigger type', trigger.type);
setQLoading(false);
}
}; ///////////////////////////////////////////////////////////////
// select field single and multiple values triggers
///////////////////////////////////////////////////////////////
const selectFieldValue = async params => {
if (params !== undefined) {
const field = await getField(qDocHandler.qDoc, params);
if (field !== undefined) {
const selected = await select(field, params);
const triggerDone = params.alwaysOneSelected ? await setNxProps(field, true) : true;
}
}
};
const removeAlwaysOneSelected = async params => {
if (params !== undefined) {
const field = await getField(params);
if (field !== undefined) {
const removed = await setNxProps(field, false);
}
} //console.log(field, removed)
};
const selectFieldValues = async params => {
if (params !== undefined) {
const field = await getField(qDocHandler.qDoc, params);
if (field !== undefined) {
const valuesSelected = await selectValues(field, params);
return valuesSelected instanceof Error ? false : true;
}
}
};
const clearField = async params => {
if (params !== undefined) {
const field = await getField(qDocHandler.qDoc, params);
if (field !== undefined) {
const clearedField = field.clear();
return clearedField instanceof Error ? false : true;
}
}
}; ///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
// return trigger state
///////////////////////////////////////////////////////////////
return {
done,
qLoading,
qError
};
};
const getField = async (qDoc, params) => {
if (params !== undefined && qDoc !== null) {
try {
const field = await qDoc.getField(params.fieldName);
return field;
} catch (err) {
// if(process.env!=='production'){
// const message = `Reaqtive: error getting field ${params.fieldName}, check fieldName spelling`;
// throw new Error(message)
// }
console.log('error getting trigger field', err);
}
}
};
const select = async (field, params) => {
try {
const selected = field !== undefined && field.select(params.value);
return selected;
} catch (err) {
console.log('error selecting trigger value', err);
}
};
const setNxProps = async (field, nxPropsValue) => {
try {
const setNxPropsDone = field !== undefined && field.setNxProperties({
"qOneAndOnlyOne": nxPropsValue
});
return setNxPropsDone;
} catch (err) {
console.log('error setting alwaysOneSelected in trigger', err);
}
};
const selectValues = async (field, params) => {
try {
const selected = field !== undefined && field.selectValues(params.values);
return selected;
} catch (err) {
console.log('error selecting trigger value', err);
return err;
}
};
const clearField = async field => {
try {
const cleared = (await field) && field.clear();
return cleared;
} catch (err) {
console.log('error clearing field in trigger', err);
return err;
}
};
var _default = useTriggers;
exports.default = _default;