@livepreso/api 6.42.1 → 6.45.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 (196) hide show
  1. package/.eslintrc.js +3 -0
  2. package/.rush/temp/256021b5963b4c0221d3dec247b697b9691a9b2c.log +10 -0
  3. package/.rush/temp/2a322f00f12cf9d1e64afe81275cc78d01c49050.log +10 -0
  4. package/.rush/temp/30061f1865447dcbb3f20a305061205f3dbe6091.log +10 -0
  5. package/.rush/temp/45522aea0dee8cb2be1a53248ba45bd235743b43.log +10 -0
  6. package/.rush/temp/58fcbb7f15a76326d40e0839ab179755da82a891.log +10 -0
  7. package/.rush/temp/5bc0bba70b733baa4dd976667ba0a1386e516186.log +10 -0
  8. package/.rush/temp/64f1bb696f8d7d7e72907b80df316b127f72e23e.log +10 -0
  9. package/.rush/temp/6f640f951414ea68adb65c17e4ed7527cde54faf.log +10 -0
  10. package/.rush/temp/7c7b958682d4ab5697530be47d0aac62efe1adf1.log +10 -0
  11. package/.rush/temp/82bfb987463fbcfebf04022e6ed00015c73879c8.log +10 -0
  12. package/.rush/temp/844034aa6e542115075e8f3dc5ffc640973e0064.log +10 -0
  13. package/.rush/temp/8b42957a7c15da1f29cb57bee125f13affa70dca.log +10 -0
  14. package/.rush/temp/a769db9d81a23000c0e9b1bf4f1a9a9e721d0d7c.log +10 -0
  15. package/.rush/temp/a87d3a8b4ece87ec66f27c86226a9f205617681f.log +10 -0
  16. package/.rush/temp/bb7a5bdcc4af4ad1507f81f33774b31f5b4e4fb7.log +10 -0
  17. package/.rush/temp/build-cache-tar.log +7 -0
  18. package/.rush/temp/c20e29ccaaa9231b38a28bb24451b4ce7562cdc0.log +10 -0
  19. package/.rush/temp/e21303db8f59b4625fd184c9114377d781fd24f8.log +10 -0
  20. package/.rush/temp/e6d303862765b6a5f41dd483d0f9ae083a1fae10.log +10 -0
  21. package/.rush/temp/eaf69fbc059d2f1258d7569136180d4a1d3c7072.log +10 -0
  22. package/.rush/temp/f85d279e2674966daaec83e1c3986a96f86ef304.log +10 -0
  23. package/.rush/temp/fc0a332c5b34c6b90006850cf2d93a48fb4b9a6e.log +10 -0
  24. package/.rush/temp/package-deps_build.json +152 -134
  25. package/.rush/temp/package-deps_test.json +172 -0
  26. package/.rush/temp/shrinkwrap-deps.json +946 -847
  27. package/CHANGELOG.json +41 -0
  28. package/CHANGELOG.md +22 -1
  29. package/api.build.log +3 -26
  30. package/babel.config.js +1 -1
  31. package/bin/test.sh +0 -1
  32. package/cjs/api.js +1 -1
  33. package/cjs/api.js.map +1 -1
  34. package/cjs/auth.js +38 -11
  35. package/cjs/auth.js.map +1 -1
  36. package/cjs/auth.spec.js +12 -6
  37. package/cjs/auth.spec.js.map +1 -1
  38. package/cjs/caching.js +3 -3
  39. package/cjs/collections/activity.js +2 -2
  40. package/cjs/collections/appointment-adjunct-tags.js +28 -0
  41. package/cjs/collections/appointment-adjunct-tags.js.map +1 -0
  42. package/cjs/collections/appointment-deckversion-tags.js +28 -0
  43. package/cjs/collections/appointment-deckversion-tags.js.map +1 -0
  44. package/cjs/collections/appointment-section-tags.js +28 -0
  45. package/cjs/collections/appointment-section-tags.js.map +1 -0
  46. package/cjs/collections/appointment-slide-tags.js +28 -0
  47. package/cjs/collections/appointment-slide-tags.js.map +1 -0
  48. package/cjs/collections/appointment-tags.js +208 -0
  49. package/cjs/collections/appointment-tags.js.map +1 -0
  50. package/cjs/collections/appointments.js +2 -2
  51. package/cjs/collections/auto-adjuncts.js +2 -2
  52. package/cjs/collections/base.js +84 -3
  53. package/cjs/collections/base.js.map +1 -1
  54. package/cjs/collections/base.spec.js +178 -0
  55. package/cjs/collections/base.spec.js.map +1 -1
  56. package/cjs/collections/deck-version-screenshots.js +62 -0
  57. package/cjs/collections/deck-version-screenshots.js.map +1 -0
  58. package/cjs/collections/deck-versions.js +2 -2
  59. package/cjs/collections/tags.js +28 -0
  60. package/cjs/collections/tags.js.map +1 -0
  61. package/cjs/collections.js +91 -0
  62. package/cjs/collections.js.map +1 -1
  63. package/cjs/models/activity-item.js +5 -3
  64. package/cjs/models/activity-item.js.map +1 -1
  65. package/cjs/models/appointment-adjunct-tags.js +52 -0
  66. package/cjs/models/appointment-adjunct-tags.js.map +1 -0
  67. package/cjs/models/appointment-deckversion-tags.js +52 -0
  68. package/cjs/models/appointment-deckversion-tags.js.map +1 -0
  69. package/cjs/models/appointment-duplicate.js +2 -2
  70. package/cjs/models/appointment-section-tags.js +52 -0
  71. package/cjs/models/appointment-section-tags.js.map +1 -0
  72. package/cjs/models/appointment-slide-tags.js +52 -0
  73. package/cjs/models/appointment-slide-tags.js.map +1 -0
  74. package/cjs/models/appointment-tags.js +16 -15
  75. package/cjs/models/appointment-tags.js.map +1 -1
  76. package/cjs/models/appointment.js +19 -3
  77. package/cjs/models/appointment.js.map +1 -1
  78. package/cjs/models/auto-adjunct.js +3 -1
  79. package/cjs/models/auto-adjunct.js.map +1 -1
  80. package/cjs/models/base.js +19 -1
  81. package/cjs/models/base.js.map +1 -1
  82. package/cjs/models/base.spec.js +9 -0
  83. package/cjs/models/base.spec.js.map +1 -1
  84. package/cjs/models/deck-tags.js +61 -0
  85. package/cjs/models/deck-tags.js.map +1 -0
  86. package/cjs/models/deck-version-screenshot.js +59 -0
  87. package/cjs/models/deck-version-screenshot.js.map +1 -0
  88. package/cjs/models/deck-version.js +30 -5
  89. package/cjs/models/deck-version.js.map +1 -1
  90. package/cjs/models/deck.js +4 -1
  91. package/cjs/models/deck.js.map +1 -1
  92. package/cjs/models/feed-data.js +5 -0
  93. package/cjs/models/feed-data.js.map +1 -1
  94. package/cjs/models/image.js +34 -0
  95. package/cjs/models/image.js.map +1 -1
  96. package/cjs/models/manifest-json.js +56 -13
  97. package/cjs/models/manifest-json.js.map +1 -1
  98. package/cjs/models/preset.js +21 -1
  99. package/cjs/models/preset.js.map +1 -1
  100. package/cjs/models/section.js +3 -1
  101. package/cjs/models/section.js.map +1 -1
  102. package/cjs/models/slide.js +3 -1
  103. package/cjs/models/slide.js.map +1 -1
  104. package/cjs/models/tag.js +54 -0
  105. package/cjs/models/tag.js.map +1 -0
  106. package/cjs/models/template.js +3 -1
  107. package/cjs/models/template.js.map +1 -1
  108. package/cjs/models/token.js +56 -0
  109. package/cjs/models/token.js.map +1 -0
  110. package/cjs/models/user.js +4 -2
  111. package/cjs/models/user.js.map +1 -1
  112. package/cjs/models.js +104 -0
  113. package/cjs/models.js.map +1 -1
  114. package/cjs/presentation/appointment-presentation.js +11 -4
  115. package/cjs/presentation/appointment-presentation.js.map +1 -1
  116. package/cjs/presentation/base-presentation-model.js +167 -9
  117. package/cjs/presentation/base-presentation-model.js.map +1 -1
  118. package/cjs/presentation/base-presentation-model.spec.js +96 -6
  119. package/cjs/presentation/base-presentation-model.spec.js.map +1 -1
  120. package/cjs/presentation/presentation-deck.js +36 -8
  121. package/cjs/presentation/presentation-deck.js.map +1 -1
  122. package/cjs/presentation/presentation-deck.spec.js +53 -0
  123. package/cjs/presentation/presentation-deck.spec.js.map +1 -1
  124. package/cjs/presentation/presentation-section.js +64 -25
  125. package/cjs/presentation/presentation-section.js.map +1 -1
  126. package/cjs/presentation/presentation-section.spec.js +536 -0
  127. package/cjs/presentation/presentation-section.spec.js.map +1 -0
  128. package/cjs/presentation/presentation-slide.js +43 -18
  129. package/cjs/presentation/presentation-slide.js.map +1 -1
  130. package/cjs/presentation/presentation-slide.spec.js +386 -0
  131. package/cjs/presentation/presentation-slide.spec.js.map +1 -0
  132. package/cjs/presentation/presentation-subslide.js +5 -2
  133. package/cjs/presentation/presentation-subslide.js.map +1 -1
  134. package/cjs/presentation/presentation-subslide.spec.js +58 -12
  135. package/cjs/presentation/presentation-subslide.spec.js.map +1 -1
  136. package/cjs/presentation/presentation.js +120 -6
  137. package/cjs/presentation/presentation.js.map +1 -1
  138. package/cjs/state-register.js +11 -1
  139. package/cjs/state-register.js.map +1 -1
  140. package/cjs/sync.js +1 -1
  141. package/cjs/utils.js +5 -5
  142. package/config/rush-project.json +11 -0
  143. package/jest.config.js +1 -0
  144. package/package.json +66 -66
  145. package/src/api.js +1 -1
  146. package/src/auth.js +44 -8
  147. package/src/auth.spec.js +2 -0
  148. package/src/collections/appointment-adjunct-tags.js +18 -0
  149. package/src/collections/appointment-deckversion-tags.js +21 -0
  150. package/src/collections/appointment-section-tags.js +18 -0
  151. package/src/collections/appointment-slide-tags.js +18 -0
  152. package/src/collections/appointment-tags.js +136 -0
  153. package/src/collections/base.js +80 -3
  154. package/src/collections/base.spec.js +108 -1
  155. package/src/collections/deck-version-screenshots.js +48 -0
  156. package/src/collections/tags.js +18 -0
  157. package/src/collections.js +7 -0
  158. package/src/models/activity-item.js +2 -0
  159. package/src/models/appointment-adjunct-tags.js +41 -0
  160. package/src/models/appointment-deckversion-tags.js +41 -0
  161. package/src/models/appointment-section-tags.js +41 -0
  162. package/src/models/appointment-slide-tags.js +41 -0
  163. package/src/models/appointment-tags.js +16 -14
  164. package/src/models/appointment.js +18 -1
  165. package/src/models/auto-adjunct.js +2 -0
  166. package/src/models/base.js +19 -1
  167. package/src/models/base.spec.js +16 -9
  168. package/src/models/deck-tags.js +52 -0
  169. package/src/models/deck-version-screenshot.js +48 -0
  170. package/src/models/deck-version.js +32 -4
  171. package/src/models/deck.js +2 -0
  172. package/src/models/feed-data.js +2 -0
  173. package/src/models/image.js +32 -0
  174. package/src/models/manifest-json.js +55 -7
  175. package/src/models/preset.js +19 -0
  176. package/src/models/section.js +2 -0
  177. package/src/models/slide.js +2 -0
  178. package/src/models/tag.js +42 -0
  179. package/src/models/template.js +2 -0
  180. package/src/models/token.js +47 -0
  181. package/src/models/user.js +4 -0
  182. package/src/models.js +8 -0
  183. package/src/presentation/appointment-presentation.js +13 -2
  184. package/src/presentation/base-presentation-model.js +129 -8
  185. package/src/presentation/base-presentation-model.spec.js +121 -6
  186. package/src/presentation/presentation-deck.js +41 -2
  187. package/src/presentation/presentation-deck.spec.js +53 -0
  188. package/src/presentation/presentation-section.js +57 -14
  189. package/src/presentation/presentation-section.spec.js +496 -0
  190. package/src/presentation/presentation-slide.js +41 -8
  191. package/src/presentation/presentation-slide.spec.js +352 -0
  192. package/src/presentation/presentation-subslide.js +7 -2
  193. package/src/presentation/presentation-subslide.spec.js +32 -3
  194. package/src/presentation/presentation.js +35 -6
  195. package/src/state-register.js +7 -0
  196. package/api.build.error.log +0 -16
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.AppointmentTagsCollection = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _stateRegister = require("../state-register.js");
15
+
16
+ var _base = require("./base.js");
17
+
18
+ var _lodash = _interopRequireDefault(require("lodash"));
19
+
20
+ /**
21
+ * @constructor
22
+ * @alias collections.AppointmentTagsCollection
23
+ * @extends collections.BaseCollection
24
+ * @see models.AppointmentTagsModel
25
+ */
26
+ var AppointmentTagsCollection = _base.BaseCollection.extend(
27
+ /** @lends collections.AppointmentTagsCollection# */
28
+ {
29
+ model: "AppointmentTagsModel",
30
+ tagNameCollectionMapping: {
31
+ deckversion: "AppointmentDeckVersionTagsCollection",
32
+ section: "AppointmentSectionTagsCollection",
33
+ slide: "AppointmentSlideTagsCollection",
34
+ adjunct: "AppointmentAdjunctTagsCollection"
35
+ },
36
+ _mapResultsToModel: function _mapResultsToModel(result) {
37
+ var _this = this;
38
+
39
+ // Maps a model from a content specific tag to a more generic one.
40
+ // It's generally the same thing, except instead of something like:
41
+ //
42
+ // slide: "/api/slides/1/"
43
+ //
44
+ // It becomes:
45
+ //
46
+ // content_type: "slide",
47
+ // content_url: "/api/slides/1/"
48
+ //
49
+ // So that we can return the list side by side.
50
+ var AppointmentTagsModel = (0, _stateRegister.getState)("AppointmentTagsModel");
51
+ var resultType = Object.keys(result).find(function (key) {
52
+ return Object.keys(_this.tagNameCollectionMapping).includes(key);
53
+ });
54
+
55
+ if (!resultType) {
56
+ throw new Error("Unknown type of result found");
57
+ }
58
+
59
+ return new AppointmentTagsModel({
60
+ tags: result.tags,
61
+ content_type: resultType,
62
+ content_url: result[resultType],
63
+ appointment: result.appointment,
64
+ user: result.user,
65
+ url: result.url
66
+ });
67
+ },
68
+ // These methods don't quite make sense right now, disable it for development.
69
+ fetchSet: function fetchSet() {
70
+ return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
71
+ return _regenerator.default.wrap(function _callee$(_context) {
72
+ while (1) {
73
+ switch (_context.prev = _context.next) {
74
+ case 0:
75
+ throw new Error("Not implemented");
76
+
77
+ case 1:
78
+ case "end":
79
+ return _context.stop();
80
+ }
81
+ }
82
+ }, _callee);
83
+ }))();
84
+ },
85
+ fetchModels: function fetchModels() {
86
+ return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
87
+ return _regenerator.default.wrap(function _callee2$(_context2) {
88
+ while (1) {
89
+ switch (_context2.prev = _context2.next) {
90
+ case 0:
91
+ throw new Error("Not implemented");
92
+
93
+ case 1:
94
+ case "end":
95
+ return _context2.stop();
96
+ }
97
+ }
98
+ }, _callee2);
99
+ }))();
100
+ },
101
+ delete: function _delete() {
102
+ return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
103
+ return _regenerator.default.wrap(function _callee3$(_context3) {
104
+ while (1) {
105
+ switch (_context3.prev = _context3.next) {
106
+ case 0:
107
+ throw new Error("Cannot delete using this collection");
108
+
109
+ case 1:
110
+ case "end":
111
+ return _context3.stop();
112
+ }
113
+ }
114
+ }, _callee3);
115
+ }))();
116
+ },
117
+ save: function save() {
118
+ return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
119
+ return _regenerator.default.wrap(function _callee4$(_context4) {
120
+ while (1) {
121
+ switch (_context4.prev = _context4.next) {
122
+ case 0:
123
+ throw new Error("Not implemented");
124
+
125
+ case 1:
126
+ case "end":
127
+ return _context4.stop();
128
+ }
129
+ }
130
+ }, _callee4);
131
+ }))();
132
+ },
133
+ fetch: function fetch(options) {
134
+ var _this2 = this;
135
+
136
+ return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
137
+ var _this2$_options;
138
+
139
+ var AppointmentModel, hasAppointment, tagModels, results;
140
+ return _regenerator.default.wrap(function _callee5$(_context5) {
141
+ while (1) {
142
+ switch (_context5.prev = _context5.next) {
143
+ case 0:
144
+ AppointmentModel = (0, _stateRegister.getState)("AppointmentModel");
145
+ hasAppointment = ((_this2$_options = _this2._options) === null || _this2$_options === void 0 ? void 0 : _this2$_options.appointment) instanceof AppointmentModel || (options === null || options === void 0 ? void 0 : options.appointment) instanceof AppointmentModel;
146
+
147
+ if (!hasAppointment && _this2.parent instanceof AppointmentModel) {
148
+ options.appointment = _this2.parent;
149
+ hasAppointment = true;
150
+ }
151
+
152
+ if (hasAppointment) {
153
+ _context5.next = 5;
154
+ break;
155
+ }
156
+
157
+ throw new Error("Requires an appointment model in collection options to fetch.");
158
+
159
+ case 5:
160
+ tagModels = Object.values(_this2.tagNameCollectionMapping); // Fetch all the separate tag models and combine them into a single collection
161
+
162
+ _context5.next = 8;
163
+ return Promise.all(tagModels.map(function (tagModel) {
164
+ var Collection = (0, _stateRegister.getState)(tagModel);
165
+ var tags = new Collection({}, _this2._options);
166
+ return tags.fetch(options);
167
+ }));
168
+
169
+ case 8:
170
+ results = _context5.sent.flatMap(function (collection) {
171
+ return collection.results;
172
+ }).map(_this2._mapResultsToModel.bind(_this2));
173
+
174
+ _this2.add(results);
175
+
176
+ return _context5.abrupt("return", {
177
+ count: results.length,
178
+ next: null,
179
+ previous: null,
180
+ results: _this2.toJSON()
181
+ });
182
+
183
+ case 11:
184
+ case "end":
185
+ return _context5.stop();
186
+ }
187
+ }
188
+ }, _callee5);
189
+ }))();
190
+ },
191
+ // Used by Telepresenter to add the tags in the hostedpreso bundle to
192
+ // the appointment tags collection
193
+ addFromAppointment: function addFromAppointment(appointment) {
194
+ var tagCollectionNames = ["appointmentdeckversiontags_set", "appointmentsectiontags_set", "appointmentslidetags_set", "appointmentadjuncttags_set"]; // flatMap currently doesn't work in TelePresenter
195
+
196
+ var results = _lodash.default.flatten(tagCollectionNames.map(function (collectionName) {
197
+ var collection = appointment[collectionName];
198
+ return (collection === null || collection === void 0 ? void 0 : collection._data) || [];
199
+ })).map(this._mapResultsToModel.bind(this));
200
+
201
+ this.add(results);
202
+ }
203
+ });
204
+
205
+ exports.AppointmentTagsCollection = AppointmentTagsCollection;
206
+ AppointmentTagsCollection.canBeEmpty = true;
207
+ (0, _stateRegister.register)("AppointmentTagsCollection", AppointmentTagsCollection);
208
+ //# sourceMappingURL=appointment-tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/collections/appointment-tags.js"],"names":["AppointmentTagsCollection","BaseCollection","extend","model","tagNameCollectionMapping","deckversion","section","slide","adjunct","_mapResultsToModel","result","AppointmentTagsModel","resultType","Object","keys","find","key","includes","Error","tags","content_type","content_url","appointment","user","url","fetchSet","fetchModels","delete","save","fetch","options","AppointmentModel","hasAppointment","_options","parent","tagModels","values","Promise","all","map","tagModel","Collection","results","flatMap","collection","bind","add","count","length","next","previous","toJSON","addFromAppointment","tagCollectionNames","_","flatten","collectionName","_data","canBeEmpty"],"mappings":"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","sourcesContent":["import { getState, register } from \"../state-register.js\";\n\nimport { BaseCollection } from \"./base.js\";\nimport _ from \"lodash\";\n\n/**\n * @constructor\n * @alias collections.AppointmentTagsCollection\n * @extends collections.BaseCollection\n * @see models.AppointmentTagsModel\n */\nexport const AppointmentTagsCollection = BaseCollection.extend(\n\t/** @lends collections.AppointmentTagsCollection# */ {\n\t\tmodel: \"AppointmentTagsModel\",\n\n\t\ttagNameCollectionMapping: {\n\t\t\tdeckversion: \"AppointmentDeckVersionTagsCollection\",\n\t\t\tsection: \"AppointmentSectionTagsCollection\",\n\t\t\tslide: \"AppointmentSlideTagsCollection\",\n\t\t\tadjunct: \"AppointmentAdjunctTagsCollection\",\n\t\t},\n\n\t\t_mapResultsToModel(result) {\n\t\t\t// Maps a model from a content specific tag to a more generic one.\n\t\t\t// It's generally the same thing, except instead of something like:\n\t\t\t//\n\t\t\t// slide: \"/api/slides/1/\"\n\t\t\t//\n\t\t\t// It becomes:\n\t\t\t//\n\t\t\t// content_type: \"slide\",\n\t\t\t// content_url: \"/api/slides/1/\"\n\t\t\t//\n\t\t\t// So that we can return the list side by side.\n\t\t\tconst AppointmentTagsModel = getState(\"AppointmentTagsModel\");\n\t\t\tconst resultType = Object.keys(result).find((key) => {\n\t\t\t\treturn Object.keys(this.tagNameCollectionMapping).includes(key);\n\t\t\t});\n\t\t\tif (!resultType) {\n\t\t\t\tthrow new Error(\"Unknown type of result found\");\n\t\t\t}\n\t\t\treturn new AppointmentTagsModel({\n\t\t\t\ttags: result.tags,\n\t\t\t\tcontent_type: resultType,\n\t\t\t\tcontent_url: result[resultType],\n\t\t\t\tappointment: result.appointment,\n\t\t\t\tuser: result.user,\n\t\t\t\turl: result.url,\n\t\t\t});\n\t\t},\n\n\t\t// These methods don't quite make sense right now, disable it for development.\n\t\tasync fetchSet() {\n\t\t\tthrow new Error(\"Not implemented\");\n\t\t},\n\n\t\tasync fetchModels() {\n\t\t\tthrow new Error(\"Not implemented\");\n\t\t},\n\n\t\tasync delete() {\n\t\t\tthrow new Error(\"Cannot delete using this collection\");\n\t\t},\n\n\t\tasync save() {\n\t\t\tthrow new Error(\"Not implemented\");\n\t\t},\n\n\t\tasync fetch(options) {\n\t\t\tconst AppointmentModel = getState(\"AppointmentModel\");\n\n\t\t\tlet hasAppointment =\n\t\t\t\tthis._options?.appointment instanceof AppointmentModel ||\n\t\t\t\toptions?.appointment instanceof AppointmentModel;\n\n\t\t\tif (!hasAppointment && this.parent instanceof AppointmentModel) {\n\t\t\t\toptions.appointment = this.parent;\n\t\t\t\thasAppointment = true;\n\t\t\t}\n\n\t\t\tif (!hasAppointment) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Requires an appointment model in collection options to fetch.\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst tagModels = Object.values(this.tagNameCollectionMapping);\n\t\t\t// Fetch all the separate tag models and combine them into a single collection\n\t\t\tconst results = (\n\t\t\t\tawait Promise.all(\n\t\t\t\t\ttagModels.map((tagModel) => {\n\t\t\t\t\t\tconst Collection = getState(tagModel);\n\t\t\t\t\t\tconst tags = new Collection({}, this._options);\n\t\t\t\t\t\treturn tags.fetch(options);\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t)\n\t\t\t\t.flatMap((collection) => collection.results)\n\t\t\t\t.map(this._mapResultsToModel.bind(this));\n\n\t\t\tthis.add(results);\n\n\t\t\treturn {\n\t\t\t\tcount: results.length,\n\t\t\t\tnext: null,\n\t\t\t\tprevious: null,\n\t\t\t\tresults: this.toJSON(),\n\t\t\t};\n\t\t},\n\n\t\t// Used by Telepresenter to add the tags in the hostedpreso bundle to\n\t\t// the appointment tags collection\n\t\taddFromAppointment(appointment) {\n\t\t\tconst tagCollectionNames = [\n\t\t\t\t\"appointmentdeckversiontags_set\",\n\t\t\t\t\"appointmentsectiontags_set\",\n\t\t\t\t\"appointmentslidetags_set\",\n\t\t\t\t\"appointmentadjuncttags_set\",\n\t\t\t];\n\n\t\t\t// flatMap currently doesn't work in TelePresenter\n\t\t\tconst results = _.flatten(\n\t\t\t\ttagCollectionNames.map((collectionName) => {\n\t\t\t\t\tconst collection = appointment[collectionName];\n\t\t\t\t\treturn collection?._data || [];\n\t\t\t\t})\n\t\t\t).map(this._mapResultsToModel.bind(this));\n\n\t\t\tthis.add(results);\n\t\t},\n\t}\n);\n\nAppointmentTagsCollection.canBeEmpty = true;\n\nregister(\"AppointmentTagsCollection\", AppointmentTagsCollection);\n"],"file":"appointment-tags.js"}
@@ -21,9 +21,9 @@ var _moment = _interopRequireDefault(require("moment"));
21
21
 
