Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
E
ecommerce-ui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
ecommerce-ui
Commits
bc0059f4
Commit
bc0059f4
authored
Oct 11, 2013
by
Sven Franck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
first promise generated gadget
parent
6a62e0bb
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
551 additions
and
415 deletions
+551
-415
js/erp5_loader.js
js/erp5_loader.js
+551
-415
No files found.
js/erp5_loader.js
View file @
bc0059f4
...
...
@@ -1671,6 +1671,13 @@
};
erp5
.
map_portal_types
=
{
"
app
"
:
"
app
"
,
"
invoices
"
:
"
invoices
"
,
"
invoices_01
"
:
"
invoices_01
"
,
"
Sale Invoice Transaction
"
:
"
invoices_fields
"
};
erp5
.
action_handlers
=
{
/**
...
...
@@ -1692,123 +1699,86 @@
* @param {object} config JSON configuration of this gadget
* @returns {objects} fragment
*/
constructListbox
:
function
(
config
)
{
var
fragment_container
,
config
,
bar
,
wrap
,
arr
,
path
,
split
,
item
,
reference
,
local_popup
,
global_popup
,
field_definitions
,
settings
=
config
,
portal_type
=
settings
?
settings
.
portal_type_title
:
undefined
;
// extract reference (e.g. user) and item id from path
// TODO: refactor, user should be availabe from ??? cookie???
path
=
location
.
href
.
split
(
"
?
"
);
if
(
path
[
1
])
{
split
=
path
[
1
].
split
(
"
&
"
);
if
(
split
.
length
>
0
)
{
for
(
j
=
0
;
j
<
split
.
length
;
j
+=
1
)
{
key
=
split
[
j
].
split
(
"
=
"
);
switch
(
key
[
0
])
{
case
"
r
"
:
reference
=
key
[
1
];
break
;
case
"
i
"
:
item
=
key
[
1
]
break
;
}
}
}
}
constructListbox
:
function
(
config
,
answer
,
field_definitions
)
{
var
fragment
,
bar
,
wrap
,
arr
,
local_popup
,
global_popup
,
set
;
// retrieve and update field definitions for this portal_type
console
.
log
(
"
constructListbox!
"
);
console
.
log
(
settings
);
if
(
settings
)
{
fragment_container
=
window
.
document
.
createDocumentFragment
();
config
=
settings
.
configuration
;
if
(
config
)
{
fragment
=
window
.
document
.
createDocumentFragment
();
set
=
config
.
configuration
;
// add controlbar
if
(
config
.
controlbar
.
length
>
0
)
{
bar
=
factory
.
generateElement
(
"
div
"
,
{
"
className
"
:
"
ui-controlbar
"
});
arr
=
factory
.
generateBar
(
config
.
controlbar
);
bar
.
appendChild
(
arr
[
0
]);
// add controlbar
if
(
set
.
controlbar
.
length
>
0
)
{
bar
=
factory
.
generateElement
(
"
div
"
,
{
"
className
"
:
"
ui-controlbar
"
});
arr
=
factory
.
generateBar
(
set
.
controlbar
);
bar
.
appendChild
(
arr
[
0
]);
// TODO: improve, too much code, array pass-arounds
global_popup
=
arr
[
1
].
global_popup
;
local_popup
=
arr
[
1
].
local_popup
;
// TODO: improve, too much code, array pass-arounds
global_popup
=
arr
[
1
].
global_popup
;
local_popup
=
arr
[
1
].
local_popup
;
fragment_container
.
appendChild
(
bar
);
}
fragment
.
appendChild
(
bar
);
}
// add wrapper
if
(
config
.
wrapper
.
length
>
0
)
{
arr
=
factory
.
generateBar
(
config
.
wrapper
,
true
);
fragment_container
.
appendChild
(
arr
[
0
]);
// add wrapper
if
(
set
.
wrapper
.
length
>
0
)
{
arr
=
factory
.
generateBar
(
set
.
wrapper
,
true
);
fragment
.
appendChild
(
arr
[
0
]);
// TODO: too much popup handling here
if
(
global_popup
===
undefined
)
{
global_popup
=
arr
[
1
].
global_popup
;
// TODO: too much popup handling here
if
(
global_popup
===
undefined
)
{
global_popup
=
arr
[
1
].
global_popup
;
}
if
(
local_popup
===
undefined
)
{
local_popup
=
arr
[
1
].
local_popup
;
}
}
if
(
local_popup
===
undefined
)
{
local_popup
=
arr
[
1
].
local_popup
;
// local popup handler
if
(
local_popup
)
{
active_page
=
init
.
getActivePageId
();
if
(
document
.
getElementById
(
active_page
)
.
querySelectorAll
(
"
div.local_popup
"
)
===
null
)
{
fragment
.
appendChild
(
factory
.
generatePopup
(
undefined
,
active_page
)
);
}
}
}
// local popup handler
if
(
local_popup
)
{
active_page
=
init
.
getActivePageId
();
if
(
document
.
getElementById
(
active_page
)
.
querySelectorAll
(
"
div.local_popup
"
)
===
null
)
{
fragment_container
.
appendChild
(
factory
.
generatePopup
(
undefined
,
active_page
)
// global popup handler
if
(
global_popup
&&
document
.
getElementById
(
"
global_popup
"
)
===
null
)
{
document
.
documentElement
.
appendChild
(
factory
.
generatePopup
(
undefined
,
undefined
)
);
}
}
// global popup handler
if
(
global_popup
&&
document
.
getElementById
(
"
global_popup
"
)
===
null
)
{
document
.
documentElement
.
appendChild
(
factory
.
generatePopup
(
undefined
,
undefined
)
// TODO: pre-enhance!
// table
config
.
base_element
.
attributes
[
"
data-role
"
]
=
"
table
"
;
table
=
factory
.
generateElement
(
config
.
base_element
.
type
,
config
.
base_element
.
direct
,
config
.
base_element
.
attributes
,
config
.
base_element
.
logic
);
}
// TODO: pre-enhance!
// table
settings
.
base_element
.
attributes
[
"
data-role
"
]
=
"
table
"
;
table
=
factory
.
generateElement
(
settings
.
base_element
.
type
,
settings
.
base_element
.
direct
,
settings
.
base_element
.
attributes
,
settings
.
base_element
.
logic
);
table
.
appendChild
(
factory
.
generateTableHeader
(
settings
,
portal_type
,
field_definitions
)
);
table
.
appendChild
(
factory
.
generateTableBody
(
settings
,
answer
,
portal_type
));
// table.appendChild(factory.generateTableFooter(settings, portal_type);
table
.
appendChild
(
factory
.
generateTableHeader
(
config
,
field_definitions
)
);
table
.
appendChild
(
factory
.
generateTableBody
(
config
,
answer
)
);
// table.appendChild(factory.generateTableFooter(config, portal_type);
// done
fragment
_container
.
appendChild
(
table
);
fragment
.
appendChild
(
table
);
if
(
settings
.
actions
)
{
for
(
l
=
0
;
l
<
settings
.
actions
.
length
;
l
+=
1
)
{
fragment_container
.
appendChild
(
factory
.
generateControlgroup
(
settings
.
actions
[
l
]));
if
(
config
.
actions
)
{
for
(
l
=
0
;
l
<
config
.
actions
.
length
;
l
+=
1
)
{
fragment
.
appendChild
(
factory
.
generateControlgroup
(
config
.
actions
[
l
])
);
}
}
// single element
return
fragment_container
;
return
fragment
;
}
return
factory
.
generateErrorMessage
(
"
Error. No configuration found
"
,
""
);
...
...
@@ -1821,9 +1791,10 @@
var
factory
=
{};
/* ********************************************************************** */
/* "map
to erp5"
*/
/* "map
ping to erp5"
*/
/* ********************************************************************** */
factory
.
map_buttons
=
erp5
.
mapERP5_buttons
;
factory
.
map_dataTypes
=
erp5
.
map_portal_types
;
factory
.
action_handlers
=
erp5
.
action_handlers
;
factory
.
gadget_handlers
=
erp5
.
gadget_handlers
;
...
...
@@ -1916,10 +1887,10 @@
* Generates a table header based on configuration and portal_type
* @method generateTableHeader
* @param {object} settings Configuration for table to create
* @param {
string} portal_type The portal type for this element
* @param {
object} fields Field configurations for this portal Type
*/
// TODO: single row ok. multi row to make
factory
.
generateTableHeader
=
function
(
settings
,
portal_type
)
{
factory
.
generateTableHeader
=
function
(
settings
,
fields
)
{
var
k
,
l
,
cell
,
...
...
@@ -1942,8 +1913,16 @@
cell
=
factory
.
generateElement
(
"
th
"
,{},{},{});
config
=
{
"
type
"
:
"
input
"
,
"
direct
"
:
{
"
id
"
:
portal_type
+
"
_tick_all
"
,
"
className
"
:
"
action
"
,
"
type
"
:
"
checkbox
"
},
"
attributes
"
:
{
"
type
"
:
"
checkbox
"
,
"
value
"
:
"
Select All/Unselect All
"
,
"
data-iconpos
"
:
"
notext
"
,
"
data-reference
"
:
"
select_all
"
},
"
direct
"
:
{
"
id
"
:
settings
.
portal_type_title
+
"
_tick_all
"
,
"
className
"
:
"
action
"
,
"
type
"
:
"
checkbox
"
},
"
attributes
"
:
{
"
type
"
:
"
checkbox
"
,
"
value
"
:
"
Select All/Unselect All
"
,
"
data-iconpos
"
:
"
notext
"
,
"
data-reference
"
:
"
select_all
"
},
"
logic
"
:
{}
}
cell
.
appendChild
(
factory
.
generateFormElement
(
config
,
false
,
true
));
...
...
@@ -1962,12 +1941,7 @@
field_config
=
{};
if
(
field
.
show
)
{
// fetch field_config. This should be loaded by now, because
// we want to display a certain portal_type and to do so,
// we need all the field configurations associated with this
// portal_type config["data-i18n":
// TODO: field definitions?
//field_config = priv.field_definitions[portal_type][property];
field_config
=
fields
[
settings
[
property
]];
if
(
field
.
merge
===
undefined
)
{
if
(
field_config
)
{
...
...
@@ -1991,7 +1965,10 @@
{
"
text
"
:
title
}
);
if
(
merger
)
{
row
.
insertBefore
(
cell
,
(
set
===
undefined
?
null
:
row
.
childNodes
[
check
?
1
:
0
])
);
row
.
insertBefore
(
cell
,
(
set
===
undefined
?
null
:
row
.
childNodes
[
check
?
1
:
0
])
);
set
=
true
;
}
else
{
row
.
appendChild
(
cell
);
...
...
@@ -2012,10 +1989,9 @@
* @method generateTableRow
* @param {object} settings Configuration for table row to create
* @param {object} item Data for this table row
* @param {string} portal_type The portal type for the object displayed
* @returns table_row
*/
factory
.
generateTableRow
=
function
(
settings
,
item
,
portal_type
)
{
factory
.
generateTableRow
=
function
(
settings
,
item
)
{
var
k
,
l
,
i
,
...
...
@@ -2043,14 +2019,24 @@
cell
.
appendChild
(
factory
.
generateFormElement
(
{
"
type
"
:
"
input
"
,
"
direct
"
:
{
"
id
"
:
item
.
_id
,
"
name
"
:
item
.
_id
,
"
className
"
:
"
action
"
,
"
type
"
:
"
checkbox
"
},
"
attributes
"
:
{
"
type
"
:
"
checkbox
"
,
"
value
"
:
"
Select
"
+
item
.
title
,
"
data-iconpos
"
:
"
notext
"
,
"
data-reference
"
:
"
select_item
"
},
"
direct
"
:
{
"
id
"
:
item
.
_id
,
"
name
"
:
item
.
_id
,
"
className
"
:
"
action
"
,
"
type
"
:
"
checkbox
"
},
"
attributes
"
:
{
"
type
"
:
"
checkbox
"
,
"
value
"
:
"
Select
"
+
item
.
title
,
"
data-iconpos
"
:
"
notext
"
,
"
data-reference
"
:
"
select_item
"
},
"
logic
"
:
{}
},
false
,
true
));
row
.
appendChild
(
cell
);
row
.
appendChild
(
cell
);
}
// reverse if mergable columns
...
...
@@ -2067,7 +2053,7 @@
if
(
field
.
show
)
{
if
(
field
.
merge
===
undefined
)
{
cell
=
factory
.
generateElement
(
"
td
"
,{},{},{});
link
=
"
object.html?type=
"
+
portal_typ
e
+
"
&mode=edit
"
+
"
&item=
"
+
item
.
_id
;
link
=
"
object.html?type=
"
+
settings
.
portal_type_titl
e
+
"
&mode=edit
"
+
"
&item=
"
+
item
.
_id
;
// TODO: crap...refactor whole section
// fetch non portal_type values
...
...
@@ -2148,27 +2134,23 @@
* @method generateTableBody
* @param {object} settings Configuration for table body to create
* @param {object} answer from JIO
* @param {string} portal_type The portal type for this element
* @returns {object} table_body
*/
factory
.
generateTableBody
=
function
(
settings
,
answer
,
portal_type
)
{
factory
.
generateTableBody
=
function
(
settings
,
answer
)
{
var
l
,
row
,
item
,
property
,
field
,
error
,
max
,
table_body
=
factory
.
generateElement
(
"
tbody
"
,{},{},{});
// data
// TODO: we HACK
if
(
answer
===
undefined
)
{
// answer = priv.getFakeRecords[portal_type];
}
if
(
answer
&&
answer
.
length
>
0
)
{
for
(
l
=
0
;
l
<
answer
.
length
;
l
+=
1
)
{
item
=
answer
[
l
].
doc
;
row
=
factory
.
generateTableRow
(
settings
,
item
,
portal_type
);
max
=
settings
.
max_records
||
answer
.
length
;
for
(
l
=
0
;
l
<
max
;
l
+=
1
)
{
item
=
answer
[
l
];
row
=
factory
.
generateTableRow
(
settings
,
item
);
table_body
.
appendChild
(
row
);
}
}
else
{
...
...
@@ -2466,7 +2448,7 @@
{
"
className
"
:
"
ui-footer
"
+
(
config
.
widget_class
||
"
"
)
+
(
config
.
fixed
?
"
ui-footer-fixed
"
:
"
"
)
+
"
slide
up
ui-bar-
"
+
(
config
.
fixed
?
"
ui-footer-fixed
"
:
"
"
)
+
"
slide
down
ui-bar-
"
+
(
config
.
theme
||
"
inherit
"
),
},
{
...
...
@@ -3289,251 +3271,6 @@
*/
init
.
storages
;
/**
* Get the active JQM page in JavaScript-only
* @method getActivePageId
* @return {string} id of active page
*/
init
.
getActivePageId
=
function
()
{
var
i
,
kids
=
document
.
body
.
children
;
for
(
i
=
0
;
i
<
kids
.
length
;
i
+=
1
)
{
// this always tests the last page = active page
if
(
util
.
testForClass
(
kids
[
i
].
className
,
"
ui-page
"
))
{
return
kids
[
i
].
id
;
}
}
return
undefined
;
};
/**
* Get target element to append elements to
* @method getTargetElement
* @param {string} global Flag
* @return {object} HTML element
*/
init
.
getTargetElement
=
function
(
global
)
{
if
(
global
)
{
return
document
.
body
;
}
return
document
.
getElementById
(
init
.
getActivePageId
());
};
/**
* sets up JIO based on a loaded JSON "recipe"
* @method setupStorages
* @param {object} config Configuration for a storage to create
*/
init
.
setupStorages
=
function
(
config
)
{
var
i
,
store
,
promises
=
[];
for
(
i
=
0
;
i
<
config
.
length
;
i
+=
1
)
{
store
=
config
[
i
].
definition
;
promises
[
i
]
=
init
.
storages
[
store
.
application_name
]
=
jIO
.
createJIO
(
store
);
}
return
RSVP
.
all
(
promises
);
};
/**
* load files into JIO that are missing
* @method getFromDisk
* @param {object} storage JIO object
* @param {string} file Document title
* @param {string} attachment Attachment title
*/
init
.
getFromDisk
=
function
(
storage
,
file
,
attachment
)
{
var
response
,
put
,
putAttachment
;
put
=
function
(
e
)
{
response
=
e
.
target
.
response
;
return
storage
.
put
({
"
_id
"
:
file
});
};
putAttachment
=
function
(
e
)
{
return
storage
.
putAttachment
({
"
_id
"
:
file
,
"
_attachment
"
:
attachment
,
"
_data
"
:
JSON
.
stringify
(
response
),
"
_mimetype
"
:
"
application/json
"
});
};
return
jIO
.
util
.
ajax
({
"
url
"
:
"
data/
"
+
attachment
+
"
.json
"
,
"
dataType
"
:
'
json
'
})
.
then
(
put
)
.
then
(
putAttachment
)
.
then
(
function
(){
// stored in JIO, continue
return
response
;
}
)
.
fail
(
function
(
err
){
document
.
getElementById
(
init
.
getActivePageId
())
.
getElementsByTagName
(
"
div
"
)[
0
]
.
appendChild
(
util
.
generateErrorMessage
(
"
Error: Could not load data
"
,
""
)
);
throw
err
;
});
};
/**
* Try fetching a configuration file (attachment) from storage. Fallback to
* file. Successfull fallback file fetches will be stored in JIO.
* @method fetchConfigurationFile
* @param {string} storage jIO instance to use
* @param {string} file Name of the file in question
* @param {string} attachment Name of the attachment to fetch
*/
// NOTE: assumes all files being loaded fully as text
init
.
fetchConfigurationFile
=
function
(
storage
,
file
,
attachment
)
{
var
store
=
init
.
storages
[
storage
];
return
store
.
getAttachment
({
"
_id
"
:
file
,
"
_attachment
"
:
attachment
})
.
then
(
function
(
response
)
{
return
jIO
.
util
.
readBlobAsText
(
response
.
data
);
})
.
then
(
function
(
answer
)
{
return
JSON
.
parse
(
answer
.
target
.
result
);
},
function
(
error
)
{
if
(
error
.
status
===
404
&&
error
.
id
===
file
)
{
return
init
.
getFromDisk
(
store
,
file
,
attachment
);
}
throw
error
;
}
);
};
/**
* Sets up a global application element
* @method setupGlobalElement
* @param {object} config JSON configuration
* @return {object} HTML fragment
*/
init
.
setupGobalElement
=
function
(
config
)
{
var
target
;
// TODO: all global... so... don't getTargetElement
switch
(
config
.
widget
)
{
case
"
header
"
:
init
.
getTargetElement
(
config
.
global
)
.
appendChild
(
factory
.
generateHeader
(
config
));
break
;
case
"
footer
"
:
init
.
getTargetElement
(
config
.
global
)
.
appendChild
(
factory
.
generateFooter
(
config
));
break
;
case
"
popup
"
:
init
.
getTargetElement
(
config
.
global
)
.
appendChild
(
factory
.
generatePopup
(
config
));
break
;
case
"
panel
"
:
init
.
getTargetElement
(
config
.
global
)
.
appendChild
(
factory
.
generatePanel
(
config
));
break
;
}
};
/**
* Iterates over the application configuration and generates the
* defined elements
* @method setupGlobalElements
* @param {object} config Application configuration
*/
init
.
setupGlobalElements
=
function
(
config
)
{
var
i
,
target
,
element
,
promises
=
[];
target
=
document
.
getElementById
(
init
.
getActivePageId
())
.
getElementsByTagName
(
"
div
"
)[
0
];
if
(
config
&&
config
.
length
)
{
for
(
i
=
0
;
i
<
config
.
length
;
i
+=
1
)
{
init
.
setupGobalElement
(
config
[
i
]);
};
}
else
{
target
.
appendChild
(
util
.
generateErrorMessage
(
"
Error: No app data found
"
,
""
));
}
};
/**
* Setup element to display on the respective page being shown
* @method setupPageElements
* @param {object} config JSON config for this page
*/
init
.
setupPageElements
=
function
(
config
)
{
var
i
,
header
,
active
,
method
,
pointer
,
gadgets
,
gadget
;
active
=
document
.
getElementById
(
init
.
getActivePageId
());
// set title
if
(
config
.
title
)
{
// WARNING: IE8- children() retrieves comments, too
header
=
document
.
getElementById
(
"
global_header
"
)
||
active
.
children
()[
0
];
if
(
util
.
testForClass
(
header
.
className
,
"
ui-header
"
))
{
title
=
header
.
getElementsByTagName
(
"
h1
"
)[
0
];
title
.
innerHTML
=
config
.
title
;
title
.
setAttribute
(
"
data-i18n
"
,
config
.
title_i18n
);
}
}
// load gadgets on this page
// TODO: better way?
gadgets
=
active
.
querySelectorAll
(
"
[data-gadget]
"
);
console
.
log
(
"
found gadgets
"
);
console
.
log
(
gadgets
);
for
(
i
=
0
;
i
<
gadgets
.
length
;
i
+=
1
)
{
gadget
=
gadgets
[
i
];
method
=
"
construct
"
+
util
.
capFirstLetter
(
gadget
.
getAttribute
(
"
data-gadget
"
)
);
pointer
=
factory
.
gadget_handlers
[
method
];
if
(
pointer
)
{
// retrieve gadget info, store and return gadget
init
.
fetchConfigurationFile
(
"
settings
"
,
"
gadgets
"
,
gadget
.
getAttribute
(
"
data-gadget-id
"
),
pointer
).
always
(
function
(
fragment
)
{
console
.
log
(
"
gotcha
"
);
console
.
log
(
fragment
);
//$(gadget.parentNode).empty().append( fragment ).enhanceWithin();
});
}
else
{
active
.
getElementsByTagName
(
"
div
"
)[
0
].
appendChild
(
util
.
generateErrorMessage
(
"
Error: Could not load config for
"
+
gadget
.
getAttribute
(
"
data-gadget
"
)
+
"
.
"
,
""
)
);
}
}
};
/**
* Set the page currently being displayed
* @method setupPage
* @param {object} storage JIO
* @param {string} id Page id
*/
init
.
setupPage
=
function
(
storage
,
id
)
{
return
init
.
fetchConfigurationFile
(
storage
,
"
pages
"
,
id
);
};
/* ====================================================================== */
/* BINDINGS */
/* ====================================================================== */
...
...
@@ -3763,15 +3500,424 @@
// }
// });
};
/* ====================================================================== */
/* METHODS */
/* ====================================================================== */
/**
* Set all application bindings
* @method setGlobalBindings
* @param {object} e Custom event object
*/
init
.
setGlobalBindings
=
function
(
e
)
{
* Get the active JQM page in JavaScript-only
* @method getActivePageId
* @return {string} id of active page
*/
init
.
getActivePageId
=
function
()
{
var
i
,
kid
,
kids
=
document
.
body
.
children
;
// need jQuery again...
// reverse, because in JQM last page is the active page!
for
(
i
=
kids
.
length
-
1
;
i
>=
0
;
i
-=
1
)
{
kid
=
kids
[
i
];
if
(
kid
.
tagName
===
"
DIV
"
)
{
if
(
util
.
testForClass
(
kids
[
i
].
className
,
"
ui-page
"
))
{
return
kids
[
i
].
id
;
}
}
}
return
undefined
;
};
/**
* Setup element to display on the respective page being shown
* @method setupPageElements
* @param {object} config JSON config for this page
*/
init
.
setupPageElements
=
function
(
config
)
{
var
i
,
header
,
active
,
method
,
fetch
,
query
,
query_string
,
query_limit
,
path
,
split
,
key
,
reference
,
item
,
gadgets
,
gadget
,
gadget_id
,
gadget_config
,
portal_type
,
fields
,
fragment
;
active
=
document
.
getElementById
(
init
.
getActivePageId
());
// set title
if
(
config
.
title
)
{
// WARNING: IE8- children() retrieves comments, too
header
=
document
.
getElementById
(
"
global_header
"
)
||
active
.
children
()[
0
];
if
(
util
.
testForClass
(
header
.
className
,
"
ui-header
"
))
{
title
=
header
.
getElementsByTagName
(
"
h1
"
)[
0
];
title
.
innerHTML
=
config
.
title
;
title
.
setAttribute
(
"
data-i18n
"
,
config
.
title_i18n
);
}
}
// pick item id from URL
// TODO: refactor, reference is crap, wait until login works!
path
=
location
.
href
.
split
(
"
?
"
);
if
(
path
[
1
])
{
split
=
path
[
1
].
split
(
"
&
"
);
if
(
split
.
length
>
0
)
{
for
(
j
=
0
;
j
<
split
.
length
;
j
+=
1
)
{
key
=
split
[
j
].
split
(
"
=
"
);
switch
(
key
[
0
])
{
case
"
r
"
:
reference
=
key
[
1
];
break
;
case
"
i
"
:
item
=
key
[
1
]
break
;
}
}
}
}
// fetch gadgets
// WARNING: slow & IE8 compliant?
gadgets
=
active
.
querySelectorAll
(
"
[data-gadget]
"
);
// load gadgets
for
(
i
=
0
;
i
<
gadgets
.
length
;
i
+=
1
)
{
gadget
=
gadgets
[
i
];
gadget_id
=
gadget
.
getAttribute
(
"
data-gadget-id
"
);
method
=
"
construct
"
+
util
.
capFirstLetter
(
gadget
.
getAttribute
(
"
data-gadget
"
)
);
// go fetching...
init
.
fetchConfiguration
(
"
settings
"
,
"
gadgets
"
,
gadget_id
)
.
then
(
function
(
gadget_configuration
)
{
gadget_config
=
gadget_configuration
;
portal_type
=
gadget_config
.
portal_type_source
;
// build query object for later
query_string
=
'
(portal_type:"%
'
+
portal_type
+
'
")
'
;
query_limit
=
gadget_config
.
max_records
;
if
(
item
)
{
query_string
+=
'
AND (id:"%
'
+
item
+
'
")
'
;
query_limit
=
1
;
}
query
=
{
query
:
query_string
,
limit
:
[
0
,
query_limit
],
sort_on
:
[],
select_list
:[],
wildcard_character
:
'
%
'
};
})
.
then
(
function
()
{
return
init
.
fetchConfiguration
(
"
settings
"
,
"
portal_types
"
,
portal_type
)
})
.
then
(
function
(
field_definitions
)
{
fields
=
field_definitions
;
})
// ==================================================
// TODO: remove this and all FakeData methods once ERP5 access is ok
// ==================================================
.
then
(
init
.
testForFakeDump
(
"
items
"
,
portal_type
))
.
then
(
function
(
item_check
)
{
// while JIO returns undefined
if
(
item_check
===
undefined
)
{
fetch
=
true
;
}
else
if
(
item_check
.
data
.
total_rows
===
0
)
{
fetch
=
true
;
}
})
.
then
(
function
()
{
return
init
.
fetchFakeData
(
gadget_id
);
})
.
then
(
function
(
fake_items
)
{
if
(
fetch
)
{
return
init
.
dumpFakeData
(
fake_items
,
gadget_id
,
"
items
"
);
}
})
// ===============================================
.
then
(
init
.
fetchData
(
"
items
"
,
query
))
.
then
(
function
(
items
)
{
fragment
=
factory
.
gadget_handlers
[
method
](
gadget_config
,
items
,
fields
);
$
(
gadget
.
parentNode
).
empty
().
append
(
fragment
).
enhanceWithin
();
})
.
fail
(
function
(
err
)
{
console
.
log
(
err
);
active
.
getElementsByTagName
(
"
div
"
)[
0
].
appendChild
(
util
.
generateErrorMessage
(
"
Error: Could not generate gadget
"
+
gadget
.
getAttribute
(
"
data-gadget
"
)
+
"
.
"
,
""
)
);
});
}
};
/**
* sets up JIO based on a loaded JSON "recipe"
* @method setupStorages
* @param {object} config Configuration for a storage to create
*/
init
.
setupStorages
=
function
(
config
)
{
var
i
,
store
,
promises
=
[];
for
(
i
=
0
;
i
<
config
.
length
;
i
+=
1
)
{
store
=
config
[
i
].
definition
;
promises
[
i
]
=
init
.
storages
[
store
.
application_name
]
=
jIO
.
createJIO
(
store
);
}
return
RSVP
.
all
(
promises
);
};
/**
* load files into JIO that are missing
* @method getFromDisk
* @param {object} storage JIO object
* @param {string} file Document title
* @param {string} attachment Attachment title
*/
init
.
getFromDisk
=
function
(
storage
,
file
,
attachment
)
{
var
response
,
url
,
put
,
putAttachment
;
put
=
function
(
e
)
{
response
=
e
.
target
.
response
;
return
storage
.
put
({
"
_id
"
:
file
});
};
putAttachment
=
function
(
e
)
{
return
storage
.
putAttachment
({
"
_id
"
:
file
,
"
_attachment
"
:
attachment
,
"
_data
"
:
JSON
.
stringify
(
response
),
"
_mimetype
"
:
"
application/json
"
});
};
url
=
"
data/
"
+
factory
.
map_dataTypes
[
attachment
]
+
"
.json
"
;
return
jIO
.
util
.
ajax
({
"
url
"
:
url
,
"
dataType
"
:
'
json
'
})
.
then
(
put
)
.
then
(
putAttachment
)
.
then
(
function
(){
// stored in JIO, continue
return
response
;
}
)
.
fail
(
function
(
err
){
document
.
getElementById
(
init
.
getActivePageId
())
.
getElementsByTagName
(
"
div
"
)[
0
]
.
appendChild
(
util
.
generateErrorMessage
(
"
Error: Could not load data
"
,
""
)
);
throw
err
;
});
};
/**
* Try fetching a configuration file (attachment) from storage. Fallback to
* file. Successfull fallback file fetches will be stored in JIO.
* @method fetchData
* @param {string} storage jIO instance to use
* @param {string} portal_type Portal type to fetch
* @param {object} query
* @returns {object} promise object
*/
// NOTE: until we have real data we load fake data on application init!
init
.
fetchData
=
function
(
storage
,
portal_type
,
query
)
{
var
store
=
init
.
storages
[
storage
];
console
.
log
(
"
calling allDocs, query
"
);
console
.
log
(
query
);
return
store
.
allDocs
(
query
)
.
then
(
function
(
response
)
{
return
response
;
},
function
(
err
)
{
return
err
;
}
);
};
/**
* Test dump for a portal_type to prevent re-dumping
* @method testForFakeDump
* @param {string} storage Storage to test
* @param {string} portal_type Portal Type to test for
*/
init
.
testForFakeDump
=
function
(
storage
,
portal_type
)
{
return
init
.
fetchData
(
storage
,
{
query
:
'
(portal_type:"%
'
+
portal_type
+
'
")
'
,
limit
:
[
0
,
1
],
sort_on
:
[],
select_list
:
[
'
portal_type
'
],
wildcard_character
:
'
%
'
});
};
/**
* Create FAKE data entries in JIO
* @method dumpFakeData
* @param {array} dump Records to add
* @param {string} type Portal_type
* @param {string} store jIO instance to store
* @returns {object} promise object
*/
init
.
dumpFakeData
=
function
(
dump
,
type
,
storage
)
{
var
i
,
obj
,
key
,
store
=
init
.
storages
[
storage
],
promises
=
[];
if
(
store
&&
dump
&&
dump
.
length
)
{
for
(
i
=
0
;
i
<
dump
.
length
;
i
+=
1
)
{
record
=
dump
[
i
];
obj
=
{};
for
(
key
in
record
)
{
if
(
record
.
hasOwnProperty
(
key
))
{
obj
[
key
]
=
record
[
key
];
}
}
obj
.
portal_type
=
type
;
promises
[
i
]
=
store
.
post
(
obj
);
}
return
RSVP
.
all
(
promises
);
}
else
{
// error
}
};
/**
* get fake data when a page is loaded
* @method fetchFakeData
* @param {id}
* @returns {object} promise object
*/
init
.
fetchFakeData
=
function
(
id
)
{
if
(
jIO
)
{
// hum
return
jIO
.
util
.
ajax
({
"
url
"
:
"
data/
"
+
id
+
"
_data.json
"
,
"
dataType
"
:
"
json
"
}).
then
(
function
(
e
)
{
return
e
.
target
.
response
;
},
function
(
err
){
document
.
getElementById
(
init
.
getActivePageId
())
.
getElementsByTagName
(
"
div
"
)[
0
]
.
appendChild
(
util
.
generateErrorMessage
(
"
Error: Can't load data
"
,
""
)
);
throw
err
;
});
}
else
{
// error
}
};
/**
* Try fetching a configuration file (attachment) from storage. Fallback to
* file. Successfull fallback file fetches will be stored in JIO.
* @method fetchConfiguration
* @param {string} storage jIO instance to use
* @param {string} file Name of the file in question
* @param {string} attachment Name of the attachment to fetch
*/
// NOTE: assumes all files being loaded fully as text
init
.
fetchConfiguration
=
function
(
storage
,
file
,
attachment
)
{
var
store
=
init
.
storages
[
storage
];
return
store
.
getAttachment
({
"
_id
"
:
file
,
"
_attachment
"
:
attachment
})
.
then
(
function
(
response
)
{
return
jIO
.
util
.
readBlobAsText
(
response
.
data
);
})
.
then
(
function
(
answer
)
{
return
JSON
.
parse
(
answer
.
target
.
result
);
},
function
(
error
)
{
if
(
error
.
status
===
404
&&
error
.
id
===
file
)
{
return
init
.
getFromDisk
(
store
,
file
,
attachment
);
}
throw
error
;
}
);
};
/**
* Sets up a global application element
* @method setupGlobalElement
* @param {object} config JSON configuration
* @return {object} HTML fragment
*/
init
.
setupGobalElement
=
function
(
config
)
{
switch
(
config
.
widget
)
{
case
"
header
"
:
document
.
body
.
appendChild
(
factory
.
generateHeader
(
config
));
break
;
case
"
footer
"
:
document
.
body
.
appendChild
(
factory
.
generateFooter
(
config
));
break
;
case
"
popup
"
:
document
.
body
.
appendChild
(
factory
.
generatePopup
(
config
));
break
;
case
"
panel
"
:
document
.
body
.
appendChild
(
factory
.
generatePanel
(
config
));
break
;
}
};
/**
* Iterates over the application configuration and generates the
* defined elements
* @method setupGlobalElements
* @param {object} config Application configuration
*/
init
.
setupGlobalElements
=
function
(
config
)
{
var
i
,
target
,
element
,
promises
=
[];
target
=
document
.
getElementById
(
init
.
getActivePageId
())
.
getElementsByTagName
(
"
div
"
)[
0
];
if
(
config
&&
config
.
length
)
{
for
(
i
=
0
;
i
<
config
.
length
;
i
+=
1
)
{
init
.
setupGobalElement
(
config
[
i
]);
};
}
else
{
target
.
appendChild
(
util
.
generateErrorMessage
(
"
Error: No app data found
"
,
""
));
}
};
/**
* Set all application bindings
* @method setGlobalBindings
* @param {object} e Custom event object
*/
init
.
setGlobalBindings
=
function
(
e
)
{
// need jQuery again...
$
(
document
)
.
enhanceWithin
()
...
...
@@ -3844,6 +3990,15 @@
};
/**
* Set the page currently being displayed
* @method setupPage
* @param {object} storage JIO
* @param {string} id Page id
*/
init
.
setupPage
=
function
(
storage
,
id
)
{
return
init
.
fetchConfiguration
(
storage
,
"
pages
"
,
id
);
};
/**
* fetch application configuration, store in JIO and setup application
...
...
@@ -3863,7 +4018,7 @@
if
(
init
.
storages
[
attachment
])
{
return
;
}
else
{
//
get storage definition and set up storages before continuing
//
actually this is the only case we end up at
return
jIO
.
util
.
ajax
({
"
url
"
:
"
data/
"
+
attachment
+
"
.json
"
,
"
dataType
"
:
"
json
"
})
...
...
@@ -3890,29 +4045,24 @@
* @method loadApplicationSettings
*/
init
.
loadApplicationSettings
=
function
()
{
return
init
.
fetchConfiguration
File
(
"
settings
"
,
"
configuration
"
,
"
app
"
);
return
init
.
fetchConfiguration
(
"
settings
"
,
"
configuration
"
,
"
app
"
);
};
/**
* Run page "domino"
* @method runPageSetup
* @param {string} storage Which storage to fetch the setup from
* @param {string} id Page id
*/
init
.
runPageSetup
=
function
(
storage
,
id
)
{
init
.
setupPage
(
storage
,
id
)
.
then
(
function
(
page_config
)
{
init
.
setupPageElements
(
page_config
);
},
function
(
err
)
{
throw
err
;
})
.
then
(
function
()
{
init
.
setPageBindings
();
},
function
(
err
)
{
throw
err
;
})
.
fail
(
function
(
err
)
{
console
.
log
(
err
)
});
return
init
.
setupPage
(
storage
,
id
)
.
then
(
init
.
setupPageElements
)
.
then
(
init
.
setupPageBindings
)
.
fail
(
function
(
err
)
{
// error
console
.
log
(
err
);
});
};
/* ***************************** ENTRY POINT *************************** */
...
...
@@ -3933,31 +4083,17 @@
// setup application
init
.
runApplicationSetup
(
"
settings
"
,
"
storages
"
)
.
then
(
init
.
loadApplicationSettings
)
.
then
(
init
.
setupGlobalElements
)
.
then
(
init
.
setGlobalBindings
)
.
then
(
function
()
{
return
init
.
loadApplicationSettings
()
},
function
(
err
)
{
throw
err
;
})
.
then
(
function
(
app_config
)
{
init
.
setupGlobalElements
(
app_config
);
},
function
(
err
)
{
throw
err
;
})
.
then
(
function
()
{
init
.
setGlobalBindings
();
},
function
(
err
)
{
throw
err
;
})
.
then
(
function
()
{
init
.
runPageSetup
(
"
settings
"
,
e
.
target
.
id
);
},
function
(
err
)
{
throw
err
;
return
init
.
runPageSetup
(
"
settings
"
,
e
.
target
.
id
);
})
.
fail
(
function
(
err
)
{
console
.
log
(
err
);
});
}
else
{
init
.
runPageSetup
(
"
settings
"
,
e
.
target
.
id
);
return
init
.
runPageSetup
(
"
settings
"
,
e
.
target
.
id
);
}
});
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment