expressa 2.1.1 → 2.1.2

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 (202) 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/jwt.js +31 -31
  6. package/controllers/collections.js +299 -260
  7. package/controllers/install.js +105 -105
  8. package/controllers/status.js +43 -43
  9. package/controllers/users.js +52 -52
  10. package/cypress/fixtures/example.json +4 -4
  11. package/cypress/integration/0_install_spec.js +8 -8
  12. package/cypress/integration/custom_collections.js +30 -30
  13. package/cypress/integration/home.js +9 -9
  14. package/cypress/integration/settings.js +34 -34
  15. package/cypress/integration/users.js +61 -61
  16. package/cypress/plugins/index.js +17 -17
  17. package/cypress/support/commands.js +69 -69
  18. package/cypress/support/index.js +20 -20
  19. package/cypress/support/util.js +10 -10
  20. package/cypress.config.js +18 -18
  21. package/cypress.json +4 -4
  22. package/db/cached.js +44 -44
  23. package/db/file.js +131 -131
  24. package/db/memory.js +92 -92
  25. package/db/mongo.js +93 -93
  26. package/db/postgres.js +100 -100
  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/listeners.js +65 -65
  40. package/listeners_collection_permissions.js +29 -29
  41. package/listeners_users.js +96 -96
  42. package/listeners_validation.js +43 -43
  43. package/middleware/logging.js +30 -30
  44. package/middleware/permissions.js +41 -41
  45. package/modules/access_keys/access_keys.js +32 -32
  46. package/modules/admin/.babelrc +8 -8
  47. package/modules/admin/.editorconfig +14 -14
  48. package/modules/admin/.eslintignore +5 -5
  49. package/modules/admin/.eslintrc.js +197 -197
  50. package/modules/admin/.postcssrc.js +10 -10
  51. package/modules/admin/.travis.yml +5 -5
  52. package/modules/admin/LICENSE +21 -21
  53. package/modules/admin/README.md +88 -88
  54. package/modules/admin/build/build.js +46 -46
  55. package/modules/admin/build/check-versions.js +64 -64
  56. package/modules/admin/build/utils.js +109 -109
  57. package/modules/admin/build/vue-loader.conf.js +5 -5
  58. package/modules/admin/build/webpack.base.conf.js +112 -112
  59. package/modules/admin/build/webpack.dev.conf.js +95 -95
  60. package/modules/admin/build/webpack.prod.conf.js +112 -112
  61. package/modules/admin/config/dev.env.js +8 -8
  62. package/modules/admin/config/index.js +86 -86
  63. package/modules/admin/config/prod.env.js +5 -5
  64. package/modules/admin/dist/css/{430.e83d8cfe.css → 430.8c9b0482.css} +4 -4
  65. package/modules/admin/dist/css/430.8c9b0482.css.gz +0 -0
  66. package/modules/admin/dist/css/{197.e66ce8d8.css → 566.7a90435e.css} +4 -4
  67. package/modules/admin/dist/css/566.7a90435e.css.gz +0 -0
  68. package/modules/admin/dist/css/569.db9a10c2.css.gz +0 -0
  69. package/modules/admin/dist/css/572.513a323e.css.gz +0 -0
  70. package/modules/admin/dist/css/{566.e66ce8d8.css → 622.7a90435e.css} +4 -4
  71. package/modules/admin/dist/css/622.7a90435e.css.gz +0 -0
  72. package/modules/admin/dist/css/651.e946bda7.css.gz +0 -0
  73. package/modules/admin/dist/css/{750.4086915d.css → 750.79723422.css} +1 -1
  74. package/modules/admin/dist/css/750.79723422.css.gz +0 -0
  75. package/modules/admin/dist/css/{451.c6646d20.css.gz → 798.c6646d20.css.gz} +0 -0
  76. package/modules/admin/dist/css/950.1fd9d57c.css.gz +0 -0
  77. package/modules/admin/dist/css/{app.1c3232a3.css → app.c25a6c6c.css} +24 -24
  78. package/modules/admin/dist/css/app.c25a6c6c.css.gz +0 -0
  79. package/modules/admin/dist/index.html +1 -1
  80. package/modules/admin/dist/static/js/311.03ef5ed9.js +1 -0
  81. package/modules/admin/dist/static/js/311.03ef5ed9.js.gz +0 -0
  82. package/modules/admin/dist/static/js/{430.86219146.js.gz → 430.ddfa4b9e.js.gz} +0 -0
  83. package/modules/admin/dist/static/js/{460.b54cbaab.js.gz → 460.770a630c.js.gz} +0 -0
  84. package/modules/admin/dist/static/js/{550.938e8b79.js → 550.e9a3a306.js} +1 -1
  85. package/modules/admin/dist/static/js/550.e9a3a306.js.gz +0 -0
  86. package/modules/admin/dist/static/js/569.711f16a3.js +1 -0
  87. package/modules/admin/dist/static/js/569.711f16a3.js.gz +0 -0
  88. package/modules/admin/dist/static/js/572.5c8cfea9.js +1 -0
  89. package/modules/admin/dist/static/js/572.5c8cfea9.js.gz +0 -0
  90. package/modules/admin/dist/static/js/603.bbe5ed23.js.gz +0 -0
  91. package/modules/admin/dist/static/js/622.9f06567e.js +1 -0
  92. package/modules/admin/dist/static/js/622.9f06567e.js.gz +0 -0
  93. package/modules/admin/dist/static/js/{651.29b10271.js.gz → 651.86d741f0.js.gz} +0 -0
  94. package/modules/admin/dist/static/js/{653.9b512bd1.js.gz → 653.7a309059.js.gz} +0 -0
  95. package/modules/admin/dist/static/js/{750.0b1c247a.js.gz → 750.10551ec8.js.gz} +0 -0
  96. package/modules/admin/dist/static/js/798.93ec90bc.js +1 -0
  97. package/modules/admin/dist/static/js/798.93ec90bc.js.gz +0 -0
  98. package/modules/admin/dist/static/js/950.d7f72b66.js.gz +0 -0
  99. package/modules/admin/dist/static/js/app.23870b61.js +2 -0
  100. package/modules/admin/dist/static/js/{app.4f835176.js.LICENSE.txt.gz → app.23870b61.js.LICENSE.txt.gz} +0 -0
  101. package/modules/admin/dist/static/js/app.23870b61.js.gz +0 -0
  102. package/modules/admin/index.html +16 -16
  103. package/modules/admin/package.json +101 -101
  104. package/modules/admin/src/App.vue +11 -11
  105. package/modules/admin/src/api/login.js +26 -26
  106. package/modules/admin/src/api/table.js +9 -9
  107. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  108. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  109. package/modules/admin/src/components/JSONEditor.vue +206 -206
  110. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  111. package/modules/admin/src/icons/index.js +9 -9
  112. package/modules/admin/src/icons/svgo.yml +22 -22
  113. package/modules/admin/src/main.js +42 -42
  114. package/modules/admin/src/permission.js +49 -49
  115. package/modules/admin/src/router/index.js +200 -200
  116. package/modules/admin/src/store/getters.js +11 -11
  117. package/modules/admin/src/store/index.js +17 -17
  118. package/modules/admin/src/store/modules/app.js +43 -43
  119. package/modules/admin/src/store/modules/user.js +104 -104
  120. package/modules/admin/src/styles/element-ui.scss +29 -29
  121. package/modules/admin/src/styles/index.scss +78 -78
  122. package/modules/admin/src/styles/mixin.scss +27 -27
  123. package/modules/admin/src/styles/sidebar.scss +133 -133
  124. package/modules/admin/src/styles/transition.scss +46 -46
  125. package/modules/admin/src/styles/variables.scss +4 -4
  126. package/modules/admin/src/utils/auth.js +15 -15
  127. package/modules/admin/src/utils/index.js +74 -74
  128. package/modules/admin/src/utils/request.js +47 -47
  129. package/modules/admin/src/utils/validate.js +31 -31
  130. package/modules/admin/src/views/404.vue +235 -235
  131. package/modules/admin/src/views/Dev.vue +33 -33
  132. package/modules/admin/src/views/EditDocument.vue +121 -121
  133. package/modules/admin/src/views/Endpoints.vue +279 -279
  134. package/modules/admin/src/views/Home.vue +84 -84
  135. package/modules/admin/src/views/Install.vue +79 -79
  136. package/modules/admin/src/views/ListDocuments.vue +72 -72
  137. package/modules/admin/src/views/ListDocuments2.vue +467 -467
  138. package/modules/admin/src/views/ManageListeners.vue +67 -67
  139. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  140. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  141. package/modules/admin/src/views/ViewRequest.vue +77 -77
  142. package/modules/admin/src/views/form/index.vue +91 -91
  143. package/modules/admin/src/views/layout/Layout.vue +69 -69
  144. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  145. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  146. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  147. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  148. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  149. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  150. package/modules/admin/src/views/layout/components/index.js +3 -3
  151. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  152. package/modules/admin/src/views/login/index.vue +195 -195
  153. package/modules/admin/src/views/tree/index.vue +77 -77
  154. package/modules/collections/collections.js +45 -39
  155. package/modules/core/core.js +197 -197
  156. package/modules/logging/logging.js +88 -88
  157. package/modules/permissions/permissions.js +106 -106
  158. package/package.json +59 -59
  159. package/scripts/expressa +12 -12
  160. package/scripts/run_cypress_tests.sh +35 -35
  161. package/scripts/run_db_tests.sh +8 -8
  162. package/test/0-install.js +96 -96
  163. package/test/collections.js +431 -431
  164. package/test/collections.querying.js +372 -288
  165. package/test/db.js +258 -258
  166. package/test/db.strings.js +73 -73
  167. package/test/db.updating.js +186 -186
  168. package/test/logging.js +29 -29
  169. package/test/test.js +93 -93
  170. package/test/testserver.js +30 -30
  171. package/test/testutils.js +136 -136
  172. package/test/users.js +425 -425
  173. package/util.js +522 -522
  174. package/modules/admin/dist/css/197.e66ce8d8.css.gz +0 -0
  175. package/modules/admin/dist/css/430.e83d8cfe.css.gz +0 -0
  176. package/modules/admin/dist/css/566.e66ce8d8.css.gz +0 -0
  177. package/modules/admin/dist/css/750.4086915d.css.gz +0 -0
  178. package/modules/admin/dist/css/app.1c3232a3.css.gz +0 -0
  179. package/modules/admin/dist/static/js/197.f9e1ba84.js +0 -1
  180. package/modules/admin/dist/static/js/197.f9e1ba84.js.gz +0 -0
  181. package/modules/admin/dist/static/js/311.ca6d5976.js +0 -1
  182. package/modules/admin/dist/static/js/311.ca6d5976.js.gz +0 -0
  183. package/modules/admin/dist/static/js/451.5e934bb6.js +0 -1
  184. package/modules/admin/dist/static/js/451.5e934bb6.js.gz +0 -0
  185. package/modules/admin/dist/static/js/550.938e8b79.js.gz +0 -0
  186. package/modules/admin/dist/static/js/569.128a8e27.js +0 -1
  187. package/modules/admin/dist/static/js/569.128a8e27.js.gz +0 -0
  188. package/modules/admin/dist/static/js/572.b3b13b2d.js +0 -1
  189. package/modules/admin/dist/static/js/572.b3b13b2d.js.gz +0 -0
  190. package/modules/admin/dist/static/js/603.dc05e481.js.gz +0 -0
  191. package/modules/admin/dist/static/js/950.fe12a66b.js.gz +0 -0
  192. package/modules/admin/dist/static/js/app.4f835176.js +0 -2
  193. package/modules/admin/dist/static/js/app.4f835176.js.gz +0 -0
  194. /package/modules/admin/dist/css/{451.c6646d20.css → 798.c6646d20.css} +0 -0
  195. /package/modules/admin/dist/static/js/{430.86219146.js → 430.ddfa4b9e.js} +0 -0
  196. /package/modules/admin/dist/static/js/{460.b54cbaab.js → 460.770a630c.js} +0 -0
  197. /package/modules/admin/dist/static/js/{603.dc05e481.js → 603.bbe5ed23.js} +0 -0
  198. /package/modules/admin/dist/static/js/{651.29b10271.js → 651.86d741f0.js} +0 -0
  199. /package/modules/admin/dist/static/js/{653.9b512bd1.js → 653.7a309059.js} +0 -0
  200. /package/modules/admin/dist/static/js/{750.0b1c247a.js → 750.10551ec8.js} +0 -0
  201. /package/modules/admin/dist/static/js/{950.fe12a66b.js → 950.d7f72b66.js} +0 -0
  202. /package/modules/admin/dist/static/js/{app.4f835176.js.LICENSE.txt → app.23870b61.js.LICENSE.txt} +0 -0
@@ -1,195 +1,195 @@
1
- <template>
2
- <div class="login-container">
3
- <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
4
- <h3 class="title">
5
- Expressa Admin
6
- </h3>
7
- <el-form-item prop="username">
8
- <span class="svg-container">
9
- <svg-icon icon-class="user" />
10
- </span>
11
- <el-input v-model="loginForm.username" name="username" type="text" auto-complete="on" placeholder="username" />
12
- </el-form-item>
13
- <el-form-item prop="password">
14
- <span class="svg-container">
15
- <svg-icon icon-class="password" />
16
- </span>
17
- <el-input
18
- v-model="loginForm.password"
19
- :type="pwdType"
20
- name="password"
21
- auto-complete="on"
22
- placeholder="password"
23
- @keyup.enter.native="handleLogin"
24
- />
25
- <span class="show-pwd" @click="showPwd">
26
- <svg-icon icon-class="eye" />
27
- </span>
28
- </el-form-item>
29
- <el-form-item>
30
- <el-button :loading="loading" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
31
- Sign in
32
- </el-button>
33
- </el-form-item>
34
- </el-form>
35
- </div>
36
- </template>
37
-
38
- <script>
39
- import { isvalidUsername } from '@/utils/validate'
40
-
41
- export default {
42
- name: 'Login',
43
- data() {
44
- const validateUsername = (rule, value, callback) => {
45
- if (!isvalidUsername(value)) {
46
- callback(new Error('bad username'))
47
- } else {
48
- callback()
49
- }
50
- }
51
- const validatePass = (rule, value, callback) => {
52
- if (value.length < 2) {
53
- callback(new Error('bad password'))
54
- } else {
55
- callback()
56
- }
57
- }
58
- return {
59
- loginForm: {
60
- username: '',
61
- password: ''
62
- },
63
- loginRules: {
64
- username: [{ required: true, trigger: 'blur', validator: validateUsername }],
65
- password: [{ required: true, trigger: 'blur', validator: validatePass }]
66
- },
67
- loading: false,
68
- pwdType: 'password',
69
- redirect: undefined
70
- }
71
- },
72
- watch: {
73
- $route: {
74
- handler: function(route) {
75
- this.redirect = route.query && route.query.redirect
76
- },
77
- immediate: true
78
- }
79
- },
80
- methods: {
81
- showPwd() {
82
- if (this.pwdType === 'password') {
83
- this.pwdType = ''
84
- } else {
85
- this.pwdType = 'password'
86
- }
87
- },
88
- handleLogin() {
89
- this.$refs.loginForm.validate(valid => {
90
- if (valid) {
91
- this.loading = true
92
- this.$store.dispatch('Login', this.loginForm).then(() => {
93
- this.loading = false
94
- this.$router.push({ path: this.redirect || '/' })
95
- }).catch(() => {
96
- this.loading = false
97
- })
98
- } else {
99
- console.log('error submit!!')
100
- return false
101
- }
102
- })
103
- }
104
- }
105
- }
106
- </script>
107
-
108
- <style rel="stylesheet/scss" lang="scss">
109
- $bg:#2d3a4b;
110
- $light_gray:#eee;
111
-
112
- /* reset element-ui css */
113
- .login-container {
114
- .el-input {
115
- display: inline-block;
116
- height: 47px;
117
- width: 85%;
118
- input {
119
- background: transparent;
120
- border: 0px;
121
- -webkit-appearance: none;
122
- border-radius: 0px;
123
- padding: 12px 5px 12px 15px;
124
- color: $light_gray;
125
- height: 47px;
126
- &:-webkit-autofill {
127
- -webkit-box-shadow: 0 0 0px 1000px $bg inset !important;
128
- -webkit-text-fill-color: #fff !important;
129
- }
130
- }
131
- }
132
- .el-form-item {
133
- border: 1px solid rgba(255, 255, 255, 0.1);
134
- background: rgba(0, 0, 0, 0.1);
135
- border-radius: 5px;
136
- color: #454545;
137
- }
138
- }
139
-
140
- </style>
141
-
142
- <style rel="stylesheet/scss" lang="scss" scoped>
143
- $bg:#2d3a4b;
144
- $dark_gray:#889aa4;
145
- $light_gray:#eee;
146
- .login-container {
147
- position: fixed;
148
- height: 100%;
149
- width: 100%;
150
- background-color: $bg;
151
- .login-form {
152
- position: absolute;
153
- left: 0;
154
- right: 0;
155
- width: 520px;
156
- max-width: 100%;
157
- padding: 35px 35px 15px 35px;
158
- margin: 120px auto;
159
- }
160
- .tips {
161
- font-size: 14px;
162
- color: #fff;
163
- margin-bottom: 10px;
164
- span {
165
- &:first-of-type {
166
- margin-right: 16px;
167
- }
168
- }
169
- }
170
- .svg-container {
171
- padding: 6px 5px 6px 15px;
172
- color: $dark_gray;
173
- vertical-align: middle;
174
- width: 30px;
175
- display: inline-block;
176
- }
177
- .title {
178
- font-size: 26px;
179
- font-weight: 400;
180
- color: $light_gray;
181
- margin: 0px auto 40px auto;
182
- text-align: center;
183
- font-weight: bold;
184
- }
185
- .show-pwd {
186
- position: absolute;
187
- right: 10px;
188
- top: 7px;
189
- font-size: 16px;
190
- color: $dark_gray;
191
- cursor: pointer;
192
- user-select: none;
193
- }
194
- }
195
- </style>
1
+ <template>
2
+ <div class="login-container">
3
+ <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
4
+ <h3 class="title">
5
+ Expressa Admin
6
+ </h3>
7
+ <el-form-item prop="username">
8
+ <span class="svg-container">
9
+ <svg-icon icon-class="user" />
10
+ </span>
11
+ <el-input v-model="loginForm.username" name="username" type="text" auto-complete="on" placeholder="username" />
12
+ </el-form-item>
13
+ <el-form-item prop="password">
14
+ <span class="svg-container">
15
+ <svg-icon icon-class="password" />
16
+ </span>
17
+ <el-input
18
+ v-model="loginForm.password"
19
+ :type="pwdType"
20
+ name="password"
21
+ auto-complete="on"
22
+ placeholder="password"
23
+ @keyup.enter.native="handleLogin"
24
+ />
25
+ <span class="show-pwd" @click="showPwd">
26
+ <svg-icon icon-class="eye" />
27
+ </span>
28
+ </el-form-item>
29
+ <el-form-item>
30
+ <el-button :loading="loading" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
31
+ Sign in
32
+ </el-button>
33
+ </el-form-item>
34
+ </el-form>
35
+ </div>
36
+ </template>
37
+
38
+ <script>
39
+ import { isvalidUsername } from '@/utils/validate'
40
+
41
+ export default {
42
+ name: 'Login',
43
+ data() {
44
+ const validateUsername = (rule, value, callback) => {
45
+ if (!isvalidUsername(value)) {
46
+ callback(new Error('bad username'))
47
+ } else {
48
+ callback()
49
+ }
50
+ }
51
+ const validatePass = (rule, value, callback) => {
52
+ if (value.length < 2) {
53
+ callback(new Error('bad password'))
54
+ } else {
55
+ callback()
56
+ }
57
+ }
58
+ return {
59
+ loginForm: {
60
+ username: '',
61
+ password: ''
62
+ },
63
+ loginRules: {
64
+ username: [{ required: true, trigger: 'blur', validator: validateUsername }],
65
+ password: [{ required: true, trigger: 'blur', validator: validatePass }]
66
+ },
67
+ loading: false,
68
+ pwdType: 'password',
69
+ redirect: undefined
70
+ }
71
+ },
72
+ watch: {
73
+ $route: {
74
+ handler: function(route) {
75
+ this.redirect = route.query && route.query.redirect
76
+ },
77
+ immediate: true
78
+ }
79
+ },
80
+ methods: {
81
+ showPwd() {
82
+ if (this.pwdType === 'password') {
83
+ this.pwdType = ''
84
+ } else {
85
+ this.pwdType = 'password'
86
+ }
87
+ },
88
+ handleLogin() {
89
+ this.$refs.loginForm.validate(valid => {
90
+ if (valid) {
91
+ this.loading = true
92
+ this.$store.dispatch('Login', this.loginForm).then(() => {
93
+ this.loading = false
94
+ this.$router.push({ path: this.redirect || '/' })
95
+ }).catch(() => {
96
+ this.loading = false
97
+ })
98
+ } else {
99
+ console.log('error submit!!')
100
+ return false
101
+ }
102
+ })
103
+ }
104
+ }
105
+ }
106
+ </script>
107
+
108
+ <style rel="stylesheet/scss" lang="scss">
109
+ $bg:#2d3a4b;
110
+ $light_gray:#eee;
111
+
112
+ /* reset element-ui css */
113
+ .login-container {
114
+ .el-input {
115
+ display: inline-block;
116
+ height: 47px;
117
+ width: 85%;
118
+ input {
119
+ background: transparent;
120
+ border: 0px;
121
+ -webkit-appearance: none;
122
+ border-radius: 0px;
123
+ padding: 12px 5px 12px 15px;
124
+ color: $light_gray;
125
+ height: 47px;
126
+ &:-webkit-autofill {
127
+ -webkit-box-shadow: 0 0 0px 1000px $bg inset !important;
128
+ -webkit-text-fill-color: #fff !important;
129
+ }
130
+ }
131
+ }
132
+ .el-form-item {
133
+ border: 1px solid rgba(255, 255, 255, 0.1);
134
+ background: rgba(0, 0, 0, 0.1);
135
+ border-radius: 5px;
136
+ color: #454545;
137
+ }
138
+ }
139
+
140
+ </style>
141
+
142
+ <style rel="stylesheet/scss" lang="scss" scoped>
143
+ $bg:#2d3a4b;
144
+ $dark_gray:#889aa4;
145
+ $light_gray:#eee;
146
+ .login-container {
147
+ position: fixed;
148
+ height: 100%;
149
+ width: 100%;
150
+ background-color: $bg;
151
+ .login-form {
152
+ position: absolute;
153
+ left: 0;
154
+ right: 0;
155
+ width: 520px;
156
+ max-width: 100%;
157
+ padding: 35px 35px 15px 35px;
158
+ margin: 120px auto;
159
+ }
160
+ .tips {
161
+ font-size: 14px;
162
+ color: #fff;
163
+ margin-bottom: 10px;
164
+ span {
165
+ &:first-of-type {
166
+ margin-right: 16px;
167
+ }
168
+ }
169
+ }
170
+ .svg-container {
171
+ padding: 6px 5px 6px 15px;
172
+ color: $dark_gray;
173
+ vertical-align: middle;
174
+ width: 30px;
175
+ display: inline-block;
176
+ }
177
+ .title {
178
+ font-size: 26px;
179
+ font-weight: 400;
180
+ color: $light_gray;
181
+ margin: 0px auto 40px auto;
182
+ text-align: center;
183
+ font-weight: bold;
184
+ }
185
+ .show-pwd {
186
+ position: absolute;
187
+ right: 10px;
188
+ top: 7px;
189
+ font-size: 16px;
190
+ color: $dark_gray;
191
+ cursor: pointer;
192
+ user-select: none;
193
+ }
194
+ }
195
+ </style>
@@ -1,77 +1,77 @@
1
- <template>
2
- <div class="app-container">
3
- <el-input v-model="filterText" placeholder="Filter keyword" style="margin-bottom:30px;" />
4
-
5
- <el-tree
6
- ref="tree2"
7
- :data="data2"
8
- :props="defaultProps"
9
- :filter-node-method="filterNode"
10
- class="filter-tree"
11
- default-expand-all
12
- />
13
- </div>
14
- </template>
15
-
16
- <script>
17
- export default {
18
-
19
- data() {
20
- return {
21
- filterText: '',
22
- data2: [{
23
- id: 1,
24
- label: 'Level one 1',
25
- children: [{
26
- id: 4,
27
- label: 'Level two 1-1',
28
- children: [{
29
- id: 9,
30
- label: 'Level three 1-1-1'
31
- }, {
32
- id: 10,
33
- label: 'Level three 1-1-2'
34
- }]
35
- }]
36
- }, {
37
- id: 2,
38
- label: 'Level one 2',
39
- children: [{
40
- id: 5,
41
- label: 'Level two 2-1'
42
- }, {
43
- id: 6,
44
- label: 'Level two 2-2'
45
- }]
46
- }, {
47
- id: 3,
48
- label: 'Level one 3',
49
- children: [{
50
- id: 7,
51
- label: 'Level two 3-1'
52
- }, {
53
- id: 8,
54
- label: 'Level two 3-2'
55
- }]
56
- }],
57
- defaultProps: {
58
- children: 'children',
59
- label: 'label'
60
- }
61
- }
62
- },
63
- watch: {
64
- filterText(val) {
65
- this.$refs.tree2.filter(val)
66
- }
67
- },
68
-
69
- methods: {
70
- filterNode(value, data) {
71
- if (!value) return true
72
- return data.label.indexOf(value) !== -1
73
- }
74
- }
75
- }
76
- </script>
77
-
1
+ <template>
2
+ <div class="app-container">
3
+ <el-input v-model="filterText" placeholder="Filter keyword" style="margin-bottom:30px;" />
4
+
5
+ <el-tree
6
+ ref="tree2"
7
+ :data="data2"
8
+ :props="defaultProps"
9
+ :filter-node-method="filterNode"
10
+ class="filter-tree"
11
+ default-expand-all
12
+ />
13
+ </div>
14
+ </template>
15
+
16
+ <script>
17
+ export default {
18
+
19
+ data() {
20
+ return {
21
+ filterText: '',
22
+ data2: [{
23
+ id: 1,
24
+ label: 'Level one 1',
25
+ children: [{
26
+ id: 4,
27
+ label: 'Level two 1-1',
28
+ children: [{
29
+ id: 9,
30
+ label: 'Level three 1-1-1'
31
+ }, {
32
+ id: 10,
33
+ label: 'Level three 1-1-2'
34
+ }]
35
+ }]
36
+ }, {
37
+ id: 2,
38
+ label: 'Level one 2',
39
+ children: [{
40
+ id: 5,
41
+ label: 'Level two 2-1'
42
+ }, {
43
+ id: 6,
44
+ label: 'Level two 2-2'
45
+ }]
46
+ }, {
47
+ id: 3,
48
+ label: 'Level one 3',
49
+ children: [{
50
+ id: 7,
51
+ label: 'Level two 3-1'
52
+ }, {
53
+ id: 8,
54
+ label: 'Level two 3-2'
55
+ }]
56
+ }],
57
+ defaultProps: {
58
+ children: 'children',
59
+ label: 'label'
60
+ }
61
+ }
62
+ },
63
+ watch: {
64
+ filterText(val) {
65
+ this.$refs.tree2.filter(val)
66
+ }
67
+ },
68
+
69
+ methods: {
70
+ filterNode(value, data) {
71
+ if (!value) return true
72
+ return data.label.indexOf(value) !== -1
73
+ }
74
+ }
75
+ }
76
+ </script>
77
+
@@ -1,39 +1,45 @@
1
- function getCollectionPermissions (name, hasOwner) {
2
- let permissions = exports.collectionPermissions(name)
3
- if (hasOwner) {
4
- permissions = permissions.concat(exports.collectionOwnerPermissions(name))
5
- }
6
- return permissions
7
- }
8
-
9
- exports.collectionPermissions = function (name) {
10
- return ['create', 'view', 'edit', 'modify owner', 'delete'].map((action) => `${name}: ${action}`)
11
- }
12
-
13
- exports.collectionOwnerPermissions = function (name) {
14
- return ['view', 'edit', 'delete'].map((action) => `${name}: ${action} own`)
15
- }
16
-
17
- exports.permissions = async function (app) {
18
- const collections = (await app.db.collection.all()).map((collection) => collection._id)
19
- // flatten the permissions into a single list
20
- const permissions = [].concat(...collections.map(getCollectionPermissions))
21
- return permissions
22
- }
23
-
24
- exports.settingSchema = {
25
- collection_db_type: {
26
- type: 'string',
27
- description: 'The storage method for the collection of collections.'
28
- },
29
- settings_db_type: {
30
- type: 'string',
31
- description: 'The storage method for the collection of settings. If this is not \'file\' then the necessary settings to connect must be passed into the api function.',
32
- default: 'file'
33
- },
34
- file_storage_path: {
35
- type: 'string',
36
- description: 'The name of the folder where to put collections stored in the file system.',
37
- default: 'data'
38
- },
39
- }
1
+ function getCollectionPermissions (name, hasOwner) {
2
+ let permissions = exports.collectionPermissions(name)
3
+ if (hasOwner) {
4
+ permissions = permissions.concat(exports.collectionOwnerPermissions(name))
5
+ }
6
+ return permissions
7
+ }
8
+
9
+ exports.collectionPermissions = function (name) {
10
+ return ['create', 'view', 'edit', 'modify owner', 'delete'].map((action) => `${name}: ${action}`)
11
+ }
12
+
13
+ exports.collectionOwnerPermissions = function (name) {
14
+ return ['view', 'edit', 'delete'].map((action) => `${name}: ${action} own`)
15
+ }
16
+
17
+ exports.permissions = async function (app) {
18
+ const collections = (await app.db.collection.all()).map((collection) => collection._id)
19
+ // flatten the permissions into a single list
20
+ const permissions = [].concat(...collections.map(getCollectionPermissions))
21
+ return permissions
22
+ }
23
+
24
+ exports.settingSchema = {
25
+ collection_db_type: {
26
+ type: 'string',
27
+ description: 'The storage method for the collection of collections.'
28
+ },
29
+ settings_db_type: {
30
+ type: 'string',
31
+ description: 'The storage method for the collection of settings. If this is not \'file\' then the necessary settings to connect must be passed into the api function.',
32
+ default: 'file'
33
+ },
34
+ file_storage_path: {
35
+ type: 'string',
36
+ description: 'The name of the folder where to put collections stored in the file system.',
37
+ default: 'data'
38
+ },
39
+ allow_where_in_api: {
40
+ type: 'boolean',
41
+ description: 'Whether to allow the $where and $function operators in the query parameter of REST requests. These are executed as JavaScript, so enabling this lets any client that can reach the API run code on the server. Off by default; only enable it if every caller is trusted.',
42
+ format: 'checkbox',
43
+ default: false,
44
+ },
45
+ }