Skip to content

Commit

Permalink
Merge branch 'master' into feat/husky
Browse files Browse the repository at this point in the history
  • Loading branch information
GabrielRMuller committed Aug 16, 2024
2 parents 5f443bb + 8d3019a commit 7f93f0c
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 6 deletions.
15 changes: 15 additions & 0 deletions app/assets/javascripts/components/story/StoryCopyIdClipboard.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';
import Clipboard from 'react-clipboard.js';

const StoryCopyIdClipboard = ({ id }) => (
<Clipboard
data-clipboard-text={`#${id}`}
component="button"
className="story-id"
title={I18n.t('story.events.copy_id')}
>
#{id}
</Clipboard>
);

export default StoryCopyIdClipboard;
1 change: 1 addition & 0 deletions app/assets/javascripts/templates/story.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
</span>
</div>
<div class="story-title">
<div data-story-id-copy-clipboard></div>
<% if (story.get('labels')) { %>
<span class="tags">
<% _.each(story.labels(), function(value) { %>
Expand Down
27 changes: 22 additions & 5 deletions app/assets/javascripts/views/story_view.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import storyTemplate from 'templates/story.ejs';
import alertTemplate from 'templates/alert.ejs';
import storyHoverTemplate from 'templates/story_hover.ejs';
import noteTemplate from 'templates/note.ejs';
import StoryCopyIdClipboard from '../components/story/StoryCopyIdClipboard';

const LOCAL_STORY_REGEXP = /(?!\s|\b)(#\d+)(?!\w)/g;

Expand Down Expand Up @@ -541,7 +542,21 @@ const StoryView = FormView.extend({
);
},

renderCollapsed: function (isGuest) {
appendAttachments: function() {
this.$el.append(
this.makeFormControl(function(div) {
const $storyAttachments = $('<div class="story-attachments"></div>');
$(div).append($storyAttachments);

if(process.env.NODE_ENV !== 'test') {
clearTimeout(window.executeAttachinaryTimeout);
window.executeAttachinaryTimeout = setTimeout(ExecuteAttachinary, 1000);
}
})
);
},

renderCollapsed: function(isGuest) {
this.$el.removeClass('editing');
this.$el.html(this.template({ story: this.model, view: this }));
this.$el.toggleClass(
Expand All @@ -560,14 +575,16 @@ const StoryView = FormView.extend({
const estimateButtons = this.$('[data-story-estimate-buttons]').get(0);
if (estimateButtons) {
ReactDOM.render(
<StoryEstimateButtons
points={this.model.point_values()}
onClick={this.estimate}
/>,
<StoryEstimateButtons points={this.model.point_values()} onClick={this.estimate} />,
estimateButtons
);
}

const copyStoryIdClipboardLink = this.$('[data-story-id-copy-clipboard]').get(0)
if(copyStoryIdClipboardLink) {
ReactDOM.render(<StoryCopyIdClipboard id={this.id} />, copyStoryIdClipboardLink)
}

if (isGuest) {
this.$el
.find('.state-actions')
Expand Down
19 changes: 18 additions & 1 deletion app/assets/stylesheets/_screen.scss
Original file line number Diff line number Diff line change
Expand Up @@ -224,10 +224,14 @@ div.story-controls {
}

div.story-title {
margin-left: 65px;
margin-left: 50px;
word-wrap: break-word;
}

div.story-title div[data-story-id-copy-clipboard] {
display: inline;
}

.unestimated div.story-title {
font-style: italic;
}
Expand All @@ -239,6 +243,19 @@ div.story-title abbr.initials {
border: none;
}

div.story-title {
.story-id {
cursor: pointer;
color: $blue-4;
font-weight: bold;
border: none;

&:hover {
text-decoration: underline;
}
}
}

.input-group-btn .btn-clipboard-id {
padding-top: 6px;
}
Expand Down
36 changes: 36 additions & 0 deletions spec/javascripts/components/story/story_copy_id_clipboard_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import React from 'react';
import { mount, shallow } from 'enzyme';

import StoryCopyIdClipboard from 'components/story/StoryCopyIdClipboard';

describe('<StoryCopyIdClipboard />', function() {
beforeEach(function() {
sinon.stub(I18n, 't');
});

afterEach(function() {
I18n.t.restore();
});

it("should render story id text", function() {
const wrapper = mount(
<StoryCopyIdClipboard id={70} />
);
expect(wrapper.find('.story-id').at(0).text()).toBe('#70');
});

it("should render story id data-clipboard-text", function() {
const wrapper = mount(
<StoryCopyIdClipboard id={70} />
);
expect(wrapper.find('[data-clipboard-text]')).toExist();
});

it("should render copy id title", function() {
shallow(
<StoryCopyIdClipboard id={70} />
);
expect(I18n.t).toHaveBeenCalledWith('story.events.copy_id');
});

});

0 comments on commit 7f93f0c

Please sign in to comment.