expressa 1.1.0 → 1.2.0
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.
- package/.circleci/config.yml +1 -1
- package/README.md +4 -3
- package/controllers/collections.js +53 -32
- package/controllers/status.js +2 -1
- package/db/cached.js +3 -0
- package/db/file.js +3 -0
- package/db/memory.js +3 -0
- package/db/mongo.js +7 -8
- package/db/postgres.js +13 -0
- package/index.js +3 -1
- package/listeners_validation.js +4 -0
- package/modules/admin/dist/index.html +1 -1
- package/modules/admin/dist/static/css/chunk-318c.ffb0d81e.css +1 -0
- package/modules/admin/dist/static/css/chunk-621e.97323951.css +1 -0
- package/modules/admin/dist/static/css/{chunk-e80a.5ee55031.css → chunk-6644.69ccf1a7.css} +1 -1
- package/modules/admin/dist/static/css/chunk-e375.1d849865.css +1 -0
- package/modules/admin/dist/static/css/{chunk-759b.3a895a1e.css → chunk-f075.3a895a1e.css} +0 -0
- package/modules/admin/dist/static/css/chunk-libs.327ad89e.css +14 -0
- package/modules/admin/dist/static/js/{app.17447107.js → app.03e8afa3.js} +1 -1
- package/modules/admin/dist/static/js/chunk-318c.03fa0032.js +1 -0
- package/modules/admin/dist/static/js/chunk-621e.a9ed86e2.js +1 -0
- package/modules/admin/dist/static/js/chunk-6644.9c6f5c7b.js +1 -0
- package/modules/admin/dist/static/js/chunk-8bab.7052832d.js +2 -0
- package/modules/admin/dist/static/js/{chunk-23bd.5fa24c85.js.LICENSE.txt → chunk-8bab.7052832d.js.LICENSE.txt} +1 -1
- package/modules/admin/dist/static/js/chunk-e375.089d85cd.js +1 -0
- package/modules/admin/dist/static/js/chunk-f075.315ceec1.js +1 -0
- package/modules/admin/dist/static/js/chunk-libs.06c38828.js +2 -0
- package/modules/admin/dist/static/js/{chunk-libs.b6f27cfe.js.LICENSE.txt → chunk-libs.06c38828.js.LICENSE.txt} +1 -1
- package/modules/admin/package.json +3 -3
- package/modules/admin/src/components/JSONEditor.vue +22 -9
- package/modules/admin/src/main.js +2 -2
- package/modules/admin/src/router/index.js +185 -185
- package/modules/admin/src/views/ListDocuments2.vue +309 -309
- package/package.json +1 -1
- package/test/collections.js +2 -3
- package/test/collections.querying.js +18 -4
- package/test/test.js +4 -0
- package/util.js +19 -0
- package/modules/admin/dist/static/css/chunk-0884.40d0b632.css +0 -1
- package/modules/admin/dist/static/css/chunk-34ab.f9393b1e.css +0 -1
- package/modules/admin/dist/static/css/chunk-7869.220d4af5.css +0 -1
- package/modules/admin/dist/static/css/chunk-libs.68e8d170.css +0 -14
- package/modules/admin/dist/static/js/chunk-0884.5ca2b4c5.js +0 -1
- package/modules/admin/dist/static/js/chunk-23bd.5fa24c85.js +0 -2
- package/modules/admin/dist/static/js/chunk-34ab.06400cb6.js +0 -1
- package/modules/admin/dist/static/js/chunk-759b.89a889b6.js +0 -1
- package/modules/admin/dist/static/js/chunk-7869.b7ab2c47.js +0 -1
- package/modules/admin/dist/static/js/chunk-e80a.cc0d79f4.js +0 -1
- package/modules/admin/dist/static/js/chunk-libs.b6f27cfe.js +0 -2
package/.circleci/config.yml
CHANGED
package/README.md
CHANGED
|
@@ -52,9 +52,10 @@ Once you add a collections in the admin interface, every collection will have th
|
|
|
52
52
|
| POST | /users/login | expects JSON in the message body. e.g. `{"email": "email@example.com", password: "<the password>"} |
|
|
53
53
|
| GET | /:collection | get an array of all documents in a collection |
|
|
54
54
|
| GET | /:collection/:id | get a specific document |
|
|
55
|
-
| GET | /:collection/?query={..} | get an array of documents matching the [mongo query](https://www.npmjs.com/package/mongo-query)
|
|
56
|
-
| GET | /:collection/?query={..}&limit=10&
|
|
57
|
-
| GET | /:collection/?query={..}&
|
|
55
|
+
| GET | /:collection/?query={..} | get an array of documents matching the [mongo query](https://www.npmjs.com/package/mongo-query) |
|
|
56
|
+
| GET | /:collection/?query={..}&limit=10&offset=10&orderby={"meta.created":1} | same as previous, but with targeted output control and sorting |
|
|
57
|
+
| GET | /:collection/?query={..}&page=1&pageitems=10 | similar to previous, but with pagination support |
|
|
58
|
+
| GET | /:collection/?query={..}&page=1&pageitems=10&pagemetadisable=1 | same as previous but *slightly* faster and with less pagination detail |
|
|
58
59
|
| GET | /:collection/?query={..}&fields={..} | the fields param can be used to do a mongo projection to request only specific fields |
|
|
59
60
|
| GET | /:collection/?fieldname=value | get an array of documents matching with the specified values. See [node-mongo-querystring](https://github.com/Turistforeningen/node-mongo-querystring) for details. |
|
|
60
61
|
| GET | /:collection/schema | get the collection schema |
|
|
@@ -18,54 +18,75 @@ exports.getSchema = async function (req) {
|
|
|
18
18
|
|
|
19
19
|
exports.get = async function (req) {
|
|
20
20
|
assertValidCollection(req)
|
|
21
|
-
let total = 0
|
|
22
21
|
if (typeof req.db[req.params.collection] === 'undefined') {
|
|
23
22
|
throw new util.ApiError(404, 'unknown collection')
|
|
24
23
|
}
|
|
24
|
+
|
|
25
25
|
const fields = req.query.fields ? JSON.parse(req.query.fields) : null
|
|
26
|
-
|
|
26
|
+
|
|
27
|
+
let data, query
|
|
27
28
|
if (req.query.query) {
|
|
28
29
|
query = JSON.parse(req.query.query)
|
|
29
|
-
} else {
|
|
30
|
-
const { skip, offset, limit, page, orderby, fields, ...params } = req.query // eslint-disable-line no-unused-vars
|
|
31
|
-
query = queryStringParser.parse(params)
|
|
32
30
|
}
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
else {
|
|
32
|
+
const { skip, offset, limit, page, pageitems, pagemetadisable, orderby, fields, ...params } = req.query // eslint-disable-line no-unused-vars
|
|
33
|
+
query = queryStringParser.parse(params)
|
|
35
34
|
}
|
|
36
|
-
if (req.query.
|
|
37
|
-
req.query.
|
|
35
|
+
if (req.query.orderby) {
|
|
36
|
+
req.query.orderby = JSON.parse(req.query.orderby)
|
|
37
|
+
req.query.orderby = util.normalizeOrderBy(req.query.orderby)
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
|
|
40
|
+
if (req.uid) {
|
|
41
|
+
// scenario where logged in user can only retrieve own docs
|
|
42
|
+
if (!req.hasPermission(`${req.params.collection}: view`) && req.hasPermission(`${req.params.collection}: view own`)) {
|
|
43
|
+
query['meta.owner'] = req.uid
|
|
44
|
+
fields['meta.owner'] = 1
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
|
-
let orderby
|
|
47
|
-
if (req.query.orderby) {
|
|
48
|
-
orderby = JSON.parse(req.query.orderby)
|
|
49
|
-
orderby = util.normalizeOrderBy(orderby)
|
|
50
|
-
}
|
|
51
47
|
|
|
52
|
-
|
|
53
|
-
req.query.
|
|
54
|
-
total = data.length
|
|
55
|
-
const limit = req.query.pageitems || (total > 10 ? 10 : total)
|
|
56
|
-
// calculate pagination in case `page`-queryarg was passed
|
|
57
|
-
const allowed = await Promise.all(data.map((doc) =>
|
|
58
|
-
util.notify('get', req, req.params.collection, doc).catch(() => false)
|
|
59
|
-
))
|
|
60
|
-
let result = data.filter((doc, i) => allowed[i] === true)
|
|
61
|
-
if (req.query.page) {
|
|
48
|
+
if (req.query.page != null) {
|
|
49
|
+
req.query.page = parseInt(req.query.page)
|
|
62
50
|
if (req.query.page <= 0) {
|
|
63
51
|
throw new util.ApiError(400, 'invalid page number')
|
|
64
52
|
}
|
|
65
|
-
|
|
53
|
+
req.query.pageitems = parseInt(req.query.pageitems) || parseInt(req.query.limit) || 10
|
|
54
|
+
req.query.offset = util.getDatabaseOffset(req.query.page, req.query.pageitems)
|
|
55
|
+
req.query.orderby = req.query.orderby || util.normalizeOrderBy({ 'meta.created': 1 }) // paging requires orderby to ensure consistent results with offset and limit
|
|
56
|
+
delete req.query.limit
|
|
57
|
+
delete req.query.skip
|
|
58
|
+
let pageData, totalItems
|
|
59
|
+
if (req.query.pagemetadisable) {
|
|
60
|
+
// a way to skip the extra count database call, but lose additional page detail
|
|
61
|
+
pageData = await req.db[req.params.collection].find(query, req.query.offset, req.query.pageitems, req.query.orderby, fields)
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// this is default - full detail
|
|
65
|
+
[pageData, totalItems] = await Promise.all([
|
|
66
|
+
req.db[req.params.collection].find(query, req.query.offset, req.query.pageitems, req.query.orderby, fields),
|
|
67
|
+
req.db[req.params.collection].count(query)
|
|
68
|
+
])
|
|
69
|
+
}
|
|
70
|
+
await Promise.all(pageData.map((doc) => util.notify('get', req, req.params.collection, doc)))
|
|
71
|
+
data = util.createPagePagination(pageData, req.query.page, req.query.pageitems, totalItems)
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
if (req.query.limit) {
|
|
75
|
+
req.query.limit = parseInt(req.query.limit)
|
|
76
|
+
}
|
|
77
|
+
if (req.query.skip) {
|
|
78
|
+
req.query.offset = parseInt(req.query.skip)
|
|
79
|
+
delete req.query.skip
|
|
80
|
+
}
|
|
81
|
+
else if (req.query.offset) {
|
|
82
|
+
req.query.offset = parseInt(req.query.offset)
|
|
83
|
+
}
|
|
84
|
+
data = await req.db[req.params.collection].find(query, req.query.offset, req.query.limit, req.query.orderby, fields)
|
|
85
|
+
await Promise.all(data.map((doc) => util.notify('get', req, req.params.collection, doc)))
|
|
66
86
|
}
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
|
|
88
|
+
await util.notify('getpresend', req, req.params.collection, data)
|
|
89
|
+
return data
|
|
69
90
|
}
|
|
70
91
|
|
|
71
92
|
exports.insert = async function (req) {
|
package/controllers/status.js
CHANGED
|
@@ -29,6 +29,7 @@ exports.getStatus = function(router) {
|
|
|
29
29
|
})
|
|
30
30
|
listeners.sort((a, b) => a.priority - b.priority)
|
|
31
31
|
const collections = Object.keys(router.db)
|
|
32
|
+
.filter((collection) => req.hasPermission(`${collection}: view`) || req.hasPermission(`${collection}: view own`))
|
|
32
33
|
return {
|
|
33
34
|
nodeVersion: process.version,
|
|
34
35
|
uptime: util.friendlyDuration(process.uptime()),
|
|
@@ -39,4 +40,4 @@ exports.getStatus = function(router) {
|
|
|
39
40
|
collections,
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
|
-
}
|
|
43
|
+
}
|
package/db/cached.js
CHANGED
|
@@ -14,6 +14,9 @@ module.exports = function (storage) {
|
|
|
14
14
|
find: function (query, offset, limit, orderby, fields) {
|
|
15
15
|
return cache.find(query, offset, limit, orderby, fields)
|
|
16
16
|
},
|
|
17
|
+
count: async function(...params) {
|
|
18
|
+
return await cache.count(...params)
|
|
19
|
+
},
|
|
17
20
|
get: function (id, fields) {
|
|
18
21
|
return cache.get(id, fields)
|
|
19
22
|
},
|
package/db/file.js
CHANGED
package/db/memory.js
CHANGED
|
@@ -30,6 +30,9 @@ module.exports = function (settings, collection) {
|
|
|
30
30
|
}
|
|
31
31
|
return matches
|
|
32
32
|
},
|
|
33
|
+
count: async function(...params) {
|
|
34
|
+
return (await this.find(...params)).length
|
|
35
|
+
},
|
|
33
36
|
get: async function (id, fields) {
|
|
34
37
|
if (!store[id]) {
|
|
35
38
|
throw new util.ApiError(404, 'document not found')
|
package/db/mongo.js
CHANGED
|
@@ -19,13 +19,7 @@ module.exports = function (settings, collection) {
|
|
|
19
19
|
},
|
|
20
20
|
find: async function (query, skip, limit, orderby, fields) {
|
|
21
21
|
const db = await this.getClient()
|
|
22
|
-
const cursor = db.collection(collection).find(query, { fields
|
|
23
|
-
if (typeof skip !== 'undefined') {
|
|
24
|
-
cursor.skip(skip)
|
|
25
|
-
}
|
|
26
|
-
if (typeof limit !== 'undefined') {
|
|
27
|
-
cursor.limit(limit)
|
|
28
|
-
}
|
|
22
|
+
const cursor = db.collection(collection).find(query, { skip, limit, projection: fields, sort: orderby })
|
|
29
23
|
const docs = await cursor.toArray()
|
|
30
24
|
docs.forEach((doc) => {
|
|
31
25
|
if (doc._id) {
|
|
@@ -34,9 +28,14 @@ module.exports = function (settings, collection) {
|
|
|
34
28
|
})
|
|
35
29
|
return docs
|
|
36
30
|
},
|
|
31
|
+
count: async function(query, skip, limit) {
|
|
32
|
+
const db = await this.getClient()
|
|
33
|
+
const count = await db.collection(collection).count(query, { skip, limit })
|
|
34
|
+
return count
|
|
35
|
+
},
|
|
37
36
|
get: async function (id, fields) {
|
|
38
37
|
const db = await this.getClient()
|
|
39
|
-
const doc = await db.collection(collection).findOne({ _id: id }, { fields })
|
|
38
|
+
const doc = await db.collection(collection).findOne({ _id: id }, { projection: fields })
|
|
40
39
|
if (doc) {
|
|
41
40
|
doc._id = doc._id.toString()
|
|
42
41
|
}
|
package/db/postgres.js
CHANGED
|
@@ -35,6 +35,19 @@ module.exports = function (settings, collectionId, collection) {
|
|
|
35
35
|
const result = await pool.query(query)
|
|
36
36
|
return result.rows.map((row) => row.data)
|
|
37
37
|
},
|
|
38
|
+
count: async function(rawQuery, offset, limit) {
|
|
39
|
+
const arrayFields = util.getArrayPaths('', collection.schema)
|
|
40
|
+
const pgQuery = mongoToPostgres('data', rawQuery || {}, arrayFields)
|
|
41
|
+
let query = 'SELECT COUNT(*) FROM ' + collectionId + (pgQuery ? ' WHERE ' + pgQuery : '')
|
|
42
|
+
if (typeof offset !== 'undefined') {
|
|
43
|
+
query += ' OFFSET ' + offset
|
|
44
|
+
}
|
|
45
|
+
if (typeof limit !== 'undefined') {
|
|
46
|
+
query += ' LIMIT ' + limit
|
|
47
|
+
}
|
|
48
|
+
const result = await pool.query(query)
|
|
49
|
+
return parseInt(result.rows[0].count)
|
|
50
|
+
},
|
|
38
51
|
get: async function (id, fields) {
|
|
39
52
|
const arrayFields = util.getArrayPaths('', collection.schema)
|
|
40
53
|
const select = fields ? mongoToPostgres.convertSelect('data', fields, arrayFields) : '*'
|
package/index.js
CHANGED
|
@@ -117,7 +117,9 @@ module.exports.api = function (settings) {
|
|
|
117
117
|
generateDocumentId: util.generateDocumentId,
|
|
118
118
|
doLogin: auth.doLogin,
|
|
119
119
|
createPagination: util.createPagination,
|
|
120
|
-
|
|
120
|
+
createPagePagination: util.createPagePagination,
|
|
121
|
+
normalizeOrderBy: util.normalizeOrderBy,
|
|
122
|
+
getDatabaseOffset: util.getDatabaseOffset,
|
|
121
123
|
}
|
|
122
124
|
router.eventListeners = {}
|
|
123
125
|
|
package/listeners_validation.js
CHANGED
|
@@ -16,6 +16,10 @@ ajv.addKeyword({
|
|
|
16
16
|
type: 'string',
|
|
17
17
|
schemaType: 'object',
|
|
18
18
|
})
|
|
19
|
+
ajv.addKeyword({
|
|
20
|
+
keyword: 'propertyOrder',
|
|
21
|
+
schemaType: 'number',
|
|
22
|
+
})
|
|
19
23
|
const formatKey = ajv.getKeyword('format')
|
|
20
24
|
formatKey.type = formatKey.type.concat(['array', 'boolean', 'object'])
|
|
21
25
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><script crossorigin src=https://cdnjs.cloudflare.com/ajax/libs/react/15.3.2/react.min.js></script><script crossorigin src=https://cdnjs.cloudflare.com/ajax/libs/react/15.3.2/react-dom.min.js></script><link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel=stylesheet><script src=settings.js></script><title>Expressa Admin</title><link rel=
|
|
1
|
+
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><script crossorigin src=https://cdnjs.cloudflare.com/ajax/libs/react/15.3.2/react.min.js></script><script crossorigin src=https://cdnjs.cloudflare.com/ajax/libs/react/15.3.2/react-dom.min.js></script><link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel=stylesheet><script src=settings.js></script><title>Expressa Admin</title><link rel=icon href=/admin/favicon.ico><link href=/admin/static/css/chunk-elementUI.3d004d9f.css rel=stylesheet><link href=/admin/static/css/chunk-libs.327ad89e.css rel=stylesheet><link href=/admin/static/css/app.9dd57eea.css rel=stylesheet></head><body><div id=app></div><script>!function(e){function n(n){for(var r,c,a=n[0],i=n[1],f=n[2],h=0,s=[];h<a.length;h++)c=a[h],Object.prototype.hasOwnProperty.call(u,c)&&u[c]&&s.push(u[c][0]),u[c]=0;for(r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r]);for(l&&l(n);s.length;)s.shift()();return o.push.apply(o,f||[]),t()}function t(){for(var e,n=0;n<o.length;n++){for(var t=o[n],r=!0,c=1;c<t.length;c++){var i=t[c];0!==u[i]&&(r=!1)}r&&(o.splice(n--,1),e=a(a.s=t[0]))}return e}var r={},c={runtime:0},u={runtime:0},o=[];function a(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var n=[];c[e]?n.push(c[e]):0!==c[e]&&{"chunk-318c":1,"chunk-3bc2":1,"chunk-5cee":1,"chunk-6644":1,"chunk-7291":1,"chunk-621e":1,"chunk-e375":1,"chunk-b423":1,"chunk-bd5f":1,"chunk-f075":1}[e]&&n.push(c[e]=new Promise((function(n,t){for(var r="static/css/"+({}[e]||e)+"."+{"chunk-318c":"ffb0d81e","chunk-3bc2":"89632b9d","chunk-5cee":"ce0e4bdb","chunk-6644":"69ccf1a7","chunk-7291":"13514e45","chunk-8bab":"31d6cfe0","chunk-621e":"97323951","chunk-e375":"1d849865","chunk-b423":"5f239333","chunk-bd5f":"aefa49d7","chunk-e7c3":"31d6cfe0","chunk-f075":"3a895a1e"}[e]+".css",c=a.p+r,u=document.getElementsByTagName("link"),o=0;o<u.length;o++){var i=(h=u[o]).getAttribute("data-href")||h.getAttribute("href");if("stylesheet"===h.rel&&(i===r||i===c))return n()}var f=document.getElementsByTagName("style");for(o=0;o<f.length;o++){var h;if((i=(h=f[o]).getAttribute("data-href"))===r||i===c)return n()}var l=document.createElement("link");l.rel="stylesheet",l.type="text/css",l.onload=n,l.onerror=function(n){var r=n&&n.target&&n.target.src||c,u=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");u.request=r,t(u)},l.href=c,document.getElementsByTagName("head")[0].appendChild(l)})).then((function(){c[e]=0})));var t=u[e];if(0!==t)if(t)n.push(t[2]);else{var r=new Promise((function(n,r){t=u[e]=[n,r]}));n.push(t[2]=r);var o,i=document.createElement("script");i.charset="utf-8",i.timeout=120,a.nc&&i.setAttribute("nonce",a.nc),i.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{"chunk-318c":"03fa0032","chunk-3bc2":"028748b7","chunk-5cee":"a3b03f7a","chunk-6644":"9c6f5c7b","chunk-7291":"590524e9","chunk-8bab":"7052832d","chunk-621e":"a9ed86e2","chunk-e375":"089d85cd","chunk-b423":"387c504c","chunk-bd5f":"e9509f10","chunk-e7c3":"e5df8ceb","chunk-f075":"315ceec1"}[e]+".js"}(e);var f=new Error;o=function(n){i.onerror=i.onload=null,clearTimeout(h);var t=u[e];if(0!==t){if(t){var r=n&&("load"===n.type?"missing":n.type),c=n&&n.target&&n.target.src;f.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",f.name="ChunkLoadError",f.type=r,f.request=c,t[1](f)}u[e]=void 0}};var h=setTimeout((function(){o({type:"timeout",target:i})}),12e4);i.onerror=i.onload=o,document.head.appendChild(i)}return Promise.all(n)},a.m=e,a.c=r,a.d=function(e,n,t){a.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,n){if(1&n&&(e=a(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)a.d(t,r,function(n){return e[n]}.bind(null,r));return t},a.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(n,"a",n),n},a.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},a.p="/admin/",a.oe=function(e){throw console.error(e),e};var i=window.webpackJsonp=window.webpackJsonp||[],f=i.push.bind(i);i.push=n,i=i.slice();for(var h=0;h<i.length;h++)n(i[h]);var l=f;t()}([]);</script><script src=/admin/static/js/chunk-elementUI.b0c99c08.js></script><script src=/admin/static/js/chunk-libs.06c38828.js></script><script src=/admin/static/js/app.03e8afa3.js></script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.el-table[data-v-0dfa1359] th{background-color:#343a40!important;border-color:#454d55;color:#fff}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.expandable-textarea{display:block;min-height:250px;min-width:250px;resize:both!important}.jsoneditor-vue img{border:1px solid #ddd;border-radius:4px;padding:5px;width:150px}.jsoneditor-vue img:hover{-webkit-box-shadow:0 0 2px 1px rgba(0,140,186,.5);box-shadow:0 0 2px 1px rgba(0,140,186,.5)}.jsoneditor-vue button.btn{font-size:14px!important;padding:3px}.jsoneditor-vue .form-control-label,label{font-weight:700}.jsoneditor-vue input[type=checkbox]{margin-right:5px;margin-top:3px}.error-message[data-v-3c5b79e9]{color:red}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.el-table[data-v-
|
|
1
|
+
.el-table[data-v-0dfa1359] th{background-color:#343a40!important;border-color:#454d55;color:#fff}.dashboard-container[data-v-5d163182]{margin:30px}.dashboard-text[data-v-5d163182]{font-size:30px;line-height:46px}a#settings-link[data-v-5d163182]{color:#35a;padding-left:25px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.expandable-textarea{display:block;min-height:250px;min-width:250px;resize:both!important}.jsoneditor-vue img{border:1px solid #ddd;border-radius:4px;padding:5px;width:150px}.jsoneditor-vue img:hover{-webkit-box-shadow:0 0 2px 1px rgba(0,140,186,.5);box-shadow:0 0 2px 1px rgba(0,140,186,.5)}.jsoneditor-vue button.btn{font-size:14px!important;padding:3px}.jsoneditor-vue .form-control-label,label{font-weight:700}.jsoneditor-vue input[type=checkbox]{margin-right:5px;margin-top:3px}.comment-link{margin-top:-15px}.error-message{color:red}
|
|
File without changes
|