@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.
Files changed (32) hide show
  1. package/README.md +21 -0
  2. package/dist/api.d.ts +1 -1
  3. package/dist/api.js +48 -7
  4. package/dist/api.js.map +1 -1
  5. package/dist/index.js +20 -5
  6. package/dist/index.js.map +1 -1
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/dist/types/config.d.ts +25 -10
  9. package/package.json +4 -2
  10. package/src/api.ts +82 -43
  11. package/src/front/build/asset-manifest.json +7 -7
  12. package/src/front/build/index.html +1 -1
  13. package/src/front/build/static/js/{2.f7eb6c73.chunk.js → 2.778cdac1.chunk.js} +3 -3
  14. package/src/front/build/static/js/{2.f7eb6c73.chunk.js.LICENSE.txt → 2.778cdac1.chunk.js.LICENSE.txt} +0 -0
  15. package/src/front/build/static/js/2.778cdac1.chunk.js.map +1 -0
  16. package/src/front/build/static/js/main.906f8841.chunk.js +2 -0
  17. package/src/front/build/static/js/main.906f8841.chunk.js.map +1 -0
  18. package/src/front/node_modules/.cache/.eslintcache +1 -1
  19. package/src/front/node_modules/.cache/babel-loader/0568c20044caccc1c4bd148d4199ec33.json +1 -0
  20. package/src/front/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/a0/a5/02eb7c3686fc0b8b368d7571ac99d9057923ade02523769a0104df72645454c3abb5e1abd7959435a4592ccfc6f625105898092e038cb444bea039289fc9 +1 -0
  21. package/src/front/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/b0/07/00882278b9090f96b45cc0bfb7f173180669ecfe7e504f30ca9124259e5487022ce69cb10ae73fb72db53540ae644e6cb7c1307c0cb6072963cb97f4e27f +1 -0
  22. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/87/08/421190bfe6e50816e059da6c33526c9943732ef856ebd2752d0cbfb4a852 +1 -1
  23. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/bc/60/45a8cd3b5ff1c55a654323e4532eaa0218e186e53786ef1acf429ff046a5 +1 -1
  24. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/ca/6b/9043d892787bfe3013fe0b053e83a97c9ac666f000bbc21783bbd242c158 +2 -0
  25. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/e8/a0/0d48cce4b946fe50c4b6bf34f7e1a52058d2d785e0ff7d6f841b115a2f4a +1 -1
  26. package/src/front/node_modules/.cache/terser-webpack-plugin/index-v5/f3/67/591e18ebf4c0bef454dd26c51b3a6caca691338ed27811d59ddef26e7031 +2 -0
  27. package/src/front/src/components/inputs/FileInput.js +6 -3
  28. package/src/index.ts +22 -5
  29. package/src/types/config.ts +23 -6
  30. package/src/front/build/static/js/2.f7eb6c73.chunk.js.map +0 -1
  31. package/src/front/build/static/js/main.8f781ead.chunk.js +0 -2
  32. 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([view.filters, req.body.subviewIndex !== undefined ? view.subviews[req.body.subviewIndex].filters : null].concat(req.body.filters)),
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
- if (req.query.s3Config && req.query.s3Config != "undefined") {
528
- const s3Config = JSON.parse(req.query.s3Config as string)
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
- const signedUrl = s3.getSignedUrl('putObject', {
551
- Bucket: s3Config.bucket,
552
- Key: path,
553
- ContentType: files.file[0].headers['content-type'],
554
- Expires: 150,
555
- });
556
- axios.put(signedUrl, fs.readFileSync(files.file[0].path), {
557
- maxContentLength: 100000000000,
558
- maxBodyLength: 100000000000,
559
- headers: {
560
- ContentType: files.file[0].headers['content-type']
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
- s3.putObject({
575
- Body: fs.readFileSync(files.file[0].path),
576
- Bucket: s3Config.bucket,
577
- ContentType: files.file[0].headers['content-type'],
578
- ACL: 'public-read',
579
- Key: path
580
- }, function (err, data) {
581
- if (err) return res.status(500).send(err);
582
- res.send({
583
- path,
584
- aspectRatio,
585
- originalFilename: files.file[0].originalFilename
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: (req.query.publicPath as string) + (req.query.subdirectory as string)
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(req.query.publicPath, ""),
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.8f781ead.chunk.js",
5
- "main.js.map": "/_HOMEPAGE_/static/js/main.8f781ead.chunk.js.map",
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.f7eb6c73.chunk.js": "/_HOMEPAGE_/static/js/2.f7eb6c73.chunk.js",
9
- "static/js/2.f7eb6c73.chunk.js.map": "/_HOMEPAGE_/static/js/2.f7eb6c73.chunk.js.map",
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.f7eb6c73.chunk.js.LICENSE.txt": "/_HOMEPAGE_/static/js/2.f7eb6c73.chunk.js.LICENSE.txt",
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.f7eb6c73.chunk.js",
18
+ "static/js/2.778cdac1.chunk.js",
19
19
  "static/css/main.6cc4d508.chunk.css",
20
- "static/js/main.8f781ead.chunk.js"
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.f7eb6c73.chunk.js"></script><script src="/_HOMEPAGE_/static/js/main.8f781ead.chunk.js"></script></body></html>
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>