@livepreso/api 6.41.0 → 6.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/.eslintrc.js +5 -0
  2. package/.rush/temp/build-cache-tar.log +7 -0
  3. package/.rush/temp/package-deps_test.json +170 -0
  4. package/.rush/temp/shrinkwrap-deps.json +957 -0
  5. package/CHANGELOG.json +53 -0
  6. package/CHANGELOG.md +32 -0
  7. package/api.build.log +4 -0
  8. package/babel.config.js +9 -18
  9. package/cjs/api.js +1 -1
  10. package/cjs/api.js.map +1 -1
  11. package/cjs/api.spec.js +2 -2
  12. package/cjs/api.spec.js.map +1 -1
  13. package/cjs/auth.js +6 -5
  14. package/cjs/auth.js.map +1 -1
  15. package/cjs/auth.spec.js +25 -23
  16. package/cjs/auth.spec.js.map +1 -1
  17. package/cjs/caching.js +3 -3
  18. package/cjs/collections/activity.js +22 -27
  19. package/cjs/collections/activity.js.map +1 -1
  20. package/cjs/collections/adjunct-sections.js +2 -2
  21. package/cjs/collections/adjunct-sections.js.map +1 -1
  22. package/cjs/collections/adjunct-slides.js +2 -2
  23. package/cjs/collections/adjunct-slides.js.map +1 -1
  24. package/cjs/collections/adjunct-sub-slides.js +2 -2
  25. package/cjs/collections/adjunct-sub-slides.js.map +1 -1
  26. package/cjs/collections/appointment-adjunct-tags.js +28 -0
  27. package/cjs/collections/appointment-adjunct-tags.js.map +1 -0
  28. package/cjs/collections/appointment-deckversion-tags.js +28 -0
  29. package/cjs/collections/appointment-deckversion-tags.js.map +1 -0
  30. package/cjs/collections/appointment-duplicates.js +2 -2
  31. package/cjs/collections/appointment-duplicates.js.map +1 -1
  32. package/cjs/collections/appointment-editors.js +2 -2
  33. package/cjs/collections/appointment-editors.js.map +1 -1
  34. package/cjs/collections/appointment-section-tags.js +28 -0
  35. package/cjs/collections/appointment-section-tags.js.map +1 -0
  36. package/cjs/collections/appointment-slide-tags.js +28 -0
  37. package/cjs/collections/appointment-slide-tags.js.map +1 -0
  38. package/cjs/collections/appointment-tags.js +208 -0
  39. package/cjs/collections/appointment-tags.js.map +1 -0
  40. package/cjs/collections/appointments.js +10 -6
  41. package/cjs/collections/appointments.js.map +1 -1
  42. package/cjs/collections/assets.js +2 -2
  43. package/cjs/collections/assets.js.map +1 -1
  44. package/cjs/collections/auto-adjuncts.js +7 -3
  45. package/cjs/collections/auto-adjuncts.js.map +1 -1
  46. package/cjs/collections/base.js +103 -25
  47. package/cjs/collections/base.js.map +1 -1
  48. package/cjs/collections/base.spec.js +231 -123
  49. package/cjs/collections/base.spec.js.map +1 -1
  50. package/cjs/collections/cms-vals.js +2 -2
  51. package/cjs/collections/cms-vals.js.map +1 -1
  52. package/cjs/collections/contacts.js +2 -2
  53. package/cjs/collections/contacts.js.map +1 -1
  54. package/cjs/collections/created-assets.js +2 -2
  55. package/cjs/collections/created-assets.js.map +1 -1
  56. package/cjs/collections/customers.js +2 -2
  57. package/cjs/collections/customers.js.map +1 -1
  58. package/cjs/collections/deck-notes.js +2 -2
  59. package/cjs/collections/deck-notes.js.map +1 -1
  60. package/cjs/collections/deck-versions.js +20 -8
  61. package/cjs/collections/deck-versions.js.map +1 -1
  62. package/cjs/collections/decks.js +2 -2
  63. package/cjs/collections/decks.js.map +1 -1
  64. package/cjs/collections/deleted-assets.js +2 -2
  65. package/cjs/collections/deleted-assets.js.map +1 -1
  66. package/cjs/collections/dispatches.js +4 -4
  67. package/cjs/collections/dispatches.js.map +1 -1
  68. package/cjs/collections/event-objects.js +2 -2
  69. package/cjs/collections/event-objects.js.map +1 -1
  70. package/cjs/collections/events.js +2 -2
  71. package/cjs/collections/events.js.map +1 -1
  72. package/cjs/collections/groups.js +2 -2
  73. package/cjs/collections/groups.js.map +1 -1
  74. package/cjs/collections/images.js +2 -2
  75. package/cjs/collections/images.js.map +1 -1
  76. package/cjs/collections/locations.js +2 -2
  77. package/cjs/collections/locations.js.map +1 -1
  78. package/cjs/collections/opportunities.js +2 -2
  79. package/cjs/collections/opportunities.js.map +1 -1
  80. package/cjs/collections/pack-diffs.js +2 -2
  81. package/cjs/collections/pack-diffs.js.map +1 -1
  82. package/cjs/collections/packs.js +2 -2
  83. package/cjs/collections/packs.js.map +1 -1
  84. package/cjs/collections/presets.js +2 -2
  85. package/cjs/collections/presets.js.map +1 -1
  86. package/cjs/collections/section-selections.js +2 -2
  87. package/cjs/collections/section-selections.js.map +1 -1
  88. package/cjs/collections/sections.js +2 -2
  89. package/cjs/collections/sections.js.map +1 -1
  90. package/cjs/collections/slide-selections.js +2 -2
  91. package/cjs/collections/slide-selections.js.map +1 -1
  92. package/cjs/collections/slides.js +2 -2
  93. package/cjs/collections/slides.js.map +1 -1
  94. package/cjs/collections/snapshots.js +2 -2
  95. package/cjs/collections/snapshots.js.map +1 -1
  96. package/cjs/collections/sub-slides.js +2 -2
  97. package/cjs/collections/sub-slides.js.map +1 -1
  98. package/cjs/collections/tags.js +28 -0
  99. package/cjs/collections/tags.js.map +1 -0
  100. package/cjs/collections/teams.js +2 -2
  101. package/cjs/collections/teams.js.map +1 -1
  102. package/cjs/collections/templates.js +2 -2
  103. package/cjs/collections/templates.js.map +1 -1
  104. package/cjs/collections/uploads.js +2 -2
  105. package/cjs/collections/uploads.js.map +1 -1
  106. package/cjs/collections/users.js +2 -2
  107. package/cjs/collections/users.js.map +1 -1
  108. package/cjs/collections.js +115 -0
  109. package/cjs/collections.js.map +1 -1
  110. package/cjs/index.js +3 -0
  111. package/cjs/index.js.map +1 -1
  112. package/cjs/middleware.js.map +1 -1
  113. package/cjs/middlewares/auth.js +10 -6
  114. package/cjs/middlewares/auth.js.map +1 -1
  115. package/cjs/middlewares/base.js +1 -3
  116. package/cjs/middlewares/base.js.map +1 -1
  117. package/cjs/middlewares/json.js +10 -6
  118. package/cjs/middlewares/json.js.map +1 -1
  119. package/cjs/middlewares/redirect.js +10 -6
  120. package/cjs/middlewares/redirect.js.map +1 -1
  121. package/cjs/models/activity-item.js +6 -2
  122. package/cjs/models/activity-item.js.map +1 -1
  123. package/cjs/models/adjunct-section.js +2 -2
  124. package/cjs/models/adjunct-section.js.map +1 -1
  125. package/cjs/models/adjunct-slide.js +2 -2
  126. package/cjs/models/adjunct-slide.js.map +1 -1
  127. package/cjs/models/adjunct-sub-slide.js +2 -2
  128. package/cjs/models/adjunct-sub-slide.js.map +1 -1
  129. package/cjs/models/adjunct.js +2 -2
  130. package/cjs/models/adjunct.js.map +1 -1
  131. package/cjs/models/api.js.map +1 -1
  132. package/cjs/models/appointment-adjunct-tags.js +52 -0
  133. package/cjs/models/appointment-adjunct-tags.js.map +1 -0
  134. package/cjs/models/appointment-deckversion-tags.js +52 -0
  135. package/cjs/models/appointment-deckversion-tags.js.map +1 -0
  136. package/cjs/models/appointment-duplicate.js +8 -3
  137. package/cjs/models/appointment-duplicate.js.map +1 -1
  138. package/cjs/models/appointment-editor.js +2 -2
  139. package/cjs/models/appointment-editor.js.map +1 -1
  140. package/cjs/models/appointment-section-tags.js +52 -0
  141. package/cjs/models/appointment-section-tags.js.map +1 -0
  142. package/cjs/models/appointment-slide-tags.js +52 -0
  143. package/cjs/models/appointment-slide-tags.js.map +1 -0
  144. package/cjs/models/appointment-stats.js +2 -2
  145. package/cjs/models/appointment-stats.js.map +1 -1
  146. package/cjs/models/appointment-tags.js +48 -0
  147. package/cjs/models/appointment-tags.js.map +1 -0
  148. package/cjs/models/appointment-viewing.js +2 -2
  149. package/cjs/models/appointment-viewing.js.map +1 -1
  150. package/cjs/models/appointment.js +16 -7
  151. package/cjs/models/appointment.js.map +1 -1
  152. package/cjs/models/asset.js +2 -2
  153. package/cjs/models/asset.js.map +1 -1
  154. package/cjs/models/auto-adjunct-key-check.js +2 -2
  155. package/cjs/models/auto-adjunct-key-check.js.map +1 -1
  156. package/cjs/models/auto-adjunct.js +2 -2
  157. package/cjs/models/auto-adjunct.js.map +1 -1
  158. package/cjs/models/base.js +25 -36
  159. package/cjs/models/base.js.map +1 -1
  160. package/cjs/models/base.spec.js +45 -45
  161. package/cjs/models/base.spec.js.map +1 -1
  162. package/cjs/models/choicelist.js.map +1 -1
  163. package/cjs/models/cms-val.js.map +1 -1
  164. package/cjs/models/contact.js +2 -2
  165. package/cjs/models/contact.js.map +1 -1
  166. package/cjs/models/customer.js +2 -2
  167. package/cjs/models/customer.js.map +1 -1
  168. package/cjs/models/deck-note.js +2 -2
  169. package/cjs/models/deck-note.js.map +1 -1
  170. package/cjs/models/deck-tags.js +61 -0
  171. package/cjs/models/deck-tags.js.map +1 -0
  172. package/cjs/models/deck-version.js +5 -3
  173. package/cjs/models/deck-version.js.map +1 -1
  174. package/cjs/models/deck.js +6 -3
  175. package/cjs/models/deck.js.map +1 -1
  176. package/cjs/models/dispatch-preview.js +3 -3
  177. package/cjs/models/dispatch-preview.js.map +1 -1
  178. package/cjs/models/dispatch.js +2 -2
  179. package/cjs/models/dispatch.js.map +1 -1
  180. package/cjs/models/envs.js.map +1 -1
  181. package/cjs/models/event-object.js +2 -2
  182. package/cjs/models/event-object.js.map +1 -1
  183. package/cjs/models/event.js +2 -2
  184. package/cjs/models/event.js.map +1 -1
  185. package/cjs/models/feed-data.js +2 -2
  186. package/cjs/models/feed-data.js.map +1 -1
  187. package/cjs/models/file.js +2 -2
  188. package/cjs/models/file.js.map +1 -1
  189. package/cjs/models/group.js +2 -2
  190. package/cjs/models/group.js.map +1 -1
  191. package/cjs/models/handover.js +2 -2
  192. package/cjs/models/handover.js.map +1 -1
  193. package/cjs/models/hosted-preso.js +2 -2
  194. package/cjs/models/hosted-preso.js.map +1 -1
  195. package/cjs/models/image.js +2 -2
  196. package/cjs/models/image.js.map +1 -1
  197. package/cjs/models/location.js +2 -2
  198. package/cjs/models/location.js.map +1 -1
  199. package/cjs/models/manifest-json.js +83 -58
  200. package/cjs/models/manifest-json.js.map +1 -1
  201. package/cjs/models/onshare.js +2 -2
  202. package/cjs/models/onshare.js.map +1 -1
  203. package/cjs/models/opportunity.js +2 -2
  204. package/cjs/models/opportunity.js.map +1 -1
  205. package/cjs/models/pack-diff.js +2 -2
  206. package/cjs/models/pack-diff.js.map +1 -1
  207. package/cjs/models/pack.js +2 -2
  208. package/cjs/models/pack.js.map +1 -1
  209. package/cjs/models/preset.js +22 -2
  210. package/cjs/models/preset.js.map +1 -1
  211. package/cjs/models/refresh-request.js +2 -2
  212. package/cjs/models/refresh-request.js.map +1 -1
  213. package/cjs/models/room.js +2 -2
  214. package/cjs/models/room.js.map +1 -1
  215. package/cjs/models/salesforce-lookup.js +2 -2
  216. package/cjs/models/salesforce-lookup.js.map +1 -1
  217. package/cjs/models/section-selection.js +2 -2
  218. package/cjs/models/section-selection.js.map +1 -1
  219. package/cjs/models/section.js +2 -2
  220. package/cjs/models/section.js.map +1 -1
  221. package/cjs/models/slide-selection.js +2 -2
  222. package/cjs/models/slide-selection.js.map +1 -1
  223. package/cjs/models/slide.js +2 -2
  224. package/cjs/models/slide.js.map +1 -1
  225. package/cjs/models/snapshot.js +2 -2
  226. package/cjs/models/snapshot.js.map +1 -1
  227. package/cjs/models/sub-slide.js +2 -2
  228. package/cjs/models/sub-slide.js.map +1 -1
  229. package/cjs/models/support-ticket.js +2 -2
  230. package/cjs/models/support-ticket.js.map +1 -1
  231. package/cjs/models/tag.js +54 -0
  232. package/cjs/models/tag.js.map +1 -0
  233. package/cjs/models/team.js +2 -2
  234. package/cjs/models/team.js.map +1 -1
  235. package/cjs/models/template.js +2 -2
  236. package/cjs/models/template.js.map +1 -1
  237. package/cjs/models/tenancy.js +2 -2
  238. package/cjs/models/tenancy.js.map +1 -1
  239. package/cjs/models/timing-log.js +20 -41
  240. package/cjs/models/timing-log.js.map +1 -1
  241. package/cjs/models/timing-log.spec.js +18 -86
  242. package/cjs/models/timing-log.spec.js.map +1 -1
  243. package/cjs/models/transcribe-socket.js +2 -2
  244. package/cjs/models/transcribe-socket.js.map +1 -1
  245. package/cjs/models/upload.js +2 -2
  246. package/cjs/models/upload.js.map +1 -1
  247. package/cjs/models/user.js +4 -3
  248. package/cjs/models/user.js.map +1 -1
  249. package/cjs/models/user.spec.js +10 -8
  250. package/cjs/models/user.spec.js.map +1 -1
  251. package/cjs/models.js +148 -0
  252. package/cjs/models.js.map +1 -1
  253. package/cjs/presentation/appointment-presentation.js +13 -5
  254. package/cjs/presentation/appointment-presentation.js.map +1 -1
  255. package/cjs/presentation/base-presentation-collection.js.map +1 -1
  256. package/cjs/presentation/base-presentation-model.js +65 -0
  257. package/cjs/presentation/base-presentation-model.js.map +1 -1
  258. package/cjs/presentation/base-presentation-model.spec.js +87 -0
  259. package/cjs/presentation/base-presentation-model.spec.js.map +1 -1
  260. package/cjs/presentation/presentation-deck.js +31 -20
  261. package/cjs/presentation/presentation-deck.js.map +1 -1
  262. package/cjs/presentation/presentation-deck.spec.js +15 -13
  263. package/cjs/presentation/presentation-deck.spec.js.map +1 -1
  264. package/cjs/presentation/presentation-decks.js +2 -2
  265. package/cjs/presentation/presentation-decks.js.map +1 -1
  266. package/cjs/presentation/presentation-section.js +36 -17
  267. package/cjs/presentation/presentation-section.js.map +1 -1
  268. package/cjs/presentation/presentation-section.spec.js +418 -0
  269. package/cjs/presentation/presentation-section.spec.js.map +1 -0
  270. package/cjs/presentation/presentation-sections.js +2 -2
  271. package/cjs/presentation/presentation-sections.js.map +1 -1
  272. package/cjs/presentation/presentation-slide.js +35 -18
  273. package/cjs/presentation/presentation-slide.js.map +1 -1
  274. package/cjs/presentation/presentation-slide.spec.js +294 -0
  275. package/cjs/presentation/presentation-slide.spec.js.map +1 -0
  276. package/cjs/presentation/presentation-slides.js +2 -2
  277. package/cjs/presentation/presentation-slides.js.map +1 -1
  278. package/cjs/presentation/presentation-subslide.js +11 -7
  279. package/cjs/presentation/presentation-subslide.js.map +1 -1
  280. package/cjs/presentation/presentation-subslide.spec.js +68 -20
  281. package/cjs/presentation/presentation-subslide.spec.js.map +1 -1
  282. package/cjs/presentation/presentation-subslides.js +2 -2
  283. package/cjs/presentation/presentation-subslides.js.map +1 -1
  284. package/cjs/presentation/presentation.js +19 -9
  285. package/cjs/presentation/presentation.js.map +1 -1
  286. package/cjs/presentation.js +10 -0
  287. package/cjs/presentation.js.map +1 -1
  288. package/cjs/state-register.js +11 -1
  289. package/cjs/state-register.js.map +1 -1
  290. package/cjs/sync.js +7 -7
  291. package/cjs/sync.js.map +1 -1
  292. package/cjs/utils.js +7 -7
  293. package/cjs/utils.js.map +1 -1
  294. package/cjs/utils.spec.js.map +1 -1
  295. package/config/rush-project.json +11 -0
  296. package/index.js +0 -1
  297. package/jest.config.js +4 -4
  298. package/package.json +19 -59
  299. package/setup-tests.js +2 -1
  300. package/src/api.js +3 -3
  301. package/src/api.spec.js +3 -4
  302. package/src/auth.js +6 -7
  303. package/src/auth.spec.js +3 -4
  304. package/src/collections/activity.js +5 -6
  305. package/src/collections/adjunct-sections.js +4 -4
  306. package/src/collections/adjunct-slides.js +4 -4
  307. package/src/collections/adjunct-sub-slides.js +2 -2
  308. package/src/collections/appointment-adjunct-tags.js +18 -0
  309. package/src/collections/appointment-deckversion-tags.js +21 -0
  310. package/src/collections/appointment-duplicates.js +2 -2
  311. package/src/collections/appointment-editors.js +2 -2
  312. package/src/collections/appointment-section-tags.js +18 -0
  313. package/src/collections/appointment-slide-tags.js +18 -0
  314. package/src/collections/appointment-tags.js +136 -0
  315. package/src/collections/appointments.js +18 -23
  316. package/src/collections/assets.js +2 -2
  317. package/src/collections/auto-adjuncts.js +5 -5
  318. package/src/collections/base.js +88 -18
  319. package/src/collections/base.spec.js +100 -8
  320. package/src/collections/cms-vals.js +3 -3
  321. package/src/collections/contacts.js +2 -2
  322. package/src/collections/created-assets.js +2 -2
  323. package/src/collections/customers.js +2 -2
  324. package/src/collections/deck-notes.js +2 -2
  325. package/src/collections/deck-versions.js +18 -15
  326. package/src/collections/decks.js +2 -2
  327. package/src/collections/deleted-assets.js +2 -2
  328. package/src/collections/dispatches.js +8 -13
  329. package/src/collections/event-objects.js +2 -2
  330. package/src/collections/events.js +2 -2
  331. package/src/collections/groups.js +2 -2
  332. package/src/collections/images.js +2 -2
  333. package/src/collections/locations.js +2 -2
  334. package/src/collections/opportunities.js +2 -2
  335. package/src/collections/pack-diffs.js +2 -2
  336. package/src/collections/packs.js +2 -2
  337. package/src/collections/presets.js +2 -2
  338. package/src/collections/section-selections.js +4 -4
  339. package/src/collections/sections.js +2 -2
  340. package/src/collections/slide-selections.js +4 -4
  341. package/src/collections/slides.js +2 -2
  342. package/src/collections/snapshots.js +2 -2
  343. package/src/collections/sub-slides.js +2 -2
  344. package/src/collections/tags.js +18 -0
  345. package/src/collections/teams.js +2 -2
  346. package/src/collections/templates.js +2 -2
  347. package/src/collections/uploads.js +2 -2
  348. package/src/collections/users.js +2 -2
  349. package/src/collections.js +6 -0
  350. package/src/index.js +1 -4
  351. package/src/middleware.js +1 -1
  352. package/src/middlewares/json.js +2 -2
  353. package/src/middlewares/redirect.js +1 -2
  354. package/src/models/activity-item.js +6 -6
  355. package/src/models/adjunct-section.js +5 -5
  356. package/src/models/adjunct-slide.js +5 -5
  357. package/src/models/adjunct-sub-slide.js +5 -5
  358. package/src/models/adjunct.js +4 -4
  359. package/src/models/api.js +1 -1
  360. package/src/models/appointment-adjunct-tags.js +41 -0
  361. package/src/models/appointment-deckversion-tags.js +41 -0
  362. package/src/models/appointment-duplicate.js +7 -7
  363. package/src/models/appointment-editor.js +6 -6
  364. package/src/models/appointment-section-tags.js +41 -0
  365. package/src/models/appointment-slide-tags.js +41 -0
  366. package/src/models/appointment-stats.js +5 -5
  367. package/src/models/appointment-tags.js +39 -0
  368. package/src/models/appointment-viewing.js +3 -3
  369. package/src/models/appointment.js +35 -29
  370. package/src/models/asset.js +5 -5
  371. package/src/models/auto-adjunct-key-check.js +5 -5
  372. package/src/models/auto-adjunct.js +4 -4
  373. package/src/models/base.js +36 -37
  374. package/src/models/base.spec.js +61 -62
  375. package/src/models/choicelist.js +2 -2
  376. package/src/models/cms-val.js +3 -3
  377. package/src/models/contact.js +9 -9
  378. package/src/models/customer.js +13 -13
  379. package/src/models/deck-note.js +4 -4
  380. package/src/models/deck-tags.js +52 -0
  381. package/src/models/deck-version.js +9 -8
  382. package/src/models/deck.js +8 -6
  383. package/src/models/dispatch-preview.js +6 -7
  384. package/src/models/dispatch.js +6 -7
  385. package/src/models/envs.js +1 -1
  386. package/src/models/event-object.js +6 -6
  387. package/src/models/event.js +7 -7
  388. package/src/models/feed-data.js +5 -5
  389. package/src/models/file.js +4 -4
  390. package/src/models/group.js +3 -3
  391. package/src/models/handover.js +5 -5
  392. package/src/models/hosted-preso.js +5 -5
  393. package/src/models/image.js +4 -4
  394. package/src/models/location.js +5 -5
  395. package/src/models/manifest-json.js +77 -30
  396. package/src/models/onshare.js +5 -5
  397. package/src/models/opportunity.js +5 -5
  398. package/src/models/pack-diff.js +5 -5
  399. package/src/models/pack.js +4 -4
  400. package/src/models/preset.js +24 -5
  401. package/src/models/refresh-request.js +6 -6
  402. package/src/models/room.js +3 -3
  403. package/src/models/salesforce-lookup.js +3 -3
  404. package/src/models/section-selection.js +6 -6
  405. package/src/models/section.js +7 -7
  406. package/src/models/slide-selection.js +6 -6
  407. package/src/models/slide.js +7 -7
  408. package/src/models/snapshot.js +5 -5
  409. package/src/models/sub-slide.js +5 -5
  410. package/src/models/support-ticket.js +4 -4
  411. package/src/models/tag.js +42 -0
  412. package/src/models/team.js +4 -4
  413. package/src/models/template.js +4 -4
  414. package/src/models/tenancy.js +5 -5
  415. package/src/models/timing-log.js +18 -18
  416. package/src/models/timing-log.spec.js +28 -29
  417. package/src/models/transcribe-socket.js +3 -3
  418. package/src/models/upload.js +3 -3
  419. package/src/models/user.js +19 -17
  420. package/src/models/user.spec.js +2 -2
  421. package/src/models.js +7 -0
  422. package/src/presentation/appointment-presentation.js +14 -10
  423. package/src/presentation/base-presentation-model.js +67 -5
  424. package/src/presentation/base-presentation-model.spec.js +114 -22
  425. package/src/presentation/presentation-deck.js +54 -52
  426. package/src/presentation/presentation-deck.spec.js +26 -27
  427. package/src/presentation/presentation-decks.js +2 -2
  428. package/src/presentation/presentation-section.js +62 -48
  429. package/src/presentation/presentation-section.spec.js +363 -0
  430. package/src/presentation/presentation-sections.js +2 -2
  431. package/src/presentation/presentation-slide.js +51 -36
  432. package/src/presentation/presentation-slide.spec.js +250 -0
  433. package/src/presentation/presentation-slides.js +2 -2
  434. package/src/presentation/presentation-subslide.js +24 -17
  435. package/src/presentation/presentation-subslide.spec.js +40 -12
  436. package/src/presentation/presentation-subslides.js +2 -2
  437. package/src/presentation/presentation.js +27 -15
  438. package/src/state-register.js +7 -0
  439. package/src/sync.js +21 -23
  440. package/src/utils.js +8 -7
  441. package/src/utils.spec.js +15 -15
  442. package/.editorconfig +0 -9
  443. package/.eslintrc +0 -25
  444. package/.prettierrc.js +0 -3
  445. package/jsdoc.json +0 -12
  446. package/yarn.lock +0 -8099
