Add priorities and tags to web UI
|  | @ -381,7 +381,7 @@ | |||
| </div> | ||||
| <div id="detail"{{if not .Topic}} style="display: none"{{end}}> | ||||
|     <div id="detailMain"> | ||||
|         <button id="detailCloseButton"><img src="static/img/close_black_24dp.svg"/></button> | ||||
|         <button id="detailCloseButton"><img src="static/img/close.svg"/></button> | ||||
|         <h1><span id="detailTitle"></span></h1> | ||||
|         <p class="smallMarginBottom"> | ||||
|             <b>ntfy</b> is a simple HTTP-based pub-sub notification service. This is a ntfy topic. | ||||
|  |  | |||
|  | @ -377,18 +377,27 @@ li { | |||
|     display: none; | ||||
| } | ||||
| 
 | ||||
| #detail .detailDate { | ||||
| #detail .detailEntry { | ||||
|     margin-bottom: 20px; | ||||
| } | ||||
| 
 | ||||
| #detail .detailDate, #detail .detailTags { | ||||
|     color: #888; | ||||
|     font-size: 0.9em; | ||||
| } | ||||
| 
 | ||||
| #detail .detailDate img { | ||||
|     width: 20px; | ||||
|     height: 20px; | ||||
|     vertical-align: bottom; | ||||
| } | ||||
| 
 | ||||
| #detail .detailTitle { | ||||
|     font-weight: bold; | ||||
|     font-size: 1.1em; | ||||
| } | ||||
| 
 | ||||
| #detail .detailMessage { | ||||
|     margin-bottom: 20px; | ||||
|     font-size: 1.1em; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
| Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 268 B | 
							
								
								
									
										47
									
								
								server/static/img/priority-1.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,47 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    height="24px" | ||||
|    viewBox="0 0 24 24" | ||||
|    width="24px" | ||||
|    fill="#000000" | ||||
|    version="1.1" | ||||
|    id="svg1428" | ||||
|    sodipodi:docname="priority_1_24dp.svg" | ||||
|    inkscape:version="1.1.1 (3bf5ae0, 2021-09-20)" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg"> | ||||
|   <defs | ||||
|      id="defs1432" /> | ||||
|   <sodipodi:namedview | ||||
|      id="namedview1430" | ||||
|      pagecolor="#505050" | ||||
|      bordercolor="#eeeeee" | ||||
|      borderopacity="1" | ||||
|      inkscape:pageshadow="0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pagecheckerboard="0" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="20.517358" | ||||
|      inkscape:cx="22.834324" | ||||
|      inkscape:cy="15.742768" | ||||
|      inkscape:window-width="1863" | ||||
|      inkscape:window-height="1025" | ||||
|      inkscape:window-x="57" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="svg1428" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#999999;fill-opacity:1;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="m 12.195014,20.828316 a 1.2747098,1.2747098 0 0 0 0.661605,-0.185206 l 6.646593,-4.037178 a 1.2745823,1.2745823 0 0 0 0.427537,-1.751107 1.2745823,1.2745823 0 0 0 -1.750928,-0.427718 l -5.984807,3.635327 -5.9848086,-3.635327 a 1.2745823,1.2745823 0 0 0 -1.750927,0.427718 1.2745823,1.2745823 0 0 0 0.427536,1.751107 l 6.6464146,4.037178 a 1.2747098,1.2747098 0 0 0 0.661785,0.185206 z" | ||||
|      id="rect3554" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="m 12.195014,15.694014 a 1.2747098,1.2747098 0 0 0 0.661605,-0.185206 l 6.646593,-4.037176 A 1.2745823,1.2745823 0 0 0 19.930749,9.7205243 1.2745823,1.2745823 0 0 0 18.179821,9.2928073 L 12.195014,12.928134 6.2102054,9.2928073 a 1.2745823,1.2745823 0 0 0 -1.750927,0.427717 1.2745823,1.2745823 0 0 0 0.427536,1.7511077 l 6.6464146,4.037176 a 1.2747098,1.2747098 0 0 0 0.661785,0.185206 z" | ||||
|      id="path9314" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="m 12.116784,10.426777 a 1.2747098,1.2747098 0 0 0 0.661606,-0.185205 l 6.646593,-4.0371767 a 1.2745823,1.2745823 0 0 0 0.427537,-1.751108 1.2745823,1.2745823 0 0 0 -1.750928,-0.427718 l -5.984808,3.635327 -5.9848066,-3.635327 a 1.2745823,1.2745823 0 0 0 -1.750928,0.427718 1.2745823,1.2745823 0 0 0 0.427537,1.751108 L 11.455,10.241572 a 1.2747098,1.2747098 0 0 0 0.661784,0.185205 z" | ||||
|      id="path9316" /> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										43
									
								
								server/static/img/priority-2.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,43 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    height="24px" | ||||
