You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mi...@apache.org on 2016/10/05 02:18:19 UTC
zeppelin git commit: ZEPPELIN-1440 Notebook clone: prefix name with
"Copy of" and end with count
Repository: zeppelin
Updated Branches:
refs/heads/branch-0.6 1ace6c034 -> 5a211f331
ZEPPELIN-1440 Notebook clone: prefix name with "Copy of" and end with count
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
Improvement
https://issues.apache.org/jira/browse/ZEPPELIN-1440
Create a new book and clone on ui or see unit test in notename.js
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">
* 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
(cherry picked from commit 401c81370c48930a4887a529f522773dd6ffb66e)
Signed-off-by: Mina Lee <mi...@apache.org>
Conflicts:
zeppelin-web/src/components/noteName-create/visible.directive.js
Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/5a211f33
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/5a211f33
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/5a211f33
Branch: refs/heads/branch-0.6
Commit: 5a211f3317988cd8882d80880d8abfc3302b7e83
Parents: 1ace6c0
Author: Renjith Kamath <re...@gmail.com>
Authored: Thu Sep 29 10:50:14 2016 +0530
Committer: Mina Lee <mi...@apache.org>
Committed: Wed Oct 5 11:17:59 2016 +0900
----------------------------------------------------------------------
.../src/app/notebook/notebook-actionBar.html | 2 +-
.../noteName-create/notename.controller.js | 31 +++++++++++-
.../noteName-create/visible.directive.js | 53 ++++++++++----------
zeppelin-web/test/spec/controllers/notename.js | 42 ++++++++++++++++
4 files changed, 99 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/5a211f33/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 4f7d984..be7a3fe 100644
--- a/zeppelin-web/src/app/notebook/notebook-actionBar.html
+++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html
@@ -52,7 +52,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/5a211f33/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 6965134..5016344 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/5a211f33/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 3c15dcb..01df8a9 100644
--- a/zeppelin-web/src/components/noteName-create/visible.directive.js
+++ b/zeppelin-web/src/components/noteName-create/visible.directive.js
@@ -13,30 +13,31 @@
*/
'use strict';
-angular.module('zeppelinWebApp').directive('modalvisible', function () {
- return {
- restrict: 'A',
- scope: {
- preVisibleCallback: '&previsiblecallback',
- postVisibleCallback: '&postvisiblecallback',
- targetinput: '@targetinput'
- },
- link: function(scope, elem, 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');
- var cloneNote = clone ? true : false;
- previsibleMethod()(cloneNote);
- });
- elem.on('shown.bs.modal', function(e) {
- if(scope.targetinput) {
- angular.element(e.target).find('input#' + scope.targetinput ).select();
- }
- postVisibleMethod();
- });
+angular.module('zeppelinWebApp').directive('modalvisible', function() {
+ return {
+ restrict: 'A',
+ scope: {
+ preVisibleCallback: '&previsiblecallback',
+ postVisibleCallback: '&postvisiblecallback',
+ targetinput: '@targetinput'
+ },
+ link: function(scope, element, attrs) {
+ // Add some listeners
+ var previsibleMethod = scope.preVisibleCallback;
+ var postVisibleMethod = scope.postVisibleCallback;
+ 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, sourceNoteName);
+ });
+ element.on('shown.bs.modal', function(e) {
+ if (scope.targetinput) {
+ angular.element(e.target).find('input#' + scope.targetinput).select();
}
- };
-});
+ postVisibleMethod();
+ });
+ }
+ };
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/5a211f33/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');
+ });
+
+});