lisichatbot 1.4.8 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/index.js +256 -3
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -198,6 +198,13 @@ function updateEditIcons() {
|
|
|
198
198
|
const stepData = flowData.flow[stepNumber];
|
|
199
199
|
const hasInput = stepData && !!stepData.input;
|
|
200
200
|
|
|
201
|
+
// ✅ NEW: Check if edit is disabled for this step
|
|
202
|
+
if (stepData && stepData.disableEdit === true) {
|
|
203
|
+
editIcon.style.setProperty('display', 'none', 'important');
|
|
204
|
+
console.log(` 🚫 Step ${stepNumber}: Icon HIDDEN (edit disabled)`);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
201
208
|
if (chatState.completed) {
|
|
202
209
|
editIcon.style.setProperty('display', 'none', 'important');
|
|
203
210
|
console.log(` 🏁 Step ${stepNumber}: Icon HIDDEN (flow completed)`);
|
|
@@ -279,6 +286,10 @@ function renderMultiSelectDropdown(options, field) {
|
|
|
279
286
|
optionTemplate.remove();
|
|
280
287
|
tagTemplate.remove();
|
|
281
288
|
|
|
289
|
+
// ✅ NEW: Hide dropdown options wrapper initially
|
|
290
|
+
optionsWrapper.style.display = 'none';
|
|
291
|
+
console.log(' 🙈 Dropdown options wrapper hidden initially');
|
|
292
|
+
|
|
282
293
|
// ✅ Get existing data for pre-filling (edit mode)
|
|
283
294
|
const existingData = chatState.data[field] || [];
|
|
284
295
|
const selectedValues = new Set(existingData);
|
|
@@ -1210,6 +1221,23 @@ function handleCustomSelectClick(element, field, customConfig) {
|
|
|
1210
1221
|
chatState.currentSelection = { field, value, name: optionName };
|
|
1211
1222
|
console.log(' ✅ Regular option selected:', value);
|
|
1212
1223
|
enableNextButton();
|
|
1224
|
+
|
|
1225
|
+
// ✅ NEW: Check if auto-advance is enabled for regular options (not custom)
|
|
1226
|
+
const currentStep = flowData.flow[chatState.step];
|
|
1227
|
+
if (currentStep.autoAdvance === true) {
|
|
1228
|
+
console.log(' ⚡ Auto-advance enabled - proceeding to next step');
|
|
1229
|
+
|
|
1230
|
+
// Add a small delay for visual feedback
|
|
1231
|
+
const delay = currentStep.autoAdvanceDelay || 500;
|
|
1232
|
+
console.log(` ⏱️ Waiting ${delay}ms before advancing`);
|
|
1233
|
+
|
|
1234
|
+
setTimeout(() => {
|
|
1235
|
+
if (elements.nextBtn && !elements.nextBtn.disabled) {
|
|
1236
|
+
console.log(' ▶️ Auto-advancing to next step');
|
|
1237
|
+
handleNext();
|
|
1238
|
+
}
|
|
1239
|
+
}, delay);
|
|
1240
|
+
}
|
|
1213
1241
|
}
|
|
1214
1242
|
}
|
|
1215
1243
|
|
|
@@ -1643,6 +1671,23 @@ function handleOptionClick(element, field, isSingleSelect, options) {
|
|
|
1643
1671
|
chatState.currentSelection = { field, value, name: optionName };
|
|
1644
1672
|
|
|
1645
1673
|
enableNextButton();
|
|
1674
|
+
|
|
1675
|
+
// ✅ NEW: Check if auto-advance is enabled
|
|
1676
|
+
const currentStep = flowData.flow[chatState.step];
|
|
1677
|
+
if (currentStep.autoAdvance === true) {
|
|
1678
|
+
console.log(' ⚡ Auto-advance enabled - proceeding to next step');
|
|
1679
|
+
|
|
1680
|
+
// Add a small delay for visual feedback
|
|
1681
|
+
const delay = currentStep.autoAdvanceDelay || 500;
|
|
1682
|
+
console.log(` ⏱️ Waiting ${delay}ms before advancing`);
|
|
1683
|
+
|
|
1684
|
+
setTimeout(() => {
|
|
1685
|
+
if (elements.nextBtn && !elements.nextBtn.disabled) {
|
|
1686
|
+
console.log(' ▶️ Auto-advancing to next step');
|
|
1687
|
+
handleNext();
|
|
1688
|
+
}
|
|
1689
|
+
}, delay);
|
|
1690
|
+
}
|
|
1646
1691
|
}
|
|
1647
1692
|
|
|
1648
1693
|
} else {
|
|
@@ -1838,11 +1883,113 @@ async function handleNext() {
|
|
|
1838
1883
|
if (currentStep.onNext) {
|
|
1839
1884
|
try {
|
|
1840
1885
|
disableNextButton();
|
|
1841
|
-
const
|
|
1886
|
+
const result = await currentStep.onNext(
|
|
1842
1887
|
chatState.currentSelection ? chatState.currentSelection.value : null,
|
|
1843
1888
|
chatState.data
|
|
1844
1889
|
);
|
|
1845
1890
|
|
|
1891
|
+
// ✅ NEW: Check if onNext wants to display a message in chat
|
|
1892
|
+
if (result && typeof result === 'object' && result.showMessage) {
|
|
1893
|
+
console.log('💬 onNext displaying message:', result.showMessage);
|
|
1894
|
+
addMessage(result.showMessage, 'bot', false, null);
|
|
1895
|
+
scrollToBottom();
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
// ✅ NEW: Check if onNext returned data to update next step
|
|
1899
|
+
if (result && typeof result === 'object' && result.updateNextStep) {
|
|
1900
|
+
console.log('📝 onNext returned data to update next step:', result);
|
|
1901
|
+
|
|
1902
|
+
const nextStepIndex = chatState.step + 1;
|
|
1903
|
+
if (nextStepIndex < flowData.flow.length) {
|
|
1904
|
+
const nextStep = flowData.flow[nextStepIndex];
|
|
1905
|
+
|
|
1906
|
+
// ✅ NEW: Support for updating specific input by field name
|
|
1907
|
+
// Example: { updateNextStep: true, fuel: { options: [...] } }
|
|
1908
|
+
if (nextStep.input && nextStep.input.field) {
|
|
1909
|
+
const inputFieldName = nextStep.input.field;
|
|
1910
|
+
|
|
1911
|
+
// Check if result has a property matching the input field name
|
|
1912
|
+
if (result[inputFieldName]) {
|
|
1913
|
+
console.log(` ✅ Updating input properties for field "${inputFieldName}":`, result[inputFieldName]);
|
|
1914
|
+
|
|
1915
|
+
// Update nested properties
|
|
1916
|
+
if (result[inputFieldName].options !== undefined) {
|
|
1917
|
+
nextStep.input.options = result[inputFieldName].options;
|
|
1918
|
+
console.log(` → input.options updated with ${result[inputFieldName].options.length} items`);
|
|
1919
|
+
}
|
|
1920
|
+
|
|
1921
|
+
// Can also update other input properties
|
|
1922
|
+
if (result[inputFieldName].field !== undefined) {
|
|
1923
|
+
nextStep.input.field = result[inputFieldName].field;
|
|
1924
|
+
console.log(` → input.field updated to: ${result[inputFieldName].field}`);
|
|
1925
|
+
}
|
|
1926
|
+
|
|
1927
|
+
if (result[inputFieldName].selectedInputValueType !== undefined) {
|
|
1928
|
+
nextStep.input.selectedInputValueType = result[inputFieldName].selectedInputValueType;
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
if (result[inputFieldName].selectedInputPrefix !== undefined) {
|
|
1932
|
+
nextStep.input.selectedInputPrefix = result[inputFieldName].selectedInputPrefix;
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
if (result[inputFieldName].selectedInputSuffix !== undefined) {
|
|
1936
|
+
nextStep.input.selectedInputSuffix = result[inputFieldName].selectedInputSuffix;
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
if (result[inputFieldName].custom !== undefined) {
|
|
1940
|
+
nextStep.input.custom = result[inputFieldName].custom;
|
|
1941
|
+
}
|
|
1942
|
+
|
|
1943
|
+
if (result[inputFieldName].min !== undefined) {
|
|
1944
|
+
nextStep.input.min = result[inputFieldName].min;
|
|
1945
|
+
}
|
|
1946
|
+
|
|
1947
|
+
if (result[inputFieldName].max !== undefined) {
|
|
1948
|
+
nextStep.input.max = result[inputFieldName].max;
|
|
1949
|
+
}
|
|
1950
|
+
}
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
// ✅ LEGACY: Direct properties (backwards compatible)
|
|
1954
|
+
// Update options if provided
|
|
1955
|
+
if (result.options && nextStep.input) {
|
|
1956
|
+
console.log(` ✅ Updating step ${nextStepIndex} input.options (direct):`, result.options);
|
|
1957
|
+
nextStep.input.options = result.options;
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1960
|
+
// ✅ Update field name if provided
|
|
1961
|
+
if (result.field && nextStep.input) {
|
|
1962
|
+
console.log(` ✅ Updating step ${nextStepIndex} field name: ${result.field}`);
|
|
1963
|
+
nextStep.input.field = result.field;
|
|
1964
|
+
}
|
|
1965
|
+
|
|
1966
|
+
// Update any other step properties if provided
|
|
1967
|
+
if (result.message) {
|
|
1968
|
+
console.log(` ✅ Updating step ${nextStepIndex} message:`, result.message);
|
|
1969
|
+
nextStep.message = result.message;
|
|
1970
|
+
}
|
|
1971
|
+
|
|
1972
|
+
if (result.inputType) {
|
|
1973
|
+
console.log(` ✅ Updating step ${nextStepIndex} inputType:`, result.inputType);
|
|
1974
|
+
nextStep.inputType = result.inputType;
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
if (result.shouldDisplay !== undefined) {
|
|
1978
|
+
console.log(` ✅ Updating step ${nextStepIndex} shouldDisplay`);
|
|
1979
|
+
nextStep.shouldDisplay = result.shouldDisplay;
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1982
|
+
if (result.dependsOn !== undefined) {
|
|
1983
|
+
console.log(` ✅ Updating step ${nextStepIndex} dependsOn:`, result.dependsOn);
|
|
1984
|
+
nextStep.dependsOn = result.dependsOn;
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
|
|
1989
|
+
// Check if onNext returned false to block progression
|
|
1990
|
+
const canProceed = result === undefined || result === true ||
|
|
1991
|
+
(typeof result === 'object' && result.canProceed !== false);
|
|
1992
|
+
|
|
1846
1993
|
if (!canProceed) {
|
|
1847
1994
|
enableNextButton();
|
|
1848
1995
|
return;
|
|
@@ -2033,9 +2180,115 @@ async function showNextStep() {
|
|
|
2033
2180
|
|
|
2034
2181
|
if (nextStep.onStart) {
|
|
2035
2182
|
try {
|
|
2036
|
-
const
|
|
2183
|
+
const result = await nextStep.onStart(chatState.data);
|
|
2184
|
+
|
|
2185
|
+
// ✅ NEW: Check if onStart returned data to update current step
|
|
2186
|
+
if (result && typeof result === 'object' && result.updateCurrentStep) {
|
|
2187
|
+
console.log('📝 onStart returned data to update current step:', result);
|
|
2188
|
+
|
|
2189
|
+
const currentStepIndex = chatState.step;
|
|
2190
|
+
const currentStep = flowData.flow[currentStepIndex];
|
|
2191
|
+
|
|
2192
|
+
// ✅ Support for updating specific input by field name
|
|
2193
|
+
if (currentStep.input && currentStep.input.field) {
|
|
2194
|
+
const inputFieldName = currentStep.input.field;
|
|
2195
|
+
|
|
2196
|
+
// Check if result has a property matching the input field name
|
|
2197
|
+
if (result[inputFieldName]) {
|
|
2198
|
+
console.log(` ✅ Updating current step input.${inputFieldName}:`, result[inputFieldName]);
|
|
2199
|
+
|
|
2200
|
+
// Update nested properties
|
|
2201
|
+
if (result[inputFieldName].options !== undefined) {
|
|
2202
|
+
currentStep.input.options = result[inputFieldName].options;
|
|
2203
|
+
console.log(` → input.options updated with ${result[inputFieldName].options.length} items`);
|
|
2204
|
+
}
|
|
2205
|
+
|
|
2206
|
+
if (result[inputFieldName].field !== undefined) {
|
|
2207
|
+
currentStep.input.field = result[inputFieldName].field;
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
if (result[inputFieldName].selectedInputValueType !== undefined) {
|
|
2211
|
+
currentStep.input.selectedInputValueType = result[inputFieldName].selectedInputValueType;
|
|
2212
|
+
}
|
|
2213
|
+
|
|
2214
|
+
if (result[inputFieldName].selectedInputPrefix !== undefined) {
|
|
2215
|
+
currentStep.input.selectedInputPrefix = result[inputFieldName].selectedInputPrefix;
|
|
2216
|
+
}
|
|
2217
|
+
|
|
2218
|
+
if (result[inputFieldName].selectedInputSuffix !== undefined) {
|
|
2219
|
+
currentStep.input.selectedInputSuffix = result[inputFieldName].selectedInputSuffix;
|
|
2220
|
+
}
|
|
2221
|
+
|
|
2222
|
+
if (result[inputFieldName].custom !== undefined) {
|
|
2223
|
+
currentStep.input.custom = result[inputFieldName].custom;
|
|
2224
|
+
}
|
|
2225
|
+
|
|
2226
|
+
if (result[inputFieldName].min !== undefined) {
|
|
2227
|
+
currentStep.input.min = result[inputFieldName].min;
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2230
|
+
if (result[inputFieldName].max !== undefined) {
|
|
2231
|
+
currentStep.input.max = result[inputFieldName].max;
|
|
2232
|
+
}
|
|
2233
|
+
}
|
|
2234
|
+
}
|
|
2235
|
+
|
|
2236
|
+
// ✅ Direct properties (backwards compatible)
|
|
2237
|
+
if (result.options && currentStep.input) {
|
|
2238
|
+
console.log(` ✅ Updating current step input.options (direct):`, result.options);
|
|
2239
|
+
currentStep.input.options = result.options;
|
|
2240
|
+
}
|
|
2241
|
+
|
|
2242
|
+
if (result.field && currentStep.input) {
|
|
2243
|
+
console.log(` ✅ Updating current step field name: ${result.field}`);
|
|
2244
|
+
currentStep.input.field = result.field;
|
|
2245
|
+
}
|
|
2246
|
+
|
|
2247
|
+
// Update step-level properties
|
|
2248
|
+
if (result.message) {
|
|
2249
|
+
console.log(` ✅ Updating current step message:`, result.message);
|
|
2250
|
+
currentStep.message = result.message;
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2253
|
+
if (result.inputType) {
|
|
2254
|
+
console.log(` ✅ Updating current step inputType:`, result.inputType);
|
|
2255
|
+
currentStep.inputType = result.inputType;
|
|
2256
|
+
}
|
|
2257
|
+
|
|
2258
|
+
if (result.shouldDisplay !== undefined) {
|
|
2259
|
+
console.log(` ✅ Updating current step shouldDisplay`);
|
|
2260
|
+
currentStep.shouldDisplay = result.shouldDisplay;
|
|
2261
|
+
}
|
|
2262
|
+
|
|
2263
|
+
if (result.dependsOn !== undefined) {
|
|
2264
|
+
console.log(` ✅ Updating current step dependsOn:`, result.dependsOn);
|
|
2265
|
+
currentStep.dependsOn = result.dependsOn;
|
|
2266
|
+
}
|
|
2267
|
+
|
|
2268
|
+
if (result.autoAdvance !== undefined) {
|
|
2269
|
+
console.log(` ✅ Updating current step autoAdvance:`, result.autoAdvance);
|
|
2270
|
+
currentStep.autoAdvance = result.autoAdvance;
|
|
2271
|
+
}
|
|
2272
|
+
|
|
2273
|
+
if (result.autoAdvanceDelay !== undefined) {
|
|
2274
|
+
console.log(` ✅ Updating current step autoAdvanceDelay:`, result.autoAdvanceDelay);
|
|
2275
|
+
currentStep.autoAdvanceDelay = result.autoAdvanceDelay;
|
|
2276
|
+
}
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
// ✅ NEW: Check if onStart wants to display a message in chat
|
|
2280
|
+
if (result && typeof result === 'object' && result.showMessage) {
|
|
2281
|
+
console.log('💬 onStart displaying message:', result.showMessage);
|
|
2282
|
+
addMessage(result.showMessage, 'bot', false, null);
|
|
2283
|
+
scrollToBottom();
|
|
2284
|
+
}
|
|
2285
|
+
|
|
2286
|
+
// Check if onStart blocked the step
|
|
2287
|
+
const canStart = result === undefined || result === true ||
|
|
2288
|
+
(typeof result === 'object' && result.canStart !== false);
|
|
2289
|
+
|
|
2037
2290
|
if (!canStart) {
|
|
2038
|
-
console.log('Step blocked');
|
|
2291
|
+
console.log('Step blocked by onStart');
|
|
2039
2292
|
return;
|
|
2040
2293
|
}
|
|
2041
2294
|
} catch (error) {
|