|    viewBox="0 0 24 24" | ||||
|    width="24px" | ||||
|    fill="#000000" | ||||
|    version="1.1" | ||||
|    id="svg1428" | ||||
|    sodipodi:docname="priority_2_24dp.svg" | ||||
|    inkscape:version="1.1.1 (3bf5ae0, 2021-09-20)" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg"> | ||||
|   <defs | ||||
|      id="defs1432" /> | ||||
|   <sodipodi:namedview | ||||
|      id="namedview1430" | ||||
|      pagecolor="#505050" | ||||
|      bordercolor="#eeeeee" | ||||
|      borderopacity="1" | ||||
|      inkscape:pageshadow="0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pagecheckerboard="0" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="20.517358" | ||||
|      inkscape:cx="22.834324" | ||||
|      inkscape:cy="15.742768" | ||||
|      inkscape:window-width="1863" | ||||
|      inkscape:window-height="1025" | ||||
|      inkscape:window-x="57" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="svg1428" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#999999;fill-opacity:1;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="m 12.172712,17.774352 a 1.2747098,1.2747098 0 0 0 0.661605,-0.185206 l 6.646593,-4.037178 a 1.2745823,1.2745823 0 0 0 0.427537,-1.751107 1.2745823,1.2745823 0 0 0 -1.750928,-0.427718 L 12.172712,15.00847 6.1879033,11.373143 a 1.2745823,1.2745823 0 0 0 -1.750927,0.427718 1.2745823,1.2745823 0 0 0 0.427536,1.751107 l 6.6464147,4.037178 a 1.2747098,1.2747098 0 0 0 0.661785,0.185206 z" | ||||
|      id="rect3554" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="m 12.172712,12.64005 a 1.2747098,1.2747098 0 0 0 0.661605,-0.185206 L 19.48091,8.4176679 A 1.2745823,1.2745823 0 0 0 19.908447,6.6665602 1.2745823,1.2745823 0 0 0 18.157519,6.2388432 L 12.172712,9.8741699 6.1879033,6.2388432 a 1.2745823,1.2745823 0 0 0 -1.750927,0.427717 1.2745823,1.2745823 0 0 0 0.427536,1.7511077 l 6.6464147,4.0371761 a 1.2747098,1.2747098 0 0 0 0.661785,0.185206 z" | ||||
|      id="path9314" /> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.1 KiB | 
							
								
								
									
										43
									
								
								server/static/img/priority-4.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,43 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    height="24px" | ||||
|    viewBox="0 0 24 24" | ||||
|    width="24px" | ||||
|    fill="#000000" | ||||
|    version="1.1" | ||||
|    id="svg1428" | ||||
|    sodipodi:docname="priority_4_24dp.svg" | ||||
|    inkscape:version="1.1.1 (3bf5ae0, 2021-09-20)" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg"> | ||||
|   <defs | ||||
|      id="defs1432" /> | ||||
|   <sodipodi:namedview | ||||
|      id="namedview1430" | ||||
|      pagecolor="#505050" | ||||
|      bordercolor="#eeeeee" | ||||
|      borderopacity="1" | ||||
|      inkscape:pageshadow="0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pagecheckerboard="0" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="20.517358" | ||||
|      inkscape:cx="22.834324" | ||||
|      inkscape:cy="15.742768" | ||||
|      inkscape:window-width="1863" | ||||
|      inkscape:window-height="1025" | ||||
|      inkscape:window-x="57" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="svg1428" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#c60000;fill-opacity:1;stroke:none;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="M 12.116784,6.5394415 A 1.2747098,1.2747098 0 0 0 11.455179,6.724648 l -6.6465926,4.037176 a 1.2745823,1.2745823 0 0 0 -0.427537,1.751108 1.2745823,1.2745823 0 0 0 1.7509281,0.427717 l 5.9848065,-3.635327 5.984809,3.635327 A 1.2745823,1.2745823 0 0 0 19.85252,12.512932 1.2745823,1.2745823 0 0 0 19.424984,10.761824 L 12.778569,6.724648 A 1.2747098,1.2747098 0 0 0 12.116784,6.5394415 Z" | ||||
|      id="path9314" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#de0000;fill-opacity:1;stroke:none;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="m 12.195014,11.806679 a 1.2747098,1.2747098 0 0 0 -0.661606,0.185205 l -6.6465924,4.037177 a 1.2745823,1.2745823 0 0 0 -0.427537,1.751108 1.2745823,1.2745823 0 0 0 1.750928,0.427718 l 5.9848074,-3.635327 5.984807,3.635327 a 1.2745823,1.2745823 0 0 0 1.750928,-0.427718 1.2745823,1.2745823 0 0 0 -0.427537,-1.751108 l -6.646414,-4.037177 a 1.2747098,1.2747098 0 0 0 -0.661784,-0.185205 z" | ||||
|      id="path9316" /> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.1 KiB | 
							
								
								
									
										47
									
								
								server/static/img/priority-5.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,47 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    height="24px" | ||||
