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 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)
36 // When in edit mode, present a tag name selector and tag value
37 // selector/editor depending of the tag type.
38 window.TagEditorRow = {
39 view: function(vnode) {
42 if (vnode.attrs.name() in vnode.attrs.vocabulary().types &&
43 'options' in vnode.attrs.vocabulary().types[vnode.attrs.name()]) {
44 valueOpts = vnode.attrs.vocabulary().types[vnode.attrs.name()].options
46 valueOpts.push(vnode.attrs.value())
51 vnode.attrs.editMode &&
52 m('div.text-center', m('a.btn.btn-default.btn-sm', {
56 onclick: function(e) { vnode.attrs.removeTag() }
57 }, m('i.fa.fa-fw.fa-trash-o'))),
61 vnode.attrs.editMode ?
62 m("div", {key: 'name-'+vnode.attrs.name()},[m(SelectOrAutocomplete, {
63 options: (vnode.attrs.name() in vnode.attrs.vocabulary().types)
64 ? Object.keys(vnode.attrs.vocabulary().types)
65 : Object.keys(vnode.attrs.vocabulary().types).concat(vnode.attrs.name()),
66 value: vnode.attrs.name,
67 create: vnode.attrs.vocabulary().strict
72 vnode.attrs.editMode ?
73 m("div", {key: 'value-'+vnode.attrs.name()}, [m(SelectOrAutocomplete, {
75 value: vnode.attrs.value,
76 create: (vnode.attrs.name() in vnode.attrs.vocabulary().types)
77 ? (vnode.attrs.vocabulary().types[vnode.attrs.name()].type == 'text') ||
78 vnode.attrs.vocabulary().types[vnode.attrs.name()].overridable || false
79 : true, // If tag not in vocabulary, we should accept any value
87 window.TagEditorTable = {
88 view: function(vnode) {
89 return m("table.table.table-condensed", {
93 m("col", {width:"5%"}),
94 m("col", {width:"25%"}),
95 m("col", {width:"70%"}),
105 vnode.attrs.tags.map(function(tag, idx) {
106 return m(TagEditorRow, {
108 removeTag: function() { vnode.attrs.tags.splice(idx, 1) },
109 editMode: vnode.attrs.editMode,
112 vocabulary: vnode.attrs.vocabulary
120 window.TagEditorApp = {
121 oninit: function(vnode) {
122 vnode.state.sessionDB = new SessionDB()
124 vnode.state.vocabulary = m.stream({"strict":false, "types":{}})
125 m.request('/vocabulary.json').then(vnode.state.vocabulary)
126 vnode.state.editMode = vnode.attrs.targetEditable
128 vnode.state.tags = []
129 vnode.state.isDirty = false
130 vnode.state.objPath = '/arvados/v1/'+vnode.attrs.targetController+'/'+vnode.attrs.targetUuid
131 vnode.state.sessionDB.request(
132 vnode.state.sessionDB.loadLocal(), vnode.state.objPath, {
134 select: JSON.stringify(['properties']) // FIXME: not working
136 }).then(function(obj) {
138 Object.keys(obj.properties).forEach(function(k) {
139 vnode.state.tags.push({
141 value: m.stream(obj.properties[k])
144 vnode.state.dirty = m.stream(null)
145 vnode.state.tags.map(function(tag) {
146 console.log('connecting events for tag: '+tag.name())
147 tag.name.map(m.redraw)
148 tag.name.map(vnode.state.dirty)
149 tag.value.map(vnode.state.dirty)
151 vnode.state.dirty.map(function() {
152 vnode.state.isDirty = true
153 console.log('dirty!')
155 console.log('Setting up isDirty to false')
156 vnode.state.isDirty = false
160 view: function(vnode) {
164 editMode: vnode.state.editMode,
165 tags: vnode.state.tags,
166 vocabulary: vnode.state.vocabulary
168 vnode.state.editMode &&
172 m("a.btn.btn-primary.btn-sm", {
173 onclick: function(e) {
174 vnode.state.tags.push({
175 name: m.stream('new tag'),
176 value: m.stream('new tag value')
180 m("i.glyphicon.glyphicon-plus"),
184 m("div.pull-right", [
185 m("a.btn.btn-primary.btn-sm", {
186 onclick: function(e) {
188 vnode.state.tags.forEach(function(t) {
189 tags[t.name()] = t.value()
191 vnode.state.sessionDB.request(
192 vnode.state.sessionDB.loadLocal(),
193 vnode.state.objPath, {
195 data: {properties: JSON.stringify(tags)}
199 vnode.state.isDirty = false
202 }, vnode.state.isDirty ? ' Save changes ' : ' Saved ')