rutile
Version:
Factory automation for Mobile Enterprise.
269 lines (229 loc) • 8.68 kB
JavaScript
var self = exports;
var navi; // current navigationController
var infoPanel = Alloy.createController('Framework/InfoPanel'); // stack and view of queries
var updatingView = false; // true while updating listview
var removingItems = false; // true while removing remote data
var enableItemSelection = true;
var checkedItems = {};
var Dispatch = require('CentralDispatch');
var Notifier = require('NotificationCenter');
var fontawesome = require('IconicFont').IconicFont({font:'FontAwesome'});
// entity
var {{entity}}Model = require("Model/{{segment}}/{{entity}}");
// * * * * * * * * * * * * * * * * * * * * * * *
var selectItem = function(sectionIndex,section,itemIndex,item){
checkedItems[item.entity.{{primary_key}}] = { sectionIndex:sectionIndex, section:section, itemIndex:itemIndex, item:item };
item.check.text = fontawesome.icon('fa-check-square-o');
item.check.color = "#4d771f",
item.properties.backgroundColor = "#e9ffd0";
section.replaceItemsAt(itemIndex,1,[item]);
};
var deselectItem = function(sectionIndex,section,itemIndex,item){
delete checkedItems[item.entity.{{primary_key}}];
item.check.text = fontawesome.icon('fa-square-o');
item.check.color = "#aaa",
item.properties.backgroundColor = "#fff";
section.replaceItemsAt(itemIndex,1,[item]);
};
function onItemClick(e){
var section = $.SearchResultList.sections[e.sectionIndex]; // get the clicked section
var item = section.getItemAt(e.itemIndex); // get the clicked item from that section
if( e.bindId === 'check' || e.bindId === 'checkWrapper' ){
if( checkedItems[item.entity.{{primary_key}}] ){
deselectItem(e.sectionIndex,section,e.itemIndex,item);
if( Object.keys(checkedItems).length == 0 ){
enableItemSelection = true; // allow page navigation
navi.hideSubMenu();
}
}else{
selectItem(e.sectionIndex,section,e.itemIndex,item);
if( Object.keys(checkedItems).length == 1 ){
enableItemSelection = false; // prevent page navigation
navi.showSubMenu();
}
}
}else{
if( !enableItemSelection ){
$.SearchResultList.deselectItem(e.sectionIndex,e.itemIndex); // prevent item select action while checkbox selection
return;
}
var controller = Alloy.createController('KitchenSink/{{segment}}/{{entity}}/EditForm');
controller.set{{#Uc_first}}{{primary_key}}{{/Uc_first}}(item.entity.{{primary_key}});
navi.open(controller);
$.SearchResultList.deselectItem(e.sectionIndex,e.itemIndex);
}
}
var deselectAllItems = function(){
var itemIDs = Object.keys(checkedItems);
for( var i=0; i<itemIDs.length; i++ ){
var sectionIndex = checkedItems[itemIDs[i]].sectionIndex;
var section = checkedItems[itemIDs[i]].section;
var itemIndex = checkedItems[itemIDs[i]].itemIndex;
var item = checkedItems[itemIDs[i]].item;
deselectItem(sectionIndex,section,itemIndex,item);
}
navi.hideSubMenu();
};
var removeItems = function(){
var dialog = Ti.UI.createOptionDialog({
cancel : 1,
options : [ L('FrameworkMessageRemove'), L('FrameworkMessageCancel') ],
destructive : 0,
title : L('FrameworkMessageRemoveConfirmationText') + ' ' + L('FrameworkMessageNoticeCollectionRemoval'),
});
dialog.addEventListener('click',function(e){
if( removingItems ){
return;
}
removingItems = true;
if(e.index === 0){
{{entity}}Model.remove({
ids : Object.keys(checkedItems),
callback : function({{#Lc_first}}{{entity}}{{/Lc_first}}s){
checkedItems = {};
navi.hideSubMenu();
updateView();
removingItems = false;
enableItemSelection = true;
},
});
}
});
dialog.show();
};
// * * * * * * * * * * * * * * * * * * * * * * *
// pull down event handling
$.SearchResultList.pullView = Ti.UI.createView(); // dummy
$.SearchResultList.addEventListener('pull',function(e){
if( e.active == true ){
infoPanel.openContainer();
}else{
infoPanel.closeContainer();
}
});
var updateView = function(){
if( updatingView ){ return; }
updatingView = true;
var info = infoPanel.getCurrentInfo();
var query = info.getQuery();
// show indicator
var rootWin = navi.getRootWindow();
rootWin.touchEnabled = false;
var indicator = Alloy.createController('Framework/Indicator');
indicator.getView().center = rootWin.center;
indicator.setMessage(L('FrameworkIndicatorLoadingMessage'));
indicator.showIndicator();
rootWin.add(indicator.getView());
{{entity}}Model.search({
query : query,
callback : function({{#Lc_first}}{{entity}}{{/Lc_first}}s){
var listView = $.SearchResultList;
var section = Ti.UI.createListSection();
var items = [];
for( var i=0; i<{{#Lc_first}}{{entity}}{{/Lc_first}}s.length; i++ ){
var {{#Lc_first}}{{entity}}{{/Lc_first}} = {{#Lc_first}}{{entity}}{{/Lc_first}}s[i].entity;
var item = {
template : "ListTemplate",
properties : {
backgroundColor : "#fff",
selectedBackgroundColor : "#e9ffd0",
accessoryType : Ti.UI.LIST_ACCESSORY_TYPE_DISCLOSURE,
},
checkWrapper : {
},
check : {
color : "#aaa",
font : {fontSize:"14dp", fontFamily:fontawesome.fontfamily()},
text : fontawesome.icon('fa-square-o'),
},
label : {
text : {{#Lc_first}}{{entity}}{{/Lc_first}}.{{featuredFieldName}}, // featured field
},
entity : {{#Lc_first}}{{entity}}{{/Lc_first}},
};
items.push(item);
}
section.setItems(items);
listView.setSections([section]);
// hide indicator
indicator.hideIndicator();
rootWin.remove(indicator.getView());
rootWin.touchEnabled = true;
updatingView = false;
},
});
};
// * * * * * * * * * * * * * * * * * * * * * * *
// navigation protocol
exports.viewDidLoad = function(){
navi = Alloy.Globals.navigationControllerStack[0];
// no left buttons (using default left button, back)
// sub left buttons
var cancelButton = Alloy.createController('Framework/NaviCancelButton');
cancelButton.setButtonHandler(function(e){
deselectAllItems();
});
navi.addSubLeftButton(cancelButton.getView());
// right buttons
var addButton = Alloy.createController('Framework/NaviAddButton');
var searchButton = Alloy.createController('Framework/NaviSearchButton');
addButton.setButtonHandler(function(e){
var controller = Alloy.createController('KitchenSink/{{segment}}/{{entity}}/EditForm');
var modalWindow = Alloy.createController('Framework/ModalWindow');
modalWindow.getView().open();
modalWindow.navigationGroup.enableBackButton();
modalWindow.navigationGroup.open(controller);
});
searchButton.setButtonHandler(function(e){
var controller = Alloy.createController('KitchenSink/{{segment}}/{{entity}}/SearchForm');
var modalWindow = Alloy.createController('Framework/ModalWindow');
modalWindow.getView().open();
modalWindow.navigationGroup.enableBackButton();
modalWindow.navigationGroup.open(controller);
});
navi.addRightButton(addButton.getView());
navi.addRightButton(searchButton.getView());
// sub right buttons
var trashButton = Alloy.createController('Framework/NaviTrashButton');
trashButton.setButtonHandler(function(e){
removeItems();
});
navi.addSubRightButton(trashButton.getView());
// title
var title = Alloy.createController('Framework/NaviTitle');
title.setTitle(String.format(L('FrameworkTitleFormatListView'),L('{{segment}}_{{entity}}')));
navi.setTitleView(title.getView());
// sub title
var subTitle = Alloy.createController('Framework/NaviTitle');
subTitle.setTitle(String.format(L('FrameworkSubTitleFormatListView'),L('{{segment}}_{{entity}}')));
navi.setSubTitleView(subTitle.getView());
// info panel
infoPanel.setHeaderText(L('FrameworkQuerySummaryHeaderText'));
infoPanel.initPosition();
infoPanel.getView().addEventListener('contentChanged',function(e){
updateView();
});
// start listen query
Notifier.listen('{{segment}}/{{entity}}.searchQueryChanged',function(query){
var info = Alloy.createController('Framework/Query');
info.setQuery(query);
infoPanel.push(info);
infoPanel.openContainer();
updateView();
});
// start with empty query
var info = Alloy.createController('Framework/Query');
info.setQuery({ query:{}, constraintTexts:[], logicText:'' });
infoPanel.push(info);
updateView();
};
exports.viewWillAppear = function(){
var rootWin = navi.getRootWindow();
rootWin.add(infoPanel.getView());
infoPanel.restorePosition();
};
exports.viewWillDisappear = function(){
var rootWin = navi.getRootWindow();
rootWin.remove(infoPanel.getView());
infoPanel.resumePosition();
};