@nyaruka/temba-components 0.126.0 → 0.128.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/demo/chart/example.html +18 -1
  3. package/demo/data/flows/sample-flow.json +127 -100
  4. package/demo/data/server/opened-tickets-long.json +53 -0
  5. package/demo/sticky-note-demo.html +152 -0
  6. package/dist/locales/es.js +5 -5
  7. package/dist/locales/es.js.map +1 -1
  8. package/dist/locales/fr.js +5 -5
  9. package/dist/locales/fr.js.map +1 -1
  10. package/dist/locales/locale-codes.js +11 -2
  11. package/dist/locales/locale-codes.js.map +1 -1
  12. package/dist/locales/pt.js +5 -5
  13. package/dist/locales/pt.js.map +1 -1
  14. package/dist/temba-components.js +346 -86
  15. package/dist/temba-components.js.map +1 -1
  16. package/out-tsc/src/chart/TembaChart.js +44 -5
  17. package/out-tsc/src/chart/TembaChart.js.map +1 -1
  18. package/out-tsc/src/flow/Editor.js +210 -1
  19. package/out-tsc/src/flow/Editor.js.map +1 -1
  20. package/out-tsc/src/flow/EditorNode.js +98 -142
  21. package/out-tsc/src/flow/EditorNode.js.map +1 -1
  22. package/out-tsc/src/flow/StickyNote.js +272 -0
  23. package/out-tsc/src/flow/StickyNote.js.map +1 -0
  24. package/out-tsc/src/list/RunList.js +2 -1
  25. package/out-tsc/src/list/RunList.js.map +1 -1
  26. package/out-tsc/src/list/SortableList.js +9 -0
  27. package/out-tsc/src/list/SortableList.js.map +1 -1
  28. package/out-tsc/src/locales/es.js +5 -5
  29. package/out-tsc/src/locales/es.js.map +1 -1
  30. package/out-tsc/src/locales/fr.js +5 -5
  31. package/out-tsc/src/locales/fr.js.map +1 -1
  32. package/out-tsc/src/locales/locale-codes.js +11 -2
  33. package/out-tsc/src/locales/locale-codes.js.map +1 -1
  34. package/out-tsc/src/locales/pt.js +5 -5
  35. package/out-tsc/src/locales/pt.js.map +1 -1
  36. package/out-tsc/src/store/AppState.js +33 -0
  37. package/out-tsc/src/store/AppState.js.map +1 -1
  38. package/out-tsc/src/vectoricon/index.js +2 -1
  39. package/out-tsc/src/vectoricon/index.js.map +1 -1
  40. package/out-tsc/temba-modules.js +2 -0
  41. package/out-tsc/temba-modules.js.map +1 -1
  42. package/out-tsc/test/temba-flow-editor-node.test.js +249 -5
  43. package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
  44. package/out-tsc/test/temba-select.test.js +9 -14
  45. package/out-tsc/test/temba-select.test.js.map +1 -1
  46. package/out-tsc/test/utils.test.js +62 -0
  47. package/out-tsc/test/utils.test.js.map +1 -1
  48. package/package.json +1 -1
  49. package/screenshots/truth/sticky-note/blue.png +0 -0
  50. package/screenshots/truth/sticky-note/gray.png +0 -0
  51. package/screenshots/truth/sticky-note/green.png +0 -0
  52. package/screenshots/truth/sticky-note/pink.png +0 -0
  53. package/screenshots/truth/sticky-note/yellow.png +0 -0
  54. package/src/chart/TembaChart.ts +47 -5
  55. package/src/flow/Editor.ts +252 -2
  56. package/src/flow/EditorNode.ts +98 -160
  57. package/src/flow/StickyNote.ts +284 -0
  58. package/src/list/RunList.ts +2 -1
  59. package/src/list/SortableList.ts +11 -0
  60. package/src/locales/es.ts +18 -13
  61. package/src/locales/fr.ts +18 -13
  62. package/src/locales/locale-codes.ts +11 -2
  63. package/src/locales/pt.ts +18 -13
  64. package/src/store/AppState.ts +51 -1
  65. package/src/store/flow-definition.d.ts +8 -0
  66. package/src/vectoricon/index.ts +2 -1
  67. package/static/svg/index.pdf +137 -0
  68. package/temba-modules.ts +2 -0
  69. package/test/temba-flow-editor-node.test.ts +322 -6
  70. package/test/temba-select.test.ts +10 -17
  71. package/test/utils.test.ts +98 -0
  72. package/web-dev-server.config.mjs +30 -22
