expressa 2.0.16 → 2.0.18

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 (208) 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 -258
  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/screenshots/users.js/User Management -- Can log in as non-admin, but cannot create users (failed).png +0 -0
  19. package/cypress/support/commands.js +54 -54
  20. package/cypress/support/index.js +20 -20
  21. package/cypress/support/util.js +10 -10
  22. package/cypress.json +4 -4
  23. package/db/cached.js +40 -40
  24. package/db/file.js +112 -112
  25. package/db/memory.js +79 -79
  26. package/db/mongo.js +86 -86
  27. package/db/postgres.js +93 -93
  28. package/doc/authentication.md +38 -38
  29. package/doc/automatic-fields.md +12 -12
  30. package/doc/blogexample.md +16 -16
  31. package/doc/custom-endpoints.md +20 -20
  32. package/doc/database.md +23 -23
  33. package/doc/development.md +33 -33
  34. package/doc/listeners.md +103 -103
  35. package/doc/modules.md +8 -8
  36. package/doc/permissions.md +14 -14
  37. package/doc/relationships.md +65 -65
  38. package/doc/testing.md +47 -47
  39. package/doc/uploading-files.md +53 -53
  40. package/index.js +297 -297
  41. package/listeners.js +65 -65
  42. package/listeners_collection_permissions.js +29 -29
  43. package/listeners_users.js +96 -96
  44. package/listeners_validation.js +43 -43
  45. package/middleware/logging.js +30 -30
  46. package/middleware/permissions.js +41 -41
  47. package/modules/access_keys/access_keys.js +32 -32
  48. package/modules/admin/.babelrc +20 -12
  49. package/modules/admin/.editorconfig +14 -14
  50. package/modules/admin/.eslintignore +5 -5
  51. package/modules/admin/.eslintrc.js +197 -197
  52. package/modules/admin/.postcssrc.js +10 -10
  53. package/modules/admin/.travis.yml +5 -5
  54. package/modules/admin/LICENSE +21 -21
  55. package/modules/admin/README.md +88 -88
  56. package/modules/admin/build/build.js +45 -45
  57. package/modules/admin/build/check-versions.js +64 -64
  58. package/modules/admin/build/utils.js +108 -108
  59. package/modules/admin/build/vue-loader.conf.js +5 -5
  60. package/modules/admin/build/webpack.base.conf.js +112 -108
  61. package/modules/admin/build/webpack.dev.conf.js +95 -95
  62. package/modules/admin/build/webpack.prod.conf.js +112 -171
  63. package/modules/admin/config/dev.env.js +8 -8
  64. package/modules/admin/config/index.js +86 -86
  65. package/modules/admin/config/prod.env.js +5 -5
  66. package/modules/admin/dist/favicon.ico +0 -0
  67. package/modules/admin/dist/index.html +1 -0
  68. package/modules/admin/dist/index.html.gz +0 -0
  69. package/modules/admin/dist/static/css/app.9dd57eea.css +1 -0
  70. package/modules/admin/dist/static/css/app.9dd57eea.css.gz +0 -0
  71. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css +1 -0
  72. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css.gz +0 -0
  73. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css +1 -0
  74. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css.gz +0 -0
  75. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css +1 -0
  76. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css.gz +0 -0
  77. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css +1 -0
  78. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css.gz +0 -0
  79. package/modules/admin/dist/static/css/chunk-7291.13514e45.css +0 -0
  80. package/modules/admin/dist/static/css/chunk-7291.13514e45.css.gz +0 -0
  81. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css +1 -0
  82. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css.gz +0 -0
  83. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css +1 -0
  84. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css.gz +0 -0
  85. package/modules/admin/dist/static/css/chunk-b423.5f239333.css +0 -0
  86. package/modules/admin/dist/static/css/chunk-b423.5f239333.css.gz +0 -0
  87. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css +1 -0
  88. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css.gz +0 -0
  89. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css +1 -0
  90. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css.gz +0 -0
  91. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css +1 -0
  92. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css.gz +0 -0
  93. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css +1 -0
  94. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css.gz +0 -0
  95. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css +14 -0
  96. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css.gz +0 -0
  97. package/modules/admin/dist/static/fonts/element-icons.6f0a763.ttf +0 -0
  98. package/modules/admin/dist/static/img/404.a57b6f3.png +0 -0
  99. package/modules/admin/dist/static/js/app.e9461593.js +1 -0
  100. package/modules/admin/dist/static/js/app.e9461593.js.gz +0 -0
  101. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js +2 -0
  102. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt +13 -0
  103. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt.gz +0 -0
  104. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.gz +0 -0
  105. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js +1 -0
  106. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js.gz +0 -0
  107. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js +1 -0
  108. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js.gz +0 -0
  109. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js +1 -0
  110. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js.gz +0 -0
  111. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js +1 -0
  112. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js.gz +0 -0
  113. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js +1 -0
  114. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js.gz +0 -0
  115. package/modules/admin/dist/static/js/chunk-7291.590524e9.js +1 -0
  116. package/modules/admin/dist/static/js/chunk-7291.590524e9.js.gz +0 -0
  117. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js +1 -0
  118. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js.gz +0 -0
  119. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js +1 -0
  120. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js.gz +0 -0
  121. package/modules/admin/dist/static/js/chunk-b423.387c504c.js +1 -0
  122. package/modules/admin/dist/static/js/chunk-b423.387c504c.js.gz +0 -0
  123. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js +1 -0
  124. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js.gz +0 -0
  125. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js +1 -0
  126. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js.gz +0 -0
  127. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js +1 -0
  128. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js.gz +0 -0
  129. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js +1 -0
  130. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js.gz +0 -0
  131. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js +1 -0
  132. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js.gz +0 -0
  133. package/modules/admin/dist/static/js/chunk-libs.06c38828.js +2 -0
  134. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt +126 -0
  135. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt.gz +0 -0
  136. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.gz +0 -0
  137. package/modules/admin/index.html +16 -16
  138. package/modules/admin/package.json +101 -98
  139. package/modules/admin/src/App.vue +11 -11
  140. package/modules/admin/src/api/login.js +26 -26
  141. package/modules/admin/src/api/table.js +9 -9
  142. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  143. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  144. package/modules/admin/src/components/JSONEditor.vue +180 -180
  145. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  146. package/modules/admin/src/icons/index.js +9 -9
  147. package/modules/admin/src/icons/svgo.yml +22 -22
  148. package/modules/admin/src/main.js +42 -41
  149. package/modules/admin/src/permission.js +49 -49
  150. package/modules/admin/src/router/index.js +200 -200
  151. package/modules/admin/src/store/getters.js +11 -11
  152. package/modules/admin/src/store/index.js +17 -17
  153. package/modules/admin/src/store/modules/app.js +43 -43
  154. package/modules/admin/src/store/modules/user.js +104 -104
  155. package/modules/admin/src/styles/element-ui.scss +29 -29
  156. package/modules/admin/src/styles/index.scss +78 -78
  157. package/modules/admin/src/styles/mixin.scss +27 -27
  158. package/modules/admin/src/styles/sidebar.scss +133 -133
  159. package/modules/admin/src/styles/transition.scss +46 -46
  160. package/modules/admin/src/styles/variables.scss +4 -4
  161. package/modules/admin/src/utils/auth.js +15 -15
  162. package/modules/admin/src/utils/index.js +74 -74
  163. package/modules/admin/src/utils/request.js +48 -48
  164. package/modules/admin/src/utils/validate.js +31 -31
  165. package/modules/admin/src/views/404.vue +235 -235
  166. package/modules/admin/src/views/Dev.vue +33 -33
  167. package/modules/admin/src/views/EditDocument.vue +116 -116
  168. package/modules/admin/src/views/Endpoints.vue +279 -279
  169. package/modules/admin/src/views/Home.vue +84 -84
  170. package/modules/admin/src/views/Install.vue +79 -79
  171. package/modules/admin/src/views/ListDocuments.vue +72 -72
  172. package/modules/admin/src/views/ListDocuments2.vue +462 -462
  173. package/modules/admin/src/views/ManageListeners.vue +67 -67
  174. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  175. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  176. package/modules/admin/src/views/ViewRequest.vue +77 -77
  177. package/modules/admin/src/views/form/index.vue +91 -91
  178. package/modules/admin/src/views/layout/Layout.vue +69 -69
  179. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  180. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  181. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  182. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  183. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  184. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  185. package/modules/admin/src/views/layout/components/index.js +3 -3
  186. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  187. package/modules/admin/src/views/login/index.vue +195 -195
  188. package/modules/admin/src/views/tree/index.vue +77 -77
  189. package/modules/collections/collections.js +39 -39
  190. package/modules/core/core.js +197 -197
  191. package/modules/logging/logging.js +88 -88
  192. package/modules/permissions/permissions.js +106 -106
  193. package/package.json +59 -59
  194. package/scripts/expressa +12 -12
  195. package/scripts/run_cypress_tests.sh +5 -5
  196. package/scripts/run_db_tests.sh +8 -8
  197. package/test/0-install.js +96 -96
  198. package/test/collections.js +431 -431
  199. package/test/collections.querying.js +288 -289
  200. package/test/db.js +258 -258
  201. package/test/db.strings.js +73 -73
  202. package/test/db.updating.js +144 -144
  203. package/test/logging.js +29 -29
  204. package/test/test.js +93 -94
  205. package/test/testserver.js +17 -17
  206. package/test/testutils.js +136 -136
  207. package/test/users.js +425 -425
  208. package/util.js +522 -522
