expressa 2.0.14 → 2.0.16

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 (206) 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 +258 -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/support/commands.js +54 -54
  19. package/cypress/support/index.js +20 -20
  20. package/cypress/support/util.js +10 -10
  21. package/cypress.json +4 -4
  22. package/db/cached.js +40 -40
  23. package/db/file.js +112 -112
  24. package/db/memory.js +79 -79
  25. package/db/mongo.js +86 -86
  26. package/db/postgres.js +93 -93
  27. package/doc/authentication.md +38 -38
  28. package/doc/automatic-fields.md +12 -12
  29. package/doc/blogexample.md +16 -16
  30. package/doc/custom-endpoints.md +20 -20
  31. package/doc/database.md +23 -23
  32. package/doc/development.md +33 -33
  33. package/doc/listeners.md +103 -103
  34. package/doc/modules.md +8 -8
  35. package/doc/permissions.md +14 -14
  36. package/doc/relationships.md +65 -65
  37. package/doc/testing.md +47 -47
  38. package/doc/uploading-files.md +53 -53
  39. package/index.js +297 -297
  40. package/listeners.js +65 -65
  41. package/listeners_collection_permissions.js +29 -29
  42. package/listeners_users.js +96 -96
  43. package/listeners_validation.js +43 -43
  44. package/middleware/logging.js +30 -30
  45. package/middleware/permissions.js +41 -47
  46. package/modules/access_keys/access_keys.js +32 -32
  47. package/modules/admin/.babelrc +12 -12
  48. package/modules/admin/.editorconfig +14 -14
  49. package/modules/admin/.eslintignore +5 -5
  50. package/modules/admin/.eslintrc.js +197 -197
  51. package/modules/admin/.postcssrc.js +10 -10
  52. package/modules/admin/.travis.yml +5 -5
  53. package/modules/admin/LICENSE +21 -21
  54. package/modules/admin/README.md +88 -88
  55. package/modules/admin/build/build.js +45 -45
  56. package/modules/admin/build/check-versions.js +64 -64
  57. package/modules/admin/build/utils.js +108 -108
  58. package/modules/admin/build/vue-loader.conf.js +5 -5
  59. package/modules/admin/build/webpack.base.conf.js +108 -108
  60. package/modules/admin/build/webpack.dev.conf.js +95 -95
  61. package/modules/admin/build/webpack.prod.conf.js +171 -171
  62. package/modules/admin/config/dev.env.js +8 -8
  63. package/modules/admin/config/index.js +86 -86
  64. package/modules/admin/config/prod.env.js +5 -5
  65. package/modules/admin/index.html +16 -16
  66. package/modules/admin/package.json +98 -98
  67. package/modules/admin/src/App.vue +11 -11
  68. package/modules/admin/src/api/login.js +26 -26
  69. package/modules/admin/src/api/table.js +9 -9
  70. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  71. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  72. package/modules/admin/src/components/JSONEditor.vue +180 -180
  73. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  74. package/modules/admin/src/icons/index.js +9 -9
  75. package/modules/admin/src/icons/svgo.yml +22 -22
  76. package/modules/admin/src/permission.js +49 -49
  77. package/modules/admin/src/router/index.js +200 -200
  78. package/modules/admin/src/store/getters.js +11 -11
  79. package/modules/admin/src/store/index.js +17 -17
  80. package/modules/admin/src/store/modules/app.js +43 -43
  81. package/modules/admin/src/store/modules/user.js +104 -104
  82. package/modules/admin/src/styles/element-ui.scss +29 -29
  83. package/modules/admin/src/styles/index.scss +78 -78
  84. package/modules/admin/src/styles/mixin.scss +27 -27
  85. package/modules/admin/src/styles/sidebar.scss +133 -133
  86. package/modules/admin/src/styles/transition.scss +46 -46
  87. package/modules/admin/src/styles/variables.scss +4 -4
  88. package/modules/admin/src/utils/auth.js +15 -15
  89. package/modules/admin/src/utils/index.js +74 -74
  90. package/modules/admin/src/utils/request.js +48 -48
  91. package/modules/admin/src/utils/validate.js +31 -31
  92. package/modules/admin/src/views/404.vue +235 -235
  93. package/modules/admin/src/views/Dev.vue +33 -33
  94. package/modules/admin/src/views/EditDocument.vue +116 -116
  95. package/modules/admin/src/views/Endpoints.vue +279 -279
  96. package/modules/admin/src/views/Home.vue +84 -84
  97. package/modules/admin/src/views/Install.vue +79 -79
  98. package/modules/admin/src/views/ListDocuments.vue +72 -72
  99. package/modules/admin/src/views/ListDocuments2.vue +462 -462
  100. package/modules/admin/src/views/ManageListeners.vue +67 -67
  101. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  102. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  103. package/modules/admin/src/views/ViewRequest.vue +77 -77
  104. package/modules/admin/src/views/form/index.vue +91 -91
  105. package/modules/admin/src/views/layout/Layout.vue +69 -69
  106. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  107. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  108. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  109. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  110. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  111. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  112. package/modules/admin/src/views/layout/components/index.js +3 -3
  113. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  114. package/modules/admin/src/views/login/index.vue +195 -195
  115. package/modules/admin/src/views/tree/index.vue +77 -77
  116. package/modules/collections/collections.js +39 -39
  117. package/modules/core/core.js +197 -197
  118. package/modules/logging/logging.js +88 -88
  119. package/modules/permissions/permissions.js +106 -106
  120. package/package.json +59 -59
  121. package/scripts/expressa +12 -12
  122. package/scripts/run_cypress_tests.sh +5 -5
  123. package/scripts/run_db_tests.sh +8 -8
  124. package/test/0-install.js +96 -96
  125. package/test/collections.js +431 -423
  126. package/test/collections.querying.js +289 -269
  127. package/test/db.js +258 -250
  128. package/test/db.strings.js +73 -73
  129. package/test/db.updating.js +144 -144
  130. package/test/logging.js +29 -29
  131. package/test/test.js +94 -94
  132. package/test/testserver.js +17 -17
  133. package/test/testutils.js +136 -136
  134. package/test/users.js +425 -425
  135. package/util.js +522 -504
  136. package/modules/admin/dist/favicon.ico +0 -0
  137. package/modules/admin/dist/index.html +0 -1
  138. package/modules/admin/dist/index.html.gz +0 -0
  139. package/modules/admin/dist/static/css/app.9dd57eea.css +0 -1
  140. package/modules/admin/dist/static/css/app.9dd57eea.css.gz +0 -0
  141. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css +0 -1
  142. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css.gz +0 -0
  143. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css +0 -1
  144. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css.gz +0 -0
  145. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css +0 -1
  146. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css.gz +0 -0
  147. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css +0 -1
  148. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css.gz +0 -0
  149. package/modules/admin/dist/static/css/chunk-7291.13514e45.css +0 -0
  150. package/modules/admin/dist/static/css/chunk-7291.13514e45.css.gz +0 -0
  151. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css +0 -1
  152. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css.gz +0 -0
  153. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css +0 -1
  154. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css.gz +0 -0
  155. package/modules/admin/dist/static/css/chunk-b423.5f239333.css +0 -0
  156. package/modules/admin/dist/static/css/chunk-b423.5f239333.css.gz +0 -0
  157. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css +0 -1
  158. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css.gz +0 -0
  159. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css +0 -1
  160. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css.gz +0 -0
  161. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css +0 -1
  162. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css.gz +0 -0
  163. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css +0 -1
  164. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css.gz +0 -0
  165. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css +0 -14
  166. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css.gz +0 -0
  167. package/modules/admin/dist/static/fonts/element-icons.6f0a763.ttf +0 -0
  168. package/modules/admin/dist/static/img/404.a57b6f3.png +0 -0
  169. package/modules/admin/dist/static/js/app.e9461593.js +0 -1
  170. package/modules/admin/dist/static/js/app.e9461593.js.gz +0 -0
  171. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js +0 -2
  172. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt +0 -13
  173. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt.gz +0 -0
  174. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.gz +0 -0
  175. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js +0 -1
  176. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js.gz +0 -0
  177. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js +0 -1
  178. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js.gz +0 -0
  179. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js +0 -1
  180. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js.gz +0 -0
  181. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js +0 -1
  182. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js.gz +0 -0
  183. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js +0 -1
  184. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js.gz +0 -0
  185. package/modules/admin/dist/static/js/chunk-7291.590524e9.js +0 -1
  186. package/modules/admin/dist/static/js/chunk-7291.590524e9.js.gz +0 -0
  187. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js +0 -1
  188. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js.gz +0 -0
  189. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js +0 -1
  190. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js.gz +0 -0
  191. package/modules/admin/dist/static/js/chunk-b423.387c504c.js +0 -1
  192. package/modules/admin/dist/static/js/chunk-b423.387c504c.js.gz +0 -0
  193. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js +0 -1
  194. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js.gz +0 -0
  195. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js +0 -1
  196. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js.gz +0 -0
  197. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js +0 -1
  198. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js.gz +0 -0
  199. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js +0 -1
  200. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js.gz +0 -0
  201. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js +0 -1
  202. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js.gz +0 -0
  203. package/modules/admin/dist/static/js/chunk-libs.06c38828.js +0 -2
  204. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt +0 -126
  205. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt.gz +0 -0
  206. package/modules/admin/dist/static/js/chunk-libs.06c38828.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
+ }