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 @@ +
+
+ + Add + +
+
+ + Edit + + + Cancel + + + Save + +
+
\ 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
+ + +