@@ -1 +1 @@
1
- {"version":3,"file":"temba-flow-editor-node.test.js","sourceRoot":"","sources":["../../test/temba-flow-editor-node.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect } from '@open-wc/testing';\nimport { EditorNode } from '../src/flow/EditorNode';\nimport {\n Node,\n NodeUI,\n Action,\n Exit,\n Router\n} from '../src/store/flow-definition.d';\nimport { stub, restore } from 'sinon';\n\n// Register the component\ncustomElements.define('temba-editor-node', EditorNode);\n\ndescribe('EditorNode', () => {\n let editorNode: EditorNode;\n let mockPlumber: any;\n\n beforeEach(async () => {\n // Mock plumber\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub()\n };\n });\n\n afterEach(() => {\n restore();\n });\n\n describe('basic functionality', () => {\n it('creates render root as element itself', () => {\n const editorNode = new EditorNode();\n expect(editorNode.createRenderRoot()).to.equal(editorNode);\n });\n });\n\n describe('renderAction', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders action with known config', () => {\n const mockNode: Node = {\n uuid: 'test-node-3',\n actions: [],\n exits: []\n };\n\n const action: any = {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Test message',\n quick_replies: []\n };\n\n const result = (editorNode as any).renderAction(mockNode, action);\n expect(result).to.exist;\n });\n\n it('renders action with unknown config', () => {\n const mockNode: Node = {\n uuid: 'test-node-4',\n actions: [],\n exits: []\n };\n\n const action: Action = {\n type: 'unknown_action' as any,\n uuid: 'action-1'\n };\n\n const result = (editorNode as any).renderAction(mockNode, action);\n expect(result).to.exist;\n });\n });\n\n describe('renderRouter', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders router with result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n result_name: 'test_result',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('renders router without result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('returns undefined for router with unknown UI type', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'unknown_type' as any\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.be.undefined;\n });\n });\n\n describe('renderCategories', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('returns null when no router', () => {\n const mockNode: Node = {\n uuid: 'test-node-7',\n actions: [],\n exits: []\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('returns null when no categories', () => {\n const mockNode: Node = {\n uuid: 'test-node-8',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n categories: undefined as any\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('renders categories with exits', () => {\n const mockNode: Node = {\n uuid: 'test-node-9',\n actions: [],\n exits: [{ uuid: 'exit-1' }, { uuid: 'exit-2' }],\n router: {\n type: 'switch',\n categories: [\n { uuid: 'cat-1', name: 'Category 1', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Category 2', exit_uuid: 'exit-2' }\n ]\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.exist;\n });\n });\n\n describe('renderExit', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders exit with connected class when destination exists', async () => {\n const exit: Exit = {\n uuid: 'exit-connected',\n destination_uuid: 'destination-node'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.true;\n expect(exitElement?.getAttribute('id')).to.equal('exit-connected');\n });\n\n it('renders exit without connected class when no destination', async () => {\n const exit: Exit = {\n uuid: 'exit-unconnected'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.false;\n expect(exitElement?.getAttribute('id')).to.equal('exit-unconnected');\n });\n });\n\n describe('renderTitle', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders title with config color and name', async () => {\n const config = {\n name: 'Test Action',\n color: '#ff0000'\n };\n\n const result = (editorNode as any).renderTitle(config);\n const container = await fixture(html`<div>${result}</div>`);\n\n const title = container.querySelector('.title');\n expect(title).to.exist;\n expect(title?.textContent?.trim()).to.equal('Test Action');\n expect(title?.getAttribute('style')).to.contain('background:#ff0000');\n });\n });\n\n describe('updated lifecycle', () => {\n it('handles updated without node changes', () => {\n editorNode = new EditorNode();\n (editorNode as any).plumber = mockPlumber;\n\n const changes = new Map();\n changes.set('other', true);\n\n // Should not throw and not call plumber methods\n expect(() => {\n (editorNode as any).updated(changes);\n }).to.not.throw();\n\n expect(mockPlumber.makeTarget).to.not.have.been.called;\n });\n\n it('verifies updated method exists', () => {\n editorNode = new EditorNode();\n expect(typeof (editorNode as any).updated).to.equal('function');\n });\n\n it('processes node changes and calls plumber methods', () => {\n editorNode = new EditorNode();\n (editorNode as any).plumber = mockPlumber;\n\n const mockNode: Node = {\n uuid: 'test-node-10',\n actions: [],\n exits: [\n { uuid: 'exit-1', destination_uuid: 'node-2' },\n { uuid: 'exit-2' } // This should call makeSource\n ]\n };\n\n // Mock querySelector to return a mock element with getBoundingClientRect\n const mockElement = {\n getBoundingClientRect: stub().returns({ width: 200, height: 100 })\n };\n stub(editorNode, 'querySelector').returns(mockElement as any);\n\n // Simulate the updated lifecycle\n (editorNode as any).node = mockNode;\n\n const changes = new Map();\n changes.set('node', true);\n\n // Test just the plumber method calls without store dependency\n // by directly calling the logic that would be in updated\n if ((editorNode as any).plumber && mockNode) {\n (editorNode as any).plumber.makeTarget(mockNode.uuid);\n\n for (const exit of mockNode.exits) {\n if (!exit.destination_uuid) {\n (editorNode as any).plumber.makeSource(exit.uuid);\n } else {\n (editorNode as any).plumber.connectIds(\n exit.uuid,\n exit.destination_uuid\n );\n }\n }\n }\n\n expect(mockPlumber.makeTarget).to.have.been.calledWith('test-node-10');\n expect(mockPlumber.makeSource).to.have.been.calledWith('exit-2');\n expect(mockPlumber.connectIds).to.have.been.calledWith(\n 'exit-1',\n 'node-2'\n );\n });\n });\n\n describe('basic integration', () => {\n it('can create and verify structure without full rendering', () => {\n const mockNode: Node = {\n uuid: 'integration-test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: 'next-node' }]\n };\n\n // Test individual render methods work\n editorNode = new EditorNode();\n\n // Test renderAction\n const actionResult = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0]\n );\n expect(actionResult).to.exist;\n\n // Test renderExit\n const exitResult = (editorNode as any).renderExit(mockNode.exits[0]);\n expect(exitResult).to.exist;\n\n // Verify the node structure is as expected\n expect(mockNode.uuid).to.equal('integration-test-node');\n expect(mockNode.actions).to.have.length(1);\n expect(mockNode.exits).to.have.length(1);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-flow-editor-node.test.js","sourceRoot":"","sources":["../../test/temba-flow-editor-node.test.ts"],"names":[],"mappings":"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","sourcesContent":["import '../temba-modules';\nimport { html, fixture, expect } from '@open-wc/testing';\nimport { EditorNode } from '../src/flow/EditorNode';\nimport {\n Node,\n NodeUI,\n Action,\n Exit,\n Router\n} from '../src/store/flow-definition.d';\nimport { stub, restore } from 'sinon';\nimport { CustomEventType } from '../src/interfaces';\n\ndescribe('EditorNode', () => {\n let editorNode: EditorNode;\n let mockPlumber: any;\n\n beforeEach(async () => {\n // Mock plumber\n mockPlumber = {\n makeTarget: stub(),\n makeSource: stub(),\n connectIds: stub()\n };\n });\n\n afterEach(() => {\n restore();\n });\n\n describe('basic functionality', () => {\n it('creates render root as element itself', () => {\n const editorNode = new EditorNode();\n expect(editorNode.createRenderRoot()).to.equal(editorNode);\n });\n });\n\n describe('renderAction', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders action with known config', () => {\n const mockNode: Node = {\n uuid: 'test-node-3',\n actions: [],\n exits: []\n };\n\n const action: any = {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Test message',\n quick_replies: []\n };\n\n const result = (editorNode as any).renderAction(mockNode, action, 0);\n expect(result).to.exist;\n });\n\n it('renders action with unknown config', () => {\n const mockNode: Node = {\n uuid: 'test-node-4',\n actions: [],\n exits: []\n };\n\n const action: Action = {\n type: 'unknown_action' as any,\n uuid: 'action-1'\n };\n\n const result = (editorNode as any).renderAction(mockNode, action, 1);\n expect(result).to.exist;\n });\n });\n\n describe('renderRouter', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders router with result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n result_name: 'test_result',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('renders router without result name', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'wait_for_response'\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.exist;\n });\n\n it('returns undefined for router with unknown UI type', () => {\n const mockRouter: Router = {\n type: 'switch',\n categories: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 50, top: 100 },\n type: 'unknown_type' as any\n };\n\n const result = (editorNode as any).renderRouter(mockRouter, mockUI);\n expect(result).to.be.undefined;\n });\n });\n\n describe('renderCategories', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('returns null when no router', () => {\n const mockNode: Node = {\n uuid: 'test-node-7',\n actions: [],\n exits: []\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('returns null when no categories', () => {\n const mockNode: Node = {\n uuid: 'test-node-8',\n actions: [],\n exits: [],\n router: {\n type: 'switch',\n categories: undefined as any\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.be.null;\n });\n\n it('renders categories with exits', () => {\n const mockNode: Node = {\n uuid: 'test-node-9',\n actions: [],\n exits: [{ uuid: 'exit-1' }, { uuid: 'exit-2' }],\n router: {\n type: 'switch',\n categories: [\n { uuid: 'cat-1', name: 'Category 1', exit_uuid: 'exit-1' },\n { uuid: 'cat-2', name: 'Category 2', exit_uuid: 'exit-2' }\n ]\n }\n };\n\n const result = (editorNode as any).renderCategories(mockNode);\n expect(result).to.exist;\n });\n });\n\n describe('renderExit', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders exit with connected class when destination exists', async () => {\n const exit: Exit = {\n uuid: 'exit-connected',\n destination_uuid: 'destination-node'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.true;\n expect(exitElement?.getAttribute('id')).to.equal('exit-connected');\n });\n\n it('renders exit without connected class when no destination', async () => {\n const exit: Exit = {\n uuid: 'exit-unconnected'\n };\n\n const result = (editorNode as any).renderExit(exit);\n const container = await fixture(html`<div>${result}</div>`);\n\n const exitElement = container.querySelector('.exit');\n expect(exitElement).to.exist;\n expect(exitElement?.classList.contains('connected')).to.be.false;\n expect(exitElement?.getAttribute('id')).to.equal('exit-unconnected');\n });\n });\n\n describe('renderTitle', () => {\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders title with config color and name', async () => {\n const config = {\n name: 'Test Action',\n color: '#ff0000'\n };\n\n const result = (editorNode as any).renderTitle(config);\n const container = await fixture(html`<div>${result}</div>`);\n\n const title = container.querySelector('.title');\n expect(title).to.exist;\n expect(title?.textContent?.trim()).to.equal('Test Action');\n expect(title?.getAttribute('style')).to.contain('background:#ff0000');\n });\n });\n\n describe('updated lifecycle', () => {\n it('handles updated without node changes', () => {\n editorNode = new EditorNode();\n (editorNode as any).plumber = mockPlumber;\n\n const changes = new Map();\n changes.set('other', true);\n\n // Should not throw and not call plumber methods\n expect(() => {\n (editorNode as any).updated(changes);\n }).to.not.throw();\n\n expect(mockPlumber.makeTarget).to.not.have.been.called;\n });\n\n it('verifies updated method exists', () => {\n editorNode = new EditorNode();\n expect(typeof (editorNode as any).updated).to.equal('function');\n });\n\n it('processes node changes and calls plumber methods', () => {\n editorNode = new EditorNode();\n (editorNode as any).plumber = mockPlumber;\n\n const mockNode: Node = {\n uuid: 'test-node-10',\n actions: [],\n exits: [\n { uuid: 'exit-1', destination_uuid: 'node-2' },\n { uuid: 'exit-2' } // This should call makeSource\n ]\n };\n\n // Mock querySelector to return a mock element with getBoundingClientRect\n const mockElement = {\n getBoundingClientRect: stub().returns({ width: 200, height: 100 })\n };\n stub(editorNode, 'querySelector').returns(mockElement as any);\n\n // Simulate the updated lifecycle\n (editorNode as any).node = mockNode;\n\n const changes = new Map();\n changes.set('node', true);\n\n // Test just the plumber method calls without store dependency\n // by directly calling the logic that would be in updated\n if ((editorNode as any).plumber && mockNode) {\n (editorNode as any).plumber.makeTarget(mockNode.uuid);\n\n for (const exit of mockNode.exits) {\n if (!exit.destination_uuid) {\n (editorNode as any).plumber.makeSource(exit.uuid);\n } else {\n (editorNode as any).plumber.connectIds(\n exit.uuid,\n exit.destination_uuid\n );\n }\n }\n }\n\n expect(mockPlumber.makeTarget).to.have.been.calledWith('test-node-10');\n expect(mockPlumber.makeSource).to.have.been.calledWith('exit-2');\n expect(mockPlumber.connectIds).to.have.been.calledWith(\n 'exit-1',\n 'node-2'\n );\n });\n });\n\n describe('basic integration', () => {\n it('can create and verify structure without full rendering', () => {\n const mockNode: Node = {\n uuid: 'integration-test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: [{ uuid: 'exit-1', destination_uuid: 'next-node' }]\n };\n\n // Test individual render methods work\n editorNode = new EditorNode();\n\n // Test renderAction\n const actionResult = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n expect(actionResult).to.exist;\n\n // Test renderExit\n const exitResult = (editorNode as any).renderExit(mockNode.exits[0]);\n expect(exitResult).to.exist;\n\n // Verify the node structure is as expected\n expect(mockNode.uuid).to.equal('integration-test-node');\n expect(mockNode.actions).to.have.length(1);\n expect(mockNode.exits).to.have.length(1);\n });\n });\n\n describe('drag and drop functionality', () => {\n let editorNode: EditorNode;\n\n beforeEach(() => {\n editorNode = new EditorNode();\n });\n\n it('renders actions with sortable class and proper IDs', async () => {\n const mockNode: Node = {\n uuid: 'sortable-test-node',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n // Test that renderAction includes sortable class and proper ID\n const result1 = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[0],\n 0\n );\n const result2 = (editorNode as any).renderAction(\n mockNode,\n mockNode.actions[1],\n 1\n );\n\n expect(result1).to.exist;\n expect(result2).to.exist;\n\n // Render the template to check the actual DOM\n const container1 = await fixture(html`<div>${result1}</div>`);\n const container2 = await fixture(html`<div>${result2}</div>`);\n\n const actionElement1 = container1.querySelector('.action');\n const actionElement2 = container2.querySelector('.action');\n\n expect(actionElement1).to.exist;\n expect(actionElement1?.classList.contains('sortable')).to.be.true;\n expect(actionElement1?.id).to.equal('action-0');\n\n expect(actionElement2).to.exist;\n expect(actionElement2?.classList.contains('sortable')).to.be.true;\n expect(actionElement2?.id).to.equal('action-1');\n });\n\n it('includes drag handle in rendered actions', async () => {\n const mockNode: Node = {\n uuid: 'drag-handle-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n let editorNode: EditorNode = await fixture(\n html`<temba-flow-node\n .node=${mockNode}\n .ui=${{ position: { left: 0, top: 0 } }}\n ></temba-flow-node>`\n );\n\n // No drag handle should be present if only one action\n let dragHandle = editorNode.querySelector('.drag-handle');\n expect(dragHandle).to.not.exist;\n\n // Now add a second action to verify drag handle appears\n mockNode.actions.push({\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any);\n\n editorNode = await fixture(\n html`<temba-flow-node\n .node=${mockNode}\n .ui=${{ position: { left: 0, top: 0 } }}\n ></temba-flow-node>`\n );\n\n dragHandle = editorNode.querySelector('.drag-handle');\n expect(dragHandle).to.exist;\n });\n\n it('renders SortableList when actions are present', async () => {\n const mockNode: Node = {\n uuid: 'sortable-list-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Hello',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'World',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n const renderResult = editorNode.render();\n\n // Render the template to check the actual DOM\n const container = await fixture(html`<div>${renderResult}</div>`);\n\n const sortableList = container.querySelector('temba-sortable-list');\n expect(sortableList).to.exist;\n });\n\n it('does not render SortableList when no actions', async () => {\n const mockNode: Node = {\n uuid: 'no-actions-test',\n actions: [],\n exits: [{ uuid: 'exit-1' }]\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n const renderResult = editorNode.render();\n\n // Check that template does not include temba-sortable-list\n expect(renderResult.strings.join('')).to.not.contain(\n 'temba-sortable-list'\n );\n });\n\n it('handles order changed events correctly', async () => {\n const mockNode: Node = {\n uuid: 'order-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'First',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Second',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-3',\n text: 'Third',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n (editorNode as any).node = mockNode;\n\n // Create a mock order changed event (swap first and last actions)\n const orderChangedEvent = new CustomEvent(CustomEventType.OrderChanged, {\n detail: { swap: [0, 2] }\n });\n\n // Call the handler directly\n (editorNode as any).handleActionOrderChanged(orderChangedEvent);\n\n // Verify the actions were reordered correctly\n expect((editorNode as any).node.actions).to.have.length(3);\n expect(((editorNode as any).node.actions[0] as any).text).to.equal(\n 'Second'\n );\n expect(((editorNode as any).node.actions[1] as any).text).to.equal(\n 'Third'\n );\n expect(((editorNode as any).node.actions[2] as any).text).to.equal(\n 'First'\n );\n });\n\n it('preserves action data during reordering', () => {\n const mockNode: Node = {\n uuid: 'preserve-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'Message 1',\n quick_replies: ['Yes', 'No']\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Message 2',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n (editorNode as any).node = mockNode;\n\n // Swap the two actions\n const orderChangedEvent = new CustomEvent(CustomEventType.OrderChanged, {\n detail: { swap: [0, 1] }\n });\n\n (editorNode as any).handleActionOrderChanged(orderChangedEvent);\n\n // Verify all action data is preserved\n expect((editorNode as any).node.actions).to.have.length(2);\n expect(((editorNode as any).node.actions[0] as any).text).to.equal(\n 'Message 2'\n );\n expect(\n ((editorNode as any).node.actions[0] as any).quick_replies\n ).to.deep.equal([]);\n expect(((editorNode as any).node.actions[1] as any).text).to.equal(\n 'Message 1'\n );\n expect(\n ((editorNode as any).node.actions[1] as any).quick_replies\n ).to.deep.equal(['Yes', 'No']);\n });\n\n it('integrates with SortableList for full drag functionality', async () => {\n const mockNode: Node = {\n uuid: 'integration-drag-test',\n actions: [\n {\n type: 'send_msg',\n uuid: 'action-1',\n text: 'First Action',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-2',\n text: 'Second Action',\n quick_replies: []\n } as any,\n {\n type: 'send_msg',\n uuid: 'action-3',\n text: 'Third Action',\n quick_replies: []\n } as any\n ],\n exits: []\n };\n\n const mockUI: NodeUI = {\n position: { left: 100, top: 200 },\n type: 'execute_actions'\n };\n\n // Set properties on the component\n (editorNode as any).node = mockNode;\n (editorNode as any).ui = mockUI;\n\n // Render the full component\n const renderResult = editorNode.render();\n const container = await fixture(html`<div>${renderResult}</div>`);\n\n // Find the sortable list\n const sortableList = container.querySelector('temba-sortable-list');\n expect(sortableList).to.exist;\n\n // Verify all actions are rendered as sortable items\n const sortableItems = container.querySelectorAll('.sortable');\n expect(sortableItems).to.have.length(3);\n\n // Verify each action has correct ID and structure\n expect(sortableItems[0].id).to.equal('action-0');\n expect(sortableItems[1].id).to.equal('action-1');\n expect(sortableItems[2].id).to.equal('action-2');\n\n // Verify drag handles are present\n const dragHandles = container.querySelectorAll('.drag-handle');\n expect(dragHandles).to.have.length(3);\n });\n });\n});\n"]}
@@ -3,7 +3,7 @@ import { fixture, expect, assert } from '@open-wc/testing';
3
3
  import { useFakeTimers } from 'sinon';
4
4
  import { Options } from '../src/options/Options';
5
5
  import { Select } from '../src/select/Select';
6
- import { assertScreenshot, delay, getClip, getOptions, loadStore, openAndClick, openSelect } from './utils.test';
6
+ import { assertScreenshot, getClip, getOptions, loadStore, openAndClick, openSelect, waitForSelectPagination } from './utils.test';
7
7
  const colors = [
8
8
  { name: 'Red', value: '0' },
9
9
  { name: 'Green', value: '1' },
@@ -445,19 +445,9 @@ describe('temba-select', () => {
445
445
  valueKey: 'uuid'
446
446
  }));
447
447
  await openSelect(clock, select);
448
- // Wait for pagination to complete - keep checking until fetching is false
449
- // and we have the expected number of results (15 = 3 pages * 5 items)
450
- let attempts = 0;
451
- const maxAttempts = 10;
452
- while (select.fetching || select.visibleOptions.length < 15) {
453
- if (attempts >= maxAttempts) {
454
- throw new Error(`Pagination did not complete after ${maxAttempts} attempts. fetching: ${select.fetching}, visibleOptions: ${select.visibleOptions.length}`);
455
- }
456
- await select.updateComplete;
457
- clock.runAll();
458
- attempts++;
459
- await delay(100);
460
- }
448
+ // Wait for pagination to complete using our improved helper
449
+ // Use more attempts for this test since pagination can be slow in CI
450
+ await waitForSelectPagination(select, clock, 15, 50);
461
451
  // should have all three pages visible right away
462
452
  assert.equal(select.visibleOptions.length, 15);
463
453
  });
