This commit is contained in:
Richard Flamsholt 2013-11-07 09:36:27 -06:00
Коммит 18ea9f2048
48 изменённых файлов: 5042 добавлений и 0 удалений

3
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,3 @@
*/bin
*/obj
*.user-settings.xml

Двоичные данные
Eventer/App_Resources/Android/drawable-hdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.7 KiB

Двоичные данные
Eventer/App_Resources/Android/drawable-ldpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.8 KiB

Двоичные данные
Eventer/App_Resources/Android/drawable-mdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.4 KiB

Двоичные данные
Eventer/App_Resources/Android/drawable-nodpi/splashscreen.9.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.8 KiB

Двоичные данные
Eventer/App_Resources/iOS/Default-568h@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
Eventer/App_Resources/iOS/Default-Landscape.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 15 KiB

Двоичные данные
Eventer/App_Resources/iOS/Default-Landscape@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 29 KiB

Двоичные данные
Eventer/App_Resources/iOS/Default-Portrait.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 11 KiB

Двоичные данные
Eventer/App_Resources/iOS/Default-Portrait@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 30 KiB

Двоичные данные
Eventer/App_Resources/iOS/Default.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.8 KiB

Двоичные данные
Eventer/App_Resources/iOS/Default@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
Eventer/App_Resources/iOS/Icon-Small-50.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.6 KiB

Двоичные данные
Eventer/App_Resources/iOS/Icon-Small-50@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 5.3 KiB

Двоичные данные
Eventer/App_Resources/iOS/Icon-Small.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Двоичные данные
Eventer/App_Resources/iOS/Icon-Small@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.1 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-40.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.0 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-40@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.2 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-60.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.1 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-60@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.3 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-72.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.8 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-72@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 7.6 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-76.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon-76@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.0 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.0 KiB

Двоичные данные
Eventer/App_Resources/iOS/icon@2x.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.0 KiB

16
Eventer/Eventer.proj Normal file
Просмотреть файл

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>e50ed830-25a9-4993-98e2-feb7a250e80d</ProjectGuid>
<ProjectTypeGuids>{070BCB52-5A75-4F8C-A973-144AF0EAFCC9}</ProjectTypeGuids>
<AppIdentifier>com.telerik.Eventer</AppIdentifier>
<ProjectName>Eventer</ProjectName>
<IsRunnable>true</IsRunnable>
<FrameworkVersion>3.0.0</FrameworkVersion>
<AndroidPermissions>android.permission.CAMERA;android.permission.VIBRATE;android.permission.ACCESS_COARSE_LOCATION;android.permission.ACCESS_FINE_LOCATION;android.permission.ACCESS_LOCATION_EXTRA_COMMANDS;android.permission.READ_PHONE_STATE;android.permission.INTERNET;android.permission.RECEIVE_SMS;android.permission.RECORD_AUDIO;android.permission.MODIFY_AUDIO_SETTINGS;android.permission.READ_CONTACTS;android.permission.WRITE_CONTACTS;android.permission.WRITE_EXTERNAL_STORAGE;android.permission.ACCESS_NETWORK_STATE;android.permission.ACCOUNT_MANAGER;android.permission.GET_ACCOUNTS;android.permission.MANAGE_ACCOUNTS;android.permission.BROADCAST_STICKY</AndroidPermissions>
<CorePlugins>org.apache.cordova.AudioHandler;org.apache.cordova.battery-status;org.apache.cordova.camera;org.apache.cordova.console;org.apache.cordova.contacts;org.apache.cordova.device;org.apache.cordova.device-motion;org.apache.cordova.device-orientation;org.apache.cordova.dialogs;org.apache.cordova.file;org.apache.cordova.file-transfer;org.apache.cordova.geolocation;org.apache.cordova.globalization;org.apache.cordova.inappbrowser;org.apache.cordova.media-capture;org.apache.cordova.network-information;org.apache.cordova.splashscreen;org.apache.cordova.vibration</CorePlugins>
<DeviceOrientations>Portrait;Landscape</DeviceOrientations>
<iOSStatusBarStyle>Default</iOSStatusBarStyle>
<AndroidHardwareAcceleration>false</AndroidHardwareAcceleration>
</PropertyGroup> <Import Project="$(MSBuildExtensionsPath)\Telerik\ICE\Tools\Mobile\MobileTools.targets" />
</Project>

2122
Eventer/cordova.android.js Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу

1636
Eventer/cordova.ios.js Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу

44
Eventer/index.html Normal file
Просмотреть файл

