EditNews.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <template>
  2. <modal title="Edit News">
  3. <div slot="body" v-if="news && news._id">
  4. <label class="label">Title</label>
  5. <p class="control">
  6. <input
  7. v-model="news.title"
  8. class="input"
  9. type="text"
  10. placeholder="News Title"
  11. autofocus
  12. />
  13. </p>
  14. <label class="label">Description</label>
  15. <p class="control">
  16. <input
  17. v-model="news.description"
  18. class="input"
  19. type="text"
  20. placeholder="News Description"
  21. />
  22. </p>
  23. <div class="columns">
  24. <div class="column">
  25. <label class="label">Bugs</label>
  26. <p class="control has-addons">
  27. <input
  28. ref="edit-bugs"
  29. class="input"
  30. type="text"
  31. placeholder="Bug"
  32. @keyup.enter="add('bugs')"
  33. />
  34. <a class="button is-info" href="#" @click="add('bugs')"
  35. >Add</a
  36. >
  37. </p>
  38. <span
  39. v-for="(bug, index) in news.bugs"
  40. class="tag is-info"
  41. :key="index"
  42. >
  43. {{ bug }}
  44. <button
  45. class="delete is-info"
  46. @click="remove('bugs', index)"
  47. />
  48. </span>
  49. </div>
  50. <div class="column">
  51. <label class="label">Features</label>
  52. <p class="control has-addons">
  53. <input
  54. ref="edit-features"
  55. class="input"
  56. type="text"
  57. placeholder="Feature"
  58. @keyup.enter="add('features')"
  59. />
  60. <a
  61. class="button is-info"
  62. href="#"
  63. @click="add('features')"
  64. >Add</a
  65. >
  66. </p>
  67. <span
  68. v-for="(feature, index) in news.features"
  69. class="tag is-info"
  70. :key="index"
  71. >
  72. {{ feature }}
  73. <button
  74. class="delete is-info"
  75. @click="remove('features', index)"
  76. />
  77. </span>
  78. </div>
  79. </div>
  80. <div class="columns">
  81. <div class="column">
  82. <label class="label">Improvements</label>
  83. <p class="control has-addons">
  84. <input
  85. ref="edit-improvements"
  86. class="input"
  87. type="text"
  88. placeholder="Improvement"
  89. @keyup.enter="add('improvements')"
  90. />
  91. <a
  92. class="button is-info"
  93. href="#"
  94. @click="add('improvements')"
  95. >Add</a
  96. >
  97. </p>
  98. <span
  99. v-for="(improvement, index) in news.improvements"
  100. class="tag is-info"
  101. :key="index"
  102. >
  103. {{ improvement }}
  104. <button
  105. class="delete is-info"
  106. @click="remove('improvements', index)"
  107. />
  108. </span>
  109. </div>
  110. <div class="column">
  111. <label class="label">Upcoming</label>
  112. <p class="control has-addons">
  113. <input
  114. ref="edit-upcoming"
  115. class="input"
  116. type="text"
  117. placeholder="Upcoming"
  118. @keyup.enter="add('upcoming')"
  119. />
  120. <a
  121. class="button is-info"
  122. href="#"
  123. @click="add('upcoming')"
  124. >Add</a
  125. >
  126. </p>
  127. <span
  128. v-for="(upcoming, index) in news.upcoming"
  129. class="tag is-info"
  130. :key="index"
  131. >
  132. {{ upcoming }}
  133. <button
  134. class="delete is-info"
  135. @click="remove('upcoming', index)"
  136. />
  137. </span>
  138. </div>
  139. </div>
  140. </div>
  141. <div slot="footer">
  142. <button class="button is-success" @click="updateNews(false)">
  143. <i class="material-icons save-changes">done</i>
  144. <span>&nbsp;Save</span>
  145. </button>
  146. <button class="button is-success" @click="updateNews(true)">
  147. <i class="material-icons save-changes">done</i>
  148. <span>&nbsp;Save and close</span>
  149. </button>
  150. </div>
  151. </modal>
  152. </template>
  153. <script>
  154. import { mapActions, mapGetters, mapState } from "vuex";
  155. import Toast from "toasters";
  156. import Modal from "../Modal.vue";
  157. export default {
  158. components: { Modal },
  159. props: {
  160. newsId: { type: String, default: "" },
  161. sector: { type: String, default: "admin" }
  162. },
  163. computed: {
  164. ...mapState("modals/editNews", {
  165. news: state => state.news
  166. }),
  167. ...mapGetters({
  168. socket: "websockets/getSocket"
  169. })
  170. },
  171. mounted() {
  172. this.socket.dispatch(`news.getNewsFromId`, this.newsId, res => {
  173. if (res.status === "success") {
  174. const { news } = res.data;
  175. this.editNews(news);
  176. } else {
  177. new Toast("News with that ID not found");
  178. this.closeModal({
  179. sector: this.sector,
  180. modal: "editNews"
  181. });
  182. }
  183. });
  184. },
  185. methods: {
  186. add(type) {
  187. const change = this.$refs[`edit-${type}`].value.trim();
  188. if (this.news[type].indexOf(change) !== -1)
  189. return new Toast(`Tag already exists`);
  190. if (change) this.addChange({ type, change });
  191. else new Toast(`${type} cannot be empty`);
  192. this.$refs[`edit-${type}`].value = "";
  193. return true;
  194. },
  195. remove(type, index) {
  196. this.removeChange({ type, index });
  197. },
  198. updateNews(close) {
  199. this.socket.dispatch(
  200. "news.update",
  201. this.news._id,
  202. this.news,
  203. res => {
  204. new Toast(res.message);
  205. if (res.status === "success") {
  206. if (close)
  207. this.closeModal({
  208. sector: this.sector,
  209. modal: "editNews"
  210. });
  211. }
  212. }
  213. );
  214. },
  215. ...mapActions("modalVisibility", ["closeModal"]),
  216. ...mapActions("modals/editNews", [
  217. "editNews",
  218. "addChange",
  219. "removeChange"
  220. ])
  221. }
  222. };
  223. </script>
  224. <style lang="scss" scoped>
  225. input[type="range"] {
  226. -webkit-appearance: none;
  227. width: 100%;
  228. margin: 7.3px 0;
  229. }
  230. input[type="range"]:focus {
  231. outline: none;
  232. }
  233. input[type="range"]::-webkit-slider-runnable-track {
  234. width: 100%;
  235. height: 5.2px;
  236. cursor: pointer;
  237. box-shadow: 0;
  238. background: var(--light-grey-3);
  239. border-radius: 0;
  240. border: 0;
  241. }
  242. input[type="range"]::-webkit-slider-thumb {
  243. box-shadow: 0;
  244. border: 0;
  245. height: 19px;
  246. width: 19px;
  247. border-radius: 15px;
  248. background: var(--primary-color);
  249. cursor: pointer;
  250. -webkit-appearance: none;
  251. margin-top: -6.5px;
  252. }
  253. input[type="range"]::-moz-range-track {
  254. width: 100%;
  255. height: 5.2px;
  256. cursor: pointer;
  257. box-shadow: 0;
  258. background: var(--light-grey-3);
  259. border-radius: 0;
  260. border: 0;
  261. }
  262. input[type="range"]::-moz-range-thumb {
  263. box-shadow: 0;
  264. border: 0;
  265. height: 19px;
  266. width: 19px;
  267. border-radius: 15px;
  268. background: var(--primary-color);
  269. cursor: pointer;
  270. -webkit-appearance: none;
  271. margin-top: -6.5px;
  272. }
  273. input[type="range"]::-ms-track {
  274. width: 100%;
  275. height: 5.2px;
  276. cursor: pointer;
  277. box-shadow: 0;
  278. background: var(--light-grey-3);
  279. border-radius: 1.3px;
  280. }
  281. input[type="range"]::-ms-fill-lower {
  282. background: var(--light-grey-3);
  283. border: 0;
  284. border-radius: 0;
  285. box-shadow: 0;
  286. }
  287. input[type="range"]::-ms-fill-upper {
  288. background: var(--light-grey-3);
  289. border: 0;
  290. border-radius: 0;
  291. box-shadow: 0;
  292. }
  293. input[type="range"]::-ms-thumb {
  294. box-shadow: 0;
  295. border: 0;
  296. height: 15px;
  297. width: 15px;
  298. border-radius: 15px;
  299. background: var(--primary-color);
  300. cursor: pointer;
  301. -webkit-appearance: none;
  302. margin-top: 1.5px;
  303. }
  304. .controls {
  305. display: flex;
  306. flex-direction: column;
  307. align-items: center;
  308. }
  309. .artist-genres {
  310. display: flex;
  311. justify-content: space-between;
  312. }
  313. #volumeSlider {
  314. margin-bottom: 15px;
  315. }
  316. .has-text-centered {
  317. padding: 10px;
  318. }
  319. .thumbnail-preview {
  320. display: flex;
  321. margin: 0 auto 25px auto;
  322. max-width: 200px;
  323. width: 100%;
  324. }
  325. .modal-card-body,
  326. .modal-card-foot {
  327. border-top: 0;
  328. }
  329. .label,
  330. .checkbox,
  331. h5 {
  332. font-weight: normal;
  333. }
  334. .video-container {
  335. display: flex;
  336. flex-direction: column;
  337. align-items: center;
  338. padding: 10px;
  339. iframe {
  340. pointer-events: none;
  341. }
  342. }
  343. .save-changes {
  344. color: var(--white);
  345. }
  346. .tag:not(:last-child) {
  347. margin-right: 5px;
  348. }
  349. </style>