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

Improve user tagging usability #2722 #2731

Merged
merged 24 commits into from
Sep 20, 2022
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ca9871b
Tagging multi-assignment - WIP
anton-abushkevich Jun 22, 2022
3bfcb11
Tagging multi-assignment - WIP
anton-abushkevich Jun 23, 2022
28a5ce1
Tagging multi-assignment - WIP
anton-abushkevich Jul 11, 2022
f4a99e8
Tagging multi-assignment - WIP
anton-abushkevich Jul 11, 2022
3df096d
Tagging multi-assignment - WIP
anton-abushkevich Jul 14, 2022
bfa0f35
Tagging multi-assignment - done
anton-abushkevich Jul 14, 2022
aa6ceb7
Tagging multi-assignment - style adjustments
anton-abushkevich Jul 18, 2022
64a13ca
Tagging multi-assignment - permissions to owner or admin or granted
anton-abushkevich Jul 21, 2022
5554fff
Tagging multi-assignment - add reusables
anton-abushkevich Jul 21, 2022
82db929
Tagging multi-assignment - selected assets redesign
anton-abushkevich Jul 21, 2022
1c939f6
Tagging multi-assignment - build fix
anton-abushkevich Jul 28, 2022
a12a21e
Tagging multi-assignment - redesign
anton-abushkevich Aug 2, 2022
4e3a8f3
Tagging multi-assignment - checkboxes, concept-set entity browser
anton-abushkevich Aug 4, 2022
95db8e3
Tagging multi-assignment - move selectors to modal windows
anton-abushkevich Aug 9, 2022
70a7d28
Tagging multi-assignment - additional i18n
anton-abushkevich Aug 9, 2022
6be3bca
Tagging multi-assignment - i18n fix
anton-abushkevich Aug 10, 2022
f3ca65f
Tagging multi-assignment - fixes
anton-abushkevich Aug 10, 2022
2221256
Tagging multi-assignment - protected tags assignment fix, admin: tags…
anton-abushkevich Aug 11, 2022
3d7dc8e
Tagging multi-assignment - add multi-selection handling
anton-abushkevich Aug 11, 2022
af05568
Tagging multi-assignment - filter protected tags if not permitted, UI…
anton-abushkevich Aug 12, 2022
0cbbb7d
Tagging multi-assignment - additional i18n and UI fixes
anton-abushkevich Aug 12, 2022
c3584dd
Tagging multi-assignment - asset buffer clear fix
anton-abushkevich Aug 12, 2022
7c88671
Tagging multi-assignment - protected tags no permission message
anton-abushkevich Aug 15, 2022
e00d1a4
Tagging multi-assignment - hide Tagging section by default
anton-abushkevich Sep 16, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions js/components/circe/components/ConceptSetBrowserTemplate.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
<!-- /ko -->

