Skip to content
This repository has been archived by the owner on Nov 2, 2021. It is now read-only.

Commit

Permalink
Merge pull request #90 from bpoldrack/fix-webui
Browse files Browse the repository at this point in the history
[WIP] Fix web ui for tags and procedures
  • Loading branch information
bpoldrack committed Apr 11, 2019
2 parents fbaa8d8 + a6768db commit ef3ea21
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 51 deletions.
5 changes: 3 additions & 2 deletions datalad_hirni/commands/import_dicoms.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from datalad.interface.utils import eval_results
from datalad.distribution.create import Create
from datalad.utils import rmtree
from datalad.dochelpers import exc_str

# bound dataset method
import datalad_hirni.commands.dicom2spec
Expand Down Expand Up @@ -231,9 +232,9 @@ def __call__(path, acqid=None, dataset=None,
type='file',
action='import DICOM tarball',
logger=lgr,
message='%s already exists' % e.filename)
message=exc_str(e))
rmtree(acq_dir)

return # we can't do anything
finally:
if op.exists(acq_dir):
lgr.debug("Killing temp dataset at %s ...", acq_dir)
Expand Down
2 changes: 1 addition & 1 deletion datalad_hirni/resources/procedures/setup_bids_dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
to_add = set()

# configure minimal set of metadata extractors
ds.run_procedure(['cfg_metadatatypes', 'bids', 'nifti'])
ds.run_procedure(['cfg_metadatatypes', 'bids', 'nifti1'])