@ -0,0 +1,44 @@
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script src="cordova.js"></script>
<script src="kendo/js/jquery.min.js"></script>
<script src="kendo/js/kendo.mobile.min.js"></script>
<script src="scripts/lib/everlive.all.min.js"></script>
<script src="scripts/app/identity-provider.js"></script>
<script src="scripts/app/main.js" type="text/javascript"></script>
<link href="kendo/styles/kendo.mobile.all.min.css" rel="stylesheet" />
<link href="styles/main.css" rel="stylesheet" />
</head>
<body id="friendsApp">
<section data-role="layout" data-id="default">
<!--View content will render here-->
</section>
<!--WELCOME VIEW -->
<div data-role="view" id="welcome" data-layout="default" class="welcome-scrn form-view" data-model="app.viewModels.login">
<h1><b>Everlive</b> sample application</h1>
<form id="login-form">
<ul data-role="listview" data-style="inset">
<li><label for="loginUsername">Username</label> <input type="text" id="loginUsername" required validationMessage="Username is required!" /></li>
<li><label for="loginPassword">Password</label> <input type="password" id="loginPassword" required validationMessage="Password is required!" /></li>
</ul>
</form>
<ol class="group-wrp">
<li>
<span data-role="touch" data-bind="events: { tap: login }" style="display: inline-block">
<a data-role="button" class="btn-login btn-big">Login</a>
</span>
<span data-role="touch" data-bind="events: { tap: loginWithFacebook }" style="display: inline-block">
<a data-role="button" class="btn-login-fb btn-big">Login</a>
</span>
</li>
<li class="b-top"><a data-role="button" href="views/signupView.html" class="btn-signup btn-big">Sign up</a> </li>
</ol>
<div data-role="footer"><p>Powered by Icenium Everlive.</p></div>
</div>
</body>
</html>

5
Eventer/kendo/js/jquery.min.js поставляемый Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

15
Eventer/kendo/js/kendo.mobile.min.js поставляемый Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Двоичные данные
Eventer/kendo/styles/images/KendoUI.ttf Normal file

Двоичный файл не отображается.

Двоичные данные
Eventer/kendo/styles/images/KendoUI.woff Normal file

Двоичный файл не отображается.

Двоичные данные
Eventer/kendo/styles/images/back.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 591 B

9
Eventer/kendo/styles/kendo.mobile.all.min.css поставляемый Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,54 @@
function getParameterByName(name, url) {
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = name + "=([^&#]*)";
//console.log("Parameter name: " + name);
//console.log("Url: " + url);
var regex = new RegExp(regexS);
var results = regex.exec(url);
//console.log("Result: " + results);
if (results == null) {
return false;
}
else {
return decodeURIComponent(results[1].replace(/\+/g, " "));
}
}
var IdentityProvider = function (config) {
var that = this;
this.getAccessToken = function(callback) {
// Begin Authorization
var authorize_url = config.endpoint
+ "?response_type=" + config.response_type
+ "&client_id=" + config.client_id
+ "&redirect_uri=" + config.redirect_uri
+ "&display=" + config.display
+ "&access_type=" + config.access_type
+ "&scope=" + config.scope
//CALL IN APP BROWSER WITH THE LINK
ref = window.open(authorize_url, '_blank', 'location=no');
ref.addEventListener('loadstart', function(event) {
that.locationChanged(event.url, callback);
});
ref.addEventListener('loadstop', function(event) {
that.locationChanged(event.url, callback);
});
}
this.locationChanged = function(loc, callback) {
if (loc.indexOf("access_token=") != -1) {
ref.close();
var token = getParameterByName("access_token", loc);
callback(token);
}
}
}

351
Eventer/scripts/app/main.js Normal file
Просмотреть файл

