-
diff --git a/visualpython/html/m_apps/file.html b/visualpython/html/m_apps/file.html
index 07bd8d82..c9d92782 100644
--- a/visualpython/html/m_apps/file.html
+++ b/visualpython/html/m_apps/file.html
@@ -74,7 +74,7 @@
- |
+ |
|
diff --git a/visualpython/js/MainFrame.js b/visualpython/js/MainFrame.js
index f013ed66..9ce588eb 100644
--- a/visualpython/js/MainFrame.js
+++ b/visualpython/js/MainFrame.js
@@ -478,10 +478,10 @@ define([
let parentBlock = null;
let prevBlock = null;
loadStateList.forEach(obj => {
- let { blockType, menuId, menuState, menuConfig, argIdx, position, afterAction } = obj;
+ let { file, blockType, menuId, menuState, menuConfig, argIdx, position, afterAction } = obj;
// get OptionComponent Object
// LAB: relative path needed
- let OptionComponent = require('./' + menuConfig.file);
+ let OptionComponent = require('./' + file);
if (OptionComponent) {
let taskState = menuState.taskState;
let blockState = menuState.blockState;
diff --git a/visualpython/js/com/com_Config.js b/visualpython/js/com/com_Config.js
index 98bfe98d..b5fbf090 100644
--- a/visualpython/js/com/com_Config.js
+++ b/visualpython/js/com/com_Config.js
@@ -208,8 +208,7 @@ define([
vp_config_version: '1.0.0',
vp_signature: 'VisualPython',
vp_position: {},
- // CHROME: default to display vp
- vp_section_display: true,
+ vp_section_display: false,
vp_note_display: false,
vp_menu_width: Config.MENU_MIN_WIDTH,
vp_note_width: Config.BOARD_MIN_WIDTH
@@ -485,7 +484,7 @@ define([
that._checkMounted().then(function() {
that._readFromColab(configKey).then(function(result) {
let data = result;
- if (data == undefined || data == {}) {
+ if (data == undefined || (data instanceof Object && Object.keys(data).length === 0)) {
resolve(data);
return;
}
@@ -493,7 +492,7 @@ define([
resolve(data);
return;
}
- if (Object.keys(data).length > 0) {
+ if (data instanceof Object && Object.keys(data).length > 0) {
resolve(data[dataKey]);
return;
}
@@ -509,7 +508,7 @@ define([
// LAB: use local .visualpython files
that._readFromLab(configKey).then(function(result) {
let data = result;
- if (data == undefined || data == {}) {
+ if (data == undefined || (data instanceof Object && Object.keys(data).length === 0)) {
resolve(data);
return;
}
@@ -517,7 +516,7 @@ define([
resolve(data);
return;
}
- if (Object.keys(data).length > 0) {
+ if (data instanceof Object && Object.keys(data).length > 0) {
resolve(data[dataKey]);
return;
}
@@ -779,6 +778,40 @@ define([
return Config.version;
}
+ checkVersionTimestamp = function() {
+ let that = this;
+ // check version timestamp
+ let nowDate = new Date();
+ this.getData('version_timestamp', 'vpcfg').then(function(data) {
+ let doCheckVersion = false;
+ vpLog.display(VP_LOG_TYPE.DEVELOP, 'Checking its version timestamp... : ' + data);
+ if (data == undefined || (data instanceof Object && Object.keys(data).length === 0)) {
+ // no timestamp, check version
+ doCheckVersion = true;
+ } else if (data != '') {
+ let lastCheck = new Date(parseInt(data));
+ let diffCheck_now = new Date(nowDate.getFullYear(), nowDate.getMonth() + 1, nowDate.getDate());
+ let diffCheck_last = new Date(lastCheck.getFullYear(), lastCheck.getMonth() + 1, lastCheck.getDate());
+
+ let diff = Math.abs(diffCheck_now.getTime() - diffCheck_last.getTime());
+ diff = Math.ceil(diff / (1000 * 3600 * 24));
+
+ if (diff >= 1) {
+ // if More than 1 day passed, check version
+ doCheckVersion = true;
+ }
+ }
+
+ // check version and update version_timestamp
+ if (doCheckVersion == true) {
+ that.checkVpVersion(true);
+ }
+
+ }).catch(function(err) {
+ vpLog.display(VP_LOG_TYPE.ERROR, err);
+ })
+ }
+
checkVpVersion(background=false) {
let that = this;
let nowVersion = this.getVpInstalledVersion();
@@ -818,6 +851,8 @@ define([
switch (clickedBtnIdx) {
case 0:
// cancel
+ // update version_timestamp
+ that.setData({ 'version_timestamp': new Date().getTime() }, 'vpcfg');
break;
case 1:
// update
diff --git a/visualpython/js/com/com_generatorV2.js b/visualpython/js/com/com_generatorV2.js
index 6113af7b..4278b66d 100644
--- a/visualpython/js/com/com_generatorV2.js
+++ b/visualpython/js/com/com_generatorV2.js
@@ -134,7 +134,7 @@ define([
package.options && package.options.forEach(function(o, i) {
var obj = JSON.parse(JSON.stringify(o));
let newTag = vp_createTag(pageThis, obj, state);
- if (obj.required) {
+ if (obj.required === true || obj.output === true) {
tblInput.append(newTag);
} else {
tblOption.append(newTag);
@@ -142,6 +142,9 @@ define([
});
// TODO: userOption
+ if (package.code.includes('${etc}')) {
+
+ }
bindAutoComponentEvent(pageThis);
}
@@ -163,7 +166,7 @@ define([
let value = state[name];
var requiredFontStyle = required == true? 'vp-orange-text' : '';
- var lblTag = $(`
`).attr({
+ var lblTag = $(`
`).attr({
'for': name,
'class': requiredFontStyle,
'title': '(' + name + ')'
diff --git a/visualpython/js/com/component/MultiSelector.js b/visualpython/js/com/component/MultiSelector.js
index 774bb870..06cf0707 100644
--- a/visualpython/js/com/component/MultiSelector.js
+++ b/visualpython/js/com/component/MultiSelector.js
@@ -305,7 +305,7 @@ define([
// select - right
tag.appendFormatLine('
', APP_SELECT_RIGHT);
var selectedList = this.dataList.filter(data => that.selectedList.includes(data.code));
- tag.appendLine(this.renderSelectedBox(selectedList));
+ tag.appendLine(this.renderSelectedBox(this.selectedList));
if (this.allowAdd) {
// add item
tag.appendLine('
');
@@ -380,62 +380,6 @@ define([
that.bindDraggable();
});
- // item indexing
- $(this.wrapSelector('.' + APP_SELECT_ITEM)).on('click', function(event) {
- var dataIdx = $(this).attr('data-idx');
- var idx = $(this).index();
- var added = $(this).hasClass('added'); // right side added item?
- var selector = '';
-
- // remove selection for select box on the other side
- if (added) {
- // remove selection for left side
- $(that.wrapSelector('.' + APP_SELECT_ITEM + ':not(.added)')).removeClass('selected');
- // set selector
- selector = '.added';
- } else {
- // remove selection for right(added) side
- $(that.wrapSelector('.' + APP_SELECT_ITEM + '.added')).removeClass('selected');
- // set selector
- selector = ':not(.added)';
- }
-
- if (vpEvent.keyManager.keyCheck.ctrlKey) {
- // multi-select
- that.pointer = { start: idx, end: -1 };
- $(this).toggleClass('selected');
- } else if (vpEvent.keyManager.keyCheck.shiftKey) {
- // slicing
- var startIdx = that.pointer.start;
-
- if (startIdx == -1) {
- // no selection
- that.pointer = { start: idx, end: -1 };
- } else if (startIdx > idx) {
- // add selection from idx to startIdx
- var tags = $(that.wrapSelector('.' + APP_SELECT_ITEM + selector));
- for (var i = idx; i <= startIdx; i++) {
- $(tags[i]).addClass('selected');
- }
- that.pointer = { start: startIdx, end: idx };
- } else if (startIdx <= idx) {
- // add selection from startIdx to idx
- var tags = $(that.wrapSelector('.' + APP_SELECT_ITEM + selector));
- for (var i = startIdx; i <= idx; i++) {
- $(tags[i]).addClass('selected');
- }
- that.pointer = { start: startIdx, end: idx };
- }
- } else {
- // single-select
- that.pointer = { start: idx, end: -1 };
- // un-select others
- $(that.wrapSelector('.' + APP_SELECT_ITEM + selector)).removeClass('selected');
- // select this
- $(this).addClass('selected');
- }
- });
-
// item indexing - add all
$(this.wrapSelector('.' + APP_SELECT_ADD_ALL_BTN)).on('click', function(event) {
$(that.wrapSelector('.' + APP_SELECT_BOX + '.left .' + APP_SELECT_ITEM)).appendTo(
@@ -510,6 +454,75 @@ define([
that._addNewItem(newItemName);
}
});
+
+ this._bindItemClickEvent();
+ }
+
+ _bindItemClickEvent() {
+ let that = this;
+ // item indexing
+ $(this.wrapSelector('.' + APP_SELECT_ITEM)).off('click');
+ $(this.wrapSelector('.' + APP_SELECT_ITEM)).on('click', function(event) {
+ var dataIdx = $(this).attr('data-idx');
+ var idx = $(this).index();
+ var added = $(this).hasClass('added'); // right side added item?
+ var selector = '';
+
+ // remove selection for select box on the other side
+ if (added) {
+ // remove selection for left side
+ $(that.wrapSelector('.' + APP_SELECT_ITEM + ':not(.added)')).removeClass('selected');
+ // set selector
+ selector = '.added';
+ } else {
+ // remove selection for right(added) side
+ $(that.wrapSelector('.' + APP_SELECT_ITEM + '.added')).removeClass('selected');
+ // set selector
+ selector = ':not(.added)';
+ }
+
+ if (vpEvent.keyManager.keyCheck.ctrlKey) {
+ // multi-select
+ that.pointer = { start: idx, end: -1 };
+ $(this).toggleClass('selected');
+ } else if (vpEvent.keyManager.keyCheck.shiftKey) {
+ // slicing
+ var startIdx = that.pointer.start;
+
+ if (startIdx == -1) {
+ // no selection
+ that.pointer = { start: idx, end: -1 };
+ } else if (startIdx > idx) {
+ // add selection from idx to startIdx
+ var tags = $(that.wrapSelector('.' + APP_SELECT_ITEM + selector));
+ for (var i = idx; i <= startIdx; i++) {
+ $(tags[i]).addClass('selected');
+ }
+ that.pointer = { start: startIdx, end: idx };
+ } else if (startIdx <= idx) {
+ // add selection from startIdx to idx
+ var tags = $(that.wrapSelector('.' + APP_SELECT_ITEM + selector));
+ for (var i = startIdx; i <= idx; i++) {
+ $(tags[i]).addClass('selected');
+ }
+ that.pointer = { start: startIdx, end: idx };
+ }
+ } else {
+ // single-select
+ that.pointer = { start: idx, end: -1 };
+ // un-select others
+ $(that.wrapSelector('.' + APP_SELECT_ITEM + selector)).removeClass('selected');
+ // select this
+ $(this).addClass('selected');
+ }
+ });
+
+ // item deleting (manually added item only)
+ $(this.wrapSelector('.vp-cs-del-item')).off('click');
+ $(this.wrapSelector('.vp-cs-del-item')).on('click', function(event) {
+ $(this).closest('.' + APP_SELECT_ITEM).remove();
+ that.pointer = { start: -1, end: -1 };
+ });
}
_addNewItem(newItemName) {
@@ -551,6 +564,7 @@ define([
let newItemIndex = this.dataList.length;
var targetTag = $(`
`);
$(targetTag).appendTo(
$(this.wrapSelector('.' + APP_SELECT_BOX + '.right'))
@@ -560,6 +574,8 @@ define([
$(this.wrapSelector('.' + APP_SELECT_ITEM)).removeClass('selected');
// clear item input
$(this.wrapSelector('.vp-cs-add-item-name')).val('');
+ // bind click event
+ this._bindItemClickEvent();
// bind draggable
this.bindDraggable();
}
diff --git a/visualpython/js/com/component/PopupComponent.js b/visualpython/js/com/component/PopupComponent.js
index 8e6cf32c..44d52d6f 100644
--- a/visualpython/js/com/component/PopupComponent.js
+++ b/visualpython/js/com/component/PopupComponent.js
@@ -92,6 +92,7 @@ define([
this.id = this.state.config.id;
this.name = this.state.config.name;
this.path = this.state.config.path;
+ this.category = this.state.config.category;
this.config = {
@@ -530,7 +531,8 @@ define([
template() {
this.$pageDom = $(popupComponentHtml.replaceAll('${vp_base}', com_Const.BASE_PATH));
// set title
- this.$pageDom.find('.vp-popup-title').text(this.name);
+ // this.$pageDom.find('.vp-popup-title').text(this.category + ' > ' + this.name);
+ this.$pageDom.find('.vp-popup-title').html(`
${this.category} > ${this.name}`);
// set body
let bodyTemplate = this.templateForBody();
// CHROME: check url keyword and replace it
diff --git a/visualpython/js/loadVisualpython.js b/visualpython/js/loadVisualpython.js
index 5d401bb7..2e8ecc69 100644
--- a/visualpython/js/loadVisualpython.js
+++ b/visualpython/js/loadVisualpython.js
@@ -206,38 +206,6 @@ define([
}
}
- var _checkVersion = function() {
- // check version timestamp
- let nowDate = new Date();
- vpConfig.getData('version_timestamp', 'vpcfg').then(function(data) {
- let doCheckVersion = false;
- if (data == undefined) {
- // no timestamp, check version
- doCheckVersion = true;
- } else if (data != '') {
- let lastCheck = new Date(parseInt(data));
- let diffCheck_now = new Date(nowDate.getFullYear(), nowDate.getMonth() + 1, nowDate.getDate());
- let diffCheck_last = new Date(lastCheck.getFullYear(), lastCheck.getMonth() + 1, lastCheck.getDate());
-
- let diff = Math.abs(diffCheck_now.getTime() - diffCheck_last.getTime());
- diff = Math.ceil(diff / (1000 * 3600 * 24));
-
- if (diff >= 1) {
- // if More than 1 day passed, check version
- doCheckVersion = true;
- }
- }
-
- // check version and update version_timestamp
- if (doCheckVersion == true) {
- vpConfig.checkVpVersion(true);
- }
-
- }).catch(function(err) {
- vpLog.display(VP_LOG_TYPE.ERROR, err);
- })
- }
-
//========================================================================
// External call function
//========================================================================
@@ -290,9 +258,10 @@ define([
_addToolBarVpButton();
}
_loadVpResource(cfg);
- _checkVersion();
+ vpConfig.checkVersionTimestamp();
- if (cfg.vp_section_display && vpFrame) {
+ if ((cfg.vp_section_display && vpFrame)
+ || vpConfig.extensionType === 'colab') { // CHROME: default to display vp
vpFrame.openVp();
}
@@ -319,11 +288,13 @@ define([
if (newValue.sessionContext.isReady) {
vpLog.display(VP_LOG_TYPE.LOG, 'vp operations for kernel ready...');
vpConfig.readKernelFunction();
+ vpConfig.checkVersionTimestamp();
}
newValue.sessionContext._connectionStatusChanged.connect(function(s2, status) {
if (status === 'connected') {
vpLog.display(VP_LOG_TYPE.LOG, 'vp operations for kernel ready...');
vpConfig.readKernelFunction();
+ vpConfig.checkVersionTimestamp();
}
});
} else {
diff --git a/visualpython/js/m_apps/File.js b/visualpython/js/m_apps/File.js
index be00f7ad..95cd0e39 100644
--- a/visualpython/js/m_apps/File.js
+++ b/visualpython/js/m_apps/File.js
@@ -22,9 +22,10 @@ define([
'vp_base/js/com/com_generatorV2',
'vp_base/data/m_library/pandasLibrary',
'vp_base/js/com/component/FileNavigation',
- 'vp_base/js/com/component/SuggestInput'
+ 'vp_base/js/com/component/SuggestInput',
+ 'vp_base/js/com/component/DataSelector'
], function(fileHtml, fileCss, com_String, com_util, com_Const, PopupComponent
- , pdGen, pandasLibrary, FileNavigation, SuggestInput) {
+ , pdGen, pandasLibrary, FileNavigation, SuggestInput, DataSelector) {
/**
* File
@@ -286,7 +287,14 @@ define([
templateForBody() {
/** Implement generating template */
- return fileHtml;
+ let page = $(fileHtml);
+
+ let allocateSelector = new DataSelector({
+ pageThis: this, id: 'vp_sampleReturn', placeholder: 'Variable name'
+ });
+ $(page).find('#vp_sampleReturn').replaceWith(allocateSelector.toTagString());
+
+ return page;
}
renderPage(pageType) {
diff --git a/visualpython/js/m_apps/Instance.js b/visualpython/js/m_apps/Instance.js
index a4f0e6c5..512c6f76 100644
--- a/visualpython/js/m_apps/Instance.js
+++ b/visualpython/js/m_apps/Instance.js
@@ -18,8 +18,9 @@ define([
'vp_base/js/com/com_String',
'vp_base/js/com/component/PopupComponent',
'vp_base/js/com/component/InstanceEditor',
+ 'vp_base/js/com/component/DataSelector',
'vp_base/js/m_apps/Subset'
-], function(insHtml, insCss, com_String, PopupComponent, InstanceEditor, Subset) {
+], function(insHtml, insCss, com_String, PopupComponent, InstanceEditor, DataSelector, Subset) {
const MAX_STACK_SIZE = 20;
@@ -178,6 +179,13 @@ define([
templateForBody() {
let page = $(insHtml);
$(page).find('#vp_instanceVariable').val(this.state.vp_instanceVariable);
+
+ let allocateSelector = new DataSelector({
+ pageThis: this, id: 'vp_instanceAllocate', placeholder: 'Variable name'
+ });
+ $(page).find('#vp_instanceAllocate').replaceWith(allocateSelector.toTagString());
+
+
return page;
}
diff --git a/visualpython/js/menu/MenuFrame.js b/visualpython/js/menu/MenuFrame.js
index 76aab784..998e6146 100644
--- a/visualpython/js/menu/MenuFrame.js
+++ b/visualpython/js/menu/MenuFrame.js
@@ -199,19 +199,19 @@ define([
return {};
}
- getMenuLibrary(menuId, libraries=this.menuLibraries) {
+ getMenuLibrary(menuId, libraries=this.menuLibrariesFlatten) {
for (var i=0; i < libraries.length; i++) {
var item = libraries[i];
if (item) {
if (item.id === menuId) {
return item;
}
- if (item.type === 'package') {
- var result = this.getMenuLibrary(menuId, item.item);
- if (result) {
- return result;
- }
- }
+ // if (item.type === 'package') {
+ // var result = this.getMenuLibrary(menuId, item.item);
+ // if (result) {
+ // return result;
+ // }
+ // }
}
}
return null;
@@ -243,7 +243,12 @@ define([
var that = this;
var body = group.getBody();
var item = group.getItem();
+ var state = group.getState();
item && item.forEach(child => {
+ // remember parent to navigate its parent menu
+ var category = state.category?(state.category + ' > ' + state.name):state.name;
+ child['category'] = category;
+
if (child.type == 'package') {
// packages : MenuGroup
var menuGroup = new MenuGroup($(body), child);
@@ -289,7 +294,7 @@ define([
});
let functionList = this.menuLibrariesFlatten.map(menu => {
- return { label: menu.name, value: menu.name, ...menu }
+ return { label: menu.name, value: menu.name, dtype: menu.category, ...menu }
});
// render searchbox
let searchBox = new SuggestInput();