Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add copy document link #8384

Closed
wants to merge 10 commits into from
Closed

Conversation

styfle
Copy link

@styfle styfle commented Sep 20, 2016

This adds a link/button next to the document that allows the user to copy the document's URL to clipboard.

image

This fixes #8263 😄

@elasticmachine
Copy link
Contributor

Can one of the admins verify this patch?

@styfle
Copy link
Author

styfle commented Sep 20, 2016

I need @Bargs to take a look at why the URL is not compiled. I am probably doing something wrong.

@Bargs
Copy link
Contributor

Bargs commented Sep 26, 2016

@styfle sorry for the delay here, I'm traveling this week so I might not get a chance to look at this until next week. Just wanted to let you know I haven't forgotten

@styfle
Copy link
Author

styfle commented Sep 26, 2016

@Bargs I understand. I will be traveling next week so I might not see your response 😄

@Bargs Bargs self-assigned this Oct 7, 2016
<div class="pull-right">
<a ng-href="#/doc/{{indexPattern.id}}/{{row._index}}/{{row._type}}/?id={{row._id | uriescape}}">View</a>
<span style="display:inline-block; width:5px"><!--spacer--></span>
<a ng-click="copyTextToClipboard('#/doc/{{indexPattern.id}}/{{row._index}}/{{row._type}}/?id={{row._id | uriescape}}')">Copy</a>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The url isn't getting copied correctly because interpolation bindings {{}} don't work inside expressions. I would suggest building the URL in javascript and store it in a scope variable to keep the template super simple, so you can just do ng-click="copyTextToClipboard(docUrl)" and ng-href="{{docUrl}}" (for the view link).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. I updated this to use

$detailsScope.docUrl = `#/doc/${$scope.indexPattern.id}/${$scope.row._index}/${$scope.row._type}/?id=${$scope.row._id}`;

But what is the equivalent of {{row._id | uriescape}}?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can access angular filters programmatically http://stackoverflow.com/a/14302334/799841

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, that worked! 👍

