expressa 2.0.18 → 2.0.19

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 (281) hide show
  1. package/.circleci/config.yml +21 -21
  2. package/.eslintrc.json +29 -29
  3. package/LICENSE +21 -21
  4. package/README.md +137 -137
  5. package/auth/index.js +76 -76
  6. package/auth/jwt.js +31 -31
  7. package/controllers/collections.js +260 -260
  8. package/controllers/install.js +105 -105
  9. package/controllers/status.js +43 -43
  10. package/controllers/users.js +52 -52
  11. package/cypress/fixtures/example.json +4 -4
  12. package/cypress/integration/0_install_spec.js +8 -8
  13. package/cypress/integration/custom_collections.js +28 -28
  14. package/cypress/integration/home.js +9 -9
  15. package/cypress/integration/settings.js +34 -34
  16. package/cypress/integration/users.js +61 -61
  17. package/cypress/plugins/index.js +17 -17
  18. package/cypress/support/commands.js +54 -54
  19. package/cypress/support/index.js +20 -20
  20. package/cypress/support/util.js +10 -10
  21. package/cypress.json +4 -4
  22. package/db/cached.js +40 -40
  23. package/db/file.js +112 -112
  24. package/db/memory.js +79 -79
  25. package/db/mongo.js +86 -86
  26. package/db/postgres.js +93 -93
  27. package/doc/authentication.md +38 -38
  28. package/doc/automatic-fields.md +12 -12
  29. package/doc/blogexample.md +16 -16
  30. package/doc/custom-endpoints.md +20 -20
  31. package/doc/database.md +23 -23
  32. package/doc/development.md +33 -33
  33. package/doc/listeners.md +103 -103
  34. package/doc/modules.md +8 -8
  35. package/doc/permissions.md +14 -14
  36. package/doc/relationships.md +65 -65
  37. package/doc/testing.md +47 -47
  38. package/doc/uploading-files.md +53 -53
  39. package/index.js +297 -297
  40. package/listeners.js +65 -65
  41. package/listeners_collection_permissions.js +29 -29
  42. package/listeners_users.js +96 -96
  43. package/listeners_validation.js +43 -43
  44. package/middleware/logging.js +30 -30
  45. package/middleware/permissions.js +41 -41
  46. package/modules/access_keys/access_keys.js +32 -32
  47. package/modules/admin/.babelrc +19 -19
  48. package/modules/admin/.editorconfig +14 -14
  49. package/modules/admin/.eslintignore +5 -5
  50. package/modules/admin/.eslintrc.js +197 -197
  51. package/modules/admin/.postcssrc.js +10 -10
  52. package/modules/admin/.travis.yml +5 -5
  53. package/modules/admin/LICENSE +21 -21
  54. package/modules/admin/README.md +88 -88
  55. package/modules/admin/build/build.js +45 -45
  56. package/modules/admin/build/check-versions.js +64 -64
  57. package/modules/admin/build/utils.js +108 -108
  58. package/modules/admin/build/vue-loader.conf.js +5 -5
  59. package/modules/admin/build/webpack.base.conf.js +112 -112
  60. package/modules/admin/build/webpack.dev.conf.js +95 -95
  61. package/modules/admin/build/webpack.prod.conf.js +112 -112
  62. package/modules/admin/config/dev.env.js +8 -8
  63. package/modules/admin/config/index.js +86 -86
  64. package/modules/admin/config/prod.env.js +5 -5
  65. package/modules/admin/dist/164c6167c1f3c497c07c.woff +1 -0
  66. package/modules/admin/dist/42ac07abc8473600c41f.ttf +1 -0
  67. package/modules/admin/dist/86dccb18a7eb4be8ef1a.woff +1 -0
  68. package/modules/admin/dist/c45297c558e0318fc9c5.ttf +1 -0
  69. package/modules/admin/dist/c717c9930715e24fa12c.woff +1 -0
  70. package/modules/admin/dist/ca6f07ef23f24cc2738a.ttf +1 -0
  71. package/modules/admin/dist/css/269.f7d5c7d5.css +37 -0
  72. package/modules/admin/dist/css/269.f7d5c7d5.css.gz +0 -0
  73. package/modules/admin/dist/css/451.c6646d20.css +1 -0
  74. package/modules/admin/dist/css/451.c6646d20.css.gz +0 -0
  75. package/modules/admin/dist/css/572.74d8e965.css +34 -0
  76. package/modules/admin/dist/css/572.74d8e965.css.gz +0 -0
  77. package/modules/admin/dist/css/651.e946bda7.css +6 -0
  78. package/modules/admin/dist/css/651.e946bda7.css.gz +0 -0
  79. package/modules/admin/dist/css/699.d1f90954.css +8 -0
  80. package/modules/admin/dist/css/699.d1f90954.css.gz +0 -0
  81. package/modules/admin/dist/css/750.4086915d.css +2 -0
  82. package/modules/admin/dist/css/750.4086915d.css.gz +0 -0
  83. package/modules/admin/dist/css/864.506917a4.css +7 -0
  84. package/modules/admin/dist/css/864.506917a4.css.gz +0 -0
  85. package/modules/admin/dist/css/899.506917a4.css +7 -0
  86. package/modules/admin/dist/css/899.506917a4.css.gz +0 -0
  87. package/modules/admin/dist/css/950.1fd9d57c.css +7 -0
  88. package/modules/admin/dist/css/950.1fd9d57c.css.gz +0 -0
  89. package/modules/admin/dist/css/app.11cc6245.css +39 -0
  90. package/modules/admin/dist/css/app.11cc6245.css.gz +0 -0
  91. package/modules/admin/dist/css/app.2e1b0d79.css +591 -0
  92. package/modules/admin/dist/css/app.2e1b0d79.css.gz +0 -0
  93. package/modules/admin/dist/css/app.4d43d0fd.css +592 -0
  94. package/modules/admin/dist/css/app.4d43d0fd.css.gz +0 -0
  95. package/modules/admin/dist/css/app.abace109.css +1 -0
  96. package/modules/admin/dist/css/app.abace109.css.gz +0 -0
  97. package/modules/admin/dist/css/chunk-elementUI.67ad86d7.css +1 -0
  98. package/modules/admin/dist/css/chunk-elementUI.67ad86d7.css.gz +0 -0
  99. package/modules/admin/dist/css/chunk-elementUI.9e660bfd.css +1 -0
  100. package/modules/admin/dist/css/chunk-elementUI.9e660bfd.css.gz +0 -0
  101. package/modules/admin/dist/css/chunk-elementUI.c77cf142.css +1 -0
  102. package/modules/admin/dist/css/chunk-elementUI.c77cf142.css.gz +0 -0
  103. package/modules/admin/dist/css/chunk-elementUI.f1625b35.css +1 -0
  104. package/modules/admin/dist/css/chunk-elementUI.f1625b35.css.gz +0 -0
  105. package/modules/admin/dist/css/chunk-elementUI.f25dfb9b.css +1 -0
  106. package/modules/admin/dist/css/chunk-elementUI.f25dfb9b.css.gz +0 -0
  107. package/modules/admin/dist/css/chunk-libs.de0d8484.css +551 -0
  108. package/modules/admin/dist/css/chunk-libs.de0d8484.css.gz +0 -0
  109. package/modules/admin/dist/index.html +1 -1
  110. package/modules/admin/dist/static/fonts/element-icons.313f7da.woff +0 -0
  111. package/modules/admin/dist/static/fonts/element-icons.4520188.ttf +0 -0
  112. package/modules/admin/dist/static/js/269.7245ceaf.js +1 -0
  113. package/modules/admin/dist/static/js/269.7245ceaf.js.gz +0 -0
  114. package/modules/admin/dist/static/js/451.645974a8.js +1 -0
  115. package/modules/admin/dist/static/js/451.645974a8.js.gz +0 -0
  116. package/modules/admin/dist/static/js/460.962d5bc0.js +1 -0
  117. package/modules/admin/dist/static/js/460.962d5bc0.js.gz +0 -0
  118. package/modules/admin/dist/static/js/556.1e08866a.js +1 -0
  119. package/modules/admin/dist/static/js/556.1e08866a.js.gz +0 -0
  120. package/modules/admin/dist/static/js/572.13392e1d.js +1 -0
  121. package/modules/admin/dist/static/js/572.13392e1d.js.gz +0 -0
  122. package/modules/admin/dist/static/js/603.7b34a650.js +1 -0
  123. package/modules/admin/dist/static/js/603.7b34a650.js.gz +0 -0
  124. package/modules/admin/dist/static/js/637.26413baa.js +1 -0
  125. package/modules/admin/dist/static/js/637.26413baa.js.gz +0 -0
  126. package/modules/admin/dist/static/js/651.564b24b6.js +1 -0
  127. package/modules/admin/dist/static/js/651.564b24b6.js.gz +0 -0
  128. package/modules/admin/dist/static/js/653.02ec1098.js +1 -0
  129. package/modules/admin/dist/static/js/653.02ec1098.js.gz +0 -0
  130. package/modules/admin/dist/static/js/699.c7564884.js +1 -0
  131. package/modules/admin/dist/static/js/699.c7564884.js.gz +0 -0
  132. package/modules/admin/dist/static/js/750.50c950da.js +1 -0
  133. package/modules/admin/dist/static/js/750.50c950da.js.gz +0 -0
  134. package/modules/admin/dist/static/js/864.4f43847d.js +1 -0
  135. package/modules/admin/dist/static/js/864.4f43847d.js.gz +0 -0
  136. package/modules/admin/dist/static/js/950.d4ff0a18.js +1 -0
  137. package/modules/admin/dist/static/js/950.d4ff0a18.js.gz +0 -0
  138. package/modules/admin/dist/static/js/app.981e71b3.js +2 -0
  139. package/modules/admin/dist/static/js/{chunk-libs.06c38828.js.LICENSE.txt → app.981e71b3.js.LICENSE.txt} +15 -18
  140. package/modules/admin/dist/static/js/app.981e71b3.js.LICENSE.txt.gz +0 -0
  141. package/modules/admin/dist/static/js/app.981e71b3.js.gz +0 -0
  142. package/modules/admin/index.html +16 -16
  143. package/modules/admin/package.json +101 -101
  144. package/modules/admin/src/App.vue +11 -11
  145. package/modules/admin/src/api/login.js +26 -26
  146. package/modules/admin/src/api/table.js +9 -9
  147. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  148. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  149. package/modules/admin/src/components/JSONEditor.vue +180 -180
  150. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  151. package/modules/admin/src/icons/index.js +9 -9
  152. package/modules/admin/src/icons/svgo.yml +22 -22
  153. package/modules/admin/src/main.js +42 -42
  154. package/modules/admin/src/permission.js +49 -49
  155. package/modules/admin/src/router/index.js +200 -200
  156. package/modules/admin/src/store/getters.js +11 -11
  157. package/modules/admin/src/store/index.js +17 -17
  158. package/modules/admin/src/store/modules/app.js +43 -43
  159. package/modules/admin/src/store/modules/user.js +104 -104
  160. package/modules/admin/src/styles/element-ui.scss +29 -29
  161. package/modules/admin/src/styles/index.scss +78 -78
  162. package/modules/admin/src/styles/mixin.scss +27 -27
  163. package/modules/admin/src/styles/sidebar.scss +133 -133
  164. package/modules/admin/src/styles/transition.scss +46 -46
  165. package/modules/admin/src/styles/variables.scss +4 -4
  166. package/modules/admin/src/utils/auth.js +15 -15
  167. package/modules/admin/src/utils/index.js +74 -74
  168. package/modules/admin/src/utils/request.js +48 -48
  169. package/modules/admin/src/utils/validate.js +31 -31
  170. package/modules/admin/src/views/404.vue +235 -235
  171. package/modules/admin/src/views/Dev.vue +33 -33
  172. package/modules/admin/src/views/EditDocument.vue +116 -116
  173. package/modules/admin/src/views/Endpoints.vue +279 -279
  174. package/modules/admin/src/views/Home.vue +84 -84
  175. package/modules/admin/src/views/Install.vue +79 -79
  176. package/modules/admin/src/views/ListDocuments.vue +72 -72
  177. package/modules/admin/src/views/ListDocuments2.vue +462 -462
  178. package/modules/admin/src/views/ManageListeners.vue +67 -67
  179. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  180. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  181. package/modules/admin/src/views/ViewRequest.vue +77 -77
  182. package/modules/admin/src/views/form/index.vue +91 -91
  183. package/modules/admin/src/views/layout/Layout.vue +69 -69
  184. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  185. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  186. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  187. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  188. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  189. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  190. package/modules/admin/src/views/layout/components/index.js +3 -3
  191. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  192. package/modules/admin/src/views/login/index.vue +195 -195
  193. package/modules/admin/src/views/tree/index.vue +77 -77
  194. package/modules/collections/collections.js +39 -39
  195. package/modules/core/core.js +197 -197
  196. package/modules/logging/logging.js +88 -88
  197. package/modules/permissions/permissions.js +106 -106
  198. package/package.json +59 -59
  199. package/scripts/expressa +12 -12
  200. package/scripts/run_cypress_tests.sh +5 -5
  201. package/scripts/run_db_tests.sh +8 -8
  202. package/test/0-install.js +96 -96
  203. package/test/collections.js +431 -431
  204. package/test/collections.querying.js +288 -288
  205. package/test/db.js +258 -258
  206. package/test/db.strings.js +73 -73
  207. package/test/db.updating.js +144 -144
  208. package/test/logging.js +29 -29
  209. package/test/test.js +93 -93
  210. package/test/testserver.js +17 -17
  211. package/test/testutils.js +136 -136
  212. package/test/users.js +425 -425
  213. package/util.js +522 -522
  214. package/modules/admin/dist/index.html.gz +0 -0
  215. package/modules/admin/dist/static/css/app.9dd57eea.css +0 -1
  216. package/modules/admin/dist/static/css/app.9dd57eea.css.gz +0 -0
  217. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css +0 -1
  218. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css.gz +0 -0
  219. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css +0 -1
  220. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css.gz +0 -0
  221. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css +0 -1
  222. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css.gz +0 -0
  223. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css +0 -1
  224. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css.gz +0 -0
  225. package/modules/admin/dist/static/css/chunk-7291.13514e45.css +0 -0
  226. package/modules/admin/dist/static/css/chunk-7291.13514e45.css.gz +0 -0
  227. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css +0 -1
  228. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css.gz +0 -0
  229. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css +0 -1
  230. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css.gz +0 -0
  231. package/modules/admin/dist/static/css/chunk-b423.5f239333.css +0 -0
  232. package/modules/admin/dist/static/css/chunk-b423.5f239333.css.gz +0 -0
  233. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css +0 -1
  234. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css.gz +0 -0
  235. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css +0 -1
  236. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css.gz +0 -0
  237. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css +0 -1
  238. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css.gz +0 -0
  239. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css +0 -1
  240. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css.gz +0 -0
  241. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css +0 -14
  242. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css.gz +0 -0
  243. package/modules/admin/dist/static/fonts/element-icons.6f0a763.ttf +0 -0
  244. package/modules/admin/dist/static/js/app.e9461593.js +0 -1
  245. package/modules/admin/dist/static/js/app.e9461593.js.gz +0 -0
  246. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js +0 -2
  247. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt +0 -13
  248. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt.gz +0 -0
  249. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.gz +0 -0
  250. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js +0 -1
  251. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js.gz +0 -0
  252. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js +0 -1
  253. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js.gz +0 -0
  254. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js +0 -1
  255. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js.gz +0 -0
  256. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js +0 -1
  257. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js.gz +0 -0
  258. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js +0 -1
  259. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js.gz +0 -0
  260. package/modules/admin/dist/static/js/chunk-7291.590524e9.js +0 -1
  261. package/modules/admin/dist/static/js/chunk-7291.590524e9.js.gz +0 -0
  262. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js +0 -1
  263. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js.gz +0 -0
  264. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js +0 -1
  265. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js.gz +0 -0
  266. package/modules/admin/dist/static/js/chunk-b423.387c504c.js +0 -1
  267. package/modules/admin/dist/static/js/chunk-b423.387c504c.js.gz +0 -0
  268. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js +0 -1
  269. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js.gz +0 -0
  270. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js +0 -1
  271. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js.gz +0 -0
  272. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js +0 -1
  273. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js.gz +0 -0
  274. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js +0 -1
  275. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js.gz +0 -0
  276. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js +0 -1
  277. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js.gz +0 -0
  278. package/modules/admin/dist/static/js/chunk-libs.06c38828.js +0 -2
  279. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt.gz +0 -0
  280. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.gz +0 -0
  281. /package/modules/admin/dist/static/img/{404.a57b6f3.png → 404.4cf6930.png} +0 -0