@@ -470,11 +460,16 @@ describe('temba-select', () => {
470
460
  }));
471
461
  // wait for updates from fetching three pages
472
462
  await openSelect(clock, select);
463
+ await waitForSelectPagination(select, clock, 15, 50);
473
464
  assert.equal(select.visibleOptions.length, 15);
474
465
  // close and reopen
475
466
  select.blur();
476
467
  await clock.tick(250);
468
+ // Ensure the select is properly closed before reopening
469
+ await select.updateComplete;
477
470
  await openSelect(clock, select);
471
+ // Cached results should be available immediately, but give some time for rendering
472
+ await waitForSelectPagination(select, clock, 15, 30);
478
473
  assert.equal(select.visibleOptions.length, 15);
479
474
  // close and reopen once more (previous bug failed on third opening)
480
475
  // select.blur();
@@ -1 +1 @@
1
- {"version":3,"file":"temba-select.test.js","sourceRoot":"","sources":["../../test/temba-select.test.ts"],"names":[],"mappings":"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","sourcesContent":["import Sinon, * as sinon from 'sinon';\nimport { fixture, expect, assert } from '@open-wc/testing';\nimport { useFakeTimers } from 'sinon';\nimport { Options } from '../src/options/Options';\nimport { Select, SelectOption } from '../src/select/Select';\nimport {\n assertScreenshot,\n delay,\n getClip,\n getOptions,\n loadStore,\n openAndClick,\n openSelect\n} from './utils.test';\n\nconst colors = [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1' },\n { name: 'Blue', value: '2' }\n];\n\nexport const createSelect = async (clock, def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 400px;');\n\n const select: Select<SelectOption> = await fixture(def, { parentNode });\n clock.runAll();\n await select.updateComplete;\n return select;\n};\n\nexport const clear = (select: Select<SelectOption>) => {\n (select.shadowRoot.querySelector('.clear-button') as HTMLDivElement).click();\n};\n\nexport const getSelectHTML = (\n options: SelectOption[] = colors,\n attrs: any = { placeholder: 'Select a color', name: 'color' },\n selected: any = null\n): string => {\n const selectHTML = `\n <temba-select${Object.keys(attrs)\n .map((name: string) => {\n // check if it's a string attribute\n if (typeof attrs[name] === 'string') {\n return ` ${name}=\"${attrs[name].replace(/\"/g, '&quot;')}\"`;\n }\n\n if (typeof attrs[name] === 'boolean') {\n return ` ${name}`;\n }\n\n return ` ${name}=\"${attrs[name]}\"`;\n })\n .join(' ')}>\n ${options\n .map(\n (option) =>\n `<temba-option name=\"${option.name}\" value=\"${option.value}\"${\n option.selected || option.value === selected ? ' selected' : ''\n }></temba-option>`\n )\n .join('')}\n </temba-select>`;\n return selectHTML;\n};\n\nconst getClipWithOptions = (select: Select<any>) => {\n const selectClip = getClip(select);\n const options = select.shadowRoot.querySelector(\n 'temba-options[visible]'\n ) as Options;\n\n if (options) {\n const optionsClip = getClip(options);\n const y = Math.min(selectClip.y, optionsClip.y);\n const x = Math.min(selectClip.x, optionsClip.x);\n const combinedClip = {\n y,\n x,\n width: Math.max(selectClip.right, optionsClip.right) - x,\n height: Math.max(selectClip.bottom, optionsClip.bottom) - y\n };\n return combinedClip;\n }\n\n return selectClip;\n};\n\ndescribe('temba-select', () => {\n let clock: Sinon.SinonFakeTimers;\n beforeEach(function () {\n clock = useFakeTimers();\n clock.tick(400);\n setViewport({ width: 500, height: 1000, deviceScaleFactor: 2 });\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const select = await createSelect(clock, '<temba-select></temba-select>');\n assert.instanceOf(select, Select);\n });\n\n it('can be disabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled', getClip(select));\n });\n\n it('can be disabled with selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true, value: '0' })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled-selection', getClip(select));\n });\n\n it('can be disabled with multi selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n\n await openAndClick(clock, select, 0);\n select.disabled = true;\n expect(select.disabled).to.equal(true);\n\n // make sure we can't select anymore\n await openSelect(clock, select);\n expect(select.isOpen()).to.equal(false);\n await assertScreenshot('select/disabled-multi-selection', getClip(select));\n });\n\n it('can be created with temba-option tags', async () => {\n const select = await createSelect(clock, getSelectHTML());\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values.length).to.equal(0);\n await assertScreenshot('select/with-placeholder', getClip(select));\n });\n\n it('picks the first option without a placeholder', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}));\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values[0].name).to.equal('Red');\n await assertScreenshot('select/without-placeholder', getClip(select));\n });\n\n it('shows options when opened', async () => {\n const select = await createSelect(clock, getSelectHTML());\n await openSelect(clock, select);\n const options = getOptions(select);\n assert.instanceOf(options, Options);\n\n // our options should be visible\n assert.isTrue(\n options.shadowRoot\n .querySelector('.options-container')\n .classList.contains('show')\n );\n\n await assertScreenshot('select/local-options', getClipWithOptions(select));\n });\n\n it('can be created with attribute options', async () => {\n const options = JSON.stringify([{ name: 'Embedded Option', value: '0' }]);\n const select = await createSelect(clock, getSelectHTML([], { options }));\n // select the first option\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Embedded Option');\n await assertScreenshot('select/embedded', getClipWithOptions(select));\n });\n\n it('shows no options message when opening with empty options', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], { placeholder: 'Select an option' })\n );\n\n // attempt to open the select with no options\n await openSelect(clock, select);\n\n // should show options dropdown even though there are no options\n const options = getOptions(select);\n assert.instanceOf(options, Options);\n\n // the options dropdown should be visible\n assert.isTrue(\n options.shadowRoot\n .querySelector('.options-container')\n .classList.contains('show')\n );\n\n // should contain a \"No options\" message\n const noOptionsText = options.shadowRoot.textContent;\n assert.include(noOptionsText.toLowerCase(), 'no options');\n\n await assertScreenshot('select/empty-options', getClipWithOptions(select));\n });\n\n describe('single selection', () => {\n it('can select a single option', async () => {\n const select = await createSelect(clock, getSelectHTML());\n\n // nothing is selected to start\n expect(select.values.length).to.equal(0);\n expect(select.value).to.equal(null);\n\n // select the first option\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n await openAndClick(clock, select, 0);\n\n assert(changeEvent.called, 'change event not fired');\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n\n await assertScreenshot(\n 'select/selected-single',\n getClipWithOptions(select)\n );\n });\n\n it('can search with existing selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the second option\n await openAndClick(clock, select, 1);\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Green');\n\n // for single selection our current selection should be in the list and focused\n await openSelect(clock, select);\n assert.equal(select.cursorIndex, 1);\n assert.equal(select.visibleOptions.length, 3);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot(\n 'select/search-with-selected',\n getClipWithOptions(select)\n );\n\n // but our cursor should be on the first match\n assert.equal(select.cursorIndex, 0);\n });\n });\n\n describe('multiple selection', () => {\n it('can select multiple options', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option twice\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n // now we should have red and green selected\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi',\n getClipWithOptions(select)\n );\n });\n\n it('can select multiple options until maxitems', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n multi: true,\n maxItems: 2\n })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option 3 times, only 2 (maxitems) options are handled and added\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 0);\n assert(!changeEvent.called, 'change event should not be fired');\n\n // but we should have red and green selected only, no blue\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi-maxitems-reached',\n getClipWithOptions(select)\n );\n });\n\n it('shows multiple values on initialization', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(\n [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ],\n {\n placeholder: 'Select a color',\n multi: true\n }\n )\n );\n await assertScreenshot('select/multiple-initial-values', getClip(select));\n expect(select.values.length).to.equal(2);\n });\n });\n\n describe('drag and drop reordering', () => {\n it('handles drag and drop with swap-based logic', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(\n [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ],\n {\n placeholder: 'Select colors',\n multi: true\n }\n )\n );\n\n // Verify initial order: Red, Green, Blue\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Green');\n expect(select.values[2].name).to.equal('Blue');\n\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.not.be.null;\n\n // Example 1: Pick up Blue (index 2), drop between Red and Green\n // Expected result: Red, Blue, Green (swap [1,2])\n const blueItem = sortableList.querySelector('#selected-2');\n const greenItem = sortableList.querySelector('#selected-1');\n expect(blueItem).to.not.be.null;\n expect(greenItem).to.not.be.null;\n\n const blueBounds = blueItem.getBoundingClientRect();\n const greenBounds = greenItem.getBoundingClientRect();\n\n // Start drag from Blue item\n await moveMouse(blueBounds.left + 10, blueBounds.top + 10);\n await mouseDown();\n\n // Drag to position between Red and Green (left side of Green)\n await moveMouse(greenBounds.left - 5, greenBounds.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: Red, Blue, Green (Green and Blue swapped)\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Blue');\n expect(select.values[2].name).to.equal('Green');\n\n // Reset for next test\n select.values = [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ];\n await select.updateComplete;\n\n // Example 2: Pick up Red (index 0), drop at end\n // Expected result: Green, Blue, Red (swap [0,2])\n const redItem = sortableList.querySelector('#selected-0');\n const redBounds = redItem.getBoundingClientRect();\n const blueItemBounds = sortableList\n .querySelector('#selected-2')\n .getBoundingClientRect();\n\n // Start drag from Red item\n await moveMouse(redBounds.left + 10, redBounds.top + 10);\n await mouseDown();\n\n // Drag to end position (right side of Blue)\n await moveMouse(blueItemBounds.right + 5, blueItemBounds.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: Green, Blue, Red (Red and Blue swapped)\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Green');\n expect(select.values[1].name).to.equal('Blue');\n expect(select.values[2].name).to.equal('Red');\n\n // Reset for next test\n select.values = [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ];\n await select.updateComplete;\n\n // Example 3: Pick up Green (index 1), drop at same position\n // Expected result: No change, no event\n const greenItemNew = sortableList.querySelector('#selected-1');\n const greenBoundsNew = greenItemNew.getBoundingClientRect();\n\n // Start drag from Green item\n await moveMouse(greenBoundsNew.left + 10, greenBoundsNew.top + 10);\n await mouseDown();\n\n // Drag slightly but return to same position\n await moveMouse(greenBoundsNew.left + 15, greenBoundsNew.top + 10);\n await moveMouse(greenBoundsNew.left + 10, greenBoundsNew.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: No change\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Green');\n expect(select.values[2].name).to.equal('Blue');\n });\n\n it('does not show sortable list for single item', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([{ name: 'Red', value: '0', selected: true }], {\n placeholder: 'Select a color',\n multi: true\n })\n );\n\n // Should not have a sortable list with only one item\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.be.null;\n\n // Should still show the selected item normally\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n });\n\n it('does not show sortable list for non-multi select', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([{ name: 'Red', value: '0', selected: true }], {\n placeholder: 'Select a color',\n multi: false\n })\n );\n\n // Should not have a sortable list for single select\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.be.null;\n\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n });\n });\n\n describe('tags functionality', () => {\n it('shows selected item text when typing second tag', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Enter tags',\n multi: true,\n searchable: true,\n tags: true\n })\n );\n\n // Add first tag programmatically (simulating user adding first tag)\n select.addValue({ name: 'Yes', value: 'Yes' });\n await select.updateComplete;\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Yes');\n\n // Check that the first tag is displayed with text\n let selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n expect(selectedItems[0].textContent).to.contain('Yes');\n\n // Start typing second tag (this should not hide the first tag's text)\n await typeInto('temba-select', 'No', false, false);\n\n // Check that first tag text is still visible while typing second tag\n selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n\n // The selected item should still contain the text \"Yes\"\n const firstItemText = selectedItems[0].textContent;\n expect(firstItemText).to.contain('Yes');\n });\n\n it('hides selected item text when typing in single-select mode', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true\n })\n );\n\n // Select an option first\n await openAndClick(clock, select, 0); // Select Red\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n\n // Check that the selected item is displayed with text when not typing\n let selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n expect(selectedItems[0].textContent).to.contain('Red');\n\n // Start typing in the search box\n await typeInto('temba-select', 'gr', false, false);\n\n // Check that selected item text is hidden while typing (preserving single-select behavior)\n selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n\n // The selected item should NOT contain the text \"Red\" when typing\n const itemText = selectedItems[0].textContent.trim();\n expect(itemText).to.not.contain('Red');\n });\n });\n\n describe('static options', () => {\n it('accepts an initial value', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { value: '1' })\n );\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot('select/static-initial-value', getClip(select));\n });\n\n it('honors temba-option selected attribute', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}, '1'));\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot(\n 'select/static-initial-via-selected',\n getClip(select)\n );\n });\n });\n\n describe('endpoints', () => {\n it('can load from an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json'\n })\n );\n\n await openSelect(clock, select);\n await assertScreenshot(\n 'select/remote-options',\n getClipWithOptions(select)\n );\n assert.equal(select.visibleOptions.length, 3);\n });\n\n it('can search an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true\n })\n );\n\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot('select/searching', getClipWithOptions(select));\n });\n\n it('can use an endpoint and allow multiple', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true,\n multi: true\n })\n );\n\n await assertScreenshot(\n 'select/multi-with-endpoint',\n getClipWithOptions(select)\n );\n\n // await typeInto('temba-select', 're', false);\n // await open(select);\n // assert.equal(select.visibleOptions.length, 2);\n });\n\n it('pages through cursor results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid'\n })\n );\n\n await openSelect(clock, select);\n\n // Wait for pagination to complete - keep checking until fetching is false\n // and we have the expected number of results (15 = 3 pages * 5 items)\n let attempts = 0;\n const maxAttempts = 10;\n while (select.fetching || select.visibleOptions.length < 15) {\n if (attempts >= maxAttempts) {\n throw new Error(\n `Pagination did not complete after ${maxAttempts} attempts. fetching: ${select.fetching}, visibleOptions: ${select.visibleOptions.length}`\n );\n }\n await select.updateComplete;\n clock.runAll();\n attempts++;\n await delay(100);\n }\n\n // should have all three pages visible right away\n assert.equal(select.visibleOptions.length, 15);\n });\n\n it('shows cached results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid',\n searchable: true\n })\n );\n\n // wait for updates from fetching three pages\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen\n select.blur();\n await clock.tick(250);\n\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen once more (previous bug failed on third opening)\n // select.blur();\n // await open(select);\n // assert.equal(select.visibleOptions.length, 15);\n });\n\n it('can enter expressions', async () => {\n await loadStore();\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n endpoint: '/colors.json',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'Hi there @contact', false);\n await openSelect(clock, select);\n\n assert.equal(select.completionOptions.length, 14);\n await assertScreenshot('select/expressions', getClipWithOptions(select));\n });\n\n it('clears single selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { clearable: true })\n );\n assert.equal(select.getStaticOptions().length, 3);\n\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Red');\n\n await assertScreenshot('select/selection-clearable', getClip(select));\n\n clear(select);\n expect(select.values.length).to.equal(0);\n });\n\n it('should look the same with search enabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true\n })\n );\n await assertScreenshot(\n 'select/search-enabled',\n getClipWithOptions(select)\n );\n });\n\n it('should look the same with search enabled and selection made', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n await assertScreenshot(\n 'select/search-selected',\n getClipWithOptions(select)\n );\n });\n\n it('should show focus for the selected option', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n\n // now open and look at focus\n await openSelect(clock, select);\n await assertScreenshot(\n 'select/search-selected-focus',\n getClipWithOptions(select)\n );\n });\n\n it('should show search with existing multiple selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n multi: true\n })\n );\n\n // select the first option\n await openAndClick(clock, select, 0);\n await openAndClick(clock, select, 0);\n await openSelect(clock, select);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n\n // should have two things selected and active query and no matching options\n await assertScreenshot(\n 'select/search-multi-no-matches',\n getClipWithOptions(select)\n );\n });\n\n it('should show functions', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'look at @(max(m', false);\n await openSelect(clock, select);\n\n await assertScreenshot('select/functions', getClipWithOptions(select));\n });\n\n it('should truncate selection if necessesary', async () => {\n const options = [\n {\n name: 'this_is_a_long_selection_to_make_sure_it_truncates_but_it_needs_to_be_longer',\n value: '0'\n }\n ];\n\n const select = await createSelect(\n clock,\n getSelectHTML(options, {\n value: '0'\n })\n );\n\n await assertScreenshot(\n 'select/truncated-selection',\n getClipWithOptions(select)\n );\n });\n\n it('can select expression completion as value', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n multi: true,\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', '@con', false);\n await openAndClick(clock, select, 0);\n\n expect(select.values[0].name).to.equal('@contact');\n await assertScreenshot(\n 'select/expression-selected',\n getClipWithOptions(select)\n );\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-select.test.js","sourceRoot":"","sources":["../../test/temba-select.test.ts"],"names":[],"mappings":"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","sourcesContent":["import Sinon, * as sinon from 'sinon';\nimport { fixture, expect, assert } from '@open-wc/testing';\nimport { useFakeTimers } from 'sinon';\nimport { Options } from '../src/options/Options';\nimport { Select, SelectOption } from '../src/select/Select';\nimport {\n assertScreenshot,\n getClip,\n getOptions,\n loadStore,\n openAndClick,\n openSelect,\n waitForSelectPagination\n} from './utils.test';\n\nconst colors = [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1' },\n { name: 'Blue', value: '2' }\n];\n\nexport const createSelect = async (clock, def: string) => {\n const parentNode = document.createElement('div');\n parentNode.setAttribute('style', 'width: 400px;');\n\n const select: Select<SelectOption> = await fixture(def, { parentNode });\n clock.runAll();\n await select.updateComplete;\n return select;\n};\n\nexport const clear = (select: Select<SelectOption>) => {\n (select.shadowRoot.querySelector('.clear-button') as HTMLDivElement).click();\n};\n\nexport const getSelectHTML = (\n options: SelectOption[] = colors,\n attrs: any = { placeholder: 'Select a color', name: 'color' },\n selected: any = null\n): string => {\n const selectHTML = `\n <temba-select${Object.keys(attrs)\n .map((name: string) => {\n // check if it's a string attribute\n if (typeof attrs[name] === 'string') {\n return ` ${name}=\"${attrs[name].replace(/\"/g, '&quot;')}\"`;\n }\n\n if (typeof attrs[name] === 'boolean') {\n return ` ${name}`;\n }\n\n return ` ${name}=\"${attrs[name]}\"`;\n })\n .join(' ')}>\n ${options\n .map(\n (option) =>\n `<temba-option name=\"${option.name}\" value=\"${option.value}\"${\n option.selected || option.value === selected ? ' selected' : ''\n }></temba-option>`\n )\n .join('')}\n </temba-select>`;\n return selectHTML;\n};\n\nconst getClipWithOptions = (select: Select<any>) => {\n const selectClip = getClip(select);\n const options = select.shadowRoot.querySelector(\n 'temba-options[visible]'\n ) as Options;\n\n if (options) {\n const optionsClip = getClip(options);\n const y = Math.min(selectClip.y, optionsClip.y);\n const x = Math.min(selectClip.x, optionsClip.x);\n const combinedClip = {\n y,\n x,\n width: Math.max(selectClip.right, optionsClip.right) - x,\n height: Math.max(selectClip.bottom, optionsClip.bottom) - y\n };\n return combinedClip;\n }\n\n return selectClip;\n};\n\ndescribe('temba-select', () => {\n let clock: Sinon.SinonFakeTimers;\n beforeEach(function () {\n clock = useFakeTimers();\n clock.tick(400);\n setViewport({ width: 500, height: 1000, deviceScaleFactor: 2 });\n });\n\n afterEach(function () {\n clock.restore();\n });\n\n it('can be created', async () => {\n const select = await createSelect(clock, '<temba-select></temba-select>');\n assert.instanceOf(select, Select);\n });\n\n it('can be disabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled', getClip(select));\n });\n\n it('can be disabled with selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { disabled: true, value: '0' })\n );\n\n expect(select.disabled).to.equal(true);\n await assertScreenshot('select/disabled-selection', getClip(select));\n });\n\n it('can be disabled with multi selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n\n await openAndClick(clock, select, 0);\n select.disabled = true;\n expect(select.disabled).to.equal(true);\n\n // make sure we can't select anymore\n await openSelect(clock, select);\n expect(select.isOpen()).to.equal(false);\n await assertScreenshot('select/disabled-multi-selection', getClip(select));\n });\n\n it('can be created with temba-option tags', async () => {\n const select = await createSelect(clock, getSelectHTML());\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values.length).to.equal(0);\n await assertScreenshot('select/with-placeholder', getClip(select));\n });\n\n it('picks the first option without a placeholder', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}));\n assert.equal(select.getStaticOptions().length, 3);\n expect(select.values[0].name).to.equal('Red');\n await assertScreenshot('select/without-placeholder', getClip(select));\n });\n\n it('shows options when opened', async () => {\n const select = await createSelect(clock, getSelectHTML());\n await openSelect(clock, select);\n const options = getOptions(select);\n assert.instanceOf(options, Options);\n\n // our options should be visible\n assert.isTrue(\n options.shadowRoot\n .querySelector('.options-container')\n .classList.contains('show')\n );\n\n await assertScreenshot('select/local-options', getClipWithOptions(select));\n });\n\n it('can be created with attribute options', async () => {\n const options = JSON.stringify([{ name: 'Embedded Option', value: '0' }]);\n const select = await createSelect(clock, getSelectHTML([], { options }));\n // select the first option\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Embedded Option');\n await assertScreenshot('select/embedded', getClipWithOptions(select));\n });\n\n it('shows no options message when opening with empty options', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], { placeholder: 'Select an option' })\n );\n\n // attempt to open the select with no options\n await openSelect(clock, select);\n\n // should show options dropdown even though there are no options\n const options = getOptions(select);\n assert.instanceOf(options, Options);\n\n // the options dropdown should be visible\n assert.isTrue(\n options.shadowRoot\n .querySelector('.options-container')\n .classList.contains('show')\n );\n\n // should contain a \"No options\" message\n const noOptionsText = options.shadowRoot.textContent;\n assert.include(noOptionsText.toLowerCase(), 'no options');\n\n await assertScreenshot('select/empty-options', getClipWithOptions(select));\n });\n\n describe('single selection', () => {\n it('can select a single option', async () => {\n const select = await createSelect(clock, getSelectHTML());\n\n // nothing is selected to start\n expect(select.values.length).to.equal(0);\n expect(select.value).to.equal(null);\n\n // select the first option\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n await openAndClick(clock, select, 0);\n\n assert(changeEvent.called, 'change event not fired');\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n\n await assertScreenshot(\n 'select/selected-single',\n getClipWithOptions(select)\n );\n });\n\n it('can search with existing selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the second option\n await openAndClick(clock, select, 1);\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Green');\n\n // for single selection our current selection should be in the list and focused\n await openSelect(clock, select);\n assert.equal(select.cursorIndex, 1);\n assert.equal(select.visibleOptions.length, 3);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot(\n 'select/search-with-selected',\n getClipWithOptions(select)\n );\n\n // but our cursor should be on the first match\n assert.equal(select.cursorIndex, 0);\n });\n });\n\n describe('multiple selection', () => {\n it('can select multiple options', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { placeholder: 'Select a color', multi: true })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option twice\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n // now we should have red and green selected\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi',\n getClipWithOptions(select)\n );\n });\n\n it('can select multiple options until maxitems', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n multi: true,\n maxItems: 2\n })\n );\n expect(select.values.length).to.equal(0);\n\n const changeEvent = sinon.spy();\n select.addEventListener('change', changeEvent);\n\n // select the first option 3 times, only 2 (maxitems) options are handled and added\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openAndClick(clock, select, 0);\n assert(changeEvent.called, 'change event not fired');\n\n changeEvent.resetHistory();\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 0);\n assert(!changeEvent.called, 'change event should not be fired');\n\n // but we should have red and green selected only, no blue\n expect(select.values.length).to.equal(2);\n expect(select.shadowRoot.innerHTML).to.contain('Red');\n expect(select.shadowRoot.innerHTML).to.contain('Green');\n\n await assertScreenshot(\n 'select/selected-multi-maxitems-reached',\n getClipWithOptions(select)\n );\n });\n\n it('shows multiple values on initialization', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(\n [\n { name: 'Red', value: '0' },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ],\n {\n placeholder: 'Select a color',\n multi: true\n }\n )\n );\n await assertScreenshot('select/multiple-initial-values', getClip(select));\n expect(select.values.length).to.equal(2);\n });\n });\n\n describe('drag and drop reordering', () => {\n it('handles drag and drop with swap-based logic', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(\n [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ],\n {\n placeholder: 'Select colors',\n multi: true\n }\n )\n );\n\n // Verify initial order: Red, Green, Blue\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Green');\n expect(select.values[2].name).to.equal('Blue');\n\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.not.be.null;\n\n // Example 1: Pick up Blue (index 2), drop between Red and Green\n // Expected result: Red, Blue, Green (swap [1,2])\n const blueItem = sortableList.querySelector('#selected-2');\n const greenItem = sortableList.querySelector('#selected-1');\n expect(blueItem).to.not.be.null;\n expect(greenItem).to.not.be.null;\n\n const blueBounds = blueItem.getBoundingClientRect();\n const greenBounds = greenItem.getBoundingClientRect();\n\n // Start drag from Blue item\n await moveMouse(blueBounds.left + 10, blueBounds.top + 10);\n await mouseDown();\n\n // Drag to position between Red and Green (left side of Green)\n await moveMouse(greenBounds.left - 5, greenBounds.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: Red, Blue, Green (Green and Blue swapped)\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Blue');\n expect(select.values[2].name).to.equal('Green');\n\n // Reset for next test\n select.values = [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ];\n await select.updateComplete;\n\n // Example 2: Pick up Red (index 0), drop at end\n // Expected result: Green, Blue, Red (swap [0,2])\n const redItem = sortableList.querySelector('#selected-0');\n const redBounds = redItem.getBoundingClientRect();\n const blueItemBounds = sortableList\n .querySelector('#selected-2')\n .getBoundingClientRect();\n\n // Start drag from Red item\n await moveMouse(redBounds.left + 10, redBounds.top + 10);\n await mouseDown();\n\n // Drag to end position (right side of Blue)\n await moveMouse(blueItemBounds.right + 5, blueItemBounds.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: Green, Blue, Red (Red and Blue swapped)\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Green');\n expect(select.values[1].name).to.equal('Blue');\n expect(select.values[2].name).to.equal('Red');\n\n // Reset for next test\n select.values = [\n { name: 'Red', value: '0', selected: true },\n { name: 'Green', value: '1', selected: true },\n { name: 'Blue', value: '2', selected: true }\n ];\n await select.updateComplete;\n\n // Example 3: Pick up Green (index 1), drop at same position\n // Expected result: No change, no event\n const greenItemNew = sortableList.querySelector('#selected-1');\n const greenBoundsNew = greenItemNew.getBoundingClientRect();\n\n // Start drag from Green item\n await moveMouse(greenBoundsNew.left + 10, greenBoundsNew.top + 10);\n await mouseDown();\n\n // Drag slightly but return to same position\n await moveMouse(greenBoundsNew.left + 15, greenBoundsNew.top + 10);\n await moveMouse(greenBoundsNew.left + 10, greenBoundsNew.top + 10);\n await waitFor(100);\n await mouseUp();\n clock.runAll();\n\n // Verify result: No change\n expect(select.values.length).to.equal(3);\n expect(select.values[0].name).to.equal('Red');\n expect(select.values[1].name).to.equal('Green');\n expect(select.values[2].name).to.equal('Blue');\n });\n\n it('does not show sortable list for single item', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([{ name: 'Red', value: '0', selected: true }], {\n placeholder: 'Select a color',\n multi: true\n })\n );\n\n // Should not have a sortable list with only one item\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.be.null;\n\n // Should still show the selected item normally\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n });\n\n it('does not show sortable list for non-multi select', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([{ name: 'Red', value: '0', selected: true }], {\n placeholder: 'Select a color',\n multi: false\n })\n );\n\n // Should not have a sortable list for single select\n const sortableList = select.shadowRoot.querySelector(\n 'temba-sortable-list'\n );\n expect(sortableList).to.be.null;\n\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n });\n });\n\n describe('tags functionality', () => {\n it('shows selected item text when typing second tag', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Enter tags',\n multi: true,\n searchable: true,\n tags: true\n })\n );\n\n // Add first tag programmatically (simulating user adding first tag)\n select.addValue({ name: 'Yes', value: 'Yes' });\n await select.updateComplete;\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Yes');\n\n // Check that the first tag is displayed with text\n let selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n expect(selectedItems[0].textContent).to.contain('Yes');\n\n // Start typing second tag (this should not hide the first tag's text)\n await typeInto('temba-select', 'No', false, false);\n\n // Check that first tag text is still visible while typing second tag\n selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n\n // The selected item should still contain the text \"Yes\"\n const firstItemText = selectedItems[0].textContent;\n expect(firstItemText).to.contain('Yes');\n });\n\n it('hides selected item text when typing in single-select mode', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true\n })\n );\n\n // Select an option first\n await openAndClick(clock, select, 0); // Select Red\n expect(select.values.length).to.equal(1);\n expect(select.values[0].name).to.equal('Red');\n\n // Check that the selected item is displayed with text when not typing\n let selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n expect(selectedItems[0].textContent).to.contain('Red');\n\n // Start typing in the search box\n await typeInto('temba-select', 'gr', false, false);\n\n // Check that selected item text is hidden while typing (preserving single-select behavior)\n selectedItems = select.shadowRoot.querySelectorAll('.selected-item');\n expect(selectedItems.length).to.equal(1);\n\n // The selected item should NOT contain the text \"Red\" when typing\n const itemText = selectedItems[0].textContent.trim();\n expect(itemText).to.not.contain('Red');\n });\n });\n\n describe('static options', () => {\n it('accepts an initial value', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { value: '1' })\n );\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot('select/static-initial-value', getClip(select));\n });\n\n it('honors temba-option selected attribute', async () => {\n const select = await createSelect(clock, getSelectHTML(colors, {}, '1'));\n expect(select.values[0].name).to.equal('Green');\n await assertScreenshot(\n 'select/static-initial-via-selected',\n getClip(select)\n );\n });\n });\n\n describe('endpoints', () => {\n it('can load from an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json'\n })\n );\n\n await openSelect(clock, select);\n await assertScreenshot(\n 'select/remote-options',\n getClipWithOptions(select)\n );\n assert.equal(select.visibleOptions.length, 3);\n });\n\n it('can search an endpoint', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true\n })\n );\n\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n assert.equal(select.visibleOptions.length, 2);\n\n await assertScreenshot('select/searching', getClipWithOptions(select));\n });\n\n it('can use an endpoint and allow multiple', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a color',\n endpoint: '/test-assets/select/colors.json',\n searchable: true,\n multi: true\n })\n );\n\n await assertScreenshot(\n 'select/multi-with-endpoint',\n getClipWithOptions(select)\n );\n\n // await typeInto('temba-select', 're', false);\n // await open(select);\n // assert.equal(select.visibleOptions.length, 2);\n });\n\n it('pages through cursor results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid'\n })\n );\n\n await openSelect(clock, select);\n\n // Wait for pagination to complete using our improved helper\n // Use more attempts for this test since pagination can be slow in CI\n await waitForSelectPagination(select, clock, 15, 50);\n\n // should have all three pages visible right away\n assert.equal(select.visibleOptions.length, 15);\n });\n\n it('shows cached results', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n placeholder: 'Select a group',\n endpoint: '/test-assets/select/groups.json',\n valueKey: 'uuid',\n searchable: true\n })\n );\n\n // wait for updates from fetching three pages\n await openSelect(clock, select);\n await waitForSelectPagination(select, clock, 15, 50);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen\n select.blur();\n await clock.tick(250);\n // Ensure the select is properly closed before reopening\n await select.updateComplete;\n\n await openSelect(clock, select);\n // Cached results should be available immediately, but give some time for rendering\n await waitForSelectPagination(select, clock, 15, 30);\n assert.equal(select.visibleOptions.length, 15);\n\n // close and reopen once more (previous bug failed on third opening)\n // select.blur();\n // await open(select);\n // assert.equal(select.visibleOptions.length, 15);\n });\n\n it('can enter expressions', async () => {\n await loadStore();\n const select = await createSelect(\n clock,\n getSelectHTML([], {\n endpoint: '/colors.json',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'Hi there @contact', false);\n await openSelect(clock, select);\n\n assert.equal(select.completionOptions.length, 14);\n await assertScreenshot('select/expressions', getClipWithOptions(select));\n });\n\n it('clears single selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { clearable: true })\n );\n assert.equal(select.getStaticOptions().length, 3);\n\n await openAndClick(clock, select, 0);\n expect(select.values[0].name).to.equal('Red');\n\n await assertScreenshot('select/selection-clearable', getClip(select));\n\n clear(select);\n expect(select.values.length).to.equal(0);\n });\n\n it('should look the same with search enabled', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true\n })\n );\n await assertScreenshot(\n 'select/search-enabled',\n getClipWithOptions(select)\n );\n });\n\n it('should look the same with search enabled and selection made', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n await assertScreenshot(\n 'select/search-selected',\n getClipWithOptions(select)\n );\n });\n\n it('should show focus for the selected option', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, { searchable: true })\n );\n\n // select the first option\n await openAndClick(clock, select, 1);\n\n // now open and look at focus\n await openSelect(clock, select);\n await assertScreenshot(\n 'select/search-selected-focus',\n getClipWithOptions(select)\n );\n });\n\n it('should show search with existing multiple selection', async () => {\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n multi: true\n })\n );\n\n // select the first option\n await openAndClick(clock, select, 0);\n await openAndClick(clock, select, 0);\n await openSelect(clock, select);\n\n // now lets do a search, we should see our selection (green) and one other (red)\n await typeInto('temba-select', 're', false);\n await openSelect(clock, select);\n\n // should have two things selected and active query and no matching options\n await assertScreenshot(\n 'select/search-multi-no-matches',\n getClipWithOptions(select)\n );\n });\n\n it('should show functions', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', 'look at @(max(m', false);\n await openSelect(clock, select);\n\n await assertScreenshot('select/functions', getClipWithOptions(select));\n });\n\n it('should truncate selection if necessesary', async () => {\n const options = [\n {\n name: 'this_is_a_long_selection_to_make_sure_it_truncates_but_it_needs_to_be_longer',\n value: '0'\n }\n ];\n\n const select = await createSelect(\n clock,\n getSelectHTML(options, {\n value: '0'\n })\n );\n\n await assertScreenshot(\n 'select/truncated-selection',\n getClipWithOptions(select)\n );\n });\n\n it('can select expression completion as value', async () => {\n await loadStore();\n\n const select = await createSelect(\n clock,\n getSelectHTML(colors, {\n multi: true,\n placeholder: 'Select a color',\n searchable: true,\n expressions: 'session'\n })\n );\n\n await typeInto('temba-select', '@con', false);\n await openAndClick(clock, select, 0);\n\n expect(select.values[0].name).to.equal('@contact');\n await assertScreenshot(\n 'select/expression-selected',\n getClipWithOptions(select)\n );\n });\n });\n});\n"]}
@@ -123,6 +123,17 @@ export const delay = (millis) => {
123
123
  window.setTimeout(resolve, millis);
124
124
  });