@@ -77,6 +78,35 @@ module.directive('kbnTableRow', function ($compile) {

$detailsScope.row = $scope.row;

$detailsScope.copyTextToClipboard = text => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's an existing clipboard copy implementation in the codebase already:

this.copyToClipboard = selector => {

Let's extract that existing logic into a service that both the share UI and this doc link UI can leverage.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok I'll give it a shot. Where should it go and what should it be named? I have a lib I created called copee. Maybe I can make that compatible with angular's import and include it as a dependency?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd put it in its own folder under src/ui/public. Here's a simple example of such a service:

module.service('debounce', ['$timeout', function ($timeout) {

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. I think I can use that to write my own module service. Can you provide an example of debounce being used in another file? It doesn't appear to be imported like other modules. (remember I'm an angular noob).

Copy link
Contributor

@Bargs Bargs Oct 13, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure! You'll need to do two things:

  1. Import the new copy module here: https://github.com/Bargs/kibana/blob/9924a58f6915a0c1a9df0e6b0f713482fdf69f32/src/ui/public/autoload/modules.js#L8-L8 This isn't an angular thing, but it's required so that the module gets executed and added to angular's dependency injection context.
  2. Use the service like a normal angular dependency by adding it to the link/controller function's parameters, for example: https://github.com/Bargs/kibana/blob/81efe3b73419acef3c6fc11062511ce4d7e08d60/src/core_plugins/kibana/public/management/sections/indices/add_data_steps/pipeline_setup/directives/output_preview.js#L39-L39

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! I created ui/copee and inject it into both places: the share directive and my new detailsScope.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome! Is the code ready for another review?

Copy link
Author

@styfle styfle Oct 13, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but did you see my other comment above about uriescape? I'm not even sure if that is necessary or how to use it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, nope, just answered

@styfle
Copy link
Author

styfle commented Oct 18, 2016

@Bargs Thanks for looking at this. Anything else I need to do or are we waiting on someone else to review?

@Bargs
Copy link
Contributor

Bargs commented Oct 18, 2016

@styfle sorry, just haven't had a chance to review the most recent changes yet. I'll look at them this week then we'll get one other person to review after that.

Copy link
Contributor

@Bargs Bargs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@styfle left some notes on a few minor things I think we could improve

@@ -0,0 +1,46 @@
import Notifier from 'ui/notify/notifier';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this is based on the copee module, but can we give this service a more descriptive name like clipboard? It'll be easier for other devs to find in the future if they're looking for this sort of functionality.

ta.cols = 1;
ta.rows = 1;
ta.style.color = 'transparent';
ta.style.border = 'none';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Too bad display: 'none' stops copying from working. In addition to these precautions let's also give the element absolute positioning and push it way over to the left so that it's off screen and won't interrupt the page flow.

    ta.style.position = 'absolute';
    ta.style.left = '-999999px';

const a = document.createElement('a');
a.style.color = 'transparent';
a.style.border = 'none';
document.body.appendChild(a);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you even need to append the anchor to the document, the href seems to get generated correctly without it.

document.body.appendChild(a);
a.href = url;

const ta = document.createElement('textarea');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's give this a more descriptive name like copyElement

location: `Share ${name}`,
});

const a = document.createElement('a');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to avoid one letter names, anchorElement would be better.

copee.urlToClipboard = (url, name) => {
const notify = new Notifier({
location: `Share ${name}`,
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of having a name string parameter, how about we have a notifier parameter that takes a notifier instance? Then the calling code can be responsible for creating the notifier with the correct name, and can re-use it outside of this service. In particular, this would allow share.js to easily do its "URL selected" notification if copying fails which is currently gone in this version of the code.

import uiModules from 'ui/modules';
// borrowed heavily from https://github.com/styfle/copee

let module = uiModules.get('kibana');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const

@styfle
Copy link
Author

styfle commented Oct 21, 2016

@Bargs Thanks for reviewing. I went ahead and made those changes you requested 👍

Copy link
Contributor

@Bargs Bargs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@styfle looking pretty good! I listed a few more minor cleanup items.

One last larger ask: could you add some unit tests for the urlToClipboard method?

module.service('clipboard', function () {
const clipboard = this;

clipboard.urlToClipboard = (url, notifier) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

notifier isn't getting used anywhere. I think that's ok though, we can remove this param entirely and just allow the calling code to handle notifications.

clipboard.urlToClipboard = (url, notifier) => {
const anchorElement = document.createElement('a');
anchorElement.style.color = 'transparent';
anchorElement.style.border = 'none';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These two style setters are unnecessary now that we're not injecting the element into the page.

success = false;
}

document.body.removeChild(copyElement);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using $document everywhere instead of the raw document object would make testing this service a lot easier.

if (success) {
notify.info('URL copied to clipboard.');
} else {
notify.info('Failed to copy to clipboard.');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's use notify.error here so the failure catches the user's eye.

<div class="pull-right">
<a ng-href="{{docUrl}}">View</a>
<span style="display:inline-block; width:5px"><!--spacer--></span>
<a ng-click="copyTextToClipboard(docUrl)">Copy</a>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I realized just the word "Copy" might be confusing to the user, they might think it's supposed to copy the json or something. How about changing this to "Copy URL"?

@styfle
Copy link
Author

styfle commented Oct 24, 2016

@Bargs I made those changes you requested. But I'll have to figure out how the tests and mocks work. How many tests do you want?

@Bargs
Copy link
Contributor

Bargs commented Oct 24, 2016

Enough to verify the expected use cases of the urlToClipboard method and some edge cases. A few immediately come to mind:

  • Copying an absolute url
  • Copying a relative URL
  • What happens when the input is an empty string or undefined
  • Maybe a test for an invalid url
  • Any other scenarios you think might be worth testing

@Bargs
Copy link
Contributor

Bargs commented Oct 24, 2016

Let me know if you need any help figuring out our test setup. To get started you'll want to use npm run test:dev. That'll boot up a debuggable karma controlled browser for you tests. To focus on your particular test suite and avoid running all the other tests, the easiest thing to do is wrap the suite in a describe.only block per usual mocha conventions.

@styfle
Copy link
Author

styfle commented Oct 28, 2016

@Bargs I haven't been able to run the test server, let alone write any tests yet.

Here is what I see:

$ npm run test:dev

> kibana@6.0.0-alpha1 test:dev C:\Users\styfle\Documents\GitHub\kibana
> grunt test:dev

Running "run:devTestServer" (run) task
optmzr    log   [09:16:10.851] [fatal] TypeError: this.views is not a function
    at .setupViews (C:/Users/styfle/Documents/GitHub/kibana/src/server/http/index.js:48:10)
    at KbnServer.<anonymous> (C:/Users/styfle/Documents/GitHub/kibana/src/ui/index.js:44:10)
    at undefined.next (native)
    at step (C:\Users\styfle\Documents\GitHub\kibana\src\ui\index.js:9:273)
FATAL TypeError: this.views is not a function
    at .setupViews (C:/Users/styfle/Documents/GitHub/kibana/src/server/http/index.js:48:10)
    at KbnServer.<anonymous> (C:/Users/styfle/Documents/GitHub/kibana/src/ui/index.js:44:10)
    at undefined.next (native)
    at step (C:\Users\styfle\Documents\GitHub\kibana\src\ui\index.js:9:273)
server    log   [09:16:10.856] [fatal] TypeError: this.views is not a function
    at .setupViews (C:/Users/styfle/Documents/GitHub/kibana/src/server/http/index.js:48:10)
    at KbnServer.<anonymous> (C:/Users/styfle/Documents/GitHub/kibana/src/ui/index.js:44:10)
    at undefined.next (native)
    at step (C:\Users\styfle\Documents\GitHub\kibana\src\ui\index.js:9:273)
FATAL TypeError: this.views is not a function
    at .setupViews (C:/Users/styfle/Documents/GitHub/kibana/src/server/http/index.js:48:10)
    at KbnServer.<anonymous> (C:/Users/styfle/Documents/GitHub/kibana/src/ui/index.js:44:10)
    at undefined.next (native)
    at step (C:\Users\styfle\Documents\GitHub\kibana\src\ui\index.js:9:273)
 optimizer crashed  with status code 1

Running "karma:dev" (karma) task
28 10 2016 09:16:11.258:INFO [karma]: Karma v1.2.0 server started at http://localhost:9876/
28 10 2016 09:16:11.261:INFO [launcher]: Launching browser IE with unlimited concurrency
28 10 2016 09:16:11.273:INFO [launcher]: Starting browser IE
28 10 2016 09:16:11.685:INFO [IE 11.0.0 (Windows 10 0.0.0)]: Connected on socket /#fvGC_twr7FYZIs7fAAAA with id 71796592

I'm using Git Bash on Windows 10.

@Bargs
Copy link
Contributor

Bargs commented Oct 31, 2016

Ah, Windows. @BigFunger or @LeeDr do you know what's required to run the frontend karma based tests on Windows 10?

@LeeDr
Copy link

LeeDr commented Nov 3, 2016

I'm on Windows 10. I'll give those tests a try and see if they pass for me.

@LeeDr
Copy link

LeeDr commented Nov 4, 2016

The tests ran on my Windows 10 (with a few failures) on Kibana master.
passes: 2531 failures: 6 duration: 471.42s

I'll looking into the failures, but the tests should run on Windows 10. They launch an IE browser window with a "Debug" button. Click that, opens a new tab where the tests run.

$ npm run test:dev

> kibana@6.0.0-alpha1 test:dev C:\git\kibana
> grunt test:dev

Running "run:devTestServer" (run) task
optmzr    log   [15:12:09.411] [info][status][ui settings] Status changed from uninitialized to disabled - uiSettings.enabled config is set to `false`
server    log   [15:12:09.667] [info][optimize] Waiting for optimizer completion
optmzr    log   [15:12:09.736] [info][optimize] Lazy optimization started
optmzr    log   [15:13:23.529] [info][optimize] Lazy optimization success in 73.79 seconds
optmzr    log   [15:13:23.716] [info][optimize] Lazy optimization of bundle for tests ready
optmzr    log   [15:13:23.952] [info] Plugin initialization disabled.
server    log   [15:13:23.953] [info] Plugin initialization disabled.
server    log   [15:13:23.963] [info][listening] Server running at http://localhost:5610

Running "karma:dev" (karma) task
server    log   [15:13:23.967] [error][status][ui settings] Status changed from uninitialized to red - UI Settings requires the elasticsearch plugin
04 11 2016 10:13:24.325:INFO [karma]: Karma v1.2.0 server started at http://localhost:9876/
04 11 2016 10:13:24.328:INFO [launcher]: Launching browser IE with unlimited concurrency
04 11 2016 10:13:24.339:INFO [launcher]: Starting browser IE
04 11 2016 10:13:24.850:INFO [IE 11.0.0 (Windows 10 0.0.0)]: Connected on socket /#gVMy428kaQ7dw3x7AAAA with id 43325239
server    log   [15:18:01.164] [error][client][connection] Error: write ECANCELED
    at exports._errnoException (util.js:1026:11)
    at WriteWrap.afterWrite (net.js:794:14)
04 11 2016 10:18:02.304:WARN [web-server]: 404: /api/console/api_server?sense_version=%40%40SENSE_VERSION&apis=es_5_0
04 11 2016 10:18:56.000:WARN [web-server]: 404: /icon%20url

Here's the first 4 failures;

JSON input validation

should be able to require keys

Error: expected false to be truthy
at Assertion.prototype.assert (http://localhost:5610/bundles/tests.bundle.js:290556:8)
at Assertion.prototype.ok (http://localhost:5610/bundles/tests.bundle.js:290569:6)
at Anonymous function (http://localhost:5610/bundles/tests.bundle.js:290953:8)
at Anonymous function (http://localhost:5610/bundles/tests.bundle.js:308138:7)


should be able to not require keys


should be able to read parse an input

Error: expected undefined to sort of equal {}
at Assertion.prototype.assert (http://localhost:5610/bundles/tests.bundle.js:290556:8)
at Assertion.prototype.eql (http://localhost:5610/bundles/tests.bundle.js:290684:6)
at Anonymous function (http://localhost:5610/bundles/tests.bundle.js:308153:7)


should not allow invalid json

Error: expected false to be truthy
at Assertion.prototype.assert (http://localhost:5610/bundles/tests.bundle.js:290556:8)
at Assertion.prototype.ok (http://localhost:5610/bundles/tests.bundle.js:290569:6)
at Anonymous function (http://localhost:5610/bundles/tests.bundle.js:290953:8)
at Anonymous function (http://localhost:5610/bundles/tests.bundle.js:308159:7)


should allow valid json

Error: expected undefined to sort of equal { foo: 'bar' }
at Assertion.prototype.assert (http://localhost:5610/bundles/tests.bundle.js:290556:8)
at Assertion.prototype.eql (http://localhost:5610/bundles/tests.bundle.js:290684:6)
at Anonymous function (http://localhost:5610/bundles/tests.bundle.js:308165:7)

The other 2 were timeout errors. I might try increasing the timeout to see if they would pass in that case;

Events

should handle on events


should work with inherited objects


should clear events when off is called


should clear a specific handler when off is called for an event


should clear a all handlers when off is called for an event


should handle mulitple identical emits in the same tick3510ms


should handle emits from the handler2941ms


should only emit to handlers registered before emit is called

Error: timeout of 10000ms exceeded. Ensure the done() callback is being called in this test.


should pass multiple arguments from the emitter


should preserve the scope of the handler


should always emit in the same order

Error: timeout of 10000ms exceeded. Ensure the done() callback is being called in this test

@Bargs
Copy link
Contributor

Bargs commented Nov 4, 2016

@LeeDr were you on this PR or master? @styfle you might try rebasing on master.

@styfle styfle force-pushed the feature/copy-doc-link branch from 46b092f to fd0b062 Compare November 4, 2016 16:26
@LeeDr
Copy link

LeeDr commented Nov 4, 2016

I was on master, to see if the tests all pass there. I'm planning to try switching the tests locally to use Chrome instead of IE on Windows just as a test to see if the browser is related to the failures I saw (6 in the first run, 8 in the second run).

@styfle
Copy link
Author

styfle commented Nov 4, 2016

@Bargs I just rebased on master and force pushed.

$ npm run test:dev

> kibana@6.0.0-alpha1 test:dev C:\Users\styfle\Documents\GitHub\kibana
> grunt test:dev

Running "run:devTestServer" (run) task
server    log   [16:26:52.816] [info][optimize] Waiting for optimizer completion
optmzr    log   [16:26:53.120] [info][optimize] Lazy optimization started
[BABEL] Note: The code generator has deoptimised the styling of "C:/Users/styfle/Documents/GitHub/kibana/optimize/testdev/tests.entry.js" as it exceeds the max of "100KB".
optmzr    log   [16:28:37.840] [info][optimize] Lazy optimization success in 104.72 seconds
optmzr    log   [16:28:38.230] [info][optimize] Lazy optimization of bundle for tests ready
optmzr    log   [16:28:38.881] [info] Plugin initialization disabled.
server    log   [16:28:38.881] [info] Plugin initialization disabled.
(node:5188) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'state' of undefined
server    log   [16:28:38.890] [info][listening] Server running at http://localhost:5610

Running "karma:dev" (karma) task
(node:9636) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'state' of undefined
04 11 2016 12:28:39.958:INFO [karma]: Karma v1.2.0 server started at http://localhost:9876/
04 11 2016 12:28:39.961:INFO [launcher]: Launching browser IE with unlimited concurrency
04 11 2016 12:28:39.974:INFO [launcher]: Starting browser IE
04 11 2016 12:28:40.414:INFO [IE 11.0.0 (Windows 10 0.0.0)]: Connected on socket /#WxJ5FqbmSOR4fTvTAAAA with id 23562558
optmzr    log   [16:41:30.505] [info][optimize] Lazy optimization started
optmzr    log   [16:41:53.915] [info][optimize] Lazy optimization success in 23.41 seconds
04 11 2016 12:41:55.883:WARN [web-server]: 404: /api/console/api_server?sense_version=%40%40SENSE_VERSION&apis=es_5_0
04 11 2016 12:42:28.986:WARN [web-server]: 404: /icon%20url

Now I actually see some JSON input validation errors in my browser (it launched MS Edge).
Are these actually failing because of my changes?

@LeeDr
Copy link

LeeDr commented Nov 4, 2016

Some of my Windows/IE test failures are timeouts and I submitted this PR to increase the timeout;
#8969

Still looking into some other ones (still on master atm)

@Bargs
Copy link
Contributor

Bargs commented Nov 4, 2016

jenkins, test it

@LeeDr
Copy link

LeeDr commented Nov 4, 2016

I also filed this issue #8973 about 4 tests that fail for me consistently on IE but pass on Chrome. To change your browser look in Gruntfile.js around line 26.

@Bargs
Copy link
Contributor

Bargs commented Nov 4, 2016

@styfle unit tests are passing for me locally on OSX and Chrome. Try switching to Chrome as Lee mentioned.

I did notice some functional (selenium) test failures that look related to your change though. This one in particular:

bdd.it('should show toast message for copy to clipboard', function () {

You can run these selenium based tests with npm run test:ui. If you need to iterate on them it can be useful to run the server and tests separately. npm run test:ui:server will start up the server and then you can run npm run test:ui:runner as many times as you need to run the tests. The easiest way to focus on a subset of the tests is to comment out the irrelevant apps here

'intern/dojo/node!./apps/discover',

@Bargs
Copy link
Contributor

Bargs commented Nov 4, 2016

@styfle also it looks like you may not have actually pushed after rebasing, or maybe you didn't update your local master branch before rebasing. The last kibana commit in your feature branch is from mid october https://github.com/styfle/kibana/commits/feature/copy-doc-link

The error that Jenkins is reporting was fixed by a PR that got merged two days ago.

@styfle
Copy link
Author

styfle commented Nov 6, 2016

@Bargs I did the following.

git pull --rebase origin master
git push --force origin feature/copy-doc-link

image

But now I realize that maybe I need to somehow update master from upstream first?

@Bargs
Copy link
Contributor

Bargs commented Nov 7, 2016

Yeah you'll want to update your local master with changes from upstream. I
do git fetch upstream, git checkout master and git merge upstream/master.
On Sun, Nov 6, 2016 at 10:12 AM Steven notifications@github.com wrote:

@Bargs https://github.com/Bargs I did the following.

git pull --rebase origin master
git push --force origin feature/copy-doc-link

[image: image]
https://cloud.githubusercontent.com/assets/229881/20038895/35cb5668-a409-11e6-8578-265c4966abb6.png

But now I realize that maybe I need to somehow update master from upstream
first?


You are receiving this because you were mentioned.

Reply to this email directly, view it on GitHub
#8384 (comment), or mute
the thread
https://github.com/notifications/unsubscribe-auth/AF8zyK_55hWvGquh02RAykSgcqmGhajlks5q7e5hgaJpZM4KCFHc
.

@styfle styfle force-pushed the feature/copy-doc-link branch from fd0b062 to 9e60ff6 Compare November 7, 2016 15:53
@styfle
Copy link
Author

styfle commented Nov 7, 2016

@Bargs Okay I think I got the rebase working. However grunt test:ui also fails to run properly.

See this gist for the full output.

@Bargs
Copy link
Contributor

Bargs commented Nov 7, 2016

You might need to npm install first

@Bargs
Copy link
Contributor

Bargs commented Dec 8, 2016

Hi @styfle, were you still interested in working on this?

@styfle
Copy link
Author

styfle commented Dec 9, 2016

@Bargs I am still interested but I don't have the time. Maybe I can revisit in January. Those pesky unit tests got me down 😞

@Bargs
Copy link
Contributor

Bargs commented Dec 9, 2016

Ok, no worries! Sorry the tests were a bit frustrating. Let me know if I can do anything to help if you decide to pick it back up. I'm going to close this for the time being, but we can reopen if you get time to work on it in the future.

@Bargs Bargs closed this Dec 9, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature Request: "Link to" document should have copy link to clipboard
4 participants