Created
December 6, 2011 15:15
-
-
Save topherfangio/1438527 to your computer and use it in GitHub Desktop.
SC1.6 & Sencha Touch 1.1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| CORE360_PROPERTIES_TO_IGNORE = [ 'json_encodable', 'ext_data', 'attributes', 'readOnlyAttributes' ]; | |
| Core360.Model = SC.Record.extend({ | |
| ext_data: function() { | |
| var hash = SC.clone(this.get('attributes')); | |
| var property_keys = this.get('_properties'); | |
| if (SC.none(hash) || SC.none(property_keys)) { | |
| return {}; | |
| } | |
| var property_key = null; | |
| var property = null; | |
| for (var i = 0; i < property_keys.length; i++) { | |
| property_key = property_keys[i]; | |
| if (!CORE360_PROPERTIES_TO_IGNORE.contains(property_key)) { | |
| property = this.get(property_key); | |
| hash[property_key] = this._convert_to_ext_data(property); | |
| } | |
| } | |
| return hash; | |
| }.property(), | |
| /* | |
| * Properly recurses over an object and gatheres all | |
| * ext_data available. If the leaf objects do not | |
| * respond to ext_data, the object itself is returned. | |
| */ | |
| _convert_to_ext_data: function(obj) { | |
| var self = this; | |
| if (SC.none(obj)) { | |
| return obj; | |
| } | |
| /* | |
| * Check for an Enumerable | |
| */ | |
| if (obj.forEach) { | |
| var newEnum = []; | |
| obj.forEach(function(o, i) { | |
| newEnum.pushObject(self._convert_to_ext_data(o)); | |
| }); | |
| return newEnum; | |
| } | |
| /* | |
| * Check to see if the object responds to ext_data() | |
| */ | |
| if (obj.ext_data) { | |
| return obj.get('ext_data'); | |
| } else { | |
| return obj; | |
| } | |
| } | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Mobile360 = SC.Application.create( | |
| /** @scope Mobile360.prototype */ { | |
| NAMESPACE: 'Mobile360', | |
| VERSION: '0.1.0', | |
| States: {}, | |
| currentSlideDirection: 'left', | |
| DEFAULT_SLIDE_ANIMATION: SC.Object.create({ | |
| type: 'slide', | |
| directionBinding: 'Mobile360.currentSlideDirection' | |
| }) | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Mobile360.currentUserTaskValidCompletersController = SC.ObjectController.create({ | |
| contentBinding: 'Mobile360.currentUserTaskController.valid_completers', | |
| ext_store: new Ext.data.JsonStore({ | |
| model: 'Member', | |
| data: [] | |
| }), | |
| contentDidChange: function() { | |
| var ext_store = this.get('ext_store'); | |
| var content = this.get('content'); | |
| if (!SC.none(content)) { | |
| ext_store.loadData(content.getEach('ext_data')); | |
| } | |
| }.observes('*content.[]') | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Mobile360.ExtView = SC.Object.extend({ | |
| /* | |
| * The Ext object created by this view. Subclasses should | |
| * override the +init()+ to create and set the object. | |
| */ | |
| ext: null, | |
| init: function() { | |
| var panel = new Ext.Panel({ | |
| html: 'override init() to change' | |
| }); | |
| this.set('ext', panel); | |
| } | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| sc_require('states/statechart.js'); | |
| Mobile360.main = function main() { | |
| /* | |
| * Initialize our Statechart which handles the current state of the application | |
| */ | |
| Mobile360.statechart.initStatechart(); | |
| }; | |
| function main() { Mobile360.main(); } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Core360.Member = Core360.Model.extend( | |
| /** @scope Core360.Member.prototype */ { | |
| primaryKey: 'username', | |
| fullname: SC.Record.attr(String), | |
| email: SC.Record.attr(String), | |
| roles: SC.Record.attr(Array), | |
| json_encodable: function() { | |
| var member = SC.clone(this.get('attributes')); | |
| return member; | |
| }.property() | |
| }); | |
| /* | |
| * Code specific to the mobile app | |
| */ | |
| if (typeof Ext !== "undefined") { | |
| Ext.regModel('Member', { | |
| fields: [ | |
| 'fullname', | |
| 'email' | |
| ] | |
| }); | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Mobile360.States.startup = Ki.State.design({ | |
| initialSubstate: 'waitingForExt', | |
| waitingForExt: Ki.State.design({}), | |
| loading: Ki.State.plugin('Mobile360.States.loading'), | |
| checkCredentials: Ki.State.plugin('Mobile360.States.checkCredentials'), | |
| loggedIn: Ki.State.plugin('Mobile360.States.loggedIn'), | |
| enterState: function() { | |
| SC.RunLoop.begin(); | |
| Mobile360.ExtApp = new Ext.Application({ | |
| launch: function() { | |
| Mobile360.EXT_VIEWPORT = new Ext.Panel({ | |
| fullscreen: true, | |
| layout: 'fit', | |
| cls: 'ts_app_container', | |
| items: [] | |
| }); | |
| this.viewport = Mobile360.EXT_VIEWPORT; | |
| Mobile360.statechart.sendAction('_ext_launched'); | |
| } | |
| }); | |
| SC.RunLoop.end(); | |
| }, | |
| exitState: function() { | |
| }, | |
| _ext_launched: function() { | |
| this.gotoState('loading'); | |
| } | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Mobile360.statechart = SC.StatechartManager.create({ | |
| trace: NO, | |
| rootState: Ki.State.design({ | |
| initialSubstate: 'startup', | |
| startup: Ki.State.plugin('Mobile360.States.startup'), | |
| main: Ki.State.plugin('Mobile360.States.main'), | |
| startupFinished: function() { | |
| this.gotoState('main'); | |
| } | |
| }) | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Mobile360.UserTaskDetailView = Mobile360.ExtView.extend({ | |
| user_taskBinding: 'Mobile360.currentUserTaskController.content', | |
| _ext_heading: null, | |
| _ext_title: null, | |
| _ext_notes: null, | |
| _ext_list: null, | |
| _ext_panel: null, | |
| _ext_template: new Ext.XTemplate( SC.TEMPLATES['user_task_detail'].rawTemplate, Mobile360.Helpers ), | |
| init: function() { | |
| var sc_view = this; | |
| var heading = new Ext.Component({ | |
| tpl: this.get('_ext_template') | |
| }); | |
| var title = new Ext.Component({ | |
| tpl: "<div class='description'>{description}</div>" | |
| }); | |
| var list = new Ext.List({ | |
| itemTpl: '{fullname}', | |
| scroll: false, | |
| store: Mobile360.currentUserTaskValidCompletersController.get('ext_store') | |
| // TODO: make this non-selectable | |
| }); | |
| list.on('selectionchange', function(model, records) { | |
| /* | |
| * Disallow selections. | |
| * | |
| * TODO: This is a workaround since the 'beforeselect' event is | |
| * never fired. | |
| */ | |
| list.deselect(records); | |
| }); | |
| var notes = new Ext.form.TextArea({ | |
| disabled: true, | |
| value: 'no notes' | |
| }); | |
| var panel = new Ext.form.FormPanel({ | |
| cls: 'user_task_detail', | |
| scroll: 'vertical', | |
| dockedItems: [ heading ], | |
| items: [ | |
| title, | |
| /* | |
| { | |
| xtype: 'fieldset', | |
| title: 'Can Be Completed By', | |
| items: [ list ] | |
| } | |
| */ | |
| { | |
| xtype: 'fieldset', | |
| title: 'Notes', | |
| items: [ notes ] | |
| } | |
| ] | |
| }); | |
| this.set('_ext_heading', heading); | |
| this.set('_ext_title', title); | |
| this.set('_ext_notes', notes); | |
| this.set('_ext_list', list); | |
| this.set('_ext_panel', panel); | |
| this.set('ext', panel); | |
| }, | |
| user_taskDidChange: function() { | |
| var user_task = this.get('user_task'); | |
| var heading = this.get('_ext_heading'); | |
| var title = this.get('_ext_title'); | |
| var notes = this.get('_ext_notes'); | |
| var data = null | |
| if (!SC.none(user_task)) { | |
| data = user_task.get('ext_data'); | |
| } | |
| if (!SC.none(data)) { | |
| heading.update(data); | |
| title.update(data); | |
| notes.setValue(data.notes); | |
| /* | |
| * Make the timestamps more friendly. The second call is in case the first one fails due to rendering lag. | |
| */ | |
| setTimeout(function() { jQuery('abbr.timeago').timeago() }, 100); | |
| setTimeout(function() { jQuery('abbr.timeago').timeago() }, 1000); | |
| } | |
| }.observes('user_task') | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Mobile360.States.viewUserTask = Ki.State.design({ | |
| enterState: function() { | |
| /* | |
| * Make sure we start with a clean runloop | |
| */ | |
| SC.RunLoop.begin(); SC.RunLoop.end(); | |
| var view = Mobile360.actionPlansListView; | |
| var button = view.get('backButton'); | |
| button.set('visible', YES); | |
| button.set('title', 'Tasks'); | |
| button.set('action', 'viewActionPlanAction'); | |
| view.set('title', Mobile360.currentUserTaskController.get('description')); | |
| view.get('ext').setActiveItem(Mobile360.userTaskDetailView.get('ext'), Mobile360.DEFAULT_SLIDE_ANIMATION); | |
| }, | |
| exitState: function() { | |
| }, | |
| viewActionPlanAction: function() { | |
| Mobile360.set('currentSlideDirection', 'right'); | |
| this.gotoState('viewActionPlan'); | |
| } | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment