% Tracking service
tracker$ = "http://parcelsapp.com/en/tracking/"
% "https://m.17track.net/en/track#nums="
% Lists and Fns creation
list.create s, itm_name
list.create s, itm_date
list.create s, itm_image
list.create s, itm_link
list.create s, itm_track
gosub DefFns
grid=0
% Initialize GW lib
gw_silent_load=1
include "GW.bas"
gw_zoom_input(0)
% Create GW page
p=gw_new_page()
gosub ReadItems
% Dialog message when short-pressing on an item
array.load open$[], "TRACK SHIPMENT>TRACK", "OPEN SELLER PAGE>SELLER", "Cancel"
dlg_opn=gw_add_dialog_message(p, "ITEM DETAILS", "", open$[])
gw_custo_dlgbtn(p,dlg_opn,"TRACK SHIPMENT","icon=location")
gw_custo_dlgbtn(p,dlg_opn,"OPEN SELLER PAGE","icon=eye")
% Dialog message when long-pressing on an item
array.load options$[], "EDIT ITEM>EDIT", "DELETE ITEM>DEL", "Cancel"
dlg_opt=gw_add_dialog_message(p, "ITEM OPTIONS", "", options$[])
gw_custo_dlgbtn(p,dlg_opt,"EDIT ITEM","icon=edit")
gw_custo_dlgbtn(p,dlg_opt,"DELETE ITEM","icon=delete")
% Dialog inputs for editing an item
array.load nxt$[], "NEXT>NEXT"
array.load dne$[], "DONE>DONE"
dlg_nam=gw_add_dialog_input(p,"ITEM DETAIL (1/5)","Enter item name, price, etc.","",nxt$[])
dlg_dat=gw_add_dialog_input(p,"ITEM DETAIL (2/5)","Enter date of purchase",curDate$(),nxt$[])
dlg_img=gw_add_dialog_input(p,"ITEM DETAIL (3/5)","Enter url of item image","@>",nxt$[])
dlg_lnk=gw_add_dialog_input(p,"ITEM DETAIL (4/5)","Enter link to seller page","@>",nxt$[])
dlg_trk=gw_add_dialog_input(p,"ITEM DETAIL (5/5)","Enter tracking number","",dne$[])
% Dialog message to save sortable list view
array.load ync$[], "YES>SAVE", "NO>DISCARD", "Cancel"
gw_use_theme_custo_once("inline")
dlg_sav=gw_add_dialog_message(p, "ITEM LIST", "Save your changes?", ync$[])
% Button to add new item
gw_use_theme_custo_once("icon=plus")
btn=gw_add_button(p,"ADD INCOMING ITEM","NEW")
btnid$=gw_id$(btn)
% Logo
gw_start_center(p)
gw_add_image(p,"incoming.jpg")
gw_stop_center(p)
% Image view of items
items=gw_add_placeholder(p)
gw_inject_html(p,"")
% Sortable (text-only) list mode
gw_inject_html(p,"
Reorganize list with drag & drop:
")
array.load itm$[], "~" % sortable listview
ulist=gw_add_listview(p,itm$[])
% Thumbnail grid mode
gw_use_theme_custo_once("icon=grid notext hover=SE")
gw_add_button(p,"","GRID")
% Refresh and render page
DisplayPage:
gosub RefreshItems
gw_render(p)
gosub RefreshGrid
% Handle user input
do
r$=gw_wait_action$()
% Grid mode
if r$="GRID"
if grid=2 % save context
ctx$=r$
if ls then gosub SortItems_Check
if chg then r$=""
endif
if r$="GRID"
grid=mod(++grid,3)
gosub RefreshGrid
endif
% New item
elseif r$="NEW"
% 1/5 enter item name
itm_step=1
gw_modify(dlg_nam,"input","")
gw_show_dialog(dlg_nam)
elseif r$="NEXT" & itm_step<10
pause 500
if itm_step=1
nam$=gw_get_value$(dlg_nam)
% 2/5 enter item date
itm_step=2
gw_modify(dlg_dat,"input",curDate$())
gw_show_dialog(dlg_dat)
elseif itm_step=2
dat$=gw_get_value$(dlg_dat)
% 3/5 enter item image
itm_step=3
gw_modify(dlg_img,"input","@>")
gw_show_dialog(dlg_img)
elseif itm_step=3
img$=gw_get_value$(dlg_img)
% 4/5 enter item seller page
itm_step=4
gw_modify(dlg_lnk,"input","@>")
gw_show_dialog(dlg_lnk)
elseif itm_step=4
lnk$=gw_get_value$(dlg_lnk)
% 5/5 enter item tracking #
itm_step=5
gw_modify(dlg_trk,"input","")
gw_show_dialog(dlg_trk)
endif
elseif r$="DONE" & itm_step=5
trk$=gw_get_value$(dlg_trk)
list.insert itm_name,1,nam$
list.insert itm_date,1,dat$
list.insert itm_image,1,img$
list.insert itm_link,1,lnk$
list.insert itm_track,1,trk$
gosub SaveItems
goto DisplayPage
% Short press on item > tracking or seller link
elseif is_in("ITM#",r$)=1
itm=val(mid$(r$,5))
list.get itm_track,itm,trk$
list.get itm_link,itm,lnk$
if trk$<>"" & lnk$<>""
gw_show_dialog(dlg_opn)
elseif trk$<>""
browse tracker$+trk$
elseif lnk$<>""
browse lnk$
endif
elseif r$="SELLER"
browse lnk$
elseif r$="TRACK"
browse tracker$+trk$
% Long press on item > edit or remove
elseif is_in("OPT#",r$)=1
itm=val(mid$(r$,5))
gw_show_dialog(dlg_opt)
elseif r$="DEL"
list.remove itm_name,itm
list.remove itm_date,itm
list.remove itm_image,itm
list.remove itm_link,itm
list.remove itm_track,itm
gosub SaveItems
goto DisplayPage
elseif r$="EDIT"
pause 500
% 1/5 edit item name
itm_step=11
list.get itm_name,itm,nam$
gw_modify(dlg_nam,"input",nam$)
gw_show_dialog(dlg_nam)
elseif r$="NEXT" & itm_step>=10
pause 500
if itm_step=11
nam$=gw_get_value$(dlg_nam)
% 2/5 edit item date
itm_step=12
list.get itm_date,itm,dat$
if is_in("added on:",dat$) then dat$=trim$(mid$(dat$,10))
gw_modify(dlg_dat,"input",dat$)
gw_show_dialog(dlg_dat)
elseif itm_step=12
dat$=gw_get_value$(dlg_dat)
% 3/5 edit item image
itm_step=13
list.get itm_image,itm,img$
gw_modify(dlg_img,"input","@>"+img$)
gw_show_dialog(dlg_img)
elseif itm_step=13
img$=gw_get_value$(dlg_img)
% 4/5 edit item seller page
itm_step=14
list.get itm_link,itm,lnk$
gw_modify(dlg_lnk,"input","@>"+lnk$)
gw_show_dialog(dlg_lnk)
elseif itm_step=14
lnk$=gw_get_value$(dlg_lnk)
% 5/5 edit item tracking #
itm_step=15
list.get itm_track,itm,trk$
gw_modify(dlg_trk,"input",trk$)
gw_show_dialog(dlg_trk)
endif
elseif r$="DONE" & itm_step=15
trk$=gw_get_value$(dlg_trk)
list.replace itm_name,itm,nam$
list.replace itm_date,itm,dat$
list.replace itm_image,itm,img$
list.replace itm_link,itm,lnk$
list.replace itm_track,itm,trk$
gosub SaveItems
goto DisplayPage
% Answered yes after reorganizing item list
else if r$="SAVE"
gosub SortItems_Save
if ctx$="GRID"
grid=0
goto DisplayPage
endif
r$=ctx$
ctx$=""
% Answered no after reorganizing item list
else if r$="DISCARD"
if ctx$="GRID"
grid=0
gw_render(p) % force page reinit
gosub RefreshGrid
endif
r$=ctx$
ctx$=""
else if r$="BACK"
if grid=2
ctx$=r$ % save context
gosub SortItems_Check
if chg then r$=""
endif
endif
until r$="BACK"
if is_apk() then exit
gw_dump(p)
end ""
% Subs and Functions
ReadItems:
text.open r, fid, "incoming.dat"
if fid>=0
do
% read item name
text.readln fid,e$:if e$="EOF" then d_u.break
list.add itm_name, e$
% read item date
text.readln fid,e$:if e$="EOF" then e$=""
if is_in("added on:",e$) then e$=trim$(mid$(e$,10))
list.add itm_date, e$
% read item image
text.readln fid,e$:if e$="EOF" then e$=""
if is_in("img:",e$) then e$=mid$(e$,5)
list.add itm_image, e$
% read item seller link
text.readln fid,e$:if e$="EOF" then e$=""
if is_in("lnk:",e$) then e$=mid$(e$,5)
list.add itm_link, e$
% read item tracking #
text.readln fid,e$:if e$="EOF" then e$=""
if is_in("track:",e$) then e$=mid$(e$,7)
list.add itm_track, e$
until 0
text.close fid
endif
return
SaveItems:
text.open w, fid, "incoming.dat"
list.size itm_name,n
for i=1 to n
% write item name
list.get itm_name,i,e$
text.writeln fid,e$
% write item date
list.get itm_date,i,e$
text.writeln fid,"added on: "+e$
% write item image
list.get itm_image,i,e$
text.writeln fid,"img:"+e$
% write item seller link
list.get itm_link,i,e$
text.writeln fid,"lnk:"+e$
% write item tracking #
list.get itm_track,i,e$
text.writeln fid,"track:"+e$
next
text.close fid
return
RefreshItems:
% Update image view
html$=""
list.size itm_name,n
for i=1 to n
list.get itm_name,i,nam$
list.get itm_date,i,dat$
html$+=gw_add_text$(""+nam$+" added on "+dat$+"")
list.get itm_image,i,img$
if img$="" then img$="unknown.png"
html$+=gw_add_image$(img$+">ITM#"+int$(i))
html$+=gw_add_listener$(gw_last_id(),"longpress","OPT#"+int$(i))
html$+=gw_add_text$("Long-press for options")
html$+=gw_add_text$("
")
next
gw_fill_placeholder(p,items,html$)
return
RefreshGrid:
if grid=0 % default small thumbnail grid
js("$('img').css('height','90px')")
js("$('img').css('display','inline-block')")
js("$('img').css('margin','4px')")
js("$('.ui-body').css('display','none')")
js("$('h4').css('display','none')")
js("$('ul').css('display','none')")
js("$('#"+btnid$+"').css('display','')")
elseif grid=1 % big image view
js("$('img').css('height','')")
js("$('img').css('display','')")
js("$('img').css('margin','')")
js("$('.ui-body').css('display','')")
js("$('h4').css('display','none')")
js("$('ul').css('display','none')")
js("$('hr').css('display','')")
js("$('br').css('display','')")
else if grid=2 % sortable text list view
js("$('img').css('display','none')")
js("$('.ui-body').css('display','none')")
js("$('h4').css('display','')")
js("$('ul').css('display','')")
js("$('hr').css('display','none')")
js("$('br').css('display','none')")
js("$('#"+btnid$+"').css('display','none')")
% Update text-only sortable list view
list.size itm_name, ls
if ls
array.delete itm$[]
list.toarray itm_name,itm$[]
itm$[1]="~"+itm$[1] % sortable listview
gw_amodify(ulist,"content",itm$[])
end if
endif
return
SortItems_Check:
chg=gw_listview_changed(ulist)
if chg then gw_show_dialog(dlg_sav)
return
SortItems_Save:
nli$=gw_get_listview_order$(ulist)
SortList(itm_name,nli$)
SortList(itm_date,nli$)
SortList(itm_image,nli$)
SortList(itm_link,nli$)
SortList(itm_track,nli$)
gosub SaveItems
return
DefFns:
fn.def curDate$()
array.load m$[],"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEPT","OCT","NOV","DEC"
time y$,m$,d$
fn.rtn trim$(format$("%%",val(d$))+"-"+m$[val(m$)])
fn.end
fn.def SortList(list,order$)
list.toarray list,a$[]
gw_reorder_array(a$[],order$)
list.clear list
list.add.array list,a$[]
fn.end
return