tns-template-master-detail-kinvey-ts
Version:
Master-detail interface to display collection of items from Kinvey and inspect and edit selected item properties.
113 lines (98 loc) • 5.03 kB
text/typescript
import { EventData } from "tns-core-modules/data/observable";
import { alert } from "tns-core-modules/ui/dialogs";
import { Frame } from "tns-core-modules/ui/frame";
import { GridLayout } from "tns-core-modules/ui/layouts/grid-layout";
import { NavigatedData, Page } from "tns-core-modules/ui/page";
import { CarDetailEditViewModel } from "./car-detail-edit-view-model";
/* ***********************************************************
* This is the item detail edit code behind.
* This code behind gets the selected data item, provides options to edit the item and saves the changes.
*************************************************************/
/* ***********************************************************
* Use the "onNavigatingTo" handler to get the data item id parameter passed through navigation.
* Use it to initialize the view model and assign it as a view binding context.
*************************************************************/
export function onNavigatingTo(args: NavigatedData): void {
/* ***********************************************************
* The "onNavigatingTo" event handler lets you detect if the user navigated with a back button.
* Skipping the re-initialization on back navigation means the user will see the
* page in the same data state that he left it in before navigating.
*************************************************************/
if (args.isBackNavigation) {
return;
}
const page = <Page>args.object;
page.bindingContext = new CarDetailEditViewModel(page.navigationContext);
}
/* ***********************************************************
* The edit cancel button navigates back to the item details page.
*************************************************************/
export function onCancelButtonTap(args: EventData): void {
Frame.topmost().goBack();
}
/* ***********************************************************
* The edit done button calls the view model save changes logic.
*************************************************************/
export function onDoneButtonTap(args: EventData): void {
/* ***********************************************************
* By design this app is set up to work with read-only sample data.
* Follow the steps in the "Kinvey database setup" section in app/readme.md file
* and uncomment the code block below to make it editable.
*************************************************************/
/* ***********************uncomment here*********************
const actionItem = <ActionItem>args.object;
const bindingContext = <CarDetailEditViewModel>actionItem.bindingContext;
bindingContext.saveChanges()
.then(() => Frame.topmost().navigate({
moduleName: "cars/cars-list-page",
clearHistory: true,
animated: true,
transition: {
name: "slideBottom",
duration: 200,
curve: "ease"
}
}))
.catch((errorMessage: any) =>
alert({ title: "Oops!", message: "Something went wrong. Please try again.", okButtonText: "Ok" }));
*********************uncomment here*************************/
/* ***********************************************************
* Comment out the code block below if you made the app editable.
*************************************************************/
const readOnlyMessage = "Check out the \"Kinvey database setup\" section in the readme file to make it editable."; // tslint:disable-line:max-line-length
const queue = Promise.resolve();
queue.then(() => alert({ title: "Read-Only Template!", message: readOnlyMessage, okButtonText: "Ok" }))
.then(() => Frame.topmost().navigate({
moduleName: "cars/cars-list-page",
clearHistory: true,
animated: true,
transition: {
name: "slideBottom",
duration: 200,
curve: "ease"
}
}));
}
export function onSelectorTap(args: EventData): void {
const gridLayout = <GridLayout>args.object;
const tag = gridLayout.get("tag");
const bindingContext = <CarDetailEditViewModel>gridLayout.bindingContext;
const selectedValue = bindingContext.car[tag];
const context = { tag, selectedValue };
const modalPagePath = "cars/list-selector-modal-page/list-selector-modal-page";
const page = <Page>gridLayout.page;
page.showModal(modalPagePath, {
context,
closeCallback: (value: string) => {
if (value) {
bindingContext.car[tag] = value;
}
},
fullscreen: false
});
}
export function onImageAddRemoveTap(args: EventData): void {
const gridLayout = <GridLayout>args.object;
const bindingContext = <CarDetailEditViewModel>gridLayout.bindingContext;
bindingContext.onImageAddRemove();
}