summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Zorko <robertz@gurucue.com>2015-12-16 14:21:33 +0100
committerRobert Zorko <robertz@gurucue.com>2015-12-16 14:21:33 +0100
commita7fa6cfffebe3026198ad8beb0e06543d3503bb6 (patch)
treef8d322a40900c778b1178807492ecbe0e6c58d66
parentca3aa94da7798bba4fed6ae467d8fa94324a832e (diff)
parente906718cefc3f5fc7a279c7cae3a76fbdc184961 (diff)
merge with Ales fixes
-rw-r--r--css/codeq.css19
-rw-r--r--index.html3
-rw-r--r--js/codeq/aaiLogin.js2
-rw-r--r--js/codeq/about.js3
-rw-r--r--js/codeq/change_password.js3
-rw-r--r--js/codeq/comms.js21
-rw-r--r--js/codeq/core.js16
-rw-r--r--js/codeq/language.js2
-rw-r--r--js/codeq/login.js2
-rw-r--r--js/codeq/navigation.js42
-rw-r--r--js/codeq/problem_list.js2
-rw-r--r--js/codeq/profile.js10
-rw-r--r--js/codeq/prolog.js1
-rw-r--r--js/codeq/python.js2
-rw-r--r--js/codeq/robot.js22
-rw-r--r--js/codeq/settings.js3
-rw-r--r--js/codeq/signup.js2
-rw-r--r--js/codeq/upgrade_to_aai.js2
-rw-r--r--res/en.json2
-rw-r--r--res/sl.json2
20 files changed, 136 insertions, 25 deletions
diff --git a/css/codeq.css b/css/codeq.css
index c12be4d..1775c84 100644
--- a/css/codeq.css
+++ b/css/codeq.css
@@ -99,6 +99,7 @@ div.vertical-line{
.block.block1 {
border-bottom: 1px solid #ddd;
+ padding-bottom: 1em;
}
@@ -107,9 +108,13 @@ div.vertical-line{
padding: 0.5em 0.5em 20px 0.5em;
}
+.block.block4 {
+ padding-bottom: 1em;
+}
/* code_editor */
.block > .code_editor {
+ min-height: 8em;
}
.block.block2 {
@@ -122,7 +127,7 @@ div.vertical-line{
background: #222;
font-size: 14px;
padding: 0.5em;
- min-height: 4em;
+ min-height: 8em;
}
.block-label {
@@ -154,6 +159,18 @@ div.vertical-line{
padding: 0 4px;
}
+/* robot connection & sensor info */
+#screen_robot .block3 .status {
+ background-color: #666;
+ border: 1px solid #444;
+ color: yellow;
+ font-family: monospace;
+ padding: 0.5em;
+ position: absolute;
+ top: 1em;
+ right: 1em;
+}
+
/* block-toolbar */
.block-toolbar {
position: absolute;
diff --git a/index.html b/index.html
index aff6d4f..82c852c 100644
--- a/index.html
+++ b/index.html
@@ -331,7 +331,7 @@
<div class="col-lg-12 col-md-12 col-sm-12 block block1">
<div class="scrollable-content-container">
<div class="description-container">
- <h2 class="title" data-dict="prolog" data-tkey="slug"></h2>
+ <h2 class="title" data-dict="prolog" data-tkey="name"></h2>
<div class="description" data-dict="prolog" data-tkey="description"></div>
</div>
</div>
@@ -444,6 +444,7 @@
</div>
<div class="col-lg-6 col-md-12 col-sm-12 block block3">
<div class="console"></div>
+ <div class="status"></div>
<div class="block-label" data-tkey="console">Console</div>
</div>
</div>
diff --git a/js/codeq/aaiLogin.js b/js/codeq/aaiLogin.js
index a0a8e68..abe7283 100644
--- a/js/codeq/aaiLogin.js
+++ b/js/codeq/aaiLogin.js
@@ -29,6 +29,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
samlLoginUrl = '';
codeq.globalStateMachine.register('aailogin',{
+ 'jqScreen': jqScreen,
+
'enter': function(){
jqDisabledOverlay.css('display', '');
codeq.samlLogin = true;//set the flag
diff --git a/js/codeq/about.js b/js/codeq/about.js
index 25fa829..f56d9fd 100644
--- a/js/codeq/about.js
+++ b/js/codeq/about.js
@@ -23,6 +23,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
jqBtnGoBack = $("#btnAboutGoBack");
codeq.globalStateMachine.register('about',{
+ 'jqScreen': jqScreen,
+ 'isModal': true,
+
'enter': function(){
jqBtnGoBack.on('click',function(){
history.back();//forces a transition to the previous state
diff --git a/js/codeq/change_password.js b/js/codeq/change_password.js
index dc5db39..6ebd6dd 100644
--- a/js/codeq/change_password.js
+++ b/js/codeq/change_password.js
@@ -26,6 +26,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
jqChangePassForm = $('#formChangePassword');
codeq.globalStateMachine.register('changePassword',{
+ 'jqScreen': jqScreen,
+ 'isModal': true,
+
'enter': function(){
jqCancelBtn.on('click',function(){
history.back();//forces a transition to the previous state
diff --git a/js/codeq/comms.js b/js/codeq/comms.js
index e964f20..5e046b7 100644
--- a/js/codeq/comms.js
+++ b/js/codeq/comms.js
@@ -557,6 +557,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
'samlLogout': function(){
return this.send({'action':'saml_logout'});
+ },
+
+ 'forceReset': function () {
+ var p;
+ if (sid !== null) {
+ p = Q.Promise(function (resolve, reject, notify) {
+ var t = setTimeout(function () {
+ t = null;
+ resolve();
+ }, 3000); // 3 seconds
+ codeq.comms.logout().then(function () {
+ if (t !== null) {
+ clearTimeout(t);
+ t = null;
+ resolve();
+ }
+ });
+ });
+ }
+ else p = Q();
+ return p.fin(codeq.comms.disconnect);
}
};
})();
diff --git a/js/codeq/core.js b/js/codeq/core.js
index 22f6a50..b53ce70 100644
--- a/js/codeq/core.js
+++ b/js/codeq/core.js
@@ -15,7 +15,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
(function () {
- window.siteDefinition = {logLevel: 'debug'}; // for debug purposes
+ window.siteDefinition = {logLevel: 'debug'/*, 'logService': '/ws/clientlog'*/}; // for debug purposes
// ================================================================================
// JSON-ization (stringification) function
@@ -123,7 +123,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
logs = [];
$.ajax({
contentType: 'application/json',
- dataType: 'application/json',
type: 'POST',
url: logServiceUrl,
data: copyOfLogs,
@@ -148,6 +147,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
return logger;
})();
+ // uncaught error reporting
+ window.onerror = function (msg, url, lineNumber) {
+ if ((msg !== null) && (msg instanceof Object)) msg = msg.toString();
+ codeq.log.error('Uncaught error at line ' + lineNumber + ' in ' + url + ': ' + msg);
+ };
+
// ================================================================================
// The core CodeQ module
// ================================================================================
@@ -610,15 +615,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
codeq.log.info('App reset: ' + (reason || 'no reason given'));
codeq.globalStateMachine.transition('login');
codeq.wait(
- codeq.comms.getSid() == null ? Q() : codeq.comms.logout()
+/* codeq.comms.getSid() == null ? Q() : codeq.comms.logout()
.finally(
codeq.comms.disconnect
)
.fail(function (e) {
codeq.log.debug(e)
- }) // ignore errors
+ }) // ignore errors*/
+ codeq.comms.forceReset
)
- .then(function () {
+ .fin(function () {
if (reason) {
alert(reason);
}
diff --git a/js/codeq/language.js b/js/codeq/language.js
index 5433c84..cacdb32 100644
--- a/js/codeq/language.js
+++ b/js/codeq/language.js
@@ -28,6 +28,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
};
codeq.globalStateMachine.register('language',{
+ 'jqScreen': jqScreen,
+
'enter': function(){
jqScreen.css('display', '');
jqProlog.on('click', function (e) { e.preventDefault(); choose('prolog') });
diff --git a/js/codeq/login.js b/js/codeq/login.js
index 162e336..f7ddeb3 100644
--- a/js/codeq/login.js
+++ b/js/codeq/login.js
@@ -78,6 +78,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
formInputs = $('#username, #password');
codeq.globalStateMachine.register('login',{
+ 'jqScreen': jqScreen,
+
'enter': function(){
jqNavigationHomeBtn.off('click');//remove the click listener of this element here
jqNavBarRight.css('display','none');//hide settings etc.
diff --git a/js/codeq/navigation.js b/js/codeq/navigation.js
index 62344e5..d806eea 100644
--- a/js/codeq/navigation.js
+++ b/js/codeq/navigation.js
@@ -49,7 +49,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
//the global state machine is a bit different - so it'll be implemented here
var makeGlobalStateMachine = function (def) {
- var currState = null;
+ var currState = null,
+ waitingState = null; // state hidden with a modal form
var stateChangeFun = function historyStateChangeHandler() {
var historyState = History.getState();
codeq.globalStateMachine.actualTransition.apply(codeq.globalStateMachine, $.merge([historyState.data.state] ,historyState.data.params));
@@ -77,11 +78,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
}
},
'destroy': function () {
+ var i;
if (currState) currState.exit();
currState = null;
+ if (waitingState) waitingState.exit();
+ waitingState = null;
History.Adapter.unbind(window, 'statechange', stateChangeFun);
},
- 'register': function (name, state) {
+ 'register': function (name, state, props) {
if (name in def) codeq.log.error('The state ' + name + ' is already registered, overriding');
def[name] = state;
},
@@ -92,10 +96,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
}
var newState = def[name];//if the newState is not the same as the old or if it doesn't exist at all is already checked at this point
- if (currState) currState.exit();
-
- currState = newState;
- currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1]));
+ if (currState) {
+ if (newState.isModal) {
+ if (currState.isModal) currState.exit();
+ else {
+ waitingState = currState;
+ waitingState.jqScreen.css('display', 'none');
+ }
+ currState = newState;
+ currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1]));
+ }
+ else {
+ currState.exit();
+ currState = newState;
+ if (waitingState === newState) {
+ waitingState.jqScreen.css('display', '');
+ waitingState = null;
+ }
+ else {
+ if (waitingState) {
+ waitingState.exit();
+ waitingState = null;
+ }
+ currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1]));
+ }
+ }
+ }
+ else {
+ currState = newState;
+ currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1]));
+ }
}
}
};
diff --git a/js/codeq/problem_list.js b/js/codeq/problem_list.js
index 4e81927..645a58a 100644
--- a/js/codeq/problem_list.js
+++ b/js/codeq/problem_list.js
@@ -414,6 +414,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
// ================================================================================
codeq.globalStateMachine.register('problem_list', {
+ 'jqScreen': jqScreen,
+
'enter': function(language){
var data = languageCache[language]; // language data
diff --git a/js/codeq/profile.js b/js/codeq/profile.js
index 09a0e05..f863140 100644
--- a/js/codeq/profile.js
+++ b/js/codeq/profile.js
@@ -20,13 +20,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
(function(){
- var jqBtnChangePass = $("#change_pass_profile"),
+ var jqScreen = $("#screen_profile"),
+ jqBtnChangePass = $("#change_pass_profile"),
jqBtnGoBack = $("#btnProfileGoBack");
codeq.profile = {
};
codeq.globalStateMachine.register('profile',{
+ 'jqScreen': jqScreen,
+ 'isModal': true,
+
'enter': function(){
jqBtnChangePass.on('click',function(){
codeq.globalStateMachine.transition('changePassword');
@@ -35,7 +39,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
history.back();//forces a transition to the previous state
});
if(codeq.samlLogin) $('#loggedInViaSamlSpan').css("display","");//show the span if we actually logged in with SAML
- $("#screen_profile").css('display', '');
+ jqScreen.css('display', '');
$('#disabled').css('display', 'none');
codeq.comms.getUserStat()
.then(function (data) {
@@ -78,7 +82,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
'exit' : function(){
jqBtnChangePass.off('click');
jqBtnGoBack.off('click');
- $("#screen_profile").css('display', 'none');
+ jqScreen.css('display', 'none');
$('#loggedInViaSamlSpan').css("display","none");
}
});
diff --git a/js/codeq/prolog.js b/js/codeq/prolog.js
index 0bbf547..b772685 100644
--- a/js/codeq/prolog.js
+++ b/js/codeq/prolog.js
@@ -103,6 +103,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
var prologHandler; //created when we enter the prolog state and destroyed once we leave it
codeq.globalStateMachine.register('prolog', {
+ 'jqScreen': jqScreen,
//'enter': function (problemDef, commonDef, currentSolution) {
'enter': function (ref, data) {//function (problemDef, commonDef, currentSolution) {//
diff --git a/js/codeq/python.js b/js/codeq/python.js
index 472d700..0fb7d2b 100644
--- a/js/codeq/python.js
+++ b/js/codeq/python.js
@@ -113,6 +113,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
};
codeq.globalStateMachine.register('python', {
+ 'jqScreen': jqScreen,
+
'enter': function (ref, data) {//function (problemDef, commonDef, currentSolution) {//
codeq.loadProblemData(ref,data).then(function(problem){
diff --git a/js/codeq/robot.js b/js/codeq/robot.js
index ffccc62..ee6eda6 100644
--- a/js/codeq/robot.js
+++ b/js/codeq/robot.js
@@ -108,6 +108,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
var robotHandler; //created when we enter the robot state and destroyed once we leave it
codeq.globalStateMachine.register('robot', {
+ 'jqScreen': jqScreen,
+
//'enter': function (problemDef, commonDef, currentSolution) {
'enter': function (ref, data) {//function (problemDef, commonDef, currentSolution) {//
@@ -174,13 +176,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
var makeRobotTerminalHandler = function (jqConsole, editor, problem_id, activityHandler) {
var terminal = codeq.makeConsole(jqConsole, {
- 'greeting': 'CodeQ Robot terminal proxy',
- 'autoHistory': true
+ 'greeting': 'Robot messages\n--------------\n\n',
});
-
- terminal.onInput = function (text) {
- terminal.append('Not implemented.\n', 'output');
- };
+ terminal.inputDisable();
return terminal;
};
@@ -191,7 +189,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
var createRobotHandler = function (problemDef, commonDef, currentSolution) {
var jqDescriptionContent = jqDescription.find('.description'),
jqEditor = jqCode.find('.code_editor'),
+ jqTerminal = jqConsole.find('.console'),
jqHints = jqInfo.find('.hints'),
+ jqStatus = jqConsole.find('.status'),
editor = codeq.makeEditor(jqEditor[0],
{
mode: 'python',
@@ -202,6 +202,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
jqBtnRun.focus();
}),
activityHandler = codeq.makeActivityHandler(editor, problemDef.id),
+ terminal = makeRobotTerminalHandler(jqTerminal, editor, problemDef.id, activityHandler),
hinter = codeq.makeHinter(jqHints, jqEditor, editor, 'robot_hints', problemDef, commonDef),
commError = function (error) {
alert(error);
@@ -213,6 +214,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
// set up the websocket events
socket.on('close', function (data) {
console.log('websocket closed, trying to reopen in 1 s');
+ jqStatus.html('Not connected.');
reconnectTimer = setTimeout(function () {
reconnectTimer = null;
socket.open();
@@ -228,7 +230,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
if (!sensors.hasOwnProperty(sensor)) continue;
text += sensor + ': ' + sensors[sensor] + '<br />\n'
}
- $('div.console').html('<p style="color: lightgreen; font-family: monospace;">'+text+'</p>');
+ jqStatus.html(text);
+ }
+ else if (json_obj.event == 'output') {
+ text = json_obj.text;
+ terminal.append(text, 'output');
}
});
@@ -286,10 +292,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
var program = editor.getDoc().getValue();
activityHandler.queueTrace({'typ': 'robot_run', 'program': program});
socket.send(JSON.stringify({action: 'run', program: program}));
+ terminal.append('<run>\n', 'output');
});
jqBtnStop.on('click', function () {
activityHandler.queueTrace({'typ': 'robot_stop'});
socket.send(JSON.stringify({action: 'stop'}));
+ terminal.append('<stop>\n', 'output');
});
codeq.comms.loadProblem(problemDef.id).done();
diff --git a/js/codeq/settings.js b/js/codeq/settings.js
index 3e72cbd..6fec614 100644
--- a/js/codeq/settings.js
+++ b/js/codeq/settings.js
@@ -34,6 +34,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
});
codeq.globalStateMachine.register('settings',{
+ 'jqScreen': jqScreenSettings,
+ 'isModal': true,
+
'enter':function(){
jqDisabledOverlay.css('display', '');
robotAddressInput.val(codeq.settings['robot_address']);//set the robot address once we enter the state
diff --git a/js/codeq/signup.js b/js/codeq/signup.js
index 2667fe4..5f3f2be 100644
--- a/js/codeq/signup.js
+++ b/js/codeq/signup.js
@@ -32,6 +32,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
jqNavigationHomeBtn = $('#navigation-home');
codeq.globalStateMachine.register('signup',{
+ 'jqScreen': jqScreen,
+
'enter': function(){
jqNavigationHomeBtn.off('click');//remove the click listener of this element here
jqNavBarRight.css('display','none');//hide settings etc.
diff --git a/js/codeq/upgrade_to_aai.js b/js/codeq/upgrade_to_aai.js
index 6ea5855..5357a29 100644
--- a/js/codeq/upgrade_to_aai.js
+++ b/js/codeq/upgrade_to_aai.js
@@ -26,6 +26,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
jqLangSelect = jqScreen.find('.lang-select');
codeq.globalStateMachine.register('upgradeToAAI',{
+ 'jqScreen': jqScreen,
+
'enter': function(){
jqNoBtn.on('click',function(){
codeq.comms.samlLogin(false)
diff --git a/res/en.json b/res/en.json
index 1fcb894..65d68bc 100644
--- a/res/en.json
+++ b/res/en.json
@@ -67,5 +67,5 @@
"upgrade_to_aai_no_button": "No, make new",
"upgrade_to_aai_yes_button": "Yes, upgrade to AAI",
"about": "About",
- "about_html" : "<p>CodeQ™ is the ...<div class=\"about-logos\"><div style=\"width: 29%;\"><img src=\"res/fri_logo.png\"></div><div class=\"vertical-line\"></div><div style=\"width: 29%;\"><img src=\"res/ai_lab_logo.png\"></div></div><hr><p>Programming by Guru Ltd, Ljubljana, Slovenia. Design by Loni DBS Ltd, Ljubljana, Slovenia.</p><hr></p>The project was co-funded by European Regional Development Fund and Slovenian Ministry of Education, Science, and Sport.<p></p><div class=\"about-logos\"><div style=\"width: 45%;\"><img src=\"res/nalozba_v_vaso_prihodnost.png\" style=\"max-height: 80%;max-width: 80%;\"></div><div class=\"vertical-line\"></div><div style=\"width: 45%;\"><img src=\"res/MIZS_slo.png\" style=\"max-height: 60%;max-width: 60%;\"></div></div><hr><h3>Contact</h3><p>Aleksander Sadikov, PhD, project leader.</p><hr><h3>Minimal requirements</h3><p>Android: version 3.1, iOS: version 5, Windows Phone: version 8</p>"
+ "about_html" : "<p>CodeQ™ is an e-service and a mobile app for teaching programming. The application enables the user to work on his or her own by solving a number of carefully prepared programming exercises and by guiding the user with automatically generated hints and test. ...<div class=\"about-logos\"><div style=\"width: 29%;\"><img src=\"res/fri_logo.png\"></div><div class=\"vertical-line\"></div><div style=\"width: 29%;\"><img src=\"res/ai_lab_logo.png\"></div></div><hr></p>The project was co-funded by European Regional Development Fund and Slovenian Ministry of Education, Science, and Sport.<p></p><div class=\"about-logos\"><div style=\"width: 45%;\"><img src=\"res/nalozba_v_vaso_prihodnost.png\" style=\"max-height: 80%;max-width: 80%;\"></div><div class=\"vertical-line\"></div><div style=\"width: 45%;\"><img src=\"res/MIZS_slo.png\" style=\"max-height: 60%;max-width: 60%;\"></div></div><hr><h3>Contact</h3><p>Aleksander Sadikov, PhD, project leader.</p><hr><h3>Mobile applications - minimum requirements</h3><p>Android: version 3.1, iOS: version 5, Windows Phone: version 8</p><hr><p>Programming by Guru Ltd, Ljubljana, Slovenia.</p>"
}
diff --git a/res/sl.json b/res/sl.json
index b97cc1f..1a72aca 100644
--- a/res/sl.json
+++ b/res/sl.json
@@ -67,5 +67,5 @@
"upgrade_to_aai_no_button": "Ne, naredi nov račun",
"upgrade_to_aai_yes_button": "Da, nadgradi na AAI",
"about": "O aplikaciji",
- "about_html" : "<h3>Naziv operacije</h3><p>Učenje programiranja s samodejno generiranimi namigi.</p><hr><h3>Kratek opis operacije</h3><p>Razvita je bila e-storitev in mobilna aplikacija za inteligentni sistem za poučevanje programiranja. Samostojno učenje programiranja prek reševanja programerskih nalog smo nadgradili z ekspertnim modulom, ki opozarja na napake in samodejno generira namige, in modulom za testiranje programov (uporabnikovih rešitev) s samodejno generiranimi testnimi primeri. Poleg tega je bil razvit modul za povezavo z mobilnimi roboti, ki bo omogočil poganjanje programov na le-teh.</p><hr><h3>Upravičenci</h3><p>Univerza v Ljubljani (Fakulteta za računalništvo in informatiko, Laboratorij za umetno inteligenco)</p><div class=\"about-logos\"><div style=\"width: 29%;\"><img src=\"res/fri_logo.png\"></div><div class=\"vertical-line\"></div><div style=\"width: 29%;\"><img src=\"res/ai_lab_logo.png\"></div></div><hr><h3>Stroški operacije</h3><p>X EUR od tega Y EUR iz javnih virov financiranja (85% Evropska unija, 15% Ministrstvo za izobraževanje, znanost in šport).</p><hr><h3>Datum operacije</h3><p>Operacija je potekala od 3.11.2014 do 30.9.2015.</p><hr><h3>Kontaktna oseba</h3><p>dr. Aleksander Sadikov, vodja projekta.</p><p>Operacijo delno financira Evropska unija iz Evropskega sklada za regionalni razvoj ter Ministrstvo za izobraževanje, znanost in šport. Operacija se izvaja v okviru Operativnega programa krepitve regionalnih razvojnih potencialov v obdobju 2007-2013, razvojne prioritete: gospodarska razvojna infrastruktura; prednostne usmeritve: Informacijska družba.</p><div class=\"about-logos\"><div style=\"width: 45%;\"><img src=\"res/nalozba_v_vaso_prihodnost.png\" style=\"max-height: 80%;max-width: 80%;\"></div><div class=\"vertical-line\"></div><div style=\"width: 45%;\"><img src=\"res/MIZS_slo.png\" style=\"max-height: 60%;max-width: 60%;\"></div></div><hr><h3>Mobilna aplikacija - minimalne zahteve</h3><p>Android: verzija 3.1, iOS: verzija 5, Windows Phone: verzija 8.</p><hr><p>Razvoj aplikacije: Guru d.o.o. Oblikovanje: LONI DBS d.o.o.</p>"
+ "about_html" : "<h3>Naziv operacije</h3><p>Učenje programiranja s samodejno generiranimi namigi.</p><hr><h3>Kratek opis operacije</h3><p>Razvita je bila e-storitev in mobilna aplikacija za inteligentni sistem za poučevanje programiranja. Samostojno učenje programiranja prek reševanja programerskih nalog smo nadgradili z ekspertnim modulom, ki opozarja na napake in samodejno generira namige in modulom za testiranje programov (uporabnikovih rešitev) s samodejno generiranimi testnimi primeri. Poleg tega je bil razvit modul za povezavo z mobilnimi roboti, ki bo omogočil poganjanje programov na le-teh.</p><hr><h3>Upravičenci</h3><p>Univerza v Ljubljani (Fakulteta za računalništvo in informatiko, Laboratorij za umetno inteligenco)</p><div class=\"about-logos\"><div style=\"width: 29%;\"><img src=\"res/fri_logo.png\"></div><div class=\"vertical-line\"></div><div style=\"width: 29%;\"><img src=\"res/ai_lab_logo.png\"></div></div><hr><h3>Stroški operacije</h3><p>69.996 EUR (85% Evropska unija, 15% Ministrstvo za izobraževanje, znanost in šport).</p><p>Operacijo delno financira Evropska unija iz Evropskega sklada za regionalni razvoj ter Ministrstvo za izobraževanje, znanost in šport. Operacija se izvaja v okviru Operativnega programa krepitve regionalnih razvojnih potencialov v obdobju 2007-2013, razvojne prioritete: gospodarska razvojna infrastruktura; prednostne usmeritve: Informacijska družba.</p><div class=\"about-logos\"><div style=\"width: 45%;\"><img src=\"res/nalozba_v_vaso_prihodnost.png\" style=\"max-height: 80%;max-width: 80%;\"></div><div class=\"vertical-line\"></div><div style=\"width: 45%;\"><img src=\"res/MIZS_slo.png\" style=\"max-height: 60%;max-width: 60%;\"></div></div><hr><h3>Datum operacije</h3><p>Operacija je potekala od 3.11.2014 do 30.9.2015.</p><hr><h3>Kontaktna oseba</h3><p>dr. Aleksander Sadikov, vodja projekta.</p><hr><h3>Mobilna aplikacija - minimalne zahteve</h3><p>Android: verzija 3.1, iOS: verzija 5, Windows Phone: verzija 8.</p><hr><p>Razvoj aplikacije: Guru d.o.o.</p>"
}