@ -0,0 +1,351 @@
var app = (function () {
'use strict';
// global error handling
var showAlert = function(message, title, callback) {
navigator.notification.alert(message, callback || function () {
}, title, 'OK');
};
var showError = function(message) {
showAlert(message, 'Error occured');
};
window.addEventListener('error', function (e) {
e.preventDefault();
var message = e.message + "' from " + e.filename + ":" + e.lineno;
showAlert(message, 'Error occured');
return true;
});
var onBackKeyDown = function(e) {
e.preventDefault();
navigator.notification.confirm('Do you really want to exit?', function (confirmed) {
var exit = function () {
navigator.app.exitApp();
};
if (confirmed === true || confirmed === 1) {
AppHelper.logout().then(exit, exit);
}
}, 'Exit', 'Ok,Cancel');
};
var onDeviceReady = function() {
//Handle document events
document.addEventListener("backbutton", onBackKeyDown, false);
};
document.addEventListener("deviceready", onDeviceReady, false);
var applicationSettings = {
emptyGuid: '00000000-0000-0000-0000-000000000000',
apiKey: 'wUQ7tB0s9C6BaH3Y',
scheme: 'http'
};
// initialize Everlive SDK
var el = new Everlive({
apiKey: applicationSettings.apiKey,
scheme: applicationSettings.scheme
});
var facebook = new IdentityProvider({
name: "Facebook",
loginMethodName: "loginWithFacebook",
endpoint: "https://www.facebook.com/dialog/oauth",
response_type:"token",
client_id: "622842524411586",
redirect_uri:"https://www.facebook.com/connect/login_success.html",
access_type:"online",
scope:"email",
display: "touch"
});
var AppHelper = {
resolveProfilePictureUrl: function (id) {
if (id && id !== applicationSettings.emptyGuid) {
return el.Files.getDownloadUrl(id);
}
else {
return 'styles/images/avatar.png';
}
},
resolvePictureUrl: function (id) {
if (id && id !== applicationSettings.emptyGuid) {
return el.Files.getDownloadUrl(id);
}
else {
return '';
}
},
formatDate: function (dateString) {
var date = new Date(dateString);
var year = date.getFullYear().toString();
var month = date.getMonth().toString();
var day = date.getDate().toString();
return day + '.' + month + '.' + year;
},
logout: function () {
return el.Users.logout();
}
};
var mobileApp = new kendo.mobile.Application(document.body, { transition: 'slide', layout: 'mobile-tabstrip' });
var usersModel = (function () {
var currentUser = kendo.observable({ data: null });
var usersData;
var loadUsers = function () {
return el.Users.currentUser()
.then(function (data) {
var currentUserData = data.result;
currentUserData.PictureUrl = AppHelper.resolveProfilePictureUrl(currentUserData.Picture);
currentUser.set('data', currentUserData);
return el.Users.get();
})
.then(function (data) {
usersData = new kendo.data.ObservableArray(data.result);
})
.then(null,
function (err) {
showError(err.message);
}
);
};
return {
load: loadUsers,
users: function () {
return usersData;
},
currentUser: currentUser
};
}());
// login view model
var loginViewModel = (function () {
var login = function () {
var username = $('#loginUsername').val();
var password = $('#loginPassword').val();
el.Users.login(username, password)
.then(function () {
return usersModel.load();
})
.then(function () {
mobileApp.navigate('views/activitiesView.html');
})
.then(null,
function (err) {
showError(err.message);
}
);
};
var loginWithFacebook = function() {
mobileApp.showLoading();
facebook.getAccessToken(function(token) {
el.Users.loginWithFacebook(token)
.then(function () {
return usersModel.load();
})
.then(function () {
mobileApp.hideLoading();
mobileApp.navigate('views/activitiesView.html');
})
.then(null, function (err) {
mobileApp.hideLoading();
if (err.code = 214) {
showError("The specified identity provider is not enabled in the backend portal.");
}
else {
showError(err.message);
}
});
})
}
return {
login: login,
loginWithFacebook: loginWithFacebook
};
}());
// signup view model
var singupViewModel = (function () {
var dataSource;
var signup = function () {
dataSource.Gender = parseInt(dataSource.Gender);
var birthDate = new Date(dataSource.BirthDate);
if (birthDate.toJSON() === null)
birthDate = new Date();
dataSource.BirthDate = birthDate;
Everlive.$.Users.register(
dataSource.Username,
dataSource.Password,
dataSource)
.then(function () {
showAlert("Registration successful");
mobileApp.navigate('#welcome');
},
function (err) {
showError(err.message);
}
);
};
var show = function () {
dataSource = kendo.observable({
Username: '',
Password: '',
DisplayName: '',
Email: '',
Gender: '1',
About: '',
Friends: [],
BirthDate: new Date()
});
kendo.bind($('#signup-form'), dataSource, kendo.mobile.ui);
};
return {
show: show,
signup: signup
};
}());
var activitiesModel = (function () {
var activityModel = {
id: 'Id',
fields: {
Text: {
field: 'Text',
defaultValue: ''
},
CreatedAt: {
field: 'CreatedAt',
defaultValue: new Date()
},
Picture: {
fields: 'Picture',
defaultValue: ''
},
UserId: {
field: 'UserId',
defaultValue: ''
},
Likes: {
field: 'Likes',
defaultValue: []
}
},
CreatedAtFormatted: function () {
return AppHelper.formatDate(this.get('CreatedAt'));
},
PictureUrl: function () {
return AppHelper.resolvePictureUrl(this.get('Picture'));
},
User: function () {
var userId = this.get('UserId');
var user = $.grep(usersModel.users(), function (e) {
return e.Id === userId;
})[0];
return user ? {
DisplayName: user.DisplayName,
PictureUrl: AppHelper.resolveProfilePictureUrl(user.Picture)
} : {
DisplayName: 'Anonymous',
PictureUrl: AppHelper.resolveProfilePictureUrl()
};
}
};
var activitiesDataSource = new kendo.data.DataSource({
type: 'everlive',
schema: {
model: activityModel
},
transport: {
// required by Everlive
typeName: 'Activities'
},
change: function (e) {
if (e.items && e.items.length > 0) {
$('#no-activities-span').hide();
}
else {
$('#no-activities-span').show();
}
},
sort: { field: 'CreatedAt', dir: 'desc' }
});
return {
activities: activitiesDataSource
};
}());
// activities view model
var activitiesViewModel = (function () {
var activitySelected = function (e) {
mobileApp.navigate('views/activityView.html?uid=' + e.data.uid);
};
var navigateHome = function () {
mobileApp.navigate('#welcome');
};
var logout = function () {
AppHelper.logout()
.then(navigateHome, function (err) {
showError(err.message);
navigateHome();
});
};
return {
activities: activitiesModel.activities,
activitySelected: activitySelected,
logout: logout
};
}());
// activity details view model
var activityViewModel = (function () {
return {
show: function (e) {
var activity = activitiesModel.activities.getByUid(e.view.params.uid);
kendo.bind(e.view.element, activity, kendo.mobile.ui);
}
};
}());
// add activity view model
var addActivityViewModel = (function () {
var $newStatus;
var validator;
var init = function () {
validator = $('#enterStatus').kendoValidator().data("kendoValidator");
$newStatus = $('#newStatus');
};
var show = function () {
$newStatus.val('');
validator.hideMessages();
};
var saveActivity = function () {
if (validator.validate()) {
var activities = activitiesModel.activities;
var activity = activities.add();
activity.Text = $newStatus.val();
activity.UserId = usersModel.currentUser.get('data').Id;
activities.one('sync', function () {
mobileApp.navigate('#:back');
});
activities.sync();
}
};
return {
init: init,
show: show,
me: usersModel.currentUser,
saveActivity: saveActivity
};
}());
return {
viewModels: {
login: loginViewModel,
signup: singupViewModel,
activities: activitiesViewModel,
activity: activityViewModel,
addActivity: addActivityViewModel
}
};
}());

