@tasenor/common-plugins 1.12.0 → 1.13.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.
Files changed (68) hide show
  1. package/.turbo/turbo-audit.log +24 -0
  2. package/.turbo/turbo-build.log +1 -1
  3. package/.turbo/turbo-ci.log +2 -2
  4. package/.turbo/turbo-fix.log +3 -3
  5. package/.turbo/turbo-lint.log +1 -14
  6. package/.turbo/turbo-nightly.log +3 -3
  7. package/.turbo/turbo-nightly3.log +24 -24
  8. package/.turbo/turbo-show-version.log +6 -5
  9. package/data/PluginIndex.mjs +3 -0
  10. package/data/src/Expense Tree - Definitions.tsv +10 -1
  11. package/dist/AssetReport/backend/index.js +1 -1
  12. package/dist/CoinbaseImport/backend/CoinbaseHandler.d.ts +1 -0
  13. package/dist/CoinbaseImport/backend/CoinbaseHandler.js +35 -9
  14. package/dist/CoinbaseImport/backend/CoinbaseHandler.js.map +1 -1
  15. package/dist/CoinbaseImport/backend/index.js +1 -1
  16. package/dist/DocumentCleaner/ui/index.js +9 -0
  17. package/dist/DocumentCleaner/ui/index.js.map +1 -1
  18. package/dist/Finnish/backend/index.d.ts +5 -0
  19. package/dist/Finnish/backend/index.js +17 -0
  20. package/dist/Finnish/backend/index.js.map +1 -0
  21. package/dist/Finnish/common/FinnishHandler.d.ts +11 -0
  22. package/dist/Finnish/common/FinnishHandler.js +41 -0
  23. package/dist/Finnish/common/FinnishHandler.js.map +1 -0
  24. package/dist/Finnish/{ui → common}/finnish.json +19 -10
  25. package/dist/Finnish/ui/index.d.ts +2 -6
  26. package/dist/Finnish/ui/index.js +6 -36
  27. package/dist/Finnish/ui/index.js.map +1 -1
  28. package/dist/GitBackup/backend/index.d.ts +26 -2
  29. package/dist/GitBackup/backend/index.js +132 -17
  30. package/dist/GitBackup/backend/index.js.map +1 -1
  31. package/dist/GitBackup/common/types.d.ts +10 -0
  32. package/dist/GitBackup/common/types.js +2 -0
  33. package/dist/GitBackup/common/types.js.map +1 -0
  34. package/dist/GitBackup/ui/index.d.ts +13 -1
  35. package/dist/GitBackup/ui/index.js +112 -25
  36. package/dist/GitBackup/ui/index.js.map +1 -1
  37. package/dist/IncomeAndExpenses/backend/index.js +14 -0
  38. package/dist/IncomeAndExpenses/backend/index.js.map +1 -1
  39. package/dist/JournalReport/backend/index.js +10 -2
  40. package/dist/JournalReport/backend/index.js.map +1 -1
  41. package/dist/LedgerReport/backend/index.js +8 -2
  42. package/dist/LedgerReport/backend/index.js.map +1 -1
  43. package/dist/TagEditor/ui/index.js +2 -2
  44. package/dist/TagEditor/ui/index.js.map +1 -1
  45. package/dist/TickerData/backend/index.js +1 -2
  46. package/dist/TickerData/backend/index.js.map +1 -1
  47. package/dist/VAT/ui/index.js.map +1 -1
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.js +2 -0
  50. package/dist/index.js.map +1 -1
  51. package/package.json +10 -10
  52. package/src/CoinbaseImport/backend/CoinbaseHandler.ts +37 -9
  53. package/src/CoinbaseImport/backend/index.ts +1 -1
  54. package/src/CoinbaseImport/backend/rules.json +107 -0
  55. package/src/DocumentCleaner/ui/index.tsx +10 -0
  56. package/src/Finnish/backend/index.ts +21 -0
  57. package/src/Finnish/common/FinnishHandler.ts +50 -0
  58. package/src/Finnish/{ui → common}/finnish.json +15 -10
  59. package/src/Finnish/ui/index.tsx +5 -44
  60. package/src/GitBackup/ui/index.tsx +1 -1
  61. package/src/IncomeAndExpenses/backend/expense.json +23 -3
  62. package/src/IncomeAndExpenses/backend/index.ts +14 -0
  63. package/src/JournalReport/backend/index.ts +10 -2
  64. package/src/LedgerReport/backend/index.ts +8 -2
  65. package/src/TickerData/backend/cryptocurrencies.json +2 -1
  66. package/src/TickerData/backend/index.ts +1 -3
  67. package/src/VAT/ui/index.tsx +2 -2
  68. package/src/index.ts +2 -0
