mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42:41 +01:00
f9e84d1a88
Summary: Ref T9132. This is kind of a mess because the tokenizer rewrite left rendering tokenizers in Javascript a little rough. This causes bugs like icons not showing up on tokens in the "Policy" dialog, which there's a task for somewhere I think. I think I've fixed it enough that the beahavior is now correct (i.e., icons show up properly), but some of the code is a bit iffy. I'll eventually clean this up properly, but it's fairly well contained for now. Test Plan: - Reassigned a task. - Put a task up for grabs. - No reassign on closed tasks. Reviewers: chad Reviewed By: chad Maniphest Tasks: T9132 Differential Revision: https://secure.phabricator.com/D14669
155 lines
3.1 KiB
JavaScript
155 lines
3.1 KiB
JavaScript
/**
|
|
* @provides phuix-form-control-view
|
|
* @requires javelin-install
|
|
* javelin-dom
|
|
*/
|
|
|
|
JX.install('PHUIXFormControl', {
|
|
|
|
members: {
|
|
_node: null,
|
|
_labelNode: null,
|
|
_errorNode: null,
|
|
_inputNode: null,
|
|
_valueSetCallback: null,
|
|
_valueGetCallback: null,
|
|
|
|
setLabel: function(label) {
|
|
JX.DOM.setContent(this._getLabelNode(), label);
|
|
return this;
|
|
},
|
|
|
|
setError: function(error) {
|
|
JX.DOM.setContent(this._getErrorNode(), error);
|
|
return this;
|
|
},
|
|
|
|
setControl: function(type, spec) {
|
|
var node = this._getInputNode();
|
|
|
|
var input;
|
|
switch (type) {
|
|
case 'tokenizer':
|
|
input = this._newTokenizer(spec);
|
|
break;
|
|
case 'select':
|
|
input = this._newSelect(spec);
|
|
break;
|
|
default:
|
|
// TODO: Default or better error?
|
|
JX.$E('Bad Input Type');
|
|
return;
|
|
}
|
|
|
|
JX.DOM.setContent(node, input.node);
|
|
this._valueGetCallback = input.get;
|
|
this._valueSetCallback = input.set;
|
|
|
|
return this;
|
|
},
|
|
|
|
setValue: function(value) {
|
|
this._valueSetCallback(value);
|
|
return this;
|
|
},
|
|
|
|
getValue: function() {
|
|
return this._valueGetCallback();
|
|
},
|
|
|
|
getNode: function() {
|
|
if (!this._node) {
|
|
|
|
var attrs = {
|
|
className: 'aphront-form-control grouped'
|
|
};
|
|
|
|
var content = [
|
|
this._getLabelNode(),
|
|
this._getErrorNode(),
|
|
this._getInputNode()
|
|
];
|
|
|
|
this._node = JX.$N('div', attrs, content);
|
|
}
|
|
|
|
return this._node;
|
|
},
|
|
|
|
_getLabelNode: function() {
|
|
if (!this._labelNode) {
|
|
var attrs = {
|
|
className: 'aphront-form-label'
|
|
};
|
|
|
|
this._labelNode = JX.$N('label', attrs);
|
|
}
|
|
|
|
return this._labelNode;
|
|
},
|
|
|
|
_getErrorNode: function() {
|
|
if (!this._errorNode) {
|
|
var attrs = {
|
|
className: 'aphront-form-error'
|
|
};
|
|
|
|
this._errorNode = JX.$N('span', attrs);
|
|
}
|
|
|
|
return this._errorNode;
|
|
},
|
|
|
|
_getInputNode: function() {
|
|
if (!this._inputNode) {
|
|
var attrs = {
|
|
className: 'aphront-form-input'
|
|
};
|
|
|
|
this._inputNode = JX.$N('div', attrs);
|
|
}
|
|
|
|
return this._inputNode;
|
|
},
|
|
|
|
_newTokenizer: function(spec) {
|
|
var build = JX.Prefab.newTokenizerFromTemplate(
|
|
spec.markup,
|
|
spec.config);
|
|
build.tokenizer.start();
|
|
|
|
function set_value(map) {
|
|
for (var k in map) {
|
|
var v = JX.Prefab.transformDatasourceResults(map[k]);
|
|
build.tokenizer.addToken(k, v);
|
|
}
|
|
}
|
|
|
|
set_value(spec.value || {});
|
|
|
|
return {
|
|
node: build.node,
|
|
get: function() {
|
|
return JX.keys(build.tokenizer.getTokens());
|
|
},
|
|
set: set_value
|
|
};
|
|
},
|
|
|
|
_newSelect: function(spec) {
|
|
var node = JX.Prefab.renderSelect(spec.options, spec.value);
|
|
|
|
return {
|
|
node: node,
|
|
get: function() {
|
|
return node.value;
|
|
},
|
|
set: function(value) {
|
|
node.value = value;
|
|
}
|
|
};
|
|
}
|
|
|
|
}
|
|
|
|
});
|