@galadrim/galadmin 0.1.2 → 0.1.7
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/README.md +21 -0
- package/dist/api.d.ts +1 -1
- package/dist/api.js +48 -7
- package/dist/api.js.map +1 -1
- package/dist/index.js +20 -5
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/config.d.ts +25 -10
- package/package.json +4 -2
- package/src/api.ts +82 -43
- package/src/front/build/asset-manifest.json +7 -7
- package/src/front/build/index.html +1 -1
- package/src/front/build/static/js/{2.f7eb6c73.chunk.js → 2.778cdac1.chunk.js} +3 -3
- package/src/front/build/static/js/{2.f7eb6c73.chunk.js.LICENSE.txt → 2.778cdac1.chunk.js.LICENSE.txt} +0 -0
- package/src/front/build/static/js/2.778cdac1.chunk.js.map +1 -0
- package/src/front/build/static/js/main.906f8841.chunk.js +2 -0
- package/src/front/build/static/js/main.906f8841.chunk.js.map +1 -0
- package/src/front/node_modules/.cache/.eslintcache +1 -1
- package/src/front/node_modules/.cache/babel-loader/0568c20044caccc1c4bd148d4199ec33.json +1 -0
- package/src/front/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/a0/a5/02eb7c3686fc0b8b368d7571ac99d9057923ade02523769a0104df72645454c3abb5e1abd7959435a4592ccfc6f625105898092e038cb444bea039289fc9 +1 -0
- package/src/front/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/b0/07/00882278b9090f96b45cc0bfb7f173180669ecfe7e504f30ca9124259e5487022ce69cb10ae73fb72db53540ae644e6cb7c1307c0cb6072963cb97f4e27f +1 -0
- package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/87/08/421190bfe6e50816e059da6c33526c9943732ef856ebd2752d0cbfb4a852 +1 -1
- package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/bc/60/45a8cd3b5ff1c55a654323e4532eaa0218e186e53786ef1acf429ff046a5 +1 -1
- package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/ca/6b/9043d892787bfe3013fe0b053e83a97c9ac666f000bbc21783bbd242c158 +2 -0
- package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/e8/a0/0d48cce4b946fe50c4b6bf34f7e1a52058d2d785e0ff7d6f841b115a2f4a +1 -1
- package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/f3/67/591e18ebf4c0bef454dd26c51b3a6caca691338ed27811d59ddef26e7031 +2 -0
- package/src/front/src/components/inputs/FileInput.js +6 -3
- package/src/index.ts +22 -5
- package/src/types/config.ts +23 -6
- package/src/front/build/static/js/2.f7eb6c73.chunk.js.map +0 -1
- package/src/front/build/static/js/main.8f781ead.chunk.js +0 -2
- package/src/front/build/static/js/main.8f781ead.chunk.js.map +0 -1
package/src/api.ts
CHANGED
|
@@ -6,13 +6,14 @@ import * as path from "path";
|
|
|
6
6
|
import { S3, Endpoint } from "aws-sdk";
|
|
7
7
|
import sizeOf from "image-size"
|
|
8
8
|
import * as serializeJs from "serialize-javascript";
|
|
9
|
+
import * as SftpClient from 'ssh2-sftp-client';
|
|
9
10
|
|
|
10
11
|
import * as rollup from "rollup";
|
|
11
12
|
import babel from '@rollup/plugin-babel'
|
|
12
13
|
import resolve from '@rollup/plugin-node-resolve'
|
|
13
14
|
import axios from "axios";
|
|
14
15
|
|
|
15
|
-
export default (db, config) => {
|
|
16
|
+
export default (db, config, user) => {
|
|
16
17
|
const app = express();
|
|
17
18
|
|
|
18
19
|
async function getRecords(params) {
|
|
@@ -188,7 +189,12 @@ export default (db, config) => {
|
|
|
188
189
|
const { rows: records, queryString, input, error } = await getRecords({
|
|
189
190
|
table: view.tableName,
|
|
190
191
|
page: req.body.page,
|
|
191
|
-
filters: sqlAnd([
|
|
192
|
+
filters: sqlAnd([
|
|
193
|
+
view.filters,
|
|
194
|
+
req.body.subviewIndex !== undefined ? view.subviews[req.body.subviewIndex].filters : null,
|
|
195
|
+
...req.body.filters,
|
|
196
|
+
view.filtersFromUser ? view.filtersFromUser(user.userId) : null
|
|
197
|
+
]),
|
|
192
198
|
customQuery: view.customQuery,
|
|
193
199
|
join: view.join,
|
|
194
200
|
selectExpression: view.selectExpression,
|
|
@@ -427,7 +433,7 @@ export default (db, config) => {
|
|
|
427
433
|
|
|
428
434
|
app.post('/deleteRecords', async function (req, res, next) {
|
|
429
435
|
const view = config.views[req.body.viewIndex];
|
|
430
|
-
const { err } = await db.query(`DELETE FROM ?? WHERE ?? IN(${req.body.primaryValues.join(",")})`, [view.tableName, view.primaryId])
|
|
436
|
+
const { err } = await db.query(`DELETE FROM ?? WHERE ?? IN(${req.body.primaryValues.map(x => "'" + x + "'").join(",")})`, [view.tableName, view.primaryId])
|
|
431
437
|
if (err) {
|
|
432
438
|
return res.status(500).send(err);
|
|
433
439
|
}
|
|
@@ -524,8 +530,13 @@ export default (db, config) => {
|
|
|
524
530
|
})
|
|
525
531
|
|
|
526
532
|
app.post('/uploadFile', async function (req, res, next) {
|
|
527
|
-
|
|
528
|
-
|
|
533
|
+
const view = config.views[req.query.viewIndex as string];
|
|
534
|
+
const column = [
|
|
535
|
+
...view.columns,
|
|
536
|
+
...(view.recordViewPanels?.map(x => x?.createConfig?.columns)?.filter(x => x)?.flat() || [])
|
|
537
|
+
].find(x => x.__id__ == req.query.columnId)
|
|
538
|
+
if (column.s3Config) {
|
|
539
|
+
const s3Config = column.s3Config;
|
|
529
540
|
const form = new multiparty.Form();
|
|
530
541
|
const s3 = new S3({
|
|
531
542
|
endpoint: new Endpoint(s3Config.host),
|
|
@@ -547,56 +558,84 @@ export default (db, config) => {
|
|
|
547
558
|
const path = (s3Config.subfolder ? s3Config.subfolder + "/" : "") + Math.random().toString().substr(2) + "." + extension;
|
|
548
559
|
|
|
549
560
|
if (s3Config.signedUrlNeeded) {
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
})
|
|
563
|
-
.then(() => {
|
|
564
|
-
res.status(200).send({
|
|
565
|
-
path,
|
|
566
|
-
aspectRatio,
|
|
567
|
-
originalFilename: files.file[0].originalFilename,
|
|
568
|
-
});
|
|
569
|
-
})
|
|
570
|
-
.catch(e => {
|
|
571
|
-
res.status(500).send(e)
|
|
561
|
+
const signedUrl = s3.getSignedUrl('putObject', {
|
|
562
|
+
Bucket: s3Config.bucket,
|
|
563
|
+
Key: path,
|
|
564
|
+
ContentType: files.file[0].headers['content-type'],
|
|
565
|
+
Expires: 150,
|
|
566
|
+
});
|
|
567
|
+
axios.put(signedUrl, fs.readFileSync(files.file[0].path), {
|
|
568
|
+
maxContentLength: 100000000000,
|
|
569
|
+
maxBodyLength: 100000000000,
|
|
570
|
+
headers: {
|
|
571
|
+
ContentType: files.file[0].headers['content-type']
|
|
572
|
+
}
|
|
572
573
|
})
|
|
574
|
+
.then(() => {
|
|
575
|
+
res.status(200).send({
|
|
576
|
+
path,
|
|
577
|
+
aspectRatio,
|
|
578
|
+
originalFilename: files.file[0].originalFilename,
|
|
579
|
+
});
|
|
580
|
+
})
|
|
581
|
+
.catch(e => {
|
|
582
|
+
res.status(500).send(e)
|
|
583
|
+
})
|
|
573
584
|
} else {
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
585
|
+
s3.putObject({
|
|
586
|
+
Body: fs.readFileSync(files.file[0].path),
|
|
587
|
+
Bucket: s3Config.bucket,
|
|
588
|
+
ContentType: files.file[0].headers['content-type'],
|
|
589
|
+
ACL: 'public-read',
|
|
590
|
+
Key: path
|
|
591
|
+
}, function (err, data) {
|
|
592
|
+
if (err) return res.status(500).send(err);
|
|
593
|
+
res.send({
|
|
594
|
+
path,
|
|
595
|
+
aspectRatio,
|
|
596
|
+
originalFilename: files.file[0].originalFilename
|
|
597
|
+
})
|
|
598
|
+
});
|
|
588
599
|
}
|
|
589
600
|
})
|
|
601
|
+
} else if (column.sftpConfig) {
|
|
602
|
+
if (!column.publicPath) {
|
|
603
|
+
return res.status(500).send("You need to pass publicPath parameter when using sftpConfig");
|
|
604
|
+
}
|
|
605
|
+
const form = new multiparty.Form();
|
|
606
|
+
form.parse(req, function (err, fields, files) {
|
|
607
|
+
if (err) {
|
|
608
|
+
return res.status(500).send(err);
|
|
609
|
+
}
|
|
610
|
+
const pathSplitted = files.file[0].path.split(/[\/\\]+/);
|
|
611
|
+
const filename = pathSplitted[pathSplitted.length - 1];
|
|
612
|
+
(async () => {
|
|
613
|
+
const sftp = new SftpClient();
|
|
614
|
+
await sftp.connect({
|
|
615
|
+
host: column.sftpConfig.host,
|
|
616
|
+
port: 22,
|
|
617
|
+
username: column.sftpConfig.user,
|
|
618
|
+
password: column.sftpConfig.password
|
|
619
|
+
});
|
|
620
|
+
await sftp.fastPut(files.file[0].path, column.publicPath + (column.subdirectory ? "/" + column.subdirectory : "") + "/" + filename);
|
|
621
|
+
await sftp.end();
|
|
622
|
+
res.send({
|
|
623
|
+
path: filename,
|
|
624
|
+
originalFilename: files.file[0].originalFilename
|
|
625
|
+
})
|
|
626
|
+
fs.unlinkSync(files.file[0].path)
|
|
627
|
+
})();
|
|
628
|
+
})
|
|
590
629
|
} else {
|
|
591
630
|
const form = new multiparty.Form({
|
|
592
|
-
uploadDir: (
|
|
631
|
+
uploadDir: (column.publicPath as string) + (column.subdirectory as string)
|
|
593
632
|
});
|
|
594
633
|
form.parse(req, function (err, fields, files) {
|
|
595
634
|
if (err) {
|
|
596
635
|
return res.status(500).send(err);
|
|
597
636
|
}
|
|
598
637
|
res.send({
|
|
599
|
-
path: files.file[0].path.replace(
|
|
638
|
+
path: files.file[0].path.replace(column.publicPath, ""),
|
|
600
639
|
originalFilename: files.file[0].originalFilename
|
|
601
640
|
})
|
|
602
641
|
})
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
3
|
"main.css": "/_HOMEPAGE_/static/css/main.6cc4d508.chunk.css",
|
|
4
|
-
"main.js": "/_HOMEPAGE_/static/js/main.
|
|
5
|
-
"main.js.map": "/_HOMEPAGE_/static/js/main.
|
|
4
|
+
"main.js": "/_HOMEPAGE_/static/js/main.906f8841.chunk.js",
|
|
5
|
+
"main.js.map": "/_HOMEPAGE_/static/js/main.906f8841.chunk.js.map",
|
|
6
6
|
"runtime-main.js": "/_HOMEPAGE_/static/js/runtime-main.2084140f.js",
|
|
7
7
|
"runtime-main.js.map": "/_HOMEPAGE_/static/js/runtime-main.2084140f.js.map",
|
|
8
|
-
"static/js/2.
|
|
9
|
-
"static/js/2.
|
|
8
|
+
"static/js/2.778cdac1.chunk.js": "/_HOMEPAGE_/static/js/2.778cdac1.chunk.js",
|
|
9
|
+
"static/js/2.778cdac1.chunk.js.map": "/_HOMEPAGE_/static/js/2.778cdac1.chunk.js.map",
|
|
10
10
|
"index.html": "/_HOMEPAGE_/index.html",
|
|
11
11
|
"static/css/main.6cc4d508.chunk.css.map": "/_HOMEPAGE_/static/css/main.6cc4d508.chunk.css.map",
|
|
12
|
-
"static/js/2.
|
|
12
|
+
"static/js/2.778cdac1.chunk.js.LICENSE.txt": "/_HOMEPAGE_/static/js/2.778cdac1.chunk.js.LICENSE.txt",
|
|
13
13
|
"static/media/App.css": "/_HOMEPAGE_/static/media/gt-eesti-regular.304a7ae0.woff",
|
|
14
14
|
"static/media/logo.e407b9ca.png": "/_HOMEPAGE_/static/media/logo.e407b9ca.png"
|
|
15
15
|
},
|
|
16
16
|
"entrypoints": [
|
|
17
17
|
"static/js/runtime-main.2084140f.js",
|
|
18
|
-
"static/js/2.
|
|
18
|
+
"static/js/2.778cdac1.chunk.js",
|
|
19
19
|
"static/css/main.6cc4d508.chunk.css",
|
|
20
|
-
"static/js/main.
|
|
20
|
+
"static/js/main.906f8841.chunk.js"
|
|
21
21
|
]
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="fr"><head><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script><script src="https://momentjs.com/downloads/moment-timezone-with-data-10-year-range.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/locale/fr.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/datepicker.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/i18n/datepicker.fr.min.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/downloadjs/1.4.8/download.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script><script async="async" defer="defer" src="https://cdn.jsdelivr.net/npm/sweetalert"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.min.js"></script><script src="https://sdk.amazonaws.com/js/aws-sdk-2.606.0.min.js"></script><script src="https://kit.fontawesome.com/75b28933ed.js" crossorigin="anonymous" async="async" defer="defer"></script><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/css/datepicker.min.css"/><link rel="stylesheet" href="/_HOMEPAGE_/spectrum.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.snow.min.css"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta charset="utf-8"/><link rel="icon" href="/_HOMEPAGE_/favicon.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/_HOMEPAGE_/manifest.json"/><title>Back-office</title><link href="/_HOMEPAGE_/static/css/main.6cc4d508.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,l,a=r[0],f=r[1],i=r[2],c=0,s=[];c<a.length;c++)l=a[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,i||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var f=t[a];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/_HOMEPAGE_/";var a=this["webpackJsonpgaladmin-front"]=this["webpackJsonpgaladmin-front"]||[],f=a.push.bind(a);a.push=r,a=a.slice();for(var i=0;i<a.length;i++)r(a[i]);var p=f;t()}([])</script><script src="/_HOMEPAGE_/static/js/2.
|
|
1
|
+
<!doctype html><html lang="fr"><head><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script><script src="https://momentjs.com/downloads/moment-timezone-with-data-10-year-range.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/locale/fr.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/datepicker.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/i18n/datepicker.fr.min.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/downloadjs/1.4.8/download.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script><script async="async" defer="defer" src="https://cdn.jsdelivr.net/npm/sweetalert"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.min.js"></script><script src="https://sdk.amazonaws.com/js/aws-sdk-2.606.0.min.js"></script><script src="https://kit.fontawesome.com/75b28933ed.js" crossorigin="anonymous" async="async" defer="defer"></script><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/css/datepicker.min.css"/><link rel="stylesheet" href="/_HOMEPAGE_/spectrum.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.snow.min.css"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta charset="utf-8"/><link rel="icon" href="/_HOMEPAGE_/favicon.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/_HOMEPAGE_/manifest.json"/><title>Back-office</title><link href="/_HOMEPAGE_/static/css/main.6cc4d508.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,l,a=r[0],f=r[1],i=r[2],c=0,s=[];c<a.length;c++)l=a[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,i||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var f=t[a];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/_HOMEPAGE_/";var a=this["webpackJsonpgaladmin-front"]=this["webpackJsonpgaladmin-front"]||[],f=a.push.bind(a);a.push=r,a=a.slice();for(var i=0;i<a.length;i++)r(a[i]);var p=f;t()}([])</script><script src="/_HOMEPAGE_/static/js/2.778cdac1.chunk.js"></script><script src="/_HOMEPAGE_/static/js/main.906f8841.chunk.js"></script></body></html>
|