<div data-bind="visible: !loading() && !isProcessing()">
<div class="conceptset-browser-panel">
<div class="conceptset-browser-panel" data-bind="visible: buttonActionEnabled">
<div class="btn btn-sm btn-primary new-concept-set"
data-bind="click: addConceptSet, css: {disabled: disableConceptSetButton}, text: buttonActionText, visible: buttonActionEnabled"></div>
data-bind="click: addConceptSet, css: {disabled: disableConceptSetButton}, text: buttonActionText"></div>
</div>
<faceted-datatable params="
dataTableId: repositoryConceptSetTableId,
Expand Down
2 changes: 1 addition & 1 deletion js/components/cohort/linked-cohort-list.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ define([
'appConfig',
'text!./linked-cohort-list.html',
'const',
'components/cohort-definition-browser',
'components/entityBrowsers/cohort-definition-browser',
'less!./linked-cohort-list.less',
'components/linked-entity-list',
'components/modal',
Expand Down
11 changes: 6 additions & 5 deletions js/components/entity-browser.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
define([
'knockout',
'text!./cohort-definition-browser.html',
'components/Component',
'utils/Renderers',
'utils/CommonUtils',
'faceted-datatable',
], function(ko, view, Component, renderers, commonUtils) {
], function(ko, Component, renderers, commonUtils) {
class EntityBrowser extends Component {
constructor(params) {
super(params);
this.onSelect = params.onSelect;
this.multiChoice = params.multiChoice || false;
this.showCheckboxes = params.showCheckboxes || false;
this.renderLink = params.renderLink === undefined ? true : params.renderLink;
this.showModal = params.showModal;
this.scrollY = this.multiChoice ? (params.scrollY !== undefined ? params.scrollY : '50vh') : params.scrollY;
this.scrollCollapse = params.scrollCollapse || false;
this.selectedDataIds =
this.multiChoice && params.selectedData
(this.showCheckboxes || this.multiChoice) && params.selectedData
? (params.selectedData() || []).map(({ id }) => id)
: [];
this.data = ko.observableArray([]);
Expand All @@ -40,11 +41,11 @@ define([
]
: null;

this.columns = !!this.multiChoice
this.columns = !!this.multiChoice || this.showCheckboxes
? [
{
data: 'selected',
class: this.classes({extra: 'text-center'}),
width: '20px',
render: () => renderers.renderCheckbox('selected'),
searchable: false,
orderable: false,
Expand Down
21 changes: 21 additions & 0 deletions js/components/entityBrowsers/characterization-browser.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<div data-bind="visible: !isLoading()">
<faceted-datatable params="
orderColumn: 3,
autoWidth: false,
reference:data,
columns: columns,
options: options,
buttons: buttons,
dom: tableDom,
rowClick: !multiChoice ? rowClick : null,
scrollY: scrollY,
selectedData: filteredData,
dtApi: dtApi,
pageLength: pageLength,
lengthMenu: lengthMenu,
language: ko.i18n('datatable.language')
">
</faceted-datatable>
</div>

<loading data-bind="visible: isLoading()" params="status: ko.i18n('cc.loading', 'Loading Cohort Characterization list...')"></loading>
105 changes: 105 additions & 0 deletions js/components/entityBrowsers/characterization-browser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
define([
'knockout',
'text!./characterization-browser.html',
'appConfig',
'atlas-state',
'components/entity-browser',
'services/AuthAPI',
'utils/CommonUtils',
'pages/characterizations/services/CharacterizationService',
'utils/DatatableUtils',
'faceted-datatable',
], function (
ko,
view,
config,
sharedState,
EntityBrowser,
authApi,
commonUtils,
CharacterizationService,
datatableUtils,
) {

class CharacterizationBrowser extends EntityBrowser {
constructor(params) {
super(params);
this.showModal = params.showModal;
this.myDesignsOnly = params.myDesignsOnly || false;
this.data = ko.observableArray();
const { pageLength, lengthMenu } = commonUtils.getTableOptions('M');
this.pageLength = params.pageLength || pageLength;
this.lengthMenu = params.lengthMenu || lengthMenu;

this.options = {
Facets: [
{
'caption': ko.i18n('facets.caption.created', 'Created'),
'binding': (o) => datatableUtils.getFacetForDate(o.createdDate)
},
{
'caption': ko.i18n('facets.caption.updated', 'Updated'),
'binding': (o) => datatableUtils.getFacetForDate(o.modifiedDate)
},
{
'caption': ko.i18n('facets.caption.author', 'Author'),
'binding': datatableUtils.getFacetForCreatedBy,
},
{
'caption': ko.i18n('facets.caption.designs', 'Designs'),
'binding': datatableUtils.getFacetForDesign,
},
]
};

this.columns = ko.observableArray([
...this.columns,
{
title: ko.i18n('columns.id', 'Id'),
className: 'id-column',
data: 'id'
},
{
title: ko.i18n('columns.name', 'Name'),
render: this.renderLink ?
datatableUtils.getLinkFormatter(d => ({ label: d['name'], linkish: !this.multiChoice })) :
(s,p,d) => `${d.name}`,
},
{
title: ko.i18n('columns.created', 'Created'),
className: 'date-column',
render: datatableUtils.getDateFieldFormatter('createdDate'),
},
{
title: ko.i18n('columns.updated', 'Updated'),
className: 'date-column',
render: datatableUtils.getDateFieldFormatter('modifiedDate'),
},
{
title: ko.i18n('columns.author', 'Author'),
className: 'author-column',
render: datatableUtils.getCreatedByFormatter(),
}
]);
}

async loadData() {
this.isLoading(true);
CharacterizationService
.loadCharacterizationList()
.then(res => {
const analysisList = ko.unwrap(this.myDesignsOnly)
? res.content.filter(a => a.hasWriteAccess || (a.createdBy && authApi.subject() === a.createdBy.login))
: res.content;
datatableUtils.coalesceField(analysisList, 'modifiedDate', 'createdDate');
datatableUtils.addTagGroupsToFacets(analysisList, this.options.Facets);
datatableUtils.addTagGroupsToColumns(analysisList, this.columns);
this.data(analysisList.map(item => ({ selected: ko.observable(this.selectedDataIds.includes(item.id)), ...item })));
this.isLoading(false);
});
}

}

return commonUtils.build('characterization-browser', CharacterizationBrowser, view);
});
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ define([
'components/entity-browser',
'utils/CommonUtils',
'services/CohortDefinition',
'services/AuthAPI',
'utils/DatatableUtils',
'faceted-datatable',
], function (
Expand All @@ -16,13 +17,15 @@ define([
EntityBrowser,
commonUtils,
CohortDefinitionService,
authApi,
datatableUtils,
) {

class CohortDefinitionBrowser extends EntityBrowser {
constructor(params) {
super(params);
this.showModal = params.showModal;
this.myDesignsOnly = params.myDesignsOnly || false;
this.data = ko.observableArray();
const { pageLength, lengthMenu } = commonUtils.getTableOptions('M');
this.pageLength = params.pageLength || pageLength;
Expand Down Expand Up @@ -58,7 +61,9 @@ define([
},
{
title: ko.i18n('columns.name', 'Name'),
render: datatableUtils.getLinkFormatter(d => ({ label: d['name'], linkish: !this.multiChoice })),
render: this.renderLink ?
datatableUtils.getLinkFormatter(d => ({ label: d['name'], linkish: !this.multiChoice })) :
(s,p,d) => `${d.name}`
},
{
title: ko.i18n('columns.created', 'Created'),
Expand All @@ -82,10 +87,13 @@ define([
try {
this.isLoading(true);
const data = await CohortDefinitionService.getCohortDefinitionList();
datatableUtils.coalesceField(data, 'modifiedDate', 'createdDate');
datatableUtils.addTagGroupsToFacets(data, this.options.Facets);
datatableUtils.addTagGroupsToColumns(data, this.columns);
this.data(data.map(item => ({ selected: ko.observable(this.selectedDataIds.includes(item.id)), ...item })));
const cohortList = ko.unwrap(this.myDesignsOnly)
? data.filter(c => c.hasWriteAccess || (c.createdBy && authApi.subject() === c.createdBy.login))
: data;
datatableUtils.coalesceField(cohortList, 'modifiedDate', 'createdDate');
datatableUtils.addTagGroupsToFacets(cohortList, this.options.Facets);
datatableUtils.addTagGroupsToColumns(cohortList, this.columns);
this.data(cohortList.map(item => ({ selected: ko.observable(this.selectedDataIds.includes(item.id)), ...item })));
} catch (err) {
console.error(err);
} finally {
Expand Down
21 changes: 21 additions & 0 deletions js/components/entityBrowsers/cohort-pathway-browser.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<div data-bind="visible: !isLoading()">
<faceted-datatable params="
orderColumn: 3,
autoWidth: false,
reference:data,
columns: columns,
options: options,
buttons: buttons,
dom: tableDom,
rowClick: !multiChoice ? rowClick : null,
scrollY: scrollY,
selectedData: filteredData,
dtApi: dtApi,
pageLength: pageLength,
lengthMenu: lengthMenu,
language: ko.i18n('datatable.language')
">
</faceted-datatable>
</div>

<loading data-bind="visible: isLoading()" params="status: ko.i18n('common.loadingWithDots', 'Loading...')"></loading>
102 changes: 102 additions & 0 deletions js/components/entityBrowsers/cohort-pathway-browser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
define([
'knockout',
'text!./cohort-pathway-browser.html',
'appConfig',
'atlas-state',
'components/entity-browser',
'services/AuthAPI',
'utils/CommonUtils',
'pages/pathways/PathwayService',
'utils/DatatableUtils',
'faceted-datatable',
], function (
ko,
view,
config,
sharedState,
EntityBrowser,
authApi,
commonUtils,
PathwayService,
datatableUtils,
) {

class CohortPathwayBrowser extends EntityBrowser {
constructor(params) {
super(params);
this.showModal = params.showModal;
this.data = ko.observableArray();
this.myDesignsOnly = params.myDesignsOnly || false;
const { pageLength, lengthMenu } = commonUtils.getTableOptions('M');
this.pageLength = params.pageLength || pageLength;
this.lengthMenu = params.lengthMenu || lengthMenu;

this.options = {
Facets: [
{
'caption': ko.i18n('facets.caption.created', 'Created'),
'binding': (o) => datatableUtils.getFacetForDate(o.createdDate)
},
{
'caption': ko.i18n('facets.caption.updated', 'Updated'),
'binding': (o) => datatableUtils.getFacetForDate(o.modifiedDate)
},
{
'caption': ko.i18n('facets.caption.author', 'Author'),
'binding': datatableUtils.getFacetForCreatedBy,
},
{
'caption': ko.i18n('facets.caption.designs', 'Designs'),
'binding': datatableUtils.getFacetForDesign,
},
]
};

this.columns = ko.observableArray([
...this.columns,
{
title: ko.i18n('columns.id', 'Id'),
className: 'id-column',
data: 'id'
},
{
title: ko.i18n('columns.name', 'Name'),
render: this.renderLink ?
datatableUtils.getLinkFormatter(d => ({ label: d['name'], linkish: !this.multiChoice })) :
(s,p,d) => `${d.name}`
},
{
title: ko.i18n('columns.created', 'Created'),
className: 'date-column',
render: datatableUtils.getDateFieldFormatter('createdDate'),
},
{
title: ko.i18n('columns.updated', 'Updated'),
className: 'date-column',
render: datatableUtils.getDateFieldFormatter('modifiedDate'),
},
{
title: ko.i18n('columns.author', 'Author'),
className: 'author-column',
render: datatableUtils.getCreatedByFormatter(),
}
]);
}

async loadData() {
this.isLoading(true);
const analysisListResp = await PathwayService.list();
const analysisList = ko.unwrap(this.myDesignsOnly)
? analysisListResp.content.filter(a => a.hasWriteAccess || (a.createdBy && authApi.subject() === a.createdBy.login))
: analysisListResp.content;
datatableUtils.coalesceField(analysisList, 'modifiedDate', 'createdDate');
datatableUtils.addTagGroupsToFacets(analysisList, this.options.Facets);
datatableUtils.addTagGroupsToColumns(analysisList, this.columns);
this.data(analysisList.map(item => ({ selected: ko.observable(this.selectedDataIds.includes(item.id)), ...item })));
this.isLoading(false);
}

}

return commonUtils.build('cohort-pathway-browser', CohortPathwayBrowser, view);
});
21 changes: 21 additions & 0 deletions js/components/entityBrowsers/concept-set-entity-browser.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<div data-bind="visible: !isLoading()">
<faceted-datatable params="
orderColumn: 3,
autoWidth: false,
reference:data,
columns: columns,
options: options,
buttons: buttons,
dom: tableDom,
rowClick: !multiChoice ? rowClick : null,
scrollY: scrollY,
selectedData: filteredData,
dtApi: dtApi,
pageLength: pageLength,
lengthMenu: lengthMenu,
language: ko.i18n('datatable.language')
">
</faceted-datatable>
</div>

<loading data-bind="visible: isLoading()" params="status: ko.i18n('common.loadingWithDots', 'Loading...')"></loading>
Loading