blob: ed54a70842d4d45736648d8fac8f522908ff4e58 [file] [log] [blame]
Davit Tabidze9ca49262024-07-10 15:51:27 +04001function showTooltip(obj) {
2 obj.style.visibility = 'visible';
3 obj.style.opacity = '1';
4}
5function hideTooltip(obj) {
6 obj.style.visibility = 'hidden';
7 obj.style.opacity = '0';
8}
9
Davit Tabidze207ce082024-04-09 19:15:25 +040010document.addEventListener("DOMContentLoaded", function () {
Davit Tabidze00077272024-06-11 20:19:36 +040011 document.getElementById('appFrame-default').contentDocument.write("Welcome to the dodo: application launcher, think of it as your desktop environment. You can launch applications from left-hand side dock. You should setup VPN clients on your devices, so you can install applications from Application Manager and access your private network. Instructions on how to do that can be viewed by clicking <b>Help</b> button after hovering over <b>Headscale</b> icon in the dock.");
Davit Tabidze9ca49262024-07-10 15:51:27 +040012 document.getElementById('appFrame-default').style.backgroundColor = '#d6d6d6';
13 const icons = document.querySelectorAll(".app-icon");
Davit Tabidze00077272024-06-11 20:19:36 +040014 const circle = document.querySelector(".user-circle");
15 const tooltipUser = document.querySelector("#tooltip-user");
Davit Tabidze9ca49262024-07-10 15:51:27 +040016 const initial = document.getElementById('user-initial');
17
18 circle.addEventListener('mouseenter', () => {
19 icons.forEach(icon => {
20 const tooltip = icon.nextElementSibling;
21 hideTooltip(tooltip);
22 });
23 showTooltip(tooltipUser);
24 initial.style.color = "#7f9f7f";
Davit Tabidze00077272024-06-11 20:19:36 +040025 });
26
Davit Tabidze9ca49262024-07-10 15:51:27 +040027 circle.addEventListener('mouseleave', () => {
28 hideTooltip(tooltipUser);
29 initial.style.color = "#d4888d";
30 });
Davit Tabidze00077272024-06-11 20:19:36 +040031
Davit Tabidze9ca49262024-07-10 15:51:27 +040032 let hideTimeout;
33 let activeTooltip;
Davit Tabidze00077272024-06-11 20:19:36 +040034
Davit Tabidze00077272024-06-11 20:19:36 +040035 icons.forEach(function (icon) {
36 icon.addEventListener("click", function (event) {
37 event.stopPropagation();
38 const appUrl = this.getAttribute("data-app-url");
39 const appId = this.getAttribute("data-app-id");
Davit Tabidze9ca49262024-07-10 15:51:27 +040040 const modalId = this.getAttribute("data-modal-id");
41
42 if (!appUrl && modalId) {
Davit Tabidze00077272024-06-11 20:19:36 +040043 openModal(document.getElementById(modalId));
44 } else {
45 if (!iframes[appId]) createIframe(appId, appUrl);
46 showIframe(appId);
Davit Tabidze9ca49262024-07-10 15:51:27 +040047 document.querySelectorAll(".app-icon").forEach((icon) => {
48 icon.style.color = "var(--bodyBg)";
49 });
50 this.style.color = "var(--button)";
51 };
Davit Tabidze00077272024-06-11 20:19:36 +040052 });
Davit Tabidze9ca49262024-07-10 15:51:27 +040053
54 const tooltip = icon.nextElementSibling;
Davit Tabidze207ce082024-04-09 19:15:25 +040055 [
Davit Tabidze9ca49262024-07-10 15:51:27 +040056 ['mouseenter', () => {
57 clearTimeout(hideTimeout);
58 if (activeTooltip && activeTooltip !== tooltip) {
59 hideTooltip(activeTooltip);
60 };
61 const rect = icon.getBoundingClientRect();
62 tooltip.style.top = `${rect.top + 26}px`;
63 showTooltip(tooltip);
64 activeTooltip = tooltip;
65 }],
66 ['mouseleave', () => {
67 hideTimeout = setTimeout(() => {
68 hideTooltip(tooltip);
69 if (activeTooltip === tooltip) {
70 activeTooltip = null;
71 };
72 }, 200);
73 }],
Davit Tabidze207ce082024-04-09 19:15:25 +040074 ].forEach(([event, listener]) => {
Davit Tabidze00077272024-06-11 20:19:36 +040075 icon.addEventListener(event, listener);
Davit Tabidze207ce082024-04-09 19:15:25 +040076 });
Davit Tabidze9ca49262024-07-10 15:51:27 +040077
78 tooltip.addEventListener('mouseenter', () => {
79 clearTimeout(hideTimeout);
80 });
81
82 tooltip.addEventListener('mouseleave', () => {
83 hideTimeout = setTimeout(() => {
84 hideTooltip(tooltip);
85 if (activeTooltip === tooltip) {
86 activeTooltip = null;
87 };
88 }, 200);
89 });
Davit Tabidze00077272024-06-11 20:19:36 +040090 });
91
gio92d86862024-05-21 12:51:31 +040092 let visibleModal = undefined;
Davit Tabidze00077272024-06-11 20:19:36 +040093 const openModal = function (modal) {
gio92d86862024-05-21 12:51:31 +040094 modal.removeAttribute("close");
95 modal.setAttribute("open", true);
Davit Tabidze00077272024-06-11 20:19:36 +040096 visibleModal = modal;
gio92d86862024-05-21 12:51:31 +040097 };
Davit Tabidze9ca49262024-07-10 15:51:27 +040098
Davit Tabidze00077272024-06-11 20:19:36 +040099 const closeModal = function (modal) {
gio92d86862024-05-21 12:51:31 +0400100 modal.removeAttribute("open");
101 modal.setAttribute("close", true);
Davit Tabidze00077272024-06-11 20:19:36 +0400102 visibleModal = undefined;
gio92d86862024-05-21 12:51:31 +0400103 };
Davit Tabidze00077272024-06-11 20:19:36 +0400104
105 const helpButtons = document.querySelectorAll('.help-button');
Davit Tabidze9ca49262024-07-10 15:51:27 +0400106
Davit Tabidze00077272024-06-11 20:19:36 +0400107 helpButtons.forEach(function (button) {
108 button.addEventListener('click', function (event) {
109 event.stopPropagation();
110 const buttonId = button.getAttribute('id');
111 const modalId = 'modal-' + buttonId.substring("help-button-".length);
112 const closeHelpId = "close-help-" + buttonId.substring("help-button-".length);
113 const modal = document.getElementById(modalId);
114 openModal(modal);
115 const closeHelpButton = document.getElementById(closeHelpId);
116 closeHelpButton.addEventListener('click', function (event) {
117 event.stopPropagation();
118 closeModal(modal);
119 });
Davit Tabidze207ce082024-04-09 19:15:25 +0400120 });
gio92d86862024-05-21 12:51:31 +0400121 });
Davit Tabidze00077272024-06-11 20:19:36 +0400122
123 const modalHelpButtons = document.querySelectorAll('.title-menu');
Davit Tabidze9ca49262024-07-10 15:51:27 +0400124
Davit Tabidze00077272024-06-11 20:19:36 +0400125 modalHelpButtons.forEach(function (button) {
126 button.addEventListener('click', function (event) {
127 event.stopPropagation();
128 const helpTitle = button.getAttribute('id');
129 const helpTitleId = helpTitle.substring('title-'.length);
130 const helpContentId = 'help-content-' + helpTitleId;
Davit Tabidze9ca49262024-07-10 15:51:27 +0400131 let clDiv = document.getElementById(helpContentId).parentNode;
132 const allContentElements = clDiv.querySelectorAll('.help-content');
133
Davit Tabidze00077272024-06-11 20:19:36 +0400134 allContentElements.forEach(function (contentElement) {
135 contentElement.style.display = "none";
136 });
Davit Tabidze9ca49262024-07-10 15:51:27 +0400137
138 let currentHelpTitle = button;
139 while (currentHelpTitle && !currentHelpTitle.classList.contains('modal-left')) {
140 currentHelpTitle = currentHelpTitle.parentNode;
141 if (currentHelpTitle === document.body) {
142 currentHelpTitle = null;
143 break;
144 }
145 }
146
147 currentHelpTitle.querySelectorAll('.title-menu').forEach(function (button) {
Davit Tabidze00077272024-06-11 20:19:36 +0400148 button.removeAttribute("aria-current");
149 });
Davit Tabidze9ca49262024-07-10 15:51:27 +0400150
Davit Tabidze00077272024-06-11 20:19:36 +0400151 document.getElementById(helpContentId).style.display = 'block';
152 button.setAttribute("aria-current", "page");
153 });
154 });
155
156 document.addEventListener("keydown", (event) => {
157 if (event.key === "Escape" && visibleModal) {
158 closeModal(visibleModal);
159 }
160 });
161
gio92d86862024-05-21 12:51:31 +0400162 document.addEventListener("click", (event) => {
Davit Tabidze9ca49262024-07-10 15:51:27 +0400163 if (visibleModal === null || visibleModal === undefined) return;
Davit Tabidze00077272024-06-11 20:19:36 +0400164 const modalContent = visibleModal.querySelector("article");
165 const closeButton = visibleModal.querySelector(".close-button");
166 if (!modalContent.contains(event.target) || closeButton.contains(event.target)) {
167 closeModal(visibleModal);
168 }
gio92d86862024-05-21 12:51:31 +0400169 });
Davit Tabidze9ca49262024-07-10 15:51:27 +0400170
171 const iframes = {};
172 const rightPanel = document.getElementById('right-panel');
173
174 function showIframe(appId) {
175 document.querySelectorAll('.appFrame').forEach(iframe => {
176 iframe.style.display = iframe.id === `appFrame-${appId}` ? 'block' : 'none';
177 });
178 };
179
180 function createIframe(appId, appUrl) {
181 const iframe = document.createElement('iframe');
182 iframe.id = `appFrame-${appId}`;
183 iframe.className = 'appFrame';
184 iframe.src = appUrl;
185 iframe.style.display = 'none';
186 rightPanel.appendChild(iframe);
187 iframes[appId] = iframe;
188 };
Davit Tabidze207ce082024-04-09 19:15:25 +0400189});
gio1752a172024-06-19 15:18:19 +0400190
191function copyToClipboard(elem, text) {
192 navigator.clipboard.writeText(text);
193 elem.setAttribute("data-tooltip", "Copied");
194 elem.setAttribute("data-placement", "bottom");
195 setTimeout(() => {
Davit Tabidze9ca49262024-07-10 15:51:27 +0400196 elem.removeAttribute("data-tooltip");
197 elem.removeAttribute("data-placement");
gio1752a172024-06-19 15:18:19 +0400198 }, 500);
Davit Tabidze9ca49262024-07-10 15:51:27 +0400199};