Commit 321a90cf authored by Roque's avatar Roque

erp5_officejs: refactoring on action handling

- new gadget for common features
- controller only renders view of a document
- new action for post creation
- corresponding action handling
parent 373ad4ff
......@@ -5,11 +5,11 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>OfficeJS Add Post Document</title>
<title>OfficeJS Common Utils</title>
<script src="rsvp.js"></script>
<script src="renderjs.js"></script>
<script src="gadget_officejs_create_document.js"></script>
<script src="gadget_officejs_common_utils.js"></script>
</head>
......
......@@ -87,7 +87,7 @@
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_create_document.html</string> </value>
<value> <string>gadget_officejs_common_utils.html</string> </value>
</item>
<item>
<key> <string>description</string> </key>
......@@ -97,7 +97,7 @@
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_officejs_create_document_html</string> </value>
<value> <string>gadget_officejs_common_utils_html</string> </value>
</item>
<item>
<key> <string>language</string> </key>
......@@ -136,7 +136,7 @@
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OfficeJS Create Document</string> </value>
<value> <string>OfficeJS Common Utils</string> </value>
</item>
<item>
<key> <string>url_string</string> </key>
......@@ -273,7 +273,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.61745.63686.35191</string> </value>
<value> <string>974.64532.61017.11673</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -291,7 +291,7 @@
</tuple>
<state>
<tuple>
<float>1554915049.41</float>
<float>1555082263.73</float>
<string>UTC</string>
</tuple>
</state>
......
/*global window, rJS */
/*jslint nomen: true, indent: 2, maxerr: 3 */
(function (document, window, rJS, RSVP) {
"use strict";
function renderField(field_id, field_definition, document) {
var key, raw_value, tales_expr, override, final_value, result = {};
for (key in field_definition.values) {
if (field_definition.values.hasOwnProperty(key)) {
// order to get the final value (based on Field.py get_value)
// 1.tales, 2.override, 3.form-def-value, 4.context-default
raw_value = field_definition.values[key];
tales_expr = field_definition.tales[key];
override = field_definition.overrides[key];
final_value = undefined;
if (tales_expr !== undefined && tales_expr !== null && tales_expr !== '') {
try {
throw "error";
//final_value = eval(tales_expr);
} catch (ignore) {} // TALES expressions are usually python code, so for now ignore
}
if (final_value === undefined) {
if (override !== undefined && override !== null && override !== '') {
final_value = override;
} else if (raw_value !== undefined && raw_value !== null && raw_value !== '') {
final_value = raw_value;
} else if (document && document.hasOwnProperty(key)) {
final_value = document[key];
}
}
if (final_value !== undefined && final_value !== null && final_value !== '') {
result[key] = final_value;
}
}
}
result.type = field_definition.type;
result.key = field_id;
if (document && document.hasOwnProperty(field_id)) {
result["default"] = document[field_id];
}
return result;
}
rJS(window)
/////////////////////////////////////////////////////////////////
// Acquired methods
/////////////////////////////////////////////////////////////////
.declareAcquiredMethod("updateHeader", "updateHeader")
.declareAcquiredMethod("isDesktopMedia", "isDesktopMedia")
.declareAcquiredMethod("getUrlForList", "getUrlForList")
.declareAcquiredMethod("getSetting", "getSetting")
.declareAcquiredMethod("redirect", "redirect")
.declareAcquiredMethod("jio_get", "jio_get")
.declareAcquiredMethod("jio_put", "jio_put")
.declareAcquiredMethod("jio_post", "jio_post")
.declareAcquiredMethod("jio_allDocs", "jio_allDocs")
.declareAcquiredMethod("getUrlParameter", "getUrlParameter")
.declareAcquiredMethod("notifySubmitted", 'notifySubmitted')
.declareAcquiredMethod("notifySubmitting", "notifySubmitting")
/////////////////////////////////////////////////////////////////
// declared methods
/////////////////////////////////////////////////////////////////
.declareMethod("createDocument", function (options) {
var gadget = this,
doc = {
title: "Untitled Document",
portal_type: options.portal_type,
parent_relative_url: options.parent_relative_url
}, key, doc_key, doc_id;
for (key in options) {
if (options.hasOwnProperty(key)) {
if (key.startsWith("my_")) {
doc_key = key.replace("my_", "");
doc[doc_key] = options[key];
}
}
}
return gadget.jio_post(doc);
})
.declareMethod("getFormDefinition", function (portal_type, action_reference) {
var gadget = this,
parent = "portal_types/" + portal_type,
query = 'portal_type: "Action Information" AND reference: "' + action_reference + '" AND parent_relative_url: "' + parent + '"';
return gadget.jio_allDocs({query: query})
.push(function (data) {
if (data.data.rows.length === 0) {
throw "Can not find action " + action_reference + " for portal type " + portal_type;
}
return gadget.jio_get(data.data.rows[0].id);
})
.push(function (action_result) {
return gadget.jio_get(action_result.action);
})
.push(function (form_result) {
return form_result.form_definition;
});
})
.declareMethod("renderForm", function (form_definition, document) {
var i, j, fields, field_info, my_element, element_id, rendered_field,
raw_properties = form_definition.fields_raw_properties,
form_json = {
erp5_document: {
"_embedded": {"_view": {}},
"_links": {}
},
form_definition: form_definition
};
for (i = 0; i < form_definition.group_list.length; i += 1) {
fields = form_definition.group_list[i][1];
for (j = 0; j < fields.length; j += 1) {
my_element = fields[j][0];
if (my_element.startsWith("my_")) {
element_id = my_element.replace("my_", "");
} else if (my_element.startsWith("your_")) {
element_id = my_element.replace("your_", "");
} else {
element_id = my_element;
}
if (raw_properties.hasOwnProperty(my_element)) {
field_info = raw_properties[my_element];
rendered_field = renderField(element_id, field_info, document);
form_json.erp5_document._embedded._view[my_element] = rendered_field;
}
}
}
form_json.erp5_document._embedded._view._actions = form_definition._actions;
form_json.erp5_document._links = form_definition._links;
return form_json;
})
.declareMethod("renderGadget", function (target_gadget) {
var fragment = document.createElement('div'),
gadget = this, form_json;
return gadget.renderForm(target_gadget.state.form_definition, target_gadget.state.doc)
.push(function (json) {
form_json = json;
while (target_gadget.element.firstChild) {
target_gadget.element.removeChild(target_gadget.element.firstChild);
}
target_gadget.element.appendChild(fragment);
return target_gadget.declareGadget(target_gadget.state.child_gadget_url, {element: fragment, scope: 'fg'});
})
.push(function (form_gadget) {
return gadget.renderSubGadget(target_gadget, form_gadget, form_json);
});
})
.declareMethod("renderSubGadget", function (gadget, subgadget, form_json) {
var this_gadget = this, erp5_document = form_json.erp5_document;
return subgadget.render({
jio_key: gadget.state.jio_key,
doc: gadget.state.doc,
erp5_document: form_json.erp5_document,
form_definition: form_json.form_definition,
editable: gadget.state.editable,
view: gadget.state.view,
form_json: form_json
})
// render the header
.push(function () {
var url_for_parameter_list = [
{command: 'change', options: {page: "tab"}},
{command: 'change', options: {page: "action_offline", jio_key: gadget.state.jio_key}},
{command: 'history_previous'},
{command: 'selection_previous'},
{command: 'selection_next'},
{command: 'change', options: {page: "export"}},
{command: 'display', options: {}}
];
erp5_document = form_json.erp5_document;
if (erp5_document._links && erp5_document._links.action_object_new_content_action) {
url_for_parameter_list.push({command: 'change', options: erp5_document._links.action_object_new_content_action});
}
return RSVP.all([
this_gadget.getUrlForList(url_for_parameter_list),
this_gadget.isDesktopMedia(),
this_gadget.getSetting('document_title_plural'),
this_gadget.getSetting('upload_dict', false)
]);
})
.push(function (result_list) {
var url_list = result_list[0], header_dict;
if (gadget.state.is_form_list) {
header_dict = {
panel_action: true,
jump_url: "",
fast_input_url: "",
front_url: url_list[6],
filter_action: true,
page_title: result_list[2]
};
} else {
header_dict = {
selection_url: url_list[2],
previous_url: url_list[3],
next_url: url_list[4],
page_title: gadget.state.doc.title
};
if (gadget.state.has_more_views) {
header_dict.tab_url = url_list[0];
}
if (gadget.state.editable) {
header_dict.save_action = true;
}
}
if (gadget.state.has_more_actions) {
header_dict.actions_url = url_list[1];
}
if (url_list[7]) {
header_dict.add_url = url_list[7];
}
if (result_list[1]) {
header_dict.export_url = (
erp5_document._links.action_object_jio_report ||
erp5_document._links.action_object_jio_exchange ||
erp5_document._links.action_object_jio_print
) ? url_list[5] : '';
}
return this_gadget.updateHeader(header_dict);
});
});
}(document, window, rJS, RSVP));
......@@ -83,7 +83,7 @@
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_create_document.js</string> </value>
<value> <string>gadget_officejs_common_utils.js</string> </value>
</item>
<item>
<key> <string>description</string> </key>
......@@ -93,7 +93,7 @@
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_officejs_create_document_js</string> </value>
<value> <string>gadget_officejs_common_utils_js</string> </value>
</item>
<item>
<key> <string>language</string> </key>
......@@ -132,7 +132,7 @@
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OfficeJS Create Document JS</string> </value>
<value> <string>OfficeJS Common Utils JS</string> </value>
</item>
<item>
<key> <string>url_string</string> </key>
......@@ -269,7 +269,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.61769.15176.41096</string> </value>
<value> <string>974.64648.4478.10854</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -287,7 +287,7 @@
</tuple>
<state>
<tuple>
<float>1554916400.71</float>
<float>1555089125.98</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -225,7 +225,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.60126.24569.41489</string> </value>
<value> <string>974.64563.38496.35959</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -243,7 +243,7 @@
</tuple>
<state>
<tuple>
<float>1554817831.18</float>
<float>1555084158.92</float>
<string>UTC</string>
</tuple>
</state>
......
/*global window, rJS */
/*jslint nomen: true, indent: 2, maxerr: 3 */
(function (window, rJS) {
"use strict";
rJS(window)
/////////////////////////////////////////////////////////////////
// Acquired methods
/////////////////////////////////////////////////////////////////
.declareAcquiredMethod("jio_post", "jio_post")
/////////////////////////////////////////////////////////////////
// declared methods
/////////////////////////////////////////////////////////////////
.declareMethod("createDocument", function (options) {
var gadget = this,
doc = {
title: "Untitled Document",
portal_type: options.portal_type,
parent_relative_url: options.parent_relative_url
}, key, doc_key, doc_id;
for (key in options) {
if (options.hasOwnProperty(key)) {
if (key.startsWith("my_")) {
doc_key = key.replace("my_", "");
doc[doc_key] = options[key];
}
}
}
return gadget.jio_post(doc);
});
//.declareMethod("render", function (options) { });
}(window, rJS));
......@@ -221,19 +221,19 @@ gadget_officejs_setting.html\n
officejs_logo_text_editor.png\n
\n
#discussion tool\n
gadget_officejs_discussion_tool_router.html\n
gadget_erp5_pt_form_view_editable.html\n
gadget_erp5_pt_form_view_editable.js\n
gadget_erp5_page_action_offline.html\n
gadget_erp5_page_action_offline.js\n
gadget_erp5_page_handle_action.html\n
gadget_erp5_page_handle_action.js\n
gadget_officejs_discussion_tool_router.html\n
gadget_erp5_page_ojs_controller.html\n
gadget_erp5_page_ojs_controller.js\n
gadget_erp5_page_ojs_post_list.html\n
gadget_erp5_page_ojs_post_list.js\n
gadget_officejs_create_document.html\n
gadget_officejs_create_document.js\n
gadget_officejs_common_utils.html\n
gadget_officejs_common_utils.js\n
gadget_erp5_page_handle_action.html\n
gadget_erp5_page_handle_action.js\n
\n
#needed for appcachestorage sync\n
/\n
......@@ -254,6 +254,7 @@ hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_skins%2Ferp5_o
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FHTML%20Post%2F1&view=view&appcache=1\n
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FHTML%20Post%2F2&view=view&appcache=1\n
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FHTML%20Post%2F3&view=view&appcache=1\n
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FPost%20Module%2F2&view=view&appcache=1\n
\n
gadget_erp5_field_listbox.html\n
gadget_erp5_field_listbox.js\n
......@@ -740,7 +741,7 @@ NETWORK:\n
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.61748.30410.53299</string> </value>
<value> <string>974.64716.44616.56832</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -758,7 +759,7 @@ NETWORK:\n
</tuple>
<state>
<tuple>
<float>1554916428.12</float>
<float>1555095850.49</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -121,6 +121,7 @@ hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_skins%2Ferp5_o
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FHTML%20Post%2F1&view=view&appcache=1\n
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FHTML%20Post%2F2&view=view&appcache=1\n
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FHTML%20Post%2F3&view=view&appcache=1\n
hateoas/ERP5Document_getHateoas?mode=traverse&relative_url=portal_types%2FPost%20Module%2F2&view=view&appcache=1\n
\n
NETWORK:\n
*
......@@ -284,7 +285,7 @@ NETWORK:\n
</tuple>
<state>
<tuple>
<float>1554293009.93</float>
<float>1555088098.27</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -18,6 +18,7 @@
<script data-renderjs-configuration="document_title" type="text/x-renderjs-configuration">Discussion Post</script>
<script data-renderjs-configuration="document_title_plural" type="text/x-renderjs-configuration">Discussion Posts</script>
<script data-renderjs-configuration="parent_relative_url" type="text/x-renderjs-configuration">post_module</script>
<script data-renderjs-configuration="parent_portal_type" type="text/x-renderjs-configuration">Post Module</script>
<script data-renderjs-configuration="erp5_attachment_synchro" type="text/x-renderjs-configuration"></script>
<script data-renderjs-configuration="dropbox_app_key" type="text/x-renderjs-configuration">n692ixxhyg9zhqs</script>
<div data-gadget-url="gadget_erp5_router.html" data-gadget-scope="erp5_router"></div>
......
......@@ -277,7 +277,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>973.4707.8937.55978</string> </value>
<value> <string>973.32055.15787.50517</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -295,7 +295,7 @@
</tuple>
<state>
<tuple>
<float>1549460594.44</float>
<float>1555088964.88</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -53,8 +53,7 @@
},
action: "Base_edit",
update_action: "",
//hardcoded action for new post. TODO: create corresponding configuration
_links: { "type": { name: "" }, "action_object_new_content_action": {page: "handle_action", action: "new_post", my_source_reference: fake_thread_uid} }
_links: { "type": { name: "" }, "action_object_new_content_action": {page: "handle_action", action: "new", my_source_reference: fake_thread_uid} }
},
form_json = {
erp5_document: {
......
......@@ -269,7 +269,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.61547.62474.32904</string> </value>
<value> <string>974.64716.929.1945</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -287,7 +287,7 @@
</tuple>
<state>
<tuple>
<float>1554903652.9</float>
<float>1555093212.0</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -228,7 +228,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.61546.47138.31283</string> </value>
<value> <string>974.63448.18577.4829</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -246,7 +246,7 @@
</tuple>
<state>
<tuple>
<float>1554903359.26</float>
<float>1555096738.2</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -273,7 +273,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.61695.23911.16588</string> </value>
<value> <string>974.63378.21801.49920</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -291,7 +291,7 @@
</tuple>
<state>
<tuple>
<float>1554912040.86</float>
<float>1555012972.05</float>
<string>UTC</string>
</tuple>
</state>
......
/*global window, rJS, RSVP */
/*jslint nomen: true, indent: 2, maxerr: 3 */
(function (window, rJS, RSVP) {
(function (document, window, rJS, RSVP) {
"use strict";
var gadget_utils, action_reference;
rJS(window)
/////////////////////////////////////////////////////////////////
// Acquired methods
/////////////////////////////////////////////////////////////////
.declareAcquiredMethod("updateHeader", "updateHeader")
.declareAcquiredMethod("getSetting", "getSetting")
.declareAcquiredMethod("jio_putAttachment", "jio_putAttachment")
.declareAcquiredMethod("redirect", "redirect")
.declareAcquiredMethod("jio_get", "jio_get")
.declareAcquiredMethod("jio_post", "jio_post")
.declareAcquiredMethod("jio_put", "jio_put")
.declareAcquiredMethod("getUrlParameter", "getUrlParameter")
.declareAcquiredMethod("notifySubmitted", 'notifySubmitted')
.declareAcquiredMethod("notifySubmitting", "notifySubmitting")
/////////////////////////////////////////////////////////////////
// declared methods
......@@ -21,63 +23,161 @@
.declareMethod("render", function (options) {
var gadget = this,
action_reference,
gadget_script;
child_gadget_url = 'gadget_erp5_pt_form_view_editable.html',
portal_type, parent_portal_type,
parent_relative_url, form_definition;
return RSVP.Queue()
.push(function () {
return RSVP.all([
gadget.getUrlParameter("action"),
//maybe these settings should come as url parameters too
gadget.getSetting('portal_type'),
gadget.getSetting('parent_relative_url'),
gadget.declareGadget("gadget_officejs_create_document.html")
gadget.getSetting('parent_portal_type'),
gadget.declareGadget("gadget_officejs_common_utils.html")
]);
})
.push(function (result) {
var portal_type = result[1],
parent_relative_url = result[2];
action_reference = result[0];
gadget_script = result[3];
portal_type = result[1];
parent_relative_url = result[2];
parent_portal_type = result[3];
gadget_utils = result[4];
// This is the custom code to handle each specific action
// TODO: move to specific gadgets by name? e.g. page: "action_" + portal_type + action_ref
if (action_reference === "new_post") {
options.portal_type = portal_type;
options.parent_relative_url = parent_relative_url;
return gadget_script.createDocument(options)
.push(function (id) {
return gadget.redirect({
command: 'display',
options: {
jio_key: id,
editable: true
}
if (action_reference === "new") {
var doc_options = {};
doc_options.portal_type = portal_type;
doc_options.parent_relative_url = parent_relative_url;
return gadget_utils.getFormDefinition(parent_portal_type, action_reference)
.push(function (result) {
form_definition = result;
return gadget_utils.createDocument(doc_options);
})
.push(function (jio_key) {
return gadget.jio_get(jio_key)
.push(function (new_document) {
return gadget.changeState({
jio_key: jio_key,
doc: new_document,
child_gadget_url: child_gadget_url,
form_definition: form_definition,
view: action_reference,
//HARDCODED: following fields should be indicated by the configuration
editable: true,
has_more_views: false,
has_more_actions: true,
is_form_list: false
});
});
});
}
if (action_reference === "reply") {
var parent_document, child_document, child_jio_key;
return gadget.jio_get(options.jio_key)
.push(function (document) {
var title = document.title;
.push(function (result) {
parent_document = result;
return gadget_utils.getFormDefinition(parent_document.portal_type, action_reference);
})
.push(function (result) {
var title = parent_document.title;
form_definition = result;
if (!title.startsWith("Re: ")) {
title = "Re: " + document.title;
title = "Re: " + parent_document.title;
}
options.portal_type = document.portal_type;
options.parent_relative_url = document.parent_relative_url;
options.my_title = title;
options.my_source_reference = document.source_reference;
return gadget_script.createDocument(options);
})
.push(function (id) {
return gadget.redirect({
command: "change",
options: {
page: undefined,
jio_key: id,
view: action_reference
}
return gadget.changeState({
doc: {title: title},
parent_document: parent_document,
child_gadget_url: child_gadget_url,
form_definition: form_definition,
view: action_reference,
//HARDCODED: following fields should be indicated by the configuration
editable: true,
has_more_views: false,
has_more_actions: false,
is_form_list: false
});
});
}
throw "Action " + action_reference + " not implemented yet";
});
})
.onStateChange(function () {
return gadget_utils.renderGadget(this);
})
.allowPublicAcquisition('notifySubmit', function () {
return this.triggerSubmit();
})
.declareMethod('triggerSubmit', function () {
return this.getDeclaredGadget('fg')
.push(function (gadget) {
return gadget.triggerSubmit();
});
})
.allowPublicAcquisition('submitContent', function (options) {
var gadget = this,
jio_key = options[0],
//target_url = options[1],
content_dict = options[2],
property;
// This is the custom code to handle each specific action
if (action_reference === "reply") {
var document = {
my_title: gadget.state.doc.title,
portal_type: gadget.state.parent_document.portal_type,
parent_relative_url: gadget.state.parent_document.parent_relative_url,
my_source_reference: gadget.state.parent_document.source_reference
};
for (property in content_dict) {
if (content_dict.hasOwnProperty(property)) {
document["my_" + property] = content_dict[property];
}
}
return gadget_utils.createDocument(document)
.push(function (jio_key) {
return gadget.notifySubmitting();
})
.push(function () {
return gadget.notifySubmitted({message: 'Data Updated', status: 'success'});
})
.push(function () {
return gadget.redirect({
command: 'display',
options: {
jio_key: jio_key,
editable: true
}
});
});
}
if (action_reference === "new") {
return gadget.notifySubmitting()
.push(function () {
// this should be jio_getattachment (using target_url)
return gadget.jio_get(jio_key);
})
.push(function (document) {
var property;
for (property in content_dict) {
if (content_dict.hasOwnProperty(property)) {
document[property] = content_dict[property];
}
}
return gadget.jio_put(jio_key, document);
})
.push(function () {
return gadget.notifySubmitted({message: 'Data Updated', status: 'success'});
})
.push(function () {
return gadget.redirect({
command: 'display',
options: {
jio_key: jio_key,
editable: true
}
});
});
}
});
}(window, rJS, RSVP));
}(document, window, rJS, RSVP));
......@@ -269,7 +269,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>974.61766.59384.31590</string> </value>
<value> <string>974.64758.23503.51456</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -287,7 +287,7 @@
</tuple>
<state>
<tuple>
<float>1554916263.24</float>
<float>1555096705.62</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