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,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
+ }