125
125
  };
126
+ // Enhanced wait utility for more robust testing
127
+ export const waitForCondition = async (predicate, maxAttempts = 20, delayMs = 50) => {
128
+ let attempts = 0;
129
+ while (!predicate() && attempts < maxAttempts) {
130
+ await delay(delayMs);
131
+ attempts++;
132
+ }
133
+ if (!predicate()) {
134
+ throw new Error(`Condition not met after ${maxAttempts} attempts (${maxAttempts * delayMs}ms)`);
135
+ }
136
+ };
126
137
  export const assertScreenshot = async (filename, clip, waitFor) => {
127
138
  if (waitFor) {
128
139
  if (waitFor.clock) {
@@ -204,7 +215,25 @@ export const getOptions = (select) => {
204
215
  return select.shadowRoot.querySelector('temba-options[visible]');
205
216
  };
206
217
  export const clickOption = async (clock, select, index) => {
218
+ var _a;
207
219
  const options = getOptions(select);
220
+ if (!options) {
221
+ throw new Error('No options element found');
222
+ }
223
+ // Wait for the specific option to be available, but only if it's not already there
224
+ const existingOption = (_a = options.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-option-index="${index}"]`);
225
+ if (!existingOption) {
226
+ try {
227
+ await waitForCondition(() => {
228
+ var _a;
229
+ const option = (_a = options.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-option-index="${index}"]`);
230
+ return !!option;
231
+ }, 10, 25);
232
+ }
233
+ catch (e) {
234
+ throw new Error(`Option at index ${index} not found after waiting`);
235
+ }
236
+ }
208
237
  const option = options.shadowRoot.querySelector(`[data-option-index="${index}"]`);
