feat: dom rendering pickers
This commit is contained in:
@@ -16,12 +16,58 @@ const DatePicker: React.FC<DatePickerProps> = ({ coordinates, selector, onClose
|
|||||||
setSelectedDate(e.target.value);
|
setSelectedDate(e.target.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const updateDOMElement = (selector: string, value: string) => {
|
||||||
|
try {
|
||||||
|
let iframeElement = document.querySelector('#dom-browser-iframe') as HTMLIFrameElement;
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
iframeElement = document.querySelector('#browser-window iframe') as HTMLIFrameElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
const browserWindow = document.querySelector('#browser-window');
|
||||||
|
if (browserWindow) {
|
||||||
|
iframeElement = browserWindow.querySelector('iframe') as HTMLIFrameElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
console.error('Could not find iframe element for DOM update');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const iframeDoc = iframeElement.contentDocument;
|
||||||
|
if (!iframeDoc) {
|
||||||
|
console.error('Could not access iframe document');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const element = iframeDoc.querySelector(selector) as HTMLInputElement;
|
||||||
|
if (element) {
|
||||||
|
element.value = value;
|
||||||
|
|
||||||
|
const changeEvent = new Event('change', { bubbles: true });
|
||||||
|
element.dispatchEvent(changeEvent);
|
||||||
|
|
||||||
|
const inputEvent = new Event('input', { bubbles: true });
|
||||||
|
element.dispatchEvent(inputEvent);
|
||||||
|
} else {
|
||||||
|
console.warn(`Could not find element with selector: ${selector}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating DOM element:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleConfirm = () => {
|
const handleConfirm = () => {
|
||||||
if (socket && selectedDate) {
|
if (socket && selectedDate) {
|
||||||
socket.emit('input:date', {
|
socket.emit('input:date', {
|
||||||
selector,
|
selector,
|
||||||
value: selectedDate
|
value: selectedDate
|
||||||
});
|
});
|
||||||
|
|
||||||
|
updateDOMElement(selector, selectedDate);
|
||||||
|
|
||||||
onClose();
|
onClose();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,12 +16,58 @@ const DateTimeLocalPicker: React.FC<DateTimeLocalPickerProps> = ({ coordinates,
|
|||||||
setSelectedDateTime(e.target.value);
|
setSelectedDateTime(e.target.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const updateDOMElement = (selector: string, value: string) => {
|
||||||
|
try {
|
||||||
|
let iframeElement = document.querySelector('#dom-browser-iframe') as HTMLIFrameElement;
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
iframeElement = document.querySelector('#browser-window iframe') as HTMLIFrameElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
const browserWindow = document.querySelector('#browser-window');
|
||||||
|
if (browserWindow) {
|
||||||
|
iframeElement = browserWindow.querySelector('iframe') as HTMLIFrameElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
console.error('Could not find iframe element for DOM update');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const iframeDoc = iframeElement.contentDocument;
|
||||||
|
if (!iframeDoc) {
|
||||||
|
console.error('Could not access iframe document');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const element = iframeDoc.querySelector(selector) as HTMLInputElement;
|
||||||
|
if (element) {
|
||||||
|
element.value = value;
|
||||||
|
|
||||||
|
const changeEvent = new Event('change', { bubbles: true });
|
||||||
|
element.dispatchEvent(changeEvent);
|
||||||
|
|
||||||
|
const inputEvent = new Event('input', { bubbles: true });
|
||||||
|
element.dispatchEvent(inputEvent);
|
||||||
|
} else {
|
||||||
|
console.warn(`Could not find element with selector: ${selector}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating DOM element:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleConfirm = () => {
|
const handleConfirm = () => {
|
||||||
if (socket && selectedDateTime) {
|
if (socket && selectedDateTime) {
|
||||||
socket.emit('input:datetime-local', {
|
socket.emit('input:datetime-local', {
|
||||||
selector,
|
selector,
|
||||||
value: selectedDateTime
|
value: selectedDateTime
|
||||||
});
|
});
|
||||||
|
|
||||||
|
updateDOMElement(selector, selectedDateTime);
|
||||||
|
|
||||||
onClose();
|
onClose();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -58,8 +104,8 @@ const DateTimeLocalPicker: React.FC<DateTimeLocalPickerProps> = ({ coordinates,
|
|||||||
onClick={handleConfirm}
|
onClick={handleConfirm}
|
||||||
disabled={!selectedDateTime}
|
disabled={!selectedDateTime}
|
||||||
className={`px-3 py-1 text-sm rounded ${selectedDateTime
|
className={`px-3 py-1 text-sm rounded ${selectedDateTime
|
||||||
? 'bg-blue-500 text-white hover:bg-blue-600'
|
? 'bg-blue-500 text-white hover:bg-blue-600'
|
||||||
: 'bg-gray-300 text-gray-500 cursor-not-allowed'
|
: 'bg-gray-300 text-gray-500 cursor-not-allowed'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
Confirm
|
Confirm
|
||||||
|
|||||||
@@ -18,9 +18,65 @@ const Dropdown = ({ coordinates, selector, options, onClose }: DropdownProps) =>
|
|||||||
const { socket } = useSocketStore();
|
const { socket } = useSocketStore();
|
||||||
const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);
|
const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);
|
||||||
|
|
||||||
|
const updateDOMElement = (selector: string, value: string) => {
|
||||||
|
try {
|
||||||
|
let iframeElement = document.querySelector('#dom-browser-iframe') as HTMLIFrameElement;
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
iframeElement = document.querySelector('#browser-window iframe') as HTMLIFrameElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
const browserWindow = document.querySelector('#browser-window');
|
||||||
|
if (browserWindow) {
|
||||||
|
iframeElement = browserWindow.querySelector('iframe') as HTMLIFrameElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!iframeElement) {
|
||||||
|
console.error('Could not find iframe element for DOM update');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const iframeDoc = iframeElement.contentDocument;
|
||||||
|
if (!iframeDoc) {
|
||||||
|
console.error('Could not access iframe document');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectElement = iframeDoc.querySelector(selector) as HTMLSelectElement;
|
||||||
|
if (selectElement) {
|
||||||
|
selectElement.value = value;
|
||||||
|
|
||||||
|
const optionElements = selectElement.querySelectorAll('option');
|
||||||
|
optionElements.forEach(option => {
|
||||||
|
if (option.value === value) {
|
||||||
|
option.selected = true;
|
||||||
|
option.setAttribute('selected', 'selected');
|
||||||
|
} else {
|
||||||
|
option.selected = false;
|
||||||
|
option.removeAttribute('selected');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const changeEvent = new Event('change', { bubbles: true });
|
||||||
|
selectElement.dispatchEvent(changeEvent);
|
||||||
|
|
||||||
|
const inputEvent = new Event('input', { bubbles: true });
|
||||||
|
selectElement.dispatchEvent(inputEvent);
|
||||||
|
} else {
|
||||||
|
console.warn(`Could not find select element with selector: ${selector}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating DOM select element:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleSelect = (value: string) => {
|
const handleSelect = (value: string) => {
|
||||||
if (socket) {
|
if (socket) {
|
||||||
socket.emit('input:dropdown', { selector, value });
|
socket.emit('input:dropdown', { selector, value });
|
||||||
|
|
||||||
|
updateDOMElement(selector, value);
|
||||||
}
|
}
|
||||||
onClose();
|
onClose();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user