communityStation.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <template name="communityStation">
  2. <header>
  3. <nav>
  4. <div class="nav-wrapper light-blue accent-4">
  5. <ul class="left hide-on-med-and-down">
  6. <li><a style="margin-left: 0px; padding-left: 20px; padding-right: 20px;" href="/"
  7. class="brand-logo">Musare</a></li>
  8. <!--li><a id="vote-skip" class="tooltipped" data-position="bottom" data-delay="50" data-tooltip="Vote to skip this song"><i class="material-icons left">skip_next</i>{{votes}}</a></li-->
  9. {{#if isCommunityStationOwner name}}
  10. {{#if playing}}
  11. <li style="margin-left: 144px;"><a id="pause" data-position="bottom" data-delay="50"
  12. data-tooltip="Pause this room"
  13. data-activates="chat-slide-out" class="tooltipped"><i
  14. class="material-icons">pause</i></a></li>
  15. {{else}}
  16. <li style="margin-left: 144px;"><a id="play" data-position="bottom" data-delay="50"
  17. data-tooltip="Play this room"
  18. data-activates="chat-slide-out" class="tooltipped"><i
  19. class="material-icons">play_arrow</i></a></li>
  20. {{/if}}
  21. <li><a id="skip" data-position="bottom" data-delay="50" data-tooltip="Skip this song"
  22. data-activates="chat-slide-out" class="tooltipped"><i
  23. class="material-icons">skip_next</i></a></li>
  24. <li><a id="edit_room" href="#edit_room_modal" data-position="bottom" data-delay="50"
  25. data-tooltip="Edit this room" data-activates="chat-slide-out" class="tooltipped"><i
  26. class="material-icons">settings</i></a></li>
  27. {{/if}}
  28. </ul>
  29. <span class="brand-logo center">{{communityStationDisplayName}}
  30. <small>(by {{communityStationOwnerName}})</small></span>
  31. <ul class="right hide-on-med-and-down">
  32. <li class="{{partyModeEnabledHidden}}"><a href="#" data-position="bottom" data-delay="50" data-tooltip="Queue" id="playlist-slideout" data-activates="queue-slide-out" class="tooltipped header-collapse"><i class="material-icons">queue_music</i></a></li>
  33. {{#if isLoggedIn}}
  34. <li><a href="#" data-position="bottom" data-delay="50" data-tooltip="Chat" id="chat-slideout"
  35. data-activates="chat-slide-out" class="tooltipped header-collapse"><i
  36. class="material-icons">chat</i></a></li>
  37. {{/if}}
  38. {{#if isCommunityStationOwner name}}
  39. <li><a href="#" data-position="bottom" data-delay="50" data-tooltip="Users" id="users-slideout"
  40. data-activates="users-slide-out" class="tooltipped header-collapse"><i
  41. class="material-icons">people</i></a></li>
  42. <li><a href="#" data-position="bottom" data-delay="50" data-tooltip="Allowed"
  43. id="allowed-slideout" data-activates="allowed-slide-out"
  44. class="tooltipped header-collapse"><i class="material-icons">assignment</i></a></li>
  45. <li><a href="#" data-position="bottom" data-delay="50" data-tooltip="Playlists"
  46. id="playlists-slideout" data-activates="playlists-slide-out"
  47. class="tooltipped header-collapse"><i class="material-icons">library_music</i></a></li>
  48. {{/if}}
  49. </ul>
  50. </div>
  51. </nav>
  52. </header>
  53. {{> alerts}}
  54. <main id="room-content">
  55. <div class="container room-container">
  56. {{#if noCurrentSong}}
  57. No current song. Please add a song to the queue!
  58. {{/if}}
  59. <div class="row {{noCurrentSongHidden}}">
  60. <div class="col s12 m10 l8 offset-l2 offset-m1" id="media-container">
  61. <div class="video-container">
  62. <div id="player"></div>
  63. </div>
  64. </div>
  65. <div class="col s12 m10 l8 offset-l2 offset-m1">
  66. <h4 id="time-display"><span id="time-elapsed"></span> / <span id="time-total"></span></h4>
  67. <h3>{{{title}}}</h3>
  68. <div class="row">
  69. <form action="#" class="left col s4 m4 l4">
  70. <p class="range-field" style="margin-top: 0">
  71. <input type="range" id="volume_slider" min="0" max="100"/>
  72. </p>
  73. </form>
  74. </div>
  75. <div class="seeker-bar-container white" id="preview-progress">
  76. <div class="seeker-bar light-blue" style="width: 0%"></div>
  77. </div>
  78. </div>
  79. </div>
  80. </div>
  81. </main>
  82. <!--Chat slideout-->
  83. <div id="chat-slide-out" class="side-nav room-slideout">
  84. <h5>Chat</h5>
  85. <ul class="chat-ul">
  86. {{#each globalChat}}
  87. {{#emojione}}
  88. <li class="chat-message" style="line-height: 30px">
  89. <span title="{{time}}" style="float: right; margin-top: 15px">{{rtime time}}</span>
  90. <a style="text-decoration: none; font-size: 0.9em; height: 0.9em; font-weight: 500"
  91. href="/u/{{this.username}}" target="_blank"><span
  92. class="rank-{{this.rawrank}}">{{this.rank}}</span>{{this.username}}</a>
  93. <p style="clear: both; line-height: 1.2em; margin-left: 13px; margin-bottom: 0; font-size: 1.2em">{{{this.message}}}</p>
  94. </li>
  95. {{/emojione}}
  96. <div class="divider" style="margin-top: 15px;"></div>
  97. {{/each}}
  98. </ul>
  99. <div>
  100. <div class="row" id="chat-input-div">
  101. <div class="input-field col s12">
  102. {{#if currentUser}}
  103. <input id="chat-message" type="text">
  104. <label for="chat-message">Send a message</label>
  105. {{else}}
  106. <input id="chat-message" class="disabled" disabled type="text">
  107. <label for="chat-message">You have to be logged in to chat.</label>
  108. {{/if}}
  109. </div>
  110. </div>
  111. {{#if currentUser}}
  112. <a id="submit" class="waves-effect waves-light btn">Send</a>
  113. {{else}}
  114. <a id="submit" class="waves-effect waves-light btn disabled" disabled>Send</a>
  115. {{/if}}
  116. </div>
  117. </div>
  118. <!--Playlist slideout-->
  119. <div id="queue-slide-out" class="side-nav room-slideout">
  120. <h5>Queue</h5>
  121. <ul id="queue-ul" style="max-height: calc(100% - 105px); overflow-y: auto; margin: 0;">
  122. {{#each song in queue}}
  123. <li class="queue-item" style="clear: both">
  124. <a class="queue-item-remove" style="float:right; height: 0; width: 0;" href="#" data-id={{song.song.id}}><i class="material-icons" data-id={{song.song.id}}>clear</i></a>
  125. <div class="queue-item-text">
  126. <p class="queue-item-title">{{song.song.title}}</p>
  127. <p class="queue-item-username">Added by <a style="display: inline-block; height: 10px; padding: 0; color: #039be5;" href="/profile/{{getUsernameFromId song.requestedBy}}">{{getUsernameFromId song.requestedBy}}</a></p>
  128. </div>
  129. <hr>
  130. </li>
  131. {{/each}}
  132. </ul>
  133. <a id="add-song-to-queue-button" class="waves-effect waves-light btn musare white-text" href="#add-song-to-queue">Add song to queue</a>
  134. </div>
  135. <div id="users-slide-out" class="side-nav room-slideout">
  136. <h5>Users In Room</h5>
  137. <ul style="margin-bottom: 64px;">
  138. {{#each usersInRoom}}
  139. <li><a href=/u/{{this}} target="_blank">{{this}}</a></li>
  140. {{/each}}
  141. </ul>
  142. {{#if currentUser}}
  143. <a class="btn btn-block musare white-text waves-effect waves-light" href="#" id="logout"
  144. style="position: fixed; bottom: 0; width: 342px;">Logout</a>
  145. {{else}}
  146. <a class="btn btn-block musare white-text waves-effect waves-light" href="/login"
  147. style="position: fixed; bottom: 0; width: 342px;">Login / Register</a>
  148. {{/if}}
  149. </div>
  150. <div id="allowed-slide-out" class="side-nav room-slideout">
  151. <h5>Allowed</h5>
  152. <ul class="list-ul" id="allowed-ul">
  153. {{#each allowed}}
  154. <li>
  155. <a href=/u/{{this.name}} target="_blank">
  156. {{this.name}}
  157. {{#if isCommunityStationOwner name}}
  158. <a href="#" class="right remove-allowed" data-user={{this.id}}>
  159. <i class="material-icons" style="line-height: 64px;">remove</i>
  160. </a>
  161. {{/if}}
  162. </a>
  163. </li>
  164. {{/each}}
  165. </ul>
  166. {{#if isCommunityStationOwner name}}
  167. <div>
  168. <div class="row" id="chat-input-div">
  169. <div class="input-field col s12">
  170. <input id="add-allowed" type="text">
  171. <label for="add-allowed">Add user</label>
  172. </div>
  173. </div>
  174. <a id="add-allowed-submit" class="waves-effect waves-light btn">Add</a>
  175. </div>
  176. {{/if}}
  177. </div>
  178. <div id="playlists-slide-out" class="side-nav room-slideout">
  179. <h5>Playlists</h5>
  180. <ul class="list-ul" id="playlists-ul">
  181. {{#each playlists}}
  182. <li>
  183. <a href="#edit_playlist_modal" class="edit-playlist-button" data-playlist={{this.name}}>
  184. {{this.displayName}}
  185. <a href="#" class="right select-playlist" data-playlist={{this.name}}>
  186. {{#if isCommunityStationOwner name}}
  187. {{#if isPlaylistSelected name this.name}}
  188. <i class="material-icons" style="line-height: 64px;">check_circle</i>
  189. {{else}}
  190. <i class="material-icons" data-playlist={{this.name}} style="line-height: 64px;"
  191. title="Select playlist">panorama_fish_eye</i>
  192. {{/if}}
  193. {{/if}}
  194. </a>
  195. </a>
  196. </li>
  197. {{/each}}
  198. </ul>
  199. <div>
  200. <a id="add-playlist-modal-button" class="waves-effect waves-light btn" href="#create_playlist_modal">Create
  201. Playlist</a>
  202. </div>
  203. </div>
  204. <!-- Edit Room Modal -->
  205. <div id="edit_room_modal" class="modal">
  206. <div class="modal-content">
  207. <h4>Edit Room</h4>
  208. <div class="input-field">
  209. <input id="edit_room_description" value={{room.roomDesc}} type="text">
  210. <label for="edit_room_description">Description</label>
  211. </div>
  212. <div class="input-field">
  213. <input id="edit_room_display" value={{room.displayName}} type="text">
  214. <label for="edit_room_display">Display Name</label>
  215. </div>
  216. <div class="input-field col s12">
  217. <select id="edit_room_privacy">
  218. <option value="public" {{getSelected 'public' room.privacy}}>Public</option>
  219. <option value="unlisted" {{getSelected 'unlisted' room.privacy}}>Unlisted</option>
  220. <option value="community" {{getSelected 'community' room.privacy}}>Private</option>
  221. </select>
  222. <label>Room Privacy</label>
  223. </div>
  224. <p>
  225. <input type="checkbox" id="partyModeEnabled" {{partyModeChecked}} />
  226. <label for="partyModeEnabled">Party Mode Enabled</label>
  227. <br><small><b>What is party mode?</b> Party mode is a mode in community stations where, if enabled, people can request songs to be added to the queue, which will then be played in the station.</small>
  228. </p>
  229. {{#if partyModeEnabled}}
  230. <p>
  231. <input type="checkbox" id="queueLocked" {{queueLockedChecked}} />
  232. <label for="queueLocked">Queue Locked</label>
  233. <br><small>Locking the queue will disallow normal users from adding songs to the queue.</small>
  234. </p>
  235. {{/if}}
  236. <button class="btn waves-effect waves-light" id="save_edit_room_changes">Save Changes</button>
  237. <button class="btn waves-effect waves-light right red" id="delete_room">Delete Room</button>
  238. </div>
  239. <div class="divider"></div>
  240. <div class="modal-footer">
  241. <a class="modal-action modal-close waves-effect btn">Close</a>
  242. </div>
  243. </div>
  244. <!-- Edit Playlist Modal -->
  245. <div id="edit_playlist_modal" class="modal">
  246. <div class="modal-content">
  247. <h4>Editing: {{editingPlaylist.name}}</h4>
  248. <ul class="collection">
  249. {{#each song in editingPlaylist.songs}}
  250. <li class="collection-item">
  251. <a href="https://youtube.com/watch?v={{song.id}}" target="_blank">{{song.title}}</a>
  252. <a href="#" class="secondary-content playlistSongRemove" data-id={{song.id}}><i
  253. class="material-icons" data-id={{song.id}}>delete</i></a>
  254. {{#if hasMoreThanOne editingPlaylist.songs}}
  255. {{#if isFirst song editingPlaylist.songs}}
  256. <a href="#" class="secondary-content playlistSongDown" data-id={{song.id}}><i
  257. class="material-icons" data-id={{song.id}}>keyboard_arrow_down</i></a>
  258. {{else}}
  259. {{#if isLast song editingPlaylist.songs}}
  260. <a href="#" class="secondary-content playlistSongUp" data-id={{song.id}}><i
  261. class="material-icons" data-id={{song.id}}>keyboard_arrow_up</i></a>
  262. {{else}}
  263. <a href="#" class="secondary-content playlistSongDown" data-id={{song.id}}><i
  264. class="material-icons" data-id={{song.id}}>keyboard_arrow_down</i></a>
  265. <a href="#" class="secondary-content playlistSongUp" data-id={{song.id}}><i
  266. class="material-icons" data-id={{song.id}}>keyboard_arrow_up</i></a>
  267. {{/if}}
  268. {{/if}}
  269. {{/if}}
  270. </li>
  271. {{/each}}
  272. </ul>
  273. <div class="input-field">
  274. <input id="song-input" type="text" class="validate">
  275. <label for="search_for_song">Search for song to add</label>
  276. </div>
  277. <a class="waves-effect waves-light btn" id="search-song"><i class="material-icons left">search</i>Search</a>
  278. {{#if singleVideoResultsActive}}
  279. <div id="single-video-results">
  280. <div style="overflow: auto; height: 400px; margin-top: 1rem;">
  281. <ul class="collection light-blue-text">
  282. {{#each result in singleVideoResults}}
  283. <li class="collection-item avatar youtube-search-result-li">
  284. <img src="{{result.image}}" onerror="this.src='/notes.png'" alt=""
  285. class="video-import-thumbnail">
  286. <span class="title video-import-text">{{result.title}}</span>
  287. <p class="video-import-text">{{result.artist}} <br>
  288. <a href="https://youtube.com/watch?v={{result.id}}" target="_blank">View Video
  289. In YouTube</a>
  290. </p>
  291. <a href="#" class="secondary-content addSong" data-result="{{result.id}}"><i
  292. class="material-icons" data-result="{{result.id}}">add</i></a>
  293. </li>
  294. {{/each}}
  295. </ul>
  296. </div>
  297. </div>
  298. {{/if}}
  299. <br>
  300. <div class="input-field">
  301. <input id="rename-playlist-name" type="text" class="validate" value={{editingPlaylist.name}}>
  302. <label for="rename-playlist-name">Rename playlist name</label>
  303. </div>
  304. <div class="input-field">
  305. <input id="rename-playlist-display-name" type="text" class="validate"
  306. value={{editingPlaylist.displayName}}>
  307. <label for="rename-playlist-display-name">Rename playlist display name</label>
  308. </div>
  309. <button class="btn waves-effect waves-light musare" id="rename-playlist-button">Rename playlist</button>
  310. </div>
  311. <div class="divider"></div>
  312. <div class="modal-footer">
  313. <a class="modal-action modal-close waves-effect btn">Close</a>
  314. <button class="btn waves-effect waves-light left red" id="delete_playlist">Delete playlist</button>
  315. </div>
  316. </div>
  317. <!-- Edit Playlist Modal -->
  318. <div id="add-song-to-queue" class="modal">
  319. <div class="modal-content">
  320. <h4>Add song to queue</h4>
  321. <div class="input-field">
  322. <input id="add-song-to-queue-search" type="text" class="validate">
  323. <label for="add-song-to-queue-search">Search for song to add</label>
  324. </div>
  325. <a class="waves-effect waves-light btn" id="add-song-to-queue-search-button"><i class="material-icons left">search</i>Search</a>
  326. <a class="waves-effect waves-light btn orange" id="clear-queue-search"><i class="material-icons left">delete</i>Clear results</a>
  327. </div>
  328. {{#if singleVideoResultsActiveQueue}}
  329. <div id="single-video-results-queue">
  330. <div style="overflow: auto; height: 400px; margin-top: 1rem;">
  331. <ul class="collection light-blue-text">
  332. {{#each result in singleVideoResultsQueue}}
  333. <li class="collection-item avatar youtube-search-result-li">
  334. <img src="{{result.image}}" onerror="this.src='/notes.png'" alt=""
  335. class="video-import-thumbnail">
  336. <span class="title video-import-text">{{result.title}}</span>
  337. <p class="video-import-text">{{result.artist}} <br>
  338. <a href="https://youtube.com/watch?v={{result.id}}" target="_blank">View Video
  339. In YouTube</a>
  340. </p>
  341. <a href="#" class="secondary-content addSongQueue" data-result="{{result.id}}"><i
  342. class="material-icons" data-result="{{result.id}}">add</i></a>
  343. </li>
  344. {{/each}}
  345. </ul>
  346. </div>
  347. </div>
  348. {{/if}}
  349. <div class="divider"></div>
  350. <div class="modal-footer">
  351. <a class="modal-action modal-close waves-effect btn">Close</a>
  352. </div>
  353. </div>
  354. <!-- Create Playlist Modal -->
  355. <div id="create_playlist_modal" class="modal">
  356. <div class="modal-content">
  357. <h4>Create Modal</h4>
  358. <div class="input-field">
  359. <input id="create_playlist_name" type="text">
  360. <label for="create_playlist_name">Name</label>
  361. </div>
  362. <div class="input-field">
  363. <input id="create_playlist_display_name" type="text">
  364. <label for="create_playlist_display_name">Display Name</label>
  365. </div>
  366. <button class="btn waves-effect waves-light" id="create_playlist_submit">Create</button>
  367. </div>
  368. <div class="divider"></div>
  369. <div class="modal-footer">
  370. <a class="modal-action modal-close waves-effect btn">Close</a>
  371. </div>
  372. </div>
  373. <script>
  374. $("#add-song-to-queue-button").leanModal({
  375. dismissible: true,
  376. opacity: .5,
  377. in_duration: 500,
  378. out_duration: 200
  379. });
  380. $(".edit-playlist-button").leanModal({
  381. dismissible: true,
  382. opacity: .5,
  383. in_duration: 500,
  384. out_duration: 200
  385. });
  386. $("#add-playlist-modal-button").leanModal({
  387. dismissible: true,
  388. opacity: .5,
  389. in_duration: 500,
  390. out_duration: 200
  391. });
  392. $("#edit_room").leanModal({
  393. dismissible: true,
  394. opacity: .5,
  395. in_duration: 500,
  396. out_duration: 200
  397. });
  398. $(".dropdown-button").dropdown({
  399. belowOrigin: true
  400. });
  401. $('select').material_select();
  402. $("#chat-slideout").sideNav({
  403. menuWidth: 350,
  404. edge: 'right'
  405. });
  406. $("#playlist-slideout").sideNav({
  407. menuWidth: 350,
  408. edge: 'right'
  409. });
  410. $("#users-slideout").sideNav({
  411. menuWidth: 350,
  412. edge: 'right'
  413. });
  414. $("#allowed-slideout").sideNav({
  415. menuWidth: 350,
  416. edge: 'right'
  417. });
  418. $("#playlists-slideout").sideNav({
  419. menuWidth: 350,
  420. edge: 'right'
  421. });
  422. $('.tooltipped').tooltip({delay: 50});
  423. </script>
  424. </template>