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.

Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +46 -2
  3. data/app/assets/javascripts/mbeditor/application.js +1 -0
  4. data/app/assets/javascripts/mbeditor/components/DiffViewer.js +14 -2
  5. data/app/assets/javascripts/mbeditor/components/EditorPanel.js +281 -18
  6. data/app/assets/javascripts/mbeditor/components/FileHistoryPanel.js +6 -1
  7. data/app/assets/javascripts/mbeditor/components/FileTree.js +12 -1
  8. data/app/assets/javascripts/mbeditor/components/GitPanel.js +94 -0
  9. data/app/assets/javascripts/mbeditor/components/MbeditorApp.js +403 -17
  10. data/app/assets/javascripts/mbeditor/components/TabBar.js +72 -3
  11. data/app/assets/javascripts/mbeditor/components/TestResultsPanel.js +150 -0
  12. data/app/assets/javascripts/mbeditor/editor_plugins.js +49 -0
  13. data/app/assets/javascripts/mbeditor/editor_store.js +1 -0
  14. data/app/assets/javascripts/mbeditor/file_service.js +11 -1
  15. data/app/assets/javascripts/mbeditor/search_service.js +8 -4
  16. data/app/assets/stylesheets/mbeditor/application.css +148 -11
  17. data/app/assets/stylesheets/mbeditor/editor.css +281 -0
  18. data/app/controllers/mbeditor/application_controller.rb +1 -1
  19. data/app/controllers/mbeditor/editors_controller.rb +164 -22
  20. data/app/controllers/mbeditor/git_controller.rb +24 -10
  21. data/app/services/mbeditor/git_diff_service.rb +3 -0
  22. data/app/services/mbeditor/git_service.rb +15 -3
  23. data/app/services/mbeditor/test_runner_service.rb +259 -0
  24. data/app/views/layouts/mbeditor/application.html.erb +5 -1
  25. data/config/routes.rb +2 -0
  26. data/lib/mbeditor/configuration.rb +5 -1
  27. data/lib/mbeditor/rack/silence_ping_request.rb +32 -6
  28. data/lib/mbeditor/version.rb +1 -1
  29. data/public/ts_worker.js +5 -0
  30. 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',