communityStation.html 23 KB

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