Commit 47ee7f53 authored by Vincent Bechu's avatar Vincent Bechu Committed by Vincent Bechu

erp5_officejs: fix add document in codeeditor

parent 8509511d
......@@ -24,12 +24,12 @@
<div class="ui-field-contain">
<label data-i18n="Url String:">Url String</label>
<input type="text" name="url_string" value="{{url_string}}">
<input type="text" name="url_string" value="{{url_string}}" required>
</div>
<div class="ui-field-contain">
<label data-i18n="Version:">Version:</label>
<input type="text" name="version" value="{{version}}"></label>
<label data-i18n="Portal Type:">Portal Type:</label>
<input type="text" name="portal_type" value="{{portal_type}}" required></label>
</div>
<div class="ui-field-contain">
......
......@@ -234,7 +234,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.55534.43957.17220</string> </value>
<value> <string>955.59479.11249.61201</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -252,7 +252,7 @@
</tuple>
<state>
<tuple>
<float>1481330026.08</float>
<float>1481540323.2</float>
<string>UTC</string>
</tuple>
</state>
......
/*globals window, rJS, Handlebars, RSVP, loopEventListener, console*/
/*jslint indent: 2, nomen: true, maxlen: 80*/
(function (window, RSVP, rJS, Handlebars, loopEventListener) {
"use strict";
function saveContent(gadget, submit_event) {
var i,
doc = gadget.options.doc,
now = new Date();
doc.modification_date = now.toISOString();
for (i = 0; i < submit_event.target.length; i += 1) {
// XXX Should check input type instead
if (submit_event.target[i].name) {
doc[submit_event.target[i].name] = submit_event.target[i].value;
}
}
return new RSVP.Queue()
.push(function () {
return gadget.getDeclaredGadget("my_text_content");
})
.push(function (text_content_gadget) {
return text_content_gadget.getContent();
})
.push(function (data) {
doc.text_content = data.text_content;
doc.parent_relative_url = data.parent_relative_url || "web_page_module";
doc.portal_type = data.portal_type || "Web Page";
return gadget.put(gadget.options.jio_key, doc);
});
}
function maximize(gadget) {
var iframe = gadget.props.element.querySelector('iframe'),
iframe_class_string = iframe.getAttribute('class') || "",
class_name = "ui-content-maximize",
class_index = iframe_class_string.indexOf(class_name);
if (class_index === -1) {
iframe_class_string += ' ' + class_name;
iframe.setAttribute('style', '');
iframe.setAttribute('class', iframe_class_string);
return true;
}
iframe_class_string = iframe_class_string.substring(0, class_index)
+ iframe_class_string.substring(class_index + class_name.length);
iframe.setAttribute('style', 'width:100%; border: 0 none; height: 600px');
iframe.setAttribute('class', iframe_class_string);
return false;
}
var gadget_klass = rJS(window),
source = gadget_klass.__template_element
.querySelector(".view-web-page-template")
.innerHTML,
template = Handlebars.compile(source);
gadget_klass
.ready(function (g) {
g.props = {};
g.options = null;
return g.getElement()
.push(function (element) {
g.props.element = element;
g.props.deferred = RSVP.defer();
});
})
.declareAcquiredMethod("updateHeader", "updateHeader")
.declareAcquiredMethod("get", "jio_get")
.declareAcquiredMethod("translateHtml", "translateHtml")
.declareAcquiredMethod("put", "jio_put")
.declareAcquiredMethod('allDocs', 'jio_allDocs')
.declareAcquiredMethod("redirect", "redirect")
.allowPublicAcquisition('triggerSubmit', function (option) {
if (option[0] === "maximize" || option === "maximize") {
var gadget = this;
return RSVP.Queue()
.push(function () {
return maximize(gadget);
});
}
return this.props.element.querySelector('button').click();
})
.declareMethod('triggerSubmit', function (option) {
if (option[0] === "maximize" || option === "maximize") {
var gadget = this;
return RSVP.Queue()
.push(function () {
return maximize(gadget);
});
}
return this.props.element.querySelector('button').click();
})
.declareMethod("render", function (options) {
var gadget = this;
gadget.options = options;
gadget.options.doc.title = gadget.options.doc.title || "";
return new RSVP.Queue()
.push(function () {
return gadget.translateHtml(template(options.doc));
})
.push(function (html) {
gadget.props.element.innerHTML = html;
return gadget.updateHeader({
title: options.doc.title + '|' +
options.doc.portal_type || "| Web Page",
save_action: true,
maximize_action: true,
maximized: gadget.options.doc.title !== ""
});
})
.push(function () {
return gadget.props.deferred.resolve();
});
})
/////////////////////////////////////////
// Render text content gadget
/////////////////////////////////////////
.declareService(function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
return gadget.props.deferred.promise;
})
.push(function () {
return gadget.declareGadget(
"../../officejs_gadget_codemirror/codemirror/",
{
scope: "my_text_content",
sandbox: "iframe",
element: gadget.props.element.querySelector(".document-content")
}
);
})
.push(function (text_content_gadget) {
var iframe = gadget.props.element.querySelector('iframe');
iframe.setAttribute(
'style',
'width:100%; border: 0 none; height: 600px'
);
return text_content_gadget.render({
"key": 'text_content',
"value": gadget.options.doc.text_content,
"mode": gadget.options.doc.content_type
});
})
.push(function () {
if (gadget.options.doc.title !== "") {
return gadget.triggerSubmit("maximize");
}
})
.push(undefined, function (error) {
var display_error_element;
if (error === "Timed out after 5000 ms") {
display_error_element =
gadget.props.element.querySelector(
"form div.ui-field-contain fieldset"
);
display_error_element.innerHTML =
'<br/><p style="color: red"></p><br/><br/>';
display_error_element.querySelector('p').textContent =
"TIMEOUT: The editor gadget is taking too long to load but is" +
" currently being cached, please wait for the page to load" +
" (check your browser loading icon) and then refresh.";
} else {
throw error;
}
});
})
/////////////////////////////////////////
// Form submit
/////////////////////////////////////////
.declareService(function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
return gadget.props.deferred.promise;
})
.push(function () {
return loopEventListener(
gadget.props.element.querySelector('form'),
'submit',
true,
function (event) {
return saveContent(gadget, event);
}
);
});
});
/*globals window, rJS, Handlebars, RSVP, loopEventListener, console*/
/*jslint indent: 2, nomen: true, maxlen: 80*/
(function (window, RSVP, rJS, Handlebars, loopEventListener) {
"use strict";
function saveContent(gadget, submit_event) {
var i,
doc = gadget.options.doc,
now = new Date();
doc.modification_date = now.toISOString();
for (i = 0; i < submit_event.target.length; i += 1) {
// XXX Should check input type instead
if (submit_event.target[i].name) {
doc[submit_event.target[i].name] = submit_event.target[i].value;
}
}
return new RSVP.Queue()
.push(function () {
return gadget.getDeclaredGadget("my_text_content");
})
.push(function (text_content_gadget) {
return text_content_gadget.getContent();
})
.push(function (data) {
doc.text_content = data.text_content;
doc.parent_relative_url = data.parent_relative_url || "web_page_module";
doc.portal_type = data.portal_type || "Web Page";
if (gadget.options.jio_key !== doc.url_string) {
return gadget.remove(gadget.options.jio_key);
}
})
.push(function () {
return gadget.put(doc.url_string, doc);
});
}
function maximize(gadget) {
var iframe = gadget.props.element.querySelector('iframe'),
iframe_class_string = iframe.getAttribute('class') || "",
class_name = "ui-content-maximize",
class_index = iframe_class_string.indexOf(class_name);
if (class_index === -1) {
iframe_class_string += ' ' + class_name;
iframe.setAttribute('style', '');
iframe.setAttribute('class', iframe_class_string);
return true;
}
iframe_class_string = iframe_class_string.substring(0, class_index)
+ iframe_class_string.substring(class_index + class_name.length);
iframe.setAttribute('style', 'width:100%; border: 0 none; height: 600px');
iframe.setAttribute('class', iframe_class_string);
return false;
}
var gadget_klass = rJS(window),
source = gadget_klass.__template_element
.querySelector(".view-web-page-template")
.innerHTML,
template = Handlebars.compile(source);
gadget_klass
.ready(function (g) {
g.props = {};
g.options = null;
return g.getElement()
.push(function (element) {
g.props.element = element;
g.props.deferred = RSVP.defer();
});
})
.declareAcquiredMethod("updateHeader", "updateHeader")
.declareAcquiredMethod("get", "jio_get")
.declareAcquiredMethod("translateHtml", "translateHtml")
.declareAcquiredMethod("put", "jio_put")
.declareAcquiredMethod("remove","jio_remove")
.declareAcquiredMethod('allDocs', 'jio_allDocs')
.declareAcquiredMethod("redirect", "redirect")
.allowPublicAcquisition('triggerSubmit', function (option) {
if (option[0] === "maximize" || option === "maximize") {
var gadget = this;
return RSVP.Queue()
.push(function () {
return maximize(gadget);
});
}
return this.props.element.querySelector('button').click();
})
.declareMethod('triggerSubmit', function (option) {
if (option[0] === "maximize" || option === "maximize") {
var gadget = this;
return RSVP.Queue()
.push(function () {
return maximize(gadget);
});
}
return this.props.element.querySelector('button').click();
})
.declareMethod("render", function (options) {
var gadget = this;
gadget.options = options;
gadget.options.doc.title = gadget.options.doc.title || "";
gadget.options.doc.url_string = gadget.options.jio_key;
return new RSVP.Queue()
.push(function () {
return gadget.translateHtml(template(options.doc));
})
.push(function (html) {
gadget.props.element.innerHTML = html;
return gadget.updateHeader({
title: options.doc.title + '|' +
options.doc.portal_type || "| Web Page",
save_action: true,
maximize_action: true,
maximized: gadget.options.doc.title !== ""
});
})
.push(function () {
return gadget.props.deferred.resolve();
});
})
/////////////////////////////////////////
// Render text content gadget
/////////////////////////////////////////
.declareService(function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
return gadget.props.deferred.promise;
})
.push(function () {
return gadget.declareGadget(
"../../officejs_gadget_codemirror/codemirror/",
{
scope: "my_text_content",
sandbox: "iframe",
element: gadget.props.element.querySelector(".document-content")
}
);
})
.push(function (text_content_gadget) {
var iframe = gadget.props.element.querySelector('iframe');
iframe.setAttribute(
'style',
'width:100%; border: 0 none; height: 600px'
);
return text_content_gadget.render({
"key": 'text_content',
"value": gadget.options.doc.text_content,
"mode": gadget.options.doc.content_type
});
})
.push(function () {
if (gadget.options.doc.title !== "") {
return gadget.triggerSubmit("maximize");
}
})
.push(undefined, function (error) {
var display_error_element;
if (error === "Timed out after 5000 ms") {
display_error_element =
gadget.props.element.querySelector(
"form div.ui-field-contain fieldset"
);
display_error_element.innerHTML =
'<br/><p style="color: red"></p><br/><br/>';
display_error_element.querySelector('p').textContent =
"TIMEOUT: The editor gadget is taking too long to load but is" +
" currently being cached, please wait for the page to load" +
" (check your browser loading icon) and then refresh.";
} else {
throw error;
}
});
})
/////////////////////////////////////////
// Form submit
/////////////////////////////////////////
.declareService(function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
return gadget.props.deferred.promise;
})
.push(function () {
return loopEventListener(
gadget.props.element.querySelector('form'),
'submit',
true,
function (event) {
return saveContent(gadget, event);
}
);
});
});
}(window, RSVP, rJS, Handlebars, loopEventListener));
\ No newline at end of file
......@@ -97,6 +97,10 @@
<key> <string>portal_type</string> </key>
<value> <string>Web Script</string> </value>
</item>
<item>
<key> <string>revision</string> </key>
<value> <string>13</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
......@@ -240,7 +244,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.56020.64919.42120</string> </value>
<value> <string>955.59464.8628.44953</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -258,7 +262,7 @@
</tuple>
<state>
<tuple>
<float>1481331946.97</float>
<float>1481541034.32</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -222,7 +222,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.55463.25205.4966</string> </value>
<value> <string>955.56066.6312.29166</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -240,7 +240,7 @@
</tuple>
<state>
<tuple>
<float>1481295803.59</float>
<float>1481541101.2</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -222,7 +222,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.55463.28674.13312</string> </value>
<value> <string>955.56066.6312.29166</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -240,7 +240,7 @@
</tuple>
<state>
<tuple>
<float>1481295806.77</float>
<float>1481541119.53</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -15,8 +15,7 @@
type: "replicate",
// XXX This drop the signature lists...
query: {
query: '(portal_type: ("Web Page","Web Script","Web Manifest","Web Style")) ' +
' AND (version: "' + version + '")',
query: 'portal_type: ("Web Page","Web Script","Web Manifest","Web Style")',
limit: [0, 30],
sort_on: [["modification_date", "descending"]]
},
......@@ -27,37 +26,38 @@
database: version + "_hash"
}
},
use_remote_post: true,
use_remote_post: false,
conflict_handling: 1,
check_local_modification: true,
check_local_creation: true,
check_local_deletion: false,
check_remote_modification: true,
check_remote_creation: true,
check_remote_deletion: true,
check_remote_deletion: false,
local_sub_storage: {
type: "mapping",
mapping_dict: {
"id": {"equal": "relative_url"},
"url_string": {"equal": "id"}
},
type: "query",
sub_storage: {
type: "query",
type: "uuid",
sub_storage: {
type: "uuid",
sub_storage: {
type: "indexeddb",
database: version
}
type: "indexeddb",
database: version
}
}
},
remote_sub_storage: {
type: "erp5",
url: (new URI("hateoas"))
.absoluteTo(erp5_url)
.toString(),
default_view_reference: "jio_view"
type: "mapping",
mapping_dict: {
"id": {"equal": "url_string"},
"relative_url": "ignore",
"version": {"default_value": version}
},
sub_storage: {
type: "erp5",
url: (new URI("hateoas"))
.absoluteTo(erp5_url)
.toString(),
default_view_reference: "jio_view"
}
}
}
);
......
......@@ -97,6 +97,16 @@
<key> <string>portal_type</string> </key>
<value> <string>Web Script</string> </value>
</item>
<item>
<key> <string>revision</string> </key>
<value> <string>7</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OfficeJS jIO ERP5 Configurator Page JS</string> </value>
......@@ -234,7 +244,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.55534.6594.50944</string> </value>
<value> <string>955.59548.4928.4881</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -252,7 +262,7 @@
</tuple>
<state>
<tuple>
<float>1481327828.02</float>
<float>1481541022.38</float>
<string>UTC</string>
</tuple>
</state>
......
/*global window, rJS, RSVP, Handlebars, loopEventListener */
/*jslint nomen: true, indent: 2 */
(function (window, rJS, RSVP, Handlebars, loopEventListener) {
"use strict";
/////////////////////////////////////////////////////////////////
// templates
/////////////////////////////////////////////////////////////////
var gadget_klass = rJS(window),
templater = gadget_klass.__template_element,
listbox_widget_table = Handlebars.compile(
templater.getElementById("listbox-widget-table").innerHTML
);
Handlebars.registerPartial(
"listbox-widget-table-partial",
templater.getElementById("listbox-widget-table-partial").innerHTML
);
/////////////////////////////////////////////////////////////////
// some methods
/////////////////////////////////////////////////////////////////
gadget_klass
/////////////////////////////////////////////////////////////////
// ready
/////////////////////////////////////////////////////////////////
.ready(function (gadget) {
gadget.property_dict = {
render_deferred: RSVP.defer()
};
})
.ready(function (gadget) {
return gadget.getElement()
.push(function (element) {
gadget.property_dict.element = element;
});
})
/////////////////////////////////////////////////////////////////
// published methods
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// acquired methods
/////////////////////////////////////////////////////////////////
.declareAcquiredMethod("jio_allDocs", "jio_allDocs")
.declareAcquiredMethod("getUrlFor", "getUrlFor")
.declareAcquiredMethod("translate", "translate")
.declareAcquiredMethod("redirect", "redirect")
/////////////////////////////////////////////////////////////////
// declared methods
/////////////////////////////////////////////////////////////////
.declareMethod('render', function (option_dict) {
var gadget = this,
content = '',
k,
k_len,
search_list = [],
translated_column_list = [],
all_docs_result;
// store initial configuration
gadget.property_dict.option_dict = option_dict;
// Create the search query
if (option_dict.search) {
for (k = 0, k_len = option_dict.column_list.length; k < k_len; k += 1) {
search_list.push(option_dict.column_list[k].select + ':"%' + option_dict.search + '%"');
}
option_dict.query.query = '(' + search_list.join(' OR ') + ') AND ' + option_dict.query.query;
}
return gadget.jio_allDocs(option_dict.query)
.push(function (result) {
var promise_list = [],
i_len,
i;
all_docs_result = result;
for (i = 0, i_len = result.data.total_rows; i < i_len; i += 1) {
promise_list.push(gadget.getUrlFor({jio_key: result.data.rows[i].id, page: 'view'}));
}
return RSVP.all(promise_list);
})
.push(function (link_list) {
var row_list = [],
cell_list,
i_len,
i,
j_len,
j;
// build handlebars object
for (j = 0, j_len = all_docs_result.data.total_rows; j < j_len; j += 1) {
cell_list = [];
for (i = 0, i_len = option_dict.column_list.length; i < i_len; i += 1) {
cell_list.push({
"href": link_list[j],
"value": all_docs_result.data.rows[j].value[option_dict.column_list[i].select]
});
}
row_list.push({"cell_list": cell_list});
}
for (i = 0; i < option_dict.column_list.length; i += 1) {
translated_column_list.push(gadget.translate(option_dict.column_list[i].title));
}
return RSVP.all([
row_list,
RSVP.all(translated_column_list)
]);
})
.push(function (result_list) {
content += listbox_widget_table({
widget_theme : option_dict.widget_theme,
search: option_dict.search,
column_list: result_list[1],
row_list: result_list[0]
});
gadget.property_dict.element.querySelector(".custom-grid .ui-body-c")
.innerHTML = content;
gadget.property_dict.render_deferred.resolve();
});
})
/////////////////////////////////////////////////////////////////
// declared service
/////////////////////////////////////////////////////////////////
.declareService(function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
return gadget.property_dict.render_deferred.promise;
})
.push(function () {
return loopEventListener(
gadget.property_dict.element.querySelector('form'),
'submit',
false,
function (evt) {
return gadget.redirect({
jio_key: gadget.property_dict.option_dict.jio_key || '',
page: gadget.property_dict.option_dict.search_page || '',
search: evt.target[0].value
});
}
);
});
});
/*global window, rJS, RSVP, Handlebars, loopEventListener */
/*jslint nomen: true, indent: 2 */
(function (window, rJS, RSVP, Handlebars, loopEventListener) {
"use strict";
/////////////////////////////////////////////////////////////////
// templates
/////////////////////////////////////////////////////////////////
var gadget_klass = rJS(window),
templater = gadget_klass.__template_element,
listbox_widget_table = Handlebars.compile(
templater.getElementById("listbox-widget-table").innerHTML
);
Handlebars.registerPartial(
"listbox-widget-table-partial",
templater.getElementById("listbox-widget-table-partial").innerHTML
);
/////////////////////////////////////////////////////////////////
// some methods
/////////////////////////////////////////////////////////////////
gadget_klass
/////////////////////////////////////////////////////////////////
// ready
/////////////////////////////////////////////////////////////////
.ready(function (gadget) {
gadget.property_dict = {
render_deferred: RSVP.defer()
};
})
.ready(function (gadget) {
return gadget.getElement()
.push(function (element) {
gadget.property_dict.element = element;
});
})
/////////////////////////////////////////////////////////////////
// published methods
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// acquired methods
/////////////////////////////////////////////////////////////////
.declareAcquiredMethod("jio_allDocs", "jio_allDocs")
.declareAcquiredMethod("getUrlFor", "getUrlFor")
.declareAcquiredMethod("translate", "translate")
.declareAcquiredMethod("redirect", "redirect")
/////////////////////////////////////////////////////////////////
// declared methods
/////////////////////////////////////////////////////////////////
.declareMethod('render', function (option_dict) {
var gadget = this,
content = '',
k,
k_len,
search_list = [],
translated_column_list = [],
all_docs_result;
// store initial configuration
gadget.property_dict.option_dict = option_dict;
// Create the search query
if (option_dict.search) {
for (k = 0, k_len = option_dict.column_list.length; k < k_len; k += 1) {
search_list.push(option_dict.column_list[k].select + ':"%' + option_dict.search + '%"');
}
option_dict.query.query = '(' + search_list.join(' OR ') + ') AND ' + option_dict.query.query;
}
return gadget.jio_allDocs(option_dict.query)
.push(function (result) {
var promise_list = [],
i_len,
i;
all_docs_result = result;
for (i = 0, i_len = result.data.total_rows; i < i_len; i += 1) {
promise_list.push(gadget.getUrlFor({jio_key: result.data.rows[i].id, page: 'view'}));
}
return RSVP.all(promise_list);
})
.push(function (link_list) {
var row_list = [],
cell_list,
i_len,
i,
j_len,
j,
value;
// build handlebars object
for (j = 0, j_len = all_docs_result.data.total_rows; j < j_len; j += 1) {
cell_list = [];
for (i = 0, i_len = option_dict.column_list.length; i < i_len; i += 1) {
value = option_dict.column_list[i].select === "url_string" ?
all_docs_result.data.rows[j].id :
all_docs_result.data.rows[j].value[option_dict.column_list[i].select];
cell_list.push({
"href": link_list[j],
"value": value
});
}
row_list.push({"cell_list": cell_list});
}
for (i = 0; i < option_dict.column_list.length; i += 1) {
translated_column_list.push(gadget.translate(option_dict.column_list[i].title));
}
return RSVP.all([
row_list,
RSVP.all(translated_column_list)
]);
})
.push(function (result_list) {
content += listbox_widget_table({
widget_theme : option_dict.widget_theme,
search: option_dict.search,
column_list: result_list[1],
row_list: result_list[0]
});
gadget.property_dict.element.querySelector(".custom-grid .ui-body-c")
.innerHTML = content;
gadget.property_dict.render_deferred.resolve();
});
})
/////////////////////////////////////////////////////////////////
// declared service
/////////////////////////////////////////////////////////////////
.declareService(function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
return gadget.property_dict.render_deferred.promise;
})
.push(function () {
return loopEventListener(
gadget.property_dict.element.querySelector('form'),
'submit',
false,
function (evt) {
return gadget.redirect({
jio_key: gadget.property_dict.option_dict.jio_key || '',
page: gadget.property_dict.option_dict.search_page || '',
search: evt.target[0].value
});
}
);
});
});
}(window, rJS, RSVP, Handlebars, loopEventListener));
\ No newline at end of file
......@@ -222,7 +222,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.55462.40798.5324</string> </value>
<value> <string>955.56066.6312.29166</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -240,7 +240,7 @@
</tuple>
<state>
<tuple>
<float>1481295757.83</float>
<float>1481502794.84</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -8883,10 +8883,10 @@ return new Parser;
use_bulk_get: use_bulk_get,
conflict_force: (context._conflict_handling ===
CONFLICT_KEEP_REMOTE),
conflict_ignore: ((context._conflict_handling ===
CONFLICT_CONTINUE) ||
(context._conflict_handling ===
CONFLICT_KEEP_LOCAL)),
conflict_ignore: (context._conflict_handling ===
CONFLICT_CONTINUE) ||
(context._conflict_handling ===
CONFLICT_KEEP_LOCAL),
check_modification: context._check_remote_modification,
check_creation: context._check_remote_creation,
check_deletion: context._check_remote_deletion
......@@ -12077,7 +12077,8 @@ return new Parser;
};
IndexedDBStorage.prototype.getAttachment = function (id, name, options) {
var type,
var transaction,
type,
start,
end;
if (options === undefined) {
......@@ -12085,63 +12086,48 @@ return new Parser;
}
return openIndexedDB(this)
.push(function (db) {
return new RSVP.Promise(function (resolve, reject) {
var transaction = openTransaction(db, ["attachment", "blob"],
"readonly"),
// XXX Should raise if key is not good
request = transaction.objectStore("attachment")
.get(buildKeyPath([id, name]));
request.onerror = function (error) {
transaction.abort();
reject(error);
};
request.onsuccess = function () {
var attachment = request.result,
total_length,
i,
promise_list = [],
store = transaction.objectStore("blob"),
start_index,
end_index;
if (!attachment) {
return reject(
new jIO.util.jIOError("Cannot find attachment", 404)
);
}
transaction = openTransaction(db, ["attachment", "blob"], "readonly");
// XXX Should raise if key is not good
return handleGet(transaction.objectStore("attachment")
.get(buildKeyPath([id, name])));
})
.push(function (attachment) {
var total_length = attachment.info.length,
i,
promise_list = [],
store = transaction.objectStore("blob"),
start_index,
end_index;
total_length = attachment.info.length;
type = attachment.info.content_type;
start = options.start || 0;
end = options.end || total_length;
if (end > total_length) {
end = total_length;
}
type = attachment.info.content_type;
start = options.start || 0;
end = options.end || total_length;
if (end > total_length) {
end = total_length;
}
if (start < 0 || end < 0) {
throw new jIO.util.jIOError("_start and _end must be positive",
400);
}
if (start > end) {
throw new jIO.util.jIOError("_start is greater than _end",
400);
}
if (start < 0 || end < 0) {
throw new jIO.util.jIOError("_start and _end must be positive",
400);
}
if (start > end) {
throw new jIO.util.jIOError("_start is greater than _end",
400);
}
start_index = Math.floor(start / UNITE);
end_index = Math.floor(end / UNITE);
if (end % UNITE === 0) {
end_index -= 1;
}
start_index = Math.floor(start / UNITE);
end_index = Math.floor(end / UNITE);
if (end % UNITE === 0) {
end_index -= 1;
}
for (i = start_index; i <= end_index; i += 1) {
promise_list.push(
handleGet(store.get(buildKeyPath([id,
name, i])))
);
}
resolve(RSVP.all(promise_list));
};
});
for (i = start_index; i <= end_index; i += 1) {
promise_list.push(
handleGet(store.get(buildKeyPath([id,
name, i])))
);
}
return RSVP.all(promise_list);
})
.push(function (result_list) {
var array_buffer_list = [],
......@@ -12201,12 +12187,10 @@ return new Parser;
}
// Remove previous attachment
transaction = openTransaction(db, ["attachment", "blob"],
"readwrite", false);
transaction = openTransaction(db, ["attachment", "blob"], "readwrite");
return removeAttachment(transaction, id, name);
})
.push(function () {
transaction = openTransaction(db, ["attachment", "blob"], "readwrite");
var promise_list = [
handleRequest(transaction.objectStore("attachment").put({
......@@ -12882,10 +12866,6 @@ return new Parser;
if (sub_doc.id !== undefined) {
return sub_doc.id;
}
throw new jIO.util.jIOError(
"Cannot find id field related",
400
);
}
query = new SimpleQuery({
key: storage._mapping_dict.id.equal,
......@@ -12938,6 +12918,10 @@ return new Parser;
return property;
}
}
if (!storage._map_all_property ||
storage._mapping_dict[property] === "ignore") {
return false;
}
if (storage._map_all_property) {
sub_doc[property] = doc[property];
return property;
......@@ -12960,6 +12944,10 @@ return new Parser;
return property;
}
}
if (!storage._map_all_property ||
storage._mapping_dict[property] === "ignore") {
return property;
}
if (storage._map_all_property) {
if (sub_doc.hasOwnProperty(property)) {
doc[property] = sub_doc[property];
......@@ -13262,7 +13250,6 @@ return new Parser;
)
.push(function (result) {
for (i = 0; i < result.data.total_rows; i += 1) {
result.data.rows[i].value.id = result.data.rows[i].id;
result.data.rows[i].value =
mapToMainDocument(
context,
......
......@@ -97,6 +97,16 @@
<key> <string>portal_type</string> </key>
<value> <string>Web Script</string> </value>
</item>
<item>
<key> <string>revision</string> </key>
<value> <string>10</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>jio.js</string> </value>
......@@ -234,7 +244,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.55534.6594.50944</string> </value>
<value> <string>955.59479.27056.28433</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -252,7 +262,7 @@
</tuple>
<state>
<tuple>
<float>1481328691.34</float>
<float>1481540344.93</float>
<string>UTC</string>
</tuple>
</state>
......
/*globals window, document, RSVP, rJS, navigator, jIO, MessageChannel, ProgressEvent*/
/*jslint indent: 2, maxlen: 80, nomen: true*/
var repair = false;
(function (window, document, RSVP, rJS, jIO, navigator, MessageChannel,
ProgressEvent) {
"use strict";
var serviceWorker_setting_storage = jIO.createJIO({
type: "uuid",
sub_storage: {
type: "indexeddb",
database: "serviceWorker_settings"
}
});
function createStorage(version) {
return jIO.createJIO({
type: "replicate",
conflict_handling: 2,
check_remote_modification: false,
check_remote_deletion: false,
check_local_creation: false,
check_local_deletion: false,
check_local_modification: false,
query: {
query: 'portal_type: ("Web Illustration",' +
'"Web Manifest","Web Script","Web Style","Web Page")' +
'AND version:"' + version + '"',
"limit": [0, 27131],
"select_list": ["url_string"]
},
signature_storage: {
type: "uuid",
sub_storage: {
type: "indexeddb",
database: version + "_hash"
}
},
local_sub_storage: {
type: "mapping",
map_all_property: true,
mapping_dict: {
"id": {"equal": "relative_url"},
"url_string": {"equal": "id"}
},
sub_storage: {
type: "query",
sub_storage: {
type: "uuid",
sub_storage: {
type: "indexeddb",
database: version
}
}
}
},
remote_sub_storage: {
type: "erp5",
url: window.location.href + "/hateoasnoauth",
default_view_reference: "jio_view"
}
});
}
function postMessage(gadget, message) {
return new RSVP.Promise(function (resolve, reject) {
var messageChannel = new MessageChannel();
messageChannel.port1.onmessage = function (event) {
if (event.data.error) {
reject(event.data.error);
} else {
return resolve(event.data);
}
};
gadget.props.serviceWorker.postMessage(
JSON.stringify(message),
[messageChannel.port2]
);
});
}
rJS(window)
.ready(function (gadget) {
var element_list =
gadget.element.querySelectorAll("[data-install-configuration]"),
i,
key,
value,
gadget_list = [];
gadget.props = {};
gadget.props.cached_url = [];
gadget.gadget_list = [];
function pushGadget(url, i) {
var element = document.createElement("div");
element.setAttribute("style", "display: none");
gadget.element.appendChild(element);
return gadget.declareGadget(url,
{
"scope": "sub_app_installer_" + i,
"element": element,
"sandbox": "iframe"
})
.push(function (sub_gadget) {
gadget.gadget_list.push(sub_gadget);
return sub_gadget.setSubInstall();
});
}
for (i = 0; i < element_list.length; i += 1) {
key = element_list[i].getAttribute('data-install-configuration');
value = element_list[i].textContent;
if (key === "sub_app_installer") {
if (value !== "") {
gadget_list = value.split('\n');
}
} else {
gadget.props[key] = value;
}
}
return gadget.render()
.push(function () {
var promise_list = [];
for (i = 0; i < gadget_list.length; i += 1) {
promise_list.push(pushGadget(gadget_list[i], i + 1));
}
return RSVP.all(promise_list);
});
})
.declareMethod("render", function () {
var gadget = this,
element = document.createElement("div");
element.className = "presentation";
gadget.element.insertBefore(element, gadget.element.firstChild);
return gadget.declareGadget(
"gadget_officejs_install_presentation.html",
{"scope": "presentation", "element": element}
)
.push(function (presentation_gadget) {
return presentation_gadget.render(
{"app_name": gadget.props.app_name}
);
});
})
.declareMethod("setSubInstall", function () {
this.props.sub = true;
})
.declareMethod("mainInstall", function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
if (gadget.props.document_version) {
return gadget.install();
}
})
.push(function () {
var promise_list = [], i;
for (i = 0; i < gadget.gadget_list.length; i += 1) {
promise_list.push(gadget.gadget_list[i].waitInstall());
}
return RSVP.all(promise_list);
})
.push(function () {
gadget.props.is_installed = true;
if (gadget.installing !== undefined) {
gadget.installing.resolve();
}
if (!gadget.props.sub) {
window.location.href = gadget.props.version_url;
}
})
.push(undefined, function (error) {
if (error instanceof ProgressEvent) {
if (gadget.props.sub === undefined) {
window.location.href = gadget.props.version_url;
}
return;
}
throw error;
});
})
.declareMethod("waitInstall", function () {
if (this.props.is_installed) {
return;
}
this.installing = RSVP.defer();
return this.installing.promise;
})
.declareMethod("install", function () {
var gadget = this;
return serviceWorker_setting_storage.put(
window.location.href + gadget.props.version_url,
{"version": gadget.props.document_version}
)
.push(function () {
gadget.props.storage = createStorage(gadget.props.document_version);
return gadget.props.storage.repair();
})
.push(function () {
// transform a cache to url_list
if (gadget.props.cache_file && gadget.props.cache_file !== "") {
gadget.props.storage = jIO.createJIO({
type: "query",
sub_storage: {
type: "uuid",
sub_storage: {
type: "indexeddb",
database: gadget.props.document_version
}
}
});
return gadget.props.storage.get(gadget.props.cache_file)
.push(function (doc) {
var url_list = doc.text_content.split('\n'),
i,
start = url_list.indexOf("CACHE:") + 1,
len = url_list.indexOf("NETWORK:");
for (i = start; i < len; i += 1) {
if (url_list[i] !== "" &&
url_list[i].charAt(0) !== '#' &&
url_list[i].charAt(0) !== ' ') {
gadget.props.cached_url.push(url_list[i]);
}
}
});
}
})
.push(function () {
// remove base if present
if (document.querySelector("base")) {
document.querySelector("head").removeChild(
document.querySelector("base")
);
}
return navigator.serviceWorker.register(
"gadget_officejs_install_serviceworker.js",
{"scope": gadget.props.version_url }
);
})
.push(function (registration) {
if (registration.installing) {
gadget.props.serviceWorker = registration.installing;
} else if (registration.waiting) {
gadget.props.serviceWorker = registration.waiting;
} else if (registration.active) {
gadget.props.serviceWorker = registration.active;
}
})
.push(function () {
return postMessage(
gadget,
{
"action": "install",
"url_list": gadget.props.cached_url,
"version": gadget.props.document_version
}
);
});
})
.declareService(function () {
var gadget = this;
function redirect() {
window.location.href = gadget.props.redirect_url;
}
if (!("serviceWorker" in navigator)) {
window.applicationCache.addEventListener("cached", redirect);
window.applicationCache.addEventListener('noupdate', redirect);
window.setTimeout(redirect, 10000);
} else {
return this.mainInstall();
}
});
/*globals window, document, RSVP, rJS, navigator, jIO, MessageChannel, ProgressEvent*/
/*jslint indent: 2, maxlen: 80, nomen: true*/
var repair = false;
(function (window, document, RSVP, rJS, jIO, navigator, MessageChannel,
ProgressEvent) {
"use strict";
var serviceWorker_setting_storage = jIO.createJIO({
type: "uuid",
sub_storage: {
type: "indexeddb",
database: "serviceWorker_settings"
}
});
function createStorage(version) {
return jIO.createJIO({
type: "replicate",
conflict_handling: 2,
check_remote_modification: false,
check_remote_deletion: false,
check_local_creation: false,
check_local_deletion: false,
check_local_modification: false,
query: {
query: 'portal_type: ("Web Illustration",' +
'"Web Manifest","Web Script","Web Style","Web Page")' +
'AND version:"' + version + '"',
"limit": [0, 27131],
"select_list": ["url_string"]
},
signature_storage: {
type: "uuid",
sub_storage: {
type: "indexeddb",
database: version + "_hash"
}
},
local_sub_storage: {
type: "mapping",
map_all_property: true,
mapping_dict: {
"id": {"equal": "relative_url"},
"url_string": {"equal": "id"}
},
sub_storage: {
type: "query",
sub_storage: {
type: "uuid",
sub_storage: {
type: "indexeddb",
database: version
}
}
}
},
remote_sub_storage: {
type: "erp5",
url: window.location.href + "/hateoasnoauth",
default_view_reference: "jio_view"
}
});
}
function postMessage(gadget, message) {
return new RSVP.Promise(function (resolve, reject) {
var messageChannel = new MessageChannel();
messageChannel.port1.onmessage = function (event) {
if (event.data.error) {
reject(event.data.error);
} else {
return resolve(event.data);
}
};
gadget.props.serviceWorker.postMessage(
JSON.stringify(message),
[messageChannel.port2]
);
});
}
rJS(window)
.ready(function (gadget) {
var element_list =
gadget.element.querySelectorAll("[data-install-configuration]"),
i,
key,
value,
gadget_list = [];
gadget.props = {};
gadget.props.cached_url = [];
gadget.gadget_list = [];
function pushGadget(url, i) {
var element = document.createElement("div");
element.setAttribute("style", "display: none");
gadget.element.appendChild(element);
return gadget.declareGadget(url,
{
"scope": "sub_app_installer_" + i,
"element": element,
"sandbox": "iframe"
})
.push(function (sub_gadget) {
gadget.gadget_list.push(sub_gadget);
return sub_gadget.setSubInstall();
});
}
for (i = 0; i < element_list.length; i += 1) {
key = element_list[i].getAttribute('data-install-configuration');
value = element_list[i].textContent;
if (key === "sub_app_installer") {
if (value !== "") {
gadget_list = value.split('\n');
}
} else {
gadget.props[key] = value;
}
}
return gadget.render()
.push(function () {
var promise_list = [];
for (i = 0; i < gadget_list.length; i += 1) {
promise_list.push(pushGadget(gadget_list[i], i + 1));
}
return RSVP.all(promise_list);
});
})
.declareMethod("render", function () {
var gadget = this,
element = document.createElement("div");
element.className = "presentation";
gadget.element.insertBefore(element, gadget.element.firstChild);
return gadget.declareGadget(
"gadget_officejs_install_presentation.html",
{"scope": "presentation", "element": element}
)
.push(function (presentation_gadget) {
return presentation_gadget.render(
{"app_name": gadget.props.app_name}
);
});
})
.declareMethod("setSubInstall", function () {
this.props.sub = true;
})
.declareMethod("mainInstall", function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
if (gadget.props.document_version) {
return gadget.install();
}
})
.push(function () {
var promise_list = [], i;
for (i = 0; i < gadget.gadget_list.length; i += 1) {
promise_list.push(gadget.gadget_list[i].waitInstall());
}
return RSVP.all(promise_list);
})
.push(function () {
gadget.props.is_installed = true;
if (gadget.installing !== undefined) {
gadget.installing.resolve();
}
if (!gadget.props.sub) {
window.location.href = gadget.props.version_url;
}
})
.push(undefined, function (error) {
if (error instanceof ProgressEvent) {
if (gadget.props.sub === undefined) {
window.location.href = gadget.props.version_url;
}
return;
}
throw error;
});
})
.declareMethod("waitInstall", function () {
if (this.props.is_installed) {
return;
}
this.installing = RSVP.defer();
return this.installing.promise;
})
.declareMethod("install", function () {
var gadget = this;
return serviceWorker_setting_storage.put(
window.location.href + gadget.props.version_url,
{"version": gadget.props.document_version}
)
.push(function () {
gadget.props.storage = createStorage(gadget.props.document_version);
return gadget.props.storage.repair();
})
.push(function () {
// transform a cache to url_list
if (gadget.props.cache_file && gadget.props.cache_file !== "") {
gadget.props.storage = jIO.createJIO({
type: "query",
sub_storage: {
type: "uuid",
sub_storage: {
type: "indexeddb",
database: gadget.props.document_version
}
}
});
return gadget.props.storage.get(gadget.props.cache_file)
.push(function (doc) {
var url_list = doc.text_content.split('\r\n'),
i,
take = false;
if (typeof url_list === "string") {
url_list = doc.text_content.split('\n');
}
for (i = 0; i < url_list.length; i += 1) {
if (url_list[i].indexOf("NETWORK:") >= 0) {
take = false;
}
if (take &&
url_list[i] !== "" &&
url_list[i].charAt(0) !== '#' &&
url_list[i].charAt(0) !== ' ') {
url_list[i].replace("\r","");
gadget.props.cached_url.push(url_list[i]);
}
if (url_list[i].indexOf("CACHE:") >= 0) {
take = true;
}
}
});
}
})
.push(function () {
// remove base if present
if (document.querySelector("base")) {
document.querySelector("head").removeChild(
document.querySelector("base")
);
}
return navigator.serviceWorker.register(
"gadget_officejs_install_serviceworker.js",
{"scope": gadget.props.version_url }
);
})
.push(function (registration) {
if (registration.installing) {
gadget.props.serviceWorker = registration.installing;
} else if (registration.waiting) {
gadget.props.serviceWorker = registration.waiting;
} else if (registration.active) {
gadget.props.serviceWorker = registration.active;
}
})
.push(function () {
return postMessage(
gadget,
{
"action": "install",
"url_list": gadget.props.cached_url,
"version": gadget.props.document_version
}
);
});
})
.declareService(function () {
var gadget = this;
function redirect() {
window.location.href = gadget.props.redirect_url;
}
if (!("serviceWorker" in navigator)) {
window.applicationCache.addEventListener("cached", redirect);
window.applicationCache.addEventListener('noupdate', redirect);
window.setTimeout(redirect, 10000);
} else {
return this.mainInstall();
}
});
}(window, document, RSVP, rJS, jIO, navigator, MessageChannel, ProgressEvent));
\ No newline at end of file
......@@ -222,7 +222,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>955.55436.28704.31573</string> </value>
<value> <string>955.59498.53728.18602</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -240,7 +240,7 @@
</tuple>
<state>
<tuple>
<float>1481294187.07</float>
<float>1481538523.87</float>
<string>UTC</string>
</tuple>
</state>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment