expressa 2.0.21 → 2.0.23

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 (222) hide show
  1. package/.circleci/config.yml +21 -21
  2. package/.eslintrc.json +29 -29
  3. package/.vscode/launch.json +19 -0
  4. package/LICENSE +21 -21
  5. package/README.md +137 -137
  6. package/auth/index.js +76 -76
  7. package/auth/jwt.js +31 -31
  8. package/controllers/collections.js +260 -260
  9. package/controllers/install.js +105 -105
  10. package/controllers/status.js +43 -43
  11. package/controllers/users.js +52 -52
  12. package/cypress/fixtures/example.json +4 -4
  13. package/cypress/integration/0_install_spec.js +8 -8
  14. package/cypress/integration/custom_collections.js +30 -30
  15. package/cypress/integration/home.js +9 -9
  16. package/cypress/integration/settings.js +34 -34
  17. package/cypress/integration/users.js +61 -61
  18. package/cypress/plugins/index.js +17 -17
  19. package/cypress/support/commands.js +69 -69
  20. package/cypress/support/index.js +20 -20
  21. package/cypress/support/util.js +10 -10
  22. package/cypress.config.js +18 -18
  23. package/cypress.json +4 -4
  24. package/db/cached.js +44 -40
  25. package/db/file.js +131 -112
  26. package/db/memory.js +92 -79
  27. package/db/mongo.js +93 -86
  28. package/db/postgres.js +100 -93
  29. package/doc/authentication.md +38 -38
  30. package/doc/automatic-fields.md +12 -12
  31. package/doc/blogexample.md +16 -16
  32. package/doc/custom-endpoints.md +20 -20
  33. package/doc/database.md +23 -23
  34. package/doc/development.md +33 -33
  35. package/doc/listeners.md +103 -103
  36. package/doc/modules.md +8 -8
  37. package/doc/permissions.md +14 -14
  38. package/doc/relationships.md +65 -65
  39. package/doc/testing.md +47 -47
  40. package/doc/uploading-files.md +53 -53
  41. package/index.js +297 -297
  42. package/listeners.js +65 -65
  43. package/listeners_collection_permissions.js +29 -29
  44. package/listeners_users.js +96 -96
  45. package/listeners_validation.js +43 -43
  46. package/middleware/logging.js +30 -30
  47. package/middleware/permissions.js +41 -41
  48. package/modules/access_keys/access_keys.js +32 -32
  49. package/modules/admin/.babelrc +8 -19
  50. package/modules/admin/.editorconfig +14 -14
  51. package/modules/admin/.eslintignore +5 -5
  52. package/modules/admin/.eslintrc.js +197 -197
  53. package/modules/admin/.postcssrc.js +10 -10
  54. package/modules/admin/.travis.yml +5 -5
  55. package/modules/admin/LICENSE +21 -21
  56. package/modules/admin/README.md +88 -88
  57. package/modules/admin/build/build.js +46 -46
  58. package/modules/admin/build/check-versions.js +64 -64
  59. package/modules/admin/build/utils.js +109 -109
  60. package/modules/admin/build/vue-loader.conf.js +5 -5
  61. package/modules/admin/build/webpack.base.conf.js +112 -112
  62. package/modules/admin/build/webpack.dev.conf.js +95 -95
  63. package/modules/admin/build/webpack.prod.conf.js +112 -112
  64. package/modules/admin/config/dev.env.js +8 -8
  65. package/modules/admin/config/index.js +86 -86
  66. package/modules/admin/config/prod.env.js +5 -5
  67. package/modules/admin/dist/css/{197.7a90435e.css → 197.e66ce8d8.css} +4 -4
  68. package/modules/admin/dist/css/197.e66ce8d8.css.gz +0 -0
  69. package/modules/admin/dist/css/{430.8c9b0482.css → 430.e83d8cfe.css} +4 -4
  70. package/modules/admin/dist/css/430.e83d8cfe.css.gz +0 -0
  71. package/modules/admin/dist/css/451.c6646d20.css.gz +0 -0
  72. package/modules/admin/dist/css/{566.7a90435e.css → 566.e66ce8d8.css} +4 -4
  73. package/modules/admin/dist/css/566.e66ce8d8.css.gz +0 -0
  74. package/modules/admin/dist/css/569.db9a10c2.css +213 -0
  75. package/modules/admin/dist/css/569.db9a10c2.css.gz +0 -0
  76. package/modules/admin/dist/css/572.513a323e.css +210 -0
  77. package/modules/admin/dist/css/572.513a323e.css.gz +0 -0
  78. package/modules/admin/dist/css/651.e946bda7.css.gz +0 -0
  79. package/modules/admin/dist/css/750.4086915d.css.gz +0 -0
  80. package/modules/admin/dist/css/950.1fd9d57c.css.gz +0 -0
  81. package/modules/admin/dist/css/{app.eba5f5e2.css → app.1c3232a3.css} +25 -25
  82. package/modules/admin/dist/css/app.1c3232a3.css.gz +0 -0
  83. package/modules/admin/dist/index.html +1 -1
  84. package/modules/admin/dist/static/js/197.36982650.js +1 -0
  85. package/modules/admin/dist/static/js/197.36982650.js.gz +0 -0
  86. package/modules/admin/dist/static/js/311.25e842dc.js +1 -0
  87. package/modules/admin/dist/static/js/311.25e842dc.js.gz +0 -0
  88. package/modules/admin/dist/static/js/430.53aea612.js +1 -0
  89. package/modules/admin/dist/static/js/430.53aea612.js.gz +0 -0
  90. package/modules/admin/dist/static/js/451.9f6dcdb1.js +1 -0
  91. package/modules/admin/dist/static/js/451.9f6dcdb1.js.gz +0 -0
  92. package/modules/admin/dist/static/js/460.351dad91.js +1 -0
  93. package/modules/admin/dist/static/js/460.351dad91.js.gz +0 -0
  94. package/modules/admin/dist/static/js/550.87e54b29.js +1 -0
  95. package/modules/admin/dist/static/js/550.87e54b29.js.gz +0 -0
  96. package/modules/admin/dist/static/js/569.52dba3a7.js +1 -0
  97. package/modules/admin/dist/static/js/569.52dba3a7.js.gz +0 -0
  98. package/modules/admin/dist/static/js/572.296cfd3b.js +1 -0
  99. package/modules/admin/dist/static/js/572.296cfd3b.js.gz +0 -0
  100. package/modules/admin/dist/static/js/603.98d5f5d9.js +1 -0
  101. package/modules/admin/dist/static/js/603.98d5f5d9.js.gz +0 -0
  102. package/modules/admin/dist/static/js/651.6dca6fbe.js +1 -0
  103. package/modules/admin/dist/static/js/651.6dca6fbe.js.gz +0 -0
  104. package/modules/admin/dist/static/js/653.0dff78dc.js +1 -0
  105. package/modules/admin/dist/static/js/653.0dff78dc.js.gz +0 -0
  106. package/modules/admin/dist/static/js/750.6877a6b8.js +1 -0
  107. package/modules/admin/dist/static/js/750.6877a6b8.js.gz +0 -0
  108. package/modules/admin/dist/static/js/950.4f40455a.js +1 -0
  109. package/modules/admin/dist/static/js/950.4f40455a.js.gz +0 -0
  110. package/modules/admin/dist/static/js/app.2dd732d9.js +2 -0
  111. package/modules/admin/dist/static/js/{app.083328f8.js.LICENSE.txt → app.2dd732d9.js.LICENSE.txt} +0 -2
  112. package/modules/admin/dist/static/js/app.2dd732d9.js.LICENSE.txt.gz +0 -0
  113. package/modules/admin/dist/static/js/app.2dd732d9.js.gz +0 -0
  114. package/modules/admin/index.html +16 -16
  115. package/modules/admin/package.json +101 -101
  116. package/modules/admin/src/App.vue +11 -11
  117. package/modules/admin/src/api/login.js +26 -26
  118. package/modules/admin/src/api/table.js +9 -9
  119. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  120. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  121. package/modules/admin/src/components/JSONEditor.vue +206 -180
  122. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  123. package/modules/admin/src/icons/index.js +9 -9
  124. package/modules/admin/src/icons/svgo.yml +22 -22
  125. package/modules/admin/src/main.js +42 -42
  126. package/modules/admin/src/permission.js +49 -49
  127. package/modules/admin/src/router/index.js +200 -200
  128. package/modules/admin/src/store/getters.js +11 -11
  129. package/modules/admin/src/store/index.js +17 -17
  130. package/modules/admin/src/store/modules/app.js +43 -43
  131. package/modules/admin/src/store/modules/user.js +104 -104
  132. package/modules/admin/src/styles/element-ui.scss +29 -29
  133. package/modules/admin/src/styles/index.scss +78 -78
  134. package/modules/admin/src/styles/mixin.scss +27 -27
  135. package/modules/admin/src/styles/sidebar.scss +133 -133
  136. package/modules/admin/src/styles/transition.scss +46 -46
  137. package/modules/admin/src/styles/variables.scss +4 -4
  138. package/modules/admin/src/utils/auth.js +15 -15
  139. package/modules/admin/src/utils/index.js +74 -74
  140. package/modules/admin/src/utils/request.js +47 -47
  141. package/modules/admin/src/utils/validate.js +31 -31
  142. package/modules/admin/src/views/404.vue +235 -235
  143. package/modules/admin/src/views/Dev.vue +33 -33
  144. package/modules/admin/src/views/EditDocument.vue +121 -121
  145. package/modules/admin/src/views/Endpoints.vue +279 -279
  146. package/modules/admin/src/views/Home.vue +84 -84
  147. package/modules/admin/src/views/Install.vue +79 -79
  148. package/modules/admin/src/views/ListDocuments.vue +72 -72
  149. package/modules/admin/src/views/ListDocuments2.vue +467 -467
  150. package/modules/admin/src/views/ManageListeners.vue +67 -67
  151. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  152. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  153. package/modules/admin/src/views/ViewRequest.vue +77 -77
  154. package/modules/admin/src/views/form/index.vue +91 -91
  155. package/modules/admin/src/views/layout/Layout.vue +69 -69
  156. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  157. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  158. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  159. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  160. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  161. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  162. package/modules/admin/src/views/layout/components/index.js +3 -3
  163. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  164. package/modules/admin/src/views/login/index.vue +195 -195
  165. package/modules/admin/src/views/tree/index.vue +77 -77
  166. package/modules/collections/collections.js +39 -39
  167. package/modules/core/core.js +197 -197
  168. package/modules/logging/logging.js +88 -88
  169. package/modules/permissions/permissions.js +106 -106
  170. package/package.json +59 -59
  171. package/scripts/expressa +12 -12
  172. package/scripts/run_cypress_tests.sh +35 -35
  173. package/scripts/run_db_tests.sh +8 -8
  174. package/test/0-install.js +96 -96
  175. package/test/collections.js +431 -431
  176. package/test/collections.querying.js +288 -288
  177. package/test/db.js +258 -258
  178. package/test/db.strings.js +73 -73
  179. package/test/db.updating.js +186 -144
  180. package/test/logging.js +29 -29
  181. package/test/test.js +93 -93
  182. package/test/testserver.js +30 -30
  183. package/test/testutils.js +136 -136
  184. package/test/users.js +425 -425
  185. package/util.js +522 -522
  186. package/modules/admin/dist/css/197.7a90435e.css.gz +0 -0
  187. package/modules/admin/dist/css/430.8c9b0482.css.gz +0 -0
  188. package/modules/admin/dist/css/566.7a90435e.css.gz +0 -0
  189. package/modules/admin/dist/css/569.f7d5c7d5.css +0 -37
  190. package/modules/admin/dist/css/569.f7d5c7d5.css.gz +0 -0
  191. package/modules/admin/dist/css/572.74d8e965.css +0 -34
  192. package/modules/admin/dist/css/572.74d8e965.css.gz +0 -0
  193. package/modules/admin/dist/css/app.eba5f5e2.css.gz +0 -0
  194. package/modules/admin/dist/static/js/197.e511d91e.js +0 -1
  195. package/modules/admin/dist/static/js/197.e511d91e.js.gz +0 -0
  196. package/modules/admin/dist/static/js/430.b3941f30.js +0 -1
  197. package/modules/admin/dist/static/js/430.b3941f30.js.gz +0 -0
  198. package/modules/admin/dist/static/js/451.645974a8.js +0 -1
  199. package/modules/admin/dist/static/js/451.645974a8.js.gz +0 -0
  200. package/modules/admin/dist/static/js/460.962d5bc0.js +0 -1
  201. package/modules/admin/dist/static/js/460.962d5bc0.js.gz +0 -0
  202. package/modules/admin/dist/static/js/550.f27feb23.js +0 -1
  203. package/modules/admin/dist/static/js/550.f27feb23.js.gz +0 -0
  204. package/modules/admin/dist/static/js/556.1e08866a.js +0 -1
  205. package/modules/admin/dist/static/js/556.1e08866a.js.gz +0 -0
  206. package/modules/admin/dist/static/js/569.0fecfbee.js +0 -1
  207. package/modules/admin/dist/static/js/569.0fecfbee.js.gz +0 -0
  208. package/modules/admin/dist/static/js/572.13392e1d.js +0 -1
  209. package/modules/admin/dist/static/js/572.13392e1d.js.gz +0 -0
  210. package/modules/admin/dist/static/js/603.7b34a650.js +0 -1
  211. package/modules/admin/dist/static/js/603.7b34a650.js.gz +0 -0
  212. package/modules/admin/dist/static/js/651.564b24b6.js +0 -1
  213. package/modules/admin/dist/static/js/651.564b24b6.js.gz +0 -0
  214. package/modules/admin/dist/static/js/653.02ec1098.js +0 -1
  215. package/modules/admin/dist/static/js/653.02ec1098.js.gz +0 -0
  216. package/modules/admin/dist/static/js/750.50c950da.js +0 -1
  217. package/modules/admin/dist/static/js/750.50c950da.js.gz +0 -0
  218. package/modules/admin/dist/static/js/950.d4ff0a18.js +0 -1
  219. package/modules/admin/dist/static/js/950.d4ff0a18.js.gz +0 -0
  220. package/modules/admin/dist/static/js/app.083328f8.js +0 -2
  221. package/modules/admin/dist/static/js/app.083328f8.js.LICENSE.txt.gz +0 -0
  222. package/modules/admin/dist/static/js/app.083328f8.js.gz +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,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
- }
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
+ }