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.state.selector = $(vnode.dom).selectize({
22 create: vnode.attrs.create ? function(input) {
25 items: [vnode.attrs.value()],
26 options: vnode.attrs.options.map(function(option) {
27 return {value: option}
29 onChange: function(val) {
30 vnode.attrs.value(val)
37 // When in edit mode, present a tag name selector and tag value
38 // selector/editor depending of the tag type.
39 window.TagEditorRow = {
40 view: function(vnode) {
43 if (vnode.attrs.name() in vnode.attrs.vocabulary().types &&
44 'options' in vnode.attrs.vocabulary().types[vnode.attrs.name()]) {
45 valueOpts = vnode.attrs.vocabulary().types[vnode.attrs.name()].options
47 valueOpts.push(vnode.attrs.value())
52 vnode.attrs.editMode &&
53 m('div.text-center', m('a.btn.btn-default.btn-sm', {
57 onclick: function(e) { vnode.attrs.removeTag() }
58 }, m('i.fa.fa-fw.fa-trash-o'))),
62 vnode.attrs.editMode ?
63 m("div", {key: 'name-'+vnode.attrs.name()},[m(SelectOrAutocomplete, {
64 options: (vnode.attrs.name() in vnode.attrs.vocabulary().types)
65 ? Object.keys(vnode.attrs.vocabulary().types)
66 : Object.keys(vnode.attrs.vocabulary().types).concat(vnode.attrs.name()),
67 value: vnode.attrs.name,
68 create: vnode.attrs.vocabulary().strict
73 vnode.attrs.editMode ?
74 m("div", {key: 'value-'+vnode.attrs.name()}, [m(SelectOrAutocomplete, {
76 value: vnode.attrs.value,
77 create: (vnode.attrs.name() in vnode.attrs.vocabulary().types)
78 ? (vnode.attrs.vocabulary().types[vnode.attrs.name()].type == 'text') ||
79 vnode.attrs.vocabulary().types[vnode.attrs.name()].overridable || false
80 : true, // If tag not in vocabulary, we should accept any value
88 window.TagEditorTable = {
89 view: function(vnode) {
90 return m("table.table.table-condensed", {
94 m("col", {width:"5%"}),
95 m("col", {width:"25%"}),
96 m("col", {width:"70%"}),
106 vnode.attrs.tags.map(function(tag, idx) {
107 return m(TagEditorRow, {
109 removeTag: function() { vnode.attrs.tags.splice(idx, 1) },
110 editMode: vnode.attrs.editMode,
113 vocabulary: vnode.attrs.vocabulary
121 window.TagEditorApp = {
122 oninit: function(vnode) {
123 vnode.state.saveLabel = m.stream(' Save ')
124 vnode.state.sessionDB = new SessionDB()
126 vnode.state.vocabulary = m.stream({"strict":false, "types":{}})
127 m.request('/vocabulary.json').then(vnode.state.vocabulary)
128 vnode.state.editMode = vnode.attrs.targetEditable
130 vnode.state.tags = []
131 vnode.state.objPath = '/arvados/v1/'+vnode.attrs.targetController+'/'+vnode.attrs.targetUuid
132 vnode.state.sessionDB.request(
133 vnode.state.sessionDB.loadLocal(), vnode.state.objPath, {
135 select: JSON.stringify(['properties']) // FIXME: not working
137 }).then(function(obj) {
139 Object.keys(obj.properties).forEach(function(k) {
140 vnode.state.tags.push({
142 value: m.stream(obj.properties[k])
145 vnode.state.dirty = m.stream(null)
146 vnode.state.tags.map(function(tag) {
147 tag.name.map(m.redraw)
148 tag.name.map(vnode.state.dirty)
149 tag.value.map(vnode.state.dirty)
154 view: function(vnode) {
158 editMode: vnode.state.editMode,
159 tags: vnode.state.tags,
160 vocabulary: vnode.state.vocabulary
162 vnode.state.editMode &&
166 m("a.btn.btn-primary.btn-sm", {
167 onclick: function(e) {
168 vnode.state.tags.push({
169 name: m.stream('new tag'),
170 value: m.stream('new tag value')
174 m("i.glyphicon.glyphicon-plus"),
178 m("div.pull-right", [
180 m("a.btn.btn-primary.btn-sm", {
181 onclick: function(e) {
182 vnode.state.saveLabel('Saving...')
184 vnode.state.tags.forEach(function(t) {
185 tags[t.name()] = t.value()
187 vnode.state.sessionDB.request(
188 vnode.state.sessionDB.loadLocal(),
189 vnode.state.objPath, {
191 data: {properties: JSON.stringify(tags)}
194 vnode.state.saveLabel(' Save ')
198 }, vnode.state.saveLabel)