@nyaruka/temba-components 0.130.3 → 0.130.5
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/CHANGELOG.md +22 -0
- package/demo/sortable-rules-demo.html +155 -0
- package/dist/temba-components.js +133 -143
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/events.js.map +1 -1
- package/out-tsc/src/flow/CanvasNode.js +13 -7
- package/out-tsc/src/flow/CanvasNode.js.map +1 -1
- package/out-tsc/src/flow/actions/send_msg.js +1 -0
- package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_groups.js +149 -1
- package/out-tsc/src/flow/nodes/split_by_groups.js.map +1 -1
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +1 -0
- package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -1
- package/out-tsc/src/flow/nodes/wait_for_response.js +81 -75
- package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
- package/out-tsc/src/form/ArrayEditor.js +106 -28
- package/out-tsc/src/form/ArrayEditor.js.map +1 -1
- package/out-tsc/src/form/select/Select.js +21 -25
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/list/SortableList.js +214 -140
- package/out-tsc/src/list/SortableList.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +18 -13
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/test/nodes/split_by_groups.test.js +130 -0
- package/out-tsc/test/nodes/split_by_groups.test.js.map +1 -0
- package/out-tsc/test/nodes/wait_for_response.test.js +149 -0
- package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
- package/out-tsc/test/temba-field-config.test.js +56 -0
- package/out-tsc/test/temba-field-config.test.js.map +1 -1
- package/package.json +1 -1
- package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
- package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
- package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
- package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
- package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
- package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
- package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
- package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
- package/screenshots/truth/contacts/chat-failure.png +0 -0
- package/screenshots/truth/contacts/chat-for-archived-contact.png +0 -0
- package/screenshots/truth/contacts/chat-for-blocked-contact.png +0 -0
- package/screenshots/truth/contacts/chat-for-stopped-contact.png +0 -0
- package/screenshots/truth/contacts/chat-sends-attachments-only.png +0 -0
- package/screenshots/truth/contacts/chat-sends-text-and-attachments.png +0 -0
- package/screenshots/truth/contacts/chat-sends-text-only.png +0 -0
- package/screenshots/truth/editor/wait.png +0 -0
- package/screenshots/truth/field-renderer/select-with-label.png +0 -0
- package/screenshots/truth/list/fields-dragging.png +0 -0
- package/screenshots/truth/list/sortable-dragging.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/information-extraction.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/sentiment-analysis.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/summarization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm/editor/translation-task.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
- package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
- package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
- package/screenshots/truth/select/search-enabled.png +0 -0
- package/screenshots/truth/select/search-selected-focus.png +0 -0
- package/screenshots/truth/select/search-selected.png +0 -0
- package/screenshots/truth/templates/default.png +0 -0
- package/screenshots/truth/templates/unapproved.png +0 -0
- package/src/events.ts +6 -6
- package/src/flow/CanvasNode.ts +15 -13
- package/src/flow/actions/send_msg.ts +1 -0
- package/src/flow/nodes/split_by_groups.ts +190 -1
- package/src/flow/nodes/split_by_llm_categorize.ts +1 -0
- package/src/flow/nodes/wait_for_response.ts +98 -74
- package/src/form/ArrayEditor.ts +112 -28
- package/src/form/select/Select.ts +24 -25
- package/src/list/SortableList.ts +250 -149
- package/src/live/ContactChat.ts +20 -13
- package/test/nodes/split_by_groups.test.ts +165 -0
- package/test/nodes/wait_for_response.test.ts +182 -0
- package/test/temba-field-config.test.ts +69 -0
- package/test-assets/contacts/history.json +37 -35
- package/screenshots/truth/contacts/chat-for-active-contact.png +0 -0
|
@@ -630,6 +630,155 @@ describe('wait_for_response node config', () => {
|
|
|
630
630
|
const secondCases = result.router.cases.filter((case_) => case_.category_uuid === secondCategory.uuid);
|
|
631
631
|
expect(secondCases).to.have.length(1);
|
|
632
632
|
});
|
|
633
|
+
it('preserves category UUIDs when rules are reordered', () => {
|
|
634
|
+
var _a, _b;
|
|
635
|
+
const originalNode = {
|
|
636
|
+
uuid: 'test-node',
|
|
637
|
+
actions: [],
|
|
638
|
+
router: {
|
|
639
|
+
type: 'switch',
|
|
640
|
+
operand: '@input.text',
|
|
641
|
+
categories: [
|
|
642
|
+
{
|
|
643
|
+
uuid: 'yes-category-uuid',
|
|
644
|
+
name: 'Yes',
|
|
645
|
+
exit_uuid: 'yes-exit-uuid'
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
uuid: 'no-category-uuid',
|
|
649
|
+
name: 'No',
|
|
650
|
+
exit_uuid: 'no-exit-uuid'
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
uuid: 'other-category-uuid',
|
|
654
|
+
name: 'Other',
|
|
655
|
+
exit_uuid: 'other-exit-uuid'
|
|
656
|
+
}
|
|
657
|
+
],
|
|
658
|
+
cases: [
|
|
659
|
+
{
|
|
660
|
+
uuid: 'yes-case-uuid',
|
|
661
|
+
type: 'has_phrase',
|
|
662
|
+
arguments: ['yes'],
|
|
663
|
+
category_uuid: 'yes-category-uuid'
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
uuid: 'no-case-uuid',
|
|
667
|
+
type: 'has_phrase',
|
|
668
|
+
arguments: ['no'],
|
|
669
|
+
category_uuid: 'no-category-uuid'
|
|
670
|
+
}
|
|
671
|
+
]
|
|
672
|
+
},
|
|
673
|
+
exits: [
|
|
674
|
+
{ uuid: 'yes-exit-uuid', destination_uuid: null },
|
|
675
|
+
{ uuid: 'no-exit-uuid', destination_uuid: null },
|
|
676
|
+
{ uuid: 'other-exit-uuid', destination_uuid: null }
|
|
677
|
+
]
|
|
678
|
+
};
|
|
679
|
+
// Reorder the rules - put "No" first, "Yes" second
|
|
680
|
+
const formData = {
|
|
681
|
+
uuid: 'test-node',
|
|
682
|
+
result_name: 'response',
|
|
683
|
+
rules: [
|
|
684
|
+
{
|
|
685
|
+
operator: { value: 'has_phrase', name: 'contains phrase' },
|
|
686
|
+
value1: 'no',
|
|
687
|
+
category: 'No' // This rule was originally second
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
operator: { value: 'has_phrase', name: 'contains phrase' },
|
|
691
|
+
value1: 'yes',
|
|
692
|
+
category: 'Yes' // This rule was originally first
|
|
693
|
+
}
|
|
694
|
+
]
|
|
695
|
+
};
|
|
696
|
+
const result = wait_for_response.fromFormData(formData, originalNode);
|
|
697
|
+
// Verify that categories keep their original UUIDs despite reordering
|
|
698
|
+
expect((_a = result.router) === null || _a === void 0 ? void 0 : _a.categories).to.have.length(3); // Two rules + Other
|
|
699
|
+
const yesCategory = result.router.categories.find((cat) => cat.name === 'Yes');
|
|
700
|
+
const noCategory = result.router.categories.find((cat) => cat.name === 'No');
|
|
701
|
+
const otherCategory = result.router.categories.find((cat) => cat.name === 'Other');
|
|
702
|
+
// Categories should preserve their original UUIDs
|
|
703
|
+
expect(yesCategory === null || yesCategory === void 0 ? void 0 : yesCategory.uuid).to.equal('yes-category-uuid');
|
|
704
|
+
expect(yesCategory === null || yesCategory === void 0 ? void 0 : yesCategory.exit_uuid).to.equal('yes-exit-uuid');
|
|
705
|
+
expect(noCategory === null || noCategory === void 0 ? void 0 : noCategory.uuid).to.equal('no-category-uuid');
|
|
706
|
+
expect(noCategory === null || noCategory === void 0 ? void 0 : noCategory.exit_uuid).to.equal('no-exit-uuid');
|
|
707
|
+
expect(otherCategory === null || otherCategory === void 0 ? void 0 : otherCategory.uuid).to.equal('other-category-uuid');
|
|
708
|
+
expect(otherCategory === null || otherCategory === void 0 ? void 0 : otherCategory.exit_uuid).to.equal('other-exit-uuid');
|
|
709
|
+
// Verify the cases are created in the new order but reference correct categories
|
|
710
|
+
expect((_b = result.router) === null || _b === void 0 ? void 0 : _b.cases).to.have.length(2);
|
|
711
|
+
const firstCase = result.router.cases[0];
|
|
712
|
+
const secondCase = result.router.cases[1];
|
|
713
|
+
// First case should be "no" and reference the No category
|
|
714
|
+
expect(firstCase.arguments).to.deep.equal(['no']);
|
|
715
|
+
expect(firstCase.category_uuid).to.equal('no-category-uuid');
|
|
716
|
+
// Second case should be "yes" and reference the Yes category
|
|
717
|
+
expect(secondCase.arguments).to.deep.equal(['yes']);
|
|
718
|
+
expect(secondCase.category_uuid).to.equal('yes-category-uuid');
|
|
719
|
+
});
|
|
720
|
+
it('preserves rule order when rules have duplicate categories', () => {
|
|
721
|
+
var _a, _b;
|
|
722
|
+
const formData = {
|
|
723
|
+
uuid: 'test-node',
|
|
724
|
+
result_name: 'response',
|
|
725
|
+
rules: [
|
|
726
|
+
{
|
|
727
|
+
operator: { value: 'has_phrase', name: 'contains phrase' },
|
|
728
|
+
value1: 'first',
|
|
729
|
+
category: 'Shared'
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
operator: { value: 'has_phrase', name: 'contains phrase' },
|
|
733
|
+
value1: 'middle',
|
|
734
|
+
category: 'Different'
|
|
735
|
+
},
|
|
736
|
+
{
|
|
737
|
+
operator: { value: 'has_phrase', name: 'contains phrase' },
|
|
738
|
+
value1: 'last',
|
|
739
|
+
category: 'Shared' // Same as first rule
|
|
740
|
+
}
|
|
741
|
+
]
|
|
742
|
+
};
|
|
743
|
+
const originalNode = {
|
|
744
|
+
uuid: 'test-node',
|
|
745
|
+
actions: [],
|
|
746
|
+
router: {
|
|
747
|
+
type: 'switch',
|
|
748
|
+
result_name: 'response',
|
|
749
|
+
categories: [],
|
|
750
|
+
cases: []
|
|
751
|
+
},
|
|
752
|
+
exits: []
|
|
753
|
+
};
|
|
754
|
+
const result = wait_for_response.fromFormData(formData, originalNode);
|
|
755
|
+
// Should have 3 cases in the same order as the input rules
|
|
756
|
+
expect((_a = result.router) === null || _a === void 0 ? void 0 : _a.cases).to.have.length(3);
|
|
757
|
+
const cases = result.router.cases;
|
|
758
|
+
// First case should be "first"
|
|
759
|
+
expect(cases[0].arguments).to.deep.equal(['first']);
|
|
760
|
+
expect(cases[0].type).to.equal('has_phrase');
|
|
761
|
+
// Second case should be "middle"
|
|
762
|
+
expect(cases[1].arguments).to.deep.equal(['middle']);
|
|
763
|
+
expect(cases[1].type).to.equal('has_phrase');
|
|
764
|
+
// Third case should be "last"
|
|
765
|
+
expect(cases[2].arguments).to.deep.equal(['last']);
|
|
766
|
+
expect(cases[2].type).to.equal('has_phrase');
|
|
767
|
+
// Find the shared category
|
|
768
|
+
const sharedCategory = result.router.categories.find((cat) => cat.name === 'Shared');
|
|
769
|
+
const differentCategory = result.router.categories.find((cat) => cat.name === 'Different');
|
|
770
|
+
expect(sharedCategory).to.exist;
|
|
771
|
+
expect(differentCategory).to.exist;
|
|
772
|
+
// First and third cases should reference the same "Shared" category
|
|
773
|
+
expect(cases[0].category_uuid).to.equal(sharedCategory.uuid);
|
|
774
|
+
expect(cases[2].category_uuid).to.equal(sharedCategory.uuid);
|
|
775
|
+
// Second case should reference the "Different" category
|
|
776
|
+
expect(cases[1].category_uuid).to.equal(differentCategory.uuid);
|
|
777
|
+
// Should have 3 categories: Shared, Different, Other
|
|
778
|
+
expect((_b = result.router) === null || _b === void 0 ? void 0 : _b.categories).to.have.length(3);
|
|
779
|
+
const categoryNames = result.router.categories.map((cat) => cat.name);
|
|
780
|
+
expect(categoryNames).to.deep.equal(['Shared', 'Different', 'Other']);
|
|
781
|
+
});
|
|
633
782
|
});
|
|
634
783
|
});
|
|
635
784
|
//# sourceMappingURL=wait_for_response.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait_for_response.test.js","sourceRoot":"","sources":["../../../test/nodes/wait_for_response.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { wait_for_response } from '../../src/flow/nodes/wait_for_response';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\nimport { createOperatorOption } from '../../src/flow/operators';\n\n/**\n * Test suite for the wait_for_response node configuration.\n */\ndescribe('wait_for_response node config', () => {\n const helper = new NodeTest(wait_for_response, 'wait_for_response');\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(wait_for_response.name).to.equal('Wait for Response');\n });\n\n it('has correct type', () => {\n expect(wait_for_response.type).to.equal('wait_for_response');\n });\n\n it('has form configuration', () => {\n expect(wait_for_response.form).to.exist;\n expect(wait_for_response.form.result_name).to.exist;\n });\n\n it('has layout configuration', () => {\n expect(wait_for_response.layout).to.exist;\n expect(wait_for_response.layout).to.deep.equal(['rules', 'result_name']);\n });\n });\n\n describe('node scenarios', () => {\n it('renders basic wait', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-1',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat-1',\n seconds: 300\n }\n },\n result_name: 'response',\n categories: [\n {\n uuid: 'timeout-cat-1',\n name: 'No Response',\n exit_uuid: 'timeout-exit-1'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit-1', destination_uuid: null }]\n } as Node,\n { type: 'wait_for_response' },\n 'basic-wait'\n );\n });\n\n it('renders custom result name', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-2',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat-2',\n seconds: 1800\n }\n },\n result_name: 'user_input',\n categories: [\n {\n uuid: 'timeout-cat-2',\n name: 'No Response',\n exit_uuid: 'timeout-exit-2'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit-2', destination_uuid: null }]\n } as Node,\n { type: 'wait_for_response' },\n 'custom-result-name'\n );\n });\n\n it('renders short timeout', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-3',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat-3',\n seconds: 60\n }\n },\n result_name: 'quick_response',\n categories: [\n {\n uuid: 'timeout-cat-3',\n name: 'No Response',\n exit_uuid: 'timeout-exit-3'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit-3', destination_uuid: null }]\n } as Node,\n { type: 'wait_for_response' },\n 'short-timeout'\n );\n });\n\n it('renders no timeout', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-4',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg'\n // No timeout specified\n },\n result_name: 'response',\n categories: []\n },\n exits: []\n } as Node,\n { type: 'wait_for_response' },\n 'no-timeout'\n );\n });\n });\n\n describe('data transformation', () => {\n it('converts node to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'user_response',\n categories: []\n },\n exits: []\n };\n\n const formData = wait_for_response.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node');\n expect(formData.result_name).to.equal('user_response');\n expect(formData.rules).to.deep.equal([]);\n });\n\n it('converts node with rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'user_response',\n operand: '@input.text',\n categories: [\n {\n uuid: 'red-cat',\n name: 'Red',\n exit_uuid: 'red-exit'\n },\n {\n uuid: 'green-cat',\n name: 'Green',\n exit_uuid: 'green-exit'\n },\n {\n uuid: 'other-cat',\n name: 'Other',\n exit_uuid: 'other-exit'\n }\n ],\n cases: [\n {\n uuid: 'red-case',\n type: 'has_any_word',\n arguments: ['red'],\n category_uuid: 'red-cat'\n },\n {\n uuid: 'green-case',\n type: 'has_phrase',\n arguments: ['green'],\n category_uuid: 'green-cat'\n }\n ]\n },\n exits: [\n { uuid: 'red-exit', destination_uuid: null },\n { uuid: 'green-exit', destination_uuid: null },\n { uuid: 'other-exit', destination_uuid: null }\n ]\n };\n\n const formData = wait_for_response.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node');\n expect(formData.result_name).to.equal('user_response');\n expect(formData.rules).to.have.length(2);\n expect(formData.rules[0]).to.deep.equal({\n operator: createOperatorOption('has_any_word'),\n value1: 'red',\n value2: '',\n category: 'Red'\n });\n expect(formData.rules[1]).to.deep.equal({\n operator: createOperatorOption('has_phrase'),\n value1: 'green',\n value2: '',\n category: 'Green'\n });\n });\n\n it('converts form data to node correctly', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'custom_response',\n rules: []\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('custom_response');\n });\n\n it('converts form data with rules to node correctly', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'custom_response',\n rules: [\n {\n operator: 'has_any_word',\n value1: 'red',\n value2: '',\n category: 'Red'\n },\n {\n operator: 'has_phrase',\n value1: 'blue',\n value2: '',\n category: 'Blue'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('custom_response');\n expect(result.router?.operand).to.equal('@input.text');\n expect(result.router?.categories).to.have.length(3); // Red, Blue, Other\n expect(result.router?.cases).to.have.length(2);\n expect(result.exits).to.have.length(3);\n\n // Check categories\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members(['Red', 'Blue', 'Other']);\n\n // Check cases\n const redCase = result.router!.cases.find(\n (c) => c.type === 'has_any_word'\n );\n expect(redCase).to.exist;\n expect(redCase!.arguments).to.deep.equal(['red']);\n\n const blueCase = result.router!.cases.find(\n (c) => c.type === 'has_phrase'\n );\n expect(blueCase).to.exist;\n expect(blueCase!.arguments).to.deep.equal(['blue']);\n });\n\n it('handles default result name', () => {\n const formData = {\n uuid: 'test-node',\n rules: []\n // No result_name specified\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('response');\n });\n\n it('handles operators with no operands correctly', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'custom_response',\n rules: [\n {\n operator: 'has_text',\n value: '', // No value needed for has_text\n category: 'Has Text'\n },\n {\n operator: 'has_number',\n value: '', // No value needed for has_number\n category: 'Has Number'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('custom_response');\n expect(result.router?.categories).to.have.length(3); // Has Text, Has Number, Other\n expect(result.router?.cases).to.have.length(2);\n expect(result.exits).to.have.length(3);\n\n // Check categories\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members([\n 'Has Text',\n 'Has Number',\n 'Other'\n ]);\n\n // Check cases - should have empty arguments for 0-operand operators\n const hasTextCase = result.router!.cases.find(\n (c) => c.type === 'has_text'\n );\n expect(hasTextCase).to.exist;\n expect(hasTextCase!.arguments).to.deep.equal([]);\n\n const hasNumberCase = result.router!.cases.find(\n (c) => c.type === 'has_number'\n );\n expect(hasNumberCase).to.exist;\n expect(hasNumberCase!.arguments).to.deep.equal([]);\n });\n\n it('preserves timeout categories when adding rules', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n timeout_enabled: true,\n timeout_duration: [{ value: '300', name: '5 minutes' }],\n rules: [\n {\n operator: 'has_text',\n value: 'yes',\n category: 'Positive'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat',\n seconds: 300\n }\n },\n result_name: 'response',\n categories: [\n {\n uuid: 'timeout-cat',\n name: 'No Response',\n exit_uuid: 'timeout-exit'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit', destination_uuid: null }]\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.router?.categories).to.have.length(3); // Positive, No Response, Other\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members([\n 'Positive',\n 'No Response',\n 'Other'\n ]);\n\n // Verify timeout configuration is preserved\n expect(result.router?.wait).to.exist;\n expect(result.router?.wait?.timeout?.category_uuid).to.equal(\n 'timeout-cat'\n );\n });\n });\n\n describe('validation', () => {\n it('validates form data correctly with no errors', () => {\n const formData = {\n rules: [\n { operator: 'has_text', value: 'yes', category: 'Positive' },\n { operator: 'has_text', value: 'no', category: 'Negative' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('allows same category names for multiple rules', () => {\n const formData = {\n rules: [\n { operator: 'has_text', value: 'yes', category: 'Positive' },\n { operator: 'has_text', value: 'ok', category: 'positive' }, // case insensitive same category\n { operator: 'has_text', value: 'no', category: 'Negative' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('allows rules with operators that need no values', () => {\n const formData = {\n rules: [\n { operator: 'has_text', value: '', category: 'Has Text' },\n { operator: 'has_number', value: '', category: 'Has Number' },\n { operator: 'has_any_word', value: 'hello', category: 'Greeting' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('ignores empty rules in validation', () => {\n const formData = {\n rules: [\n { operator: 'has_phrase', value: 'yes', category: 'Positive' },\n { operator: '', value: '', category: '' }, // empty rule\n { operator: 'has_phrase', value: 'no', category: 'Negative' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('preserves category UUIDs when names are updated', () => {\n // Create original node with specific UUIDs\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: [\n {\n uuid: 'category-1-uuid',\n name: 'Old Name 1',\n exit_uuid: 'exit-1-uuid'\n },\n {\n uuid: 'category-2-uuid',\n name: 'Old Name 2',\n exit_uuid: 'exit-2-uuid'\n },\n {\n uuid: 'other-category-uuid',\n name: 'Other',\n exit_uuid: 'other-exit-uuid'\n }\n ],\n cases: [\n {\n uuid: 'case-1-uuid',\n type: 'has_phrase',\n arguments: ['yes'],\n category_uuid: 'category-1-uuid'\n },\n {\n uuid: 'case-2-uuid',\n type: 'has_phrase',\n arguments: ['no'],\n category_uuid: 'category-2-uuid'\n }\n ]\n },\n exits: [\n { uuid: 'exit-1-uuid', destination_uuid: null },\n { uuid: 'exit-2-uuid', destination_uuid: null },\n { uuid: 'other-exit-uuid', destination_uuid: null }\n ]\n };\n\n // Update category names but keep same rules in same order\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'yes',\n category: 'New Name 1' // Changed from \"Old Name 1\"\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'no',\n category: 'New Name 2' // Changed from \"Old Name 2\"\n }\n ]\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Verify that UUIDs are preserved despite name changes\n expect(result.router?.categories).to.have.length(3); // Two rules + Other\n\n const category1 = result.router!.categories.find(\n (cat) => cat.name === 'New Name 1'\n );\n const category2 = result.router!.categories.find(\n (cat) => cat.name === 'New Name 2'\n );\n const otherCategory = result.router!.categories.find(\n (cat) => cat.name === 'Other'\n );\n\n // Verify UUIDs are preserved\n expect(category1?.uuid).to.equal('category-1-uuid');\n expect(category1?.exit_uuid).to.equal('exit-1-uuid');\n\n expect(category2?.uuid).to.equal('category-2-uuid');\n expect(category2?.exit_uuid).to.equal('exit-2-uuid');\n\n expect(otherCategory?.uuid).to.equal('other-category-uuid');\n expect(otherCategory?.exit_uuid).to.equal('other-exit-uuid');\n\n // Verify case UUIDs are also preserved\n const case1 = result.router!.cases.find(\n (c) => c.category_uuid === 'category-1-uuid'\n );\n const case2 = result.router!.cases.find(\n (c) => c.category_uuid === 'category-2-uuid'\n );\n\n expect(case1?.uuid).to.equal('case-1-uuid');\n expect(case2?.uuid).to.equal('case-2-uuid');\n\n // Verify exits are preserved\n expect(result.exits).to.have.length(3);\n expect(result.exits.map((e) => e.uuid)).to.include.members([\n 'exit-1-uuid',\n 'exit-2-uuid',\n 'other-exit-uuid'\n ]);\n });\n\n it('merges rules with same category name into single category', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'yes',\n category: 'Positive'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'ok',\n category: 'Positive' // Same category name\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'no',\n category: 'Negative'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: [],\n cases: []\n },\n exits: []\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Should have 3 categories: Positive, Negative, Other\n expect(result.router?.categories).to.have.length(3);\n\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members([\n 'Positive',\n 'Negative',\n 'Other'\n ]);\n\n // Should have 3 cases but only 2 user categories (+ Other)\n expect(result.router?.cases).to.have.length(3);\n\n // Both \"yes\" and \"ok\" rules should reference the same Positive category\n const positiveCategory = result.router!.categories.find(\n (cat) => cat.name === 'Positive'\n );\n expect(positiveCategory).to.exist;\n\n const positiveCases = result.router!.cases.filter(\n (case_) => case_.category_uuid === positiveCategory!.uuid\n );\n expect(positiveCases).to.have.length(2);\n\n // Verify the cases have the correct arguments\n const yesCase = positiveCases.find((case_) =>\n case_.arguments.includes('yes')\n );\n const okCase = positiveCases.find((case_) =>\n case_.arguments.includes('ok')\n );\n\n expect(yesCase).to.exist;\n expect(okCase).to.exist;\n\n // Should have 3 exits: Positive, Negative, Other\n expect(result.exits).to.have.length(3);\n });\n\n it('preserves category order when merging same category names', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'yes',\n category: 'First'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'maybe',\n category: 'Second'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'ok',\n category: 'First' // Same as first rule\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: [],\n cases: []\n },\n exits: []\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Should have 3 categories: First, Second, Other (in that order)\n expect(result.router?.categories).to.have.length(3);\n\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.deep.equal(['First', 'Second', 'Other']);\n\n // First category should have 2 cases (yes and ok)\n const firstCategory = result.router!.categories.find(\n (cat) => cat.name === 'First'\n );\n const firstCases = result.router!.cases.filter(\n (case_) => case_.category_uuid === firstCategory!.uuid\n );\n expect(firstCases).to.have.length(2);\n\n // Second category should have 1 case (maybe)\n const secondCategory = result.router!.categories.find(\n (cat) => cat.name === 'Second'\n );\n const secondCases = result.router!.cases.filter(\n (case_) => case_.category_uuid === secondCategory!.uuid\n );\n expect(secondCases).to.have.length(1);\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"wait_for_response.test.js","sourceRoot":"","sources":["../../../test/nodes/wait_for_response.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { wait_for_response } from '../../src/flow/nodes/wait_for_response';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\nimport { createOperatorOption } from '../../src/flow/operators';\n\n/**\n * Test suite for the wait_for_response node configuration.\n */\ndescribe('wait_for_response node config', () => {\n const helper = new NodeTest(wait_for_response, 'wait_for_response');\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(wait_for_response.name).to.equal('Wait for Response');\n });\n\n it('has correct type', () => {\n expect(wait_for_response.type).to.equal('wait_for_response');\n });\n\n it('has form configuration', () => {\n expect(wait_for_response.form).to.exist;\n expect(wait_for_response.form.result_name).to.exist;\n });\n\n it('has layout configuration', () => {\n expect(wait_for_response.layout).to.exist;\n expect(wait_for_response.layout).to.deep.equal(['rules', 'result_name']);\n });\n });\n\n describe('node scenarios', () => {\n it('renders basic wait', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-1',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat-1',\n seconds: 300\n }\n },\n result_name: 'response',\n categories: [\n {\n uuid: 'timeout-cat-1',\n name: 'No Response',\n exit_uuid: 'timeout-exit-1'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit-1', destination_uuid: null }]\n } as Node,\n { type: 'wait_for_response' },\n 'basic-wait'\n );\n });\n\n it('renders custom result name', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-2',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat-2',\n seconds: 1800\n }\n },\n result_name: 'user_input',\n categories: [\n {\n uuid: 'timeout-cat-2',\n name: 'No Response',\n exit_uuid: 'timeout-exit-2'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit-2', destination_uuid: null }]\n } as Node,\n { type: 'wait_for_response' },\n 'custom-result-name'\n );\n });\n\n it('renders short timeout', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-3',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat-3',\n seconds: 60\n }\n },\n result_name: 'quick_response',\n categories: [\n {\n uuid: 'timeout-cat-3',\n name: 'No Response',\n exit_uuid: 'timeout-exit-3'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit-3', destination_uuid: null }]\n } as Node,\n { type: 'wait_for_response' },\n 'short-timeout'\n );\n });\n\n it('renders no timeout', async () => {\n await helper.testNode(\n {\n uuid: 'test-wait-node-4',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg'\n // No timeout specified\n },\n result_name: 'response',\n categories: []\n },\n exits: []\n } as Node,\n { type: 'wait_for_response' },\n 'no-timeout'\n );\n });\n });\n\n describe('data transformation', () => {\n it('converts node to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'user_response',\n categories: []\n },\n exits: []\n };\n\n const formData = wait_for_response.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node');\n expect(formData.result_name).to.equal('user_response');\n expect(formData.rules).to.deep.equal([]);\n });\n\n it('converts node with rules to form data correctly', () => {\n const node: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'user_response',\n operand: '@input.text',\n categories: [\n {\n uuid: 'red-cat',\n name: 'Red',\n exit_uuid: 'red-exit'\n },\n {\n uuid: 'green-cat',\n name: 'Green',\n exit_uuid: 'green-exit'\n },\n {\n uuid: 'other-cat',\n name: 'Other',\n exit_uuid: 'other-exit'\n }\n ],\n cases: [\n {\n uuid: 'red-case',\n type: 'has_any_word',\n arguments: ['red'],\n category_uuid: 'red-cat'\n },\n {\n uuid: 'green-case',\n type: 'has_phrase',\n arguments: ['green'],\n category_uuid: 'green-cat'\n }\n ]\n },\n exits: [\n { uuid: 'red-exit', destination_uuid: null },\n { uuid: 'green-exit', destination_uuid: null },\n { uuid: 'other-exit', destination_uuid: null }\n ]\n };\n\n const formData = wait_for_response.toFormData!(node);\n\n expect(formData.uuid).to.equal('test-node');\n expect(formData.result_name).to.equal('user_response');\n expect(formData.rules).to.have.length(2);\n expect(formData.rules[0]).to.deep.equal({\n operator: createOperatorOption('has_any_word'),\n value1: 'red',\n value2: '',\n category: 'Red'\n });\n expect(formData.rules[1]).to.deep.equal({\n operator: createOperatorOption('has_phrase'),\n value1: 'green',\n value2: '',\n category: 'Green'\n });\n });\n\n it('converts form data to node correctly', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'custom_response',\n rules: []\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('custom_response');\n });\n\n it('converts form data with rules to node correctly', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'custom_response',\n rules: [\n {\n operator: 'has_any_word',\n value1: 'red',\n value2: '',\n category: 'Red'\n },\n {\n operator: 'has_phrase',\n value1: 'blue',\n value2: '',\n category: 'Blue'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('custom_response');\n expect(result.router?.operand).to.equal('@input.text');\n expect(result.router?.categories).to.have.length(3); // Red, Blue, Other\n expect(result.router?.cases).to.have.length(2);\n expect(result.exits).to.have.length(3);\n\n // Check categories\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members(['Red', 'Blue', 'Other']);\n\n // Check cases\n const redCase = result.router!.cases.find(\n (c) => c.type === 'has_any_word'\n );\n expect(redCase).to.exist;\n expect(redCase!.arguments).to.deep.equal(['red']);\n\n const blueCase = result.router!.cases.find(\n (c) => c.type === 'has_phrase'\n );\n expect(blueCase).to.exist;\n expect(blueCase!.arguments).to.deep.equal(['blue']);\n });\n\n it('handles default result name', () => {\n const formData = {\n uuid: 'test-node',\n rules: []\n // No result_name specified\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('response');\n });\n\n it('handles operators with no operands correctly', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'custom_response',\n rules: [\n {\n operator: 'has_text',\n value: '', // No value needed for has_text\n category: 'Has Text'\n },\n {\n operator: 'has_number',\n value: '', // No value needed for has_number\n category: 'Has Number'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: []\n }\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.uuid).to.equal('test-node');\n expect(result.router?.result_name).to.equal('custom_response');\n expect(result.router?.categories).to.have.length(3); // Has Text, Has Number, Other\n expect(result.router?.cases).to.have.length(2);\n expect(result.exits).to.have.length(3);\n\n // Check categories\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members([\n 'Has Text',\n 'Has Number',\n 'Other'\n ]);\n\n // Check cases - should have empty arguments for 0-operand operators\n const hasTextCase = result.router!.cases.find(\n (c) => c.type === 'has_text'\n );\n expect(hasTextCase).to.exist;\n expect(hasTextCase!.arguments).to.deep.equal([]);\n\n const hasNumberCase = result.router!.cases.find(\n (c) => c.type === 'has_number'\n );\n expect(hasNumberCase).to.exist;\n expect(hasNumberCase!.arguments).to.deep.equal([]);\n });\n\n it('preserves timeout categories when adding rules', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n timeout_enabled: true,\n timeout_duration: [{ value: '300', name: '5 minutes' }],\n rules: [\n {\n operator: 'has_text',\n value: 'yes',\n category: 'Positive'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n wait: {\n type: 'msg',\n timeout: {\n category_uuid: 'timeout-cat',\n seconds: 300\n }\n },\n result_name: 'response',\n categories: [\n {\n uuid: 'timeout-cat',\n name: 'No Response',\n exit_uuid: 'timeout-exit'\n }\n ]\n },\n exits: [{ uuid: 'timeout-exit', destination_uuid: null }]\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n expect(result.router?.categories).to.have.length(3); // Positive, No Response, Other\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members([\n 'Positive',\n 'No Response',\n 'Other'\n ]);\n\n // Verify timeout configuration is preserved\n expect(result.router?.wait).to.exist;\n expect(result.router?.wait?.timeout?.category_uuid).to.equal(\n 'timeout-cat'\n );\n });\n });\n\n describe('validation', () => {\n it('validates form data correctly with no errors', () => {\n const formData = {\n rules: [\n { operator: 'has_text', value: 'yes', category: 'Positive' },\n { operator: 'has_text', value: 'no', category: 'Negative' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('allows same category names for multiple rules', () => {\n const formData = {\n rules: [\n { operator: 'has_text', value: 'yes', category: 'Positive' },\n { operator: 'has_text', value: 'ok', category: 'positive' }, // case insensitive same category\n { operator: 'has_text', value: 'no', category: 'Negative' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('allows rules with operators that need no values', () => {\n const formData = {\n rules: [\n { operator: 'has_text', value: '', category: 'Has Text' },\n { operator: 'has_number', value: '', category: 'Has Number' },\n { operator: 'has_any_word', value: 'hello', category: 'Greeting' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('ignores empty rules in validation', () => {\n const formData = {\n rules: [\n { operator: 'has_phrase', value: 'yes', category: 'Positive' },\n { operator: '', value: '', category: '' }, // empty rule\n { operator: 'has_phrase', value: 'no', category: 'Negative' }\n ]\n };\n\n const validation = wait_for_response.validate!(formData);\n expect(validation.valid).to.be.true;\n expect(validation.errors).to.be.empty;\n });\n\n it('preserves category UUIDs when names are updated', () => {\n // Create original node with specific UUIDs\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: [\n {\n uuid: 'category-1-uuid',\n name: 'Old Name 1',\n exit_uuid: 'exit-1-uuid'\n },\n {\n uuid: 'category-2-uuid',\n name: 'Old Name 2',\n exit_uuid: 'exit-2-uuid'\n },\n {\n uuid: 'other-category-uuid',\n name: 'Other',\n exit_uuid: 'other-exit-uuid'\n }\n ],\n cases: [\n {\n uuid: 'case-1-uuid',\n type: 'has_phrase',\n arguments: ['yes'],\n category_uuid: 'category-1-uuid'\n },\n {\n uuid: 'case-2-uuid',\n type: 'has_phrase',\n arguments: ['no'],\n category_uuid: 'category-2-uuid'\n }\n ]\n },\n exits: [\n { uuid: 'exit-1-uuid', destination_uuid: null },\n { uuid: 'exit-2-uuid', destination_uuid: null },\n { uuid: 'other-exit-uuid', destination_uuid: null }\n ]\n };\n\n // Update category names but keep same rules in same order\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'yes',\n category: 'New Name 1' // Changed from \"Old Name 1\"\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'no',\n category: 'New Name 2' // Changed from \"Old Name 2\"\n }\n ]\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Verify that UUIDs are preserved despite name changes\n expect(result.router?.categories).to.have.length(3); // Two rules + Other\n\n const category1 = result.router!.categories.find(\n (cat) => cat.name === 'New Name 1'\n );\n const category2 = result.router!.categories.find(\n (cat) => cat.name === 'New Name 2'\n );\n const otherCategory = result.router!.categories.find(\n (cat) => cat.name === 'Other'\n );\n\n // Verify UUIDs are preserved\n expect(category1?.uuid).to.equal('category-1-uuid');\n expect(category1?.exit_uuid).to.equal('exit-1-uuid');\n\n expect(category2?.uuid).to.equal('category-2-uuid');\n expect(category2?.exit_uuid).to.equal('exit-2-uuid');\n\n expect(otherCategory?.uuid).to.equal('other-category-uuid');\n expect(otherCategory?.exit_uuid).to.equal('other-exit-uuid');\n\n // Verify case UUIDs are also preserved\n const case1 = result.router!.cases.find(\n (c) => c.category_uuid === 'category-1-uuid'\n );\n const case2 = result.router!.cases.find(\n (c) => c.category_uuid === 'category-2-uuid'\n );\n\n expect(case1?.uuid).to.equal('case-1-uuid');\n expect(case2?.uuid).to.equal('case-2-uuid');\n\n // Verify exits are preserved\n expect(result.exits).to.have.length(3);\n expect(result.exits.map((e) => e.uuid)).to.include.members([\n 'exit-1-uuid',\n 'exit-2-uuid',\n 'other-exit-uuid'\n ]);\n });\n\n it('merges rules with same category name into single category', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'yes',\n category: 'Positive'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'ok',\n category: 'Positive' // Same category name\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'no',\n category: 'Negative'\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: [],\n cases: []\n },\n exits: []\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Should have 3 categories: Positive, Negative, Other\n expect(result.router?.categories).to.have.length(3);\n\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.include.members([\n 'Positive',\n 'Negative',\n 'Other'\n ]);\n\n // Should have 3 cases but only 2 user categories (+ Other)\n expect(result.router?.cases).to.have.length(3);\n\n // Both \"yes\" and \"ok\" rules should reference the same Positive category\n const positiveCategory = result.router!.categories.find(\n (cat) => cat.name === 'Positive'\n );\n expect(positiveCategory).to.exist;\n\n const positiveCases = result.router!.cases.filter(\n (case_) => case_.category_uuid === positiveCategory!.uuid\n );\n expect(positiveCases).to.have.length(2);\n\n // Verify the cases have the correct arguments\n const yesCase = positiveCases.find((case_) =>\n case_.arguments.includes('yes')\n );\n const okCase = positiveCases.find((case_) =>\n case_.arguments.includes('ok')\n );\n\n expect(yesCase).to.exist;\n expect(okCase).to.exist;\n\n // Should have 3 exits: Positive, Negative, Other\n expect(result.exits).to.have.length(3);\n });\n\n it('preserves category order when merging same category names', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'yes',\n category: 'First'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'maybe',\n category: 'Second'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'ok',\n category: 'First' // Same as first rule\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: [],\n cases: []\n },\n exits: []\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Should have 3 categories: First, Second, Other (in that order)\n expect(result.router?.categories).to.have.length(3);\n\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.deep.equal(['First', 'Second', 'Other']);\n\n // First category should have 2 cases (yes and ok)\n const firstCategory = result.router!.categories.find(\n (cat) => cat.name === 'First'\n );\n const firstCases = result.router!.cases.filter(\n (case_) => case_.category_uuid === firstCategory!.uuid\n );\n expect(firstCases).to.have.length(2);\n\n // Second category should have 1 case (maybe)\n const secondCategory = result.router!.categories.find(\n (cat) => cat.name === 'Second'\n );\n const secondCases = result.router!.cases.filter(\n (case_) => case_.category_uuid === secondCategory!.uuid\n );\n expect(secondCases).to.have.length(1);\n });\n\n it('preserves category UUIDs when rules are reordered', () => {\n const originalNode = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch' as const,\n operand: '@input.text',\n categories: [\n {\n uuid: 'yes-category-uuid',\n name: 'Yes',\n exit_uuid: 'yes-exit-uuid'\n },\n {\n uuid: 'no-category-uuid',\n name: 'No',\n exit_uuid: 'no-exit-uuid'\n },\n {\n uuid: 'other-category-uuid',\n name: 'Other',\n exit_uuid: 'other-exit-uuid'\n }\n ],\n cases: [\n {\n uuid: 'yes-case-uuid',\n type: 'has_phrase',\n arguments: ['yes'],\n category_uuid: 'yes-category-uuid'\n },\n {\n uuid: 'no-case-uuid',\n type: 'has_phrase',\n arguments: ['no'],\n category_uuid: 'no-category-uuid'\n }\n ]\n },\n exits: [\n { uuid: 'yes-exit-uuid', destination_uuid: null },\n { uuid: 'no-exit-uuid', destination_uuid: null },\n { uuid: 'other-exit-uuid', destination_uuid: null }\n ]\n };\n\n // Reorder the rules - put \"No\" first, \"Yes\" second\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'no',\n category: 'No' // This rule was originally second\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'yes',\n category: 'Yes' // This rule was originally first\n }\n ]\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Verify that categories keep their original UUIDs despite reordering\n expect(result.router?.categories).to.have.length(3); // Two rules + Other\n\n const yesCategory = result.router!.categories.find(\n (cat) => cat.name === 'Yes'\n );\n const noCategory = result.router!.categories.find(\n (cat) => cat.name === 'No'\n );\n const otherCategory = result.router!.categories.find(\n (cat) => cat.name === 'Other'\n );\n\n // Categories should preserve their original UUIDs\n expect(yesCategory?.uuid).to.equal('yes-category-uuid');\n expect(yesCategory?.exit_uuid).to.equal('yes-exit-uuid');\n\n expect(noCategory?.uuid).to.equal('no-category-uuid');\n expect(noCategory?.exit_uuid).to.equal('no-exit-uuid');\n\n expect(otherCategory?.uuid).to.equal('other-category-uuid');\n expect(otherCategory?.exit_uuid).to.equal('other-exit-uuid');\n\n // Verify the cases are created in the new order but reference correct categories\n expect(result.router?.cases).to.have.length(2);\n\n const firstCase = result.router!.cases[0];\n const secondCase = result.router!.cases[1];\n\n // First case should be \"no\" and reference the No category\n expect(firstCase.arguments).to.deep.equal(['no']);\n expect(firstCase.category_uuid).to.equal('no-category-uuid');\n\n // Second case should be \"yes\" and reference the Yes category\n expect(secondCase.arguments).to.deep.equal(['yes']);\n expect(secondCase.category_uuid).to.equal('yes-category-uuid');\n });\n\n it('preserves rule order when rules have duplicate categories', () => {\n const formData = {\n uuid: 'test-node',\n result_name: 'response',\n rules: [\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'first',\n category: 'Shared'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'middle',\n category: 'Different'\n },\n {\n operator: { value: 'has_phrase', name: 'contains phrase' },\n value1: 'last',\n category: 'Shared' // Same as first rule\n }\n ]\n };\n\n const originalNode: Node = {\n uuid: 'test-node',\n actions: [],\n router: {\n type: 'switch',\n result_name: 'response',\n categories: [],\n cases: []\n },\n exits: []\n };\n\n const result = wait_for_response.fromFormData!(formData, originalNode);\n\n // Should have 3 cases in the same order as the input rules\n expect(result.router?.cases).to.have.length(3);\n\n const cases = result.router!.cases;\n\n // First case should be \"first\"\n expect(cases[0].arguments).to.deep.equal(['first']);\n expect(cases[0].type).to.equal('has_phrase');\n\n // Second case should be \"middle\"\n expect(cases[1].arguments).to.deep.equal(['middle']);\n expect(cases[1].type).to.equal('has_phrase');\n\n // Third case should be \"last\"\n expect(cases[2].arguments).to.deep.equal(['last']);\n expect(cases[2].type).to.equal('has_phrase');\n\n // Find the shared category\n const sharedCategory = result.router!.categories.find(\n (cat) => cat.name === 'Shared'\n );\n const differentCategory = result.router!.categories.find(\n (cat) => cat.name === 'Different'\n );\n\n expect(sharedCategory).to.exist;\n expect(differentCategory).to.exist;\n\n // First and third cases should reference the same \"Shared\" category\n expect(cases[0].category_uuid).to.equal(sharedCategory!.uuid);\n expect(cases[2].category_uuid).to.equal(sharedCategory!.uuid);\n\n // Second case should reference the \"Different\" category\n expect(cases[1].category_uuid).to.equal(differentCategory!.uuid);\n\n // Should have 3 categories: Shared, Different, Other\n expect(result.router?.categories).to.have.length(3);\n const categoryNames = result.router!.categories.map((cat) => cat.name);\n expect(categoryNames).to.deep.equal(['Shared', 'Different', 'Other']);\n });\n });\n});\n"]}
|
|
@@ -130,6 +130,62 @@ describe('Field Configuration System', () => {
|
|
|
130
130
|
// Expects 3 items: 2 initial items + 1 auto-generated empty item
|
|
131
131
|
expect(items === null || items === void 0 ? void 0 : items.length).to.equal(3);
|
|
132
132
|
});
|
|
133
|
+
it('should render with sortable list when sortable=true', async () => {
|
|
134
|
+
var _a, _b;
|
|
135
|
+
const itemConfig = {
|
|
136
|
+
operator: { type: 'text', label: 'Operator' },
|
|
137
|
+
value: { type: 'text', label: 'Value' }
|
|
138
|
+
};
|
|
139
|
+
const initialValue = [
|
|
140
|
+
{ operator: 'equals', value: 'test' },
|
|
141
|
+
{ operator: 'contains', value: 'example' }
|
|
142
|
+
];
|
|
143
|
+
const el = await fixture(html `
|
|
144
|
+
<temba-array-editor
|
|
145
|
+
.value=${initialValue}
|
|
146
|
+
.itemConfig=${itemConfig}
|
|
147
|
+
.sortable=${true}
|
|
148
|
+
itemLabel="Rule"
|
|
149
|
+
></temba-array-editor>
|
|
150
|
+
`);
|
|
151
|
+
await el.updateComplete;
|
|
152
|
+
expect(el).to.exist;
|
|
153
|
+
// Should have a sortable list component
|
|
154
|
+
const sortableList = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('temba-sortable-list');
|
|
155
|
+
expect(sortableList).to.exist;
|
|
156
|
+
// Should have sortable items with proper classes and IDs
|
|
157
|
+
const sortableItems = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('.sortable');
|
|
158
|
+
expect(sortableItems === null || sortableItems === void 0 ? void 0 : sortableItems.length).to.equal(2); // Only non-empty items should be sortable
|
|
159
|
+
// Each sortable item should have a unique ID
|
|
160
|
+
const firstItem = sortableItems === null || sortableItems === void 0 ? void 0 : sortableItems[0];
|
|
161
|
+
const secondItem = sortableItems === null || sortableItems === void 0 ? void 0 : sortableItems[1];
|
|
162
|
+
expect(firstItem === null || firstItem === void 0 ? void 0 : firstItem.id).to.equal('array-item-0');
|
|
163
|
+
expect(secondItem === null || secondItem === void 0 ? void 0 : secondItem.id).to.equal('array-item-1');
|
|
164
|
+
});
|
|
165
|
+
it('should not render sortable list when sortable=false', async () => {
|
|
166
|
+
var _a, _b;
|
|
167
|
+
const itemConfig = {
|
|
168
|
+
operator: { type: 'text', label: 'Operator' },
|
|
169
|
+
value: { type: 'text', label: 'Value' }
|
|
170
|
+
};
|
|
171
|
+
const initialValue = [{ operator: 'equals', value: 'test' }];
|
|
172
|
+
const el = await fixture(html `
|
|
173
|
+
<temba-array-editor
|
|
174
|
+
.value=${initialValue}
|
|
175
|
+
.itemConfig=${itemConfig}
|
|
176
|
+
.sortable=${false}
|
|
177
|
+
itemLabel="Rule"
|
|
178
|
+
></temba-array-editor>
|
|
179
|
+
`);
|
|
180
|
+
await el.updateComplete;
|
|
181
|
+
expect(el).to.exist;
|
|
182
|
+
// Should not have a sortable list component
|
|
183
|
+
const sortableList = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('temba-sortable-list');
|
|
184
|
+
expect(sortableList).to.not.exist;
|
|
185
|
+
// Should have regular list container instead
|
|
186
|
+
const listContainer = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.list-items');
|
|
187
|
+
expect(listContainer).to.exist;
|
|
188
|
+
});
|
|
133
189
|
});
|
|
134
190
|
});
|
|
135
191
|
//# sourceMappingURL=temba-field-config.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temba-field-config.test.js","sourceRoot":"","sources":["../../test/temba-field-config.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport '../src/form/KeyValueEditor';\nimport '../src/form/ArrayEditor';\n\ndescribe('Field Configuration System', () => {\n describe('KeyValueEditor', () => {\n it('should render with empty value and always show one empty row', async () => {\n const el = await fixture(html`\n <temba-key-value-editor></temba-key-value-editor>\n `);\n\n expect(el).to.exist;\n // Should always have at least one row (empty row)\n const rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(1);\n // Should not have add button anymore\n expect(el.shadowRoot?.querySelector('.add-btn')).to.not.exist;\n });\n\n it('should render with initial values and maintain empty row', async () => {\n const initialValue = {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer token123'\n };\n\n const el = await fixture(html`\n <temba-key-value-editor .value=${initialValue}></temba-key-value-editor>\n `);\n\n expect(el).to.exist;\n // Should have 2 data rows + 1 empty row = 3 total\n const rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(3);\n });\n\n it('should emit clean values without empty rows', async () => {\n const el = await fixture(html`\n <temba-key-value-editor></temba-key-value-editor>\n `);\n\n let changeEvent: any = null;\n el.addEventListener('change', (e) => {\n changeEvent = e;\n });\n\n // Trigger a field change that should cause an update\n const keyInput = el.shadowRoot?.querySelector('temba-textinput') as any;\n if (keyInput) {\n keyInput.value = 'test-key';\n keyInput.dispatchEvent(new Event('change'));\n }\n\n await (el as any).updateComplete;\n\n expect(changeEvent).to.exist;\n // Should emit the array format with key-value pairs\n expect(changeEvent.detail.value).to.be.an('array');\n expect(changeEvent.detail.value).to.deep.include({\n key: 'test-key',\n value: ''\n });\n });\n\n it('should hide remove button for empty rows', async () => {\n const initialValue = {\n 'Content-Type': 'application/json'\n };\n\n const el = await fixture(html`\n <temba-key-value-editor .value=${initialValue}></temba-key-value-editor>\n `);\n\n expect(el).to.exist;\n const rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(2); // 1 data row + 1 empty row\n\n // First row (with data) should have remove button\n const firstRowRemoveBtn = rows?.[0]?.querySelector('.remove-btn');\n expect(firstRowRemoveBtn).to.exist;\n\n // Second row (empty) should have spacer instead of remove button\n const secondRowRemoveBtn = rows?.[1]?.querySelector('.remove-btn');\n const secondRowSpacer = rows?.[1]?.querySelector('.remove-btn-spacer');\n expect(secondRowRemoveBtn).to.not.exist;\n expect(secondRowSpacer).to.exist;\n });\n\n it('should show remove button when empty row gets content', async () => {\n const el = await fixture(html`\n <temba-key-value-editor></temba-key-value-editor>\n `);\n\n // Initially should have no remove button (empty row)\n let rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.[0]?.querySelector('.remove-btn')).to.not.exist;\n expect(rows?.[0]?.querySelector('.remove-btn-spacer')).to.exist;\n\n // Simulate adding content by setting value and triggering update\n (el as any).value = { 'test-key': '' };\n (el as any).requestUpdate();\n await (el as any).updateComplete;\n\n // Now should have remove button for the row with content\n rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(2); // row with content + empty row\n expect(rows?.[0]?.querySelector('.remove-btn')).to.exist;\n expect(rows?.[1]?.querySelector('.remove-btn-spacer')).to.exist;\n });\n });\n\n describe('ArrayEditor', () => {\n it('should render with empty array', async () => {\n const itemConfig = {\n name: { type: 'text', label: 'Name', required: true },\n value: { type: 'text', label: 'Value' }\n };\n\n const el = await fixture(html`\n <temba-array-editor .itemConfig=${itemConfig}></temba-array-editor>\n `);\n\n await (el as any).updateComplete;\n\n expect(el).to.exist;\n // ArrayEditor with maintainEmptyItem=true doesn't show add button\n expect(el.shadowRoot?.querySelector('.add-btn')).to.not.exist;\n });\n\n it('should render with initial items', async () => {\n const itemConfig = {\n operator: { type: 'text', label: 'Operator' },\n value: { type: 'text', label: 'Value' }\n };\n\n const initialValue = [\n { operator: 'equals', value: 'test' },\n { operator: 'contains', value: 'example' }\n ];\n\n const el = await fixture(html`\n <temba-array-editor\n .value=${initialValue}\n .itemConfig=${itemConfig}\n itemLabel=\"Rule\"\n ></temba-array-editor>\n `);\n\n expect(el).to.exist;\n const items = el.shadowRoot?.querySelectorAll('.array-item');\n // Expects 3 items: 2 initial items + 1 auto-generated empty item\n expect(items?.length).to.equal(3);\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"temba-field-config.test.js","sourceRoot":"","sources":["../../test/temba-field-config.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport '../src/form/KeyValueEditor';\nimport '../src/form/ArrayEditor';\n\ndescribe('Field Configuration System', () => {\n describe('KeyValueEditor', () => {\n it('should render with empty value and always show one empty row', async () => {\n const el = await fixture(html`\n <temba-key-value-editor></temba-key-value-editor>\n `);\n\n expect(el).to.exist;\n // Should always have at least one row (empty row)\n const rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(1);\n // Should not have add button anymore\n expect(el.shadowRoot?.querySelector('.add-btn')).to.not.exist;\n });\n\n it('should render with initial values and maintain empty row', async () => {\n const initialValue = {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer token123'\n };\n\n const el = await fixture(html`\n <temba-key-value-editor .value=${initialValue}></temba-key-value-editor>\n `);\n\n expect(el).to.exist;\n // Should have 2 data rows + 1 empty row = 3 total\n const rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(3);\n });\n\n it('should emit clean values without empty rows', async () => {\n const el = await fixture(html`\n <temba-key-value-editor></temba-key-value-editor>\n `);\n\n let changeEvent: any = null;\n el.addEventListener('change', (e) => {\n changeEvent = e;\n });\n\n // Trigger a field change that should cause an update\n const keyInput = el.shadowRoot?.querySelector('temba-textinput') as any;\n if (keyInput) {\n keyInput.value = 'test-key';\n keyInput.dispatchEvent(new Event('change'));\n }\n\n await (el as any).updateComplete;\n\n expect(changeEvent).to.exist;\n // Should emit the array format with key-value pairs\n expect(changeEvent.detail.value).to.be.an('array');\n expect(changeEvent.detail.value).to.deep.include({\n key: 'test-key',\n value: ''\n });\n });\n\n it('should hide remove button for empty rows', async () => {\n const initialValue = {\n 'Content-Type': 'application/json'\n };\n\n const el = await fixture(html`\n <temba-key-value-editor .value=${initialValue}></temba-key-value-editor>\n `);\n\n expect(el).to.exist;\n const rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(2); // 1 data row + 1 empty row\n\n // First row (with data) should have remove button\n const firstRowRemoveBtn = rows?.[0]?.querySelector('.remove-btn');\n expect(firstRowRemoveBtn).to.exist;\n\n // Second row (empty) should have spacer instead of remove button\n const secondRowRemoveBtn = rows?.[1]?.querySelector('.remove-btn');\n const secondRowSpacer = rows?.[1]?.querySelector('.remove-btn-spacer');\n expect(secondRowRemoveBtn).to.not.exist;\n expect(secondRowSpacer).to.exist;\n });\n\n it('should show remove button when empty row gets content', async () => {\n const el = await fixture(html`\n <temba-key-value-editor></temba-key-value-editor>\n `);\n\n // Initially should have no remove button (empty row)\n let rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.[0]?.querySelector('.remove-btn')).to.not.exist;\n expect(rows?.[0]?.querySelector('.remove-btn-spacer')).to.exist;\n\n // Simulate adding content by setting value and triggering update\n (el as any).value = { 'test-key': '' };\n (el as any).requestUpdate();\n await (el as any).updateComplete;\n\n // Now should have remove button for the row with content\n rows = el.shadowRoot?.querySelectorAll('.row');\n expect(rows?.length).to.equal(2); // row with content + empty row\n expect(rows?.[0]?.querySelector('.remove-btn')).to.exist;\n expect(rows?.[1]?.querySelector('.remove-btn-spacer')).to.exist;\n });\n });\n\n describe('ArrayEditor', () => {\n it('should render with empty array', async () => {\n const itemConfig = {\n name: { type: 'text', label: 'Name', required: true },\n value: { type: 'text', label: 'Value' }\n };\n\n const el = await fixture(html`\n <temba-array-editor .itemConfig=${itemConfig}></temba-array-editor>\n `);\n\n await (el as any).updateComplete;\n\n expect(el).to.exist;\n // ArrayEditor with maintainEmptyItem=true doesn't show add button\n expect(el.shadowRoot?.querySelector('.add-btn')).to.not.exist;\n });\n\n it('should render with initial items', async () => {\n const itemConfig = {\n operator: { type: 'text', label: 'Operator' },\n value: { type: 'text', label: 'Value' }\n };\n\n const initialValue = [\n { operator: 'equals', value: 'test' },\n { operator: 'contains', value: 'example' }\n ];\n\n const el = await fixture(html`\n <temba-array-editor\n .value=${initialValue}\n .itemConfig=${itemConfig}\n itemLabel=\"Rule\"\n ></temba-array-editor>\n `);\n\n expect(el).to.exist;\n const items = el.shadowRoot?.querySelectorAll('.array-item');\n // Expects 3 items: 2 initial items + 1 auto-generated empty item\n expect(items?.length).to.equal(3);\n });\n\n it('should render with sortable list when sortable=true', async () => {\n const itemConfig = {\n operator: { type: 'text', label: 'Operator' },\n value: { type: 'text', label: 'Value' }\n };\n\n const initialValue = [\n { operator: 'equals', value: 'test' },\n { operator: 'contains', value: 'example' }\n ];\n\n const el = await fixture(html`\n <temba-array-editor\n .value=${initialValue}\n .itemConfig=${itemConfig}\n .sortable=${true}\n itemLabel=\"Rule\"\n ></temba-array-editor>\n `);\n\n await (el as any).updateComplete;\n\n expect(el).to.exist;\n\n // Should have a sortable list component\n const sortableList = el.shadowRoot?.querySelector('temba-sortable-list');\n expect(sortableList).to.exist;\n\n // Should have sortable items with proper classes and IDs\n const sortableItems = el.shadowRoot?.querySelectorAll('.sortable');\n expect(sortableItems?.length).to.equal(2); // Only non-empty items should be sortable\n\n // Each sortable item should have a unique ID\n const firstItem = sortableItems?.[0] as HTMLElement;\n const secondItem = sortableItems?.[1] as HTMLElement;\n expect(firstItem?.id).to.equal('array-item-0');\n expect(secondItem?.id).to.equal('array-item-1');\n });\n\n it('should not render sortable list when sortable=false', async () => {\n const itemConfig = {\n operator: { type: 'text', label: 'Operator' },\n value: { type: 'text', label: 'Value' }\n };\n\n const initialValue = [{ operator: 'equals', value: 'test' }];\n\n const el = await fixture(html`\n <temba-array-editor\n .value=${initialValue}\n .itemConfig=${itemConfig}\n .sortable=${false}\n itemLabel=\"Rule\"\n ></temba-array-editor>\n `);\n\n await (el as any).updateComplete;\n\n expect(el).to.exist;\n\n // Should not have a sortable list component\n const sortableList = el.shadowRoot?.querySelector('temba-sortable-list');\n expect(sortableList).to.not.exist;\n\n // Should have regular list container instead\n const listContainer = el.shadowRoot?.querySelector('.list-items');\n expect(listContainer).to.exist;\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|