# amend gitattributes
ds.repo.set_gitattributes([(path, {'annex.largefiles': 'nothing'})
Expand Down
162 changes: 114 additions & 48 deletions datalad_hirni/resources/webapp/specedit.html
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
{{ studyspecfile }}/{{ spec.location }} [ <code>{{ spec.type }}</code><span v-if="spec.uid">; {{ spec.uid }}</span> ]
</div>
<ul class="card-body">
<li v-for="(sval, skey) in spec" v-if="sval === Object(sval) && !(skey in {subject: null, 'anon-subject': null, procedures: null})">
<li v-for="(sval, skey) in spec" v-if="sval === Object(sval) && !(skey in {subject: null, 'anon-subject': null, procedures: null, tags: null})">
<div class="form-group row" v-bind:title="field_purpose[skey] || ''">
<!-- this is some editable property -->
<label form="specform" class="col-sm-2 col-form-label">
Expand Down Expand Up @@ -114,63 +114,90 @@
</div>
</li>

<li data-toggle="tooltip" data-placement="right" title="Add a new field to this record, prefix field name with 'bids-' to add a BIDS property">
<div class="input-group add-field">
<input v-bind:id="'tba_fieldname_' + specs_key" type="text" placeholder="new field name">
<div class="input-group-append">
<button @click="addField(spec, 'tba_fieldname_' + specs_key);" class="btn btn-outline-success" type="button">Add Field</button>
<!-- tags -->
<div class="form-group row" v-bind:title="field_purpose['tags']">
<label form="specform" class="col-sm-2 col-form-label">
tags
</label>
<div class="col-sm-10">
<li v-for="(tag, tag_key) in spec.tags" :key="tag.id">
<div class="input-group">
<input v-model="spec.tags[tag_key]" type="text" class="form-control"> <!-- :disabled="sval.approved" -->
<div class="input-group-append">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" tooltip="Perform actions on this record value">Actions</button>
<div class="dropdown-menu">
<span @click="removeTag(specs_key, tag_key);" class="oi oi-trash">Delete</span>
</div>
</div>
</div>
</li>

<!-- TODO: Provide an input field to directly name the to-be-added tag; see add field at the bottom of a snippet -->
<button class="btn btn-outline-success" type="button" @click="addTag(specs_key, '');">Add tag</button>
</div>
</div>
</li>
<!-- procedures -->
<span v-if="spec.procedures"> <!-- TODO this needs a proper box and header-->
<div class="card-header" v-bind:title="field_purpose['procedures']">

<!-- procedures -->
<div class="form-group row" v-bind:title="field_purpose['procedures']">
<label form="specform" class="col-sm-2 col-form-label">
procedures
</div>
<div class="form-group row">
<li v-for="proc in spec.procedures">
<!-- procedure dict -->
<!-- TODO: some header? -->
<div v-for="(pval, pkey) in proc" v-if="pval === Object(pval)">
<div class="form-group row" v-bind:title="field_purpose[pkey] || ''">
<!-- this is some editable property -->
<label form="specform" class="col-sm-2 col-form-label">
{{ pkey }}
</label>
<div class="col-sm-10">
<div class="input-group">
<input v-model="pval.value" type="text" :disabled="pval.approved" class="form-control">
<div class="input-group-append">
<div class="input-group-text">
<input v-model="pval.approved" type="checkbox" :id="pkey" title="Toggle approval of record">
</div>
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" tooltip="Perform actions on this record value">Actions</button>
<div class="dropdown-menu">
<!-- TODO: removeElement is inapplicable here ATM -->
<!-- <span @click="removeElement(spec, skey);" class="oi oi-trash">Delete</span> -->
</label>
<ul class="col-sm-10">
<ul v-for="(proc, proc_key) in spec.procedures" v-if="spec.procedures" :key="proc.id">
<div class="card border-dark"><!--TODO: some frame -->
<ul v-for="(pval, pkey) in spec.procedures[proc_key]" class="form-group row">
<label form="specform" class="col-sm-2 col-form-label">
{{ pkey }}
</label>
<div class="col-sm-10">
<div class="input-group">
<input v-model="spec.procedures[proc_key][pkey].value" type="text" :disabled="spec.procedures[proc_key][pkey].approved" class="form-control">
<div class="input-group-append">
<div class="input-group-text">
<input v-model="spec.procedures[proc_key][pkey].approved" type="checkbox" :id="pkey" title="Toggle approval of record">
</div>

</div>
</div>
</div>
</div>
</ul>
<div class="col-sm-2">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" tooltip="Perform actions on this record value">Actions</button>
<div class="dropdown-menu">
<span @click="removeProcedure(specs_key, proc_key);" class="oi oi-trash">Delete</span>
</div>
</div>
</div>
</ul>
</ul>
</div>
<div class="form-group row">
<label form="specform" class="col-sm-2 col-form-label"></label>
<div class="input-group add-field col-sm-10">
<select v-model="selected_procedure" id="procedureselection" class="form-control">
<!--TODO: Add procedure.help as tooltip to the options -->
<option v-for="procedure in procedures" v-bind:value="procedure">
{{ procedure.name }}
</option>
</select>
<div class="input-group-append">
<button class="btn btn-outline-success" type="button" @click="addProcedure(specs_key, selected_procedure);">Add procedure</button>
</div>
</li>
</div>
</div>

<!-- Add (predefined) procedure(s) -->
<li data-toggle="tooltip" data-placement="right" title="Add a new procedure to this record, to be executed upon conversion in order of this list">
<div class="input-group add-procedure">
<!-- TODO
<input v-bind:id="'tba_fieldname_' + specs_key" type="text" placeholder="new field name">
<div class="input-group-append">
<button @click="addField(spec, 'tba_fieldname_' + specs_key);" class="btn btn-outline-success" type="button">Add Field</button>
</div>
-->

<li data-toggle="tooltip" data-placement="right" title="Add a new field to this record, prefix field name with 'bids-' to add a BIDS property">
<div class="input-group add-field">
<input v-bind:id="'tba_fieldname_' + specs_key" type="text" placeholder="new field name">
<div class="input-group-append">
<button @click="addField(spec, 'tba_fieldname_' + specs_key);" class="btn btn-outline-success" type="button">Add Field</button>
</div>
</li>
</div>
</li>



</div>
</span>
</ul>
</li>
</ul>
Expand All @@ -197,10 +224,12 @@
specs: [],
specfiles: [],
studyspecfile: null,
selected_procedure: null,
field_purpose: {
comment: "Comments or notes for this record",
procedures: "Procedures to call for converting data associated with this record to BIDS format, may use template syntax and placeholders",
description: "Record description, originally extracted from the source file(s)"
description: "Record description, originally extracted from the source file(s)",
tags: "Tags to markup this record. Procedures may react to particular tags"
},
procedures: []
},
Expand Down Expand Up @@ -230,6 +259,43 @@
);
input_field.value = '';
},
addTag: function(specs_key, tag_string) {
if(!app.specs[specs_key].tags){
app.$set(app.specs[specs_key],
'tags',
[]
);
};
app.$set(app.specs[specs_key].tags,
app.specs[specs_key].tags.length,
tag_string);
},
removeTag: function(specs_key, tag_idx) {
app.specs[specs_key].tags.splice(tag_idx, 1);
},
addProcedure: function(specs_key, selected_procedure) {
if(!selected_procedure) {
alert("No procedure selected.");
} else {
if(!app.specs[specs_key].procedures){
app.$set(app.specs[specs_key],
'procedures',
[]
);
}
app.$set(
app.specs[specs_key].procedures,
app.specs[specs_key].procedures.length,
{'procedure-name': {value: selected_procedure.name, approved: false},
'procedure-call': {value: selected_procedure.format, approved: false},
'on-anonymize': {value: false, approved: false}
}
);
}
},
removeProcedure: function(specs_key, proc_key) {
app.specs[specs_key].procedures.splice(proc_key, 1);
},
assign2all: function(k, v) {
for (i=0; i < app.$data.specs.length; i++) {
app.$set(app.$data.specs[i], k, {value: v, approved: true});
Expand Down Expand Up @@ -272,7 +338,7 @@
.catch(function (error) {
console.log(error);
});
}
},
}
});

Expand Down

0 comments on commit ef3ea21

Please sign in to comment.