diff --git a/client/client/app/components/ngbFeatureInfoPanel/index.js b/client/client/app/components/ngbFeatureInfoPanel/index.js
index 48a52eac0..ea41ab18b 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/index.js
+++ b/client/client/app/components/ngbFeatureInfoPanel/index.js
@@ -12,8 +12,9 @@ import ngbFeatureInfoPanelService from './ngbFeatureInfoPanel.service';
// Import app modules
import dataServices from '../../../dataServices/angular-module';
import ngbFeatureInfo from './ngbFeatureInfo';
+import ngbFeatureInfoMainActions from './ngbFeatureInfo/ngbFeatureInfoMainActions';
-export default angular.module('ngbFeatureInfoPanel', [ dataServices, ngbFeatureInfo ])
+export default angular.module('ngbFeatureInfoPanel', [ dataServices, ngbFeatureInfo, ngbFeatureInfoMainActions ])
.service('ngbFeatureInfoPanelService', ngbFeatureInfoPanelService.instance)
.component('ngbFeatureInfoPanel', component)
.controller(controller.UID, controller)
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.controller.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.controller.js
index f21a138c6..7d7a70a91 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.controller.js
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.controller.js
@@ -8,7 +8,6 @@ export default class ngbFeatureInfoMainController {
sequenceProgress = 0;
isSequenceLoading = true;
error = null;
- _isGeneralInfoOpen = true;
constructor($scope, dispatcher, genomeDataService, bamDataService, $anchorScroll, ngbFeatureInfoPanelService) {
Object.assign(this, {$scope, dispatcher, genomeDataService, bamDataService, $anchorScroll, ngbFeatureInfoPanelService});
@@ -26,7 +25,20 @@ export default class ngbFeatureInfoMainController {
else {
this.isReadLoadingis = false;
}
- this.dispatcher.on('feature:info:changes:cancel', this.onClickCancelBtn.bind(this));
+ const onClickEditBtn = () => this.onClickEditBtn();
+ const onClickCancelBtn = () => this.onClickCancelBtn();
+ const onClickSaveBtn = () => this.onClickSaveBtn();
+ const scrollTo = (id) => this.scrollTo(id);
+ this.dispatcher.on('feature:info:edit:click', onClickEditBtn);
+ this.dispatcher.on('feature:info:cancel:click', onClickCancelBtn);
+ this.dispatcher.on('feature:info:save:click', onClickSaveBtn);
+ this.dispatcher.on('feature:info:add:click', scrollTo);
+ $scope.$on('$destroy', () => {
+ dispatcher.removeListener('feature:info:edit:click', onClickEditBtn);
+ dispatcher.removeListener('feature:info:cancel:click', onClickCancelBtn);
+ dispatcher.removeListener('feature:info:save:click', onClickSaveBtn);
+ dispatcher.removeListener('feature:info:add:click', scrollTo);
+ });
}
loadSequence() {
@@ -102,43 +114,49 @@ export default class ngbFeatureInfoMainController {
this.$anchorScroll(id);
}
- get editMode () {
+ get editMode() {
return this.ngbFeatureInfoPanelService.editMode;
}
-
- get disableSave () {
- return this.ngbFeatureInfoPanelService.disableSaveButton();
+ set editMode(value) {
+ this.ngbFeatureInfoPanelService.editMode = value;
}
get saveError () {
return this.ngbFeatureInfoPanelService.saveError;
}
-
- get saveInProgress () {
- return this.ngbFeatureInfoPanelService.saveInProgress;
+ set saveError (value) {
+ this.ngbFeatureInfoPanelService.saveError = value;
}
get isGeneralInfoOpen () {
- return this._isGeneralInfoOpen;
+ return this.ngbFeatureInfoPanelService.isGeneralInfoOpen;
}
set isGeneralInfoOpen (value) {
- this._isGeneralInfoOpen = value;
+ this.ngbFeatureInfoPanelService.isGeneralInfoOpen = value;
}
- onClickEditBtn (event) {
- if (event) {
- event.stopPropagation();
- }
- this.ngbFeatureInfoPanelService.editMode = true;
+ get saveInProgress() {
+ return this.ngbFeatureInfoPanelService.saveInProgress;
+ }
+ set saveInProgress(value) {
+ this.ngbFeatureInfoPanelService.saveInProgress = value;
+ }
+
+ onClickEditBtn () {
+ this.editMode = true;
this.ngbFeatureInfoPanelService.newAttributes = this.properties;
}
- onClickSaveBtn (event) {
- if (event) {
- event.stopPropagation();
- }
- this.ngbFeatureInfoPanelService.saveInProgress = true;
+ onClickCancelBtn () {
+ this.editMode = false;
+ this.ngbFeatureInfoPanelService.newAttributes = null;
+ this.saveInProgress = false;
+ this.saveError = null;
+ }
+
+ onClickSaveBtn () {
+ this.saveInProgress = true;
this.ngbFeatureInfoPanelService.saveNewAttributes();
this.properties = [...this.ngbFeatureInfoPanelService.newAttributes
.map(newAttribute => (
@@ -152,23 +170,13 @@ export default class ngbFeatureInfoMainController {
this.feature = this.ngbFeatureInfoPanelService.updateFeatureInfo(this.feature);
this.ngbFeatureInfoPanelService.sendNewGeneInfo(this.fileId, this.uuid, this.feature)
.then((success) => {
- this.ngbFeatureInfoPanelService.saveInProgress = false;
+ this.saveInProgress = false;
const data = { trackId: this.fileId };
if (success) {
- this.onClickCancelBtn();
+ this.dispatcher.emitSimpleEvent('feature:info:changes:cancel');
this.dispatcher.emitSimpleEvent('feature:info:saved', data);
}
this.$scope.$apply();
});
}
-
- onClickCancelBtn (event) {
- if (event) {
- event.stopPropagation();
- }
- this.ngbFeatureInfoPanelService.editMode = false;
- this.ngbFeatureInfoPanelService.newAttributes = null;
- this.ngbFeatureInfoPanelService.saveInProgress = false;
- this.ngbFeatureInfoPanelService.saveError = null;
- }
-}
\ No newline at end of file
+}
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.scss b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.scss
index 1d367e6a3..7e68f18f8 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.scss
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.scss
@@ -43,14 +43,3 @@ ngb-feature-info-main{
.sequence-loading-error {
color: red;
}
-
-.general-information-buttons {
- margin: 0px;
- font-size: 14px;
- color: #6699ff;
- float: right;
-}
-
-.cancel-button {
- color: #494949;
-}
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.tpl.html b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.tpl.html
index e3dc299a1..13c334fd0 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.tpl.html
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMain/ngbFeatureInfoMain.tpl.html
@@ -1,27 +1,11 @@
-
+
General information
-
- Edit
-
-
- Cancel
-
-
- Save
-
@@ -31,7 +15,8 @@
-
+
+
@@ -58,7 +43,7 @@
-
+
Sequence
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/index.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/index.js
new file mode 100644
index 000000000..0393b525f
--- /dev/null
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/index.js
@@ -0,0 +1,12 @@
+import angular from 'angular';
+
+import './ngbFeatureInfoMainActions.scss';
+
+import controller from './ngbFeatureInfoMainActions.controller';
+import component from './ngbFeatureInfoMainActions.component';
+
+
+export default angular.module('ngbFeatureInfoMainActions', [])
+ .component('ngbFeatureInfoMainActions', component)
+ .controller(controller.UID, controller)
+ .name;
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.component.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.component.js
new file mode 100644
index 000000000..6932e1111
--- /dev/null
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.component.js
@@ -0,0 +1,6 @@
+import controller from './ngbFeatureInfoMainActions.controller';
+
+export default {
+ controller: controller.UID,
+ template: require('./ngbFeatureInfoMainActions.tpl.html')
+};
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.controller.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.controller.js
new file mode 100644
index 000000000..1b4e8ee96
--- /dev/null
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.controller.js
@@ -0,0 +1,43 @@
+export default class ngbFeatureInfoMainActionsController {
+
+ static get UID() {
+ return 'ngbFeatureInfoMainActionsController';
+ }
+
+ constructor($scope, dispatcher, ngbFeatureInfoPanelService) {
+ Object.assign(this, {$scope, dispatcher, ngbFeatureInfoPanelService});
+ const onClickCancelBtn = () => this.onClickCancelBtn();
+ this.dispatcher.on('feature:info:changes:cancel', onClickCancelBtn);
+ $scope.$on('$destroy', () => {
+ dispatcher.removeListener('feature:info:changes:cancel', onClickCancelBtn);
+ });
+ }
+
+ get editMode() {
+ return this.ngbFeatureInfoPanelService.editMode;
+ }
+
+ get disableSave () {
+ return this.ngbFeatureInfoPanelService.disableSaveButton();
+ }
+
+ get saveInProgress () {
+ return this.ngbFeatureInfoPanelService.saveInProgress;
+ }
+
+ onClickEditBtn () {
+ this.dispatcher.emitSimpleEvent('feature:info:edit:click');
+ }
+
+ onClickCancelBtn () {
+ this.dispatcher.emitSimpleEvent('feature:info:cancel:click');
+ }
+
+ onClickSaveBtn () {
+ this.dispatcher.emitSimpleEvent('feature:info:save:click');
+ }
+
+ onClickAddBtn () {
+ this.dispatcher.emitSimpleEvent('feature:info:add:click', 'sequencePanel');
+ }
+}
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.scss b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.scss
new file mode 100644
index 000000000..1f728f4e0
--- /dev/null
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.scss
@@ -0,0 +1,19 @@
+ngb-feature-info-main-actions {
+ width: 100%;
+}
+
+.buttons-container {
+ display: flex;
+ justify-content: space-between;
+}
+
+.general-information-button {
+ margin: 0;
+ font-size: 14px;
+ color: #6699ff;
+ float: right;
+}
+
+.cancel-button {
+ color: #494949;
+}
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.tpl.html b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.tpl.html
new file mode 100644
index 000000000..271d6a37f
--- /dev/null
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbFeatureInfoMainActions/ngbFeatureInfoMainActions.tpl.html
@@ -0,0 +1,28 @@
+
\ No newline at end of file
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.controller.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.controller.js
index 765f17b64..e96aaa6db 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.controller.js
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.controller.js
@@ -6,8 +6,13 @@ export default class ngbInfoRowsController {
saveRequest = {};
- constructor($scope, ngbFeatureInfoPanelService, $compile) {
- Object.assign(this, {$scope, ngbFeatureInfoPanelService, $compile});
+ constructor($scope, dispatcher, ngbFeatureInfoPanelService, $compile) {
+ Object.assign(this, {$scope, dispatcher, ngbFeatureInfoPanelService, $compile});
+ const onClickAddBtn = () => this.onClickAddBtn();
+ this.dispatcher.on('feature:info:add:click', onClickAddBtn);
+ $scope.$on('$destroy', () => {
+ dispatcher.removeListener('feature:info:add:click', onClickAddBtn);
+ });
}
get attributes () {
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.scss b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.scss
index 0c9eb94cc..5cd22dc7c 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.scss
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.scss
@@ -73,14 +73,6 @@ ngb-info-rows {
}
}
- .add-button {
- font-size: 14px;
- color: #679edb;
- margin: 0;
- padding: 0;
- margin-top: 5px;
- }
-
.property-name.editable {
margin-left: 0;
margin-right: 5px;
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.tpl.html b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.tpl.html
index e6bfd77ee..45cd648c5 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.tpl.html
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfo/ngbInfoRows/ngbInfoRows.tpl.html
@@ -129,11 +129,4 @@
-
- Add
-
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.controller.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.controller.js
index 219d304b5..351d99aae 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.controller.js
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.controller.js
@@ -8,20 +8,28 @@ export default class ngbFeatureInfoPanelController {
return this.$scope.$ctrl.geneId;
}
+
constructor($scope, dispatcher, ngbFeatureInfoConstant, ngbFeatureInfoPanelService) {
Object.assign(this, {$scope, dispatcher, ngbFeatureInfoConstant, ngbFeatureInfoPanelService});
}
selectTab(db){
+ this.ngbFeatureInfoPanelService.isMainTabSelected = false;
this.dispatcher.emitGlobalEvent(`feature:info:select:${db}`, {db, featureId: this.geneId});
}
get editMode() {
- this.$scope.$parent.editMode = this.ngbFeatureInfoPanelService.editMode;
- return this.ngbFeatureInfoPanelService.editMode;
+ const editMode = this.ngbFeatureInfoPanelService.editMode;
+ this.$scope.$parent.editMode = editMode;
+ return editMode;
+ }
+
+ selectMainTab() {
+ this.ngbFeatureInfoPanelService.isMainTabSelected = true;
}
selectHistoryTab () {
+ this.ngbFeatureInfoPanelService.isMainTabSelected = false;
this.ngbFeatureInfoPanelService.getHistoryInProgress = true;
this.ngbFeatureInfoPanelService.getGeneInfoHistory(this.fileId, this.uuid)
.then((success) => {
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.run.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.run.js
index 599aca814..596b1b68d 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.run.js
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.run.js
@@ -91,6 +91,11 @@ export default function run($mdDialog, dispatcher, ngbFeatureInfoPanelService, g
} else {
$scope.error = 'Network error';
}
+ $scope.showFooter = () => (
+ ngbFeatureInfoPanelService.isMainTabSelected &&
+ ngbFeatureInfoPanelService.isGeneralInfoOpen &&
+ formattedResult.uuid
+ );
$scope.close = () => {
if (ngbFeatureInfoPanelService.editMode &&
ngbFeatureInfoPanelService.unsavedChanges($scope.properties)
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.scss b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.scss
index 3feb79f1a..44db46a00 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.scss
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.scss
@@ -42,3 +42,7 @@ md-pagination-wrapper {
font-size: 16px;
}
}
+
+.feature-info-main-actions {
+ padding-left: 0;
+}
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.service.js b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.service.js
index 323853e3a..1151989fa 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.service.js
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.service.js
@@ -17,6 +17,8 @@ export default class ngbFeatureInfoPanelService {
_historyData = [];
_saveInProgress = false;
getHistoryInProgress = false;
+ _isGeneralInfoOpen = true;
+ _isMainTabSelected;
static instance(geneDataService) {
return new ngbFeatureInfoPanelService(geneDataService);
@@ -26,6 +28,14 @@ export default class ngbFeatureInfoPanelService {
Object.assign(this, {geneDataService});
}
+ get isGeneralInfoOpen () {
+ return this._isGeneralInfoOpen;
+ }
+
+ set isGeneralInfoOpen (value) {
+ this._isGeneralInfoOpen = value;
+ }
+
get editMode() {
return this._editMode;
}
@@ -88,6 +98,14 @@ export default class ngbFeatureInfoPanelService {
this._saveInProgress = progress;
}
+ get isMainTabSelected() {
+ return this._isMainTabSelected;
+ }
+
+ set isMainTabSelected(value) {
+ this._isMainTabSelected = value;
+ }
+
removeAttribute(property) {
const attributes = this.attributes;
const index = attributes.indexOf(property);
diff --git a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.tpl.html b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.tpl.html
index 18a77a59f..ce0c6a8a2 100644
--- a/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.tpl.html
+++ b/client/client/app/components/ngbFeatureInfoPanel/ngbFeatureInfoPanel.tpl.html
@@ -1,6 +1,6 @@
-
+
{{$ctrl.panelTitle}}
-
+
{{$ctrl.panelTitle}}
Feature info
+
+
+