@@ -1,279 +1,279 @@
1
- <template>
2
- <div class="px-3">
3
- <div class="d-flex align-items-start py-2">
4
- <div>
5
- Endpoint
6
-
7
- <div class="d-flex align-items-center mb-2">
8
- <el-input v-model="apiBaseUrl" placeholder="key" />
9
- <el-input v-model="apiSuffix" />
10
- </div>
11
-
12
- Params
13
- <div v-for="(parameter, index) in params" :key="index" class="d-flex align-items-center mb-1">
14
- <el-checkbox v-model="parameter.isEnabled" class="mr-2" />
15
-
16
- <el-input v-model="parameter.key" placeholder="key" @input="handleParamKeyChange(index)" />
17
-
18
- <el-input v-model="parameter.value" placeholder="value" class="ml-1" />
19
-
20
- <el-button
21
- v-if="params.length > 1"
22
- icon="el-icon-close"
23
- circle
24
- type="text"
25
- @click="removeParam(index)"
26
- />
27
- </div>
28
- </div>
29
-
30
- <span class="mx-auto" />
31
-
32
- <div class="d-flex align-items-center">
33
- <el-dropdown
34
- multiple
35
- class="mr-4"
36
- :hide-on-click="false"
37
- >
38
- <span class="el-dropdown-link">
39
- Select columns
40
- <i class="el-icon-arrow-down el-icon--right" />
41
- </span>
42
-
43
- <el-dropdown-menu slot="dropdown" style="max-height: 300px; overflow: auto">
44
- <el-checkbox-group v-model="selectedColumns" @input="update">
45
- <el-dropdown-item
46
- v-for="column in allPossibleColumns"
47
- :key="column"
48
- :label="column"
49
- :value="column"
50
- >
51
- <el-checkbox
52
- class="mb-0 mr-4"
53
- :label="column"
54
- :disabled="selectedColumns.length === 1 && selectedColumns[0] === column"
55
- />
56
- </el-dropdown-item>
57
- </el-checkbox-group>
58
- </el-dropdown-menu>
59
- </el-dropdown>
60
-
61
- <el-checkbox
62
- v-model="isFiltersVisible"
63
- class="mb-0 mr-4"
64
- >
65
- Show Filters
66
- </el-checkbox>
67
-
68
- <el-pagination
69
- :page-size="pageSize"
70
- :total="count"
71
- :page-sizes="pageSizes"
72
- :current-page.sync="page"
73
- layout="sizes, prev, pager, next"
74
- @current-change="update()"
75
- @size-change="pageSize = $event, update()"
76
- />
77
- </div>
78
- </div>
79
-
80
- <el-button class="btn btn-primary mb-3" @click="update">
81
- Search
82
- </el-button>
83
-
84
- <el-table
85
- :data="tableRows"
86
- element-loading-text="Loading"
87
- border
88
- fit
89
- highlight-current-row
90
- @sort-change="handleSortChange"
91
- >
92
- <el-table-column
93
- v-for="name in selectedColumns"
94
- :key="name"
95
- :label="name"
96
- :prop="name"
97
- align="center"
98
- :sortable="true"
99
- >
100
- <template slot-scope="scope">
101
- <div class="text-left">
102
- <div v-if="scope.$index === 0 && isFiltersVisible">
103
- <el-input
104
- v-model="searchFilters[name]"
105
- :placeholder="`Search by ${name}`"
106
- :type="getFieldType(name) === 'number' ? 'number' : 'text'"
107
- @change="update()"
108
- />
109
-
110
- <el-checkbox
111
- v-model="exactSearches[name]"
112
- :disabled="getFieldType(name) === 'number'"
113
- class="mt-3"
114
- @change="update()"
115
- >
116
- Exact match
117
- </el-checkbox>
118
- </div>
119
-
120
- <span>{{ getPath(scope.row, name) }}</span>
121
- </div>
122
- </template>
123
- </el-table-column>
124
- </el-table>
125
-
126
- <div v-if="data.length" class="d-flex align-items-center my-3">
127
- <button class="btn btn-secondary download-button mr-2" @click="downloadCSV()">
128
- Download
129
- </button>
130
-
131
- <button class="btn btn-secondary download-button" @click="downloadAllCSV()">
132
- Download All
133
- </button>
134
-
135
- <span class="mx-auto" />
136
-
137
- <el-pagination
138
- :page-size="pageSize"
139
- :total="count"
140
- :page-sizes="pageSizes"
141
- :current-page.sync="page"
142
- layout="sizes, prev, pager, next"
143
- @current-change="update()"
144
- @size-change="pageSize = $event, update()"
145
- />
146
- </div>
147
- </div>
148
- </template>
149
-
150
- <script>
151
- import ListDocuments2 from '@/views/ListDocuments2.vue'
152
- import request from '@/utils/request'
153
- var dot = require('dot-object')
154
- dot.keepArray = true
155
-
156
- export default {
157
- name: 'Endpoints',
158
- mixins: [ListDocuments2],
159
- data() {
160
- return {
161
- lastEndpoint: '',
162
- apiBaseUrl: request.defaults.baseURL,
163
- apiSuffix: '',
164
- }
165
- },
166
- methods: {
167
- async update() {
168
- // Removes leading slash if any
169
- while (this.apiSuffix.charAt(0) === '/') {
170
- this.apiSuffix = this.apiSuffix.substring(1)
171
- }
172
-
173
- if (!this.apiSuffix) {
174
- return
175
- }
176
-
177
- const currentEndpoint = `${this.apiBaseUrl}/${this.apiSuffix}`
178
- const isDifferentEndpoint = currentEndpoint !== this.lastEndpoint
179
-
180
- if (isDifferentEndpoint) {
181
- this.lastEndpoint = currentEndpoint
182
- this.resetTable()
183
- }
184
-
185
- const params = {
186
- page: this.page,
187
- limit: this.pageSize,
188
- ...this.allFilters,
189
- query: undefined
190
- }
191
-
192
- const url = this.customParams ? `/${this.apiSuffix}?${this.customParams}` : `/${this.apiSuffix}`
193
- let info = (await request({ url, params, baseURL: this.apiBaseUrl })).data
194
-
195
- const isNotPaged = !info.page && !info.itemsTotal
196
-
197
- if (isNotPaged) {
198
- if (!Array.isArray(info)) {
199
- if (typeof info !== 'object') {
200
- // If response is primitive type
201
- info = [{
202
- result: info
203
- }]
204
- } else {
205
- // If response is an object
206
- info = [info]
207
- }
208
- }
209
-
210
- info = {
211
- data: info,
212
- itemsTotal: 1
213
- }
214
- }
215
-
216
- this.count = info.itemsTotal
217
- this.data = this.applyCustomColumnFilter(info.data)
218
-
219
- // Set columns data if not set.
220
- if (!this.selectedColumns.length) {
221
- const columns = Array.from(this.data.reduce((acc, row) => {
222
- const rowWithDottedKeys = dot.dot(row)
223
-
224
- return new Set([
225
- ...Object.keys(rowWithDottedKeys),
226
- ...acc
227
- ])
228
- }, []))
229
-
230
- this.selectedColumns = columns.slice(0, 5)
231
- this.allPossibleColumns = columns
232
- }
233
- },
234
- applyCustomColumnFilter(tableData) {
235
- const customColumnSearches = Object.keys(this.searchFilters)
236
-
237
- return tableData.filter((row) => {
238
- return customColumnSearches.every(fieldName => {
239
- const searchKeyword = this.searchFilters[fieldName]
240
-
241
- if (!searchKeyword) {
242
- return true
243
- }
244
-
245
- const rowWithDottedKeys = dot.dot(row)
246
- const stringified = rowWithDottedKeys[fieldName].toString()
247
-
248
- if (this.exactSearches[fieldName]) {
249
- return stringified.trim() === searchKeyword.trim()
250
- } else {
251
- return stringified.toLowerCase().includes(searchKeyword.toLowerCase())
252
- }
253
- })
254
- })
255
- },
256
- async downloadAllCSV() {
257
- let rows = []
258
- let page = 1
259
-
260
- while (this.count > rows.length) {
261
- const params = {
262
- ...this.allFilters,
263
- page: page,
264
- limit: 500,
265
- query: undefined
266
- }
267
-
268
- const url = `/${this.apiSuffix}?${this.customParams}`
269
- const response = (await request({ url, params })).data
270
- rows = [...response.data, ...rows]
271
- page += 1
272
- }
273
-
274
- this.downloadCSV(this.applyCustomColumnFilter(rows))
275
- },
276
- }
277
- }
278
- </script>
279
-
1
+ <template>
2
+ <div class="px-3">
3
+ <div class="d-flex align-items-start py-2">
4
+ <div>
5
+ Endpoint
6
+
7
+ <div class="d-flex align-items-center mb-2">
8
+ <el-input v-model="apiBaseUrl" placeholder="key" />
9
+ <el-input v-model="apiSuffix" />
10
+ </div>
11
+
12
+ Params
13
+ <div v-for="(parameter, index) in params" :key="index" class="d-flex align-items-center mb-1">
14
+ <el-checkbox v-model="parameter.isEnabled" class="mr-2" />
15
+
16
+ <el-input v-model="parameter.key" placeholder="key" @input="handleParamKeyChange(index)" />
17
+
18
+ <el-input v-model="parameter.value" placeholder="value" class="ml-1" />
19
+
20
+ <el-button
21
+ v-if="params.length > 1"
22
+ icon="el-icon-close"
23
+ circle
24
+ type="text"
25
+ @click="removeParam(index)"
26
+ />
27
+ </div>
28
+ </div>
29
+
30
+ <span class="mx-auto" />
31
+
32
+ <div class="d-flex align-items-center">
33
+ <el-dropdown
34
+ multiple
35
+ class="mr-4"
36
+ :hide-on-click="false"
37
+ >
38
+ <span class="el-dropdown-link">
39
+ Select columns
40
+ <i class="el-icon-arrow-down el-icon--right" />
41
+ </span>
42
+
43
+ <el-dropdown-menu slot="dropdown" style="max-height: 300px; overflow: auto">
44
+ <el-checkbox-group v-model="selectedColumns" @input="update">
45
+ <el-dropdown-item
46
+ v-for="column in allPossibleColumns"
47
+ :key="column"
48
+ :label="column"
49
+ :value="column"
50
+ >
51
+ <el-checkbox
52
+ class="mb-0 mr-4"
53
+ :label="column"
54
+ :disabled="selectedColumns.length === 1 && selectedColumns[0] === column"
55
+ />
56
+ </el-dropdown-item>
57
+ </el-checkbox-group>
58
+ </el-dropdown-menu>
59
+ </el-dropdown>
60
+
61
+ <el-checkbox
62
+ v-model="isFiltersVisible"
63
+ class="mb-0 mr-4"
64
+ >
65
+ Show Filters
66
+ </el-checkbox>
67
+
68
+ <el-pagination
69
+ :page-size="pageSize"
70
+ :total="count"
71
+ :page-sizes="pageSizes"
72
+ :current-page.sync="page"
73
+ layout="sizes, prev, pager, next"
74
+ @current-change="update()"
75
+ @size-change="pageSize = $event, update()"
76
+ />
77
+ </div>
78
+ </div>
79
+
80
+ <el-button class="btn btn-primary mb-3" @click="update">
81
+ Search
82
+ </el-button>
83
+
84
+ <el-table
85
+ :data="tableRows"
86
+ element-loading-text="Loading"
87
+ border
88
+ fit
89
+ highlight-current-row
90
+ @sort-change="handleSortChange"
91
+ >
92
+ <el-table-column
93
+ v-for="name in selectedColumns"
94
+ :key="name"
95
+ :label="name"
96
+ :prop="name"
97
+ align="center"
98
+ :sortable="true"
99
+ >
100
+ <template slot-scope="scope">
101
+ <div class="text-left">
102
+ <div v-if="scope.$index === 0 && isFiltersVisible">
103
+ <el-input
104
+ v-model="searchFilters[name]"
105
+ :placeholder="`Search by ${name}`"
106
+ :type="getFieldType(name) === 'number' ? 'number' : 'text'"
107
+ @change="update()"
108
+ />
109
+
110
+ <el-checkbox
111
+ v-model="exactSearches[name]"
112
+ :disabled="getFieldType(name) === 'number'"
113
+ class="mt-3"
114
+ @change="update()"
115
+ >
116
+ Exact match
117
+ </el-checkbox>
118
+ </div>
119
+
120
+ <span>{{ getPath(scope.row, name) }}</span>
121
+ </div>
122
+ </template>
123
+ </el-table-column>
124
+ </el-table>
125
+
126
+ <div v-if="data.length" class="d-flex align-items-center my-3">
127
+ <button class="btn btn-secondary download-button mr-2" @click="downloadCSV()">
128
+ Download
129
+ </button>
130
+
131
+ <button class="btn btn-secondary download-button" @click="downloadAllCSV()">
132
+ Download All
133
+ </button>
134
+
135
+ <span class="mx-auto" />
136
+
137
+ <el-pagination
138
+ :page-size="pageSize"
139
+ :total="count"
140
+ :page-sizes="pageSizes"
141
+ :current-page.sync="page"
142
+ layout="sizes, prev, pager, next"
143
+ @current-change="update()"
144
+ @size-change="pageSize = $event, update()"
145
+ />
146
+ </div>
147
+ </div>
148
+ </template>
149
+
150
+ <script>
151
+ import ListDocuments2 from '@/views/ListDocuments2.vue'
152
+ import request from '@/utils/request'
153
+ var dot = require('dot-object')
154
+ dot.keepArray = true
155
+
156
+ export default {
157
+ name: 'Endpoints',
158
+ mixins: [ListDocuments2],
159
+ data() {
160
+ return {
161
+ lastEndpoint: '',
162
+ apiBaseUrl: request.defaults.baseURL,
163
+ apiSuffix: '',
164
+ }
165
+ },
166
+ methods: {
167
+ async update() {
168
+ // Removes leading slash if any
169
+ while (this.apiSuffix.charAt(0) === '/') {
170
+ this.apiSuffix = this.apiSuffix.substring(1)
171
+ }
172
+
173
+ if (!this.apiSuffix) {
174
+ return
175
+ }
176
+
177
+ const currentEndpoint = `${this.apiBaseUrl}/${this.apiSuffix}`
178
+ const isDifferentEndpoint = currentEndpoint !== this.lastEndpoint
179
+
180
+ if (isDifferentEndpoint) {
181
+ this.lastEndpoint = currentEndpoint
182
+ this.resetTable()
183
+ }
184
+
185
+ const params = {
186
+ page: this.page,
187
+ limit: this.pageSize,
188
+ ...this.allFilters,
189
+ query: undefined
190
+ }
191
+
192
+ const url = this.customParams ? `/${this.apiSuffix}?${this.customParams}` : `/${this.apiSuffix}`
193
+ let info = (await request({ url, params, baseURL: this.apiBaseUrl })).data
194
+
195
+ const isNotPaged = !info.page && !info.itemsTotal
196
+
197
+ if (isNotPaged) {
198
+ if (!Array.isArray(info)) {
199
+ if (typeof info !== 'object') {
200
+ // If response is primitive type
201
+ info = [{
202
+ result: info
203
+ }]
204
+ } else {
205
+ // If response is an object
206
+ info = [info]
207
+ }
208
+ }
209
+
210
+ info = {
211
+ data: info,
212
+ itemsTotal: 1
213
+ }
214
+ }
215
+
216
+ this.count = info.itemsTotal
217
+ this.data = this.applyCustomColumnFilter(info.data)
218
+
219
+ // Set columns data if not set.
220
+ if (!this.selectedColumns.length) {
221
+ const columns = Array.from(this.data.reduce((acc, row) => {
222
+ const rowWithDottedKeys = dot.dot(row)
223
+
224
+ return new Set([
225
+ ...Object.keys(rowWithDottedKeys),
226
+ ...acc
227
+ ])
228
+ }, []))
229
+
230
+ this.selectedColumns = columns.slice(0, 5)
231
+ this.allPossibleColumns = columns
232
+ }
233
+ },
234
+ applyCustomColumnFilter(tableData) {
235
+ const customColumnSearches = Object.keys(this.searchFilters)
236
+
237
+ return tableData.filter((row) => {
238
+ return customColumnSearches.every(fieldName => {
239
+ const searchKeyword = this.searchFilters[fieldName]
240
+
241
+ if (!searchKeyword) {
242
+ return true
243
+ }
244
+
245
+ const rowWithDottedKeys = dot.dot(row)
246
+ const stringified = rowWithDottedKeys[fieldName].toString()
247
+
248
+ if (this.exactSearches[fieldName]) {
249
+ return stringified.trim() === searchKeyword.trim()
250
+ } else {
251
+ return stringified.toLowerCase().includes(searchKeyword.toLowerCase())
252
+ }
253
+ })
254
+ })
255
+ },
256
+ async downloadAllCSV() {
257
+ let rows = []
258
+ let page = 1
259
+
260
+ while (this.count > rows.length) {
261
+ const params = {
262
+ ...this.allFilters,
263
+ page: page,
264
+ limit: 500,
265
+ query: undefined
266
+ }
267
+
268
+ const url = `/${this.apiSuffix}?${this.customParams}`
269
+ const response = (await request({ url, params })).data
270
+ rows = [...response.data, ...rows]
271
+ page += 1
272
+ }
273
+
274
+ this.downloadCSV(this.applyCustomColumnFilter(rows))
275
+ },
276
+ }
277
+ }
278
+ </script>
279
+