From a62b88e36ba45bb7a745fada7cd4dbf162638c1f Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sat, 25 Apr 2015 18:23:44 -0400 Subject: [PATCH 1/8] overview body refactor WIP --- .../AbstractOverviewWindow.js} | 86 +++++++++++++++--- .../src/view/student/skill/OverviewWindow.js | 80 +++++------------ .../src/view/teacher/skill/OverviewWindow.js | 87 +++++-------------- .../teacher/skill/OverviewWindowController.js | 2 +- 4 files changed, 119 insertions(+), 136 deletions(-) rename sencha-workspace/packages/slate-cbl/src/view/{skill/OverviewBody.js => standard/AbstractOverviewWindow.js} (71%) diff --git a/sencha-workspace/packages/slate-cbl/src/view/skill/OverviewBody.js b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js similarity index 71% rename from sencha-workspace/packages/slate-cbl/src/view/skill/OverviewBody.js rename to sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js index c7ab5fe6f..800a32f27 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/skill/OverviewBody.js +++ b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js @@ -1,13 +1,25 @@ /*jslint browser: true, undef: true *//*global Ext*/ -Ext.define('Slate.cbl.view.skill.OverviewBody', { - extend: 'Ext.container.Container', - xtype: 'slate-cbl-skill-overviewbody', - requires: [ - 'Slate.cbl.model.Skill', - - 'Ext.form.field.ComboBox', - 'Ext.data.ChainedStore' - ], +/** + * Provides a foundation for the window used in both the student and teacher + * UIs to display all the demonstrations affecting a given standard. + * + * @abstract + */ +Ext.define('Slate.cbl.view.standard.AbstractOverviewWindow', { + extend: 'Ext.window.Window', + xtype: 'slate-cbl-standard-abstractoverviewwindow', + + config: { + student: null, + competency: null, + skill: null, + demonstration: null + }, + + title: 'Standard Overview', + width: 700, + minWidth: 700, + fixed: true, items: [ { @@ -39,7 +51,7 @@ Ext.define('Slate.cbl.view.skill.OverviewBody', { '', '', '{[xindex]}', - '{[fm.date(new Date(values.Demonstration.Demonstrated * 1000))]}', + '{Demonstration.Demonstrated:date("M j, Y")}', '
M{Level}
', '{Demonstration.ExperienceType:htmlEncode}', '{Demonstration.Context:htmlEncode}', @@ -82,5 +94,55 @@ Ext.define('Slate.cbl.view.skill.OverviewBody', { '' ] } - ] -}); + ], + + initEvents: function() { + var me = this; + + me.callParent(); + + me.mon(me.lookupReference('demonstrationsTable').el, 'click', function(ev, t) { + me.fireEvent('demorowclick', me, ev, Ext.get(t)); + }, me, { delegate: '.skill-grid-demo-row' }); + }, + +// applyStudent: function(student) { +// return student ? Ext.getStore('cbl-students-loaded').getById(student) : null; +// }, +// +// applyCompetency: function(competency) { +// return competency ? Ext.getStore('cbl-competencies-loaded').getById(competency) : null; +// }, + + applyStudent: function(student) { + if (Ext.isString(student)) { + student = parseInt(student, 10); + } + + return student ? student : null; + }, + + applyCompetency: function(competency) { + if (Ext.isString(competency)) { + competency = parseInt(competency, 10); + } + + return competency ? competency : null; + }, + + applySkill: function(skill) { + if (Ext.isString(skill)) { + skill = parseInt(skill, 10); + } + + return skill ? skill : null; + }, + + applyDemonstration: function(demonstration) { + if (Ext.isString(demonstration)) { + demonstration = parseInt(demonstration, 10); + } + + return demonstration ? demonstration : null; + } +}); \ No newline at end of file diff --git a/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js b/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js index 932181856..320e62e30 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js +++ b/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js @@ -1,32 +1,18 @@ /*jslint browser: true, undef: true *//*global Ext*/ Ext.define('Slate.cbl.view.student.skill.OverviewWindow', { - extend: 'Ext.window.Window', + extend: 'Slate.cbl.view.standard.AbstractOverviewWindow', xtype: 'slate-cbl-student-skill-overviewwindow', requires: [ 'Slate.cbl.view.student.skill.OverviewWindowController', - 'Slate.cbl.view.skill.OverviewBody', 'Slate.cbl.model.Skill', - 'Ext.form.field.ComboBox', - 'Ext.data.ChainedStore' + 'Ext.form.field.ComboBox' ], controller: 'slate-cbl-student-skill-overviewwindow', - config: { - student: null, - competency: null, - skill: null, - demonstration: null - }, - - title: 'Standard Overview', - width: 700, - minWidth: 700, - shadow: 'frame', - fixed: true, - monitorResize: true, modal: true, + shadow: 'frame', dockedItems: [ { @@ -52,45 +38,23 @@ Ext.define('Slate.cbl.view.student.skill.OverviewWindow', { } ] } - ], - items: [ - { - xtype: 'slate-cbl-skill-overviewbody', - reference: 'demonstrationsBody' - } - ], - - listeners: { - scope: 'this', - click: { - fn: 'onGridClick', - element: 'el', - delegate: '.skill-grid-demo-row' - } - }, - - applySkill: function(skill) { - if (Ext.isString(skill)) { - skill = parseInt(skill, 10); - } - - return skill ? skill : null; - }, - - applyDemonstration: function(demonstration) { - if (Ext.isString(demonstration)) { - demonstration = parseInt(demonstration, 10); - } - - return demonstration ? demonstration : null; - }, - - onGridClick: function(ev, t) { - var me = this, - targetEl; - - if (targetEl = ev.getTarget('.skill-grid-demo-row', me.el, true)) { - me.fireEvent('demorowclick', me, ev, targetEl); - } - } + ] + +// listeners: { +// scope: 'this', +// click: { +// fn: 'onGridClick', +// element: 'el', +// delegate: '.skill-grid-demo-row' +// } +// }, +// +// onGridClick: function(ev, t) { +// var me = this, +// targetEl; +// +// if (targetEl = ev.getTarget('.skill-grid-demo-row', me.el, true)) { +// me.fireEvent('demorowclick', me, ev, targetEl); +// } +// } }); \ No newline at end of file diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js index bddcb2de5..0f2e58c5f 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js @@ -1,11 +1,10 @@ /*jslint browser: true, undef: true *//*global Ext*/ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindow', { - extend: 'Ext.window.Window', + extend: 'Slate.cbl.view.standard.AbstractOverviewWindow', xtype: 'slate-cbl-teacher-skill-overviewwindow', requires: [ 'Slate.cbl.view.teacher.skill.OverviewWindowController', 'Slate.cbl.model.Skill', - 'Slate.cbl.view.skill.OverviewBody', 'Ext.form.field.ComboBox', 'Ext.data.ChainedStore' @@ -13,17 +12,6 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindow', { controller: 'slate-cbl-teacher-skill-overviewwindow', - config: { - student: null, - competency: null, - skill: null, - demonstration: null - }, - - title: 'Standard Overview', - width: 700, - minWidth: 700, - fixed: true, autoScroll: true, dockedItems: [ @@ -45,7 +33,7 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindow', { }, queryMode: 'local', displayField: 'Descriptor', - valueField: 'Code', + valueField: 'ID', forceSelection: true }, @@ -111,55 +99,24 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindow', { } ], - items: [ - { - xtype: 'slate-cbl-skill-overviewbody', - reference: 'demonstrationsBody' - } - ], - - listeners: { - scope: 'this', - click: { - fn: 'onGridClick', - element: 'el', - delegate: '.skill-grid-demo-row, a[href="#demonstration-edit"]' - } - }, - - applyStudent: function(student) { - return student ? Ext.getStore('cbl-students-loaded').getById(student) : null; - }, - - applyCompetency: function(competency) { - return competency ? Ext.getStore('cbl-competencies-loaded').getById(competency) : null; - }, - - applySkill: function(skill) { - if (Ext.isString(skill)) { - skill = parseInt(skill, 10); - } - - return skill ? skill : null; - }, - - applyDemonstration: function(demonstration) { - if (Ext.isString(demonstration)) { - demonstration = parseInt(demonstration, 10); - } - - return demonstration ? demonstration : null; - }, - - onGridClick: function(ev, t) { - var me = this, - targetEl; - - if (targetEl = ev.getTarget('.skill-grid-demo-row', me.el, true)) { - me.fireEvent('demorowclick', me, ev, targetEl); - } else if (targetEl = ev.getTarget('a[href="#demonstration-edit"]', me.el, true)) { - ev.stopEvent(); - me.fireEvent('editdemonstrationclick', me, parseInt(targetEl.getAttribute('data-demonstration'), 10), ev, targetEl); - } - } +// listeners: { +// scope: 'this', +// click: { +// fn: 'onGridClick', +// element: 'el', +// delegate: '.skill-grid-demo-row, a[href="#demonstration-edit"]' +// } +// }, +// +// onGridClick: function(ev, t) { +// var me = this, +// targetEl; +// +// if (targetEl = ev.getTarget('.skill-grid-demo-row', me.el, true)) { +// me.fireEvent('demorowclick', me, ev, targetEl); +// } else if (targetEl = ev.getTarget('a[href="#demonstration-edit"]', me.el, true)) { +// ev.stopEvent(); +// me.fireEvent('editdemonstrationclick', me, parseInt(targetEl.getAttribute('data-demonstration'), 10), ev, targetEl); +// } +// } }); diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js index a061784bd..1fd2dd98d 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js @@ -55,7 +55,7 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindowController', { var me = this, competency = overviewWindow.getCompetency(), student = overviewWindow.getStudent(); - +debugger; if (competency) { me.lookupReference('competencyCombo').setValue(competency); } From c86e134f8664397df42a5c9fea6080d4d081aa46 Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sat, 25 Apr 2015 18:56:19 -0400 Subject: [PATCH 2/8] ignore emergence-git-workflow files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 06088bc71..2471f2d4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .emergence +/config.json +/watcher.log \ No newline at end of file From f50bd5272970e9f725e98113f9ec38e489d6449f Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sat, 25 Apr 2015 19:10:30 -0400 Subject: [PATCH 3/8] restore demonstrated date formatting fix --- .../slate-cbl/src/view/standard/AbstractOverviewWindow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js index 800a32f27..1067173f4 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js +++ b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js @@ -51,7 +51,7 @@ Ext.define('Slate.cbl.view.standard.AbstractOverviewWindow', { '', '', '{[xindex]}', - '{Demonstration.Demonstrated:date("M j, Y")}', + '{[fm.date(new Date(values.Demonstration.Demonstrated * 1000))]}', '
M{Level}
', '{Demonstration.ExperienceType:htmlEncode}', '{Demonstration.Context:htmlEncode}', From 5d808249350dd2ea8de592f6349968068311cbf8 Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sat, 25 Apr 2015 19:22:04 -0400 Subject: [PATCH 4/8] enable addCompetency to receive a competency id instead of model instance --- .../demonstration/EditWindowController.js | 23 +++++++++++++------ .../teacher/skill/OverviewWindowController.js | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js index 7c0d0c0b9..6780cf6ca 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js @@ -336,22 +336,31 @@ Ext.define('Slate.cbl.view.teacher.demonstration.EditWindowController', { addCompetency: function(competency, callback, scope, insertSorted) { var me = this, editWindow = me.getView(), + competenciesStore = Ext.getStore('cbl-competencies-all'), competenciesTabPanel = me.lookupReference('competenciesTabPanel'), competenciesSearchField = me.lookupReference('competenciesSearchField'), competencyCardConfig = { - title: competency.get('Code'), -// tabConfig: { -// tooltip: { -// title: competenciesTabPanel.getTpl('competencyTipTitleTpl').apply(competency.getData()), -// text: competenciesTabPanel.getTpl('competencyTipBodyTpl').apply(competency.getData()) -// } -// }, competency: competency, items: [] }, skillFieldsConfig = competencyCardConfig.items; + // convert competency id to instance + if (!competency.isModel) { + // defer addCompetency until competencies store is loaded if necessary + if (competenciesStore.isLoaded()) { + competency = competenciesStore.getById(competency); + } else { + competenciesStore.on('load', function() { + me.addCompetency(competency, callback, scope, insertSorted); + }, null, { single: true }); + + return; + } + } + + competencyCardConfig.title = competency.get('Code'); competency.withSkills(function(skills) { if (editWindow.destroying || editWindow.destroyed) { diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js index 1fd2dd98d..a061784bd 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js @@ -55,7 +55,7 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindowController', { var me = this, competency = overviewWindow.getCompetency(), student = overviewWindow.getStudent(); -debugger; + if (competency) { me.lookupReference('competencyCombo').setValue(competency); } From b985f7a3b523700e99203b36d9c8dd0704bb5c25 Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sat, 25 Apr 2015 22:58:10 -0400 Subject: [PATCH 5/8] finished OverviewWindow cleanup+refactor --- .../Slate/CBL/SkillsRequestHandler.php | 3 +- .../packages/slate-cbl/src/API.js | 28 +++- .../packages/slate-cbl/src/model/Skill.js | 16 -- .../view/standard/AbstractOverviewWindow.js | 145 +++++++++++++----- .../src/view/student/DashboardController.js | 6 +- .../src/view/student/skill/OverviewWindow.js | 23 +-- .../student/skill/OverviewWindowController.js | 84 ++-------- .../src/view/teacher/DashboardController.js | 9 +- .../src/view/teacher/skill/OverviewWindow.js | 32 ++-- .../teacher/skill/OverviewWindowController.js | 99 ++---------- 10 files changed, 187 insertions(+), 258 deletions(-) diff --git a/php-classes/Slate/CBL/SkillsRequestHandler.php b/php-classes/Slate/CBL/SkillsRequestHandler.php index e2d6912ba..debfc2b10 100644 --- a/php-classes/Slate/CBL/SkillsRequestHandler.php +++ b/php-classes/Slate/CBL/SkillsRequestHandler.php @@ -62,7 +62,8 @@ public static function handleDemonstrationsRequest(Skill $Skill) return static::respond('skillDemonstrations', [ 'success' => true, - 'data' => DemonstrationSkill::getAllByQuery($query) + 'data' => DemonstrationSkill::getAllByQuery($query), + 'skill' => $Skill ]); } } \ No newline at end of file diff --git a/sencha-workspace/packages/slate-cbl/src/API.js b/sencha-workspace/packages/slate-cbl/src/API.js index fb6445846..e5111ab70 100644 --- a/sencha-workspace/packages/slate-cbl/src/API.js +++ b/sencha-workspace/packages/slate-cbl/src/API.js @@ -3,6 +3,7 @@ Ext.define('Slate.cbl.API', { extend: 'Emergence.util.AbstractAPI', singleton: true, + // TODO: merge upstream to Emergence.util.AbstractAPI recordKeyFn: function(recordData) { return recordData.ID; }, @@ -24,20 +25,35 @@ Ext.define('Slate.cbl.API', { }, getRecentProgress: function(studentId, contentAreaCode, callback, scope) { - var me = this, - params = { - limit: 10, - student: studentId - }; + var me = this; me.request({ url: '/cbl/content-areas/' + contentAreaCode + '/recent-progress', method: 'GET', - params: params, + params: { + limit: 10, + student: studentId + }, success: function(response) { me.fireEvent('recentprogressload', response.data.data, studentId, contentAreaCode); Ext.callback(callback, scope, [response.data.data]); } }); + }, + + getDemonstrationsByStudentSkill: function(studentId, skillId, callback, scope) { + var me = this; + + me.request({ + method: 'GET', + url: '/cbl/skills/' + skillId + '/demonstrations', + params: { + student: studentId, + include: 'Demonstration,Demonstration.Creator' + }, + success: function(response) { + Ext.callback(callback, scope, [response.data && response.data.data, response.data]); + } + }); } }); \ No newline at end of file diff --git a/sencha-workspace/packages/slate-cbl/src/model/Skill.js b/sencha-workspace/packages/slate-cbl/src/model/Skill.js index bbd5efe02..38ebedf85 100644 --- a/sencha-workspace/packages/slate-cbl/src/model/Skill.js +++ b/sencha-workspace/packages/slate-cbl/src/model/Skill.js @@ -65,21 +65,5 @@ Ext.define('Slate.cbl.model.Skill', { proxy: { type: 'slate-cbl-records', url: '/cbl/skills' - }, - - getDemonstrationsByStudent: function(studentId, callback, scope, include) { - var me = this; - - Slate.cbl.API.request({ - method: 'GET', - url: '/cbl/skills/' + me.get('Code') + '/demonstrations', - params: { - student: studentId, - include: include || 'Demonstration,Demonstration.Creator' - }, - success: function(response) { - Ext.callback(callback, scope, [response.data && response.data.data]); - } - }); } }); \ No newline at end of file diff --git a/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js index 1067173f4..6c927ad6c 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js +++ b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js @@ -8,18 +8,21 @@ Ext.define('Slate.cbl.view.standard.AbstractOverviewWindow', { extend: 'Ext.window.Window', xtype: 'slate-cbl-standard-abstractoverviewwindow', + requires: [ + 'Slate.cbl.API' + ], config: { - student: null, - competency: null, skill: null, - demonstration: null + student: null, + selectedDemonstration: null, + showEditLinks: false }, title: 'Standard Overview', width: 700, minWidth: 700, - fixed: true, + autoScroll: true, items: [ { @@ -96,53 +99,121 @@ Ext.define('Slate.cbl.view.standard.AbstractOverviewWindow', { } ], - initEvents: function() { + + // template methods + initComponent: function() { var me = this; me.callParent(); - me.mon(me.lookupReference('demonstrationsTable').el, 'click', function(ev, t) { - me.fireEvent('demorowclick', me, ev, Ext.get(t)); - }, me, { delegate: '.skill-grid-demo-row' }); + me.skillStatementCmp = me.down('[reference=skillStatement]'); + me.demonstrationsTable = me.down('[reference=demonstrationsTable]'); }, -// applyStudent: function(student) { -// return student ? Ext.getStore('cbl-students-loaded').getById(student) : null; -// }, -// -// applyCompetency: function(competency) { -// return competency ? Ext.getStore('cbl-competencies-loaded').getById(competency) : null; -// }, - - applyStudent: function(student) { - if (Ext.isString(student)) { - student = parseInt(student, 10); - } + afterRender: function() { + var me = this; + + me.callParent(arguments); + + me.mon(me.demonstrationsTable.el, 'click', function(ev, t) { + if (targetEl = ev.getTarget('.skill-grid-demo-row', me.el, true)) { + targetEl.next('.skill-grid-demo-detail-row').toggleCls('is-expanded'); + me.doLayout(); + me.fireEvent('demorowclick', me, ev, targetEl); + } else if (targetEl = ev.getTarget('a[href="#demonstration-edit"]', me.el, true)) { + ev.stopEvent(); + me.fireEvent('editdemonstrationclick', me, parseInt(targetEl.getAttribute('data-demonstration'), 10), ev, targetEl); + } else if (targetEl = ev.getTarget('a[href="#demonstration-delete"]', me.el, true)) { + ev.stopEvent(); + me.fireEvent('deletedemonstrationclick', me, parseInt(targetEl.getAttribute('data-demonstration'), 10), ev, targetEl); + } - return student ? student : null; + }, me, { delegate: '.skill-grid-demo-row, a[href="#demonstration-edit"], a[href="#demonstration-delete"]' }); + + me.mon(Ext.GlobalEvents, 'resize', function() { + me.center(); + }); + + if (me.getSkill() && me.getStudent()) { + me.loadDemonstrationsTable(); + } }, - - applyCompetency: function(competency) { - if (Ext.isString(competency)) { - competency = parseInt(competency, 10); + + + // config handlers + updateSkill: function() { + if (this.rendered) { + this.loadDemonstrationsTable(); } + }, - return competency ? competency : null; + updateStudent: function() { + if (this.rendered) { + this.loadDemonstrationsTable(); + } }, - - applySkill: function(skill) { - if (Ext.isString(skill)) { - skill = parseInt(skill, 10); + + + // public methods + loadDemonstrationsTable: function(forceReload) { + var me = this, + skillStatementCmp = me.skillStatementCmp, + demonstrationsTable = me.demonstrationsTable, + skillId = me.getSkill(), + studentId = me.getStudent(); + + // skip load if neither skill or student has changed + if (!forceReload && skillId == me.loadedSkillId && studentId == me.loadedStudentId) { + return; } - return skill ? skill : null; - }, - - applyDemonstration: function(demonstration) { - if (Ext.isString(demonstration)) { - demonstration = parseInt(demonstration, 10); + me.loadedSkillId = skillId; + me.loadedStudentId = studentId; + + console.log('loadDemonstrationsTable, skillId=%o, studentId=%o', skillId, studentId); + + if (skillId && studentId) { + demonstrationsTable.setLoading('Loading demonstrations…'); // currently not visible due to (fixed in 5.1) http://www.sencha.com/forum/showthread.php?290453-5.0.x-loadmask-on-component-inside-window-not-visible + + Slate.cbl.API.getDemonstrationsByStudentSkill(studentId, skillId, function(skillDemonstrations, responseData) { + console.log('loaded demonstrations: ', skillDemonstrations); + + skillStatementCmp.update((responseData.skill && responseData.skill.Statement) || ''); + + skillDemonstrations.sort(function compare(a, b) { + var aDemonstrated = new Date(a.Demonstration.Demonstrated), + bDemonstrated = new Date(b.Demonstration.Demonstrated); + + return (aDemonstrated > bDemonstrated) ? 1 : (aDemonstrated < bDemonstrated) ? -1 : 0; + }); + + me.demonstrations = skillDemonstrations; + me.loadedSkillData = responseData.skill; + me.refreshDemonstrationsTable(); + + demonstrationsTable.setLoading(false); + }); + } else { + skillStatementCmp.update('Select a standard'); + + me.demonstrations = null; + me.loadedSkillData = null; + me.refreshDemonstrationsTable(); } + }, + + refreshDemonstrationsTable: function() { + var me = this, + demonstrationsTable = me.demonstrationsTable, + skillStatement = me.skillStatement, + skillData = me.loadedSkillData; + + console.log('refreshDemonstrationsTable, demonstrations=%o, demonstrationsTable=%o, selectedDemonstrationId=%o', me.demonstrations, demonstrationsTable, me.getSelectedDemonstration()); - return demonstration ? demonstration : null; + demonstrationsTable.update({ + demonstrations: me.demonstrations || [], + selectedDemonstrationId: me.getSelectedDemonstration(), + showEditLinks: me.getShowEditLinks() + }); } }); \ No newline at end of file diff --git a/sencha-workspace/packages/slate-cbl/src/view/student/DashboardController.js b/sencha-workspace/packages/slate-cbl/src/view/student/DashboardController.js index 0a61e0bcd..83157beef 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/student/DashboardController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/student/DashboardController.js @@ -89,10 +89,10 @@ Ext.define('Slate.cbl.view.student.DashboardController', { autoShow: true, animateTarget: targetEl, + competency: parseInt(targetEl.up('ul.cbl-skill-demos').up('li.cbl-competency-panel').getAttribute('data-competency'), 10), + skill: parseInt(targetEl.up('ul.cbl-skill-demos').getAttribute('data-skill'), 10), student: dashboardView.getStudent().getId(), - competency: targetEl.up('ul.cbl-skill-demos').up('li.cbl-competency-panel').getAttribute('data-competency'), - skill: targetEl.up('ul.cbl-skill-demos').getAttribute('data-skill'), - demonstration: targetEl.getAttribute('data-demonstration') + selectedDemonstration: parseInt(targetEl.getAttribute('data-demonstration'), 10) }); }, diff --git a/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js b/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js index 320e62e30..1caa0985a 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js +++ b/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindow.js @@ -11,7 +11,12 @@ Ext.define('Slate.cbl.view.student.skill.OverviewWindow', { controller: 'slate-cbl-student-skill-overviewwindow', + config: { + competency: null + }, + modal: true, + fixed: true, shadow: 'frame', dockedItems: [ @@ -39,22 +44,4 @@ Ext.define('Slate.cbl.view.student.skill.OverviewWindow', { ] } ] - -// listeners: { -// scope: 'this', -// click: { -// fn: 'onGridClick', -// element: 'el', -// delegate: '.skill-grid-demo-row' -// } -// }, -// -// onGridClick: function(ev, t) { -// var me = this, -// targetEl; -// -// if (targetEl = ev.getTarget('.skill-grid-demo-row', me.el, true)) { -// me.fireEvent('demorowclick', me, ev, targetEl); -// } -// } }); \ No newline at end of file diff --git a/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindowController.js b/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindowController.js index 5f97f5dd5..f1e8ee02e 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindowController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/student/skill/OverviewWindowController.js @@ -11,10 +11,7 @@ Ext.define('Slate.cbl.view.student.skill.OverviewWindowController', { id: 'slate-cbl-student-skill-overviewwindow', // workaround for http://www.sencha.com/forum/showthread.php?290043-5.0.1-destroying-a-view-with-ViewController-attached-disables-listen-..-handlers control: { '#': { - beforeshow: 'onBeforeWindowShow', - beforerender: 'onBeforeRender', - demorowclick: 'onDemoRowClick', - destroy: 'onDestroy' + beforeshow: 'onBeforeWindowShow' }, 'combobox[reference=skillCombo]': { change: 'onSkillChange' @@ -27,83 +24,30 @@ Ext.define('Slate.cbl.view.student.skill.OverviewWindowController', { return Ext.id(null, id); }, - onBeforeRender: function(overviewWindow) { - overviewWindow.mon(Ext.GlobalEvents, 'resize', function() { - overviewWindow.center(); - }); - - overviewWindow.mon(Ext.getWin(), 'scroll', function() { - overviewWindow.center(); - }); - }, - onBeforeWindowShow: function(overviewWindow) { var me = this, competencyId = overviewWindow.getCompetency(), skillsCombo = me.lookupReference('skillCombo'), - skillStore = skillsCombo.getStore(), - skillId = overviewWindow.getSkill(); + skillStore = skillsCombo.getStore(); - if (skillId && competencyId) { - - if(!skillStore.isLoaded()) { - Slate.cbl.API.getSkills(competencyId, function(response){ - skillStore.loadRawData(response.data); - - skillsCombo.setValue(skillStore.findRecord('ID', skillId)); - me.syncDemonstrationsTable(); - }); - - } else { - me.syncDemonstrationsTable(); - } + if (!competencyId || skillStore.isLoaded()) { + return; } - }, - onDemoRowClick: function(overviewWindow, ev, targetEl) { - targetEl.next('.skill-grid-demo-detail-row').toggleCls('is-expanded'); - overviewWindow.doLayout(); - }, + Slate.cbl.API.getSkills(competencyId, function(response){ + skillStore.loadRawData(response.data); - onSkillChange: function(skillCombo, skill) { - this.syncDemonstrationsTable(); + skillsCombo.setValue(skillStore.findRecord('ID', overviewWindow.getSkill())); + }); }, - // private methods - syncDemonstrationsTable: function() { // TODO: move some/all of this method to common view code? - var me = this, - demonstrationsTable = me.lookupReference('demonstrationsTable'), - skillId = me.lookupReference('skillCombo').getValue(), - studentId = me.view.getStudent(), - demonstrationId = me.view.getDemonstration(); - - if (skillId && studentId) { - // currently not visible due to http://www.sencha.com/forum/showthread.php?290453-5.0.x-loadmask-on-component-inside-window-not-visible - demonstrationsTable.setLoading('Loading demonstrations…'); - Slate.cbl.model.Skill.load(skillId, { - callback: function(skill) { - skill.getDemonstrationsByStudent(studentId, function(skillDemonstrations) { - - skillDemonstrations.sort(function compare(a, b) { - var aDemonstrated = new Date(a.Demonstration.Demonstrated), - bDemonstrated = new Date(b.Demonstration.Demonstrated); - - return (aDemonstrated > bDemonstrated) ? 1 : (aDemonstrated < bDemonstrated) ? -1 : 0; - }); + onSkillChange: function(skillCombo, skill) { + skill = skill && skillCombo.findRecordByValue(skill); - demonstrationsTable.update({ - demonstrations: skillDemonstrations, - selectedDemonstrationId: demonstrationId - }); - demonstrationsTable.setLoading(false); - }); - } - }); - } else { - demonstrationsTable.update({ - demonstrations: [], - selectedDemonstrationId: null - }); + if (skill) { + this.lookupReference('skillStatement').update(skill.get('Statement')); } + + this.getView().setSkill(skill ? skill.getId() : null); } }); diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/DashboardController.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/DashboardController.js index 088a30295..a01c981ad 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/DashboardController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/DashboardController.js @@ -72,10 +72,11 @@ Ext.define('Slate.cbl.view.teacher.DashboardController', { autoShow: true, animateTarget: targetEl, - student: targetEl.up('.cbl-grid-demos-cell').getAttribute('data-student'), - competency: targetEl.up('.cbl-grid-skills-row').getAttribute('data-competency'), - skill: targetEl.up('.cbl-grid-skill-row').getAttribute('data-skill'), - demonstration: targetEl.getAttribute('data-demonstration'), + competency: parseInt(targetEl.up('.cbl-grid-skills-row').getAttribute('data-competency'), 10), + + skill: parseInt(targetEl.up('.cbl-grid-skill-row').getAttribute('data-skill'), 10), + student: parseInt(targetEl.up('.cbl-grid-demos-cell').getAttribute('data-student'), 10), + selectedDemonstration: parseInt(targetEl.getAttribute('data-demonstration'), 10), listeners: { scope: this, diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js index 0f2e58c5f..3b346ba98 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindow.js @@ -12,7 +12,10 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindow', { controller: 'slate-cbl-teacher-skill-overviewwindow', - autoScroll: true, + config: { + competency: null, + showEditLinks: true + }, dockedItems: [ { @@ -98,25 +101,12 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindow', { ] } ], + + applyCompetency: function(competency) { + if (Ext.isString(competency)) { + competency = parseInt(competency, 10); + } -// listeners: { -// scope: 'this', -// click: { -// fn: 'onGridClick', -// element: 'el', -// delegate: '.skill-grid-demo-row, a[href="#demonstration-edit"]' -// } -// }, -// -// onGridClick: function(ev, t) { -// var me = this, -// targetEl; -// -// if (targetEl = ev.getTarget('.skill-grid-demo-row', me.el, true)) { -// me.fireEvent('demorowclick', me, ev, targetEl); -// } else if (targetEl = ev.getTarget('a[href="#demonstration-edit"]', me.el, true)) { -// ev.stopEvent(); -// me.fireEvent('editdemonstrationclick', me, parseInt(targetEl.getAttribute('data-demonstration'), 10), ev, targetEl); -// } -// } + return competency ? competency : null; + } }); diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js index a061784bd..293a786e5 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/skill/OverviewWindowController.js @@ -7,10 +7,7 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindowController', { id: 'slate-cbl-teacher-skill-overviewwindow', control: { '#': { - beforeshow: 'onBeforeWindowShow', - demorowclick: 'onDemoRowClick', - demoeditclick: 'onDemoEditClick', - beforerender: 'onBeforeRender' + beforeshow: 'onBeforeWindowShow' }, 'combobox[reference=competencyCombo]': { change: 'onCompetencyChange' @@ -41,34 +38,16 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindowController', { return Ext.id(null, id); }, - onBeforeRender: function(overviewWindow) { - overviewWindow.mon(Ext.GlobalEvents, 'resize', function() { - overviewWindow.center(); - }); - - overviewWindow.mon(Ext.getWin(), 'scroll', function() { - overviewWindow.center(); - }); - }, - onBeforeWindowShow: function(overviewWindow) { - var me = this, - competency = overviewWindow.getCompetency(), - student = overviewWindow.getStudent(); - - if (competency) { - me.lookupReference('competencyCombo').setValue(competency); - } - - if (student) { - me.lookupReference('studentCombo').setValue(student); - } + this.lookupReference('competencyCombo').setValue(overviewWindow.getCompetency()); + this.lookupReference('studentCombo').setValue(overviewWindow.getStudent()); }, onCompetencyChange: function(competencyCombo, competency) { competency = competency && competencyCombo.findRecordByValue(competency); - var me = this; + var me = this, + overviewWindow = me.getView(); if (!competency) { return; @@ -76,13 +55,15 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindowController', { competency.withSkills(function(skills) { var skillsCombo = me.lookupReference('skillCombo'), - initialValue = me.getView().getSkill(); + initialValue = overviewWindow.getSkill(); skillsCombo.getStore().loadRawData(skills.getRange()); skillsCombo.enable(); if (!skillsCombo.findRecordByValue(skillsCombo.getValue() || initialValue)) { + overviewWindow.setSkill(null); skillsCombo.clearValue(); + skillsCombo.expand(); skillsCombo.focus(); } else if (initialValue) { skillsCombo.setValue(initialValue); @@ -91,24 +72,17 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindowController', { }, onSkillChange: function(skillCombo, skill) { - var me = this; - skill = skill && skillCombo.findRecordByValue(skill); - me.lookupReference('skillStatement').update(skill ? skill.get('Statement') : 'Select a competency and skill'); + if (skill) { + this.lookupReference('skillStatement').update(skill.get('Statement')); + } - me.syncDemonstrationsTable(); + this.getView().setSkill(skill ? skill.getId() : null); }, onStudentChange: function(studentCombo, student) { - // TODO: update window title - - this.syncDemonstrationsTable(); - }, - - onDemoRowClick: function(overviewWindow, ev, targetEl) { - targetEl.next('.skill-grid-demo-detail-row').toggleCls('is-expanded'); - overviewWindow.doLayout(); + this.getView().setStudent(student); }, onOverrideClick: function() { @@ -121,50 +95,11 @@ Ext.define('Slate.cbl.view.teacher.skill.OverviewWindowController', { }, onDemonstrationSave: function(demonstration) { - var me = this, - demonstrationSkillIds = Ext.pluck(demonstration.get('Skills')||[], 'SkillID'), - loadedStudentId = me.lookupReference('studentCombo').getValue(), - loadedSkillId = me.lookupReference('skillCombo').getValue(); + var overviewWindow = this.getView(), + demonstrationSkillIds = Ext.pluck(demonstration.get('Skills')||[], 'SkillID'); - if (demonstration.get('StudentID') == loadedStudentId && Ext.Array.contains(demonstrationSkillIds, loadedSkillId)) { - me.syncDemonstrationsTable(); - } - }, - - - // private methods - syncDemonstrationsTable: function() { // TODO: move some/all of this method to common view code? - var me = this, - demonstrationsTable = me.lookupReference('demonstrationsTable'), - skillCombo = me.lookupReference('skillCombo'), - skillId = skillCombo.getValue(), - skill = skillId && skillCombo.findRecordByValue(skillId), - studentId = me.lookupReference('studentCombo').getValue(), - demonstrationId = me.view.getDemonstration(); - - if (skill && studentId) { - demonstrationsTable.setLoading('Loading demonstrations…'); // currently not visible due to http://www.sencha.com/forum/showthread.php?290453-5.0.x-loadmask-on-component-inside-window-not-visible - skill.getDemonstrationsByStudent(studentId, function(skillDemonstrations) { - skillDemonstrations.sort(function compare(a, b) { - var aDemonstrated = new Date(a.Demonstration.Demonstrated), - bDemonstrated = new Date(b.Demonstration.Demonstrated); - - return (aDemonstrated > bDemonstrated) ? 1 : (aDemonstrated < bDemonstrated) ? -1 : 0; - }); - - demonstrationsTable.update({ - demonstrations: skillDemonstrations, - selectedDemonstrationId: demonstrationId, - showEditLinks: true - }); - - demonstrationsTable.setLoading(false); - }); - } else { - demonstrationsTable.update({ - demonstrations: [], - selectedDemonstrationId: null - }); + if (demonstration.get('StudentID') == overviewWindow.getStudent() && Ext.Array.contains(demonstrationSkillIds, overviewWindow.getSkill())) { + overviewWindow.loadDemonstrationsTable(true); } } }); \ No newline at end of file From 957ca2e4c1927f32722923d7728a08a5dc33ae53 Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sat, 25 Apr 2015 23:12:20 -0400 Subject: [PATCH 6/8] fixed duplicate reference error when demonstrations edit window had multiple competency cards --- .../slate-cbl/src/view/teacher/demonstration/CompetencyCard.js | 2 +- .../src/view/teacher/demonstration/EditWindowController.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/CompetencyCard.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/CompetencyCard.js index 62a90a290..b55640217 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/CompetencyCard.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/CompetencyCard.js @@ -19,7 +19,7 @@ Ext.define('Slate.cbl.view.teacher.demonstration.CompetencyCard', { // labelWidth: 150 }, dockedItems: [{ - reference: 'competencyDescription', + itemId: 'competencyDescription', dock: 'top', xtype: 'component', diff --git a/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js b/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js index 6780cf6ca..d6a2999d8 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js +++ b/sencha-workspace/packages/slate-cbl/src/view/teacher/demonstration/EditWindowController.js @@ -398,9 +398,9 @@ Ext.define('Slate.cbl.view.teacher.demonstration.EditWindowController', { } competencyCard = competenciesTabPanel.insert(insertIndex, competencyCardConfig); + competencyCard.down('#competencyDescription').update(competency.getData()); competenciesTabPanel.setActiveItem(competencyCard); - me.lookupReference('competencyDescription').update(competency.getData()); if (competenciesSearchField.isDirty()) { competenciesSearchField.reset(); // changing the value from dirty back to blank will trigger the change handler From 5066771ced6bf394456ebb3f7a26351fa91ea8d6 Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sat, 25 Apr 2015 23:31:48 -0400 Subject: [PATCH 7/8] fixed demonstrated date failing to populate when editing demonstration --- sencha-workspace/packages/slate-cbl/src/model/Demonstration.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sencha-workspace/packages/slate-cbl/src/model/Demonstration.js b/sencha-workspace/packages/slate-cbl/src/model/Demonstration.js index c7b3b79ff..2726967fc 100644 --- a/sencha-workspace/packages/slate-cbl/src/model/Demonstration.js +++ b/sencha-workspace/packages/slate-cbl/src/model/Demonstration.js @@ -44,7 +44,8 @@ Ext.define('Slate.cbl.model.Demonstration', { { name: "Demonstrated", type: "date", - dateFormat: "Y-m-d" + dateFormat: "timestamp", + useNull: true }, // { // name: "Level", From e668010ad5ea02ddc90aeb760c01af209be40300 Mon Sep 17 00:00:00 2001 From: Chris Alfano Date: Sun, 26 Apr 2015 00:43:52 -0400 Subject: [PATCH 8/8] removed console.log calls --- .../slate-cbl/src/view/standard/AbstractOverviewWindow.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js index 6c927ad6c..b95791dc2 100644 --- a/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js +++ b/sencha-workspace/packages/slate-cbl/src/view/standard/AbstractOverviewWindow.js @@ -170,14 +170,10 @@ Ext.define('Slate.cbl.view.standard.AbstractOverviewWindow', { me.loadedSkillId = skillId; me.loadedStudentId = studentId; - console.log('loadDemonstrationsTable, skillId=%o, studentId=%o', skillId, studentId); - if (skillId && studentId) { demonstrationsTable.setLoading('Loading demonstrations…'); // currently not visible due to (fixed in 5.1) http://www.sencha.com/forum/showthread.php?290453-5.0.x-loadmask-on-component-inside-window-not-visible - Slate.cbl.API.getDemonstrationsByStudentSkill(studentId, skillId, function(skillDemonstrations, responseData) { - console.log('loaded demonstrations: ', skillDemonstrations); - + Slate.cbl.API.getDemonstrationsByStudentSkill(studentId, skillId, function(skillDemonstrations, responseData) { skillStatementCmp.update((responseData.skill && responseData.skill.Statement) || ''); skillDemonstrations.sort(function compare(a, b) { @@ -208,8 +204,6 @@ Ext.define('Slate.cbl.view.standard.AbstractOverviewWindow', { skillStatement = me.skillStatement, skillData = me.loadedSkillData; - console.log('refreshDemonstrationsTable, demonstrations=%o, demonstrationsTable=%o, selectedDemonstrationId=%o', me.demonstrations, demonstrationsTable, me.getSelectedDemonstration()); - demonstrationsTable.update({ demonstrations: me.demonstrations || [], selectedDemonstrationId: me.getSelectedDemonstration(),