This is an automated email from the ASF dual-hosted git repository.
carlosrovira pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/develop by this push:
new 4901f84 left from last committodomvc-jewel-example: persist data in
local storage with SharedObject
4901f84 is described below
commit 4901f8454e4a967ffba3562e947d42888b855e82
Author: Carlos Rovira <[email protected]>
AuthorDate: Thu Jan 30 22:52:59 2020 +0100
left from last committodomvc-jewel-example: persist data in local storage
with SharedObject
---
examples/jewel/todomvc/pom.xml | 15 +++++
.../todomvc/src/main/resources/todomvc-styles.css | 65 +++++++++++++---------
examples/jewel/todomvc/src/main/royale/App.mxml | 22 +++++++-
.../jewel/todomvc/controllers/TodoController.as | 60 ++++++++++++++++----
.../main/royale/jewel/todomvc/models/TodoModel.as | 23 +++++++-
.../royale/jewel/todomvc/views/TodoFooter.mxml | 5 +-
.../royale/jewel/todomvc/views/TodoHeader.mxml | 9 +--
.../jewel/todomvc/views/TodoListSection.mxml | 3 +-
.../src/main/royale/jewel/todomvc/vos/TodoVO.as | 15 +++++
9 files changed, 170 insertions(+), 47 deletions(-)
diff --git a/examples/jewel/todomvc/pom.xml b/examples/jewel/todomvc/pom.xml
index 7e1207b..eba4bfb 100644
--- a/examples/jewel/todomvc/pom.xml
+++ b/examples/jewel/todomvc/pom.xml
@@ -46,6 +46,7 @@
<additionalCompilerOptions>
-js-dynamic-access-unknown-members=true;
-source-map=true;
+
-compiler.exclude-defaults-css-files=MXRoyale-${royale.framework.version}-js.swc:defaults.css
</additionalCompilerOptions>
</configuration>
</plugin>
@@ -62,6 +63,13 @@
</dependency>
<dependency>
<groupId>org.apache.royale.framework</groupId>
+ <artifactId>MXRoyale</artifactId>
+ <version>0.9.7-SNAPSHOT</version>
+ <type>swc</type>
+ <classifier>js</classifier>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.royale.framework</groupId>
<artifactId>JewelTheme</artifactId>
<version>0.9.7-SNAPSHOT</version>
<type>swc</type>
@@ -87,6 +95,13 @@
<type>swc</type>
<classifier>swf</classifier>
</dependency>
+ <dependency>
+ <groupId>org.apache.royale.framework</groupId>
+ <artifactId>MXRoyale</artifactId>
+ <version>0.9.7-SNAPSHOT</version>
+ <type>swc</type>
+ <classifier>swf</classifier>
+ </dependency>
</dependencies>
</profile>
</profiles>
diff --git a/examples/jewel/todomvc/src/main/resources/todomvc-styles.css
b/examples/jewel/todomvc/src/main/resources/todomvc-styles.css
index 24264b3..6002d7a 100644
--- a/examples/jewel/todomvc/src/main/resources/todomvc-styles.css
+++ b/examples/jewel/todomvc/src/main/resources/todomvc-styles.css
@@ -84,9 +84,7 @@ todomvc|TodoListSection
}
.jewel.button:hover, .jewel.button:hover:focus {
background: none;
- border: 1px solid transparent;
-
- text-decoration: underline;
+ border: 1px solid transparent;
}
.jewel.button:active, .jewel.button:active:focus {
background: none;
@@ -98,6 +96,7 @@ todomvc|TodoListSection
box-shadow: none;
}
+/* ToggleButton */
.jewel.togglebutton {
margin: 3px;
padding: 3px 7px;
@@ -129,9 +128,30 @@ todomvc|TodoListSection
box-shadow: none;
}
+.jewel.togglebutton.toggleAll {
+
+}
+.jewel.togglebutton.toggleAll:hover, .jewel.togglebutton.toggleAll:hover:focus
{
+ border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll:active,
.jewel.togglebutton.toggleAll:active:focus {
+ border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll:focus {
+ border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll.selected {
+ border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll .fonticon {
+ color: #737373;
+}
+.jewel.togglebutton.toggleAll.selected .fonticon {
+ color: #e6e6e6;
+}
+
/* TextInput */
-.jewel.textinput.new-todo input
-{
+.jewel.textinput.new-todo input {
padding: 16px 16px 16px 60px !important;
border-radius: 0px;
border: none;
@@ -161,12 +181,10 @@ todomvc|TodoListSection
font-style: italic;
}
-.jewel.item .jewel.textinput
-{
+.jewel.item .jewel.textinput {
margin-left: 46px;
}
-.jewel.textinput input
-{
+.jewel.textinput input {
background: none;
border-radius: 0px;
font-weight: 300;
@@ -187,21 +205,18 @@ todomvc|TodoListSection
}
/* List */
-.todo-list
-{
+.todo-list {
IItemRenderer:
ClassReference("jewel.todomvc.renderers.TodoItemRenderer");
}
-.jewel.list
-{
+.jewel.list {
border-radius: 0px;
border: none;
background: none;
}
/* ItemRenderer */
-.jewel.item
-{
+.jewel.item {
padding: 0px;
}
@@ -221,8 +236,7 @@ todomvc|TodoListSection
}
/* CheckBox */
-.jewel.checkbox
-{
+.jewel.checkbox {
margin: 8px;
}
@@ -259,20 +273,17 @@ todomvc|TodoListSection
*/
/* ItemRenderer label */
-.todolabel
-{
+.todolabel {
padding-left: 13px;
}
-.completed
-{
+.completed {
color: #d9d9d9;
text-decoration: line-through;
}
/* ItemRenderer destroy button */
-.destroy
-{
+.destroy {
color: #af5b5e !important;
}
@@ -300,11 +311,15 @@ todomvc|TodoListSection
}
/* BarRow */
-.jewel.barrow
-{
+.jewel.barrow {
height: unset;
}
+/* Clear Completed Button */
+.jewel.button.clearCompleted {
+ text-decoration: underline;
+}
+
/* Footer Info */
.info {
text-align: center;
diff --git a/examples/jewel/todomvc/src/main/royale/App.mxml
b/examples/jewel/todomvc/src/main/royale/App.mxml
index 546447b..04f752e 100644
--- a/examples/jewel/todomvc/src/main/royale/App.mxml
+++ b/examples/jewel/todomvc/src/main/royale/App.mxml
@@ -19,7 +19,8 @@
<j:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:j="library://ns.apache.org/royale/jewel"
xmlns:js="library://ns.apache.org/royale/basic"
- xmlns:views="jewel.todomvc.views.*">
+ xmlns:views="jewel.todomvc.views.*"
+ initialize="setUp()">
<fx:Style source="../../main/resources/todomvc-styles.css"/>
@@ -27,6 +28,25 @@
<js:SimpleCSSValuesImpl />
</j:valuesImpl>
+ <fx:Script>
+ <![CDATA[
+ import org.apache.royale.reflection.registerClassAlias;
+ import org.apache.royale.collections.ArrayList;
+
+ /**
+ * Register ArrayCollection alias to map to ArrayList
+ */
+ public function setUp():void
+ {
+
registerClassAlias("flex.messaging.io.ArrayCollection", ArrayList);
+ }
+ ]]>
+ </fx:Script>
+
+ <j:beads>
+ <js:ClassAliasBead/>
+ </j:beads>
+
<j:initialView>
<views:TodoListSection/>
</j:initialView>
diff --git
a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/controllers/TodoController.as
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/controllers/TodoController.as
index c630e46..a8c6343 100644
---
a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/controllers/TodoController.as
+++
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/controllers/TodoController.as
@@ -22,6 +22,7 @@ package jewel.todomvc.controllers
import jewel.todomvc.models.TodoModel;
import jewel.todomvc.vos.TodoVO;
+ import org.apache.royale.collections.ArrayList;
import org.apache.royale.core.IBeadController;
import org.apache.royale.core.IBeadModel;
import org.apache.royale.core.IStrand;
@@ -63,7 +64,18 @@ package jewel.todomvc.controllers
IEventDispatcher(_strand).addEventListener(TodoEvent.ITEM_REMOVED,
itemRemovedHandler);
model = _strand.getBeadByType(IBeadModel) as TodoModel;
+
+ // retrieve local items and use it if exists
+ var localAllItems:Array = model.storage.data["items"];
+ if(localAllItems)
+ model.allItems = new ArrayList(localAllItems);
+ else
+ model.allItems = new ArrayList();
+
+ model.setUpFilteredCollections();
model.listItems = model.allItems;
+
+ updateInterface();
}
/**
@@ -72,29 +84,48 @@ package jewel.todomvc.controllers
private var model:TodoModel;
/**
- * Add the todo item to the list and refresh the list state
+ * Saves the actual data to the local storage via Local SharedObject
+ */
+ protected function saveDataToLocal():void {
+ try {
+ model.storage.data["items"] =
model.allItems.source;
+ model.storage.flush();
+ } catch (error:Error) {
+ trace("You need to be online to store locally");
+ }
+ }
+
+ /**
+ * Add the todo item to the list, save data and refresh the list
state
*/
protected function addTodoItem(event:TodoEvent):void {
model.allItems.addItem(event.todo);
- updateInterface();
+
+ saveDataToLocal();
+ updateInterface();
}
+
+
/**
- * Mark all todo items as completed and update items left and clear
completed button visibility
+ * Mark all todo items as completed, save data and update the
interface accordingly
*/
protected function markAllComplete(event:TodoEvent):void {
- var len:int = model.allItems.length
+ model.toggleAllSelectedState =
!model.toggleAllSelectedState;
+
+ var len:int = model.allItems.length;
var item:TodoVO;
for(var i:int = 0; i < len; i++) {
item = TodoVO(model.allItems.getItemAt(i));
- item.done = true;
+ item.done = model.toggleAllSelectedState;
}
+ saveDataToLocal();
updateInterface();
}
/**
- * Remove all completed todo items, update footer and toggle all
button visibility
+ * Remove all completed todo items, save data and update footer and
toggle all button visibility
*/
protected function removeCompleted(event:TodoEvent):void {
var l:uint = model.allItems.length;
@@ -106,8 +137,8 @@ package jewel.todomvc.controllers
}
}
- model.footerVisibility = model.allItems.length != 0 ?
true : false;
- model.toogleAllVisibility = model.allItems.length != 0
? true : false;
+ saveDataToLocal();
+ updateInterface();
}
/**
@@ -117,6 +148,7 @@ package jewel.todomvc.controllers
{
if(model.filterState != event.label) {
model.filterState = event.label;
+
setListState();
}
}
@@ -159,25 +191,31 @@ package jewel.todomvc.controllers
}
/**
- * When some todo item change state (done/undone), we must
update the interface accordingly
+ * When some todo item change state (done/undone), we must
save data and update the interface accordingly
*/
public function itemStateChangedHandler(event:TodoEvent = null):void {
event.todo.done = event.completion;
+
+ saveDataToLocal();
updateInterface();
}
/**
- * Commit the label changes to the item
+ * Commit the label changes to the item and save data
*/
public function itemLabelChangedHandler(event:TodoEvent = null):void {
event.todo.label = event.label;
+
+ saveDataToLocal();
}
/**
- * When the user click in the renderer destroy button we must
remove the item and update the interface
+ * When the user click in the renderer destroy button we must
remove the item, save data and update the interface
*/
public function itemRemovedHandler(event:TodoEvent):void {
model.allItems.removeItem(event.todo);
+
+ saveDataToLocal();
updateInterface();
}
diff --git
a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/models/TodoModel.as
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/models/TodoModel.as
index edba1aa..2d449fc 100644
--- a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/models/TodoModel.as
+++ b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/models/TodoModel.as
@@ -20,6 +20,8 @@ package jewel.todomvc.models
{
import jewel.todomvc.vos.TodoVO;
+ import mx.net.SharedObject;
+
import org.apache.royale.collections.ArrayList;
import org.apache.royale.collections.ArrayListView;
import org.apache.royale.core.IBeadModel;
@@ -46,8 +48,6 @@ package jewel.todomvc.models
*/
public function TodoModel():void
{
- activeItems = filterItems(isActive);
- completedItems = filterItems(isCompleted);
}
private var _strand:IStrand;
@@ -69,6 +69,11 @@ package jewel.todomvc.models
public var router:Router;
/**
+ * Local storage for the todo items
+ */
+ public var storage:SharedObject = SharedObject.getLocal("todomvc");
+
+ /**
* the list of items binded to the todo list component
*/
public var listItems:Object;
@@ -76,7 +81,7 @@ package jewel.todomvc.models
/**
* the real list with all items
*/
- public var allItems:ArrayList = new ArrayList();
+ public var allItems:ArrayList;
/**
* the filtered list with active items
@@ -89,6 +94,13 @@ package jewel.todomvc.models
public var completedItems:ArrayListView;
/**
+ * Set up the filtered collections for later use
+ */
+ public function setUpFilteredCollections():void {
+ activeItems = filterItems(isActive);
+ completedItems = filterItems(isCompleted);
+ }
+ /**
* Filter the items in the list creating an ArrayListView with the
right filter function
*/
public function filterItems(filterFunction:Function =
null):ArrayListView {
@@ -118,6 +130,11 @@ package jewel.todomvc.models
public var filterState:String = TodoModel.ALL_FILTER;
/**
+ * toggleAll button selected state
+ */
+ public var toggleAllSelectedState:Boolean = false;
+
+ /**
* how many items left to do
*/
public var itemsLeftLabel:String = "0 items left";
diff --git
a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoFooter.mxml
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoFooter.mxml
index 1f85b6f..71756ae 100644
--- a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoFooter.mxml
+++ b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoFooter.mxml
@@ -23,8 +23,8 @@ limitations under the License.
<fx:Script>
<![CDATA[
- import jewel.todomvc.models.TodoModel;
import jewel.todomvc.events.TodoEvent;
+ import jewel.todomvc.models.TodoModel;
[Bindable]
public var todoModel:TodoModel;
@@ -96,7 +96,8 @@ limitations under the License.
</j:BarSection>
<j:BarSection width="15%" gap="3" itemsHorizontalAlign="itemsRight">
- <j:Button localId="clearCompleted" text="Clear Completed"
click="removeCompleted()" visible="{todoModel.clearCompletedVisibility}"/>
+ <j:Button localId="clearCompleted" text="Clear Completed"
className="clearCompleted"
+ visible="{todoModel.clearCompletedVisibility}"
click="removeCompleted()"/>
</j:BarSection>
</j:BarRow>
\ No newline at end of file
diff --git
a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoHeader.mxml
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoHeader.mxml
index 3487343..877742e 100644
--- a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoHeader.mxml
+++ b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoHeader.mxml
@@ -19,7 +19,8 @@ limitations under the License.
-->
<j:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:j="library://ns.apache.org/royale/jewel"
- xmlns:js="library://ns.apache.org/royale/basic">
+ xmlns:js="library://ns.apache.org/royale/basic"
+ height="61">
<fx:Script>
<![CDATA[
@@ -63,12 +64,12 @@ limitations under the License.
</j:beads>
</j:TextInput>
- <j:IconButton localId="toogleAll"
visible="{todoModel.toogleAllVisibility}"
- width="40" x="10" y="10" className="toggle-all"
+ <j:ToggleButton localId="toogleAll"
visible="{todoModel.toogleAllVisibility}"
+ width="34" height="55" className="toggleAll"
click="markAllComplete(event)">
<j:icon>
<js:FontIcon
text="{MaterialIconType.KEYBOARD_ARROW_DOWN}" material="true"/>
</j:icon>
- </j:IconButton>
+ </j:ToggleButton>
</j:Group>
\ No newline at end of file
diff --git
a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoListSection.mxml
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoListSection.mxml
index 20bfbe5..d3f5298 100644
---
a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoListSection.mxml
+++
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/views/TodoListSection.mxml
@@ -27,6 +27,7 @@ limitations under the License.
<fx:Script>
<![CDATA[
import jewel.todomvc.models.TodoModel;
+
import org.apache.royale.core.IBeadModel;
import org.apache.royale.routing.RouteState;
@@ -42,7 +43,7 @@ limitations under the License.
todoModel.router = router;
header.todoModel = todoModel;
footer.todoModel = todoModel;
-
+
updateRouting();
}
diff --git a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/vos/TodoVO.as
b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/vos/TodoVO.as
index 08f922e..1ef8d62 100644
--- a/examples/jewel/todomvc/src/main/royale/jewel/todomvc/vos/TodoVO.as
+++ b/examples/jewel/todomvc/src/main/royale/jewel/todomvc/vos/TodoVO.as
@@ -19,11 +19,26 @@
package jewel.todomvc.vos
{
[Bindable]
+ [RemoteClass(alias="jewel.todomvc.vos.TodoVO")]
+ /**
+ * The todo item definition with a label for description an completion
state
+ * The remote class is used to save and retrieve from local storage
+ */
public class TodoVO
{
+ /**
+ * label description todo
+ */
public var label:String;
+
+ /**
+ * completion state (done/undone)
+ */
public var done:Boolean;
+ /**
+ * constructor
+ */
public function TodoVO(label:String)
{
this.label = label;