45
Eventer/scripts/lib/everlive.all.min.js поставляемый Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Двоичные данные
Eventer/styles/images/app-bg.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 49 KiB

Двоичные данные
Eventer/styles/images/avatar.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.7 KiB

Двоичные данные
Eventer/styles/images/border.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 933 B

Двоичные данные
Eventer/styles/images/sprite.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 18 KiB

629
Eventer/styles/main.css Normal file
Просмотреть файл

@ -0,0 +1,629 @@
#friendsApp.km-android .km-view
{
-moz-box-orient:vertical;
-webkit-box-orient:vertical;
box-orient:vertical;
-webkit-flex-direction:column;
-ms-flex-direction:column;
flex-direction:column;
}
#friendsApp.km-ios, #friendsApp.km-android, #friendsApp.km-ios .km-list > li
{
font-weight: normal;
}
#friendsApp.km-ios .km-listinset, #friendsApp.km-ios .km-listgroupinset .km-list
{
border: 0;
}
#friendsApp.km-ios, #friendsApp.km-ios .km-content, #friendsApp.km-android, #friendsApp.km-android .km-content
{
background-image: url(images/app-bg.jpg);
background-repeat: no-repeat;
background-size: cover;
background-color: #4b2113;
}
#friendsApp.km-ios .form-view .km-listinset, #friendsApp.km-android .form-view .km-listinset
{
-webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.5);
}
#friendsApp.km-android .km-listview-link::after, #friendsApp.km-android .km-listview-label::after
{
display: block;
border-color: rgba(255,255,255,.5);
}
.b-top
{
background: transparent url(images/border.png) repeat-x 0 0;
}
.b-bottom
{
background: transparent url(images/border.png) repeat-x 0 100%;
}
.b-top, .b-bottom
{
background-repeat: repeat-x;
background-color: transparent;
}
/* Buttons */
#friendsApp.km-android .km-leftitem
{
left: 0;
}
#friendsApp.km-android .km-rightitem
{
right: 0;
}
#friendsApp.km-ios .km-button, #friendsApp.km-android .km-button
{
background-color: #ff6c00;
}
#friendsApp.km-ios .km-button, #friendsApp.km-ios .km-back::before
{
-webkit-box-shadow: none;
box-shadow: none;
border: 0;
}
#friendsApp.km-ios .km-back, #friendsApp.km-android .km-back
{
background-color: #a36a57;
}
#friendsApp.km-ios .km-back
{
border-top: 0;
}
#friendsApp.km-ios .km-back::before
{
left: -0.34em;
top: .18em;
height: .92em;
border-bottom-color: #6e5852;
}
#friendsApp.km-android .km-button
{
color: #fff;
}
#friendsApp.km-android .km-navbar .km-button
{
height: 1.6em;
}
.km-button.btn-big
{
padding: .5em .5em;
font-size: 1.2em;
font-weight: normal;
}
.km-button.btn-big
{
min-width: 7em;
}
#friendsApp.km-ios .welcome-scrn .btn-signup, #friendsApp.km-android .welcome-scrn .btn-signup
{
background-color: #272727;
}
.btn-login::before, .btn-signup::before, .btn-login-fb::before
{
display: block;
content: " ";
width: 1em;
height: 1em;
position: absolute;
top: .6em;
background-image: url(images/sprite.png);
background-repeat: no-repeat;
background-size: 3em auto;
background-color: transparent;
background-position: -100px -100px;
}
.btn-login::before
{
background-position: 0 -3em;
}
.btn-login-fb::before
{
background-position: 0 -13.9em;
}
.btn-signup::before
{
background-position: 0 -4.3em;
}
.btn-login-fb{
background-color:#165396 !important;
}
.sngl-btn-wrp
{
margin: 2em 1em;
text-align: center;
}
/*App Header*/
#friendsApp.km-ios .km-navbar
{
background-image: none;
background-color: rgba(0,0,0,0.2);
border-bottom: 1px solid #a78675;
}
#friendsApp.km-ios .km-view-title
{
font-weight: normal;
box-shadow: none;
-webkit-box-shadow: none;
}
#friendsApp.km-android .km-view-title
{
display: block;
visibility: visible;
margin: 0;
padding: .5em 1em;
font-size: 1.4rem;
font-weight: normal;
background-color: #222;
border-bottom: 2px solid #fe8a3d;
line-height: 1.2;
}
.km-root #friendsApp.km-android .km-navbar
{
padding-right: 0;
padding-left: 0;
}
#friendsApp.km-android .km-navbar .km-icon
{
margin-left: 0;
margin-right: 0;
}
#friendsApp.km-android .km-navbar
{
background-color: #272727;
}
#friendsApp.km-android .km-rightitem .km-button
{
background-color: #e45600;
padding-left: 1.2rem;
padding-right: 1.2rem;
}
/* App Footer */
.welcome-scrn .km-footer
{
padding: 1.1em 0;
text-align: center;
color: #999;
}
#friendsApp.km-ios .welcome-scrn .km-footer
{
background-color: rgba(0,0,0,0.2);
}
#friendsApp.km-android .welcome-scrn .km-footer
{
position: absolute;
bottom: 0;
background-color: #272727;
}
/* Forms */
#friendsApp.km-android .form-view .km-list > li
{
padding: 0;
}
.form-view .km-listview label
{
padding: .5rem 1rem;
display: inline-block;
vertical-align: top;
width: 40%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
font-size: 1.1rem;
}
#friendsApp.km-ios .form-view .km-listview label
{
background-color: #F4F4F4;
border-right: 1px solid #e0dfdf;
font-weight: bold;
}
#friendsApp.km-android .form-view .km-listview label
{
background-color: #323232;
border-right: 1px solid #404040;
}
.form-view .km-listview .txtarea-wrp label
{
height: 7rem;
}
#friendsApp.km-ios .form-view .km-listview input
{
}
.km-list .txtarea-wrp
{
height: 7rem;
}
textarea
{
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
line-height: normal;
font-family: inherit;
outline: 0;
border: 0;
font-size: 1.1rem;
padding: .6em;
}
.share-view textarea
{
width: 100%;
height: 8rem;
font-size: 1rem;
}
.km-list textarea
{
right: 0;
top: 0;
height: 6.5rem;
position: absolute;
z-index: 1;
background: transparent;
overflow: auto;
}
#friendsApp .km-list textarea
{
margin-right: 0;
}
.km-list input[type="password"], .km-list input[type="search"], .km-list input[type="number"], .km-list input[type="tel"], .km-list input[type="url"], .km-list input[type="email"], .km-list input[type="text"]:not(.k-input), .km-list input[type="month"], .km-list input[type="color"], .km-list input[type="week"], .km-list input[type="date"], .km-list input[type="time"], .km-list input[type="datetime"], .km-list select:not([multiple]), .km-list .k-dropdown, .km-list textarea
{
width: 56%;
}
#friendsApp.km-ios .km-list input:not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="checkbox"]):not([type="radio"]):not(.k-input):not(.k-button), #friendsApp.km-ios .km-list select:not([multiple]), #friendsApp.km-ios .km-list .k-dropdown-wrap, #friendsApp.km-ios .km-list textarea
{
color: #666;
}
#friendsApp.km-android .km-list input:not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="checkbox"]):not([type="radio"]):not(.k-input):not(.k-button), #friendsApp.km-android .km-list select:not([multiple]), #friendsApp.km-android .km-list .k-dropdown-wrap, #friendsApp.km-android textarea
{
color: #ccc;
background-image: none;
border-bottom: 0;
}
.validation, .k-invalid-msg
{
display: none;
margin: 1rem 0 0;
padding: 0 1rem;
color: #f00;
}
.share-form-wrp, .user-status-wrp, .take-avatar-wrp
{
margin: 1rem;
}
/* List widget */
.no-items-msg
{
margin: 1.5rem !important;
font-size: 1rem;
color: #ffc;
}
.no-items-msg b
{
font-size: 1.2rem;
font-weight: normal;
}
#friendsApp.km-ios .km-listinset, #friendsApp.km-ios .km-listgroupinset .km-list,
#friendsApp.km-ios .km-listinset > li:first-child, #friendsApp.km-ios .km-listgroupinset .km-list > li:first-child,
#friendsApp.km-ios .km-listinset > li:last-child, #friendsApp.km-ios .km-listgroupinset .km-list > li:last-child
{
border-radius: 0;
}
#friendsApp.km-ios .form-view .km-list > li
{
padding: 0;
background-color: #fff;
}
#friendsApp.km-ios .form-view .km-list > li
{
min-height: 2.3em;
}
#friendsApp.km-android .form-view .km-list
{
background-color: #222;
}
#friendsApp.km-android .form-view .km-listinset
{
margin-top: 1em;
}
/* Welcome screen */
.welcome-scrn h1
{
position: relative;
margin: 4em 2em 1.5em;
margin-left: 1em;
margin-right:1em;
color: #fff;
text-align: right;
line-height: .9;
font-size: 1.5em;
font-weight: normal;
color: #e6e6e6;
}
.welcome-scrn h1 b
{
display: block;
font-size: 3em;
text-shadow: 1px 2px 3px #000;
color: #fff;
}
.welcome-scrn h1 b::before
{
display: block;
content: " ";
width: 1.1em;
height: 1em;
position: absolute;
top: -.8em;
right: .3em;
background-image: url(images/sprite.png);
background-repeat: no-repeat;
background-position: 0 0;
background-size: cover;
background-color: transparent;
}
.welcome-scrn .group-wrp
{
margin: 1.5em 2em 0;
padding: 0;
list-style-type: none;
text-align: center;
}
.welcome-scrn .group-wrp li
{
margin: 1.5em 0 0;
padding: 1.5em 0 0;
}
.welcome-scrn .group-wrp li:first-child
{
margin-top: 0;
padding-top: 0;
}
/* Activities */
.activities-view .km-list
{
margin: 1rem;
background-color: transparent;
}
.activities-view .km-list.comments-list
{
margin-top: 0;
}
#friendsApp .activities-view .km-list > li
{
margin-bottom: .2em;
padding: 1rem 0;
border-bottom: 0;
background: transparent url(images/border.png) repeat-x 0 0;
box-shadow: none;
-webkit-box-shadow: none;
}
.activities-view .km-list.comments-list > li
{
padding-bottom: 1rem;
}
.activities-view .km-list > li:first-child
{
padding-top: 0;
background-image: none;
}
#friendsApp.km-ios .activities-view .km-list > li
{
border: 0;
}
#friendsApp.km-android .activities-view .km-list > li
{
}
.activities-view .km-list > li >img, .user-status-wrp img
{
float: left;
}
.user-info
{
padding: 1rem;
border-bottom: 1px solid #ccc;
line-height: 1.1 !important;
background-color: #fff;
font-size: 1rem;
}
.user-status-wrp .user-info, .share-form-wrp .user-info
{
padding: 0;
height: 5rem;
}
.user-status-wrp .user-info h2, .share-form-wrp .user-info h2
{
padding-top: 1.7rem;
}
.user-info h2
{
margin: 0;
padding: 0;
font-size: 1.3rem;
color: #000;
}
.user-info h2 a
{
color: #000 !important;
}
.user-info img
{
float: left;
margin-right: 1rem;
background-color: #ccc;
width: 5rem;
height: 5rem;
}
.user-info time
{
font-size: .8rem;
color: #7f7f7f;
}
.user-share
{
padding: 1rem;
background-color: #fff;
clear: both;
color: #000 !important;
font-size: 1rem;
line-height: 1.4;
-webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.5);
}
.share-view .user-share
{
margin-bottom: 1rem;
padding: 0 0 .5rem;
}
#friendsApp.km-android .activities-view .user-share-txt
{
font-size: 1rem;
color: #000 !important;
}
#friendsApp.km-ios .km-detail
{
display: none;
}
/* Tablets*/
.km-tablet .km-header
{
font-size: 1.2em;
}
.km-tablet .km-button.btn-big
{
min-width: 10em;
font-size: 2.5em;
}
.km-tablet .welcome-scrn .group-wrp
{
padding-top: 2.5em;
padding-bottom: 2.5em;
}
.km-tablet .form-view .km-listview label
{
padding: 1rem 1.5rem;
font-size: 1.5rem;
}
.km-tablet .km-ios .km-list input:not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="checkbox"]):not([type="radio"]):not(.k-input):not(.k-button), .km-tablet .km-ios .km-list select:not([multiple]), .km-tablet .km-ios .km-list .k-dropdown-wrap,
.km-tablet.km-root input:not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="checkbox"]):not([type="radio"]):not(.k-input):not(.k-button), .km-tablet.km-root select:not([multiple]), .km-tablet.km-root .k-dropdown,
.km-tablet textarea
{
font-size: 1.5rem;
}
.km-tablet .km-listinset
{
margin: 2em;
}
.km-tablet .main-menu-view .km-list > li
{
font-size: 1.5rem;
}
.km-tablet .profile-view h2, .km-tablet .activities-view h3
{
margin-left: 2rem;
margin-right: 2rem;
margin-bottom: -1rem;
font-size: 1.5rem;
}
.km-tablet .km-ios .km-list.profile-about-txt > li, .km-tablet .km-android .km-list.profile-about-txt > li
{
padding: .5rem 1rem;
font-size: 1.4rem;
}
.km-tablet .no-items-msg
{
margin: 2.5rem !important;
font-size: 1.5rem;
}
.km-tablet .no-items-msg b
{
font-size: 2rem;
}
.km-tablet .user-info h2
{
font-size: 1.7rem;
}
.km-tablet .user-info time
{
font-size: .95rem;
}
.km-tablet .user-share
{
padding: 2rem;
font-size: 1.4rem;
}
.km-tablet .share-view textarea
{
padding: 0;
}
.km-tablet .social-info a
{
font-size: 1.1rem;
}
.km-tablet .activities-view .km-list, .km-tablet .share-form-wrp, .km-tablet .user-status-wrp
{
margin: 2rem;
}
/* Android*/
.km-tablet .km-android .activities-view .user-share-txt
{
font-size: 1.4rem;
}
.km-tablet .km-android .welcome-scrn h1
{
font-size: 3em;
}
.km-tablet #friendsApp.km-android .km-navbar .km-button
{
height: 1.4em;
}
/* iPad */
.km-tablet #friendsApp.km-ios .km-view-title
{
box-shadow: none;
-webkit-box-shadow: none;
text-shadow: none;
color: #fff;
}
.km-tablet .km-ios .km-content
{
background-color: transparent;
}
.km-tablet .km-ios :not(.km-tabstrip):not(.km-buttongroup) > .km-button
{
background-color: #ff6c00;
}
.km-tablet .km-ios :not(.km-tabstrip):not(.km-buttongroup) > .km-button.btn-signup
{
background-color: #272727;
}
.km-tablet .km-ios :not(.km-tabstrip):not(.km-buttongroup) > .km-button.km-back
{
background-color: #A36A57;
}
.km-tablet .km-ios .welcome-scrn h1
{
font-size: 3.5em;
}
.km-tablet .km-ios .profile-avatar-name h1
{
margin-top: 2rem;
font-size: 1.7em;
width: auto;
}
.km-tablet .km-ios .profile-view .km-list.def-list .lbl, .km-tablet .km-ios .profile-view .km-list.def-list .val
{
font-size: 1.4em;
}