@@ -1,46 +1,16 @@
1
- import dayjs from 'dayjs';
2
- import { sprintf } from 'sprintf-js';
3
- import FI from './finnish.json';
4
- import { LanguagePlugin } from '@tasenor/common-ui';
5
- class Finnish extends LanguagePlugin {
1
+ import { LanguageUiPlugin } from '@tasenor/common-ui';
2
+ import FinnishHandler from '../common/FinnishHandler';
3
+ class Finnish extends LanguageUiPlugin {
6
4
  static code = 'Finnish';
7
5
  static title = 'Finnish';
8
- static version = '1.0.65';
6
+ static version = '1.0.66';
9
7
  static icon = '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12.36 6H7v6h7.24l.4 2H18V8h-5.24z" opacity=".3"/><path d="M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6h-5.6zm3.6 8h-3.36l-.4-2H7V6h5.36l.4 2H18v6z"/></svg>';
10
8
  static releaseDate = '2023-06-10';
11
- static use = 'ui';
9
+ static use = 'both';
12
10
  static type = 'language';
13
11
  static description = 'Finnish translation of the application.';
14
12
  constructor() {
15
- super();
16
- this.languages = {
17
- fi: FI
18
- };
19
- }
20
- getLanguages() {
21
- return new Set(['fi']);
22
- }
23
- flag() {
24
- return 'fi';
25
- }
26
- date2str(date) {
27
- return dayjs(date).format('DD.MM.YYYY');
28
- }
29
- str2date(str, sample = null) {
30
- sample = sample ? new Date(sample) : new Date();
31
- let year, month, day;
32
- if (!/^\d{1,2}(\.\d{1,2}(\.\d{1,4})?)?$/.test(str)) {
33
- return undefined;
34
- }
35
- [day, month, year] = str.split('.');
36
- day = parseInt(day);
37
- month = parseInt(month) || (sample.getMonth() + 1);
38
- year = parseInt(year) || sample.getFullYear();
39
- if (year < 100) {
40
- year += 2000;
41
- }
42
- const date = dayjs(sprintf('%04d-%02d-%02d', year, month, day));
43
- return date.isValid() ? date.format('YYYY-MM-DD') : undefined;
13
+ super(new FinnishHandler());
44
14
  }
45
15
  }
46
16
  export default Finnish;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Finnish/ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,MAAM,OAAQ,SAAQ,cAAc;IAElC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAA;IACvB,MAAM,CAAC,KAAK,GAAG,SAAS,CAAA;IACxB,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAA;IACzB,MAAM,CAAC,IAAI,GAAG,2SAA2S,CAAA;IACzT,MAAM,CAAC,WAAW,GAAG,YAAY,CAAA;IACjC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAA;IACjB,MAAM,CAAC,IAAI,GAAG,UAAU,CAAA;IACxB,MAAM,CAAC,WAAW,GAAG,yCAAyC,CAAA;IAE9D;QACE,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,SAAS,GAAG;YACf,EAAE,EAAE,EAAE;SACP,CAAA;IACH,CAAC;IAED,YAAY;QACV,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACxB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ,CAAC,IAAI;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACzC,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,SAAsB,IAAI;QACtC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAA;QAC/C,IAAI,IAAI,EAAE,KAAK,EAAE,GAAG,CAAA;QACpB,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAClD,OAAO,SAAS,CAAA;SACjB;QACD,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACnC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QACnB,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;QAClD,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAA;QAC7C,IAAI,IAAI,GAAG,GAAG,EAAE;YACd,IAAI,IAAI,IAAI,CAAA;SACb;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/D,CAAC;;AAGH,eAAe,OAAO,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Finnish/ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,cAAc,MAAM,0BAA0B,CAAA;AAErD,MAAM,OAAQ,SAAQ,gBAAgB;IACpC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAA;IACvB,MAAM,CAAC,KAAK,GAAG,SAAS,CAAA;IACxB,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAA;IACzB,MAAM,CAAC,IAAI,GAAG,2SAA2S,CAAA;IACzT,MAAM,CAAC,WAAW,GAAG,YAAY,CAAA;IACjC,MAAM,CAAC,GAAG,GAAG,MAAM,CAAA;IACnB,MAAM,CAAC,IAAI,GAAG,UAAU,CAAA;IACxB,MAAM,CAAC,WAAW,GAAG,yCAAyC,CAAA;IAE9D;QACE,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC,CAAA;IAC7B,CAAC;;AAGH,eAAe,OAAO,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { KnexDatabase, ToolPlugin } from '@tasenor/common-node';
2
- import { DirectoryPath } from '@tasenor/common';
2
+ import { GitBackupCommit } from '../common/types';
3
3
  declare class GitBackup extends ToolPlugin {
4
4
  constructor();
5
5
  /**
@@ -14,13 +14,37 @@ declare class GitBackup extends ToolPlugin {
14
14
  * Create manual dump.
15
15
  */
16
16
  POST(db: KnexDatabase, data: any): Promise<unknown>;
17
+ /**
18
+ * List of the latest backup commits.
19
+ */
20
+ GET(db: KnexDatabase, data: any): Promise<unknown>;
21
+ /**
22
+ * Restore from the backup.
23
+ */
24
+ PUT(db: KnexDatabase, data: any): Promise<unknown>;
25
+ /**
26
+ * A helper to check settings and set up repository for further use.
27
+ */
28
+ private setupRepository;
29
+ /**
30
+ * Get a list of commits.
31
+ */
32
+ collectCommits(db: KnexDatabase, limit: number): Promise<GitBackupCommit[]>;
17
33
  /**
18
34
  * Execute backup making for a database.
19
35
  */
20
36
  makeBackup(db: KnexDatabase, message: string): Promise<boolean>;
37
+ /**
38
+ * Read in database from the give giot hash.
39
+ */
40
+ restoreBackup(db: KnexDatabase, commit: string): Promise<boolean>;
21
41
  /**
22
42
  * Write the data from the database to the directory.
23
43
  */
24
- dump(db: KnexDatabase, dir: DirectoryPath): Promise<void>;
44
+ private dump;
45
+ /**
46
+ * Read the data to the database from the directory.
47
+ */
48
+ private restore;
25
49
  }
26
50
  export default GitBackup;
@@ -1,13 +1,18 @@
1
- import { GitRepo, systemPiped, TasenorExporter, ToolPlugin } from '@tasenor/common-node';
2
- import { error, log, note } from '@tasenor/common';
1
+ import { BookkeeperImporter, GitRepo, systemPiped, TasenorExporter, ToolPlugin } from '@tasenor/common-node';
2
+ import { error, log, note, validGitRepoName } from '@tasenor/common';
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
+ // TODO: Master branch should be configurable.
6
+ // Branch.
7
+ const BRANCH = 'main';
8
+ // Mainly for temporary testing with file:/// repository.
9
+ const ALLOW_BAD_REPOSITORY = false;
5
10
  class GitBackup extends ToolPlugin {
6
11
  constructor() {
7
12
  super();
8
13
  this.code = 'GitBackup';
9
14
  this.title = 'Backup for Git';
10
- this.version = '1.0.2';
15
+ this.version = '1.0.4';
11
16
  this.icon = '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path></svg>';
12
17
  this.releaseDate = '2022-12-12';
13
18
  this.use = 'both';
@@ -40,33 +45,133 @@ class GitBackup extends ToolPlugin {
40
45
  return { success: false };
41
46
  }
42
47
  /**
43
- * Execute backup making for a database.
48
+ * List of the latest backup commits.
44
49
  */
45
- async makeBackup(db, message) {
50
+ async GET(db, data) {
51
+ if (typeof data === 'object' && data !== null && data.type === 'commits') {
52
+ const commits = await this.collectCommits(db, data.count || 10);
53
+ return { success: true, data: { commits } };
54
+ }
55
+ return { success: false };
56
+ }
57
+ /**
58
+ * Restore from the backup.
59
+ */
60
+ async PUT(db, data) {
61
+ if (typeof data === 'object' && data !== null && !!data.commit) {
62
+ const success = await this.restoreBackup(db, data.commit);
63
+ return { success };
64
+ }
65
+ return { success: false };
66
+ }
67
+ /**
68
+ * A helper to check settings and set up repository for further use.
69
+ */
70
+ async setupRepository(db) {
46
71
  const workDir = this.getWorkSpace(db);
47
72
  const repository = await this.getSetting(db, 'repository');
48
73
  const subDirectory = await this.getSetting(db, 'subDirectory');
74
+ const sshPrivateKey = await this.getSetting(db, 'sshPrivateKey');
49
75
  // Skip if not configured for use.
50
76
  if (repository === undefined || subDirectory === undefined) {
51
- return false;
77
+ error('Cannot make backup since no repository or subdirectory configured.');
78
+ return null;
79
+ }
80
+ // Check repo URL.
81
+ if (!ALLOW_BAD_REPOSITORY && !validGitRepoName(repository)) {
82
+ error(`Bad repository address ${JSON.stringify(repository)}.`);
83
+ return null;
52
84
  }
85
+ // Set up SSH if needed.
86
+ const sshPath = path.join(workDir, 'ssh.key');
87
+ fs.writeFileSync(sshPath, '');
88
+ fs.chmodSync(sshPath, 0o600);
89
+ if (sshPrivateKey) {
90
+ fs.appendFileSync(sshPath, sshPrivateKey);
91
+ fs.appendFileSync(sshPath, '\n');
92
+ }
93
+ // Verify the resulting work directory.
53
94
  const repoName = GitRepo.defaultName(repository);
54
95
  if (!this.isValidWritePath(db, workDir, repoName, subDirectory)) {
55
- error(`A sub directory '${subDirectory}' does not produce valide allowed work directory for backup in DB '${db.client.config.connection.database}'.`);
96
+ error(`A sub directory '${subDirectory}' does not produce valid allowed work directory for backup in DB '${db.client.config.connection.database}'.`);
97
+ return null;
98
+ }
99
+ const backupDir = path.join(workDir, repoName, subDirectory);
100
+ // Instantiate and configure Git.
101
+ const repo = await GitRepo.get(repository, workDir);
102
+ if (!repo) {
103
+ error(`Failed to establish git repository instance '${repository}' into ${workDir}.`);
104
+ return null;
105
+ }
106
+ repo.branch = BRANCH;
107
+ repo.configure({
108
+ name: 'Tasenor',
109
+ email: 'communications.tasenor@gmail.com',
110
+ sshPrivateKey: sshPrivateKey ? sshPath : null,
111
+ });
112
+ return {
113
+ workDir, repository, subDirectory, sshPrivateKey, sshPath, backupDir, repo
114
+ };
115
+ }
116
+ /**
117
+ * Get a list of commits.
118
+ */
119
+ async collectCommits(db, limit) {
120
+ const setup = await this.setupRepository(db);
121
+ if (!setup) {
122
+ return [];
123
+ }
124
+ const { repo } = setup;
125
+ log(`Fetching commit list for DB '${db.client.config.connection.database}'.`);
126
+ await repo.update();
127
+ try {
128
+ const gitLog = await repo.git.log({ maxCount: limit });
129
+ return gitLog.all.map(e => ({
130
+ hash: e.hash,
131
+ date: e.date,
132
+ message: e.message,
133
+ author: `${e.author_name} ${e.author_email ? '<' + e.author_email + '>' : ''}`.trim()
134
+ }));
135
+ }
136
+ catch (err) {
137
+ error(`Failed to get log from git repository for DB '${db.client.config.connection.database}'.`);
138
+ return [];
139
+ }
140
+ }
141
+ /**
142
+ * Execute backup making for a database.
143
+ */
144
+ async makeBackup(db, message) {
145
+ const setup = await this.setupRepository(db);
146
+ if (!setup) {
56
147
  return false;
57
148
  }
58
- else {
59
- log(`Making a backup into '${subDirectory}' of DB '${db.client.config.connection.database}'.`);
60
- const repo = await GitRepo.get(repository, workDir);
61
- if (repo) {
62
- repo.configure('Tasenor', 'tasenor@gmail.com');
63
- const backupDir = path.join(workDir, repoName, subDirectory);
64
- await this.dump(db, backupDir);
65
- await repo.put(message, subDirectory);
66
- return true;
67
- }
149
+ const { subDirectory, repo, backupDir } = setup;
150
+ log(`Making a backup into '${subDirectory}' of DB '${db.client.config.connection.database}'.`);
151
+ await repo.update();
152
+ await this.dump(db, backupDir);
153
+ return repo.put(message, subDirectory);
154
+ }
155
+ /**
156
+ * Read in database from the give giot hash.
157
+ */
158
+ async restoreBackup(db, commit) {
159
+ const setup = await this.setupRepository(db);
160
+ if (!setup) {
68
161
  return false;
69
162
  }
163
+ const { repo, backupDir } = setup;
164
+ log(`Restoting a backup into '${backupDir}' for DB '${db.client.config.connection.database}' from hash '${commit}'.`);
165
+ await repo.update();
166
+ try {
167
+ await repo.git.checkout(commit);
168
+ }
169
+ catch (err) {
170
+ error(`Checking out the hash '${commit}' failed: ${err}`);
171
+ return false;
172
+ }
173
+ await this.restore(db, backupDir);
174
+ return true;
70
175
  }
71
176
  /**
72
177
  * Write the data from the database to the directory.
@@ -79,6 +184,9 @@ class GitBackup extends ToolPlugin {
79
184
  }
80
185
  const exportDir = path.join(dir, 'export');
81
186
  fs.mkdirSync(exportDir, { recursive: true });
187
+ // This dump.sql is not really needed, but it is kind of safety net for failures
188
+ // in export and import code. It helps to rebuild database manually, if all else
189
+ // fails.
82
190
  // TODO: Check for pg_dump crash. What if that happens?
83
191
  const { host, port, database, user, password } = db.client.config.connection;
84
192
  const url = `postgresql://${user}:${password}@${host}:${port}/${database}`;
@@ -86,6 +194,13 @@ class GitBackup extends ToolPlugin {
86
194
  const exporter = new TasenorExporter();
87
195
  await exporter.dump(db, exportDir);
88
196
  }
197
+ /**
198
+ * Read the data to the database from the directory.
199
+ */
200
+ async restore(db, dir) {
201
+ const importer = new BookkeeperImporter();
202
+ await importer.restoreUser(db, path.join(dir, 'export'));
203
+ }
89
204
  }
90
205
  export default GitBackup;
91
206
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/backend/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/backend/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Timestring } from '@tasenor/common';
2
+ /**
3
+ * Commit data.
4
+ */
5
+ export interface GitBackupCommit {
6
+ hash: string;
7
+ date: Timestring;
8
+ message: string;
9
+ author: string;
10
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/GitBackup/common/types.ts"],"names":[],"mappings":""}
@@ -2,6 +2,8 @@
2
2
  import { ToolPlugin } from '@tasenor/common-ui';
3
3
  declare class GitBackup extends ToolPlugin {
4
4
  busy: boolean;
5
+ commits: never[];
6
+ backups: number;
5
7
  static code: string;
6
8
  static title: string;
7
9
  static version: string;
@@ -16,7 +18,7 @@ declare class GitBackup extends ToolPlugin {
16
18
  disabled: boolean;
17
19
  }[];
18
20
  toolTitle(): string;
19
- onMakeBackup(): Promise<void>;
21
+ onMakeBackup(message: string): Promise<void>;
20
22
  toolTopPanel(): JSX.Element;
21
23
  toolMainPanel(): JSX.Element;
22
24
  getSettings(): {
@@ -27,6 +29,15 @@ declare class GitBackup extends ToolPlugin {
27
29
  actions: {
28
30
  onClick?: undefined;
29
31
  };
32
+ multiline?: undefined;
33
+ label?: undefined;
34
+ } | {
35
+ type: string;
36
+ name: string;
37
+ multiline: boolean;
38
+ actions: {
39
+ onClick?: undefined;
40
+ };
30
41
  label?: undefined;
31
42
  } | {
32
43
  type: string;
@@ -38,6 +49,7 @@ declare class GitBackup extends ToolPlugin {
38
49
  };
39
50
  };
40
51
  name?: undefined;
52
+ multiline?: undefined;
41
53
  })[];
42
54
  };
43
55
  }
@@ -1,12 +1,85 @@
1
- import React from 'react';
2
- import { Note, IconButton, SubPanel, ToolPlugin } from '@tasenor/common-ui';
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+ import { Note, IconButton, SubPanel, ToolPlugin, Dialog, Localize } from '@tasenor/common-ui';
3
3
  import { makeObservable, observable, runInAction } from 'mobx';
4
- import { Trans } from 'react-i18next';
4
+ import { Trans, useTranslation } from 'react-i18next';
5
+ import { Box, Table, TableBody, TableCell, TableContainer, TableRow, TextField, Typography } from '@mui/material';
6
+ import { useNavigate } from 'react-router-dom';
7
+ function MakeBackupIcon(props) {
8
+ const { disabled, onMakeBackup } = props;
9
+ const [askMessage, setAskMessage] = useState(false);
10
+ const [message, setMessage] = useState('');
11
+ const { t } = useTranslation();
12
+ const val = useRef(message); // For some reason the message is not up to date when enter pressed on dialog.
13
+ return React.createElement(React.Fragment, null,
14
+ React.createElement(Dialog, { wider: true, isVisible: askMessage, title: t('Comment for Git Commit'), onClose: () => setAskMessage(false), onConfirm: () => onMakeBackup(val.current.trim()) },
15
+ React.createElement(TextField, { fullWidth: true, autoFocus: true, value: val.current, onChange: (e) => { setMessage(e.target.value); val.current = e.target.value; } })),
16
+ React.createElement(IconButton, { id: "Make Backup", disabled: disabled, onClick: () => setAskMessage(true), title: "summarize-make-backup", icon: "save" }));
17
+ }
18
+ function BackupCommitList(props) {
19
+ const { store, backups } = props;
20
+ const [commits, setCommits] = useState([]);
21
+ const [fetched, setFetched] = useState(false);
22
+ const [restore, setRestore] = useState(null);
23
+ const { t } = useTranslation();
24
+ // TODO: Use from common-ui once more useful.
25
+ const navigate = useNavigate();
26
+ useEffect(() => {
27
+ if (!store.db) {
28
+ return;
29
+ }
30
+ store.request(`/db/${store.db}/tools/${GitBackup.code}`, 'GET', { type: 'commits', count: 20 }).then((res) => {
31
+ setFetched(true);
32
+ if (res.success) {
33
+ setCommits(res.data.commits);
34
+ }
35
+ });
36
+ }, [store.db, backups]);
37
+ const onRestore = (commit) => {
38
+ store.request(`/db/${store.db}/tools/${GitBackup.code}`, 'PUT', { commit: commit.hash }).then((res) => {
39
+ if (res && res.success) {
40
+ store.addMessage(t('Backup restored successfully.'));
41
+ runInAction(() => {
42
+ store.setDb(null).then(() => {
43
+ navigate(`/${store.db}`);
44
+ });
45
+ });
46
+ }
47
+ else {
48
+ store.addError(t('Restoring backup failed.'));
49
+ }
50
+ });
51
+ };
52
+ if (fetched && commits.length === 0) {
53
+ return React.createElement(Box, null,
54
+ React.createElement(Trans, null, "Not able to find any commits from the repository."));
55
+ }
56
+ return React.createElement(Box, null,
57
+ React.createElement(TableContainer, null,
58
+ React.createElement(Table, null,
59
+ React.createElement(TableBody, null, commits.map((commit, idx) => React.createElement(TableRow, { key: idx },
60
+ React.createElement(TableCell, null,
61
+ React.createElement(IconButton, { id: "Restore", icon: "update", title: "restore", onClick: () => setRestore(commit) })),
62
+ React.createElement(TableCell, null,
63
+ React.createElement(Typography, { color: "secondary" }, commit.hash),
64
+ React.createElement(Typography, { variant: "body1" }, commit.message),
65
+ React.createElement(Typography, { variant: "caption" }, commit.author)),
66
+ React.createElement(TableCell, null,
67
+ React.createElement(Localize, { date: commit.date, withTime: true }))))))),
68
+ React.createElement(Dialog, { isVisible: !!restore, title: t('Restore this backup?'), wider: true, onClose: () => setRestore(null), onConfirm: () => onRestore(restore) }, restore && React.createElement(Box, null,
69
+ React.createElement(Typography, { variant: "caption" },
70
+ React.createElement(Localize, { date: restore.date, withTime: true }),
71
+ " ",
72
+ restore.hash),
73
+ React.createElement(Typography, { variant: "body1" }, restore.message),
74
+ React.createElement(Typography, { variant: "caption" }, restore.author))));
75
+ }
5
76
  class GitBackup extends ToolPlugin {
6
77
  busy = false;
78
+ commits = [];
79
+ backups = 0;
7
80
  static code = 'GitBackup';
8
81
  static title = 'Backup for Git';
9
- static version = '1.0.2';
82
+ static version = '1.0.4';
10
83
  static icon = '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path></svg>';
11
84
  static releaseDate = '2022-12-12';
12
85
  static use = 'both';
@@ -15,23 +88,36 @@ class GitBackup extends ToolPlugin {
15
88
  constructor() {
16
89
  super();
17
90
  makeObservable(this, {
18
- busy: observable
91
+ busy: observable,
92
+ commits: observable,
93
+ backups: observable,
19
94
  });
20
95
  this.languages = {
21
96
  // TODO: This is too simple labeling. Need to add plugin code as well.
22
97
  en: {
23
98
  'label-repository': 'Repository URL',
24
99
  'label-subDirectory': 'Subdirectory inside the repository',
25
- 'summarize-make-backup': 'Make a backup'
100
+ 'label-sshPrivateKey': 'SSH private key',
101
+ 'icon-restore': 'Restore this backup',
102
+ 'icon-summarize-make-backup': 'Make a backup',
26
103
  },
27
104
  fi: {
28
105
  'label-repository': 'Git-säilön URL',
29
106
  'label-subDirectory': 'Alihakemiston nimi säilön sisällä',
30
- 'summarize-make-backup': 'Tee varmuuskopio',
107
+ 'label-sshPrivateKey': 'SSH yksityinen avain',
108
+ 'icon-restore': 'Palauta tältä varmuuskopiolta',
109
+ 'icon-summarize-make-backup': 'Tee varmuuskopio',
31
110
  'Backup for Git': 'Git-pohjainen Varmuuskopiointi',
32
111
  'Manual backup by GitBackup {version}': 'Ylimääräinen varmuuskopio GitBackup {version}',
33
112
  'Backup created successfully.': 'Varmuuskopion luominen onnistui.',
34
- 'Creating backup failed.': 'Varmuuskopion luominen ei onnistunut.'
113
+ 'Creating backup failed.': 'Varmuuskopion luominen ei onnistunut.',
114
+ 'Not able to find any commits from the repository.': 'Varmuuskopio vaikuttaisi olevan tyhjä.',
115
+ 'This tool takes every night automatically one backup.': 'Tämä työkalu tekee yhden varmuuskopion joka yö.',
116
+ 'You can also make immediately backup from the icon above.': 'Lisäksi voit tehdä ylimääräisen varmuuskopion halutessasi ylläolevasta ikonista.',
117
+ 'Existing backups are listed below and can be restored from the icon next to them.': 'Aiemmat varmuuskopiot ovat alla listattuna. Niistä voi palauttaa minkä tahansa klikkaamalla niiden vieressä olevaa ikonia.',
118
+ 'Backup restored successfully.': 'Varmuuskopion palautus onnistui.',
119
+ 'Restoring backup failed.': 'Varmuuskopion palauttaminen epäonnistui.',
120
+ 'Comment for Git Commit': 'Kommentti varmuuskopiosta',
35
121
  }
36
122
  };
37
123
  }
@@ -41,26 +127,28 @@ class GitBackup extends ToolPlugin {
41
127
  toolTitle() {
42
128
  return 'Backup for Git';
43
129
  }
44
- async onMakeBackup() {
130
+ async onMakeBackup(message) {
45
131
  runInAction(() => (this.busy = true));
46
- const { success } = await this.POST({ makeBackup: this.t('Manual backup by GitBackup {version}').replace('{version}', GitBackup.version) });
132
+ const { success } = await this.POST({ makeBackup: message || this.t('Manual backup by GitBackup {version}').replace('{version}', GitBackup.version) });
47
133
  runInAction(() => {
48
134
  this.busy = false;
135
+ runInAction(() => {
136
+ // Trigger refresh.
137
+ this.backups = this.backups + 1;
138
+ });
49
139
  if (success) {
50
140
  this.store.addMessage(this.t('Backup created successfully.'));
51
141
  }
52
142
  else {
53
- this.store.addError(this.t('Creating backup failed.'));
143
+ this.store.addError(this.t('Restoring backup failed.'));
54
144
  }
55
145
  });
56
146
  }
57
147
  toolTopPanel() {
58
148
  const repo = this.getSetting('repository');
59
- return React.createElement(React.Fragment, null,
60
- React.createElement(IconButton, { id: "Make Backup", disabled: this.busy || !repo, onClick: () => this.onMakeBackup(), title: "summarize-make-backup", icon: "save" }));
149
+ return React.createElement(MakeBackupIcon, { disabled: !repo || this.busy, onMakeBackup: (msg) => this.onMakeBackup(msg) });
61
150
  }
62
151
  toolMainPanel() {
63
- // TODO: We could use here some link utility that keeps selected dbs and ids intact but changes URL parts.
64
152
  const repo = this.getSetting('repository');
65
153
  if (!repo) {
66
154
  return React.createElement(React.Fragment, null,
@@ -73,18 +161,11 @@ class GitBackup extends ToolPlugin {
73
161
  React.createElement(React.Fragment, null, " "),
74
162
  React.createElement(Trans, null, "You can also make immediately backup from the icon above."),
75
163
  React.createElement(React.Fragment, null, " "),
76
- React.createElement(Trans, null, "Setting up SSH keys is not yet supported."),
77
- React.createElement(React.Fragment, null, " "),
78
- React.createElement(Trans, null, "Please contact the support for the server SSH keys to get access to your repository.")),
79
- React.createElement(SubPanel, null,
80
- React.createElement(Trans, null, "Currently restore is not yet implemented."),
81
- React.createElement(React.Fragment, null, " "),
82
- React.createElement(Trans, null, "In order to restore from the backup, you must ensure to get the wanted version as the latest commit in the Git."),
83
- React.createElement(React.Fragment, null, " "),
84
- React.createElement(Trans, null, "Then you need to contact support to let them know that DB needs to be loaded from Git.")));
164
+ React.createElement(Trans, null, "Existing backups are listed below and can be restored from the icon next to them."),
165
+ React.createElement(React.Fragment, null, " ")),
166
+ React.createElement(Box, { sx: { m: 2 } },
167
+ React.createElement(BackupCommitList, { backups: this.backups, store: this.store })));
85
168
  }
86
- // TODO: Add button to create backup right now. Maybe with comments?
87
- // TODO: Communicating with backend counterpart needs URL passing all requests to plugin.
88
169
  getSettings() {
89
170
  return {
90
171
  type: 'flat',
@@ -99,6 +180,12 @@ class GitBackup extends ToolPlugin {
99
180
  name: 'subDirectory',
100
181
  actions: {}
101
182
  },
183
+ {
184
+ type: 'text',
185
+ name: 'sshPrivateKey',
186
+ multiline: true,
187
+ actions: {}
188
+ },
102
189
  {
103
190
  type: 'button',
104
191
  label: 'Save',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/ui/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/ui/index.tsx"],"names":[],"mappings":"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"}