Initial Commit

This commit is contained in:
Fergal Moran
2013-11-11 12:24:25 +00:00
commit 8ac083a923
2817 changed files with 488501 additions and 0 deletions

495
.sencha/app/build-impl.xml Normal file
View File

@@ -0,0 +1,495 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
********************************** DO NOT EDIT **********************************
This file will be replaced during upgrades so DO NOT EDIT this file. If you need to
adjust the process, reading and understanding this file is the first step.
In most cases, the adjustments can be achieved by setting properties or providing one
of the "hooks" in the form of a "-before-" or "-after-" target. Whenever possible, look
for one of these solutions.
Failing that, you can copy whole targets to your build.xml file and it will overrride
the target provided here. Doing that can create problems for upgrading to newer
versions of Cmd so it is not recommended but it will be easier to manage than editing
this file in most cases.
-->
<project name="app-build-impl">
<!--
===============================================================
helper targets for ant integrations with IDE's
(human readable target names)
===============================================================
-->
<target name="-before-build-testing"/>
<target name="-build-testing" depends="testing,build"/>
<target name="-after-build-testing"/>
<target name="build-testing"
depends="-before-build-testing,
-build-testing,
-after-build-testing"/>
<target name="Build - Testing"
description="Create a Testing build of this project"
depends="build-testing"/>
<target name="-before-build-production"/>
<target name="-build-production" depends="production,build"/>
<target name="-after-build-production"/>
<target name="build-production"
depends="-before-build-production,
-build-production,
-after-build-production"/>
<target name="Build - Production"
description="Create a Production build of this project"
depends="build-production"/>
<target name="-before-build-native"/>
<target name="-build-native" depends="native,build"/>
<target name="-after-build-native"/>
<target name="build-native"
depends="-before-build-native,
-build-native,
-after-build-native"/>
<target name="Build - Native"
description="Create a Native build of this project"
depends="build-native"/>
<target name="-before-start-local-webserver"/>
<target name="-start-local-webserver" depends="init">
<x-launch-terminal>
<![CDATA[
${cmd.dir}/sencha fs web -port=${build.web.port} start -map=${build.web.root}
]]>
</x-launch-terminal>
</target>
<target name="-after-start-local-webserver"/>
<target name="start-local-webserver"
depends="-before-start-local-webserver,
-start-local-webserver,
-after-start-local-webserver"/>
<target name="WebServer - Start Local"
description="Starts a local webserver for this project"
depends="start-local-webserver"/>
<target name="-before-compass-watch"/>
<target name="-compass-watch" depends="init">
<x-launch-terminal>
compass watch ${app.sass.dir}
</x-launch-terminal>
</target>
<target name="-after-compass-watch"/>
<target name="compass-watch"
depends="-before-compass-watch,
-compass-watch,
-after-compass-watch"/>
<target name="Compass - Watch"
description="Opens terminal and watches for SASS updates"
depends="compass-watch"/>
<!--
===============================================================
environment setters
===============================================================
-->
<target name="production"
description="Sets the build environment to production.">
<property name="build.environment" value="production"/>
</target>
<target name="testing"
description="Sets the build environment to testing.">
<property name="build.environment" value="testing"/>
</target>
<target name="native"
description="Sets the build environment to native.">
<property name="build.environment" value="native"/>
</target>
<target name="package"
description="Sets the build environment to package.">
<property name="build.environment" value="package"/>
</target>
<!--
===============================================================
Find Cmd
uses targets from find-cmd-impl.xml to detect the current
install of Sencha Cmd
===============================================================
-->
<import file="${basedir}/.sencha/app/find-cmd-impl.xml"/>
<target name="init-cmd"
depends="find-cmd-in-path,
find-cmd-in-environment,
find-cmd-in-shell">
<echo>Using Sencha Cmd from ${cmd.dir} for ${ant.file}</echo>
<!--
load the sencha.jar ant task definitions.
NOTE: the 'loaderref' attribute stores this task def's class loader
on the project by that name, so it will be sharable across sub-projects.
This fixes out-of-memory issues, as well as increases performance.
To supoprt this, it is recommended that any customizations that use
'ant' or 'antcall' tasks set 'inheritrefs=true' on those tasks, in order
to propagate the senchaloader reference to those subprojects.
The sencha 'x-ant-call' task, which extends 'antcall' and defaults
'inheritrefs' to true, may be used in place of antcall in
build process customizations.
-->
<taskdef resource="com/sencha/ant/antlib.xml"
classpath="${cmd.dir}/sencha.jar"
loaderref="senchaloader"/>
<!--
Some operations require sencha.jar in the current java classpath,
so this will extend the java.lang.Thread#contextClassLoader with the
specified java classpath entries
-->
<x-extend-classpath>
<jar path="${cmd.dir}/sencha.jar"/>
</x-extend-classpath>
</target>
<!--
===============================================================
Init
uses targets from init-impl.xml to load Sencha Cmd config
system properties and ant task definitions
===============================================================
-->
<import file="${basedir}/.sencha/app/init-impl.xml"/>
<target name="init"
depends="init-local,
init-cmd,
-before-init,
-init,
-after-init,
-before-init-defaults,
-init-defaults,
-after-init-defaults,
-init-compiler"/>
<!--
===============================================================
Build
this is the starting point for the build process. The 'depends'
attribute on the -build target controls the ordering of the
different build phases
===============================================================
-->
<target name="-before-build"/>
<target name="-build"
depends="refresh,
resolve,
js,
copy-resources,
sass,
slice,
page,
native-package"/>
<target name="-after-build"/>
<target name="build"
depends="init,-before-build,-build,-after-build"
description="Builds the application"/>
<!--
===============================================================
Clean
removes all artifacts from the output build directories
===============================================================
-->
<target name="-before-clean"/>
<target name="-clean">
<delete dir="${build.dir}"/>
<delete dir="${build.temp.dir}"/>
</target>
<target name="-after-clean"/>
<target name="clean"
depends="init"
description="Removes all build output produced by the 'build' target">
<x-ant-call unless="skip.clean">
<target name="-before-clean"/>
<target name="-clean"/>
<target name="-after-clean"/>
</x-ant-call>
</target>
<!--
===============================================================
Watch
uses targets from watch-impl.xml to initiate the application
watch process using instrumented state from the compiler
===============================================================
-->
<import file="${basedir}/.sencha/app/watch-impl.xml"/>
<target name="watch">
<property name="build.optimize" value=""/>
<x-ant-call>
<target name="-before-watch"/>
<target name="-watch"/>
<target name="-after-watch"/>
</x-ant-call>
</target>
<!--
===============================================================
JS
uses targets from js-impl.xml to produce the output js files
containing needed application and framework js classes
===============================================================
-->
<import file="${basedir}/.sencha/app/js-impl.xml"/>
<target name="js"
depends="init"
description="Builds the output javascript file(s)">
<x-ant-call unless="skip.js">
<target name="-before-js"/>
<target name="-js"/>
<target name="-after-js"/>
</x-ant-call>
</target>
<!--
===============================================================
Sass
uses targets from sass-impl.xml to produce the output css
files for the application's styling
===============================================================
-->
<import file="${basedir}/.sencha/app/sass-impl.xml"/>
<target name="sass"
depends="init"
description="Builds the Sass files using Compass.">
<x-ant-call unless="skip.sass">
<target name="-before-sass"/>
<target name="-sass"/>
<target name="-after-sass"/>
</x-ant-call>
</target>
<!--
===============================================================
Resources
uses targets from resources-impl.xml to copy resources from
the application and required packages to the output directory
===============================================================
-->
<import file="${basedir}/.sencha/app/resources-impl.xml"/>
<target name="copy-resources"
depends="init"
description="Copy resources to build folder.">
<x-ant-call unless="skip.resources">
<target name="-before-inherit-resources"/>
<target name="-before-copy-resources"/>
<target name="-compile-resources"/>
<target name="-after-copy-resources"/>
<target name="-after-inherit-resources"/>
</x-ant-call>
</target>
<!--
===============================================================
Slice
uses targets from slice-impl.xml to extract theme images from
the application for use with older browsers that don't
support modern css features
===============================================================
-->
<import file="${basedir}/.sencha/app/slice-impl.xml"/>
<target name="slice"
depends="init"
description="Slices CSS3 theme to produce non-CSS3 images and sprites.">
<x-ant-call unless="skip.slice">
<target name="-before-slice"/>
<target name="-slice"/>
<target name="-after-slice"/>
</x-ant-call>
</target>
<!--
Theme - this is a legacy support target for extjs 4.1 apps. It redirects
to the "slice" ant target
-->
<target name="theme"
depends="init"
description="Builds the application's theme(s) images using the slicer (Ext JS 4.1 only).">
<x-ant-call unless="skip.theme">
<target name="-before-theme"/>
<target name="slice"/>
<target name="-after-theme"/>
</x-ant-call>
</target>
<!--
Refresh Theme - uses targets from refresh-impl.xml to rebuild the current
theme
-->
<target name="refresh-theme"
depends="init"
description="Rebuilds the currently enabled app theme (Ext JS 4.1 only).">
<x-ant-call unless="skip.theme">
<target name="-before-refresh-theme"/>
<target name="-refresh-theme"/>
<target name="-after-refresh-theme"/>
</x-ant-call>
</target>
<!--
===============================================================
Refresh
uses targets from refresh-impl.xml to generate bootstrapping
information for the application
===============================================================
-->
<import file="${basedir}/.sencha/app/refresh-impl.xml"/>
<target name="refresh"
depends="init"
description="Refreshes the application bootstrap data.">
<x-ant-call unless="skip.refresh">
<target name="-before-refresh"/>
<target name="-refresh"/>
<target name="-after-refresh"/>
</x-ant-call>
</target>
<!--
===============================================================
Page
uses targets from page-impl.xml to generate the output markup
file and associated microloader / app manifest
===============================================================
-->
<import file="${basedir}/.sencha/app/page-impl.xml"/>
<target name="page"
depends="init"
description="Builds the application's HTML page.">
<x-ant-call unless="skip.page">
<target name="-before-page"/>
<target name="-page"/>
<target name="-after-page"/>
</x-ant-call>
</target>
<!--
===============================================================
Resolve
uses targets from resolve-impl.xml to detect dynamic app
dependencies using phantomjs
===============================================================
-->
<import file="${basedir}/.sencha/app/resolve-impl.xml"/>
<target name="resolve"
depends="init"
description="Resolve application dependencies dynamically.">
<x-ant-call unless="skip.resolve">
<target name="-before-resolve"/>
<target name="-resolve"/>
<target name="-after-resolve"/>
</x-ant-call>
</target>
<!--
===============================================================
Native Package
uses targets from packager-impl.xml to run native packager
applications to produce stand-alone installable web apps from
this built Cmd application
===============================================================
-->
<import file="${basedir}/.sencha/app/packager-impl.xml"/>
<target name="native-package"
depends="init"
description="Builds native packages of the application">
<x-ant-call unless="skip.native-package">
<target name="-before-native-package"/>
<target name="-native-package"/>
<target name="-after-native-package"/>
</x-ant-call>
</target>
<!--
===============================================================
Help - properties
displays all current ant properties
===============================================================
-->
<target name=".props" depends="init"
description="Lists all properties defined for the build">
<echoproperties/>
</target>
<!--
===============================================================
Help - docs
displays the help message
===============================================================
-->
<target name=".help" depends="init"
description="Provides help on the build script">
<x-get-project-targets property="help.message"/>
<echo><![CDATA[${help.message}
This is the main build script for your application.
The following properties can be used to disable certain steps in the build
process.
* skip.page Do not build the HTML page.
* skip.js Do not build the output js code file(s)
* skip.resources Do not copy resources to the build directory
* skip.sass Do not build the SASS.
* skip.slice Do not build the theme image slicer.
* skip.theme Do not build the theme images.
The following properties can be used to modify the build process.
* build.compression.yui Specify yui compression for the build
* build.compression.closure Specify closure compression for the build
* build.compression.uglify Specify uglify compression for the build
* build.options Set general options for the build
(eg: enable a debug build)
To modify any of the previous build specific options, see:
${basedir}/.sencha/app/${build.environment}.properties
* build.operations Insert commands into the compile command
for the build.
* app.page.name Set the input and output page file
for the compile command.
* build.classes.name Specify the compiled js file
For details about how these options affect your build, see
${basedir}/.sencha/app/build-impl.xml
These options can be stored in a local.properties file in this folder or in the
local.properties file in the workspace.
Alternatively, these can be supplied on the command line. For example:
ant -Dskip.sass=1 build
To see all currently defined properties, do this:
ant .props
]]></echo>
</target>
</project>

View File

@@ -0,0 +1,24 @@
# =============================================================================
# This file provides an override point for default variables defined in
# defaults.properties.
#
# IMPORTANT - Sencha Cmd will merge your changes with its own during upgrades.
# To avoid potential merge conflicts avoid making large, sweeping changes to
# this file.
# =============================================================================
enable.touch.themes=true
build.output.markuponly=false
build.watcher.targets=-watch-sass-dir,-watch-compiler
build.trigger.targets=-refresh
# override the default sass directory
compass.sass.dir=${app.sass.dir}
build.options.product=product\:touch
build.options.minVersion=minVersion\:3
build.options.default=${build.options.product},${build.options.minVersion}
app.phonegap.dir=${app.dir}/phonegap
app.phonegap.www.dir=${app.phonegap.dir}/www

282
.sencha/app/codegen.json Normal file
View File