Просмотреть файл

@ -0,0 +1,28 @@
<div data-role="view" id="view-all-activities" data-layout="default" class="activities-view" data-model="app.viewModels.activities">
<header data-role="header">
<div data-role="navbar">
Activities
<a class="nav-button" data-align="left" data-role="backbutton" data-click="app.viewModels.activities.logout">Log out</a>
<a class="nav-button" data-align="right" data-role="button" data-icon="add" href="views/addActivityView.html"></a>
</div>
</header>
<ul id="activities-listview" data-style="inset" data-role="listview" data-template="activityTemplate"
data-bind="source: activities"></ul>
<p id="no-activities-span" hidden="hidden" class="no-items-msg">
<b>You have no posts yet.</b><br /><br />Tap on the plus sign and share what's on your mind.
</p>
</div>
<!-- Activities ListView Template -->
<script type="text/x-kendo-template" id="activityTemplate">
<div data-role="touch" data-bind="events: { tap: activitySelected }">
<div class="user-info">
<h2>${User().DisplayName}</h2>
<time class="timeSpan">${CreatedAtFormatted()}</time>
</div>
<div class="user-share">
<a class="user-share-txt">${Text}</a>
</div>
</div>
</script>

Просмотреть файл

@ -0,0 +1,20 @@
<div data-role="view" id="single-activity" data-layout="default" class="activities-view" data-show="app.viewModels.activity.show">
<header data-role="header">
<div data-role="navbar">
Activity
<a class="nav-button" data-align="left" data-role="backbutton">Back</a>
</div>
</header>
<div id="status-container" class="user-status-wrp" data-role="listview" data-style="inset">
<div class="user-info">
<img data-bind="attr:{src: User().PictureUrl}" alt="styles/images/avatar.png" />
<h2 id="personName" data-bind='text: User().DisplayName'></h2>
<time id="activityDate" data-bind="text: CreatedAtFormatted"></time>
</div>
<img id="picture" data-bind="attr:{src: PictureUrl()}" width="100%"/>
<div class="user-share">
<span id="activityText" data-bind="text: Text" class="user-share-txt"></span>
</div>
</div>
</div>