@@ -1,62 +1,62 @@
1
- <template>
2
- <div>
3
- <svg
4
- :class="{'is-active':isActive}"
5
- t="1492500959545"
6
- class="hamburger"
7
- style=""
8
- viewBox="0 0 1024 1024"
9
- version="1.1"
10
- xmlns="http://www.w3.org/2000/svg"
11
- p-id="1691"
12
- xmlns:xlink="http://www.w3.org/1999/xlink"
13
- width="64"
14
- height="64"
15
- @click="toggleClick"
16
- >
17
- <path
18
- d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"
19
- p-id="1692"
20
- />
21
- <path
22
- d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"
23
- p-id="1693"
24
- />
25
- <path
26
- d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"
27
- p-id="1694"
28
- />
29
- </svg>
30
- </div>
31
- </template>
32
-
33
- <script>
34
- export default {
35
- name: 'Hamburger',
36
- props: {
37
- isActive: {
38
- type: Boolean,
39
- default: false
40
- },
41
- toggleClick: {
42
- type: Function,
43
- default: null
44
- }
45
- }
46
- }
47
- </script>
48
-
49
- <style scoped>
50
- .hamburger {
51
- display: inline-block;
52
- cursor: pointer;
53
- width: 20px;
54
- height: 20px;
55
- transform: rotate(90deg);
56
- transition: .38s;
57
- transform-origin: 50% 50%;
58
- }
59
- .hamburger.is-active {
60
- transform: rotate(0deg);
61
- }
62
- </style>
1
+ <template>
2
+ <div>
3
+ <svg
4
+ :class="{'is-active':isActive}"
5
+ t="1492500959545"
6
+ class="hamburger"
7
+ style=""
8
+ viewBox="0 0 1024 1024"
9
+ version="1.1"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ p-id="1691"
12
+ xmlns:xlink="http://www.w3.org/1999/xlink"
13
+ width="64"
14
+ height="64"
15
+ @click="toggleClick"
16
+ >
17
+ <path
18
+ d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"
19
+ p-id="1692"
20
+ />
21
+ <path
22
+ d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"
23
+ p-id="1693"
24
+ />
25
+ <path
26
+ d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"
27
+ p-id="1694"
28
+ />
29
+ </svg>
30
+ </div>
31
+ </template>
32
+
33
+ <script>
34
+ export default {
35
+ name: 'Hamburger',
36
+ props: {
37
+ isActive: {
38
+ type: Boolean,
39
+ default: false
40
+ },
41
+ toggleClick: {
42
+ type: Function,
43
+ default: null
44
+ }
45
+ }
46
+ }
47
+ </script>
48
+
49
+ <style scoped>
50
+ .hamburger {
51
+ display: inline-block;
52
+ cursor: pointer;
53
+ width: 20px;
54
+ height: 20px;
55
+ transform: rotate(90deg);
56
+ transition: .38s;
57
+ transform-origin: 50% 50%;
58
+ }
59
+ .hamburger.is-active {
60
+ transform: rotate(0deg);
61
+ }
62
+ </style>
@@ -1,180 +1,180 @@
1
- <template>
2
- <div>
3
- <div class="jsoneditor-vue" />
4
- </div>
5
- </template>
6
-
7
- <script>
8
- const { JSONEditor } = require('@json-editor/json-editor/dist/jsoneditor')
9
- import 'json-schema-editor'
10
- export default {
11
- props: {
12
- value: {
13
- type: Object,
14
- default: () => {}
15
- },
16
- schema: {
17
- type: Object,
18
- default: () => {}
19
- }
20
- },
21
- data() {
22
- return {
23
- editor: null,
24
- error: false,
25
- json: this.value,
26
- internalChange: false
27
- }
28
- },
29
- watch: {
30
- /* value: {
31
- handler: 'update'
32
- } */
33
- },
34
- mounted() {
35
- this.update()
36
- },
37
- methods: {
38
- update() {
39
- var options = {
40
- schema: this.schema,
41
- startval: this.value,
42
- theme: 'bootstrap4',
43
- iconlib: 'materialicons',
44
- required_by_default: true,
45
- }
46
- if (this.editor) {
47
- this.editor.destroy()
48
- }
49
- this.editor = new JSONEditor(this.$el.querySelector('.jsoneditor-vue'), options)
50
- let first = true
51
- this.editor.on('change', () => {
52
- if (first) {
53
- first = false
54
- return
55
- }
56
- this.$emit('input', this.editor.getValue())
57
- })
58
-
59
- const makeEditJsonTextAreaExpandable = () => {
60
- const textarea = document.querySelector('.je-modal .je-edit-json--textarea')
61
- textarea.classList.remove('je-edit-json--textarea') // INFO: Had to remove this class to remove height and width property
62
- textarea.classList.add('expandable-textarea')
63
- }
64
-
65
- makeEditJsonTextAreaExpandable()
66
- },
67
- onSave() {
68
- this.$emit('json-save', this.json)
69
- }
70
- }
71
- }
72
-
73
- if (JSONEditor) {
74
- JSONEditor.defaults.resolvers.unshift(function(schema) {
75
- if (schema.type === 'object' && schema.format === 'schema') {
76
- return 'schema'
77
- }
78
-
79
- // If no valid editor is returned, the next resolver function will be used
80
- })
81
-
82
- JSONEditor.defaults.editors.schema = class schema extends JSONEditor.AbstractEditor {
83
- setValue(value, initial) {
84
- this.value = value
85
- this.schemaeditor.setValue(value)
86
- this.onChange()
87
- }
88
-
89
- getValue() {
90
- if (typeof this.schemaeditor !== 'undefined') { return this.schemaeditor.getValue() } else { return {} }
91
- }
92
-
93
- register() {
94
- super.register()
95
- if (!this.input) return
96
- this.input.setAttribute('name', this.formname)
97
- }
98
- unregister() {
99
- super.unregister()
100
- if (!this.input) return
101
- this.input.removeAttribute('name')
102
- }
103
- getNumColumns() {
104
- return 12
105
- }
106
- build() {
107
- var self = this
108
- if (!this.options.compact) {
109
- this.label = this.header = this.theme.getFormInputLabel(this.getTitle())
110
- }
111
- if (this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description)
112
- if (this.options.compact) this.container.className += ' compact'
113
-
114
- this.input = document.createElement('div')
115
- this.control = this.theme.getFormControl(this.label, this.input, this.description)
116
-
117
- if (this.schema.readOnly || this.schema.readonly) {
118
- this.always_disabled = true
119
- this.input.disabled = true
120
- }
121
-
122
- this.container.appendChild(this.control)
123
-
124
- this.schemaeditor = new window.JSONSchemaEditor(this.input, {
125
- startval: {}
126
- })
127
- this.schemaeditor.on('change', function() {
128
- self.onChange(true)
129
- })
130
- }
131
- enable() {
132
- if (!this.always_disabled) {
133
- this.input.disabled = false
134
- }
135
-
136
- super.enable()
137
- }
138
- disable() {
139
- this.input.disabled = true
140
- super.disable()
141
- }
142
- destroy() {
143
- if (this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label)
144
- if (this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description)
145
- if (this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input)
146
- super.destroy()
147
- }
148
- }
149
- }
150
-
151
- </script>
152
-
153
- <style>
154
- .expandable-textarea {
155
- display: block;
156
- min-height: 250px;
157
- min-width: 250px;
158
- resize: both !important;
159
- }
160
- .jsoneditor-vue img {
161
- border: 1px solid #ddd;
162
- border-radius: 4px;
163
- padding: 5px;
164
- width: 150px;
165
- }
166
- .jsoneditor-vue img:hover {
167
- box-shadow: 0 0 2px 1px rgba(0, 140, 186, 0.5);
168
- }
169
- .jsoneditor-vue button.btn {
170
- font-size: 14px !important;
171
- padding: 3px;
172
- }
173
- .jsoneditor-vue .form-control-label, label {
174
- font-weight: bold;
175
- }
176
- .jsoneditor-vue input[type="checkbox"] {
177
- margin-right: 5px;
178
- margin-top: 3px;
179
- }
180
- </style>
1
+ <template>
2
+ <div>
3
+ <div class="jsoneditor-vue" />
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ const { JSONEditor } = require('@json-editor/json-editor/dist/jsoneditor')
9
+ import 'json-schema-editor'
10
+ export default {
11
+ props: {
12
+ value: {
13
+ type: Object,
14
+ default: () => {}
15
+ },
16
+ schema: {
17
+ type: Object,
18
+ default: () => {}
19
+ }
20
+ },
21
+ data() {
22
+ return {
23
+ editor: null,
24
+ error: false,
25
+ json: this.value,
26
+ internalChange: false
27
+ }
28
+ },
29
+ watch: {
30
+ /* value: {
31
+ handler: 'update'
32
+ } */
33
+ },
34
+ mounted() {
35
+ this.update()
36
+ },
37
+ methods: {
38
+ update() {
39
+ var options = {
40
+ schema: this.schema,
41
+ startval: this.value,
42
+ theme: 'bootstrap4',
43
+ iconlib: 'materialicons',
44
+ required_by_default: true,
45
+ }
46
+ if (this.editor) {
47
+ this.editor.destroy()
48
+ }
49
+ this.editor = new JSONEditor(this.$el.querySelector('.jsoneditor-vue'), options)
50
+ let first = true
51
+ this.editor.on('change', () => {
52
+ if (first) {
53
+ first = false
54
+ return
55
+ }
56
+ this.$emit('input', this.editor.getValue())
57
+ })
58
+
59
+ const makeEditJsonTextAreaExpandable = () => {
60
+ const textarea = document.querySelector('.je-modal .je-edit-json--textarea')
61
+ textarea.classList.remove('je-edit-json--textarea') // INFO: Had to remove this class to remove height and width property
62
+ textarea.classList.add('expandable-textarea')
63
+ }
64
+
65
+ makeEditJsonTextAreaExpandable()
66
+ },
67
+ onSave() {
68
+ this.$emit('json-save', this.json)
69
+ }
70
+ }
71
+ }
72
+
73
+ if (JSONEditor) {
74
+ JSONEditor.defaults.resolvers.unshift(function(schema) {
75
+ if (schema.type === 'object' && schema.format === 'schema') {
76
+ return 'schema'
77
+ }
78
+
79
+ // If no valid editor is returned, the next resolver function will be used
80
+ })
81
+
82
+ JSONEditor.defaults.editors.schema = class schema extends JSONEditor.AbstractEditor {
83
+ setValue(value, initial) {
84
+ this.value = value
85
+ this.schemaeditor.setValue(value)
86
+ this.onChange()
87
+ }
88
+
89
+ getValue() {
90
+ if (typeof this.schemaeditor !== 'undefined') { return this.schemaeditor.getValue() } else { return {} }
91
+ }
92
+
93
+ register() {
94
+ super.register()
95
+ if (!this.input) return
96
+ this.input.setAttribute('name', this.formname)
97
+ }
98
+ unregister() {
99
+ super.unregister()
100
+ if (!this.input) return
101
+ this.input.removeAttribute('name')
102
+ }
103
+ getNumColumns() {
104
+ return 12
105
+ }
106
+ build() {
107
+ var self = this
108
+ if (!this.options.compact) {
109
+ this.label = this.header = this.theme.getFormInputLabel(this.getTitle())
110
+ }
111
+ if (this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description)
112
+ if (this.options.compact) this.container.className += ' compact'
113
+
114
+ this.input = document.createElement('div')
115
+ this.control = this.theme.getFormControl(this.label, this.input, this.description)
116
+
117
+ if (this.schema.readOnly || this.schema.readonly) {
118
+ this.always_disabled = true
119
+ this.input.disabled = true
120
+ }
121
+
122
+ this.container.appendChild(this.control)
123
+
124
+ this.schemaeditor = new window.JSONSchemaEditor(this.input, {
125
+ startval: {}
126
+ })
127
+ this.schemaeditor.on('change', function() {
128
+ self.onChange(true)
129
+ })
130
+ }
131
+ enable() {
132
+ if (!this.always_disabled) {
133
+ this.input.disabled = false
134
+ }
135
+
136
+ super.enable()
137
+ }
138
+ disable() {
139
+ this.input.disabled = true
140
+ super.disable()
141
+ }
142
+ destroy() {
143
+ if (this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label)
144
+ if (this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description)
145
+ if (this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input)
146
+ super.destroy()
147
+ }
148
+ }
149
+ }
150
+
151
+ </script>
152
+
153
+ <style>
154
+ .expandable-textarea {
155
+ display: block;
156
+ min-height: 250px;
157
+ min-width: 250px;
158
+ resize: both !important;
159
+ }
160
+ .jsoneditor-vue img {
161
+ border: 1px solid #ddd;
162
+ border-radius: 4px;
163
+ padding: 5px;
164
+ width: 150px;
165
+ }
166
+ .jsoneditor-vue img:hover {
167
+ box-shadow: 0 0 2px 1px rgba(0, 140, 186, 0.5);
168
+ }
169
+ .jsoneditor-vue button.btn {
170
+ font-size: 14px !important;
171
+ padding: 3px;
172
+ }
173
+ .jsoneditor-vue .form-control-label, label {
174
+ font-weight: bold;
175
+ }
176
+ .jsoneditor-vue input[type="checkbox"] {
177
+ margin-right: 5px;
178
+ margin-top: 3px;
179
+ }
180
+ </style>
@@ -1,43 +1,43 @@
1
- <template>
2
- <svg :class="svgClass" aria-hidden="true">
3
- <use :xlink:href="iconName" />
4
- </svg>
5
- </template>
6
-
7
- <script>
8
- export default {
9
- name: 'SvgIcon',
10
- props: {
11
- iconClass: {
12
- type: String,
13
- required: true
14
- },
15
- className: {
16
- type: String,
17
- default: ''
18
- }
19
- },
20
- computed: {
21
- iconName() {
22
- return `#icon-${this.iconClass}`
23
- },
24
- svgClass() {
25
- if (this.className) {
26
- return 'svg-icon ' + this.className
27
- } else {
28
- return 'svg-icon'
29
- }
30
- }
31
- }
32
- }
33
- </script>
34
-
35
- <style scoped>
36
- .svg-icon {
37
- width: 1em;
38
- height: 1em;
39
- vertical-align: -0.15em;
40
- fill: currentColor;
41
- overflow: hidden;
42
- }
43
- </style>
1
+ <template>
2
+ <svg :class="svgClass" aria-hidden="true">
3
+ <use :xlink:href="iconName" />
4
+ </svg>
5
+ </template>
6
+
7
+ <script>
8
+ export default {
9
+ name: 'SvgIcon',
10
+ props: {
11
+ iconClass: {
12
+ type: String,
13
+ required: true
14
+ },
15
+ className: {
16
+ type: String,
17
+ default: ''
18
+ }
19
+ },
20
+ computed: {
21
+ iconName() {
22
+ return `#icon-${this.iconClass}`
23
+ },
24
+ svgClass() {
25
+ if (this.className) {
26
+ return 'svg-icon ' + this.className
27
+ } else {
28
+ return 'svg-icon'
29
+ }
30
+ }
31
+ }
32
+ }
33
+ </script>
34
+
35
+ <style scoped>
36
+ .svg-icon {
37
+ width: 1em;
38
+ height: 1em;
39
+ vertical-align: -0.15em;
40
+ fill: currentColor;
41
+ overflow: hidden;
42
+ }
43
+ </style>
@@ -1,9 +1,9 @@
1
- import Vue from 'vue'
2
- import SvgIcon from '@/components/SvgIcon' // svg组件
3
-
4
- // register globally
5
- Vue.component('svg-icon', SvgIcon)
6
-
7
- const requireAll = requireContext => requireContext.keys().map(requireContext)
8
- const req = require.context('./svg', false, /\.svg$/)
9
- requireAll(req)
1
+ import Vue from 'vue'
2
+ import SvgIcon from '@/components/SvgIcon' // svg组件
3
+
4
+ // register globally
5
+ Vue.component('svg-icon', SvgIcon)
6
+
7
+ const requireAll = requireContext => requireContext.keys().map(requireContext)
8
+ const req = require.context('./svg', false, /\.svg$/)
9
+ requireAll(req)
@@ -1,22 +1,22 @@
1
- # replace default config
2
-
3
- # multipass: true
4
- # full: true
5
-
6
- plugins:
7
-
8
- # - name
9
- #
10
- # or:
11
- # - name: false
12
- # - name: true
13
- #
14
- # or:
15
- # - name:
16
- # param1: 1
17
- # param2: 2
18
-
19
- - removeAttrs:
20
- attrs:
21
- - 'fill'
22
- - 'fill-rule'
1
+ # replace default config
2
+
3
+ # multipass: true
4
+ # full: true
5
+
6
+ plugins:
7
+
8
+ # - name
9
+ #
10
+ # or:
11
+ # - name: false
12
+ # - name: true
13
+ #
14
+ # or:
15
+ # - name:
16
+ # param1: 1
17
+ # param2: 2
18
+
19
+ - removeAttrs:
20
+ attrs:
21
+ - 'fill'
22
+ - 'fill-rule'