@@ -0,0 +1,282 @@
{
"sources": {
"index.html.tpl.merge": {
"5c2622f8945945e183e62230dbbcdc870ee41e31": "eJydVU1vGjEQvfMrJhvlEnVZogoppYAq5UONlKqVQg49eu0BHLz2yh4gKMp/z3gXkuVDRakPyGY8857fjN72T65/X43+/rmBn6Nf98NWf0qFgUJYPcZAgyQBI+xkkKBNHx+SGEehhi3g1S+QBMip8AH55uPoNr1M1iHSZHD4YkWBr/2sPtWRQCuDQKsSBwnhM2UyhHVWtbLz84/DOdw8i6LkBDcGYUFbTVoYME4obSd8VloKcr7dzLkj0AE8SlcUaBUqIAczxBJoygERoOBCBdfhbelC0Hmk5KD0bqEVctlAwhKMEVUu5KxZfDnVkQ5N0TNEcHMvkWt6hEDaGMgxEosEGXfsPGMijLUPBKQLbJTK3vdR8y+QO7WCl48LMYB6MqUeXHQ6Z9+3IpHWxLu5Val0xvkenF58u+xed95vvbbet6eiLO9rye42iu0gsQwsrbM9EHlwZk64jUeu7EF3l0Uh/ETbtAqmF93yeSeJ+5sKoydcVqIl9NvxpVY0PfS6zbu/dnZLpkvMZ5qrxgZGwmmcMWa9/8JjiWruRf3kTrsbjt3WzL7eSVaduWk7juOIR2E0T2KNY7RF0eB1rEVDnreXY22/rdY2C6VDacQqkoyYaW6cnH1W4tx5hT71TGoeuEt77a27z/LBXmjd2f3irhRS0ypqfnlQiB8b+Bmuxp57Gw71dluVztmOTLtIW8HXrVP3SPI/UuPc/h9wvetnlRmujfEkTWHEXhEbxi5i3BKKObtGjuxdJVuaJSGpspQHtGy7cMX+JmzlbvlcGwUrdqOoloki8cRBmm5cV3oda6hBUmjpXeVPPmn68JNYiPpaAsHLQdIOFUzGBbNGUqZwwexKtlZqP7F38zOqNP44ZPXXoR+tbI2s9KKCPdDEhu3Ha1wo/n7qv/W2n9WITICtdNh6Az5F4Bg\u003d"
},
"app.json.tpl.merge": {
"a36200bbd84dffd4133a6074252425c15a5f25b1": "eJzFWMtu2zgU3ecrCGOAtoFjrWYTTAtk0hTNTJoWdYpZtF3QFGWxpUiVpOwYgf99zqUeluwkrdOiERBIscR7z33wHJI3BwxXcngY7+yQXeWS8bLUSvCgrHnimeGF9CUXcswqL1M2W7GpNCLn7NQWBTcpC5bNpZGOB8mE5t5L35hL4n1EJkbHbHRDD+vR+OA2r5nSkpU85GQv5Mpv4cicNYG9vnpzwVIrqkKaMGZOarxfyP6YyRdvTTQ3RKFMKq9fh0K/gxOCE3+Y5PjlDkh85q2uENWH9xe3oWLKsFQupLYlwWHSLBRQ1tDURB5jRDfYVWbHQOsMpla2cmwpZ2zm7NJLx9LKKTPv2x8zOZkDdx5CeZwk2gquc+tDUqxgM+mFM2kMb4KB3wXXlWR4MFKmKOQyl4bNKqVjBZ1ErEhkxDHMfCpLCdtGKOmZypgK+PpbpTCEAelCuiOvUhlNVE501Ue4PDDuJDMWd4E3Xs1Q5YXidbn9ygdZsNLZYIXVk2HBKqdRJlNpvVueC+UDsxnjWrN/+IJPhVMlnKD5gqe6UOadmueoyrUUVSyXdal0rRN2xkWOWOCfioK3sy9SBLZU1ILUkFZru6QaZNYVPBy3A+N1M/gv4i2bvqJ7EmziIya044glCXvXtDYFPqY0xvrVeUBGiwoBzeSPdXTPqZOFDTS7gkN1BxecPn1bUuRcP9sZed+FkUfspcx4pZFNIKlQ/0wZdM3TjGsvV8/oV6/mMM14P5RlrpDWpUJdEI2wpZLp/r6npRQqW9VBIVcxE3WqkBFWB73jkNoMsO72O6rKlMdsjVKpAx/9qmwB8nkW/fuIHM7HPdARnTV6Rdi05TT9rCFKBX/u7YsxgdaFCWXivIvZnwbr+FyiUkHp2nU34UHWZi7TyQOiavOEtErDafJamu+YH0dcgaToLauzStNkE/NDfGWY6iNWSG5gA8+t4babCiSupq1NauvY/G6pr49m1gYfHC+3Z8dPlfrcpESNkvqwT/6FBbhY444vVxPG9jUP3fF1Z/tNU3cdjZJHXpANcacgYYHKr8BtmBWZdHC7/4Rr+LJT8Y5zoO8qk2CmurYogRLO1i3stlUmXushh4P8jtnHg9bXzUHfc8eYN5nDymBp3VdiyXXi4wLjKNhK5H+FUoMCno+0mjmOSJ8/Z09A+09GL45w+yvB+xdEsuOh7d36d+/X4+8B6ob+asN1ZrdNzsCvuiXxMQldr81qFUUnxLXVUI1JXAWYBB8a/HX90RHPRuObinQ+t6lwE0R8+ny/5p5Op7eKrTJCV/4RxJZsT4R/JK19MKM8otI+ktD+TKp+l8z+jMpGqURbYwlvDXgaArHcP8zforu/THbvUwCakz8gAd3mIcGAhCYiDdziyf0564OvK8KrYEEroFSN9thsV6nEk07lnsbt5Z+DPV78pBPCZz1exVap5tZhwBh8SmMAcxNrB6mG1VIpsVbHoKcnp6/P2JuTy/NXZ9MrbK3EZo/Yc1BntfHwcZig3h6we/F5vBeKy7Or/96+//d+90YGUutdAIcP9vvq5OLi75PT7zgGJ+oZF9Hz5/jzerfoZ9cQ5812dEBVUC8LldkI47B43aBBaL3uVAXmf78x++8gxXe88oG7UJWju/r0FXVV0lvP0VEJui6gzC5GAAWwruk8hLIireyvBf240zVQkkoR/7zS3GH/WzraeQPb1oFItDgM9NOniV+YP+7E+bID2B7V+ECwaE0ANwtlK0/7+bSKRWygTdglyUhcyRBg5CnQmrmdhx3JRoLpktA6beP6KktaYQQu6gUp/JSg2cZKXHRkNTV6fB6WEqmqKWMrcu5EDt1vD4Kaf285BWo7tUTLEe/Hw7D6uCQegHTrYlGkzToLoOigY7ut6vOSLtm3UZVR3yrZYydkJd2Qe4+TmpM4TpnGYuE6fjTQp69y5bu11yWtqIj2iLB8biugNNi5uIbFezq2dQKj0rg6ryKy83Q9Olgf/A/eSIqN"
},
"packager.json.tpl.merge": {
"79175610d9330cc0582cd66bb8103f2e24409b4a": "eJytWN1z0zgQf27/Ck144GNCfJRCmfJCSFPIUZJMEg7mGCYothLrsC2fJLfNdXp/++1K8mcTtw/XYZhEWu3ub783N4cH3rNnhwfkGXnnrzfkZq4lTza3hKZpxH2quUjGNGaWQrK/My5ZYL4tQq4I/NMhIwmQELEmW5HJ6tMuuQq5HyJZwFUa0S0LiEjMm4Bdcp8BAbPf4RnS8URpGkUs6JFJQkaTeRdu4VyFIosCElPth0Z+m1zgYu77cMTIVIpLruAYkJGpkMC/hyy8w4NOA2fntHODTG873cMHmGa0xxT4n0opwFsLeUe7FmT/P6pR8BBMqywJIjZnLHCQ+kSDX/yQSuprJokyhM6d4KEkUGTFAB06rlBwdIY67tUvV68qDbT7NP12Ppz++Xp43qLhJZPIzH69Jxwd7S4bFiaq8QMlXvR+2yF9lGi2YbIQPxDBfbnA7ZNCCR+e7M4NGxrEpwmRbA1PtCBcE6oIBYdwiIkki1dM9sgXZfIm2pp46ieBFDywNKqJCFVEPDvQTFZ/MV/fEu6LxByfAzeOgQgOo4qVagAQLkkg/CxmibbOpSuRafOWKP4PU6eGRah1qk49D9KZRSIFbREj6/ki9iK+klRuPS6U96jGzMsUk+wayDlLfOYBU5+lOqORF4sVj1jIN94ITtUophumqp97oY5NKBUQnEF2wiAfhNhAOF7QLPFDOEYAimwyHrASQR2AZWcgGDovxSyAaqW8jC/NUcQT+Ia8lgFTfJMsIyegUA8tSwCnIq9OuuTkqEtevDgmwJy8OD5+W3jRULx83SXHb8zlydFbwk24EKggvwBxzel5xIBITD6UYRHhW1NRIQ58mgcF3nVOyc3hwUHn5WuIC8kUBKLvlLeGXTrmL1/3UkiGLhIfv7mH+PhNSfzqZA9xSXJytIfkX57SoKQDG+0hfHd0XSE73kdm+OW0hwe3+0sKT9JMT6kOWzI6Eq605Rk8h3gNKVmIDArhUT2hJYvg0yWzoQevQZ0132TSslhDXBfZWggHGD2vpfBB0t2vJnRRCAYMdywKutY1UCy54jqEgk0UvcTW+pn+gs+ZeUO1kwHxpk2vToTGOm7wGj3NTdfEXky3ZMPwHkAyrONKAXA/g+IDyH2Rbl2BRpSl8giz55mS1Ya2ZrEWwA3L7uyyP8/YKtv8zBssja7oFrsWphzkXWJUR0xUojFWMdcam1XOCd0ImQZ1F5LdSFcac+45Gsd2Qh/Lzc8ZM3WnkIR2TpnP1xxsnZuipjFYwyjXYgmYljTgiu9pNzmZCwGEc8WjCHWQWZJU8ZSW6V9SHtEVxIVI8UShCWw1RHST+ZzHGTAWsnKWf3T53/g6rDxAuLlegLTKrwWwHQgX27Stw7qpUQOVDd07Q1ITvev5hstoXfjblXukWFdbiHaCMAcSBqVFQQcrOdxjuWkoXKiYb7Sw0peEY38uZ6ASLViouG3LDCY1RBSgZEUxqAbCnUpVedCrUeeGtbN3u0HyIaVBAWK+8iQQV+X40dAPUHlYNTwtvKomWI0ehrIfcaraV40mROvkc6NxIIwPbSJurV9B7cn8G2wlzIaJllvTN2mmBczfwCjCGQuQGVkV9nmJgdqB+N3CUg7ZpXijLHZoiMG/MgW1GMalGCdiM+HjOIczC7umeNh1vb6GxYIENh0bUOQsn01OyUzARKjJmcg2IONJ//3gbHj+4ePo96cdU6CNDijeyMbafYdJp1T2K0aAhUSbEVZxcrdq0QTmdiyNVcvuigLjPwgDbNgPCGmlroTMkx3qmjtwhfYKpuKippIgM9tI1WQwTMKOsTMYLaNWTdJ8WYGtBSO0ogYYwk2SBRF+Ml31SX86XY77n4c9O7UWFE+d2vm05kuGSlIbWAmY8iqJBA3IWorYLkyPVSkAwaW1lampYCsa8JIFb9aBZkMdV2539NE0U2GNA3jfhTMULdOzCAxepuN1sDywONXbfGQNRPJYY4PdwaeYKQAMLiJF0OzVtxWlCn7tLIRVl+VVbH72Kc+0ZikDaDnVrj3RSamWM7cfPIertp8JLFV/OrpAYTU13R2BSxLhbbe5t1YURyxg0G5lWYTAic3qbVcyTbD3nz5kkwGIMLTxa/jAnxvRdp+yHeJ9PhSK/HcYCBAJU3Yq4BEGZT5toObgTlpRM6YJxcX3iTtcgn3AXCJSucWeFr9P1G0Dxn2DliTur27QvpR0+92a9QekKpMxV2gn2xzMNZqscmFHAzC0mfRWWORrM8KTorvBTv2U2EUyA7QRh6LZ4FXthlUmLinWIoOsfoADzFZqtl136n2mCV8zpXulOOOMR/3BYDifLwcfh4NPo/FyOptMh7PFaDgvykGpX+f0e2E4/OuMxovhbDxcgEVr544p3HydzD4t54v+YtikGUAtm/Wbp3+M3s92EDuG56PxcHkxGfQXo8l4D81g0p/N91MN+hcXy+nHyXjYKS5+3E2tRiQI/PHA/p6gWkbGKpkNDDMLNF0J82KR9NUnsD1/x40T67GkXNv9M8JfwHyasgu2bh7N+CZ0Z/mjL6mC7DuDqg8r6Y/D28P/ACQ3720\u003d"
},
"app.js.tpl.merge": {
"bf7e5518d2efd28e0a64077e1e7666428cf994ae": "eJx1VdtuEzEQfc9XjILQblDkpCEtEFRxKTxEAlRxkxDiwV1PErdee/GlSajCtzP2ZnMhiR/2NnPOzBx7Zh8ey7Iy1l/z4o5PMS9MyRzqYsZZ8FJ1Hq96T1pA6+tMOphIhUD3KWq03KMArgWESqTnmyV8SVC4KgWDHyZAwTWgkB78Bs5d4tOIgjATY2FpggVeVUoW3Euju3ATIgIdJrCDuVQKZvwewRu4QSjRTlPARLUNCvMZaqBwFVpiLh0URmCTLlGD5+7OgQvFjBLZGPSU8pknspIAynUJqL01SqF1QDneS5y7VG0KYYPWEdWutYrZkwxTywW2WSsRjQVypZZAZj1FFzPfijA3QYlYiZKlbHQsjfNksXdbszAaE5vUYEgRC5XiBbHlTQlX2zw7DMaTXTVIfW18rVZSOVE1CcWQUdztZkaxulG+pHdljQgFbRi0awaSZEJ75NtUCPeRMPEl57idsUSLzijap5LrEMtnrSe9Vuv9wrOdDc4f6iPASxxB9kCWT/S4yrq1chZ/B0lEI/iZ3uPKIsVHdI4O6VuzyJLh1xqQNmfP+yOXet9HUvYjeNi6nD/LKHjMN1hStBcdXG9MV1bpKeWy8Xw2OOX5V1Zc/O9+djY85f96sDjwHp70TuwNJCFWTTEu2q8tUrtWxqEYgbcB11bnufWhGpek1V7JTwf9xfCivx9v7d1bG9lttZffxbC/eDE4gVkbDwS7eL446/eHx0GN9QA1jN8Hp1Br64F+508vFoN+//lx2MZ8qPuLaBiewjXmQ/EVD9RhI5jQLZ3mzo7GvR68Q0cduYwDDB7R2f5guKBZMdYiHn+aJaiwRO03mHi0J2qZZ0ecsw4TNV/eednaDTPW0kuu5B9MkUo68akR9mi/04c43hkXIo8fCovU6vm26VjEsNQvHYqwW6jR3+rJfqLW1JJuyuJckLbMN4a42m+2/Q41T7u775F+KTtjgSa8g9tAQ5CGG22Gm4Q4QG+QBm7zj0lTlMYmvZDfPU09AjL4jIqEA23mr/6Lssmc/ine6LHYraBZcgIbO1xeXkK2RJcd84xrLrUwc6ZMnTazKXi+Vm93rVrH3xqhWyt6+geQsUAZ"
},
"config.rb.tpl.merge": {
"e254e92dd21bc9ecb27f3b8251d67dfbc79fa1af": "eJxlkMFOwzAMhu95Cqs7bEiQB0DaCTGEtAPiBSIrddtAG5c4ASrEu+N00kDjYtl/7O+PvYEHypAHgjYk8pnTohVWKQh4jl3oS8IcOEIXRgL6DJIFQjQ6AHs4qGg1jTjRzrnD4/HeuStjNnBkbFeyUPQD3mQufoAuaeMHp1fAknlSssdxXKwZa/tKe+EQd4q8hq2123P8Oo8+YR6+q5RIuCRPUgu1mjRbve94mlEuFhAjqrlZp/XjamD8b3nh3FjbaNSGZgU+01vRAwHGBbBtQ+XhqPyTzzyWPkSBgRJZEybsSdyfA/0Dn1qUzSXPJTvJix53D7eVqGsJtYbie0gcJ4q5vsyJ2+KrsfkBl52Ucw\u003d\u003d"
},
"app.scss.tpl.merge": {
"3d3f6b023c31a4e49cd626dd27cff9474aff32d7": "eJx9kL1uAyEQhHs/xXRnS8nRx40lK0Xq8wusYc8QceyJH5/99gHsOh3MDLMfqxQuljGL97K5cEPeBN4FTnDLKjEjV9vwTMVnTBy0JVykaNuMhUf8zHhKAUXGtThvaslOKRACb6/MByIvcud+AwXTO8mY9jBCtoDzNEECsqyQudtXStzl/Wadtq3SJZCPTOYJF7Qvhk09vEpoXcffVCtm5/kw7k5v+iF15M/ckNX7H8Pxf1+R9zXTZp5LyrJAi2HcpG7FcuRx7N73g5bVV60il9SXV8GdrhSLe7jw1UKnN2rX90NJHIfD8Q/mSX+o"
},
"build.properties.merge": {
"c6e9ce3ed0c79ce24c58d6bc68741d0a8f51e02b": "eJytUbtuwzAM3P0VBNIx0dItgIeiU4c+0AbdFYu2icqSQFExgiL/Xjq10yLoWC0S78jjUVxB/Z+nWsGupwwteYTE8UAOM9gA8YDMGkCKFATayOCwtcULHCyT3XvNU4QCOqAAKjTz2ahOQhbCbKqVEg+PL8+vu7unHWzgDUPTW7gfHIzkPQzIHcIxFgbFQ6eqI0kPJBniGMAVptBBSR1bdxaEXQR7iOTUmmAQsotKE0PrqdHKb36wH1Ott0quIY+IaYqXPhJVTJbpJ+X//doKw/RNRmJpeiM9Dphr4YLVvpB3JhZJRcxg+aOkGPyxbq3PCztaaXpkI5N7yfXmDGyyzXnjiNdz3MQhqXueq4Sp635XMbaMua90ustK1cplmZMeqB42EvlYTXKKmAk2Ctc3nzalS3iqFu9JKIbzql1ppJ7v7XnWq5yBwjty1nf989zeXmXNhrThnx1O62viR0tdfQH7kQwQ"
},
"native.properties.merge": {
"07d1a1ee61bad4a32197342ffc02dcc8402c1813": "eJytkUtuwzAMRPc6BYF0mQjoAbwouuqiH7S+AGPRDhtZFPRxEBS5e+kkBtIC3dU7znCeiPEKmv/8zAraHWfo2RPEJBM7yoABZKKUdIAoHAr0ksBRj9UXmDAxbr3uqcKBHHAABW0re2cVEikVPmPcEso3ujUr3X56fnt9bx9eWtjAB4Vuh/A4Ojiw9zBSGgiOUhOoHgZlHbjsgEsGOQRwNXEYoMYhoTsDoRXASdjpvYVCYVwonYTec6fJiz/ifs56VHMN+UAU53l5p4jCylLJTP7fvhVIYW4PjpX1uDEmypklmEt9N4rVjebeXNZtLloneglkRwzcUy5NSZXMNSixaCY3d18/ZutoWwfrOM+U0/q37WUYKP3tX//fyWCMduQuiRftPNmAIzVFr9D27Gc2Ju85qlp4ok3Ebo8DNT36TOYb0kbmEg\u003d\u003d"
},
"package.properties.merge": {
"3227481d91059b21defcf41e7c96aca501184796": "eJytkc9OwzAMxu99CkvjOCLxAD0gThz4I+gLZI2bGdI4cpJWE9q7426rNJC4kZu/z/7Z+rKB9j9fs4FuTxkGCghJeCKHGWwEnlBEC0hMscDAAg4HW0OByQrZXdA+VSiiA4qgoF2l4IxCEkqhE8atQ/lKN81Gux+fXl/euvvnDm7hHWO/t/AwOpgpBBhRPMKBq4Dq0StrprIHKhl4juCqUPRQkxfrTkDoGOzE5PTegrGQXSk9xyFQr5Nnf7Sfy2ywam4hz4hpqdc9hRVW1kgW8v/mrUCMS3pwqKTHjUkwZ+LYnOO7Uox2tHfNxeBUVMvtzdeP2jjcVW8c5QV63P62A3uP8rd/+Z9jY1MyI/XCgTVTMdGO2BbMRdMxH7lpvgH3W9AR"
},
"testing.properties.merge": {
"004322eb00e7dbb83fc2fcdf96fcd4949b9e208d": "eJytkE1OwzAQhfc5xUhlWXyDLhArFvyo5AJuPHEHnBlr7CRCqHdn0hIJkNjVuzdv3mf7bWB3zdNsoD1SgZ4SQlaZKGABzyATqpqALMQVelEI2PsxVZi8kj8k27MJMQYgBgMdRkrBGSSjVjpjwhoqP+au2dj2w+PL8769e2rhFl6Ru6OH+yHATCnBgBoRPmRUsDlHY81Uj0C1gMwMYVTiCGOO6sMZCK2An4SCvbciV/IrpRPuE3WWvPiDf1+yyZu5hTIj5kWv91QxWF0rWcjX7bu5tCS5knDZ3Xz+0i7gYYwOeen3tP3rJokR9V/7u+tT43N2A3UqSawfdewH3FUs1X7q3krTfAEJRr1D"
},
"sencha.cfg.tpl.merge": {
"d2e6e42720f88befc892f12df5fd7bab587f7879": "eJxtUDEOwjAM3PsKSzAi6MaUhQfwAhaTujTQNpHtClWof8cpamFgSU53F/sumNK+x47cK59TUaARNRt+Rn641wrPX9m3KJJQG7e9DGV5PGWyCjwdMrjL7g9dFBvQJggkjolYR5BEPtSBBBB87DoEoYSMShW0QRRiDXmJmNorhj70NxvCJHFgb880mpLGfGtDcB1CW4HtI6+RxznpYt7Pg9wn/mzMwZb4uZ71MdsqTYefDp+feQN/i2pK"
},
"production.properties.merge": {
"ae3049a5e12609718b8e3bd82a2264347f69262f": "eJytkU1OxDAMhfc9haVhOeQGXSBWLPgR9AJp4raGJI7y0wqhuTvuzFQwSOwmO/s9f7Ged9Be8zU76CbKMJBDiIlnsphBB+AZU5ICIlMoMHACi4OursCsE+neiU86FNACBRBQX8lZJZCIqdARY7eh/Kuvmp24Hx5fnl+7u6cObuENg5k03HsLCzkHHtOI8Mk1gfTDKKyFygRUMvASwNZEYYQax6TtEQgdg56ZrOxbMBTSG8VwGBwZmTzpXn+ss06LuIe8IMa13v4pLLCyRbKSr5t3g2HNTll0Ree2pIpby2gzofI60IC5XEgJs4RhxMM+SpGJw8lwCv1sQ9+jtWh/IIN2GZuzi2ORudzefF3UsktfR2Upr5DD/q/seBwx/a+fT3xodIzKk0nsWM6SVNAeW7m7rWZ1qvfcNN82PutW"
}
},
"targets": {
"index.html": {
"source": "index.html.tpl.merge",
"version": "5c2622f8945945e183e62230dbbcdc870ee41e31",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
"app.json": {
"source": "app.json.tpl.merge",
"version": "a36200bbd84dffd4133a6074252425c15a5f25b1",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
"packager.json": {
"source": "packager.json.tpl.merge",
"version": "79175610d9330cc0582cd66bb8103f2e24409b4a",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
"app.js": {
"source": "app.js.tpl.merge",
"version": "bf7e5518d2efd28e0a64077e1e7666428cf994ae",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
"resources/sass/config.rb": {
"source": "config.rb.tpl.merge",
"version": "e254e92dd21bc9ecb27f3b8251d67dfbc79fa1af",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
"resources/sass/app.scss": {
"source": "app.scss.tpl.merge",
"version": "3d3f6b023c31a4e49cd626dd27cff9474aff32d7",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
".sencha/app/build.properties": {
"source": "build.properties.merge",
"version": "c6e9ce3ed0c79ce24c58d6bc68741d0a8f51e02b",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
".sencha/app/native.properties": {
"source": "native.properties.merge",
"version": "07d1a1ee61bad4a32197342ffc02dcc8402c1813",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
".sencha/app/package.properties": {
"source": "package.properties.merge",
"version": "3227481d91059b21defcf41e7c96aca501184796",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
".sencha/app/testing.properties": {
"source": "testing.properties.merge",
"version": "004322eb00e7dbb83fc2fcdf96fcd4949b9e208d",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
".sencha/app/sencha.cfg": {
"source": "sencha.cfg.tpl.merge",
"version": "d2e6e42720f88befc892f12df5fd7bab587f7879",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
},
".sencha/app/production.properties": {
"source": "production.properties.merge",
"version": "ae3049a5e12609718b8e3bd82a2264347f69262f",
"parameters": {
"viewNamespace": "DssMobile.view",
"frameworkName": "touch",
"frameworkPath": "touch",
"senchadir": ".sencha",
"appModels": "",
"appControllers": "",
"appViews": "",
"uniqueId": "7751b424-8a34-4ee3-aadd-57742640eb18",
"appName": "DssMobile",
"modelNamespace": "DssMobile.model",
"name": "DssMobile",
"library": "core",
"controllerNamespace": "DssMobile.controller",
"appStores": ""
}
}
}
}

View File

@@ -0,0 +1,503 @@
# =============================================================================
# This file defines properties used by build-impl.xml and the associated
# *-impl.xml files (sass-impl.xml, js-impl.xml, etc.), which are the core of
# the applications build process.
#
# IMPORTANT - This file is not modifiable by an app, and will be overwritten
# during each app upgrade. Please use build.properties for defining app
# customizations to these properties.
# =============================================================================
# *****************************************************************************
# Global Build Properties
# these are cross-concern properties used by many build phases
# *****************************************************************************
# the default build enviornment type (production, testing, native, package)
# NOTE: this is only a default and will typically be set before this file is
# loaded, typically by the 'sencha app build" command.
# See "sencha help app build" for details.
#
# The corresponding properies files:
# (production.properties, testing.properties, etc.) provide examples of
# overriding sets of properties depending on the selected environment
# NOTE: this replaces the deprecated args.environment
build.environment=production
# the directory to place built application files
build.dir=${workspace.build.dir}/${build.environment}/${app.name}
# a temporary output directory used for staging intermediate build artifacts
build.temp.dir=${workspace.build.dir}/temp/${build.environment}/${app.name}
# the directory under the output folder for placing resources
build.resources.dir=${build.dir}/resources
# *****************************************************************************
# JS
# these properties control various aspects of output js code construction
# *****************************************************************************
# the output js file that contains all needed js code
build.classes.name=app.js
build.classes.file=${build.dir}/${build.classes.name}
# the output js file for framework code, if the framework
# classes are not included in the default all-classes.js file
build.framework.name=framework.js
build.framework.file=${build.dir}/${build.framework.name}
# a property that enables <debug> blocks in js output, see build.options
build.options.debug.enable=debug:true
# a property that enables <debug> blocks in js output, see build.options
build.options.debug.disable=debug:false
# a property that enables <feature logger> blocks in js output, see build.options
build.options.logger.enable=logger:yes
# a property that disables <feature logger> blocks in js output, see build.options
build.options.logger.disable=logger:no
# a property that sets js preprocessor options in the form:
# name1:value1,name2:value2,...
#
# (used by -init-compiler in init-impl.xml)
# this may be assembled using property expansion, for example:
# build.options=${build.options.debug.enable},${build.options.logger.enable}
build.options=
# This property can be modified to change general build options
# such as excluding files from the set. The format expects newlines
# for each argument, for example:
#
# build.operations=\
# exclude\n \
# -namespace=Ext\n
build.operations=
# enables / disables the full class optimizer during js builds
# (used by the -compile-* targets in js-impl.xml)
build.optimize.enable=\
optimize\n \
-define-rewrite\n
build.optimize.disable=
build.optimize=${build.optimize.disable}
# enables / disables yui compression
build.compression.yui=0
# enables / disables closure compression
build.compression.closure=0
# enables / disables uglify compression
build.compression.ugilfy=0
build.compile.temp.dir=${build.temp.dir}/sencha-compiler
# controles whether to keep the temp compile dir after the build
build.compile.temp.dir.keep=true
# ------------------------------------------
# DOC ONLY - Do Not Set
# this variable will be set to the appropriate compressor
# option, and is calculated in init-impl.xml, but may be overridded in
# app.properties, <environment>.properties, or via command line
#
# build.compression=
# ------------------------------------------
# *****************************************************************************
# Page
# these variables control aspects of building the output markup page
# *****************************************************************************
# controls whether the output will be microloader-enabled, or markup only
build.output.markuponly=false
# controls whether the microloader content will be embedded in the output
# markup, or left as a separate resource
build.enable.embedded.microloader=true
# whether to include the page's manifest.json code with the
# microloader content. Production.properties files should set this to
# false to have app.json exist as a server resource.
build.enable.embedded.manifest=true
# enables / disables delta patch generation
enable.deltas=false
# enables / disables generation of cache manifest
enable.cache.manifest=false
# enables / disables compression of resources referenced in app.json / package.json
# js and css entries
enable.resource.compression=false
# defaults to index.html, but may be overridden in app.json
app.indexHtmlPath=index.html
# the input page file for the application
app.page.name=${app.indexHtmlPath}
app.page.file=${app.dir}/${app.page.name}
# the output page file
build.page.name=${app.page.name}
build.page.file=${build.dir}/${build.page.name}
# the directory where the microloader files may be found
app.microloader.dir=${app.config.dir}/microloader
# the file names of the individual microloaders
app.microloader.development=development.js
app.microloader.testing=testing.js
app.microloader.production=production.js
# the target microloader to use for builds
app.microloader.name=${app.microloader.development}
app.microloader.path=${app.microloader.dir}/${app.microloader.name}
# specifies how to embed the microloader code into the output markup
# {0} is replaced with the content of the microloader file specified
# by app.microloader.path
build.microloader.code.tpl={0}
# the template to use when generating a stand-alone json manifest file
build.microloader.json.tpl.standalone={0}
# the template to use when embedding the manifest json directly next to the
# microloader in the output microloader content
build.microloader.json.tpl.embedded=Ext.blink({0});
# the template to use in the output microloader content when supplying
# the manifest json as a separate server-side resource ('production' builds)
build.microloader.json.tpl.external=Ext.blink('{'id:''${app.id}'''}');
# the template string to use when embedding the microloader content
# into the output markup
build.embedded.microloader.tpl=<script type="text/javascript">{0}</script>
# the name of the output microloader file
build.microloader.name=microloader.js
# the path to the microloader content file, if external to the outpout markup
build.microloader.path=${build.dir}/${build.microloader.name}
# the inner markup to embed into the output markup when not including
# the microloader content directly into the output markup
build.embedded.microloader.src=${build.microloader.name}
build.external.microloader.markup=<script src="${build.embedded.microloader.src}"></script>
# a flag indicating which mode the microloader should run in (production, testing, etc.)
# currently unused : is a placeholder for future microloader interactions
build.microloader.mode=${build.environment}
# the tag name to use when generating the compiler save set for
# the page's js code
build.tag.name=full-page
# the name of the archive folder containing source versions for
# delta patch generation
build.archive.name=archive
build.out.archive.path=${workspace.build.dir}/${build.archive.name}/${app.name}
# the name of the output folder for calculated delta patches
build.deltas.name=deltas
build.out.delta.path=${build.dir}/${build.deltas.name}
# the output cache manifest file
build.manifest.name=cache.appcache
build.manifest.path=${build.dir}/${build.manifest.name}
# the path to the output markup page
build.out.page.path=${build.dir}/${app.page.name}
# the name of the manifest json file
build.json.name=app.json
# the full path to the manifest json file
build.out.json.path=${build.dir}/${build.json.name}
# Defines the file that will contain Ext.setVersion calls for each used package.
build.out.package.versions=${build.compile.temp.dir}/cmd-packages.js
# a temp directory for managing extracted resources during the page build
build.app.temp.dir=${build.compile.temp.dir}/app
# *****************************************************************************
# Refresh
# these properties are used for generating bootstrap js and css
# files to support dev-time interaction with the app
# *****************************************************************************
# the base path to use for generating / calculating bootstrap info
app.bootstrap.base.path=${app.dir}
# these control the name of the bootstrap js file
# note: there will be corresponding entries in either the index page
# or app.json that reference these names
app.bootstrap.js.name=bootstrap.js
app.bootstrap.js=${app.bootstrap.base.path}/${app.bootstrap.js.name}
# these control the name of the bootstrap css file (for ext 4.2+ apps)
# note: there will be corresponding entries in either the index page
# or app.json that reference these names
app.bootstrap.css.name=bootstrap.css
app.bootstrap.css=${app.bootstrap.base.path}/${app.bootstrap.css.name}
# the microloader to use for bootstrapping operations
app.microloader.bootstrap=${app.microloader.dir}/${app.microloader.development}
# the name of the bootstrap microloader manifest
build.json.bootstrap.name=bootstrap.json
# the full path to the bootstrap microloader manifest
build.json.bootstrap.path=${app.dir}/${build.json.bootstrap.name}
# *****************************************************************************
# Sass / Css
# properties for controling features of sass generation and compilation
# *****************************************************************************
# --------------------
# these control properties select the mode used to build the app's styling
# see sass-impl.xml for how then are used
# enables theme builds for apps using ext 41 style themes
enable.ext41.themes=false
# enables theme builds for apps using ext 42 style themes
enable.ext42.themes=false
# enables theme builds for apps using touch style themes
enable.touch.themes=false
# --------------------
# selector count threshold to use when
# splitting a single css file into multiple
# css files (IE selector limit workaround)
#
# NOTE: applies only to ext js 4.2+ style theme management, currently
# see the above theme control variables for details
build.css.selector.limit=4095
# enables / disable css preprocessor (enable.ext42.themes only)
build.css.preprocess=true
# sets the css preprocessor options, in the form:
# name1:value1,name2:value2,...
build.css.preprocessor.opts=
# enables / disable css compressor (enable.ext42.themes only)
build.css.compress=true
# Specify the name for the individual resource dirs in the app
# (enable.touch.themes only)
app.sass.name=sass
# Specify the sass path in the app
# (enable.touch.themes only)
app.sass.dir=${app.dir}/resources/${app.sass.name}
# name prefix to use for output css / sass files
app.out.base=${app.name}-all
app.out.base.debug=${app.out.base}
# the output sass file to generate (used with enable.ext42.themes)
app.out.scss=${build.dir}/${app.out.base.debug}.scss
# the output ruby compass config file to generate (used with enable.ext42.themes)
app.out.ruby=${build.dir}/config.rb
# output css file prefix
app.out.css.prefix=${app.out.base.debug}
# output css file name
app.out.css.name=${app.out.css.prefix}.css
# output css file path (relative to build directory root
app.out.css.rel=resources/${app.out.css.name}
# output css file path (full path)
app.out.css=${build.dir}/${app.out.css.rel}
# separate file name to use for generating a compressed copy
# of the output css file (this default will compress the file in-place)
app.out.css.compressed=${build.dir}/resources/${app.out.base}.css
# the directory containing sass files for compass to compile
compass.sass.dir=${build.dir}
# the output directory where compass should place built css files
compass.css.dir=${build.dir}/resources
# the directory containing the ruby config file for compass
compass.config.file=${app.out.ruby}
# enables / disables console highlighting for compass
compass.compile.boring=false
# enables / disables forced rebuilds for compass
compass.compile.force=true
# enables / disables stack traces in compass failure output
compass.compile.trace=true
# ---------------------------------------------------
# Legacy properties for ext41 theme directories
# Specify the resources path in the app
app.packages.dir=${app.dir}/packages
# Specify the theme path in the app (this directory contains the themes)
app.theme.dir=${app.packages.dir}
# the currently selected ext 41 theme name
theme.name=default
# ---------------------------------------------------
# *****************************************************************************
# Slice
# these properties control features of the theme slice build phase
# *****************************************************************************
# the resources directory of the application
# note: this property is currently only used for building ext 4.1 style themes
# (used by x-build-theme and x-copy-resources in slice-impl.xml)
app.resources.dir=${app.dir}/resources
# the directory containing the slicer widget example page
app.example.dir=${app.dir}/sass/example
# properties to control the recirect css file that is
# generated for the slicer example page
app.example.css.name=example.css
app.example.css.file=${app.example.dir}/${app.example.css.name}
# the base path for generating the bootstrap code for the
# slicer page
bootstrap.base.path=${app.example.dir}
# the full file name of the slicer page's bootstrap js file
bootstrap.example.js=${app.example.dir}/bootstrap.js
# this is the directory used for intermediate build artifacts used
# by the slicer for generating theme images
app.example.build.dir=${build.temp.dir}/slicer-temp
# the name of the intermediate screenshot file used for image slicing
build.capture.png=${app.example.build.dir}/theme-capture.png
# the name of the intermediate widget manifest file used for image slicing
build.capture.json=${app.example.build.dir}/theme-capture.json
# the location of the slicer widget page
app.example.theme.html.name=theme.html
app.example.theme.html=${app.example.dir}/${app.example.theme.html.name}
# a name prefix used for slicer page temporary artifacts
app.example.base=${app.name}-example
# the special slicer page scss file name to generate
app.example.scss=${app.example.build.dir}/${app.example.base}.scss
# the relative path from the slicer css file to the slicer html file
app.example.css.rel=${app.example.base}.css
# the path to the css file that will be built for the slicer page
app.example.css=${app.example.build.dir}/${app.example.css.rel}
# the ruby compass config file to generate for slicer page scss
app.example.out.ruby=${app.example.build.dir}/config.rb
app.example.compass.config=${app.example.out.ruby}
# legacy ext 41 theme property indicating the name of the
# slicer example page contained in the theme directory
theme.page.name=theme.html
# Options to pass to the "sencha fs slice" command.
build.slice.options=
# *****************************************************************************
# Packager
# these properties control features of the native packaging phase of the
# build process
# *****************************************************************************
# enables packaging the built application with the Sencha Desktop Packager
# NOTE: currently unsupported
enable.desktop.packager=false
# skips packaging the built application with sencha mobile packager (stbuild) or cordova/phonegap
skip.native-package=true
# a property that controls whether a standalone manifest.json file will be
# generated for the native packaged application
enable.standalone.manifest=false
# these set the name of the mobile native packager's config file
build.mobile.packager.name=packager.json
build.mobile.packager.file=${app.dir}/${build.mobile.packager.name}
# the default mobile packager config to use when specifying the autorun argument
# with "sencha app build -run native"
build.mobile.packager.default.name=packager.json
build.mobile.packager.default.file=${app.dir}/${build.mobile.packager.default.name}
# these set the name of the mobile native packager's temporary config file
# that will have the input and output path properties updated
build.mobile.packager.temp.name=packager.temp.json
build.mobile.packager.temp.file=${app.dir}/${build.mobile.packager.temp.name}
# the input directory for the mobile native packager that contains the
# built Sencha Cmd application
build.mobile.packager.in.dir=${build.dir}
# the output location of the mobile native packaged application
build.mobile.packager.out.dir.name=native-package-mobile
build.mobile.packager.out.dir=${workspace.build.dir}/${build.mobile.packager.out.dir.name}/${app.name}
# *****************************************************************************
# Resolve
# these properties control aspects of the dynamic dependency resolver, which
# uses phantomjs to load the applicaiton and extract Ext.Loader class load
# history.
# *****************************************************************************
# enables / disables dynamic dependency resolution
skip.resolve=true
# enables the local web server. this may be disabled to load the application's
# page from an existing web server.
skip.web-start=false
# the port number to start the local web server on
build.web.port=54321
# the directory representing the root web folder
build.web.root=${workspace.dir}
# the base url to access the local web server
build.resolve.url=http://localhost:${build.web.port}
# a template string used to format the detected dynamic dependencies
build.resolve.tpl={0}
# the mode to use when formatting the detected dynamic dependencies
build.resolve.mode=references
# the output file for the detected dynamic dependencies
build.resolve.file=${build.temp.dir}/resolve.json
# controls whether unmatched external references in the specified file will
# generate build warnings or build failures
build.resolve.allow.unmatched=true
# *****************************************************************************
# Watch
# these properties adjust the behavior of the app watch process.
# *****************************************************************************
# the default set of actions to run when triggering a rebuild
build.trigger.targets=-refresh,-compile-resources,-compass-compile
# the watcher targets to run that monitor for code changes
build.watcher.targets=-watch-compiler

View File

@@ -0,0 +1,58 @@
<project name="find-cmd-impl">
<!--
Run "sencha which" to find the Sencha Cmd basedir and get "cmd.dir" setup. We
need to execute the command with curdir set properly for Cmd to pick up that we
are running for an application.
-->
<target name="find-cmd-in-path" unless="cmd.dir">
<exec executable="sencha"
dir="${basedir}"
failifexecutionfails="false"
outputproperty="exec.error">
<arg value="which"/>
<arg value="-p=cmd.dir"/>
<arg value="-o=$cmddir$"/>
</exec>
<!-- Now read the generated properties file and delete it -->
<property file="$cmddir$"/>
<delete file="$cmddir$"/>
</target>
<!--
Run "sencha which" again, similar to the above target, but explicitly check
for the 'SENCHA_CMD' environment variable to have been set, in case sencha
cmd isn't on the current path settings for the user
-->
<target name="find-cmd-in-environment" unless="cmd.dir">
<exec executable="${env.SENCHA_CMD}/sencha"
dir="${basedir}"
failifexecutionfails="false">
<arg value="which"/>
<arg value="-p=cmd.dir"/>
<arg value="-o=$cmddir$"/>
</exec>
<property file="$cmddir$"/>
<delete file="$cmddir$"/>
</target>
<!--
== Mac OSX launchd fix ==
create a child shell process that will source in ~/.bash_profile
and then attempt to call 'sencha which' with the current user's
shell profile settings. sencha which will create a properties file
that can then be loaded into this (the parent) process.
This allows ant integrations in IDE's like netbeans or eclipse to properly
locate Sencha Cmd, even if the IDE was launched via launchd (Finder)
-->
<target name="find-cmd-in-shell" unless="cmd.dir">
<delete quiet="true" file="$cmddir$"/>
<echo file="tmp.sh"> source ~/.bash_profile; sencha which -p cmd.dir -o '$cmddir$'</echo>
<exec executable="/bin/sh"><arg value="tmp.sh"/></exec>
<property file="$cmddir$"/>
<delete file="tmp.sh"/>
<delete file="$cmddir$"/>
</target>
</project>

210
.sencha/app/init-impl.xml Normal file
View File

@@ -0,0 +1,210 @@
<project name="init-impl">
<!--
Init-Local
-->
<target name="-before-init-local"/>
<target name="-init-local">
<!--
${basedir} is actually the basedir of build.xml, in the app root
so this imports ${app.dir}/local.properties, if present
-->
<property file="${basedir}/local.properties"/>
<!--
This will traverse upwards in the file system, starting at the
app root directory, looking for the workspace. Once found,
${workspace.dir}/local.properties will be imported into this
project
-->
<script language="javascript">
<![CDATA[
var f = new java.io.File(project.getProperty("basedir"));
var sub = ".sencha/workspace/sencha.cfg";
for (var p = f; p; p = p.getParentFile()) {
var t = new java.io.File(p, sub);
if (t.exists()) {
// we found the workspace folder!
t = new java.io.File(p, "local.properties");
if (t.exists()) {
var loader = project.createTask("property");
loader.setFile(new java.io.File(t.getCanonicalPath()));
loader.execute();
}
break;
}
}
]]>
</script>
</target>
<target name="-after-init-local"/>
<target name="init-local"
depends="-before-init-local,-init-local,-after-init-local"/>
<target name="-before-init"/>
<target name="-init" unless="internal.x-sencha-initialized">
<!--
Now, apply various project updates, such as ant class loader path
updates, as well as loading Sencha Cmd config system properties
into ant property space
-->
<x-sencha-init prefix=""/>
<!--
default the build environment to production if it is unset by this point
-->
<property name="build.environment" value="production"/>
<property name="CR" value="&#10;"/>
<x-load-properties>
<file path="${app.config.dir}/${build.environment}.properties" required="false"/>
<file path="${app.config.dir}/build.properties" required="false"/>
<file path="${app.config.dir}/defaults.properties" required="true"/>
</x-load-properties>
<!--
calculate the appropriate build.compression value
-->
<condition property="build.compression" value="-yui">
<x-is-true value="${build.compression.yui}"/>
</condition>
<condition property="build.compression" value="-closure">
<x-is-true value="${build.compression.closure}"/>
</condition>
<condition property="build.compression" value="-uglify">
<x-is-true value="${build.compression.uglify}"/>
</condition>
<property name="build.compression" value=""/>
<x-verify-app-cmd-ver/>
<!--
this id string is used to share a common compiler instance
for all x-compile calls in this project
-->
<property name="compiler.ref.id" value="app-compiler"/>
<!--
this property is set indicating we've reached the end of the
core init phase. it's presence will indicate that we've already
executed this target, and will bypass firing the init code
repeatedly in sub projects (antcall, x-ant-call)
See the above 'unless' attribute on the -init target
-->
<property name="internal.x-sencha-initialized" value="true"/>
</target>
<target name="-after-init"/>
<target name="-before-init-defaults"/>
<target name="-init-defaults">
<!--
This property can be modified to change general build options
such as excluding files from the set. The format expects newlines
for each argument, for example:
<property name="build.operations"/>
exclude
-namespace=Ext
</property>
-->
<property name="build.operations" value=""/>
<!--
This property can be modified to change concatenation
specific options
-strip-comments: comment suppression
-remove-text-references: transform string literal class references to objects
-beautify: unpack the source
<property name="build.concat.options"/>
-strip-comments
-remove-text-references
-beautify
</property>
-->
<property name="build.concat.options" value=""/>
<!--
This property can be modified to change page compilation options
-scripts: inject the given script path into the generated markup ahead of the all classes file
<property name="build.page.options"/>
-scripts=framework.js
</property>
-->
<property name="build.page.options" value=""/>
</target>
<target name="-after-init-defaults"/>
<!--
Initializes the compiler instances, reading in the app.json and package.json
definitions, as well as scanning and parsing all js files found on the
various classpath entries for the framework, workspace, packages, and app
-->
<target name="-init-compiler" depends="-init">
<condition property="internal.app.css.rel" value="${app.out.css.rel}">
<x-is-true value="${enable.ext42.themes}"/>
</condition>
<property name="internal.app.css.rel" value=""/>
<x-compile refid="${compiler.ref.id}"
dir="${app.dir}"
initOnly="true"
inheritAll="true">
<![CDATA[
# base build command
-tempDir=${build.compile.temp.dir}
-keepTempDir=${build.compile.temp.dir.keep}
-options=${build.options}
load-app
-frameworkFile=${build.framework.name}
-jsBundleFile=${build.classes.name}
-cssBundleFile=${internal.app.css.rel}
-tempDir=${build.app.temp.dir}
-tag=${build.tag.name}
and
restore
${build.tag.name}
and
meta
+packages
-out=${build.out.package.versions}
and
classpath
-path=${build.out.package.versions}
-name=framework
and
require
-source=@${build.tag.name}
-requires=@overrides
-allow-unmet=true
and
require
-scopeName=framework
-source=Ext.util.Observable
-requires=${build.out.package.versions}
-allow-unmet=false
and
union
-recursive
-tag=${build.tag.name}
and
save
${build.tag.name}-overrides
and
${build.operations}
and
save
page
]]>
</x-compile>
</target>
</project>

78
.sencha/app/js-impl.xml Normal file
View File

@@ -0,0 +1,78 @@
<project name="js-impl">
<!--
this target extracts split mode information from the compiler's app
processor to determine various pieces of information
-->
<target name="-detect-app-build-properties"
depends="-init-compiler">
<x-load-app-builder-properties
refid="${compiler.ref.id}"
splitModePropName="enable.split.mode"
pageModePropName="app.page.mode"/>
</target>
<!--
this is the standard js compile target that builds the output js file(s)
-->
<target name="-compile-js" depends="-detect-app-build-properties">
<if>
<x-is-true value="${enable.split.mode}"/>
<then>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
# build a separate sdk-only js file
union
-tag=package-sencha-core,framework
and
${build.optimize}
and
concat
${build.compression}
-out=${build.framework.file}
${build.concat.options}
# now build the all-classes file, without
# the framework code included
and
restore
page
and
exclude
-tag=framework,package-sencha-core
and
${build.optimize}
and
concat
${build.compression}
-out=${build.classes.file}
${build.concat.options}
]]>
</x-compile>
</then>
<else>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
# build an all-classes.js file that contains
# all code needed by the app
restore
page
and
${build.optimize}
and
concat
${build.compression}
-out=${build.classes.file}
${build.concat.options}
]]>
</x-compile>
</else>
</if>
</target>
<!--
Build javascript
-->
<target name="-before-js"/>
<target name="-js" depends="-compile-js"/>
<target name="-after-js"/>
</project>

View File

@@ -0,0 +1,185 @@
/**
* Sencha Blink - Development
* @author Jacky Nguyen <jacky@sencha.com>
*/
(function() {
var head = document.head;
function write(content) {
document.write(content);
}
function addMeta(name, content) {
var meta = document.createElement('meta');
meta.setAttribute('name', name);
meta.setAttribute('content', content);
head.appendChild(meta);
}
var xhr = new XMLHttpRequest();
xhr.open('GET', 'bootstrap.json', false);
xhr.send(null);
var options = eval("(" + xhr.responseText + ")"),
scripts = options.js || [],
styleSheets = options.css || [],
i, ln, path, platform, theme, exclude;
if(options.platform && options.platforms && options.platforms[options.platform] && options.platforms[options.platform].js) {
scripts = options.platforms[options.platform].js.concat(scripts);
}
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
var msViewportStyle = document.createElement("style");
msViewportStyle.appendChild(
document.createTextNode(
"@media screen and (orientation: portrait) {" +
"@-ms-viewport {width: 320px !important;}" +
"}" +
"@media screen and (orientation: landscape) {" +
"@-ms-viewport {width: 560px !important;}" +
"}"
)
);
document.getElementsByTagName("head")[0].appendChild(msViewportStyle);
}
addMeta('viewport', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no');
addMeta('apple-mobile-web-app-capable', 'yes');
addMeta('apple-touch-fullscreen', 'yes');
if (!window.Ext) {
window.Ext = {};
}
Ext.microloaded = true;
var filterPlatform = window.Ext.filterPlatform = function(platform) {
var profileMatch = false,
ua = navigator.userAgent,
j, jln;
platform = [].concat(platform);
function isPhone(ua) {
var isMobile = /Mobile(\/|\s)/.test(ua);
// Either:
// - iOS but not iPad
// - Android 2
// - Android with "Mobile" in the UA
return /(iPhone|iPod)/.test(ua) ||
(!/(Silk)/.test(ua) && (/(Android)/.test(ua) && (/(Android 2)/.test(ua) || isMobile))) ||
(/(BlackBerry|BB)/.test(ua) && isMobile) ||
/(Windows Phone)/.test(ua);
}
function isTablet(ua) {
return !isPhone(ua) && (/iPad/.test(ua) || /Android|Silk/.test(ua) || /(RIM Tablet OS)/.test(ua) ||
(/MSIE 10/.test(ua) && /; Touch/.test(ua)));
}
// Check if the ?platform parameter is set in the URL
var paramsString = window.location.search.substr(1),
paramsArray = paramsString.split("&"),
params = {},
testPlatform, i;
for (i = 0; i < paramsArray.length; i++) {
var tmpArray = paramsArray[i].split("=");
params[tmpArray[0]] = tmpArray[1];
}
testPlatform = params.platform;
if (testPlatform) {
return platform.indexOf(testPlatform) != -1;
}
for (j = 0, jln = platform.length; j < jln; j++) {
switch (platform[j]) {
case 'phone':
profileMatch = isPhone(ua);
break;
case 'tablet':
profileMatch = isTablet(ua);
break;
case 'desktop':
profileMatch = !isPhone(ua) && !isTablet(ua);
break;
case 'ios':
profileMatch = /(iPad|iPhone|iPod)/.test(ua);
break;
case 'android':
profileMatch = /(Android|Silk)/.test(ua);
break;
case 'blackberry':
profileMatch = /(BlackBerry|BB)/.test(ua);
break;
case 'safari':
profileMatch = /Safari/.test(ua) && !(/(BlackBerry|BB)/.test(ua));
break;
case 'chrome':
profileMatch = /Chrome/.test(ua);
break;
case 'ie10':
profileMatch = /MSIE 10/.test(ua);
break;
case 'windows':
profileMatch = /MSIE 10/.test(ua) || /Trident/.test(ua);
break;
case 'tizen':
profileMatch = /Tizen/.test(ua);
break;
case 'firefox':
profileMatch = /Firefox/.test(ua);
}
if (profileMatch) {
return true;
}
}
return false;
};
for (i = 0,ln = styleSheets.length; i < ln; i++) {
path = styleSheets[i];
if (typeof path != 'string') {
platform = path.platform;
exclude = path.exclude;
theme = path.theme;
path = path.path;
}
if (platform) {
if (!filterPlatform(platform) || filterPlatform(exclude)) {
continue;
}
Ext.theme = {
name: theme || 'Default'
};
}
write('<link rel="stylesheet" href="'+path+'">');
}
for (i = 0,ln = scripts.length; i < ln; i++) {
path = scripts[i];
if (typeof path != 'string') {
platform = path.platform;
exclude = path.exclude;
path = path.path;
}
if (platform) {
if (!filterPlatform(platform) || filterPlatform(exclude)) {
continue;
}
}
write('<script src="'+path+'"></'+'script>');
}
})();

View File

@@ -0,0 +1,742 @@
/**
* Sencha Blink
* @author Jacky Nguyen <jacky@sencha.com>
*/
(function(global) {
var emptyFn = function(){},
callbacks = [],
doc = global.document,
head = doc.head,
addWindowListener = global.addEventListener,
removeWindowListener = global.removeEventListener,
jsonParse = JSON.parse,
a = doc.createElement('a'),
documentLocation = doc.location,
documentUri = documentLocation.protocol + '//' + documentLocation.hostname + documentLocation.pathname + documentLocation.search,
manifestFile = 'app.json',
isRefreshing = false,
activeManifest, appCache, storage;
try {
storage = global.localStorage;
appCache = global.applicationCache;
}
catch(e) {}
function getManifestStorageKey(id) {
return id + '-' + documentUri + manifestFile;
}
function Manifest(manifest) {
var manifestContent;
if (typeof manifest == 'string') {
manifestContent = manifest;
manifest = jsonParse(manifestContent);
}
else {
manifestContent = JSON.stringify(manifest);
}
var applicationId = manifest.id,
key = getManifestStorageKey(applicationId),
assetMap = {};
function processAsset(asset) {
var uri;
if (typeof asset == 'string') {
asset = {
path: asset
};
}
if (asset.shared) {
asset.version = asset.shared;
uri = asset.shared + asset.path;
}
else {
uri = toAbsoluteUri(asset.path);
}
asset.uri = uri;
asset.key = applicationId + '-' + uri;
assetMap[uri] = asset;
return asset;
}
function processAssets(assets, type) {
var ln = assets.length,
i, asset;
for (i = 0; i < ln; i++) {
asset = assets[i];
assets[i] = asset = processAsset(asset);
asset.type = type;
asset.index = i;
asset.collection = assets;
asset.ready = false;
asset.evaluated = false;
}
return assets;
}
this.key = key;
this.css = processAssets(manifest.css, 'css');
this.js = processAssets(manifest.js, 'js');
Ext.microloaded = true;
var filterPlatform = window.Ext.filterPlatform = function(platform) {
var profileMatch = false,
ua = navigator.userAgent,
j, jln;
platform = [].concat(platform);
function isPhone(ua) {
var isMobile = /Mobile(\/|\s)/.test(ua);
// Either:
// - iOS but not iPad
// - Android 2
// - Android with "Mobile" in the UA
return /(iPhone|iPod)/.test(ua) ||
(!/(Silk)/.test(ua) && (/(Android)/.test(ua) && (/(Android 2)/.test(ua) || isMobile))) ||
(/(BlackBerry|BB)/.test(ua) && isMobile) ||
/(Windows Phone)/.test(ua);
}
function isTablet(ua) {
return !isPhone(ua) && (/iPad/.test(ua) || /Android|Silk/.test(ua) || /(RIM Tablet OS)/.test(ua) ||
(/MSIE 10/.test(ua) && /; Touch/.test(ua)));
}
// Check if the ?platform parameter is set in the URL
var paramsString = window.location.search.substr(1),
paramsArray = paramsString.split("&"),
params = {},
testPlatform, i;
for (i = 0; i < paramsArray.length; i++) {
var tmpArray = paramsArray[i].split("=");
params[tmpArray[0]] = tmpArray[1];
}
testPlatform = params.platform;
if (testPlatform) {
return platform.indexOf(testPlatform) != -1;
}
for (j = 0, jln = platform.length; j < jln; j++) {
switch (platform[j]) {
case 'phone':
profileMatch = isPhone(ua);
break;
case 'tablet':
profileMatch = isTablet(ua);
break;
case 'desktop':
profileMatch = !isPhone(ua) && !isTablet(ua);
break;
case 'ios':
profileMatch = /(iPad|iPhone|iPod)/.test(ua);
break;
case 'android':
profileMatch = /(Android|Silk)/.test(ua);
break;
case 'blackberry':
profileMatch = /(BlackBerry|BB)/.test(ua);
break;
case 'safari':
profileMatch = /Safari/.test(ua) && !(/(BlackBerry|BB)/.test(ua));
break;
case 'chrome':
profileMatch = /Chrome/.test(ua);
break;
case 'ie10':
profileMatch = /MSIE 10/.test(ua);
break;
case 'windows':
profileMatch = /MSIE 10/.test(ua) || /Trident/.test(ua);
break;
case 'tizen':
profileMatch = /Tizen/.test(ua);
break;
case 'firefox':
profileMatch = /Firefox/.test(ua);
}
if (profileMatch) {
return true;
}
}
return false;
};
this.css = this.css.filter(function(css) {
var platform = css.platform,
exclude = css.exclude;
if (platform) {
if (filterPlatform(platform) && !filterPlatform(exclude)) {
Ext.theme = {
name: css.theme || 'Default'
};
return true;
}
css.filtered = true;
return false;
}
return true;
});
this.js = this.js.filter(function(js) {
var platform = js.platform,
exclude = js.exclude;
if (platform) {
if (filterPlatform(platform) && !filterPlatform(exclude)) {
return true;
}
else {
js.filtered = true;
return false;
}
}
return true;
});
this.assets = this.css.concat(this.js);
this.getAsset = function(uri) {
return assetMap[uri];
};
this.store = function() {
store(key, manifestContent);
};
}
if (typeof global.Ext === 'undefined') {
var Ext = global.Ext = {};
}
function toAbsoluteUri(uri) {
a.href = uri;
return a.href;
}
function addMeta(name, content) {
var meta = document.createElement('meta');
meta.setAttribute('name', name);
meta.setAttribute('content', content);
head.appendChild(meta);
}
function request(uri, isShared, onSuccess, onFailure) {
(isShared ? requestIframe : requestXhr)(uri, onSuccess, onFailure);
}
function requestXhr(uri, onSuccess, onFailure) {
var xhr = new XMLHttpRequest();
onFailure = onFailure || emptyFn;
uri = uri + ((uri.indexOf('?') == -1) ? '?' : '&') + Date.now();
try {
xhr.open('GET', uri, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
var status = xhr.status,
content = xhr.responseText;
if ((status >= 200 && status < 300) || status == 304 || (status == 0 && content.length > 0)) {
onSuccess(content);
}
else {
onFailure();
}
}
};
xhr.send(null);
} catch (e) {
onFailure();
}
}
function requestIframe(uri, onSuccess) {
var iframe = doc.createElement('iframe');
callbacks.push({
iframe: iframe,
callback: onSuccess
});
iframe.src = uri + '.html';
iframe.style.cssText = 'width:0;height:0;border:0;position:absolute;z-index:-999;visibility:hidden';
doc.body.appendChild(iframe);
}
function requestAsset(asset, onSuccess, onFailure) {
var isRemote = !!asset.remote,
isShared = !!asset.shared;
if (isRemote) {
onSuccess('');
return;
}
if (!isShared) {
var onRequestSuccess = onSuccess,
version = asset.version,
versionLn = version.length,
checksumFail, checksumType;
onSuccess = function(content) {
checksumType = content.substring(0, 1);
if (checksumType == '/') {
if (content.substring(2, versionLn + 2) !== version) {
checksumFail = true;
}
}
else if (checksumType == 'f') {
if (content.substring(9, versionLn + 9) !== version) {
checksumFail = true;
}
}
else if (checksumType == '.') {
if (content.substring(1, versionLn + 1) !== version) {
checksumFail = true;
}
}
if (checksumFail === true) {
if (confirm("Requested: '" + asset.uri + " seems to have been changed. Attempt to refresh the application?")) {
refresh();
}
return;
}
onRequestSuccess(content);
};
}
request(asset.uri, isShared, onSuccess, onFailure);
}
function onMessage(e) {
var data = e.data,
sourceWindow = e.source.window,
i, ln, callback, iframe;
for (i = 0, ln = callbacks.length; i < ln; i++) {
callback = callbacks[i];
iframe = callback.iframe;
if (iframe.contentWindow === sourceWindow) {
callback.callback(data);
doc.body.removeChild(iframe);
callbacks.splice(i, 1);
return;
}
}
}
function patch(content, delta) {
var output = [],
chunk, i, ln;
if (delta.length === 0) {
return content;
}
for (i = 0,ln = delta.length; i < ln; i++) {
chunk = delta[i];
if (typeof chunk === 'number') {
output.push(content.substring(chunk, chunk + delta[++i]));
}
else {
output.push(chunk);
}
}
return output.join('');
}
function log(message) {
if (typeof console != 'undefined') {
(console.error || console.log).call(console, message);
}
}
function store(key, value) {
try {
storage.setItem(key, value);
}
catch (e) {
if (storage && e.code == e.QUOTA_EXCEEDED_ERR && activeManifest) {
log("LocalStorage Quota exceeded, cannot store " + key + " locally");
// Quota exceeded, clean up unused items
// var items = activeManifest.assets.map(function(asset) {
// return asset.key;
// }),
// i = 0,
// ln = storage.length,
// cleaned = false,
// item;
//
// items.push(activeManifest.key);
//
// while (i <= ln - 1) {
// item = storage.key(i);
//
// if (items.indexOf(item) == -1) {
// storage.removeItem(item);
// cleaned = true;
// ln--;
// }
// else {
// i++;
// }
// }
// Done cleaning up, attempt to store the value again
// If there's still not enough space, no other choice
// but to skip this item from being stored
// if (cleaned) {
// store(key, value);
// }
}
}
}
function retrieve(key) {
try {
return storage.getItem(key);
}
catch (e) {
// Private browsing mode
return null;
}
}
function retrieveAsset(asset) {
return retrieve(asset.key);
}
function storeAsset(asset, content) {
return store(asset.key, content);
}
function refresh() {
if (!isRefreshing) {
isRefreshing = true;
requestXhr(manifestFile, function(content) {
new Manifest(content).store();
global.location.reload();
});
}
}
function blink(currentManifest) {
var currentAssets = currentManifest.assets,
assetsCount = currentAssets.length,
newManifest;
activeManifest = currentManifest;
addWindowListener('message', onMessage, false);
function onAssetReady(asset, content) {
var assets = asset.collection,
index = asset.index,
ln = assets.length,
i;
asset.ready = true;
asset.content = content;
for (i = index - 1; i >= 0; i--) {
asset = assets[i];
if (!asset.filtered && (!asset.ready || !asset.evaluated)) {
return;
}
}
for (i = index; i < ln; i++) {
asset = assets[i];
if (asset.ready) {
if (!asset.evaluated) {
evaluateAsset(asset);
}
}
else {
return;
}
}
}
function evaluateAsset(asset) {
asset.evaluated = true;
if (asset.type == 'js') {
try {
eval(asset.content);
}
catch (e) {
log("Error evaluating " + asset.uri + " with message: " + e);
}
}
else {
var style = doc.createElement('style'),
base;
style.type = 'text/css';
style.textContent = asset.content;
if ('id' in asset) {
style.id = asset.id;
}
if ('disabled' in asset) {
style.disabled = asset.disabled;
}
base = document.createElement('base');
base.href = asset.path.replace(/\/[^\/]*$/, '/');
head.appendChild(base);
head.appendChild(style);
head.removeChild(base);
}
delete asset.content;
if (--assetsCount == 0) {
onReady();
}
}
function onReady() {
var updatingAssets = [],
appCacheReady = false,
onAppCacheIdle = function() {},
onAppCacheReady = function() {
appCache.swapCache();
appCacheReady = true;
onAppCacheIdle();
},
updatingCount;
removeWindowListener('message', onMessage, false);
if (appCache.status == appCache.UPDATEREADY) {
onAppCacheReady();
}
else if (appCache.status == appCache.CHECKING || appCache.status == appCache.DOWNLOADING) {
appCache.onupdateready = onAppCacheReady;
appCache.onnoupdate = appCache.onobsolete = function() {
onAppCacheIdle();
};
}
function notifyUpdateIfAppCacheReady() {
if (appCacheReady) {
notifyUpdate();
}
}
function notifyUpdate() {
var updatedCallback = Ext.onUpdated || emptyFn;
if ('onSetup' in Ext) {
Ext.onSetup(updatedCallback);
}
else {
updatedCallback();
}
}
function doUpdate() {
newManifest.store();
updatingAssets.forEach(function(asset) {
storeAsset(asset, asset.content);
});
notifyUpdate();
}
function onAssetUpdated(asset, content) {
asset.content = content;
if (--updatingCount == 0) {
if (appCache.status == appCache.IDLE) {
doUpdate();
}
else {
onAppCacheIdle = doUpdate;
}
}
}
function checkForUpdate() {
removeWindowListener('online', checkForUpdate, false);
requestXhr(manifestFile, function(manifestContent) {
activeManifest = newManifest = new Manifest(manifestContent);
var assets = newManifest.assets,
currentAsset;
assets.forEach(function(asset) {
currentAsset = currentManifest.getAsset(asset.uri);
if (!currentAsset || asset.version !== currentAsset.version) {
updatingAssets.push(asset);
}
});
updatingCount = updatingAssets.length;
if (updatingCount == 0) {
if (appCache.status == appCache.IDLE) {
notifyUpdateIfAppCacheReady();
}
else {
onAppCacheIdle = notifyUpdateIfAppCacheReady;
}
return;
}
updatingAssets.forEach(function(asset) {
var currentAsset = currentManifest.getAsset(asset.uri),
path = asset.path,
update = asset.update;
function updateFull() {
requestAsset(asset, function(content) {
onAssetUpdated(asset, content);
});
}
// New asset (never used before)
// OR Shared from CDN
// OR Missing local storage
// OR Full update
if (!currentAsset || !update || retrieveAsset(asset) === null || update != 'delta') {
updateFull();
}
else {
requestXhr('deltas/' + path + '/' + currentAsset.version + '.json',
function(content) {
try {
onAssetUpdated(asset, patch(retrieveAsset(asset), jsonParse(content)));
}
catch (e) {
log("Malformed delta content received for " + asset.uri);
}
},
updateFull
);
}
})
});
}
if (navigator.onLine !== false) {
checkForUpdate();
}
else {
addWindowListener('online', checkForUpdate, false);
}
}
if (assetsCount == 0) {
onReady();
return;
}
currentAssets.forEach(function(asset) {
var content = retrieveAsset(asset);
if (content === null) {
requestAsset(asset, function(content) {
if (!asset.remote) {
storeAsset(asset, content);
}
onAssetReady(asset, content);
}, function() {
onAssetReady(asset, '');
});
}
else {
onAssetReady(asset, content);
}
});
}
function blinkOnDomReady(manifest) {
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
var msViewportStyle = document.createElement("style");
msViewportStyle.appendChild(
document.createTextNode(
"@media screen and (orientation: portrait) {" +
"@-ms-viewport {width: 320px !important;}" +
"}" +
"@media screen and (orientation: landscape) {" +
"@-ms-viewport {width: 560px !important;}" +
"}"
)
);
document.getElementsByTagName("head")[0].appendChild(msViewportStyle);
}
var readyStateRe = (/MSIE 10/.test(navigator.userAgent)) ? /complete|loaded/ : /interactive|complete|loaded/;
if (doc.readyState.match(readyStateRe) !== null) {
blink(manifest);
}
else {
addWindowListener('DOMContentLoaded', function() {
if (navigator.standalone) {
// When running from Home Screen, the splash screen will not disappear until all
// external resource requests finish.
// The first timeout clears the splash screen
// The second timeout allows inital HTML content to be displayed
setTimeout(function() {
setTimeout(function() {
blink(manifest);
}, 1);
}, 1);
}
else {
setTimeout(function() {
blink(manifest);
}, 1);
}
}, false);
}
}
Ext.blink = function(manifest) {
var manifestContent = retrieve(getManifestStorageKey(manifest.id));
addMeta('viewport', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no');
addMeta('apple-mobile-web-app-capable', 'yes');
addMeta('apple-touch-fullscreen', 'yes');
if (manifestContent) {
manifest = new Manifest(manifestContent);
blinkOnDomReady(manifest);
}
else {
requestXhr(manifestFile, function(content) {
manifest = new Manifest(content);
manifest.store();
blinkOnDomReady(manifest);
});
}
};
})(this);

View File

@@ -0,0 +1,177 @@
/**
* Sencha Blink - Testing
* @author Jacky Nguyen <jacky@sencha.com>
*/
(function(global) {
var head = global.document.head,
Ext = global.Ext;
if (typeof Ext == 'undefined') {
global.Ext = Ext = {};
}
function write(content) {
document.write(content);
}
function addMeta(name, content) {
var meta = document.createElement('meta');
meta.setAttribute('name', name);
meta.setAttribute('content', content);
head.appendChild(meta);
}
Ext.blink = function(options) {
var scripts = options.js || [],
styleSheets = options.css || [],
i, ln, path, platform, theme;
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
var msViewportStyle = document.createElement("style");
msViewportStyle.appendChild(
document.createTextNode(
"@media screen and (orientation: portrait) {" +
"@-ms-viewport {width: 320px !important;}" +
"}" +
"@media screen and (orientation: landscape) {" +
"@-ms-viewport {width: 560px !important;}" +
"}"
)
);
document.getElementsByTagName("head")[0].appendChild(msViewportStyle);
}
addMeta('viewport', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no');
addMeta('apple-mobile-web-app-capable', 'yes');
addMeta('apple-touch-fullscreen', 'yes');
Ext.microloaded = true;
var filterPlatform = window.Ext.filterPlatform = function(platform) {
var profileMatch = false,
ua = navigator.userAgent,
j, jln, exclude;
platform = [].concat(platform);
function isPhone(ua) {
var isMobile = /Mobile(\/|\s)/.test(ua);
// Either:
// - iOS but not iPad
// - Android 2
// - Android with "Mobile" in the UA
return /(iPhone|iPod)/.test(ua) ||
(!/(Silk)/.test(ua) && (/(Android)/.test(ua) && (/(Android 2)/.test(ua) || isMobile))) ||
(/(BlackBerry|BB)/.test(ua) && isMobile) ||
/(Windows Phone)/.test(ua);
}
function isTablet(ua) {
return !isPhone(ua) && (/iPad/.test(ua) || /Android|Silk/.test(ua) || /(RIM Tablet OS)/.test(ua) ||
(/MSIE 10/.test(ua) && /; Touch/.test(ua)));
}
// Check if the ?platform parameter is set in the URL
var paramsString = window.location.search.substr(1),
paramsArray = paramsString.split("&"),
params = {},
testPlatform, i;
for (i = 0; i < paramsArray.length; i++) {
var tmpArray = paramsArray[i].split("=");
params[tmpArray[0]] = tmpArray[1];
}
testPlatform = params.platform;
if (testPlatform) {
return platform.indexOf(testPlatform) != -1;
}
for (j = 0, jln = platform.length; j < jln; j++) {
switch (platform[j]) {
case 'phone':
profileMatch = isPhone(ua);
break;
case 'tablet':
profileMatch = isTablet(ua);
break;
case 'desktop':
profileMatch = !isPhone(ua) && !isTablet(ua);
break;
case 'ios':
profileMatch = /(iPad|iPhone|iPod)/.test(ua);
break;
case 'android':
profileMatch = /(Android|Silk)/.test(ua);
break;
case 'blackberry':
profileMatch = /(BlackBerry|BB)/.test(ua);
break;
case 'safari':
profileMatch = /Safari/.test(ua) && !(/(BlackBerry|BB)/.test(ua));
break;
case 'chrome':
profileMatch = /Chrome/.test(ua);
break;
case 'ie10':
profileMatch = /MSIE 10/.test(ua);
break;
case 'windows':
profileMatch = /MSIE 10/.test(ua) || /Trident/.test(ua);
break;
case 'tizen':
profileMatch = /Tizen/.test(ua);
break;
case 'firefox':
profileMatch = /Firefox/.test(ua);
}
if (profileMatch) {
return true;
}
}
return false;
};
for (i = 0,ln = styleSheets.length; i < ln; i++) {
path = styleSheets[i];
if (typeof path != 'string') {
platform = path.platform;
exclude = path.exclude;
theme = path.theme;
path = path.path;
}
if (platform) {
if (!filterPlatform(platform) || filterPlatform(exclude)) {
continue;
}
Ext.theme = {
name: theme || 'Default'
};
}
write('<link rel="stylesheet" href="'+path+'">');
}
for (i = 0,ln = scripts.length; i < ln; i++) {
path = scripts[i];
if (typeof path != 'string') {
platform = path.platform;
exclude = path.exclude;
path = path.path;
}
if (platform) {
if (!filterPlatform(platform) || filterPlatform(exclude)) {
continue;
}
}
write('<script src="'+path+'"></'+'script>');
}
}
})(this);

View File

@@ -0,0 +1,19 @@
# =============================================================================
# This file provides an override point for default variables defined in
# build.properties and defaults.properties.
#
# IMPORTANT - Sencha Cmd will merge your changes with its own during upgrades.
# To avoid potential merge conflicts avoid making large, sweeping changes to
# this file.
# =============================================================================
# enable yui compression
build.compression.yui=1
enable.standalone.manifest=true
build.options=${build.options.debug.disable},${build.options.logger.disable},${build.options.default}
app.microloader.name=testing.js
skip.native-package=false
build.dir=${app.phonegap.www.dir}

View File

@@ -0,0 +1,15 @@
# =============================================================================
# This file provides an override point for default variables defined in
# build.properties and defaults.properties.
#
# IMPORTANT - Sencha Cmd will merge your changes with its own during upgrades.
# To avoid potential merge conflicts avoid making large, sweeping changes to
# this file.
# =============================================================================
# enable yui compression
build.compression.yui=1
build.options=${build.options.debug.disable},${build.options.logger.disable},${build.options.default}
app.microloader.name=testing.js

View File

@@ -0,0 +1,127 @@
<project name="packager-impl">
<macrodef name="x-run-mobile-packager">
<attribute name="configfile"/>
<attribute name="action"/>
<sequential>
<echo>Running mobile packager action @{action} on file @{configFile}</echo>
<x-sencha-command dir="${app.dir}" inheritall="true">
<![CDATA[
app
package
@{action}
-path=@{configfile}
]]>
</x-sencha-command>
</sequential>
</macrodef>
<macrodef name="x-run-mobile-packager-config">
<attribute name="config"/>
<attribute name="run" default="${args.autorun}"/>
<sequential>
<if>
<not>
<available file="@{config}"/>
</not>
<then>
<!--
if the input packager config file for stbuild is
not available, then create it
-->
<echo><![CDATA[
Creating default mobile packager config file at :
@{config}
]]></echo>
<x-run-mobile-packager
configfile="@{config}"
action="generate"/>
</then>
</if>
<local name="local.build.mobile.out.dir"/>
<local name="local.build.mobile.config.name"/>
<!--
append the current config file name to the output directory
for mobile packages. this allows multiple config outputs to
be sandboxed by the name of the config file in the mobile
package output directory.
-->
<basename file="@{config}" property="local.build.mobile.config.name"/>
<property name="local.build.mobile.out.dir"
value="${build.mobile.packager.out.dir}/${local.build.mobile.config.name}"/>
<!--
duplicate the config file, so that we can set the
input and output properties w/o losing comment blocks
-->
<x-set-json-property file="@{config}"
tofile="${build.mobile.packager.temp.file}">
<property name="inputPath"
value="${build.mobile.packager.in.dir}"/>
<property name="outputPath"
value="${local.build.mobile.out.dir}"/>
</x-set-json-property>
<echo><![CDATA[
Processing Mobile Packager config file
config: @{config}
inputPath: ${build.mobile.packager.in.dir}
outputPath: ${local.build.mobile.out.dir}
]]></echo>
<local name="mobile.packager.platform"/>
<x-load-properties file="${build.mobile.packager.temp.file}"
prefix="mobile.packager"
required="true"/>
<if>
<contains string="${mobile.packager.platform}" substring="iOS"/>
<then>
<copy todir="${build.dir}">
<fileset dir="${app.dir}/resources/icons" includes="**/*"/>
<fileset dir="${app.dir}/resources/loading" includes="**/*"/>
</copy>
</then>
</if>
<local name="build.mobile.action"/>
<condition property="build.mobile.action" value="run">
<x-is-true value="@{run}"/>
</condition>
<property name="build.mobile.action" value="build"/>
<x-run-mobile-packager
configFile="${build.mobile.packager.temp.file}"
action="${build.mobile.action}"/>
</sequential>
</macrodef>
<target name="-native-package-mobile">
<if>
<x-is-true value="${args.autorun}"/>
<then>
<echo>Running default mobile packager config.</echo>
<x-run-mobile-packager-config config="${build.mobile.packager.default.file}"
run="true"/>
</then>
<else>
<echo>Building all specified mobile packager configs.</echo>
<for param="configfile" list="${build.mobile.packager.file}">
<sequential>
<x-run-mobile-packager-config config="@{configfile}" run="false"/>
</sequential>
</for>
</else>
</if>
</target>
<target name="-before-native-package"/>
<target name="-native-package"
depends="-native-package-mobile">
</target>
<target name="-after-native-package"/>
</project>

182
.sencha/app/page-impl.xml Normal file
View File

@@ -0,0 +1,182 @@
<project name="page-impl.xml">
<target name="-build-output-microload-page">
<if>
<x-is-true value="${build.enable.embedded.manifest}"/>
<then>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
# generate microloader file
microload
-operation=microloader
-microloaderPath=${app.microloader.path}
-tpl=${build.microloader.code.tpl}
-out=${build.microloader.path}
and
# generate json file
microload
-operation=json
-append
-tpl=${build.microloader.json.tpl.embedded}
-out=${build.microloader.path}
]]>
</x-compile>
</then>
<else>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
# generate json file
microload
-operation=json
-tpl=${build.microloader.json.tpl.standalone}
-out=${build.out.json.path}
and
# generate microloader file
microload
-operation=microloader
-microloaderPath=${app.microloader.path}
-tpl=${build.microloader.code.tpl}
-out=${build.microloader.path}
and
microload
-operation=json
-append
-tpl=${build.microloader.json.tpl.external}
-out=${build.microloader.path}
]]>
</x-compile>
</else>
</if>
<if>
<x-is-true value="${build.enable.embedded.microloader}"/>
<then>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
markup
-contentFile=${build.microloader.path}
-tpl=${build.embedded.microloader.tpl}
-out=${build.out.page.path}
]]>
</x-compile>
<!--once the generated microloader file is embedded, delete it-->
<delete file="${build.microloader.path}"/>
</then>
<else>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
markup
-markup=${build.external.microloader.markup}
-out=${build.out.page.path}
]]>
</x-compile>
</else>
</if>
</target>
<!-- generates a separate json manifest for use with native packager -->
<target name="-build-standalone-json-manifest">
<x-run-if-true value="${enable.standalone.manifest}">
<x-compile refid="${compiler.ref.id}">
<![CDATA[
# generate json file
microload
-operation=json
-tpl=${build.microloader.json.tpl.standalone}
-out=${build.out.json.path}
]]>
</x-compile>
</x-run-if-true>
</target>
<target name="-build-output-markup-page">
<condition property="internal.app.css.rel" value="${app.out.css.rel}">
<x-is-true value="${enable.ext42.themes}"/>
</condition>
<property name="internal.app.css.rel" value=""/>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
markup
-out=${build.out.page.path}
]]>
</x-compile>
</target>
<!-- '-detect-app-build-properties' is defined in js-impl.xml -->
<target name="-build-output-page"
depends="-detect-app-build-properties,-build-standalone-json-manifest">
<if>
<x-is-true value="${build.output.markuponly}"/>
<then>
<x-ant-call target="-build-output-markup-page"/>
</then>
<else>
<x-ant-call target="-build-output-microload-page"/>
</else>
</if>
</target>
<target name="-copy-app-resources" depends="-init-compiler">
<if>
<x-is-false value="${build.output.markuponly}"/>
<then>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
app-resources
-compress=${enable.resource.compression}
-out=${build.dir}
]]>
</x-compile>
</then>
</if>
</target>
<target name="-generate-deltas" depends="-init-compiler">
<if>
<and>
<x-is-true value="${enable.deltas}"/>
<x-is-false value="${build.output.markuponly}"/>
</and>
<then>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
deltas
-archivePath=${build.out.archive.path}
-deltaPath=${build.out.delta.path}
-resourcePath=${build.dir}
]]>
</x-compile>
</then>
</if>
</target>
<target name="-generate-cache-manifest" depends="-init-compiler">
<if>
<and>
<x-is-true value="${enable.cache.manifest}"/>
<x-is-false value="${build.output.markuponly}"/>
</and>
<then>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
cache-manifest
-cacheManifestPath=${build.manifest.path}
]]>
</x-compile>
<replace file="${build.out.page.path}"
token="&lt;html manifest=&quot;&quot;"
value="&lt;html manifest=&quot;${build.manifest.name}&quot;"/>
</then>
</if>
</target>
<target name="-before-page"/>
<target name="-page"
depends="-copy-app-resources,
-generate-deltas,
-build-output-page,
-generate-cache-manifest"/>
<target name="-after-page"/>
</project>

View File

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="PhoneGap">
<!-- ////////////// -->
<!-- Public Targets -->
<!-- ////////////// -->
<target name="PhoneGap + Sencha - Build" description="Builds the Application and the PhoneGap Native Platform"
depends="phonegap-sencha-build"/>
<target name="PhoneGap + Sencha - Run" description="Builds the Application and the PhoneGap Native app then runs it"
depends="phonegap-sencha-run"/>
<target name="Build" description="Builds the application without building the Sencha app"
depends="phonegap-build"/>
<target name="Run" description="Runs the Native Application without building the Sencha app"
depends="phonegap-run"/>
<target name="Clean"
description="Cleans the General PhoneGap WWW Folder"
depends="phonegap-clean"/>
<target name="phonegap-sencha-build" depends="native, build"/>
<target name="phonegap-sencha-run" depends="native, -autorun, build"/>
<!--Init for All PhoneGap Tasks-->
<target name="-before-phonegap-init"/>
<target name="-phonegap-init">
<property name="phonegap.local.properties" value="${app.dir}/phonegap.local.properties"/>
<property file="${phonegap.local.properties}"/>
</target>
<target name="-after-phonegap-init"/>
<target name="phonegap-init"
depends="init, -before-phonegap-init, -phonegap-init, -after-phonegap-init"/>
<!-- Clean target for the Phonegap WWW directory -->
<target name="-before-phonegap-clean"/>
<target name="-phonegap-clean">
<delete includeemptydirs="true">
<fileset dir="${app.phonegap.www.dir}" includes="**/*"/>
</delete>
</target>
<target name="-after-phonegap-clean"/>
<target name="phonegap-clean" depends="phonegap-init, -before-phonegap-clean, -phonegap-clean, -after-phonegap-clean "/>
<!-- Copies a build folder into the Phonegap WWW Folder. Used for Native bulding command -->
<target name="-before-phonegap-copy-build"/>
<target name="-phonegap-copy-build">
<if>
<not>
<equals arg1="${build.dir}" arg2="${app.phonegap.www.dir}"/>
</not>
<then>
<copy todir="${app.phonegap.www.dir}" failonerror="false" quiet="true">
<fileset dir="${build.dir}">
<include name="**/*"/>
</fileset>
</copy>
</then>
</if>
</target>
<target name="-after-phonegap-copy-build"/>
<target name="phonegap-copy-build" depends="phonegap-init">
<x-ant-call unless="skip.phonegap-copy-build">
<target name="-before-phonegap-copy-build"/>
<target name="-phonegap-copy-build"/>
<target name="-after-phonegap-copy-build"/>
</x-ant-call>
</target>
<target name="-before-phonegap"/>
<target name="-after-phonegap"/>
<!-- Overall Phonegap Build Target. Determines type of build to use -->
<target name="-before-phonegap-build"/>
<target name="-phonegap-build" depends="phonegap-init, phonegap-copy-build">
<if>
<x-is-false value="${args.autorun}"/>
<then>
<if>
<x-is-true value="${phonegap.build.remote}"/>
<then>
<x-ant-call target="-phonegap-remote-build"/>
</then>
<else>
<x-ant-call target="-phonegap-local-build"/>
</else>
</if>
</then>
</if>
</target>
<target name="-after-phonegap-build"/>
<target name="phonegap-build" depends="phonegap-init, -before-phonegap, -before-phonegap-build, -phonegap-build, -after-phonegap-build, -after-phonegap" />
<target name="-before-phonegap-run"/>
<target name="-phonegap-run" depends="phonegap-init, phonegap-copy-build">
<if>
<x-is-true value="${args.autorun}"/>
<then>
<if>
<x-is-true value="${phonegap.build.remote}"/>
<then>
<x-ant-call target="-phonegap-remote-run"/>
</then>
<else>
<x-ant-call target="-phonegap-local-run"/>
</else>
</if>
</then>
</if>
</target>
<target name="-after-phonegap-run"/>
<target name="phonegap-run" depends="phonegap-init, -autorun, -before-phonegap, -before-phonegap-run, -phonegap-run, -after-phonegap-run, -after-phonegap" />
<!-- Remote BUILD TARGETS -->
<target name="-phonegap-remote-login">
<x-shell reloadprofile="true" dir="${app.phonegap.dir}">
phonegap remote login --username="${phonegap.build.remote.username}" --password="${phonegap.build.remote.password}"
</x-shell>
</target>
<target name="-phonegap-remote-build" depends="-phonegap-remote-login">
<x-shell reloadprofile="true" dir="${app.phonegap.dir}">
phonegap remote build ${phonegap.platform}
</x-shell>
</target>
<target name="-phonegap-remote-run" depends="-phonegap-remote-login">
<x-shell reloadprofile="true" dir="${app.phonegap.dir}">
phonegap remote run ${phonegap.platform}
</x-shell>
</target>
<!-- LOCAL BUILD TARGETS -->
<target name="-phonegap-local-build">
<x-shell reloadprofile="true" dir="${app.phonegap.dir}">
phonegap local build ${phonegap.platform}
</x-shell>
</target>
<target name="-phonegap-local-run">
<x-shell reloadprofile="true" dir="${app.phonegap.dir}">
phonegap local run ${phonegap.platform}
</x-shell>
</target>
<target name="-before-native-package"/>
<target name="-native-package" depends="phonegap-init, -before-phonegap, -phonegap-build, -phonegap-run, -after-phonegap"/>
<target name="-after-native-package"/>
<!-- Utility Target for specifing autorun -->
<target name="-autorun">
<property name="args.autorun" value="true"/>
</target>
</project>

32
.sencha/app/plugin.xml Normal file
View File

@@ -0,0 +1,32 @@
<project basedir=".">
<!--
This file can be freely edited, so long as the <import file="plugin-impl.xml"/>
statement is not removed.
One of the purposes of this file is to hook various Sencha Command operations and do
processing before or after the command is processed. To do this, simply provide the
logic in a <target> using one of these names:
-before-generate-app Called before an application is generated
-after-generate-app Called after an application is generated
-before-generate-controller Called before a controller is generated
-after-generate-controller Called after a controller is generated
-before-generate-model Called before a model is generated
-after-generate-model Called after a model is generated
-before-generate-profile Called before a profile is generated
-after-generate-profile Called after a profile is generated
-->
<import file="${workspace.config.dir}/plugin.xml"/>
<!--
<target name="-after-generate-model">
... use ${args.path}, ${args.name} and ${args.fields} as needed ...
</target>
Other targets are similar. There are properties prefixed with "args." and the name of
the command line option that hold the parameters for the command.
-->
</project>

View File

@@ -0,0 +1,17 @@
# =============================================================================
# This file provides an override point for default variables defined in
# build.properties and defaults.properties.
#
# IMPORTANT - Sencha Cmd will merge your changes with its own during upgrades.
# To avoid potential merge conflicts avoid making large, sweeping changes to
# this file.
# =============================================================================
enable.deltas=true
enable.cache.manifest=true
enable.resource.compression=true
build.enable.embedded.manifest=false
build.options=${build.options.debug.disable},${build.options.logger.disable},${build.options.default}
app.microloader.name=production.js

View File

@@ -0,0 +1,152 @@
<project name="refresh-impl">
<!--
This macrodef regenerates the bootstrap.js class system metadata, which includes
relative file paths, class names, alternate class names, and class alias data
-->
<macrodef name="x-run-bootstrap">
<attribute name="file"/>
<attribute name="basedir"/>
<attribute name="appendMicroloader" default="false"/>
<sequential>
<local name="tag.filter"/>
<local name="ux.include"/>
<local name="load.script.tpl"/>
<condition property="tag.filter" value="package-sencha-core,core">
<x-is-true value="${enable.sencha-core.filter}"/>
</condition>
<property name="tag.filter" value="core"/>
<if>
<equals arg1="${framework.name}" arg2="ext"/>
<then>
<property name="ux.include">
include
-namespace=Ext.ux
and
</property>
<property name="load.script.tpl" value="Ext.Loader.loadScript(&quot;{0}&quot;);"/>
</then>
<else>
<property name="ux.include" value=""/>
<property name="load.script.tpl" value="Ext.Loader.loadScriptFile(&quot;{0}&quot;, Ext.emptyFn);"/>
</else>
</if>
<echo file="@{file}">
/**
* This file is generated by Sencha Cmd and should NOT be edited. It is
* provided to support globbing requires, custom xtypes, and other
* metadata-driven class system features
*/
</echo>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
union
-not
-tag=${tag.filter}
and
metadata
+append
-base-path=@{basedir}
+loader-paths
-jsonp=Ext.Loader.addClassPathMappings
-out=@{file}
and
exclude
-tag=${tag.filter}
and
${ux.include}
metadata
+append
-base-path=@{basedir}
+alternates
-out=@{file}
and
metadata
+append
-base-path=@{basedir}
+alias
-out=@{file}
and
meta
+append
+packages
-out=@{file}
and
union
-tag=overrides
and
metadata
-base-path=@{basedir}
+append
+filenames
-tpl=${load.script.tpl};
-out=@{file}
]]>
</x-compile>
</sequential>
</macrodef>
<!--
Refreshes the application's bootstrap javascript and microloader manifest
'-detect-app-build-properties' is defined in js-impl.xml
-->
<target name="-refresh-app" depends="-detect-app-build-properties">
<!--regenerate class system metadata-->
<x-run-bootstrap file="${app.bootstrap.js}"
basedir="${app.bootstrap.base.path}"/>
<!--regenerate json manifest bootstrap data-->
<if>
<equals arg1="${app.page.mode}" arg2="xcompile"/>
<then>
<!--
append the microloader and manifest to the end
of bootstrap.js
-->
<x-compile refid="${compiler.ref.id}">
<![CDATA[
microload
-operation=microloader
-microloaderPath=${app.microloader.bootstrap}
-append
-out=${app.bootstrap.js}
]]>
</x-compile>
</then>
</if>
<!--
create / overwrite bootstrap.json, which will be used
by the default development.js microloader
-->
<echo file="${build.json.bootstrap.path}">
/**
* This file is generated by Sencha Cmd and should NOT be edited. It is a
* combination of content from app.json, and all required package's package.json
* files. Customizations should be placed in app.json.
*/
</echo>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
microload
-operation=json
-bootstrap
-append
-tpl={0}
-out=${build.json.bootstrap.path}
]]>
</x-compile>
</target>
<!--
Refresh app
-->
<target name="-before-refresh"/>
<target name="-refresh" depends="-refresh-app"/>
<target name="-after-refresh"/>
</project>

View File

@@ -0,0 +1,83 @@
<project name="resolve-impl">
<target name="-before-web-start"/>
<target name="-web-start">
<property name="enable.background.server" value="false"/>
<x-sencha-command>
<![CDATA[
fs
web
-port=${build.web.port}
-background=${enable.background.server}
start
-map=${build.web.root}
]]>
</x-sencha-command>
</target>
<target name="-after-web-start"/>
<target name="web-start"
depends="-init,-before-web-start,-web-start,-after-web-start"/>
<target name="-before-web-stop"/>
<target name="-web-stop">
<!--
This needs to be in it's own process due to threading issues when called from a
target.
-->
<x-shell dir="${app.dir}">
${cmd.dir}/sencha fs web -port ${build.web.port} stop
</x-shell>
</target>
<target name="-after-web-stop"/>
<target name="web-stop"
depends="-init,-before-web-stop,-web-stop,-after-web-stop"/>
<target name="-resolve-impl" depends="-refresh">
<x-ant-call target="web-start" unless="skip.web.start">
<param name="enable.background.server" value="true"/>
</x-ant-call>
<local name="app.relative.url"/>
<local name="build.resolve.relative.url"/>
<!--calculate the relative path from the web root to the index page-->
<x-get-relative-path from="${build.web.root}"
to="${app.page.file}"
property="app.relative.url"/>
<property name="build.resolve.relative.url"
value="${build.resolve.url}/${app.relative.url}"/>
<x-sencha-command dir="${app.dir}" inheritall="true">
<![CDATA[
app
resolve
-mode=${build.resolve.mode}
-uri=${build.resolve.relative.url}
-tpl=${build.resolve.tpl}
-out=${build.resolve.file}
]]>
</x-sencha-command>
<x-ant-call target="web-stop" unless="skip.web.start"/>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
restore
page
and
load-refs
-file=${build.resolve.file}
-defaultSrcName=@${build.tag.name}
-allowUnmatched=${build.resolve.allow.unmatched}
and
save
page
]]>
</x-compile>
</target>
<target name="-before-resolve"/>
<target name="-resolve">
<x-ant-call target="-resolve-impl"/>
</target>
<target name="-after-resolve"/>
</project>

View File

@@ -0,0 +1,22 @@
<project name="resources-impl">
<target name="-before-inherit-resources"/>
<target name="-before-copy-resources"/>
<!--'-init-compiler' defined in init-impl.xml-->
<target name="-compile-resources" depends="-init-compiler">
<x-compile refid="${compiler.ref.id}">
<![CDATA[
resources
-excludes=-all*.css
-out=${build.resources.dir}
and
resources
-model=true
-out=${build.dir}
]]>
</x-compile>
</target>
<target name="-after-copy-resources"/>
<target name="-after-inherit-resources"/>
</project>

222
.sencha/app/sass-impl.xml Normal file
View File

@@ -0,0 +1,222 @@
<project name="sass-impl">
<!--
Uses the compiler to generate the top-level scss file for the app
by using the current set of js files to determine the Components
used by the app, then including the corresponding scss files into the
app's style
-->
<target name="-compile-sass" depends="-init-compiler">
<x-normalize-path
path="${build.dir}/resources"
property="image.search.path"/>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
restore
page
and
#only set variables for used classes eg. $include-class-name
sass
+class-name-vars
-variable=$image-search-path:'${image.search.path}'
-variable=$theme-name: '${app.theme}' !default
-output=${app.out.scss}
and
include
-all
and
# include etc and vars from all classes
sass
+etc
+vars
+append
-output=${app.out.scss}
and
restore
page
and
#only include rules from used classes
sass
+rules
+append
-output=${app.out.scss}
and
sass
+ruby
-output=${app.out.ruby}
]]>
</x-compile>
<!--
app.out.css.path is relative to the app output index.html file
-->
<x-get-relative-path
from="${app.dir}"
to="${app.out.css}"
property="app.out.css.path"
/>
<!--update the application's bootstrap.css file to point to the build output-->
<echo file="${app.bootstrap.css}">
<![CDATA[
/*
* This file is generated by Sencha Cmd and should NOT be edited. It redirects
* to the most recently built CSS file for the application to allow index.html
* in the development directory to load properly (i.e., "dev mode").
*/
@import '${app.out.css.path}';
]]>
</echo>
</target>
<!--
This macrodef is used for post-processing Ext JS 4.2+ style theme css files
and will split based on selector thresholds, as well as run the css preprocessor
and compressor
-->
<macrodef name="x-compress-css-files">
<attribute name="dir"/>
<attribute name="prefix"/>
<attribute name="outprefix"/>
<attribute name="compress"/>
<attribute name="preprocess"/>
<sequential>
<x-split-css file="@{dir}/@{prefix}.css"
outdir="${build.resources.dir}"
limit="${build.css.selector.limit}"/>
<for param="cssfile">
<fileset dir="@{dir}" includes="@{prefix}*.css"/>
<sequential>
<local name="css.output.name"/>
<local name="pattern"/>
<property name="pattern" value="(.*?)(@{prefix})(_\d{1,2})*\.css"/>
<propertyregex property="css.output.name"
input="@{cssfile}"
regexp="${pattern}"
select="\1@{outprefix}\3.css"
override="true"/>
<if>
<equals arg1="@{preprocess}" arg2="true"/>
<then>
<echo>Preprocessing @{cssfile} to ${css.output.name}</echo>
<x-css-preprocess
file="@{cssfile}"
tofile="${css.output.name}"
options="${build.css.preprocessor.opts}"/>
</then>
</if>
<if>
<equals arg1="@{compress}" arg2="true"/>
<then>
<echo>Compressing @{cssfile} to ${css.output.name}</echo>
<x-compress-css srcfile="@{cssfile}"
outfile="${css.output.name}"/>
</then>
</if>
</sequential>
</for>
</sequential>
</macrodef>
<!--
This target builds Ext JS 4.2+ style themes, first generating the top-level
scss file, then running compass with the css, sass, and config options set
-->
<target name="-compass-compile-theme-package">
<x-run-if-true value="${enable.ext42.themes}">
<x-ant-call target="-compile-sass"/>
<x-compass-compile
dir="${build.dir}"
trace="${compass.comiple.trace}"
boring="${compass.compile.boring}"
force="${compass.compile.force}"
sassdir="${compass.sass.dir}"
cssdir="${compass.css.dir}"
config="${compass.config.file}"/>
<x-compress-css-files dir="${build.dir}/resources"
prefix="${app.out.base.debug}"
outprefix="${app.out.base}"
preprocess="${build.css.preprocess}"
compress="${build.css.compress}"/>
</x-run-if-true>
</target>
<!--
This is a legacy macrodef to support building Ext JS 4.1 themes, which have been
deprecated in favor of Ext JS 4.2 theme packages
-->
<macrodef name="x-build-sass">
<attribute name="theme"/>
<sequential>
<local name="sass.name"/>
<local name="use.shell"/>
<!--
convert abspath to just the leaf path name
-->
<basename property="sass.name" file="@{theme}"/>
<local name="sass.base.name"/>
<property name="sass.base.name" value="${sass.name}"/>
<echo>Compiling sass directory : @{theme}/sass</echo>
<x-compass-compile
boring="${compass.compile.boring}"
force="${compass.compile.force}"
trace="${compass.compile.trace}"
dir="@{theme}/sass"/>
<x-compress-css srcfile="${app.dir}/resources/${sass.base.name}/*.css"
outdir="${app.dir}/resources/${sass.base.name}"/>
</sequential>
</macrodef>
<!--
This target builds Ext JS 4.1 style themes, iterating over each directory
under the specified ${app.theme.dir} directory and compiling the sass
located there
-->
<target name="-compass-compile-theme-folders">
<x-run-if-true value="${enable.ext41.themes}">
<!-- run sass compilation over the various themes -->
<for param="sass">
<dirset dir="${app.theme.dir}" includes="*"/>
<sequential>
<x-build-sass theme="@{sass}"/>
</sequential>
</for>
</x-run-if-true>
</target>
<!--
This target builds Touch style themes, by running compass
over the directory containing the manually maintined scss files
-->
<target name="-compass-compile-sass-dir">
<x-run-if-true value="${enable.touch.themes}">
<x-compass-compile
trace="${compass.comiple.trace}"
boring="${compass.compile.boring}"
force="${compass.compile.force}"
dir="${compass.sass.dir}"/>
</x-run-if-true>
</target>
<!--
This is a summation target triggering the three different supported
sass modes (ext 41, ext 42+, and touch).
-->
<target name="-compass-compile"
depends="-compass-compile-theme-package,
-compass-compile-theme-folders,
-compass-compile-sass-dir"/>
<!--
Build SASS
-->
<target name="-before-sass"/>
<target name="-sass" depends="-compass-compile"/>
<target name="-after-sass"/>
</project>

14
.sencha/app/sencha.cfg Normal file
View File

@@ -0,0 +1,14 @@
app.name=DssMobile
app.framework=touch
app.classpath=${app.dir}/app.js,${app.dir}/app
# this property specifies a comma separated list of paths containing
# resources to copy to the build directory
app.resource.paths=
app.build.dir=${workspace.build.dir}/${app.name}
app.framework.version=2.3.0
app.cmd.version=4.0.0.203

236
.sencha/app/slice-impl.xml Normal file
View File

@@ -0,0 +1,236 @@
<project name="slice-impl">
<!--
Uses the compiler to generate a special theme-only scss file containing
rules for all framework / package / app components. This is then used
by the slicer example page to capture theme sprites
-->
<target name="-compile-slicer-sass" depends="-init-compiler">
<x-normalize-path
path="${build.dir}/resources"
property="image.search.path"/>
<x-compile refid="${compiler.ref.id}">
<![CDATA[
restore
page
and
include
-all
and
sass
+class-name-vars
+etc
+vars
+rules
-variable=$image-search-path:'${image.search.path}'
-variable=$theme-name: '${app.theme}' !default
-output=${app.example.scss}
and
restore
page
and
sass
+ruby
-output=${app.example.out.ruby}
]]>
</x-compile>
<x-get-relative-path from="${app.example.dir}"
to="${app.example.css}"
property="app.example.css.path"/>
<!--update the app's example to point to the build output-->
<echo file="${app.example.css.file}">
<![CDATA[
/*
* This file is generated by Sencha Cmd and should NOT be edited. It redirects
* to the most recently built CSS file for the application to allow theme.html
* to load properly for image slicing (required to support non-CSS3 browsers
* such as IE9 and below).
*/
@import '${app.example.css.path}';
]]>
</echo>
</target>
<!--
Compiles the scss file for the theme slicer page
-->
<target name="-compass-compile-slicer-css" depends="-compile-slicer-sass">
<x-compass-compile
dir="${app.example.build.dir}"
trace="${compass.compile.trace}"
boring="${compass.compile.boring}"
force="${compass.compile.force}"
sassdir="${app.example.build.dir}"
cssdir="${app.example.build.dir}"
config="${app.example.compass.config}"/>
</target>
<!--
Generates theme images for Ext JS 4.2+ apps using theme packages
'-detect-app-build-properties' is defined in js-impl.xml
-->
<target name="-slice-app-theme" depends="-detect-app-build-properties">
<x-ant-call target="-compass-compile-slicer-css"/>
<x-run-bootstrap file="${bootstrap.example.js}"
basedir="${bootstrap.base.path}"/>
<echo>Capture theme image to ${build.capture.png}</echo>
<x-sencha-command>
<![CDATA[
theme
capture
-page=${app.example.theme.html}
-image=${build.capture.png}
-manifest=${build.capture.json}
]]>
</x-sencha-command>
<echo>Slicing theme images to ${build.resources.dir}</echo>
<x-sencha-command>
<![CDATA[
fs
slice
${build.slice.options}
-image=${build.capture.png}
-manifest=${build.capture.json}
-out=${build.resources.dir}
]]>
</x-sencha-command>
</target>
<macrodef name="x-build-theme">
<attribute name="theme" description="the path of the theme folder"/>
<attribute name="buildsass" default="false"/>
<attribute name="basetheme" default="default"/>
<sequential>
<local name="theme.name"/>
<local name="framework.theme.dir"/>
<local name="tmp.theme.dir"/>
<local name="tmp.img.dir"/>
<basename property="theme.name" file="@{theme}"/>
<local name="theme.base.name"/>
<property name="theme.base.name" value="${theme.name}"/>
<property name="theme.images.dir" location="@{theme}/images"/>
<property name="theme.page.dir" location="@{theme}/${theme.page.name}"/>
<property name="tmp.res.dir" value="${app.resources.dir}"/>
<property name="tmp.theme.dir" value="${tmp.res.dir}/${theme.base.name}"/>
<property name="tmp.img.dir" value="${tmp.theme.dir}/images"/>
<property name="app.res.dir" location="${app.dir}/packages"/>
<property name="app.img.dir" location="${app.res.dir}/images"/>
<property name="framework.res.dir" location="${framework.dir}/resources"/>
<property name="framework.img.dir" location="${framework.res.dir}/themes/images"/>
<property name="framework.theme.dir" location="${framework.img.dir}/@{basetheme}"/>
<echo>Copying base framework images from ${framework.theme.dir} to ${tmp.img.dir}</echo>
<copy todir="${tmp.img.dir}">
<fileset dir="${framework.theme.dir}" includes="**/*"/>
</copy>
<if>
<equals arg1="@{buildsass}" arg2="true"/>
<then>
<echo>Building sass for theme ${theme.name}</echo>
<!--x-build-sass is defined in sass-impl.xml-->
<x-build-sass theme="@{theme}"/>
</then>
</if>
<echo>Slicing images for theme ${theme.name} to ${tmp.img.dir}</echo>
<x-sencha-command>
<![CDATA[
theme
build
-data-file=${build.capture.json}
-image-file=${build.capture.png}
-page=${theme.page.dir}
-out=${tmp.img.dir}
]]>
</x-sencha-command>
<if>
<available file="${theme.images.dir}"/>
<then>
<echo>Copying user defined images from @{theme}/images to ${tmp.img.dir}</echo>
<copy todir="${tmp.img.dir}">
<fileset dir="${theme.images.dir}" includes="**/*"/>
</copy>
</then>
</if>
</sequential>
</macrodef>
<!--
This is a legacy macrodef for copying resources in theme-directory based themes.
It is provided to support building Ext JS 4.1 app themes
-->
<macrodef name="x-copy-resources">
<sequential>
<copy todir="${build.resources.dir}" includeEmptyDirs="false">
<fileset dir="${app.resources.dir}"
includes="**/*"/>
</copy>
<x-get-relative-path from="${app.dir}"
to="${framework.dir}"
property="framework.rel.path"/>
<copy toDir="${build.dir}/${framework.rel.path}">
<fileset dir="${framework.dir}"
includes="src/ux/**/css/**/*"/>
</copy>
</sequential>
</macrodef>
<!--
Generates theme images for Ext JS 4.1 apps that use directory based
themes. These have been deprecated in favor of ExtJS 4.2 theme packages
-->
<target name="-slice-theme-directories">
<echo>Processing theme directories from ${app.theme.dir}</echo>
<for param="theme">
<dirset dir="${app.theme.dir}" includes="*"/>
<sequential>
<x-build-theme theme="@{theme}"/>
</sequential>
</for>
<x-copy-resources/>
</target>
<target name="-slice-images">
<x-run-if-true value="${enable.ext42.themes}">
<x-ant-call target="-slice-app-theme"/>
</x-run-if-true>
<x-run-if-true value="${enable.ext41.themes}">
<x-ant-call target="-slice-theme-directories"/>
</x-run-if-true>
</target>
<target name="-before-slice"/>
<target name="-slice" depends="-slice-images"/>
<target name="-after-slice"/>
<!--
Refresh Individual Theme
-->
<target name="-before-refresh-theme"/>
<target name="-refresh-theme">
<if>
<x-is-true value="${enable.ext41.themes}"/>
<then>
<local name="theme.dir"/>
<property name="theme.dir" location="${app.theme.dir}/${args.themeName}"/>
<x-build-theme theme="${theme.dir}" buildsass="true"/>
<x-copy-resources/>
</then>
</if>
</target>
<target name="-after-refresh-theme"/>
</project>

View File

@@ -0,0 +1,12 @@
# =============================================================================
# This file provides an override point for default variables defined in
# build.properties and defaults.properties.
#
# IMPORTANT - Sencha Cmd will merge your changes with its own during upgrades.
# To avoid potential merge conflicts avoid making large, sweeping changes to
# this file.
# =============================================================================
build.options=${build.options.debug.enable},${build.options.logger.enable},${build.options.default}
app.microloader.name=testing.js

View File

@@ -0,0 +1,51 @@
<project name="watch-impl">
<target name="-watch-impl">
<x-ant-call target="${build.trigger.targets}"/>
</target>
<target name="-watch-compiler">
<x-watch compilerRef="${compiler.ref.id}" targets="-watch-impl"/>
</target>
<target name="-watch-theme-package-css">
<x-compass-watch
dir="${build.dir}"
trace="${compass.compile.trace}"
boring="${compass.compile.boring}"
force="${compass.compile.force}"
sassdir="${compass.sass.dir}"
cssdir="${compass.css.dir}"
config="${compass.config.file}"
fork="true"/>
</target>
<macrodef name="x-run-compass-watch">
<attribute name="directory"/>
<sequential>
<x-compass-watch
dir="@{directory}"
trace="${compass.compile.trace}"
boring="${compass.compile.boring}"
force="${compass.compile.force}"
fork="true"/>
</sequential>
</macrodef>
<target name="-watch-sass-dir">
<x-run-compass-watch directory="${app.sass.dir}"/>
</target>
<target name="-watch-theme-dir">
<local name="watch.sass.dir"/>
<property name="watch.sass.dir"
value="${app.theme.dir}/${watch.theme.name}/sass"/>
<x-run-compass-watch directory="${watch.sass.dir}"/>
</target>
<target name="-before-watch" depends="init"/>
<target name="-watch" depends="app-build-impl.build">
<x-ant-call target="${build.watcher.targets}"/>
</target>
<target name="-after-watch" depends="init"/>
</project>

View File

@@ -0,0 +1,11 @@
<project basedir=".">
<!--
If framework.config.dir is already set, this next task will do nothing and
the original value will remain... but if framework.config.dir is not yet
defined, we are running in a workspace sans framework and so we need to go
directly to the plugin base from cmd.config.dir instead.
-->
<property name="framework.config.dir" value="${cmd.config.dir}"/>
<import file="${framework.config.dir}/plugin.xml"/>
</project>

View File

@@ -0,0 +1,35 @@
#Fri, 08 Nov 2013 10:39:02 +0000
# -----------------------------------------------------------------------------
# This file contains configuration options that apply to all applications in
# the workspace. By convention, these options start with "workspace." but any
# option can be set here. Options specified in an application's sencha.cfg will
# take priority over those values contained in this file. These options will
# take priority over configuration values in Sencha Cmd or a framework plugin.
# -----------------------------------------------------------------------------
# This configuration property (if set) is included by default in all compile
# commands executed according to this formulation:
#
# sencha compile -classpath=...,${framework.classpath},${workspace.classpath},${app.classpath}
#workspace.classpath=
#------------------------------------------------------------------------------
# This is the folder for build outputs in the workspace
workspace.build.dir=${workspace.dir}/build
#------------------------------------------------------------------------------
# This folder contains all generated and extracted packages.
workspace.packages.dir=${workspace.dir}/packages
workspace.theme.dir=${workspace.packages.dir}/${args.themeName}
# =============================================================================
# Customizations go below this divider to avoid merge conflicts on upgrade
# =============================================================================
workspace.cmd.version=4.0.0.203
touch.dir=${workspace.dir}/touch