diff --git a/admin/DashboardController.php b/admin/DashboardController.php
index 3676853..cba9499 100644
--- a/admin/DashboardController.php
+++ b/admin/DashboardController.php
@@ -2917,15 +2917,24 @@ HTML;
$showEp = ($ft === 'function' && $fFn === 'api_report')
? 'display:flex;flex-direction:column;gap:8px;margin-top:8px'
: 'display:none';
- $showCollect = $ft === 'collect_input'
- ? 'display:flex;flex-direction:column;gap:8px'
- : 'display:none';
- $showDynList = $ft === 'dynamic_list'
- ? 'display:flex;flex-direction:column;gap:8px'
- : 'display:none';
- $showSubmit = $ft === 'submit_form'
- ? 'display:flex;flex-direction:column;gap:8px'
- : 'display:none';
+ $showCollect = $ft === 'collect_input' ? 'display:flex;flex-direction:column;gap:8px' : 'display:none';
+ $showDynList = $ft === 'dynamic_list' ? 'display:flex;flex-direction:column;gap:8px' : 'display:none';
+ $showSubmit = $ft === 'submit_form' ? 'display:flex;flex-direction:column;gap:8px' : 'display:none';
+ $showForEach = $ft === 'collect_for_each' ? 'display:flex;flex-direction:column;gap:8px' : 'display:none';
+
+ $feEpSelHtml = '';
+ foreach ($companyEndpoints as $ep) {
+ $sel = $srcEp === self::h($ep['endpoint_key']) ? ' selected' : '';
+ $feEpSelHtml .= '';
+ }
+ $feUpEpSelHtml = '';
+ $feUpEpKey = self::h($flow['endpoint_key'] ?? '');
+ foreach ($companyEndpoints as $ep) {
+ $sel = $feUpEpKey === self::h($ep['endpoint_key']) ? ' selected' : '';
+ $feUpEpSelHtml .= '';
+ }
+ $feQuestion = self::h($flow['question'] ?? '');
+ $feSuccessText = self::h($flow['success_text'] ?? '');
$fnOpts = '';
foreach (['goodbye' => '↩️ Salir (goodbye)', 'api_report' => '📄 Descargar informe', 'forward_to_ai' => '🤖 Escalar a IA', 'forward_to_agent' => '👤 Escalar a agente'] as $fv => $fl) {
@@ -2956,9 +2965,10 @@ HTML;
@@ -3028,6 +3038,21 @@ HTML;
+
+
+
+
+
+
+
+
+
+
+
+
";
@@ -3284,12 +3309,13 @@ function flowTabChange(sel) {
const v = sel.value;
// flex sections need display:flex; block sections use '' (default block)
const sections = {
- 'ftg-text': {show: v==='text', flex: false},
- 'ftg-menu': {show: v==='menu', flex: false},
- 'ftg-fn': {show: v==='function', flex: false},
- 'ftg-collect': {show: v==='collect_input', flex: true},
- 'ftg-dynlist': {show: v==='dynamic_list', flex: true},
- 'ftg-submit': {show: v==='submit_form', flex: true},
+ 'ftg-text': {show: v==='text', flex: false},
+ 'ftg-menu': {show: v==='menu', flex: false},
+ 'ftg-fn': {show: v==='function', flex: false},
+ 'ftg-collect': {show: v==='collect_input', flex: true},
+ 'ftg-dynlist': {show: v==='dynamic_list', flex: true},
+ 'ftg-submit': {show: v==='submit_form', flex: true},
+ 'ftg-foreach': {show: v==='collect_for_each', flex: true},
};
for (const [cls, cfg] of Object.entries(sections)) {
const el = card.querySelector('.' + cls);
@@ -3340,6 +3366,7 @@ function addFlowCard() {
' ' +
' ' +
@@ -3397,6 +3424,19 @@ function addFlowCard() {
' ' +
' ' +
' ' +
+ ' ' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
' ' +
' ' +
''
diff --git a/public/index.php b/public/index.php
index 0d4283e..a42d318 100644
--- a/public/index.php
+++ b/public/index.php
@@ -414,6 +414,13 @@ $routes = [
$flowSfGroups = $_POST['flow_sf_meta_group']?? [];
$flowSfFnames = $_POST['flow_sf_filename'] ?? [];
$flowSfCaps = $_POST['flow_sf_caption'] ?? [];
+ $flowFeSrcEps = $_POST['flow_fe_src_ep'] ?? [];
+ $flowFeUpEps = $_POST['flow_fe_up_ep'] ?? [];
+ $flowFeValFlds = $_POST['flow_fe_val_field'] ?? [];
+ $flowFeLblFlds = $_POST['flow_fe_lbl_field'] ?? [];
+ $flowFeHeaders = $_POST['flow_fe_header'] ?? [];
+ $flowFeQs = $_POST['flow_fe_question'] ?? [];
+ $flowFeSucTxts = $_POST['flow_fe_success'] ?? [];
$flows = [];
foreach ($flowKeys as $i => $fk) {
@@ -465,6 +472,15 @@ $routes = [
$f['meta_group'] = trim($flowSfGroups[$i] ?? '');
$f['filename'] = trim($flowSfFnames[$i] ?? '');
$f['caption'] = trim($flowSfCaps[$i] ?? '');
+
+ } elseif ($ftype === 'collect_for_each') {
+ $f['source_endpoint_key'] = trim($flowFeSrcEps[$i] ?? '');
+ $f['endpoint_key'] = trim($flowFeUpEps[$i] ?? '');
+ $f['value_field'] = trim($flowFeValFlds[$i] ?? 'id');
+ $f['label_field'] = trim($flowFeLblFlds[$i] ?? 'nombre');
+ $f['header'] = trim($flowFeHeaders[$i] ?? '');
+ $f['question'] = trim($flowFeQs[$i] ?? '');
+ $f['success_text'] = trim($flowFeSucTxts[$i] ?? '');
}
$flows[$fk] = $f;