botbuilder-dialogs-adaptive
Version:
Rule system for the Microsoft BotBuilder dialog system.
162 lines • 7.13 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EditArray = exports.ArrayChangeType = void 0;
const adaptive_expressions_1 = require("adaptive-expressions");
const botbuilder_dialogs_1 = require("botbuilder-dialogs");
var ArrayChangeType;
(function (ArrayChangeType) {
ArrayChangeType["push"] = "push";
ArrayChangeType["pop"] = "pop";
ArrayChangeType["take"] = "take";
ArrayChangeType["remove"] = "remove";
ArrayChangeType["clear"] = "clear";
})(ArrayChangeType = exports.ArrayChangeType || (exports.ArrayChangeType = {}));
/**
* Lets you modify an array in memory.
*/
class EditArray extends botbuilder_dialogs_1.Dialog {
/**
* Initializes a new instance of the [EditArray](xref:botbuilder-dialogs-adaptive.EditArray) class.
*
* @param changeType Optional. [ArrayChangeType](xref:botbuilder-dialogs-adaptive.ArrayChangeType), change type.
* @param itemsProperty Optional. Array property.
* @param value Optional. Value to insert.
* @param resultProperty Optional. Output property to put Pop/Take into.
*/
constructor(changeType, itemsProperty, value, resultProperty) {
super();
/**
* Type of change being applied.
*/
this.changeType = new adaptive_expressions_1.EnumExpression(ArrayChangeType.push);
if (changeType) {
this.changeType = new adaptive_expressions_1.EnumExpression(changeType);
}
if (itemsProperty) {
this.itemsProperty = new adaptive_expressions_1.StringExpression(itemsProperty);
}
switch (changeType) {
case ArrayChangeType.clear:
case ArrayChangeType.pop:
case ArrayChangeType.take:
this.resultProperty = new adaptive_expressions_1.StringExpression(resultProperty);
break;
case ArrayChangeType.push:
case ArrayChangeType.remove:
this.value = new adaptive_expressions_1.ValueExpression(value);
break;
default:
break;
}
}
/**
* @param property The key of the conditional selector configuration.
* @returns The converter for the selector configuration.
*/
getConverter(property) {
switch (property) {
case 'changeType':
return new adaptive_expressions_1.EnumExpressionConverter(ArrayChangeType);
case 'itemsProperty':
return new adaptive_expressions_1.StringExpressionConverter();
case 'resultProperty':
return new adaptive_expressions_1.StringExpressionConverter();
case 'value':
return new adaptive_expressions_1.ValueExpressionConverter();
case 'disabled':
return new adaptive_expressions_1.BoolExpressionConverter();
default:
return super.getConverter(property);
}
}
/**
* Starts a new [Dialog](xref:botbuilder-dialogs.Dialog) and pushes it onto the dialog stack.
*
* @param dc The [DialogContext](xref:botbuilder-dialogs.DialogContext) for the current turn of conversation.
* @param _options Optional. Initial information to pass to the dialog.
* @returns A `Promise` representing the asynchronous operation.
*/
beginDialog(dc, _options) {
return __awaiter(this, void 0, void 0, function* () {
if (this.disabled && this.disabled.getValue(dc.state)) {
return yield dc.endDialog();
}
if (!this.itemsProperty) {
throw new Error(`EditArray: "${this.changeType.toString()}" operation couldn't be performed because the itemsProperty wasn't specified.`);
}
// Get list and ensure populated
let list = dc.state.getValue(this.itemsProperty.getValue(dc.state), []);
// Manipulate list
let result;
let evaluationResult;
switch (this.changeType.getValue(dc.state)) {
case ArrayChangeType.pop:
result = list.pop();
break;
case ArrayChangeType.push:
this.ensureValue();
evaluationResult = this.value.getValue(dc.state);
if (evaluationResult != undefined) {
list.push(evaluationResult);
}
break;
case ArrayChangeType.take:
result = list.shift();
break;
case ArrayChangeType.remove:
this.ensureValue();
evaluationResult = this.value.getValue(dc.state);
if (evaluationResult != undefined) {
result = false;
for (let i = 0; i < list.length; i++) {
if (JSON.stringify(evaluationResult) == JSON.stringify(list[i]) ||
evaluationResult === list[i]) {
list.splice(i, 1);
result = true;
break;
}
}
}
break;
case ArrayChangeType.clear:
result = list.length > 0;
list = [];
break;
}
// Save list and last result
dc.state.setValue(this.itemsProperty.getValue(dc.state), list);
if (this.resultProperty) {
dc.state.setValue(this.resultProperty.getValue(dc.state), result);
}
return yield dc.endDialog();
});
}
/**
* @protected
* Builds the compute Id for the [Dialog](xref:botbuilder-dialogs.Dialog).
* @returns A `string` representing the compute Id.
*/
onComputeId() {
return `EditArray[${this.changeType.toString()}: ${this.itemsProperty.toString()}]`;
}
/**
* @private
*/
ensureValue() {
if (!this.value) {
throw new Error(`EditArray: "${this.changeType.toString()}" operation couldn't be performed for list "${this.itemsProperty}" because a value wasn't specified.`);
}
}
}
exports.EditArray = EditArray;
EditArray.$kind = 'Microsoft.EditArray';
//# sourceMappingURL=editArray.js.map