209
238
  await mouseClickElement(option);
210
239
  await options.updateComplete;
@@ -222,6 +251,21 @@ export const openSelect = async (clock, select) => {
222
251
  // reduce wait time for options to become visible
223
252
  await waitFor(25);
224
253
  clock.runAll();
254
+ // For non-endpoint selects, options might be immediately available
255
+ // For endpoint selects, we need to wait for them to load
256
+ const hasEndpoint = select.getAttribute('endpoint');
257
+ if (hasEndpoint) {
258
+ try {
259
+ // Wait for options to be properly rendered and visible (but only for endpoint selects)
260
+ await waitForCondition(() => {
261
+ const options = select.shadowRoot.querySelector('temba-options[visible]');
262
+ return options && options.isConnected;
263
+ }, 10, 25);
264
+ }
265
+ catch (e) {
266
+ // If condition fails, continue - some tests might not need options to be visible immediately
267
+ }
268
+ }
225
269
  };
226
270
  export const openAndClick = async (clock, select, idx) => {
227
271
  await openSelect(clock, select);
@@ -258,4 +302,22 @@ export const updateComponent = async (compose, text, attachments) => {
258
302
  export const getValidText = () => {
259
303
  return 'sà-wàd-dee!';
260
304
  };
305
+ // Helper for waiting for select pagination to complete
306
+ export const waitForSelectPagination = async (select, clock, expectedCount, maxAttempts = 30) => {
307
+ let attempts = 0;
308
+ while (attempts < maxAttempts) {
309
+ // Ensure we're not still fetching
310
+ if (!select.fetching && select.visibleOptions.length >= expectedCount) {
311
+ return;
312
+ }
313
+ await select.updateComplete;
314
+ clock.runAll();
315
+ // Give more time between attempts for slow CI environments
316
+ await delay(75);
317
+ attempts++;
318
+ }
319
+ throw new Error(`Pagination did not complete after ${maxAttempts} attempts (${maxAttempts * 75}ms). ` +
320
+ `Expected ${expectedCount} options, got ${select.visibleOptions.length}. ` +
321
+ `Fetching: ${select.fetching}`);
322
+ };
261
323
  //# sourceMappingURL=utils.test.js.map