mbeditor 0.1.5 → 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.
Potentially problematic release.
This version of mbeditor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +46 -2
- data/app/assets/javascripts/mbeditor/application.js +1 -0
- data/app/assets/javascripts/mbeditor/components/DiffViewer.js +14 -2
- data/app/assets/javascripts/mbeditor/components/EditorPanel.js +281 -18
- data/app/assets/javascripts/mbeditor/components/FileHistoryPanel.js +6 -1
- data/app/assets/javascripts/mbeditor/components/FileTree.js +12 -1
- data/app/assets/javascripts/mbeditor/components/GitPanel.js +94 -0
- data/app/assets/javascripts/mbeditor/components/MbeditorApp.js +403 -17
- data/app/assets/javascripts/mbeditor/components/TabBar.js +72 -3
- data/app/assets/javascripts/mbeditor/components/TestResultsPanel.js +150 -0
- data/app/assets/javascripts/mbeditor/editor_plugins.js +49 -0
- data/app/assets/javascripts/mbeditor/editor_store.js +1 -0
- data/app/assets/javascripts/mbeditor/file_service.js +11 -1
- data/app/assets/javascripts/mbeditor/search_service.js +8 -4
- data/app/assets/stylesheets/mbeditor/application.css +148 -11
- data/app/assets/stylesheets/mbeditor/editor.css +281 -0
- data/app/controllers/mbeditor/application_controller.rb +1 -1
- data/app/controllers/mbeditor/editors_controller.rb +164 -22
- data/app/controllers/mbeditor/git_controller.rb +24 -10
- data/app/services/mbeditor/git_diff_service.rb +3 -0
- data/app/services/mbeditor/git_service.rb +15 -3
- data/app/services/mbeditor/test_runner_service.rb +259 -0
- data/app/views/layouts/mbeditor/application.html.erb +5 -1
- data/config/routes.rb +2 -0
- data/lib/mbeditor/configuration.rb +5 -1
- data/lib/mbeditor/rack/silence_ping_request.rb +32 -6
- data/lib/mbeditor/version.rb +1 -1
- data/public/ts_worker.js +5 -0
- metadata +5 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
var GitPanel = function GitPanel(_ref) {
|
|
2
2
|
var gitInfo = _ref.gitInfo;
|
|
3
3
|
var error = _ref.error;
|
|
4
|
+
var redmineEnabled = _ref.redmineEnabled;
|
|
4
5
|
var onOpenFile = _ref.onOpenFile;
|
|
5
6
|
var onOpenDiff = _ref.onOpenDiff;
|
|
6
7
|
var onOpenAllChanges = _ref.onOpenAllChanges;
|
|
@@ -8,6 +9,7 @@ var GitPanel = function GitPanel(_ref) {
|
|
|
8
9
|
var onClose = _ref.onClose;
|
|
9
10
|
|
|
10
11
|
var useState = React.useState;
|
|
12
|
+
var useEffect = React.useEffect;
|
|
11
13
|
|
|
12
14
|
var _s1 = useState(true); var localExpanded = _s1[0]; var setLocalExpanded = _s1[1];
|
|
13
15
|
var _s2 = useState(true); var branchExpanded = _s2[0]; var setBranchExpanded = _s2[1];
|
|
@@ -18,6 +20,12 @@ var GitPanel = function GitPanel(_ref) {
|
|
|
18
20
|
var _s5 = useState({}); var commitFiles = _s5[0]; var setCommitFiles = _s5[1];
|
|
19
21
|
var _s6 = useState(false); var refreshing = _s6[0]; var setRefreshing = _s6[1];
|
|
20
22
|
|
|
23
|
+
// ── Redmine state ───────────────────────────────────────────────────────────
|
|
24
|
+
var _sr1 = useState(null); var redmineIssue = _sr1[0]; var setRedmineIssue = _sr1[1];
|
|
25
|
+
var _sr2 = useState(null); var redmineError = _sr2[0]; var setRedmineError = _sr2[1];
|
|
26
|
+
var _sr3 = useState(false); var redmineLoading = _sr3[0]; var setRedmineLoading = _sr3[1];
|
|
27
|
+
var _sr4 = useState(true); var redmineExpanded = _sr4[0]; var setRedmineExpanded = _sr4[1];
|
|
28
|
+
|
|
21
29
|
var workingTree = gitInfo && gitInfo.workingTree || [];
|
|
22
30
|
var unpushedFiles = gitInfo && gitInfo.unpushedFiles || [];
|
|
23
31
|
var unpushedCommits = gitInfo && gitInfo.unpushedCommits || [];
|
|
@@ -32,6 +40,39 @@ var GitPanel = function GitPanel(_ref) {
|
|
|
32
40
|
return Object.assign({}, c, { isLocal: !!localHashes[c.hash] });
|
|
33
41
|
});
|
|
34
42
|
|
|
43
|
+
// Extract the first Redmine ticket ID (#123) from recent branch commit messages
|
|
44
|
+
var redmineTicketId = null;
|
|
45
|
+
if (redmineEnabled) {
|
|
46
|
+
for (var ci = 0; ci < branchCommits.length; ci++) {
|
|
47
|
+
var titleMatch = branchCommits[ci] && branchCommits[ci].title && branchCommits[ci].title.match(/#(\d+)/);
|
|
48
|
+
if (titleMatch) { redmineTicketId = titleMatch[1]; break; }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Fetch Redmine issue whenever the ticket ID changes
|
|
53
|
+
useEffect(function () {
|
|
54
|
+
if (!redmineEnabled) return;
|
|
55
|
+
if (!redmineTicketId) {
|
|
56
|
+
setRedmineIssue(null);
|
|
57
|
+
setRedmineError(null);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
setRedmineLoading(true);
|
|
61
|
+
setRedmineIssue(null);
|
|
62
|
+
setRedmineError(null);
|
|
63
|
+
var basePath = (window.MBEDITOR_BASE_PATH || '/mbeditor').replace(/\/$/, '');
|
|
64
|
+
axios.get(basePath + '/redmine/issue/' + redmineTicketId)
|
|
65
|
+
.then(function (res) {
|
|
66
|
+
setRedmineIssue(res.data);
|
|
67
|
+
setRedmineLoading(false);
|
|
68
|
+
})
|
|
69
|
+
.catch(function (err) {
|
|
70
|
+
var msg = (err.response && err.response.data && err.response.data.error) || err.message || 'Failed to load Redmine issue.';
|
|
71
|
+
setRedmineError(msg);
|
|
72
|
+
setRedmineLoading(false);
|
|
73
|
+
});
|
|
74
|
+
}, [redmineEnabled, redmineTicketId]);
|
|
75
|
+
|
|
35
76
|
var statusMeta = function statusMeta(rawStatus) {
|
|
36
77
|
var raw = (rawStatus || '').trim();
|
|
37
78
|
if (raw === '??') return { badge: 'NEW', cssKey: 'A', description: 'Untracked' };
|
|
@@ -307,6 +348,59 @@ var GitPanel = function GitPanel(_ref) {
|
|
|
307
348
|
|
|
308
349
|
error && React.createElement('div', { className: 'git-error' }, error),
|
|
309
350
|
|
|
351
|
+
// ── Redmine Issue Section ───────────────────────────────────────────────
|
|
352
|
+
redmineEnabled && React.createElement(
|
|
353
|
+
'div',
|
|
354
|
+
{ className: 'git-section ' + (redmineExpanded ? 'expanded' : '') + ' git-section--redmine' },
|
|
355
|
+
React.createElement(
|
|
356
|
+
'div',
|
|
357
|
+
{ className: 'git-section-title' },
|
|
358
|
+
React.createElement(
|
|
359
|
+
'div',
|
|
360
|
+
{ className: 'git-section-title-main hoverable', onClick: function () { setRedmineExpanded(!redmineExpanded); } },
|
|
361
|
+
React.createElement(
|
|
362
|
+
'span',
|
|
363
|
+
{ className: 'git-redmine-section-label' },
|
|
364
|
+
React.createElement('i', { className: 'fas ' + (redmineExpanded ? 'fa-chevron-down' : 'fa-chevron-right'), style: { width: '14px', fontSize: '10px' } }),
|
|
365
|
+
'\u2002Redmine',
|
|
366
|
+
redmineTicketId && React.createElement('span', { className: 'git-section-count', style: { marginLeft: '4px' } }, '#' + redmineTicketId)
|
|
367
|
+
),
|
|
368
|
+
redmineIssue && React.createElement('span', { className: 'redmine-badge redmine-badge--section' }, redmineIssue.status)
|
|
369
|
+
)
|
|
370
|
+
),
|
|
371
|
+
redmineExpanded && React.createElement(
|
|
372
|
+
'div',
|
|
373
|
+
{ className: 'git-redmine-content' },
|
|
374
|
+
redmineLoading
|
|
375
|
+
? React.createElement('div', { className: 'git-empty' },
|
|
376
|
+
React.createElement('i', { className: 'fas fa-spinner fa-spin', style: { marginRight: '6px' } }),
|
|
377
|
+
'Loading issue\u2026'
|
|
378
|
+
)
|
|
379
|
+
: !redmineTicketId
|
|
380
|
+
? React.createElement('div', { className: 'git-empty' }, 'No matching ticket found in branch commits.')
|
|
381
|
+
: redmineError
|
|
382
|
+
? React.createElement('div', { className: 'git-redmine-error' },
|
|
383
|
+
React.createElement('i', { className: 'fas fa-exclamation-circle', style: { marginRight: '6px', color: '#f48771' } }),
|
|
384
|
+
redmineError
|
|
385
|
+
)
|
|
386
|
+
: redmineIssue
|
|
387
|
+
? React.createElement(
|
|
388
|
+
'div',
|
|
389
|
+
{ className: 'git-redmine-issue' },
|
|
390
|
+
React.createElement('div', { className: 'git-redmine-title' }, redmineIssue.title),
|
|
391
|
+
redmineIssue.description
|
|
392
|
+
? React.createElement('div', { className: 'git-redmine-desc' }, redmineIssue.description)
|
|
393
|
+
: null,
|
|
394
|
+
React.createElement(
|
|
395
|
+
'div',
|
|
396
|
+
{ className: 'git-redmine-footer' },
|
|
397
|
+
redmineIssue.author || ''
|
|
398
|
+
)
|
|
399
|
+
)
|
|
400
|
+
: null
|
|
401
|
+
)
|
|
402
|
+
),
|
|
403
|
+
|
|
310
404
|
// ── Section 1: Local Changes ────────────────────────────────────────────
|
|
311
405
|
React.createElement(
|
|
312
406
|
'div',
|