Просмотреть файл

@ -0,0 +1,20 @@
<div data-role="view" id="share" data-layout="default" data-transition="overlay:down" class="share-view"
data-init="app.viewModels.addActivity.init" data-show="app.viewModels.addActivity.show" data-model="app.viewModels.addActivity">
<header data-role="header">
<div data-role="navbar">
Activity
<a class="nav-button" data-align="left" data-role="backbutton">Cancel</a>
<a class="nav-button" data-align="right" data-role="button" data-bind="click: saveActivity">Post</a>
</div>
</header>
<div id="enterStatus" class="share-form-wrp">
<div class="user-info">
<img data-bind="attr:{src: me.get('data').PictureUrl}" alt="styles/images/avatar.png" />
<h2 data-bind="text: me.get('data').DisplayName">Me</h2>
</div>
<div class="user-share">
<textarea id="newStatus" placeholder="What's on your mind?" required validationMessage="Comment text is required!"></textarea>
<div id="newCommentValidation" class="validation">Comment text is required!</div>
</div>
</div>
</div>

Просмотреть файл

@ -0,0 +1,45 @@
<div data-role="view" id="signup" data-layout="default" class="form-view" data-model="app.viewModels.signup" data-show="app.viewModels.signup.show">
<header data-role="header">
<div data-role="navbar">
Sign up
<a class="nav-button" data-align="left" data-role="backbutton" href="#welcome">Back</a>
</div>
</header>
<form>
<ul id="signup-form" data-role="listview" data-style="inset">
<li>
<label for="signupName">Name</label>
<input type="text" id="signupName" data-bind="value: DisplayName"/>
</li>
<li>
<label for="signupEmail">Email</label>
<input type="email" id="signupEmail" data-bind="value: Email"/>
</li>
<li>
<label for="signupUsername">Username</label>
<input type="text" id="signupUsername" data-bind="value: Username"/>
</li>
<li>
<label for="signupPassword">Password</label>
<input type="password" id="signupPassword" data-bind="value: Password"/>
</li>
<li>
<label for="signupBirthDatePicker">Birth date</label>
<input type="date" id="signupBirthDatePicker" data-bind="value: BirthDate"/>
</li>
<li>
<label for="signupGenderPicker">Gender</label>
<select id='signupGenderPicker' data-bind="value: Gender">
<option value="1">Male</option>
<option value="2">Female</option>
</select>
</li>
<li class="txtarea-wrp">
<label for="signupInfo">About</label> <textarea id="signupInfo" data-bind="value: About">User account created from the hybrid app.</textarea>
</li>
</ul>
</form>
<div class="sngl-btn-wrp">
<a class="btn-signup btn-big" data-role="button" data-bind="click: signup">Register</a>
</div>
</div>