1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 window.SelectOrAutocomplete = {
6 view: function(vnode) {
12 value: vnode.attrs.value
15 oncreate: function(vnode) {
16 $(vnode.dom).selectize({
22 placeholder: vnode.attrs.placeholder,
23 create: vnode.attrs.create ? function(input) {
26 items: [vnode.attrs.value()],
27 options: vnode.attrs.options.map(function(option) {
28 return {value: option}
30 onChange: function(val) {
32 vnode.attrs.value(val)
39 window.TagEditorRow = {
40 view: function(vnode) {
42 var nameOpts = Object.keys(vnode.attrs.vocabulary().types)
43 if (vnode.attrs.name() != '' && !(vnode.attrs.name() in vnode.attrs.vocabulary().types)) {
44 nameOpts.push(vnode.attrs.name())
48 if (vnode.attrs.name() in vnode.attrs.vocabulary().types &&
49 'options' in vnode.attrs.vocabulary().types[vnode.attrs.name()]) {
50 valueOpts = vnode.attrs.vocabulary().types[vnode.attrs.name()].options
52 if (vnode.attrs.value() != '') {
53 valueOpts.push(vnode.attrs.value())
58 vnode.attrs.editMode &&
59 m('div.text-center', m('a.btn.btn-default.btn-sm', {
63 onclick: function(e) { vnode.attrs.removeTag() }
64 }, m('i.fa.fa-fw.fa-trash-o'))),
68 vnode.attrs.editMode ?
69 m("div", {key: 'name-'+vnode.attrs.name()},[m(SelectOrAutocomplete, {
71 value: vnode.attrs.name,
72 create: !vnode.attrs.vocabulary().strict,
73 placeholder: 'new tag',
78 vnode.attrs.editMode ?
79 m("div", {key: 'value-'+vnode.attrs.name()}, [m(SelectOrAutocomplete, {
81 value: vnode.attrs.value,
82 placeholder: 'new value',
83 create: (vnode.attrs.name() in vnode.attrs.vocabulary().types)
84 ? (vnode.attrs.vocabulary().types[vnode.attrs.name()].type == 'text') ||
85 vnode.attrs.vocabulary().types[vnode.attrs.name()].overridable || false
86 : true, // If tag not in vocabulary, we should accept any value
94 window.TagEditorTable = {
95 view: function(vnode) {
96 return m("table.table.table-condensed", {
100 m("col", {width:"5%"}),
101 m("col", {width:"25%"}),
102 m("col", {width:"70%"}),
112 vnode.attrs.tags.length > 0
113 ? vnode.attrs.tags.map(function(tag, idx) {
114 return m(TagEditorRow, {
116 removeTag: function() {
117 vnode.attrs.tags.splice(idx, 1)
118 vnode.attrs.dirty(true)
120 editMode: vnode.attrs.editMode,
123 vocabulary: vnode.attrs.vocabulary
126 : m("tr", m("td[colspan=3]", m("center","(no tags)")))
132 window.TagEditorApp = {
133 appendTag: function(vnode, name, value) {
134 var tag = {name: m.stream(name), value: m.stream(value)}
135 tag.name.map(vnode.state.dirty)
136 tag.value.map(vnode.state.dirty)
137 tag.name.map(m.redraw)
138 vnode.state.tags.push(tag)
140 oninit: function(vnode) {
141 vnode.state.sessionDB = new SessionDB()
143 vnode.state.vocabulary = m.stream({"strict":false, "types":{}})
144 m.request('/vocabulary.json').then(vnode.state.vocabulary)
145 vnode.state.editMode = vnode.attrs.targetEditable
146 vnode.state.tags = []
147 vnode.state.dirty = m.stream(false)
148 vnode.state.dirty.map(m.redraw)
149 vnode.state.objPath = '/arvados/v1/'+vnode.attrs.targetController+'/'+vnode.attrs.targetUuid
151 vnode.state.sessionDB.request(
152 vnode.state.sessionDB.loadLocal(),
153 '/arvados/v1/'+vnode.attrs.targetController,
156 filters: JSON.stringify([['uuid', '=', vnode.attrs.targetUuid]]),
157 select: JSON.stringify(['properties'])
159 }).then(function(obj) {
160 if (obj.items.length == 1) {
162 Object.keys(o.properties).forEach(function(k) {
163 vnode.state.appendTag(vnode, k, o.properties[k])
165 // Data synced with server, so dirty state should be false
166 vnode.state.dirty(false)
171 view: function(vnode) {
173 vnode.state.editMode &&
175 m("a.btn.btn-primary.btn-sm"+(!(vnode.state.dirty() === false) ? '' : '.disabled'), {
179 onclick: function(e) {
181 vnode.state.tags.forEach(function(t) {
182 if (t.name() != '' && t.value() != '') {
183 tags[t.name()] = t.value()
186 vnode.state.sessionDB.request(
187 vnode.state.sessionDB.loadLocal(),
188 vnode.state.objPath, {
190 data: {properties: JSON.stringify(tags)}
193 vnode.state.dirty(false)
196 }, !(vnode.state.dirty() === false) ? ' Save changes ' : ' Saved ')
200 editMode: vnode.state.editMode,
201 tags: vnode.state.tags,
202 vocabulary: vnode.state.vocabulary,
203 dirty: vnode.state.dirty
205 vnode.state.editMode &&
208 m("a.btn.btn-primary.btn-sm", {
209 onclick: function(e) {
210 vnode.state.appendTag(vnode, '', '')
213 m("i.glyphicon.glyphicon-plus"),