You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by rk...@apache.org on 2016/09/30 06:22:30 UTC
zeppelin git commit: ZEPPELIN-1440 Notebook clone: prefix name with
"Copy of" and end with count
Repository: zeppelin
Updated Branches:
refs/heads/master 15a6ee520 -> 401c81370
ZEPPELIN-1440 Notebook clone: prefix name with "Copy of" and end with count
### What is this PR for?
While cloning a notebook create a new name using the current notebook name by prefixing "Copy of" and end with count
e.g:
name: test
pre-filled clone name: Copy of test 1
### What type of PR is it?
Improvement
### What is the Jira issue?
https://issues.apache.org/jira/browse/ZEPPELIN-1440
### How should this be tested?
Create a new book and clone on ui or see unit test in notename.js
### Screenshots (if appropriate)
Before
<img width="1221" alt="before" src="https://cloud.githubusercontent.com/assets/2031306/18517800/302309bc-7abb-11e6-8808-b98b9b75a0f4.png">
After
<img width="1247" alt="after" src="https://cloud.githubusercontent.com/assets/2031306/18517805/349d27f2-7abb-11e6-8702-0c064db52697.png">
### Questions:
* Does the licenses files need update? na
* Is there breaking changes for older versions? na
* Does this needs documentation? na
Author: Renjith Kamath <re...@gmail.com>
Closes #1429 from r-kamath/ZEPPELIN-1440 and squashes the following commits:
b8b4f24 [Renjith Kamath] ZEPPELIN-1440 remove redundant beforeEach from test
282e912 [Renjith Kamath] Merge remote-tracking branch 'upstream/master' into ZEPPELIN-1440
9770a20 [Renjith Kamath] ZEPPELIN-1440 remove prefix. fix folder bug
b1f5b5c [Renjith Kamath] ZEPPELIN-1440 Notebook clone: prefix name with "Copy of" and endwith count
Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/401c8137
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/401c8137
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/401c8137
Branch: refs/heads/master
Commit: 401c81370c48930a4887a529f522773dd6ffb66e
Parents: 15a6ee5
Author: Renjith Kamath <re...@gmail.com>
Authored: Thu Sep 29 10:50:14 2016 +0530
Committer: Renjith Kamath <re...@gmail.com>
Committed: Fri Sep 30 11:52:00 2016 +0530
----------------------------------------------------------------------
.../src/app/notebook/notebook-actionBar.html | 2 +-
.../noteName-create/notename.controller.js | 31 ++++++++++++++-
.../noteName-create/visible.directive.js | 13 +++---
zeppelin-web/test/spec/controllers/notename.js | 42 ++++++++++++++++++++
4 files changed, 79 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/401c8137/zeppelin-web/src/app/notebook/notebook-actionBar.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html
index 22ae67c..fcc0e67 100644
--- a/zeppelin-web/src/app/notebook/notebook-actionBar.html
+++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html
@@ -53,7 +53,7 @@ limitations under the License.
<button type="button"
class="btn btn-default btn-xs"
ng-hide="viewOnly"
- tooltip-placement="bottom" tooltip="Clone the notebook"
+ tooltip-placement="bottom" tooltip="Clone the notebook" data-source-note-name="{{note.name}}"
data-toggle="modal" data-target="#noteNameModal" data-clone="true"
>
<i class="fa fa-copy"></i>
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/401c8137/zeppelin-web/src/components/noteName-create/notename.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/noteName-create/notename.controller.js b/zeppelin-web/src/components/noteName-create/notename.controller.js
index 4f85dda..e42f862 100644
--- a/zeppelin-web/src/components/noteName-create/notename.controller.js
+++ b/zeppelin-web/src/components/noteName-create/notename.controller.js
@@ -36,9 +36,10 @@ angular.module('zeppelinWebApp').controller('NotenameCtrl', function($scope, not
vm.createNote();
};
- vm.preVisible = function(clone) {
- $scope.note.notename = vm.newNoteName();
+ vm.preVisible = function(clone, sourceNoteName) {
vm.clone = clone;
+ vm.sourceNoteName = sourceNoteName;
+ $scope.note.notename = vm.clone ? vm.cloneNoteName() : vm.newNoteName();
$scope.$apply();
};
@@ -56,4 +57,30 @@ angular.module('zeppelinWebApp').controller('NotenameCtrl', function($scope, not
return 'Untitled Note ' + newCount;
};
+ vm.cloneNoteName = function() {
+ var copyCount = 1;
+ var newCloneName = '';
+ var lastIndex = vm.sourceNoteName.lastIndexOf(' ');
+ var endsWithNumber = !!vm.sourceNoteName.match('^.+?\\s\\d$');
+ var noteNamePrefix = endsWithNumber ? vm.sourceNoteName.substr(0, lastIndex) : vm.sourceNoteName;
+ var regexp = new RegExp('^' + noteNamePrefix + ' .+');
+
+ angular.forEach(vm.notes.flatList, function(noteName) {
+ noteName = noteName.name;
+ if (noteName.match(regexp)) {
+ var lastCopyCount = noteName.substr(lastIndex).trim();
+ newCloneName = noteNamePrefix;
+ lastCopyCount = parseInt(lastCopyCount);
+ if (copyCount <= lastCopyCount) {
+ copyCount = lastCopyCount + 1;
+ }
+ }
+ });
+
+ if (!newCloneName) {
+ newCloneName = vm.sourceNoteName;
+ }
+ return newCloneName + ' ' + copyCount;
+ };
+
});
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/401c8137/zeppelin-web/src/components/noteName-create/visible.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/noteName-create/visible.directive.js b/zeppelin-web/src/components/noteName-create/visible.directive.js
index d0fe977..e50864b 100644
--- a/zeppelin-web/src/components/noteName-create/visible.directive.js
+++ b/zeppelin-web/src/components/noteName-create/visible.directive.js
@@ -21,17 +21,18 @@ angular.module('zeppelinWebApp').directive('modalvisible', function() {
postVisibleCallback: '&postvisiblecallback',
targetinput: '@targetinput'
},
- link: function(scope, elem, attrs) {
+ link: function(scope, element, attrs) {
// Add some listeners
var previsibleMethod = scope.preVisibleCallback;
var postVisibleMethod = scope.postVisibleCallback;
- elem.on('show.bs.modal',function(e) {
- var relatedTgt = angular.element(e.relatedTarget);
- var clone = relatedTgt.data('clone');
+ element.on('show.bs.modal',function(e) {
+ var relatedTarget = angular.element(e.relatedTarget);
+ var clone = relatedTarget.data('clone');
+ var sourceNoteName = relatedTarget.data('source-note-name');
var cloneNote = clone ? true : false;
- previsibleMethod()(cloneNote);
+ previsibleMethod()(cloneNote, sourceNoteName);
});
- elem.on('shown.bs.modal', function(e) {
+ element.on('shown.bs.modal', function(e) {
if (scope.targetinput) {
angular.element(e.target).find('input#' + scope.targetinput).select();
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/401c8137/zeppelin-web/test/spec/controllers/notename.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/test/spec/controllers/notename.js b/zeppelin-web/test/spec/controllers/notename.js
new file mode 100644
index 0000000..8f6b85a
--- /dev/null
+++ b/zeppelin-web/test/spec/controllers/notename.js
@@ -0,0 +1,42 @@
+'use strict';
+
+describe('Controller: NotenameCtrl', function() {
+ beforeEach(module('zeppelinWebApp'));
+
+ var scope;
+ var ctrl;
+ var notebookList;
+
+ beforeEach(inject(function($injector, $rootScope, $controller) {
+ notebookList = $injector.get('notebookListDataFactory');
+ scope = $rootScope.$new();
+ ctrl = $controller('NotenameCtrl', {
+ $scope: scope,
+ notebookListDataFactory: notebookList
+ });
+ }));
+
+ it('should create a new name from current name when cloneNoteName is called', function() {
+ var notesList = [
+ {name: 'dsds 1', id: '1'},
+ {name: 'dsds 2', id: '2'},
+ {name: 'test name', id: '3'},
+ {name: 'aa bb cc', id: '4'},
+ {name: 'Untitled Note 6', id: '4'}
+ ];
+
+ notebookList.setNotes(notesList);
+
+ ctrl.sourceNoteName = 'test name';
+ expect(ctrl.cloneNoteName()).toEqual('test name 1');
+ ctrl.sourceNoteName = 'aa bb cc';
+ expect(ctrl.cloneNoteName()).toEqual('aa bb cc 1');
+ ctrl.sourceNoteName = 'Untitled Note 6';
+ expect(ctrl.cloneNoteName()).toEqual('Untitled Note 7');
+ ctrl.sourceNoteName = 'My_note';
+ expect(ctrl.cloneNoteName()).toEqual('My_note 1');
+ ctrl.sourceNoteName = 'dsds 2';
+ expect(ctrl.cloneNoteName()).toEqual('dsds 3');
+ });
+
+});