|    viewBox="0 0 24 24" | ||||
|    width="24px" | ||||
|    fill="#000000" | ||||
|    version="1.1" | ||||
|    id="svg1428" | ||||
|    sodipodi:docname="priority_5_24dp.svg" | ||||
|    inkscape:version="1.1.1 (3bf5ae0, 2021-09-20)" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg"> | ||||
|   <defs | ||||
|      id="defs1432" /> | ||||
|   <sodipodi:namedview | ||||
|      id="namedview1430" | ||||
|      pagecolor="#505050" | ||||
|      bordercolor="#eeeeee" | ||||
|      borderopacity="1" | ||||
|      inkscape:pageshadow="0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pagecheckerboard="0" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="20.517358" | ||||
|      inkscape:cx="22.834323" | ||||
|      inkscape:cy="15.742767" | ||||
|      inkscape:window-width="1863" | ||||
|      inkscape:window-height="1025" | ||||
|      inkscape:window-x="57" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="svg1428" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#aa0000;fill-opacity:1;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="M 12.116784,3.40514 A 1.2747098,1.2747098 0 0 0 11.455179,3.5903463 L 4.8085864,7.6275238 A 1.2745823,1.2745823 0 0 0 4.3810494,9.3786313 1.2745823,1.2745823 0 0 0 6.1319775,9.8063489 L 12.116784,6.1710217 18.101593,9.8063489 A 1.2745823,1.2745823 0 0 0 19.85252,9.3786313 1.2745823,1.2745823 0 0 0 19.424984,7.6275238 L 12.778569,3.5903463 A 1.2747098,1.2747098 0 0 0 12.116784,3.40514 Z" | ||||
|      id="rect3554" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#c60000;fill-opacity:1;stroke:none;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="M 12.116784,8.5394415 A 1.2747098,1.2747098 0 0 0 11.455179,8.724648 l -6.6465926,4.037176 a 1.2745823,1.2745823 0 0 0 -0.427537,1.751108 1.2745823,1.2745823 0 0 0 1.7509281,0.427717 l 5.9848065,-3.635327 5.984809,3.635327 A 1.2745823,1.2745823 0 0 0 19.85252,14.512932 1.2745823,1.2745823 0 0 0 19.424984,12.761824 L 12.778569,8.724648 A 1.2747098,1.2747098 0 0 0 12.116784,8.5394415 Z" | ||||
|      id="path9314" /> | ||||
|   <path | ||||
|      style="color:#000000;fill:#de0000;fill-opacity:1;stroke:none;stroke-width:0.0919748;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" | ||||
|      d="m 12.195014,13.806679 a 1.2747098,1.2747098 0 0 0 -0.661606,0.185205 l -6.6465924,4.037177 a 1.2745823,1.2745823 0 0 0 -0.427537,1.751108 1.2745823,1.2745823 0 0 0 1.750928,0.427718 l 5.9848074,-3.635327 5.984807,3.635327 a 1.2745823,1.2745823 0 0 0 1.750928,-0.427718 1.2745823,1.2745823 0 0 0 -0.427537,-1.751108 l -6.646414,-4.037177 a 1.2747098,1.2747098 0 0 0 -0.661784,-0.185205 z" | ||||
|      id="path9316" /> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.7 KiB | 
| Before Width: | Height: | Size: 195 B After Width: | Height: | Size: 195 B | 
| Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B | 
|  | @ -60,7 +60,7 @@ const subscribeInternal = (topic, persist, delaySec) => { | |||
|         if (!topicEntry) { | ||||
|             topicEntry = document.createElement('li'); | ||||
|             topicEntry.id = `topic-${topic}`; | ||||
|             topicEntry.innerHTML = `<a href="/${topic}" onclick="return showDetail('${topic}')">${topic}</a> <button onclick="test('${topic}'); return false;"> <img src="static/img/send_black_24dp.svg"> Test</button> <button onclick="unsubscribe('${topic}'); return false;"> <img src="static/img/clear_black_24dp.svg"> Unsubscribe</button>`; | ||||
|             topicEntry.innerHTML = `<a href="/${topic}" onclick="return showDetail('${topic}')">${topic}</a> <button onclick="test('${topic}'); return false;"> <img src="static/img/send.svg"> Test</button> <button onclick="unsubscribe('${topic}'); return false;"> <img src="static/img/unsubscribe.svg"> Unsubscribe</button>`; | ||||
|             topicsList.appendChild(topicEntry); | ||||
|         } | ||||
|         topicsHeader.style.display = ''; | ||||
|  | @ -68,7 +68,7 @@ const subscribeInternal = (topic, persist, delaySec) => { | |||
|         // Open event source
 | ||||
|         let eventSource = new EventSource(`${topic}/sse`); | ||||
|         eventSource.onopen = () => { | ||||
|             topicEntry.innerHTML = `<a href="/${topic}" onclick="return showDetail('${topic}')">${topic}</a> <button onclick="test('${topic}'); return false;"> <img src="static/img/send_black_24dp.svg"> Test</button> <button onclick="unsubscribe('${topic}'); return false;"> <img src="static/img/clear_black_24dp.svg"> Unsubscribe</button>`; | ||||
|             topicEntry.innerHTML = `<a href="/${topic}" onclick="return showDetail('${topic}')">${topic}</a> <button onclick="test('${topic}'); return false;"> <img src="static/img/send.svg"> Test</button> <button onclick="unsubscribe('${topic}'); return false;"> <img src="static/img/unsubscribe.svg"> Unsubscribe</button>`; | ||||
|             delaySec = 0; // Reset on successful connection
 | ||||
|         }; | ||||
|         eventSource.onerror = (e) => { | ||||
|  | @ -152,22 +152,35 @@ const rerenderDetailView = () => { | |||
|         detailEventsList.removeChild(detailEventsList.firstChild); | ||||
|     } | ||||
|     topics[currentTopic]['messages'].forEach(m => { | ||||
|         let dateDiv = document.createElement('div'); | ||||
|         let titleDiv = document.createElement('div'); | ||||
|         let messageDiv = document.createElement('div'); | ||||
|         let eventDiv = document.createElement('div'); | ||||
|         const entryDiv = document.createElement('div'); | ||||
|         const dateDiv = document.createElement('div'); | ||||
|         const titleDiv = document.createElement('div'); | ||||
|         const messageDiv = document.createElement('div'); | ||||
|         const tagsDiv = document.createElement('div'); | ||||
| 
 | ||||
|         entryDiv.classList.add('detailEntry'); | ||||
|         dateDiv.classList.add('detailDate'); | ||||
|         dateDiv.innerHTML = new Date(m.time * 1000).toLocaleString(); | ||||
|         const dateStr = new Date(m.time * 1000).toLocaleString(); | ||||
|         if (m.priority && [1,2,4,5].includes(m.priority)) { | ||||
|             dateDiv.innerHTML = `${dateStr} <img src="static/img/priority-${m.priority}.svg"/>`; | ||||
|         } else { | ||||
|             dateDiv.innerHTML = `${dateStr}`; | ||||
|         } | ||||
|         messageDiv.classList.add('detailMessage'); | ||||
|         messageDiv.innerText = m.message; | ||||
|         eventDiv.appendChild(dateDiv); | ||||
|         entryDiv.appendChild(dateDiv); | ||||
|         if (m.title) { | ||||
|             titleDiv.classList.add('detailTitle'); | ||||
|             titleDiv.innerText = m.title; | ||||
|             eventDiv.appendChild(titleDiv) | ||||
|             entryDiv.appendChild(titleDiv); | ||||
|         } | ||||
|         eventDiv.appendChild(messageDiv); | ||||
|         detailEventsList.appendChild(eventDiv); | ||||
|         entryDiv.appendChild(messageDiv); | ||||
|         if (m.tags) { | ||||
|             tagsDiv.classList.add('detailTags'); | ||||
|             tagsDiv.innerText = "Tags: " + m.tags.join(", "); | ||||
|             entryDiv.appendChild(tagsDiv); | ||||
|         } | ||||
|         detailEventsList.appendChild(entryDiv); | ||||
|     }) | ||||
|     if (topics[currentTopic]['messages'].length === 0) { | ||||
|         detailNoNotifications.style.display = ''; | ||||
|  |  | |||