@@ -1,14 +1,13 @@
1
- import moment from "moment";
2
- import { G } from "sp-test/api";
3
- import td from "testdouble";
4
-
5
1
  import { Api } from "../api.js";
6
2
  import { BaseCollection } from "../collections/base.js";
7
- import log from "../log.js";
8
- import { DATE_FORMAT_T } from "../utils.js";
9
3
  import { BaseModel } from "./base.js";
4
+ import { DATE_FORMAT_T } from "../utils.js";
5
+ import { G } from "sp-test/api";
6
+ import log from "../log.js";
7
+ import moment from "moment";
8
+ import td from "testdouble";
10
9
 
11
- it("should set date types correctly (SP-2698)", function() {
10
+ it("should set date types correctly (SP-2698)", function () {
12
11
  const TestModel = BaseModel.extend({ props: { testDate: "date" } });
13
12
 
14
13
  const model = new TestModel();
@@ -49,22 +48,22 @@ it("should not append a slash to a get query", () => {
49
48
  expect(model.url()).toEqual("/api/tests/?foo=bar");
50
49
  });
51
50
 
52
- it("should replace child model strings with the registered model", function() {
51
+ it("should replace child model strings with the registered model", function () {
53
52
  const TestModel = G(BaseModel, "TestModel");
54
53
  const Model = G(
55
54
  BaseModel.extend({
56
- children: { test: "TestModel" }
55
+ children: { test: "TestModel" },
57
56
  })
58
57
  );
59
58
  const model = new Model({ test: 1 });
60
59
  expect(model.test).toBeInstanceOf(TestModel);
61
60
  });
62
61
 
63
- it("should allow the model to be passed in", function() {
62
+ it("should allow the model to be passed in", function () {
64
63
  const TestModel = G(BaseModel, "TestModel");
65
64
  const Model = G(
66
65
  BaseModel.extend({
67
- children: { test: "TestModel" }
66
+ children: { test: "TestModel" },
68
67
  })
69
68
  );
70
69
  const model = new Model({ test: new TestModel({ id: 1 }) });
@@ -72,11 +71,11 @@ it("should allow the model to be passed in", function() {
72
71
  expect(model.test).toBeInstanceOf(TestModel);
73
72
  });
74
73
 
75
- it("should reference parent model if foreign key exists", function() {
74
+ it("should reference parent model if foreign key exists", function () {
76
75
  G(BaseModel, "TestModel");
77
76
  const Model = G(
78
77
  BaseModel.extend({
79
- children: { test: "TestModel" }
78
+ children: { test: "TestModel" },
80
79
  })
81
80
  );
82
81
  const model = new Model({ test: 1 });
@@ -86,70 +85,70 @@ it("should reference parent model if foreign key exists", function() {
86
85
  it("should throw an error if the child model doesn't exist", () => {
87
86
  const Model = G(
88
87
  BaseModel.extend({
89
- children: { test: "DoesntExist" }
88
+ children: { test: "DoesntExist" },
90
89
  })
91
90
  );
92
91
 
93
92
  expect(() => new Model()).toThrow();
94
93
  });
95
94
 
96
- it("should convert a url into a model", function() {
95
+ it("should convert a url into a model", function () {
97
96
  G(BaseModel.extend({ modelName: "tests" }), "TestModel");
98
97
  const Model = G(
99
98
  BaseModel.extend({
100
- children: { test: "TestModel" }
99
+ children: { test: "TestModel" },
101
100
  })
102
101
  );
103
102
  const model = new Model({ test: "/api/tests/1/" });
104
103
  expect(model.test.id).toEqual(1);
105
104
  });
106
105
 
107
- it("should convert an object into a model", function() {
106
+ it("should convert an object into a model", function () {
108
107
  G(BaseModel, "TestModel");
109
108
  const Model = G(
110
109
  BaseModel.extend({
111
- children: { test: "TestModel" }
110
+ children: { test: "TestModel" },
112
111
  })
113
112
  );
114
113
  const model = new Model({ test: { id: 1 } });
115
114
  expect(model.test.id).toEqual(1);
116
115
  });
117
116
 
118
- it("should replace collection strings with their registered state", function() {
117
+ it("should replace collection strings with their registered state", function () {
119
118
  G(BaseModel, "TestModel");
120
119
  const TestCollection = G(
121
120
  BaseCollection.extend({
122
- model: "TestModel"
121
+ model: "TestModel",
123
122
  }),
124
123
  "TestCollection"
125
124
  );
126
125
  const Model = G(
127
126
  BaseModel.extend({
128
- collections: { tests: "TestCollection" }
127
+ collections: { tests: "TestCollection" },
129
128
  })
130
129
  );
131
130
  const model = new Model({
132
- tests: [{ id: 1 }]
131
+ tests: [{ id: 1 }],
133
132
  });
134
133
  expect(model.tests).toBeInstanceOf(TestCollection);
135
134
  });
136
135
 
137
- it("should allow a list of models to be passed into a collection", function() {
136
+ it("should allow a list of models to be passed into a collection", function () {
138
137
  const TestModel = G(BaseModel, "TestModel");
139
138
  G(
140
139
  BaseCollection.extend({
141
- model: "TestModel"
140
+ model: "TestModel",
142
141
  }),
143
142
  "TestCollection"
144
143
  );
145
144
  const Model = G(
146
145
  BaseModel.extend({
147
- collections: { tests: "TestCollection" }
146
+ collections: { tests: "TestCollection" },
148
147
  })
149
148
  );
150
149
  const test = new TestModel({ id: 1 });
151
150
  const model = new Model({
152
- tests: [test]
151
+ tests: [test],
153
152
  });
154
153
  expect(model.tests.first().id).toEqual(1);
155
154
  });
@@ -158,24 +157,24 @@ it("should allow a collection to be passed in directly", () => {
158
157
  G(BaseModel, "TestModel");
159
158
  const TestCollection = G(
160
159
  BaseCollection.extend({
161
- model: "TestModel"
160
+ model: "TestModel",
162
161
  }),
163
162
  "TestCollection"
164
163
  );
165
164
  const Model = G(
166
165
  BaseModel.extend({
167
- collections: { tests: "TestCollection" }
166
+ collections: { tests: "TestCollection" },
168
167
  })
169
168
  );
170
169
  const model = new Model({
171
- tests: new TestCollection([{ id: 1 }])
170
+ tests: new TestCollection([{ id: 1 }]),
172
171
  });
173
172
  expect(model.tests).toBeInstanceOf(TestCollection);
174
173
  });
175
174
 
176
175
  it("should throw an error if the child collection doesn't exist", () => {
177
176
  const Model = BaseModel.extend({
178
- collections: { mustFail: "DoesntExist" }
177
+ collections: { mustFail: "DoesntExist" },
179
178
  });
180
179
  expect(() => new Model()).toThrow();
181
180
  });
@@ -184,13 +183,13 @@ it("should convert a url into a collection", () => {
184
183
  G(BaseModel, "TestModel");
185
184
  const TestCollection = G(
186
185
  BaseCollection.extend({
187
- model: "TestModel"
186
+ model: "TestModel",
188
187
  }),
189
188
  "TestCollection"
190
189
  );
191
190
  const Model = G(
192
191
  BaseModel.extend({
193
- collections: { tests: "TestCollection" }
192
+ collections: { tests: "TestCollection" },
194
193
  })
195
194
  );
196
195
  const model = new Model({ tests: "/api/tests/" });
@@ -202,25 +201,25 @@ it("should convert an array of objects into a collection", () => {
202
201
  G(BaseCollection.extend({ model: "TestModel" }), "TestCollection");
203
202
  const Model = G(
204
203
  BaseModel.extend({
205
- collections: { tests: "TestCollection" }
204
+ collections: { tests: "TestCollection" },
206
205
  })
207
206
  );
208
207
  const model = new Model({
209
- tests: [{ id: 1 }, { id: 2 }]
208
+ tests: [{ id: 1 }, { id: 2 }],
210
209
  });
211
210
  expect(model.tests.at(0).id).toEqual(1);
212
211
  expect(model.tests.at(1).id).toEqual(2);
213
212
  });
214
213
 
215
- it("should correctly sanitize strings of multibyte characters (preserving spaces)", function() {
214
+ it("should correctly sanitize strings of multibyte characters (preserving spaces)", function () {
216
215
  const TestModel = BaseModel.extend({
217
216
  props: {
218
217
  normalString: "string",
219
218
  control: "stringSanitized",
220
219
  withSpace: "stringSanitized",
221
220
  withoutSpace: "stringSanitized",
222
- withSpecialCharacters: "stringSanitized"
223
- }
221
+ withSpecialCharacters: "stringSanitized",
222
+ },
224
223
  });
225
224
 
226
225
  const model = new TestModel({
@@ -228,7 +227,7 @@ it("should correctly sanitize strings of multibyte characters (preserving spaces
228
227
  control: "ABC",
229
228
  withSpace: "A’ B Cç",
230
229
  withoutSpace: "AãB®C",
231
- withSpecialCharacters: "!@#$%^&*()_+"
230
+ withSpecialCharacters: "!@#$%^&*()_+",
232
231
  });
233
232
 
234
233
  expect(model.normalString).toEqual("A’ B Cç");
@@ -242,8 +241,8 @@ it("should allow passing in another model into a model", () => {
242
241
  const TestModel = BaseModel.extend({
243
242
  modelName: "test",
244
243
  props: {
245
- foo: "string"
246
- }
244
+ foo: "string",
245
+ },
247
246
  });
248
247
 
249
248
  const firstModel = new TestModel({ foo: "bar" });
@@ -255,7 +254,7 @@ it("should allow passing in another model into a model", () => {
255
254
  it("should retrieve the ID when there is no resource URL", () => {
256
255
  const testURL = "http://localhost:9980/api/test/34/";
257
256
  const TestModel = BaseModel.extend({
258
- modelName: "test"
257
+ modelName: "test",
259
258
  });
260
259
 
261
260
  const testModel = new TestModel({ url: testURL });
@@ -267,7 +266,7 @@ it("should retrieve the ID when there is no resource URL", () => {
267
266
  it("should retrieve the ID when the resource URL is the same as the hostname", () => {
268
267
  const testURL = "http://localhost:9980/api/test/34/";
269
268
  const TestModel = BaseModel.extend({
270
- modelName: "test"
269
+ modelName: "test",
271
270
  });
272
271
 
273
272
  TestModel.prototype.getResourceURL = jest.fn(() => {
@@ -282,7 +281,7 @@ it("should retrieve the ID when the resource URL is the same as the hostname", (
282
281
  it("should retrieve the ID when the resource hostname is different to the URL hostname", () => {
283
282
  const testURL = "http://some-hostname/api/test/34/";
284
283
  const TestModel = BaseModel.extend({
285
- modelName: "test"
284
+ modelName: "test",
286
285
  });
287
286
 
288
287
  TestModel.prototype.getResourceURL = jest.fn(() => {
@@ -298,8 +297,8 @@ it("should pass through values into a derived model", () => {
298
297
  const DerivedModel = BaseModel.extend({
299
298
  modelName: "derived",
300
299
  props: {
301
- name: "string"
302
- }
300
+ name: "string",
301
+ },
303
302
  });
304
303
  const TestModel = BaseModel.extend({
305
304
  modelName: "test",
@@ -307,9 +306,9 @@ it("should pass through values into a derived model", () => {
307
306
  myDerivedModel: {
308
307
  fn() {
309
308
  return new DerivedModel();
310
- }
311
- }
312
- }
309
+ },
310
+ },
311
+ },
313
312
  });
314
313
 
315
314
  const model = new TestModel({ myDerivedModel: { id: 1, name: "foo" } });
@@ -322,15 +321,15 @@ it("should pass through values into a derived collection", () => {
322
321
  BaseModel.extend({
323
322
  modelName: "derived",
324
323
  props: {
325
- name: "string"
326
- }
324
+ name: "string",
325
+ },
327
326
  }),
328
327
  "DerivedModel"
329
328
  );
330
329
 
331
330
  const DerivedCollection = G(
332
331
  BaseCollection.extend({
333
- model: "DerivedModel"
332
+ model: "DerivedModel",
334
333
  })
335
334
  );
336
335
 
@@ -341,15 +340,15 @@ it("should pass through values into a derived collection", () => {
341
340
  myDerivedCollection: {
342
341
  fn() {
343
342
  return new DerivedCollection();
344
- }
345
- }
346
- }
343
+ },
344
+ },
345
+ },
347
346
  }),
348
347
  "TestModel"
349
348
  );
350
349
 
351
350
  const model = new TestModel({
352
- myDerivedCollection: [{ id: 1, name: "foo" }]
351
+ myDerivedCollection: [{ id: 1, name: "foo" }],
353
352
  });
354
353
  expect(model.myDerivedCollection.first().id).toEqual(1);
355
354
  expect(model.myDerivedCollection.first().name).toEqual("foo");
@@ -358,14 +357,14 @@ it("should pass through values into a derived collection", () => {
358
357
  describe(".matchesURL", () => {
359
358
  it("should have a model match the right url", () => {
360
359
  const TestModel = G(BaseModel, "TestModel").extend({
361
- modelName: "foo"
360
+ modelName: "foo",
362
361
  });
363
362
  expect(TestModel.matchesURL("/api/foo/1/")).toEqual(true);
364
363
  });
365
364
 
366
365
  it("should have a model not match the wrong url", () => {
367
366
  const TestModel = G(BaseModel, "TestModel").extend({
368
- modelName: "foo"
367
+ modelName: "foo",
369
368
  });
370
369
  expect(TestModel.matchesURL("/api/bar/1/")).toEqual(false);
371
370
  });
@@ -376,7 +375,7 @@ describe(".matchesURL", () => {
376
375
  modelName: "bar",
377
376
  getResourceURL() {
378
377
  return "/api/bar/{foo}/";
379
- }
378
+ },
380
379
  });
381
380
  expect(TestModel.matchesURL("/api/foo/1/")).toEqual(false);
382
381
  expect(errorFn).not.toBeCalled();
@@ -388,7 +387,7 @@ describe(".matchesURL", () => {
388
387
  modelName: "bar",
389
388
  getResourceURL() {
390
389
  return "/api/bar/{foo}/";
391
- }
390
+ },
392
391
  });
393
392
  expect(TestModel.matchesURL("/api/bar/1/")).toEqual(false);
394
393
  expect(errorFn).toBeCalled();
@@ -399,11 +398,11 @@ describe(".matchesURL", () => {
399
398
  modelName: "bar",
400
399
  urlMatchKeys: {
401
400
  foo: "string",
402
- bar: "number"
401
+ bar: "number",
403
402
  },
404
403
  getResourceURL() {
405
404
  return "/api/bar/{bar}/{foo}/";
406
- }
405
+ },
407
406
  });
408
407
  expect(TestModel.matchesURL("/api/bar/1/hello/1/")).toEqual(true);
409
408
  });
@@ -415,7 +414,7 @@ describe(".matchesURL", () => {
415
414
  const ActivityModel = G("ActivityItemModel").extend({
416
415
  getResourceURL() {
417
416
  return `${endpoint}activities/`;
418
- }
417
+ },
419
418
  });
420
419
  expect(ActivityModel.matchesURL(url)).toEqual(true);
421
420
  });
@@ -13,8 +13,8 @@ export const ChoicelistModel = BaseModel.extend(
13
13
  props: {
14
14
  modified_date: "date",
15
15
  created_date: "date",
16
- choices: "array"
17
- }
16
+ choices: "array",
17
+ },
18
18
  }
19
19
  );
20
20
 
@@ -20,7 +20,7 @@ export const CMSValModel = BaseModel.extend(
20
20
  key: "string",
21
21
  scope: "string",
22
22
  mime: "string",
23
- value: "string"
23
+ value: "string",
24
24
  },
25
25
 
26
26
  /**
@@ -31,7 +31,7 @@ export const CMSValModel = BaseModel.extend(
31
31
  children: {
32
32
  user: "UserModel",
33
33
  deck: "DeckModel",
34
- team: "TeamModel"
34
+ team: "TeamModel",
35
35
  },
36
36
 
37
37
  url() {
@@ -54,7 +54,7 @@ export const CMSValModel = BaseModel.extend(
54
54
  data.user = this.user ? this.user.url() : undefined;
55
55
 
56
56
  return data;
57
- }
57
+ },
58
58
  }
59
59
  );
60
60
 
@@ -3,8 +3,8 @@ import "./customer.js";
3
3
  import "./location.js";
4
4
  import "../collections/opportunities.js";
5
5
 
6
- import { register } from "../state-register.js";
7
6
  import { BaseModel } from "./base.js";
7
+ import { register } from "../state-register.js";
8
8
 
9
9
  /**
10
10
  * @constructor
@@ -42,14 +42,14 @@ export const ContactModel = BaseModel.extend(
42
42
  photo_512: "string",
43
43
  position: "string",
44
44
  profile: "object",
45
- fixture_key: "string"
45
+ fixture_key: "string",
46
46
  },
47
47
 
48
48
  /**
49
49
  * @property {collections.OpportunityCollection} opportunity_set
50
50
  */
51
51
  collections: {
52
- opportunity_set: "OpportunityCollection"
52
+ opportunity_set: "OpportunityCollection",
53
53
  },
54
54
 
55
55
  /**
@@ -60,7 +60,7 @@ export const ContactModel = BaseModel.extend(
60
60
  children: {
61
61
  location: "LocationModel",
62
62
  customer: "CustomerModel",
63
- user: "UserModel"
63
+ user: "UserModel",
64
64
  },
65
65
 
66
66
  /**
@@ -74,10 +74,10 @@ export const ContactModel = BaseModel.extend(
74
74
  */
75
75
  fullName: {
76
76
  deps: ["name_first", "name_last"],
77
- fn: function() {
77
+ fn: function () {
78
78
  return `${this.name_first} ${this.name_last}`;
79
- }
80
- }
79
+ },
80
+ },
81
81
  },
82
82
 
83
83
  toServer() {
@@ -91,7 +91,7 @@ export const ContactModel = BaseModel.extend(
91
91
  opportunity_set: this._retrieveURL(this.opportunity_set),
92
92
  customer: this._retrieveURL(this.customer),
93
93
  location: this._retrieveURL(this.location),
94
- user: this._retrieveURL(this.user)
94
+ user: this._retrieveURL(this.user),
95
95
  };
96
96
 
97
97
  if (this.id) {
@@ -99,7 +99,7 @@ export const ContactModel = BaseModel.extend(
99
99
  }
100
100
 
101
101
  return data;
102
- }
102
+ },
103
103
  }
104
104
  );
105
105
 
@@ -5,8 +5,8 @@ import "../collections/locations.js";
5
5
  import "../collections/opportunities.js";
6
6
  import "../collections/teams.js";
7
7
 
8
- import { register } from "../state-register.js";
9
8
  import { BaseModel } from "./base.js";
9
+ import { register } from "../state-register.js";
10
10
 
11
11
  /**
12
12
  * @constructor
@@ -43,7 +43,7 @@ export const CustomerModel = BaseModel.extend(
43
43
  profile: "object",
44
44
  soft_deleted: "boolean",
45
45
  title: "stringSanitized",
46
- website: "string"
46
+ website: "string",
47
47
  },
48
48
 
49
49
  /**
@@ -52,7 +52,7 @@ export const CustomerModel = BaseModel.extend(
52
52
  */
53
53
  children: {
54
54
  default_location: "LocationModel",
55
- default_opportunity: "OpportunityModel"
55
+ default_opportunity: "OpportunityModel",
56
56
  },
57
57
 
58
58
  /**
@@ -64,7 +64,7 @@ export const CustomerModel = BaseModel.extend(
64
64
  contact_set: "ContactCollection",
65
65
  opportunity_set: "OpportunityCollection",
66
66
  location_set: "LocationCollection",
67
- team_set: "TeamCollection"
67
+ team_set: "TeamCollection",
68
68
  },
69
69
 
70
70
  /**
@@ -74,26 +74,26 @@ export const CustomerModel = BaseModel.extend(
74
74
  derived: {
75
75
  logo: {
76
76
  deps: ["logo_512", "profile"],
77
- fn: function() {
77
+ fn: function () {
78
78
  // HACK: Check for the REA usecase where it gets images from profile
79
79
  if (this.profile && this.profile.rea_image_large) {
80
80
  return this.profile.rea_image_large;
81
81
  }
82
82
 
83
83
  return this.logo_512;
84
- }
84
+ },
85
85
  },
86
86
  primaryColour: {
87
87
  deps: ["primary_colour", "profile"],
88
- fn: function() {
88
+ fn: function () {
89
89
  // HACK: Check for the REA usecase where it gets primary colour from profile
90
90
  if (this.profile && this.profile.primary_colour) {
91
91
  return this.profile.primary_colour;
92
92
  }
93
93
 
94
94
  return this.primary_colour;
95
- }
96
- }
95
+ },
96
+ },
97
97
  },
98
98
 
99
99
  fetch() {
@@ -112,11 +112,11 @@ export const CustomerModel = BaseModel.extend(
112
112
 
113
113
  // Filter contacts if this is fetched from an appointment
114
114
  if (topParent && topParent.name === "appointments") {
115
- const contactUrls = this.contact_set.map(contact =>
115
+ const contactUrls = this.contact_set.map((contact) =>
116
116
  this._retrieveUrl(contact)
117
117
  );
118
118
 
119
- const filteredContacts = topParent.contact_set.filter(contact => {
119
+ const filteredContacts = topParent.contact_set.filter((contact) => {
120
120
  return contactUrls.indexOf(this._retrieveUrl(contact)) > -1;
121
121
  });
122
122
 
@@ -131,7 +131,7 @@ export const CustomerModel = BaseModel.extend(
131
131
  primary_colour: this.primary_colour,
132
132
  title: this.title,
133
133
  website: this.website,
134
- team_set: this._retrieveURL(this.team_set)
134
+ team_set: this._retrieveURL(this.team_set),
135
135
  };
136
136
 
137
137
  if (this.id) {
@@ -139,7 +139,7 @@ export const CustomerModel = BaseModel.extend(
139
139
  }
140
140
 
141
141
  return data;
142
- }
142
+ },
143
143
  }
144
144
  );
145
145
 
@@ -1,5 +1,5 @@
1
- import { register } from "../state-register.js";
2
1
  import { BaseModel } from "./base.js";
2
+ import { register } from "../state-register.js";
3
3
 
4
4
  /**
5
5
  * @constructor
@@ -22,14 +22,14 @@ export const DeckNoteModel = BaseModel.extend(
22
22
  modified_date: "date",
23
23
  note: "string",
24
24
  mime: "string",
25
- parent_key: "string"
25
+ parent_key: "string",
26
26
  },
27
27
 
28
28
  children: {
29
29
  deck: "DeckModel",
30
30
  user: "UserModel",
31
- team: "TeamModel"
32
- }
31
+ team: "TeamModel",
32
+ },
33
33
  }
34
34
  );
35
35
 
@@ -0,0 +1,52 @@
1
+ import { BaseModel } from "./base.js";
2
+ import { register } from "../state-register.js";
3
+
4
+ /**
5
+ * @constructor
6
+ * @alias models.DeckTagsModel
7
+ * @extends models.BaseModel
8
+ */
9
+ export const DeckTagsModel = BaseModel.extend(
10
+ /** @lends models.DeckTagsModel# */ {
11
+ modelName: "deck-tags",
12
+
13
+ /**
14
+ * @property {object} items
15
+ */
16
+ props: {
17
+ items: "object",
18
+ },
19
+
20
+ url() {
21
+ if (this.parent && this.parent.modelName === "decks") {
22
+ return this.getFullURLPath(`${this.parent.getPlainURL()}tags/`);
23
+ }
24
+ return BaseModel.prototype.url.call(this);
25
+ },
26
+
27
+ fetch(opts) {
28
+ return BaseModel.prototype.fetch.call(this, opts).tap((tags) => {
29
+ this.items = tags;
30
+ });
31
+ },
32
+
33
+ isNew() {
34
+ // Force deck-tags to always use PUT.
35
+ return false;
36
+ },
37
+
38
+ toServer() {
39
+ return this.items;
40
+ },
41
+
42
+ save() {
43
+ return BaseModel.prototype.save.call(this).tap((tags) => {
44
+ this.items = tags;
45
+ });
46
+ },
47
+ }
48
+ );
49
+
50
+ DeckTagsModel.canBeEmpty = true;
51
+
52
+ register("DeckTagsModel", DeckTagsModel);