22
22
  var _stateRegister = require("../state-register.js");
23
23
 
24
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
25
 
26
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
27
 
28
28
  /**
29
29
  * @constructor
@@ -17,9 +17,9 @@ var _base = require("./base.js");
17
17
 
18
18
  var _stateRegister = require("../state-register.js");
19
19
 
20
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
21
 
22
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
23
 
24
24
  /**
25
25
  * @constructor
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.BaseCollection = void 0;
9
9
 
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
10
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
13
 
12
14
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
@@ -31,9 +33,9 @@ var _sync2 = require("../sync.js");
31
33
 
32
34
  var _excluded = ["data"];
33
35
 
34
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
36
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
35
37
 
36
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
38
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
37
39
 
38
40
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
39
41
 
@@ -41,10 +43,14 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
41
43
 
42
44
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
43
45
 
46
+ // Current hardcoded limit for maximum number of pages fetched
47
+ // automatically by fetchAll
48
+ var pageLimit = 20;
44
49
  /**
45
50
  * @constructor
46
51
  * @alias collections.BaseCollection
47
52
  */
53
+
48
54
  var BaseCollection = _ampersandRestCollection.default.extend(
49
55
  /** @lends collections.BaseCollection# */
50
56
  {
@@ -66,8 +72,10 @@ var BaseCollection = _ampersandRestCollection.default.extend(
66
72
  per_page: 1000
67
73
  },
68
74
  constructor: function constructor() {
69
- var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
75
+ var _data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
76
+
70
77
  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
78
+ var data = _data;
71
79
 
72
80
  var options = _lodash.default.defaults(opts, {
73
81
  data: {}
@@ -270,6 +278,73 @@ var BaseCollection = _ampersandRestCollection.default.extend(
270
278
  _this2._data = response;
271
279
  });
272
280
  },
281
+ fetchAll: function fetchAll() {
282
+ var _this3 = this;
283
+
284
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
285
+
286
+ var options = _lodash.default.cloneDeep(opts); // Add default params to the fetch (ie ?per_page=1000)
287
+
288
+
289
+ options.data = _lodash.default.extend({}, this.queryData, options.data || {});
290
+ this._options = _lodash.default.extend({}, this._options, options);
291
+ this.queryData = _objectSpread({}, this._options.data);
292
+
293
+ if (this._options.url) {
294
+ this._url = options.url;
295
+ }
296
+
297
+ var checkPages = function checkPages(response) {
298
+ var notLastPage = response.total_pages > response.page;
299
+ var belowPageLimit = response.page < pageLimit;
300
+
301
+ if (notLastPage && belowPageLimit) {
302
+ var _options = _objectSpread(_objectSpread({}, _this3._options), {}, {
303
+ data: _objectSpread(_objectSpread({}, _this3._options.data), {}, {
304
+ page: response.page + 1
305
+ })
306
+ }); // Update the collection with the new data & page number
307
+
308
+
309
+ _this3._options = _options;
310
+ _this3.queryData = _objectSpread({}, _options.data);
311
+ return _this3.fetchPage().then(function (response) {
312
+ return checkPages(response);
313
+ });
314
+ } else {
315
+ // The collection's models are replaced with the latest
316
+ // batch of models every time a new page is fetched.
317
+ // Here we add back all of the previously-fetched models.
318
+ _this3.add(_this3._data.results);
319
+
320
+ return _this3._data;
321
+ }
322
+ };
323
+
324
+ return this.fetchPage().then(function (response) {
325
+ return checkPages(response);
326
+ });
327
+ },
328
+ fetchPage: function fetchPage() {
329
+ var _this4 = this;
330
+
331
+ return _ampersandRestCollection.default.prototype.fetch.call(this, this._options).then(function (response) {
332
+ var _this4$_data$results;
333
+
334
+ // Add the response data to this._data - if we're fetching
335
+ // multiple pages, this._data.results will contain all of the
336
+ // results fetched from all pages so far
337
+ if ((_this4$_data$results = _this4._data.results) !== null && _this4$_data$results !== void 0 && _this4$_data$results.length) {
338
+ _this4._data = _objectSpread(_objectSpread({}, response), {}, {
339
+ results: [].concat((0, _toConsumableArray2.default)(_this4._data.results), (0, _toConsumableArray2.default)(response.results))
340
+ });
341
+ } else {
342
+ _this4._data = response;
343
+ }
344
+
345
+ return response;
346
+ });
347
+ },
273
348
  toServer: function toServer() {
274
349
  return this.map(function (model) {
275
350
  if (model.toServer) {
@@ -286,6 +361,12 @@ var BaseCollection = _ampersandRestCollection.default.extend(
286
361
  return out;
287
362
  });
288
363
  },
364
+ // Returns "true" if all child models have been fetched
365
+ areModelsFetched: function areModelsFetched() {
366
+ return this.map(function (model) {
367
+ return model.isFetched();
368
+ }).every(Boolean);
369
+ },
289
370
  isNew: function isNew() {
290
371
  return true;
291
372
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/base.js"],"names":["BaseCollection","Collection","extend","modelName","model","BaseModel","fetchEmpty","urlMatchKeys","defaultFetchData","per_page","constructor","data","opts","options","_","defaults","newData","toJSON","_data","_options","queryData","url","_url","length","registerStates","prototype","call","add","values","args","arguments","apply","_prepareModel","attrs","omit","Model","registeredStates","Error","urlRoot","getResourceURL","matchesURL","_matchesURL","getFullURLPath","path","Object","keys","query","queryIndex","indexOf","slice","qs","parse","stringify","arrayFormat","resp","re","matches","match","replacement","get","replace","isNew","log","error","Api","getURL","sync","fetchModels","Promise","all","models","map","fetch","fetchSet","idSet","id","warn","resolve","otherOpts","tap","reset","results","cloneDeep","response","toServer","serialize","out","collection","isObject","save","batch","patch","delete","Array","isArray","attr"],"mappings":"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","sourcesContent":["import { Api } from \"../api.js\";\nimport { BaseModel } from \"../models/base.js\";\nimport Collection from \"ampersand-rest-collection\";\nimport Promise from \"bluebird\";\nimport _ from \"lodash\";\nimport log from \"../log.js\";\nimport qs from \"qs\";\nimport { registeredStates } from \"../state-register.js\";\nimport { sync } from \"../sync.js\";\n\n/**\n * @constructor\n * @alias collections.BaseCollection\n */\nexport const BaseCollection = Collection.extend(\n\t/** @lends collections.BaseCollection# */ {\n\t\tmodelName: null,\n\t\tmodel: BaseModel,\n\t\tfetchEmpty: false,\n\n\t\t// Object of regexes that should be used to match a url in `matchesURL`\n\t\t// For example the URL: /api/foo/{pk}/bar/ might have the following:\n\t\t//\n\t\t// Example:\n\t\t//\n\t\t// ```\n\t\t// {\n\t\t// pk: \"number\"\n\t\t// }\n\t\t// ```\n\t\turlMatchKeys: {},\n\n\t\tdefaultFetchData: {\n\t\t\tper_page: 1000,\n\t\t},\n\n\t\tconstructor(data = {}, opts = {}) {\n\t\t\tconst options = _.defaults(opts, {\n\t\t\t\tdata: {},\n\t\t\t});\n\n\t\t\t// We ensure that we pass an array because we don't want the collection constructor to\n\t\t\t// create an empty model using a data object\n\t\t\tlet newData = [];\n\n\t\t\t// Allow passing in collections\n\t\t\tif (data instanceof Collection) {\n\t\t\t\tdata = data.toJSON();\n\t\t\t}\n\n\t\t\tthis._data = data;\n\t\t\tthis._options = options;\n\n\t\t\t// Remove reference to the prototype, or this can accidentally\n\t\t\t// apply to all collections\n\t\t\tthis.queryData = _.extend({}, this.defaultFetchData, options.data);\n\n\t\t\t// Check for specialized url returns from the server. This is for when the\n\t\t\t// server responds with an array of urls rather than object data.\n\t\t\tif (data && data.url) {\n\t\t\t\tthis._url = data.url;\n\t\t\t} else if (data && data.length) {\n\t\t\t\tnewData = data;\n\t\t\t}\n\n\t\t\tthis.registerStates();\n\n\t\t\tCollection.prototype.constructor.call(this, newData, opts);\n\n\t\t\t// Get the name for the collection based on the model\n\t\t\tif (!this.modelName && typeof this.model === \"function\") {\n\t\t\t\tthis.modelName = this.model.prototype.modelName;\n\t\t\t}\n\t\t},\n\n\t\tadd(values) {\n\t\t\tconst args = [...arguments];\n\n\t\t\tif (values && values instanceof Collection) {\n\t\t\t\targs[0] = values.toJSON();\n\t\t\t}\n\n\t\t\treturn Collection.prototype.add.apply(this, args);\n\t\t},\n\n\t\t_prepareModel(attrs, options) {\n\t\t\tconst opts = _.omit(options, [\"data\"]);\n\t\t\treturn Collection.prototype._prepareModel.call(this, attrs, opts);\n\t\t},\n\n\t\tregisterStates() {\n\t\t\tif (typeof this.model === \"string\") {\n\t\t\t\tconst Model = registeredStates[this.model];\n\t\t\t\tif (!Model) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`'${this.model}' not found! Did you forget to import it on the '${this.modelName}' model?`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.model = Model;\n\t\t\t}\n\t\t},\n\n\t\turlRoot() {\n\t\t\treturn this.getResourceURL();\n\t\t},\n\n\t\tmatchesURL(url) {\n\t\t\treturn this.model.prototype._matchesURL(url, false);\n\t\t},\n\n\t\tgetFullURLPath(path) {\n\t\t\tlet url = path;\n\t\t\tif (Object.keys(this.queryData).length) {\n\t\t\t\tlet query = this.queryData;\n\t\t\t\tconst queryIndex = url.indexOf(\"?\");\n\t\t\t\tif (queryIndex > -1) {\n\t\t\t\t\turl = url.slice(0, queryIndex);\n\t\t\t\t\tquery = _.extend(\n\t\t\t\t\t\t{},\n\t\t\t\t\t\tqs.parse(url.slice(queryIndex + 1)),\n\t\t\t\t\t\tthis.queryData\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (url.slice(-1) !== \"/\") {\n\t\t\t\t\turl += \"/\";\n\t\t\t\t}\n\t\t\t\turl += `?${qs.stringify(query, { arrayFormat: \"repeat\" })}`;\n\t\t\t}\n\t\t\treturn url;\n\t\t},\n\n\t\turl() {\n\t\t\tif (this._url) {\n\t\t\t\treturn this.getFullURLPath(this._url);\n\t\t\t}\n\t\t\tlet resp = this.urlRoot();\n\t\t\tif (resp.slice(-1) !== \"/\" && resp.indexOf(\"?\") === -1) {\n\t\t\t\tresp += \"/\";\n\t\t\t}\n\n\t\t\t// Replace any values in a url with one from the collection's options.\n\t\t\t// So if you have /path/to/{model.id}/models/\n\t\t\t// It will check the collection options for \"model.id\" and replace\n\t\t\t// it in the url\n\t\t\tconst re = /(\\{(?:\\w+\\.?)+\\})/g;\n\t\t\tconst matches = resp.match(re) || [];\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst path = match.slice(1, -1);\n\t\t\t\tconst replacement = _.get(this._options, path);\n\t\t\t\tif (replacement) {\n\t\t\t\t\tresp = resp.replace(match, replacement);\n\t\t\t\t} else if (!this.isNew()) {\n\t\t\t\t\tlog.error(\n\t\t\t\t\t\t`Collection ${this.modelName} is missing value ${path} as an option`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tresp = resp.replace(match, replacement);\n\t\t\t}\n\n\t\t\treturn this.getFullURLPath(resp);\n\t\t},\n\n\t\tgetResourceURL() {\n\t\t\t// If no name is present, assume we want the root API.\n\t\t\tif (this.modelName === null) {\n\t\t\t\treturn Api.getURL();\n\t\t\t}\n\t\t\treturn Api.getResourceURL(this.modelName);\n\t\t},\n\n\t\tsync() {\n\t\t\t// Use our own sync instead of the default ampersand one\n\t\t\treturn sync.apply(this, arguments);\n\t\t},\n\n\t\tfetchModels(options = {}) {\n\t\t\treturn Promise.all(this.models.map((model) => model.fetch(options)));\n\t\t},\n\n\t\tfetchSet(opts = {}) {\n\t\t\tconst idSet = this.models.map((model) => model.id);\n\n\t\t\tif (!idSet.length) {\n\t\t\t\tlog.warn(`Tried to fetch ${this.modelName} set with no models`);\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\n\t\t\tconst { data, ...otherOpts } = opts;\n\n\t\t\tconst options = {\n\t\t\t\tdata: {\n\t\t\t\t\t...data,\n\t\t\t\t\tid: idSet,\n\t\t\t\t},\n\t\t\t\t...otherOpts,\n\t\t\t};\n\n\t\t\t// Necessary because these models were already initialised before the fetch,\n\t\t\t// and the children weren't updated correctly with the new data.\n\t\t\treturn this.fetch(options).tap((data) => {\n\t\t\t\tthis.reset();\n\t\t\t\tthis.add(data.results);\n\t\t\t});\n\t\t},\n\n\t\tfetch(opts = {}) {\n\t\t\tconst options = _.cloneDeep(opts);\n\n\t\t\t// Add default params to the fetch (ie ?per_page=1000)\n\t\t\toptions.data = _.extend({}, this.queryData, options.data || {});\n\t\t\tthis._options = _.extend({}, this._options, options);\n\n\t\t\tthis.queryData = { ...options.data };\n\t\t\tif (options.url) {\n\t\t\t\tthis._url = options.url;\n\t\t\t}\n\n\t\t\treturn Collection.prototype.fetch.call(this, options).tap((response) => {\n\t\t\t\tthis._data = response;\n\t\t\t});\n\t\t},\n\n\t\ttoServer() {\n\t\t\treturn this.map(function (model) {\n\t\t\t\tif (model.toServer) {\n\t\t\t\t\treturn model.toServer();\n\t\t\t\t} else if (model.serialize) {\n\t\t\t\t\treturn model.serialize();\n\t\t\t\t}\n\n\t\t\t\tconst out = {};\n\t\t\t\t_.extend(out, model);\n\t\t\t\tdelete out.collection;\n\t\t\t\treturn out;\n\t\t\t});\n\t\t},\n\n\t\tisNew() {\n\t\t\treturn true;\n\t\t},\n\n\t\tserialize() {\n\t\t\tconst collection = Collection.prototype.serialize.call(this);\n\n\t\t\tif (_.isObject(this._data) && this._data.url && !collection.length) {\n\t\t\t\treturn this._data.url;\n\t\t\t}\n\n\t\t\treturn collection;\n\t\t},\n\n\t\tsave(options = {}) {\n\t\t\tconst { batch, patch } = options;\n\n\t\t\tif (batch || !this.length) {\n\t\t\t\tif (patch) {\n\t\t\t\t\treturn this.sync(\"patch\", this, options);\n\t\t\t\t}\n\t\t\t\treturn this.sync(\"create\", this, options);\n\t\t\t}\n\n\t\t\treturn Promise.all(\n\t\t\t\tthis.map((model) => {\n\t\t\t\t\treturn model.save(model.toServer(), options);\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\n\t\tdelete(options = {}) {\n\t\t\tconst { batch } = options;\n\n\t\t\tif (batch) {\n\t\t\t\treturn this.sync(\"delete\", this, options);\n\t\t\t}\n\n\t\t\treturn Promise.all(\n\t\t\t\tthis.map((model) => {\n\t\t\t\t\treturn model.delete(model.toServer(), options);\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\n\t\tparse(attrs) {\n\t\t\tconst results = attrs.results || attrs;\n\n\t\t\tif (\n\t\t\t\tArray.isArray(results) &&\n\t\t\t\tresults.length &&\n\t\t\t\ttypeof results[0] === \"string\"\n\t\t\t) {\n\t\t\t\t// Convert any url responses from the server into an object that\n\t\t\t\t// can be passed to the model.\n\t\t\t\t//\n\t\t\t\t// TODO: Regex match for URLs\n\t\t\t\treturn results.map(function (attr) {\n\t\t\t\t\treturn { url: attr };\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn results;\n\t\t},\n\t}\n);\n\n// Make matchesURL available as a static method\nBaseCollection.matchesURL = function (url) {\n\treturn this.prototype.matchesURL(url);\n};\n"],"file":"base.js"}
1
+ {"version":3,"sources":["../../src/collections/base.js"],"names":["pageLimit","BaseCollection","Collection","extend","modelName","model","BaseModel","fetchEmpty","urlMatchKeys","defaultFetchData","per_page","constructor","_data","opts","data","options","_","defaults","newData","toJSON","_options","queryData","url","_url","length","registerStates","prototype","call","add","values","args","arguments","apply","_prepareModel","attrs","omit","Model","registeredStates","Error","urlRoot","getResourceURL","matchesURL","_matchesURL","getFullURLPath","path","Object","keys","query","queryIndex","indexOf","slice","qs","parse","stringify","arrayFormat","resp","re","matches","match","replacement","get","replace","isNew","log","error","Api","getURL","sync","fetchModels","Promise","all","models","map","fetch","fetchSet","idSet","id","warn","resolve","otherOpts","tap","reset","results","cloneDeep","response","fetchAll","checkPages","notLastPage","total_pages","page","belowPageLimit","fetchPage","then","toServer","serialize","out","collection","areModelsFetched","isFetched","every","Boolean","isObject","save","batch","patch","delete","Array","isArray","attr"],"mappings":"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","sourcesContent":["import { Api } from \"../api.js\";\nimport { BaseModel } from \"../models/base.js\";\nimport Collection from \"ampersand-rest-collection\";\nimport Promise from \"bluebird\";\nimport _ from \"lodash\";\nimport log from \"../log.js\";\nimport qs from \"qs\";\nimport { registeredStates } from \"../state-register.js\";\nimport { sync } from \"../sync.js\";\n\n// Current hardcoded limit for maximum number of pages fetched\n// automatically by fetchAll\nconst pageLimit = 20;\n\n/**\n * @constructor\n * @alias collections.BaseCollection\n */\nexport const BaseCollection = Collection.extend(\n\t/** @lends collections.BaseCollection# */ {\n\t\tmodelName: null,\n\t\tmodel: BaseModel,\n\t\tfetchEmpty: false,\n\n\t\t// Object of regexes that should be used to match a url in `matchesURL`\n\t\t// For example the URL: /api/foo/{pk}/bar/ might have the following:\n\t\t//\n\t\t// Example:\n\t\t//\n\t\t// ```\n\t\t// {\n\t\t// pk: \"number\"\n\t\t// }\n\t\t// ```\n\t\turlMatchKeys: {},\n\n\t\tdefaultFetchData: {\n\t\t\tper_page: 1000,\n\t\t},\n\n\t\tconstructor(_data = {}, opts = {}) {\n\t\t\tlet data = _data;\n\t\t\tconst options = _.defaults(opts, {\n\t\t\t\tdata: {},\n\t\t\t});\n\n\t\t\t// We ensure that we pass an array because we don't want the collection constructor to\n\t\t\t// create an empty model using a data object\n\t\t\tlet newData = [];\n\n\t\t\t// Allow passing in collections\n\t\t\tif (data instanceof Collection) {\n\t\t\t\tdata = data.toJSON();\n\t\t\t}\n\n\t\t\tthis._data = data;\n\t\t\tthis._options = options;\n\n\t\t\t// Remove reference to the prototype, or this can accidentally\n\t\t\t// apply to all collections\n\t\t\tthis.queryData = _.extend({}, this.defaultFetchData, options.data);\n\n\t\t\t// Check for specialized url returns from the server. This is for when the\n\t\t\t// server responds with an array of urls rather than object data.\n\t\t\tif (data && data.url) {\n\t\t\t\tthis._url = data.url;\n\t\t\t} else if (data && data.length) {\n\t\t\t\tnewData = data;\n\t\t\t}\n\n\t\t\tthis.registerStates();\n\n\t\t\tCollection.prototype.constructor.call(this, newData, opts);\n\n\t\t\t// Get the name for the collection based on the model\n\t\t\tif (!this.modelName && typeof this.model === \"function\") {\n\t\t\t\tthis.modelName = this.model.prototype.modelName;\n\t\t\t}\n\t\t},\n\n\t\tadd(values) {\n\t\t\tconst args = [...arguments];\n\n\t\t\tif (values && values instanceof Collection) {\n\t\t\t\targs[0] = values.toJSON();\n\t\t\t}\n\n\t\t\treturn Collection.prototype.add.apply(this, args);\n\t\t},\n\n\t\t_prepareModel(attrs, options) {\n\t\t\tconst opts = _.omit(options, [\"data\"]);\n\t\t\treturn Collection.prototype._prepareModel.call(this, attrs, opts);\n\t\t},\n\n\t\tregisterStates() {\n\t\t\tif (typeof this.model === \"string\") {\n\t\t\t\tconst Model = registeredStates[this.model];\n\t\t\t\tif (!Model) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`'${this.model}' not found! Did you forget to import it on the '${this.modelName}' model?`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.model = Model;\n\t\t\t}\n\t\t},\n\n\t\turlRoot() {\n\t\t\treturn this.getResourceURL();\n\t\t},\n\n\t\tmatchesURL(url) {\n\t\t\treturn this.model.prototype._matchesURL(url, false);\n\t\t},\n\n\t\tgetFullURLPath(path) {\n\t\t\tlet url = path;\n\t\t\tif (Object.keys(this.queryData).length) {\n\t\t\t\tlet query = this.queryData;\n\t\t\t\tconst queryIndex = url.indexOf(\"?\");\n\t\t\t\tif (queryIndex > -1) {\n\t\t\t\t\turl = url.slice(0, queryIndex);\n\t\t\t\t\tquery = _.extend(\n\t\t\t\t\t\t{},\n\t\t\t\t\t\tqs.parse(url.slice(queryIndex + 1)),\n\t\t\t\t\t\tthis.queryData\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (url.slice(-1) !== \"/\") {\n\t\t\t\t\turl += \"/\";\n\t\t\t\t}\n\t\t\t\turl += `?${qs.stringify(query, { arrayFormat: \"repeat\" })}`;\n\t\t\t}\n\t\t\treturn url;\n\t\t},\n\n\t\turl() {\n\t\t\tif (this._url) {\n\t\t\t\treturn this.getFullURLPath(this._url);\n\t\t\t}\n\t\t\tlet resp = this.urlRoot();\n\t\t\tif (resp.slice(-1) !== \"/\" && resp.indexOf(\"?\") === -1) {\n\t\t\t\tresp += \"/\";\n\t\t\t}\n\n\t\t\t// Replace any values in a url with one from the collection's options.\n\t\t\t// So if you have /path/to/{model.id}/models/\n\t\t\t// It will check the collection options for \"model.id\" and replace\n\t\t\t// it in the url\n\t\t\tconst re = /(\\{(?:\\w+\\.?)+\\})/g;\n\t\t\tconst matches = resp.match(re) || [];\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst path = match.slice(1, -1);\n\t\t\t\tconst replacement = _.get(this._options, path);\n\t\t\t\tif (replacement) {\n\t\t\t\t\tresp = resp.replace(match, replacement);\n\t\t\t\t} else if (!this.isNew()) {\n\t\t\t\t\tlog.error(\n\t\t\t\t\t\t`Collection ${this.modelName} is missing value ${path} as an option`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tresp = resp.replace(match, replacement);\n\t\t\t}\n\n\t\t\treturn this.getFullURLPath(resp);\n\t\t},\n\n\t\tgetResourceURL() {\n\t\t\t// If no name is present, assume we want the root API.\n\t\t\tif (this.modelName === null) {\n\t\t\t\treturn Api.getURL();\n\t\t\t}\n\t\t\treturn Api.getResourceURL(this.modelName);\n\t\t},\n\n\t\tsync() {\n\t\t\t// Use our own sync instead of the default ampersand one\n\t\t\treturn sync.apply(this, arguments);\n\t\t},\n\n\t\tfetchModels(options = {}) {\n\t\t\treturn Promise.all(this.models.map((model) => model.fetch(options)));\n\t\t},\n\n\t\tfetchSet(opts = {}) {\n\t\t\tconst idSet = this.models.map((model) => model.id);\n\n\t\t\tif (!idSet.length) {\n\t\t\t\tlog.warn(`Tried to fetch ${this.modelName} set with no models`);\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\n\t\t\tconst { data, ...otherOpts } = opts;\n\n\t\t\tconst options = {\n\t\t\t\tdata: {\n\t\t\t\t\t...data,\n\t\t\t\t\tid: idSet,\n\t\t\t\t},\n\t\t\t\t...otherOpts,\n\t\t\t};\n\n\t\t\t// Necessary because these models were already initialised before the fetch,\n\t\t\t// and the children weren't updated correctly with the new data.\n\t\t\treturn this.fetch(options).tap((data) => {\n\t\t\t\tthis.reset();\n\t\t\t\tthis.add(data.results);\n\t\t\t});\n\t\t},\n\n\t\tfetch(opts = {}) {\n\t\t\tconst options = _.cloneDeep(opts);\n\n\t\t\t// Add default params to the fetch (ie ?per_page=1000)\n\t\t\toptions.data = _.extend({}, this.queryData, options.data || {});\n\t\t\tthis._options = _.extend({}, this._options, options);\n\n\t\t\tthis.queryData = { ...options.data };\n\t\t\tif (options.url) {\n\t\t\t\tthis._url = options.url;\n\t\t\t}\n\n\t\t\treturn Collection.prototype.fetch.call(this, options).tap((response) => {\n\t\t\t\tthis._data = response;\n\t\t\t});\n\t\t},\n\n\t\tfetchAll(opts = {}) {\n\t\t\tconst options = _.cloneDeep(opts);\n\n\t\t\t// Add default params to the fetch (ie ?per_page=1000)\n\t\t\toptions.data = _.extend({}, this.queryData, options.data || {});\n\t\t\tthis._options = _.extend({}, this._options, options);\n\n\t\t\tthis.queryData = { ...this._options.data };\n\n\t\t\tif (this._options.url) {\n\t\t\t\tthis._url = options.url;\n\t\t\t}\n\n\t\t\tconst checkPages = (response) => {\n\t\t\t\tconst notLastPage = response.total_pages > response.page;\n\t\t\t\tconst belowPageLimit = response.page < pageLimit;\n\n\t\t\t\tif (notLastPage && belowPageLimit) {\n\t\t\t\t\tconst options = {\n\t\t\t\t\t\t...this._options,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t...this._options.data,\n\t\t\t\t\t\t\tpage: response.page + 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t\t\t// Update the collection with the new data & page number\n\t\t\t\t\tthis._options = options;\n\t\t\t\t\tthis.queryData = { ...options.data };\n\n\t\t\t\t\treturn this.fetchPage().then((response) => {\n\t\t\t\t\t\treturn checkPages(response);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// The collection's models are replaced with the latest\n\t\t\t\t\t// batch of models every time a new page is fetched.\n\t\t\t\t\t// Here we add back all of the previously-fetched models.\n\t\t\t\t\tthis.add(this._data.results);\n\t\t\t\t\treturn this._data;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn this.fetchPage().then((response) => {\n\t\t\t\treturn checkPages(response);\n\t\t\t});\n\t\t},\n\n\t\tfetchPage() {\n\t\t\treturn Collection.prototype.fetch\n\t\t\t\t.call(this, this._options)\n\t\t\t\t.then((response) => {\n\t\t\t\t\t// Add the response data to this._data - if we're fetching\n\t\t\t\t\t// multiple pages, this._data.results will contain all of the\n\t\t\t\t\t// results fetched from all pages so far\n\t\t\t\t\tif (this._data.results?.length) {\n\t\t\t\t\t\tthis._data = {\n\t\t\t\t\t\t\t...response,\n\t\t\t\t\t\t\tresults: [...this._data.results, ...response.results],\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._data = response;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn response;\n\t\t\t\t});\n\t\t},\n\n\t\ttoServer() {\n\t\t\treturn this.map((model) => {\n\t\t\t\tif (model.toServer) {\n\t\t\t\t\treturn model.toServer();\n\t\t\t\t} else if (model.serialize) {\n\t\t\t\t\treturn model.serialize();\n\t\t\t\t}\n\n\t\t\t\tconst out = {};\n\t\t\t\t_.extend(out, model);\n\t\t\t\tdelete out.collection;\n\t\t\t\treturn out;\n\t\t\t});\n\t\t},\n\n\t\t// Returns \"true\" if all child models have been fetched\n\t\tareModelsFetched() {\n\t\t\treturn this.map((model) => model.isFetched()).every(Boolean);\n\t\t},\n\n\t\tisNew() {\n\t\t\treturn true;\n\t\t},\n\n\t\tserialize() {\n\t\t\tconst collection = Collection.prototype.serialize.call(this);\n\n\t\t\tif (_.isObject(this._data) && this._data.url && !collection.length) {\n\t\t\t\treturn this._data.url;\n\t\t\t}\n\n\t\t\treturn collection;\n\t\t},\n\n\t\tsave(options = {}) {\n\t\t\tconst { batch, patch } = options;\n\n\t\t\tif (batch || !this.length) {\n\t\t\t\tif (patch) {\n\t\t\t\t\treturn this.sync(\"patch\", this, options);\n\t\t\t\t}\n\t\t\t\treturn this.sync(\"create\", this, options);\n\t\t\t}\n\n\t\t\treturn Promise.all(\n\t\t\t\tthis.map((model) => {\n\t\t\t\t\treturn model.save(model.toServer(), options);\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\n\t\tdelete(options = {}) {\n\t\t\tconst { batch } = options;\n\n\t\t\tif (batch) {\n\t\t\t\treturn this.sync(\"delete\", this, options);\n\t\t\t}\n\n\t\t\treturn Promise.all(\n\t\t\t\tthis.map((model) => {\n\t\t\t\t\treturn model.delete(model.toServer(), options);\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\n\t\tparse(attrs) {\n\t\t\tconst results = attrs.results || attrs;\n\n\t\t\tif (\n\t\t\t\tArray.isArray(results) &&\n\t\t\t\tresults.length &&\n\t\t\t\ttypeof results[0] === \"string\"\n\t\t\t) {\n\t\t\t\t// Convert any url responses from the server into an object that\n\t\t\t\t// can be passed to the model.\n\t\t\t\t//\n\t\t\t\t// TODO: Regex match for URLs\n\t\t\t\treturn results.map((attr) => {\n\t\t\t\t\treturn { url: attr };\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn results;\n\t\t},\n\t}\n);\n\n// Make matchesURL available as a static method\nBaseCollection.matchesURL = function (url) {\n\treturn this.prototype.matchesURL(url);\n};\n"],"file":"base.js"}