define([
'require'
, 'jquery'
, 'nbextensions/visualpython/src/common/vpCommon'
, 'nbextensions/visualpython/src/common/constant'
, 'nbextensions/visualpython/src/common/StringBuilder'
, 'nbextensions/visualpython/src/common/vpFuncJS'
, 'nbextensions/visualpython/src/common/component/vpSuggestInputText'
, 'nbextensions/visualpython/src/pandas/common/pandasGenerator'
], function (requirejs, $, vpCommon, vpConst, sb, vpFuncJS, vpSuggestInputText, pdGen) {
// ìµì
ìì±
const funcOptProp = {
funcName : "max()"
, funcID : "pyBuilt_max"
}
/**
* html load ì½ë°±. ê³ ì id ìì±íì¬ ë¶ê³¼íë©° js ê°ì²´ í´ëì¤ ìì±íì¬ ì»¨í
ì´ëë¡ ì ë¬
* @param {function} callback í¸ì¶ì(컨í
ì´ë) ì ì½ë°±í¨ì
* @param {JSON} meta ë©í ë°ì´í°
*/
var optionLoadCallback = function(callback, meta) {
// document.getElementsByTagName("head")[0].appendChild(link);
// 컨í
ì´ëìì ì ë¬ë callback í¨ìê° ì¡´ì¬íë©´ ì¤í.
if (typeof(callback) === 'function') {
var uuid = 'u' + vpCommon.getUUID();
// ìµë 10í ì¤ë³µëì§ ìëë¡ ì²´í¬
for (var idx = 0; idx < 10; idx++) {
// ì´ë¯¸ ì¬ì©ì¤ì¸ uuid ì¸ ê²½ì° ë¤ì ìì±
if ($(vpConst.VP_CONTAINER_ID).find("." + uuid).length > 0) {
uuid = 'u' + vpCommon.getUUID();
}
}
$(vpCommon.wrapSelector(vpCommon.formatString("#{0}", vpConst.OPTION_GREEN_ROOM))).find(vpCommon.formatString(".{0}", vpConst.API_OPTION_PAGE)).addClass(uuid);
// ìµì
ê°ì²´ ìì±
var osSample = new PythonCommon(uuid);
osSample.metadata = meta;
// ìµì
ìì± í ë¹.
osSample.setOptionProp(funcOptProp);
// html ì¤ì .
osSample.initHtml();
// TODO: meta load ì²ë¦¬ ë°©ì ê²í .
// ë°©ì 1. callback ìì ì²ë¦¬
// ë°©ì 2. initHtml ë´ìì meta ì¡´ì¬ ì initê³¼ ëìì ì²ë¦¬.
// ë°©ì 3. initHtml íì ìµì
ë´ìì load í¨ì í¸ì¶.
callback(osSample); // ê°ì²´ë¥¼ callback ì¸ìë¡ ì ë¬
}
}
/**
* html ë¡ë.
* @param {function} callback í¸ì¶ì(컨í
ì´ë) ì ì½ë°±í¨ì
* @param {JSON} meta ë©í ë°ì´í°
*/
var initOption = function(callback, meta) {
vpCommon.loadHtml(vpCommon.wrapSelector(vpCommon.formatString("#{0}", vpConst.OPTION_GREEN_ROOM)), "python_common/index.html", optionLoadCallback, callback, meta);
}
/**
* 본 ìµì
ì²ë¦¬ ìí í´ëì¤
* @param {String} uuid ê³ ì id
*/
var PythonCommon = function(uuid) {
this.uuid = uuid; // Load html ììì uuid.
this.state = {
}
this.package = {
input: [
{ name: 'vp_pyReturn' },
{ name: 'vp_pyType' },
{ name: 'vp_pyMaxObj' },
{ name: 'vp_pyArgMeta' }
]
}
}
/**
* vpFuncJS ìì ìì
*/
PythonCommon.prototype = Object.create(vpFuncJS.VpFuncJS.prototype);
/**
* ì í¨ì± ê²ì¬
* @returns ì í¨ì± ê²ì¬ ê²°ê³¼. ì í©ì true
*/
PythonCommon.prototype.optionValidation = function() {
// FIXME: í´ë¹ ìµì
ì¤ì ì´ ì í¨íì§ ì²´í¬.
// vpContainer.js ììë addLibraryToJupyterCell ìì ìµì´ ì¤íí return false ì¸ê²½ì° ì ì§íëë¡ ì¤ê³í¨.
return true;
}
PythonCommon.prototype.getMetadata = function(id) {
if (this.metadata == undefined)
return "";
var len = this.metadata.options.length;
for (var i = 0; i < len; i++) {
var obj = this.metadata.options[i];
if (obj.id == id)
return obj.value;
}
return "";
}
/**
* html ë´ë¶ binding ì²ë¦¬
*/
PythonCommon.prototype.initHtml = function() {
this.loadCss(Jupyter.notebook.base_url + vpConst.BASE_PATH + vpConst.STYLE_PATH + "python_common/index.css");
var that = this;
var sbPageContent = new sb.StringBuilder();
var sbTagString = new sb.StringBuilder();
// íì ìµì
í
ì´ë¸ ë ì´ìì
var tblLayoutRequire = this.createVERSimpleLayout("25%");
// ì
ë ¥ ì í ì í
sbTagString.clear();
sbTagString.appendFormatLine('', 'vp_pyType', 'vp-select');
sbTagString.appendFormatLine('{1} ', 'object', 'select iterable object');
sbTagString.appendFormatLine('{1} ', 'argument', 'input arguments');
sbTagString.appendLine(' ');
tblLayoutRequire.addReqRow("Select Type", sbTagString.toString());
sbTagString.clear();
sbTagString.appendFormatLine(' ', 'vp_pyMaxObj', 'vp-input');
tblLayoutRequire.addReqRow("Input Data", sbTagString.toString());
// meta save
// load metadata
var decodedMeta = decodeURIComponent(that.getMetadata('vp_pyArgMeta'));
sbTagString.clear();
sbTagString.appendFormatLine('
', 'vp_pyMaxArg');
sbTagString.appendFormatLine('
', 'vp_pyArgMeta');
if (decodedMeta != "") {
// if metadata exist, use as a default
var argMeta = JSON.parse(decodedMeta);
argMeta != undefined && argMeta.forEach(arg => {
sbTagString.appendFormatLine('
', 'vp-py-arg-box');
sbTagString.appendFormatLine(' ', 'vp-input vp-py-args', arg);
sbTagString.appendFormatLine(' ', 'Del', 'vp-py-btn vp-py-arg-del');
sbTagString.appendFormatLine(' ', 'Add', 'vp-py-btn vp-py-arg-add');
sbTagString.appendLine('
');
});
} else {
sbTagString.appendFormatLine('
', 'vp-py-arg-box');
sbTagString.appendFormatLine(' ', 'vp-input vp-py-args');
sbTagString.appendFormatLine(' ', 'Del', 'vp-py-btn vp-py-arg-del');
sbTagString.appendFormatLine(' ', 'Add', 'vp-py-btn vp-py-arg-add');
sbTagString.appendLine('
');
}
sbTagString.appendFormatLine('
');
tblLayoutRequire.addRow("Input Data", sbTagString.toString());
sbTagString.clear();
sbTagString.appendFormat(' ', 'vp_pyReturn', 'vp-input l');
tblLayoutRequire.addRow("Allocate to", sbTagString.toString());
// íì ìµì
ìì (ìì½ëì¸ ë°ì¤)
var accBoxRequire = this.createOptionContainer(vpConst.API_REQUIRE_OPTION_BOX_CAPTION);
accBoxRequire.setOpenBox(true);
accBoxRequire.appendContent(tblLayoutRequire.toTagString());
sbPageContent.appendLine(accBoxRequire.toTagString());
this.setPage(sbPageContent.toString());
sbPageContent.clear();
var defaultType = that.getMetadata('vp_pyType');
if (defaultType == '') {
defaultType = 'object';
}
this.showTypeRow(defaultType);
// async bind suggest input
pdGen.vp_searchVarList([], function(result) {
var varList = JSON.parse(result);
varList = varList.map(function(v) {
return { label: v.varName + ' (' + v.varType + ')', value: v.varName };
});
var suggestInput = new vpSuggestInputText.vpSuggestInputText();
suggestInput.setComponentID('vp_pyMaxObj');
suggestInput.addClass('vp-input');
suggestInput.setSuggestList(function() { return varList; });
suggestInput.setNormalFilter(false);
suggestInput.setValue($(that.wrapSelector('#vp_pyMaxObj')).val());
$(that.wrapSelector('#vp_pyMaxObj')).replaceWith(function() {
return suggestInput.toTagString();
})
});
// E1. select type event : show/hide row as type
$(this.wrapSelector('#vp_pyType')).click(function() {
var type = $(this).val();
that.showTypeRow(type);
});
// E2. add row
$(document).on('click', this.wrapSelector('.vp-py-arg-add'), function() {
sbTagString.clear();
sbTagString.appendFormatLine('', 'vp-py-arg-box');
sbTagString.appendFormatLine(' ', 'vp-input vp-py-args');
sbTagString.appendFormatLine(' ', 'Del', 'vp-py-btn vp-py-arg-del');
sbTagString.appendFormatLine(' ', 'Add', 'vp-py-btn vp-py-arg-add');
sbTagString.appendFormatLine('
');
var tag = $(sbTagString.toString());
// append after selected row
$(this).closest('.vp-py-arg-box').after(tag);
// focus on added input tag
$(tag).find('.vp-py-args').focus();
});
// E2-2. add row by enter
$(document).on('keydown', this.wrapSelector('.vp-py-args'), function(event) {
if (event.keyCode == 13) {
// add row by enter
$(this).parent().find('.vp-py-arg-add').click();
}
});
// E3. delete/clear row
$(document).on('click', this.wrapSelector('.vp-py-arg-del'), function() {
var length = $(that.wrapSelector('.vp-py-arg-box')).length;
if (length <= 1) {
// if only one left, clear it
$(this).parent().find('.vp-py-args').val('');
} else {
// remove it
$(this).closest('.vp-py-arg-box').remove();
}
});
}
/**
* show type row
* @param {String} type object/argument
*/
PythonCommon.prototype.showTypeRow = function(type) {
if (type == 'object') {
$(this.wrapSelector('#vp_pyMaxObj')).closest('tr').show();
$(this.wrapSelector('#vp_pyMaxArg')).closest('tr').hide();
} else if (type == 'argument') {
$(this.wrapSelector('#vp_pyMaxArg')).closest('tr').show();
$(this.wrapSelector('#vp_pyMaxObj')).closest('tr').hide();
}
}
/**
* ì½ë ìì±
* @param {boolean} addCell ì
ì ì¶ê°
* @param {boolean} exec ì¤íì¬ë¶
* @returns ìì±ë ì½ë
*/
PythonCommon.prototype.generateCode = function(addCell = false, exec = false) {
var code = new sb.StringBuilder();
var returnVar = $(this.wrapSelector('#vp_pyReturn')).val();
if (returnVar != '') {
code.appendFormat("{0} = ", returnVar);
}
var argMeta = [];
var type = $(this.wrapSelector('#vp_pyType')).val();
if (type == 'object') {
code.appendFormat('max({0})', $(this.wrapSelector('#vp_pyMaxObj')).val());
} else if (type == 'argument') {
code.append('max(');
var args = $(this.wrapSelector('#vp_pyMaxArg')).find('.vp-py-args');
var validArgCount = 0;
args.each((i, tag) => {
var argValue = $(tag).val();
if (argValue != '') {
if (validArgCount > 0) {
code.append(', ');
}
code.append(argValue);
argMeta.push(argValue);
validArgCount++;
}
});
code.append(')');
}
// save argument metadata
$(this.wrapSelector('#vp_pyArgMeta')).val(encodeURIComponent(JSON.stringify(argMeta)));
if (addCell) {
this.cellExecute(code.toString(), exec);
}
return code.toString();
}
return {
initOption: initOption
};
});