Commit cf7e940c authored by Xiaowu Zhang's avatar Xiaowu Zhang

erp5_web_renderjs_ui: reimplement multi relation

parent 3eb87be0
...@@ -5,19 +5,106 @@ ...@@ -5,19 +5,106 @@
<meta name="viewport" content="width=device-width, user-scalable=no" /> <meta name="viewport" content="width=device-width, user-scalable=no" />
<title>ERP5 MultiRelationstringfield</title> <title>ERP5 MultiRelationstringfield</title>
<!-- renderjs -->
<script src="rsvp.js" type="text/javascript"></script> <script src="rsvp.js" type="text/javascript"></script>
<script src="renderjs.js" type="text/javascript"></script> <script src="renderjs.js" type="text/javascript"></script>
<script src="URI.js" type="text/javascript"></script> <script src="URI.js" type="text/javascript"></script>
<!-- custom script --> <script src="handlebars.js" type="text/javascript"></script>
<script src="gadget_erp5_field_multirelationstring.js" type="text/javascript"></script>
<script src="gadget_global.js" type="text/javascript"></script> <script src="gadget_global.js" type="text/javascript"></script>
<script src="gadget_erp5_field_multirelationstring.js" type="text/javascript"></script>
<script id="create-template" type="text/x-handlebars-template">
<div class="ui-controlgroup ui-controlgroup-horizontal ui-corner-all">
<div class="ui-controlgroup-controls">
<li class="ui-first-child ui-last-child ui-input-text">Create:{{text}}
</li>
</div>
</script>
<script id="single-input-template" type="text/x-handlebars-template">
<fieldset class='single_input add_after'>
<div class="ui-input-text ui-body-inherit ui-corner-all ui-shadow-inset ui-input-has-clear ui-input-has-icon">
<input type='text' autocomplete="off" data-enhanced="true" >
<a href="#" tabindex="-1" class="ui-hidden-accessible">&nbsp;</a>
<div class="ui-tag-list ui-tag-list-inset"></div>
<ul class="ui-listview ui-corner-all search_ul"></ul>
</div>
<a href='#' tabindex="-1" class="ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plane ui-shadow-inset ui-btn-inline ui-disabled">Jump to this document</a>
</fieldset>
</script>
<script id="multi-input-template" type="text/x-handlebars-template">
<div class="container">
{{#each input}}
<fieldset class="single_input">
<div class="ui-input-text ui-body-inherit ui-corner-all ui-shadow-inset ui-input-has-clear ui-input-has-icon {{../readonly}}">
{{#if create_object}}
<input type='text' title="{{title}}" name="{{name}}" autocomplete="off" data-enhanced="true" value="{{value}}" data-create-object="{{create_object}}">
{{else}}
<input type='text' title="{{title}}" name="{{name}}" autocomplete="off" data-enhanced="true" value="{{value}}" >
{{/if}}
<a href="#" tabindex="-1" class="ui-hidden-accessible">&nbsp;</a>
<div class="ui-tag-list ui-tag-list-inset">
{{#if create_object}}
<div class="ui-controlgroup ui-controlgroup-horizontal ui-corner-all">
<div class="ui-controlgroup-controls">
<li class="ui-first-child ui-last-child ui-input-text">Create:{{create_object}}
</li>
</div>
</div>
{{/if}}
</div>
<ul class="ui-listview ui-corner-all search_ul"></ul>
</div>
{{#if create_object}}
<a href='#' tabindex="-1" class="ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plus ui-shadow-inset ui-btn-inline ui-disabled" >Jump to this document</a>
{{else}}
{{#if error_text}}
<a href='#' tabindex="-1" class="ui-btn ui-corner-all ui-btn-icon-notext ui-icon-warning ui-shadow-inset ui-btn-inline ui-disabled">Jump to this document</a>
{{else}}
{{#if jump_unknown}}
<a href='#' tabindex="-1" class="ui-btn ui-corner-all ui-btn-icon-notext ui-icon-warning ui-shadow-inset ui-btn-inline ui-disabled">Jump to this document</a>
{{else}}
{{#if href}}
{{#if ../allow_jump}}
<a href={{href}} tabindex="-1" class="ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plane ui-shadow-inset ui-btn-inline">Jump to this document</a>
{{else}}
<a href='#' tabindex="-1" class="ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plane ui-shadow-inset ui-btn-inline ui-disabled">Jump to this document</a>
{{/if}}
{{else}}
<a href='#' tabindex="-1" class="ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plane ui-shadow-inset ui-btn-inline ui-disabled">Jump to this document</a>
{{/if}}
{{/if}}
{{/if}}
{{/if}}
</fieldset>
{{/each}}
</div>
</script>
<script id="relation-listview-template" type="text/x-handlebars-template">
{{#if list.length}}
<li class="ui-autocomplete ui-li ui-li-divider ui-bar-inherit ui-first-child" role="heading">Select from the {{list.length}} Search Results</li>
{{#each list}}
<li class="ui-li-static ui-body-inherit ui-icon-mail-forward ui-btn-icon-right" data-relative-url={{id}} >{{value}}</li>
{{/each}}
{{#each type}}
<li class="ui-li-static ui-body-inherit ui-bar-inherit ui-icon-plus ui-btn-icon-right" data-create-object="{{this}}" name="{{this}}">Create New {{this}}: {{../value}}</li>
{{/each}}
{{else}}
<li class="ui-autocomplete ui-li ui-li-divider ui-bar-inherit ui-first-child" role="heading">No result</li>
{{#each type}}
<li class="ui-li-static ui-body-inherit ui-bar-inherit ui-icon-plus ui-btn-icon-right" data-create-object="{{this}}" name="{{this}}">Create New {{this}}: {{../value}}</li>
{{/each}}
{{/if}}
<li class="ui-li-static ui-body-inherit ui-last-child ui-bar-inherit ui-icon-search ui-btn-icon-right" data-explore=true >Explore the Search Result List</li>
</script>
</head> </head>
<body> <body>
<div>
<div class="div_field">
</div>
</body> </body>
</html> </html>
\ No newline at end of file
/*global window, document, rJS, RSVP, URI, loopEventListener, /*jslint indent: 2, maxerr: 3, nomen: true */
promiseEventListener */ /*global window, rJS, RSVP, URI, loopEventListener, Handlebars, Event, document,
/*jslint indent: 2, maxerr: 3 */ SimpleQuery, ComplexQuery, Query, QueryFactory, promiseEventListener, $*/
(function (window, document, rJS, RSVP, URI, loopEventListener, (function (window, rJS, RSVP, URI, loopEventListener, promiseEventListener, document,
promiseEventListener) { SimpleQuery, ComplexQuery, Query, QueryFactory, Handlebars, Event, $) {
"use strict"; "use strict";
////////////////////////////////////
// Some methods
////////////////////////////////////
// XXX: re-factor. var gadget_klass = rJS(window),
// clear the autocomplete options, reset the plane tag and remove the create single_input_source = gadget_klass.__template_element
// new tag. Since plane and new tag sometimes need to stay, "override_tag" .getElementById("single-input-template")
// can be set to something arbitrary to prevent removal of the respective .innerHTML,
// element. single_input_template = Handlebars.compile(single_input_source),
function clearResults(wrapper, my_override_tag) { relation_listview_source = gadget_klass.__template_element
function dump(my_parent, my_tag_name) { .getElementById("relation-listview-template")
var child_list = my_parent.children, .innerHTML,
i, relation_listview_template = Handlebars.compile(relation_listview_source),
i_len, multi_input_source = gadget_klass.__template_element
child; .getElementById("multi-input-template")
.innerHTML,
// XXX: now that link ("A") stays, rewrite the whole element clearing! multi_input_template = Handlebars.compile(multi_input_source),
for (i = 0, i_len = child_list.length; i < i_len; i += 1) { create_source = gadget_klass.__template_element
child = child_list[i]; .getElementById("create-template")
if (child && child.tagName === my_tag_name) { .innerHTML,
if (my_tag_name === "A") { create_template = Handlebars.compile(create_source),
child.className += " ui-disabled";
} else { searching = "ui-btn ui-corner-all ui-btn-icon-notext" +
my_parent.removeChild(child); " ui-input-clear ui-icon-spinner ui-icon-spin",
} searched = "ui-hidden-accessible",
} jump_on = "ui-btn ui-corner-all ui-btn-icon-notext " +
} "ui-icon-plane ui-shadow-inset ui-btn-inline",
} jump_off = "ui-btn ui-corner-all ui-btn-icon-notext " +
"ui-icon-plane ui-shadow-inset ui-btn-inline ui-disabled",
// always clear autocomplete results (UL), the create new record input (DIV) jump_add = "ui-btn ui-corner-all ui-btn-icon-notext " +
// will only be removed on new searches, while the plane (A) is disabled "ui-icon-plus ui-shadow-inset ui-btn-inline ui-disabled",
dump(wrapper, "UL"); jump_unknown = "ui-btn ui-corner-all ui-btn-icon-notext " +
dump(wrapper, my_override_tag || "DIV"); "ui-icon-warning ui-shadow-inset ui-btn-inline ui-disabled";
dump(wrapper.parentElement, my_override_tag || "A");
}
// creates a tag indicating the value entered will be added as new object
// of displayed type when the form is submitted. Clicking the tag will function listenToInput(gadget, index) {
// reset the field, because otherwise accidentially typing something always var props = gadget.props,
// requires to reselect and manually backspace the value. Click to reset is div = gadget.props.element.querySelectorAll('.single_input')[index],
// much easier/faster input = div.querySelector('input'),
function createNewTag(my_gadget, i) { search_query,
var props = my_gadget.props, simple_query,
plane = div.querySelector('.ui-btn'),
field_json = props.field_json, field_json = props.field_json,
tag, spinner = div.querySelector('.ui-hidden-accessible'),
group, create_div = div.querySelector(".ui-tag-list"),
controls, ul = div.querySelector(".search_ul");
info,
link; function generateList(event) {
var catalog_index = field_json.catalog_index,
info = field_json.portal_types.filter(function (item, pos, self) { begin_from = props.begin_from || 0,
return self.indexOf(item) === pos; lines = field_json.lines || 10,
}).join(""); my_value = event.target.value;
link = document.createElement("a"); ul.innerHTML = "";
link.setAttribute("href", "#"); create_div.innerHTML = "";
link.className = "ui-first-child ui-last-child ui-btn ui-corner-all " + plane.className = jump_off;
"ui-btn-inherit ui-btn-active ui-btn-icon-right ui-icon-delete"; props.jump_url[index] = "";
link.textContent = "Create: " + info; if (my_value === "") {
my_gadget.props.select_uid_list[i] = "_newContent_" + info; spinner.className = searched;
return;
controls = document.createElement("div"); }
controls.className = "ui-controlgroup-controls"; simple_query = new SimpleQuery({
controls.appendChild(link); key: catalog_index,
value: my_value
});
group = document.createElement("div"); spinner.className = searching;
group.className = "ui-controlgroup ui-controlgroup-horizontal " + search_query = Query.objectToSearchText(new ComplexQuery({
"ui-corner-all"; operator: "AND",
group.appendChild(controls); query_list: [gadget.props.query, simple_query]
}));
tag = document.createElement("div"); return new RSVP.Queue()
tag.className = "ui-tag-list ui-tag-list-inset"; .push(function () {
tag.appendChild(group); return gadget.jio_allDocs({
"query": search_query,
return tag; "limit": [begin_from, begin_from + lines],
} "select_list": [catalog_index]
});
// creates a set of autocomplete suggestings. Currently this is only a plain })
// list of elements. The list will display the number of results (>10 or .push(function (result) {
// exact). Clicking on an option will set this option as field value var list = [],
function createResults(my_result_list, index) { i,
var list = document.createElement("ul"), type = field_json.allow_creation ? field_json.portal_types : [],
head = document.createElement("li"), html;
str = "ui-li-static ui-body-inherit ui-icon-mail-forward " + for (i = 0; i < result.data.rows.length; i += 1) {
"ui-btn-icon-right", list.push({
len = my_result_list.length, id: result.data.rows[i].id,
prefix = "", value: result.data.rows[i].value[catalog_index]
item, });
value_dict, }
result, spinner.className = searched;
i; html = relation_listview_template({
list: list,
if (len === 11) { type: type,
prefix = ">"; value: my_value
len = 10; });
$(ul).toggle();
ul.innerHTML = html;
$(ul).toggle();
});
} }
head.className = "ui-autocomplete ui-li ui-li-divider ui-bar-inherit";
head.setAttribute("role", "heading");
head.textContent = prefix + " " + len + " Result(s)";
list.appendChild(head);
for (i = 0; i < len; i += 1) { function setSelectedElement(event) {
result = my_result_list[i]; var element = event.target,
value_dict = result.value; jump_url = element.getAttribute("data-relative-url"),
item = document.createElement("li"); create_object_type = element.getAttribute("data-create-object"),
item.className = str; explore = element.getAttribute("data-explore"),
tmp;
ul.innerHTML = "";
if (index === gadget.props.last_index - 1 && !explore) {
props.jump_url[gadget.props.last_index] = "";
tmp = document.createElement("fieldset");
tmp.innerHTML = single_input_template();
gadget.props.container.appendChild(tmp);
gadget.props.input_list.push({
"title": field_json.key,
"name": field_json.key,
"value": "",
"href": "",
"create_object": ""
});
gadget.props.last_index += 1;
gadget.props.element.dispatchEvent(new Event('add_relation_input'));
}
if (jump_url) {
props.jump_url[index] = jump_url;
input.value = element.textContent;
return gadget.getUrlFor({
command: 'index',
options: {
jio_key: jump_url
}
}).push(function (url) {
if (field_json.allow_jump) {
plane.href = url;
plane.className = jump_on;
}
});
}
if (create_object_type) {
input.setAttribute("data-create-object", create_object_type);
plane.className = jump_add;
create_div.innerHTML = create_template({'text': create_object_type});
return;
}
// NOTE: gadget does not properties it gets here, so just concat if (explore) {
// NOTE: if doing more complex UI, beware the textContent value won't return gadget.getFormContent({
// work, because currently it's used to retrieve the link from format: "json"
// the last autocomplete query results! })
item.textContent = value_dict[index]; .push(function (content) {
item.setAttribute("data-relative-url", result.id); return gadget.redirect({
item.setAttribute("name", value_dict.uid); command: 'index',
list.appendChild(item); options: {
page: "relation_search",
url: gadget.props.field_json.url,
extended_search: Query.objectToSearchText(simple_query),
view: gadget.props.field_json.view,
back_field: gadget.props.field_json.key,
target_index: index
},
form_content: content
});
});
}
plane.className = jump_unknown;
} }
list.className = "ui-listview ui-corner-all";
list.firstChild.className += " ui-first-child";
list.lastChild.className += " ui-last-child";
return list;
}
////////////////////////////////////
// Promise methods
////////////////////////////////////
// notify change of field value, done here, since called from multiple sources
function notifyChange(my_gadget) {
return RSVP.all([ return RSVP.all([
my_gadget.checkValidity(), loopEventListener(input, 'input', false, generateList),
my_gadget.notifyChange() loopEventListener(input, 'blur', false, function () {
]); return new RSVP.Queue()
} .push(function () {
return RSVP.any([
RSVP.delay(200),
promiseEventListener(ul, "click", true)
]);
function createSingleRelationField(gadget, i, allow_jump) { })
var div_input = document.createElement("div"), .push(function (event) {
wrapper = document.createElement("div"), var tmp;
fieldset = document.createElement("fieldset"), if (event) {
a1 = document.createElement("a"), return setSelectedElement(event);
a2 = document.createElement("a"), }
field_json = gadget.props.field_json, if (ul.innerHTML) {
value = field_json.value || field_json.default, ul.innerHTML = "";
input = document.createElement("input"); plane.className = jump_unknown;
//create element if (index === gadget.props.last_index - 1) {
wrapper.setAttribute("class", "sub" + field_json.key + "_" + i); props.jump_url[gadget.props.last_index] = "";
div_input.setAttribute("class", "ui-input-text ui-body-inherit ui-corner-all ui-shadow-inset ui-input-has-clear ui-input-has-icon"); tmp = document.createElement("fieldset");
input.setAttribute("type", "text"); tmp.innerHTML = single_input_template();
input.setAttribute("autocomplete", "off"); gadget.props.container.appendChild(tmp);
input.setAttribute("data-enhanced", "true"); gadget.props.input_list.push({
a1.setAttribute("herf", "#"); "title": field_json.key,
a1.setAttribute("tabindex", "-1"); "name": field_json.key,
a1.setAttribute("class", "ui-hidden-accessible"); "value": "",
a1.innerText = "&nbsp;"; "href": "",
"create_object": ""
a2.setAttribute("herf", "#"); });
a2.setAttribute("tabindex", "-1"); gadget.props.last_index += 1;
a2.setAttribute("class", "ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plane ui-shadow-inset ui-btn-inline ui-disabled"); gadget.props.element.dispatchEvent(new Event('add_relation_input'));
a2.innerText = "Jump to this document"; }
div_input.appendChild(input);
div_input.appendChild(a1);
wrapper.appendChild(div_input);
wrapper.appendChild(a2);
fieldset.appendChild(wrapper);
gadget.props.element.querySelector(".div_field").appendChild(fieldset);
//initialize
input.setAttribute('value', value[i] || "");
input.setAttribute('name', "sub" + field_json.key + "_" + i);
if (field_json.editable !== 1) {
input.setAttribute('readonly', 'readonly');
div_input.className += ' ui-state-readonly ';
}
if (field_json.allow_jump && allow_jump) {
return new RSVP.Queue()
.push(function () {
return gadget.getUrlFor({
command: 'index',
options: {
jio_key: field_json.relation_item_relative_url[i]
} }
}); });
}) })]
.push(function (my_url) { );
a2.href = my_url;
a2.className = "ui-btn ui-corner-all ui-btn-icon-notext " +
"ui-icon-plane ui-shadow-inset ui-btn-inline";
});
}
} }
rJS(window) rJS(window)
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// ready // ready
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Init local properties // Init local properties
.ready(function (my_gadget) { .ready(function (gadget) {
return my_gadget.getElement() gadget.props = {};
return gadget.getElement()
.push(function (element) { .push(function (element) {
my_gadget.props = {}; gadget.props.element = element;
my_gadget.props.pending_promise_list = [];
my_gadget.props.select_uid_list = [];
my_gadget.props.element = element;
}); });
}) })
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// acquired methods // acquired methods
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
.declareAcquiredMethod("notifyValid", "notifyValid")
.declareAcquiredMethod("notifyInvalid", "notifyInvalid") .declareAcquiredMethod("notifyInvalid", "notifyInvalid")
.declareAcquiredMethod("notifyChange", "notifyChange") .declareAcquiredMethod("notifyChange", "notifyChange")
.declareAcquiredMethod("jio_allDocs", "jio_allDocs") .declareAcquiredMethod("jio_allDocs", "jio_allDocs")
.declareAcquiredMethod("translateHtml", "translateHtml") .declareAcquiredMethod("translateHtml", "translateHtml")
.declareAcquiredMethod("getUrlFor", "getUrlFor") .declareAcquiredMethod("getUrlFor", "getUrlFor")
.declareAcquiredMethod("redirect", "redirect")
.declareAcquiredMethod("getFormContent", "getFormContent")
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// declared methods // declared methods
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
.declareMethod('render', function (options) { .declareMethod('render', function (options) {
var gadget = this, var gadget = this,
i, i,
url_list = options.field_json.relation_item_relative_url, field_json = options.field_json || {},
value_list = options.field_json.value || options.field_json.default; target_url_list = [],
gadget.props.field_json = options.field_json || {}; list = [],
for (i = 0; i < value_list.length && url_list !== undefined && url_list[i] !== undefined; i += 1) { input = [],
gadget.props.select_uid_list[i] = options.field_json.relation_item_uid[i]; create_object,
createSingleRelationField(gadget, i, true); unknown,
uid,
relation_item_relative_url,
value_list;
if (field_json.default.format === "json") {
create_object = field_json.default.create_object || [];
unknown = field_json.default.jump_unknown || [];
uid = field_json.default.uid;
relation_item_relative_url = field_json.default.relation_item_relative_url;
value_list = field_json.default.value || [];
} else {
create_object = field_json.create_object || [];
unknown = field_json.jump_unknown || [];
uid = field_json.uid;
relation_item_relative_url = field_json.relation_item_relative_url;
value_list = field_json.default || [];
} }
if (options.field_json.editable === 1) { if (relation_item_relative_url) {
createSingleRelationField(gadget, i, false); target_url_list = relation_item_relative_url;
gadget.props.relation_field_number = i;
} }
})
// get content (needs hidden fields, too, when creating new records)
.declareMethod('checkValidity', function () {
return true;
})
.declareMethod('getContent', function () {
var field_json = this.props.field_json,
input_list = this.props.element.querySelectorAll('input'),
result = {},
i,
value = "",
i_len,
input;
for (i = 0, i_len = input_list.length; i < i_len; i += 1) {
input = input_list[i];
if (input.value !== "") {
value = value + input.value + "\n";
result[this.props.field_json.relation_field_id + "_" + i] = this.props.select_uid_list[i];
}
}
result[field_json.key] = value;
return result;
})
///////////////////////////////////////////////////////////////// gadget.props.field_json = field_json;
// declared services gadget.props.jump_url = [];
///////////////////////////////////////////////////////////////// gadget.props.query = QueryFactory.create(new URI(field_json.query).query(true).query);
.declareService(function () { return new RSVP.Queue()
var gadget = this, .push(function () {
i, for (i = 0; i < value_list.length; i += 1) {
index_list, if (!value_list[i]) {
createEmptyField, if (uid) {
triggerAutocomplete, return gadget.jio_allDocs({
stop, query: Query.objectToSearchText(new SimpleQuery({
handler, key: "catalog.uid",
element_list = gadget.props.element.querySelectorAll('input'); value: uid
})),
// trigger autocomplete for field value, on render() with value only sets link limit: [0, 1],
triggerAutocomplete = function (my_gadget, my_event, i) { select_list: [field_json.catalog_index]
var props = my_gadget.props,
field_json = props.field_json,
index = field_json.catalog_index,
begin_from = props.begin_from || 0,
lines = field_json.lines || 11,
select_list = [index, "uid"],
query_string = " AND (" + index + ':"' + my_event.target.value + '")',
result_dict,
tag_list,
spin,
target_div = my_gadget.props.element.querySelector("." + my_event.target.name),
wrapper = target_div.querySelector("div.ui-input-text"),
no_results;
spin = target_div.querySelector(".ui-hidden-accessible");
return new RSVP.Queue()
.push(function () {
clearResults(wrapper);
spin.className = "ui-btn ui-corner-all ui-btn-icon-notext" +
" ui-input-clear ui-icon-spinner ui-icon-spin";
return my_gadget.jio_allDocs({
"query": new URI(field_json.query).query(true).query + query_string,
"limit": [begin_from, begin_from + lines],
"select_list": select_list
});
}).push(function (my_result) {
result_dict = my_result.data;
spin.className = "ui-hidden-accessible";
no_results = result_dict.total_rows === 0;
// show "new" tag, clicking it will remove it and reset the field!
// XXX Not active - reset should be handled by a generic reset method!
if (no_results && field_json.allow_creation) {
return new RSVP.Queue()
.push(function () {
wrapper.appendChild(createNewTag(my_gadget, i));
return notifyChange(my_gadget);
})
.push(function () {
var tag = wrapper.querySelector(".ui-tag-list .ui-btn");
if (i === gadget.props.relation_field_number) {
createEmptyField();
}
return RSVP.any([
promiseEventListener(tag, "click", true),
promiseEventListener(tag, "tap", true)
]);
})
.push(function (my_event_to_clear) {
my_event_to_clear.preventDefault();
wrapper.querySelector("input").value = my_event.target.defaultValue;
tag_list = wrapper.querySelector(".ui-tag-list");
tag_list.parentNode.removeChild(tag_list);
if (my_event.target.defaultValue !== "") {
wrapper.parentElement.lastChild.className = "ui-btn ui-corner-all ui-btn-icon-notext " +
"ui-icon-plane ui-shadow-inset ui-btn-inline";
}
}); });
}
} }
// have element }
return new RSVP.Queue() })
.push(function () { .push(function (result) {
var list; var non_empty_input = true;
list = [];
if (no_results === false) { if (result) {
wrapper.appendChild(createResults(result_dict.rows, index)); value_list[i] = result.data.rows[0].value[field_json.catalog_index];
list = wrapper.querySelector("ul"); }
for (i = 0; i < target_url_list.length; i += 1) {
return RSVP.any([ if (target_url_list[i]) {
promiseEventListener(list, "click", true), gadget.props.jump_url.push(target_url_list[i]);
promiseEventListener(list, "touchend", true) list.push(gadget.getUrlFor({
]);
}
});
}).push(undefined, function (my_error) {
if (my_error instanceof RSVP.CancellationError) {
spin.className = "ui-hidden-accessible";
clearResults(my_gadget, "skip");
}
throw my_error;
}).push(function (my_selection_event) {
var element,
jump_url;
// take entered text, set to input and clear list options
if (my_selection_event && my_selection_event.target) {
element = my_selection_event.target;
jump_url = element.getAttribute("data-relative-url");
props.select_uid_list[i] = element.getAttribute("name");
wrapper.querySelector("input").value = element.textContent;
clearResults(wrapper, "skip");
return my_gadget.getUrlFor({
command: 'index', command: 'index',
options: { options: {
jio_key: jump_url jio_key: target_url_list[i]
} }
}); }));
} } else {
}).push(function (my_url) { if (!create_object[i]) {
if (my_url !== undefined) { //non jump url nor create onject
wrapper.parentElement.lastChild.href = my_url; non_empty_input = false;
wrapper.parentElement.lastChild.className = "ui-btn ui-corner-all ui-btn-icon-notext " +
"ui-icon-plane ui-shadow-inset ui-btn-inline";
if (i === gadget.props.relation_field_number) {
createEmptyField();
} }
gadget.props.jump_url.push("");
list.push("");
} }
}); }
}; if (non_empty_input) {
value_list.push("");
stop = function (e) { list.push("");
e.preventDefault(); gadget.props.jump_url.push("");
return false; }
}; return RSVP.all(list);
})
handler = function (my_event) { .push(function (href_list) {
var value = my_event.target.value, for (i = 0; i < value_list.length; i += 1) {
pending_promise; input.push({
"create_object": create_object[i],
// field value unchanged (tab-bing) "title": field_json.key,
if (my_event.target.defaultValue === value) { "name": field_json.key,
return; "value": value_list[i],
} "href": href_list[i],
"jump_unknown": unknown[i],
// empty value, do nothing but notify "error_text": field_json.error_text
if (value === "") { });
return notifyChange(gadget); }
gadget.props.input_list = input;
gadget.props.default_index = input.length;
gadget.props.last_index = input.length;
return gadget.translateHtml(multi_input_template({
input: input,
allow_jump: field_json.allow_jump,
readonly: field_json.editable ? "" : "ui-state-readonly"
}));
})
.push(function (html) {
gadget.props.element.innerHTML = html;
gadget.props.container = gadget.props.element.querySelector(".container");
});
})
.declareMethod('getContent', function (options) {
var list = this.props.element.querySelectorAll('.single_input'),
result = {},
i,
input,
value_list = [],
plane,
tmp = {},
field_json = this.props.field_json;
if (options.format === "erp5") {
for (i = 0; i < list.length - 1; i += 1) {
plane = list[i].querySelector('.ui-btn');
input = list[i].querySelector('input');
if (plane.className === jump_add) {
result[field_json.relation_field_id + "_" + i] = "_newContent_" + input.getAttribute("data-create-object");
}
value_list.push(input.value);
} }
index_list = my_event.target.name.split("_"); result[field_json.key] = value_list;
i = parseInt(index_list[index_list.length - 1], 10); return result;
// replace existing promise in case it has not triggered }
pending_promise = gadget.props.pending_promise_list[i]; tmp.format = "json";
if (pending_promise) { tmp.value = [];
pending_promise.cancel(); tmp.create_object = [];
tmp.jump_unknown = [];
for (i = 0; i < list.length; i += 1) {
plane = list[i].querySelector('.ui-btn');
input = list[i].querySelector('input');
tmp.value[i] = input.value;
tmp.jump_unknown[i] = "";
tmp.create_object[i] = "";
if (plane.className === jump_add) {
tmp.create_object[i] = input.getAttribute("data-create-object");
} else {
if (plane.className === jump_unknown) {
tmp.jump_unknown[i] = true;
}
} }
}
tmp.relation_item_relative_url = this.props.jump_url;
result[field_json.key] = tmp;
return result;
})
.declareService(function () {
var i,
gadget = this,
list = [];
// create a new queue, expose it to replace it with trailing events for (i = 0; i < gadget.props.last_index; i += 1) {
pending_promise = new RSVP.Queue() list.push(listenToInput(gadget, i));
.push(function () {
return RSVP.delay(200);
})
.push(function () {
return triggerAutocomplete(gadget, my_event, i);
});
gadget.props.pending_promise_list[i] = pending_promise;
return pending_promise;
};
createEmptyField = function () {
var new_input;
gadget.props.relation_field_number += 1;
createSingleRelationField(gadget, gadget.props.relation_field_number, false);
element_list = gadget.props.element.querySelectorAll('input');
new_input = element_list[element_list.length - 1];
loopEventListener(new_input, 'onmouseout', false, stop);
loopEventListener(new_input, 'keyup', false, handler);
loopEventListener(new_input, 'input', false, handler);
};
// Listen to all necessary events (blur not needed currently)
for (i = 0; i < element_list.length; i += 1) {
loopEventListener(element_list[i], 'onmouseout', false, stop);
loopEventListener(element_list[i], 'keyup', false, handler);
loopEventListener(element_list[i], 'input', false, handler);
} }
return RSVP.all(list);
})
.declareService(function () {
var gadget = this;
return loopEventListener(gadget.props.element, 'add_relation_input', false, function () {
var list = [],
i;
for (i = gadget.props.default_index; i < gadget.props.last_index; i += 1) {
list.push(listenToInput(gadget, i));
}
return RSVP.all(list);
});
}); });
}(window, document, rJS, RSVP, URI, loopEventListener, promiseEventListener)); }(window, rJS, RSVP, URI, loopEventListener, promiseEventListener, document,
\ No newline at end of file SimpleQuery, ComplexQuery, Query, QueryFactory, Handlebars, Event, $));
...@@ -90,118 +90,221 @@ ...@@ -90,118 +90,221 @@
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']</td> <td>//input[@name='field_my_foo_category_title']</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>type</td> <td>type</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td> <td>//input[@name='field_my_foo_category_title']</td>
<td>A new foo</td> <td>a1</td>
</tr> </tr>
<tr> <tr>
<td>fireEvent</td> <td>fireEvent</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td> <td>//input[@name='field_my_foo_category_title']</td>
<td>input</td> <td>input</td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//div[@class='subfield_my_bar_category_title_list_0']/div/div/div/div/a[@class='ui-first-child ui-last-child ui-btn ui-corner-all ui-btn-inherit ui-btn-active ui-btn-icon-right ui-icon-delete']</td> <td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>fireEvent</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td> <td>//input[@name='field_my_foo_category_title']</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>type</td> <td>type</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>Another new foo</td> <td>A New Foo</td>
</tr> </tr>
<tr> <tr>
<td>fireEvent</td> <td>fireEvent</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>input</td> <td>input</td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//div[@class='subfield_my_bar_category_title_list_1']/div/div/div/div/a[@class='ui-first-child ui-last-child ui-btn ui-corner-all ui-btn-inherit ui-btn-active ui-btn-icon-right ui-icon-delete']</td> <td>//li[@name="Foo"]
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@name="Foo"]
<td></td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//div[@class="ui-tag-list ui-tag-list-inset"]//li</td>
<td>Create:Foo</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//a[contains(@class, "ui-icon-plus")]</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>type</td> <td>type</td>
<td>//input[@name='field_my_foo_category_title']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>a1</td> <td>Another Foo</td>
</tr> </tr>
<tr> <tr>
<td>fireEvent</td> <td>fireEvent</td>
<td>//input[@name='field_my_foo_category_title']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>input</td> <td>input</td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td> <td>//li[@name="Foo"]
<td></td> <td></td>
</tr> </tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>blur</td>
</tr>
<tr> <tr>
<td>click</td> <td>click</td>
<td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td> <td>//li[@name="Foo"]
<td></td> <td></td>
</tr> </tr>
<tr>
<td>verifyText</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//div[@class="ui-tag-list ui-tag-list-inset"]//li</td>
<td>Create:Foo</td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//a[contains(@class, "ui-icon-plus")]</td>
<td></td>
</tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplateForRenderjsUi/macros/save" /> <tal:block metal:use-macro="here/Zuite_CommonTemplateForRenderjsUi/macros/save" />
<tr> <tr>
<td>verifyValue</td> <td>waitForElementPresent</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>A new foo</td> <td></td>
</tr> </tr>
<tr> <tr>
<td>verifyValue</td> <td>verifyValue</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>Another new foo</td> <td>A New Foo</td>
</tr> </tr>
<tr> <tr>
<td>verifyValue</td> <td>verifyValue</td>
<td>//input[@name='field_my_foo_category_title']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>a1</td> <td>Another Foo</td>
</tr> </tr>
<!--
<tr> <tr>
<td>click</td> <td>click</td>
<td>//div[@class='subfield_my_bar_category_title_list_0']/a</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//a[contains(@class, "ui-icon-plane")]</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//a[@data-i18n='Jump']</td> <td>//a[@data-i18n="Editable"]</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>verifyValue</td> <td>verifyText</td>
<td>//input[@name='field_my_title']</td> <td>//div[@data-gadget-scope="field_my_title"]//p</td>
<td>A new foo</td> <td>A New Foo</td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n="Foo: A New Foo"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//a[contains(@class, "ui-icon-plane")]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//a[contains(@class, "ui-icon-plane")]</td>
<td></td>
</tr> </tr>
-->
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Editable"]</td>
<td></td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@data-gadget-scope="field_my_title"]//p</td>
<td>Another Foo</td>
</tr>
</tbody></table> </tbody></table>
</body> </body>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ZopePageTemplate" module="Products.PageTemplates.ZopePageTemplate"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>testMultiRelationFieldSearchWithListbox</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test RenderJS UI</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">Test RenderJS UI</td></tr>
</thead><tbody>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/init" />
<!-- Clean Up -->
<tr>
<td>open</td>
<td>${base_url}/foo_module/ListBoxZuite_reset</td>
<td></td>
</tr>
<tr>
<td>assertTextPresent</td>
<td>Reset Successfully.</td>
<td></td>
</tr>
<!-- Initialize -->
<tr>
<td>open</td>
<td>${base_url}/web_site_module/renderjs_runner/#/foo_module</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Add']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>link=Add</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select[@name='field_your_portal_type']</td>
<td>label=Foo</td>
</tr>
<tr>
<td>click</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>storeLocation</td>
<td>url</td>
<td></td>
</tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/wait_for_activities" />
<tr>
<td>open</td>
<td>${url}</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name='field_my_foo_category_title']</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name='field_my_foo_category_title']</td>
<td>a1</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name='field_my_foo_category_title']</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name='field_my_foo_category_title']</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>A New Foo</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@name="Foo"]
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@name="Foo"]
<td></td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//div[@class="ui-tag-list ui-tag-list-inset"]//li</td>
<td>Create:Foo</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name="field_my_title"]</td>
<td>TEST</td>
</tr>
<tr>
<td>click</td>
<td>//input[@name="field_my_frozen"]</td>
<td></td>
</tr>
<tr>
<td>assertChecked</td>
<td>//input[@name="field_my_frozen"]</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>search</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//input[@class="search_button"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementNotPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//tbody/tr[1]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//tbody/tr[1]//a</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="field_my_title"]</td>
<td></td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_title"]</td>
<td>TEST</td>
</tr>
<tr>
<td>assertChecked</td>
<td>//input[@name="field_my_frozen"]</td>
<td></td>
</tr>
<tr>
<td>verifyValue</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>A New Foo</td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//div[@class="ui-tag-list ui-tag-list-inset"]//li</td>
<td>Create:Foo</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>2</td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[3]</td>
<td></td>
</tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplateForRenderjsUi/macros/save" />
</tbody></table>
</body>
</html>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ZopePageTemplate" module="Products.PageTemplates.ZopePageTemplate"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>testMultiRelationFieldUnknownIcon</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test RenderJS UI</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">Test RenderJS UI</td></tr>
</thead><tbody>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/init" />
<!-- Clean Up -->
<tr>
<td>open</td>
<td>${base_url}/foo_module/ListBoxZuite_reset</td>
<td></td>
</tr>
<tr>
<td>assertTextPresent</td>
<td>Reset Successfully.</td>
<td></td>
</tr>
<!-- Initialize -->
<tr>
<td>open</td>
<td>${base_url}/web_site_module/renderjs_runner/#/foo_module</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Add']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>link=Add</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select[@name='field_your_portal_type']</td>
<td>label=Foo</td>
</tr>
<tr>
<td>click</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>storeLocation</td>
<td>url</td>
<td></td>
</tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/wait_for_activities" />
<tr>
<td>open</td>
<td>${url}</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>unknowntext</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@name="Foo"]
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>blur</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>search</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//h1[@class="ui-title"]//a</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//a[contains(@class, "ui-icon-warning")]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//a[contains(@class, "ui-icon-warning")]</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ZopePageTemplate" module="Products.PageTemplates.ZopePageTemplate"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>testMultiRelationFieldWithNonSavedPageContent</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test RenderJS UI</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">Test RenderJS UI</td></tr>
</thead><tbody>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/init" />
<!-- Clean Up -->
<tr>
<td>open</td>
<td>${base_url}/foo_module/ListBoxZuite_reset</td>
<td></td>
</tr>
<tr>
<td>assertTextPresent</td>
<td>Reset Successfully.</td>
<td></td>
</tr>
<!-- Initialize -->
<tr>
<td>open</td>
<td>${base_url}/web_site_module/renderjs_runner/#/foo_module</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Add']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>link=Add</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select[@name='field_your_portal_type']</td>
<td>label=Foo</td>
</tr>
<tr>
<td>click</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>storeLocation</td>
<td>url</td>
<td></td>
</tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/wait_for_activities" />
<tr>
<td>open</td>
<td>${url}</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>A New Foo</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@name="Foo"]
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@name="Foo"]
<td></td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//div[@class="ui-tag-list ui-tag-list-inset"]//li</td>
<td>Create:Foo</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name="field_my_title"]</td>
<td>TEST</td>
</tr>
<tr>
<td>type</td>
<td>//input[@name="field_my_foo_line_foo_category_title"]</td>
<td>TEST1</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name="field_my_foo_line_foo_category_title"]</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@name='Category']</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name="field_my_foo_line_foo_category_title"]</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@name='Category']</td>
<td></td>
</tr>
<tr>
<td>waitForTextPresent</td>
<td>Create:Category</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//input[@name="field_my_frozen"]</td>
<td></td>
</tr>
<tr>
<td>assertChecked</td>
<td>//input[@name="field_my_frozen"]</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>search</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//h1[@class="ui-title"]//a</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="field_my_title"]</td>
<td></td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_title"]</td>
<td>TEST</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_foo_line_foo_category_title"]</td>
<td>TEST1</td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Create:Category</td>
<td></td>
</tr>
<tr>
<td>assertChecked</td>
<td>//input[@name="field_my_frozen"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td></td>
</tr>
<tr>
<td>verifyValue</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>A New Foo</td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//div[@class="ui-tag-list ui-tag-list-inset"]//li</td>
<td>Create:Foo</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>search</td>
</tr>
<tr>
<td>verifyElementNotPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[3]</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n="Modules"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Foos"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n="Foos"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//tbody/tr[1]/th/a</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//tbody/tr[1]/th/a</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Views"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n="Views"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Actions']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Editable']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Editable']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="field_my_title"]</td>
<td></td>
</tr>
<tr>
<td>verifyNotValue</td>
<td>//input[@name="field_my_title"]</td>
<td>TEST</td>
</tr>
<tr>
<td>verifyNotValue</td>
<td>//input[@name="field_my_foo_line_foo_category_title"]</td>
<td>TEST1</td>
</tr>
<tr>
<td>verifyTextNotPresent</td>
<td>Create:Category</td>
<td></td>
</tr>
<tr>
<td>assertNotChecked</td>
<td>//input[@name="field_my_frozen"]</td>
<td></td>
</tr>
<tr>
<td>verifyNotValue</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>A New Foo</td>
</tr>
<tr>
<td>verifyElementNotPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//div[@class="ui-tag-list ui-tag-list-inset"]//li</td>
<td></td>
</tr>
<tr>
<td>verifyElementNotPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ZopePageTemplate" module="Products.PageTemplates.ZopePageTemplate"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>testProxyListBox</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test RenderJS UI</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">Test RenderJS UI</td></tr>
</thead><tbody>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/init" />
<!-- Clean Up -->
<tr>
<td>open</td>
<td>${base_url}/foo_module/ListBoxZuite_reset</td>
<td></td>
</tr>
<tr>
<td>assertTextPresent</td>
<td>Reset Successfully.</td>
<td></td>
</tr>
<tr>
<td>open</td>
<td>${base_url}/web_site_module/renderjs_runner/#/foo_module</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Add']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>link=Add</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select[@name='field_your_portal_type']</td>
<td>label=Foo</td>
</tr>
<tr>
<td>click</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>waitForTextPresent</td>
<td>Save</td>
<td></td>
</tr>
<tr>
<td>assertTextPresent</td>
<td>Quantity</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>link=Add</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select[@name='field_your_portal_type']</td>
<td>label=Foo Line</td>
</tr>
<tr>
<td>click</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>waitForTextPresent</td>
<td>Save</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//h1[@class="ui-title"]/a</td>
<td></td>
</tr>
<tr>
<td>waitForTextPresent</td>
<td>Foo Category</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>link=Add</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select[@name='field_your_portal_type']</td>
<td>label=Foo Line</td>
</tr>
<tr>
<td>click</td>
<td>//button[@data-i18n='Proceed']</td>
<td></td>
</tr>
<tr>
<td>waitForTextPresent</td>
<td>Save</td>
<td></td>
</tr>
<tr>
<td>storeLocation</td>
<td>url</td>
<td></td>
</tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/wait_for_activities" />
<tr>
<td>open</td>
<td>${url}</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//h1[@class="ui-title"]/a</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//h1[@class="ui-title"]/a</td>
<td></td>
</tr>
<tr>
<td>waitForTextPresent</td>
<td>Foo Category</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name='field_my_bar_category_title_list']</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name='field_my_bar_category_title_list']</td>
<td>search</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name='field_my_bar_category_title_list']</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name='field_my_bar_category_title_list']</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//th[@data-i18n="Title"]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//th[@data-i18n="Title"]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//th[@data-i18n="Quantity"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//h1[@class="ui-title"]//a</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="field_my_bar_category_id_list"]</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name="field_my_bar_category_id_list"]</td>
<td>search</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name='field_my_bar_category_id_list']</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>fireEvent</td>
<td>//input[@name='field_my_bar_category_id_list']</td>
<td>blur</td>
</tr>
<tr>
<td>click</td>
<td>//li[@data-explore="true"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Select Template</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name="search"]</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>//input[@class="search_button"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementNotPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//tbody//tr[2]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//tbody//tr[3]</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select</td>
<td>index=1</td>
</tr>
<tr>
<td>waitForElementNotPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>verifyValue</td>
<td>//select</td>
<td>Foo Listbox</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementNotPresent</td>
<td>//tbody//tr[2]</td>
<td></td>
</tr>
<tr>
<td>select</td>
<td>//select</td>
<td>index=2</td>
</tr>
<tr>
<td>waitForElementNotPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>verifyValue</td>
<td>//select</td>
<td>Foo Line Listbox</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//tbody//tr[2]</td>
<td></td>
</tr>
<tr>
<td>verifyElementNotPresent</td>
<td>//tbody//tr[3]</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>//input[@name="search"]</td>
<td>id:2</td>
</tr>
<tr>
<td>click</td>
<td>//input[@class="search_button"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementNotPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n="Previous"]</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td>
<td>//tbody//tr[1]</td>
<td></td>
</tr>
<tr>
<td>verifyElementNotPresent</td>
<td>//tbody//tr[2]</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
\ No newline at end of file
...@@ -88,170 +88,198 @@ ...@@ -88,170 +88,198 @@
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']</td> <td>//input[@name="field_my_title"]</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>type</td> <td>type</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td> <td>//input[@name="field_my_title"]</td>
<td>Title 0</td> <td>TEST</td>
</tr> </tr>
<tr>
<td>fireEvent</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td>
<td>input</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@class='subfield_my_bar_category_title_list_0']/div/div/div/div/a[@class='ui-first-child ui-last-child ui-btn ui-corner-all ui-btn-inherit ui-btn-active ui-btn-icon-right ui-icon-delete']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td>
<td>Title 1</td>
</tr>
<tr> <tr>
<td>type</td> <td>type</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td> <td>//input[@name='field_my_foo_category_title']</td>
<td>Title 1</td> <td>a1</td>
</tr> </tr>
<tr> <tr>
<td>fireEvent</td> <td>fireEvent</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td> <td>//input[@name='field_my_foo_category_title']</td>
<td>input</td> <td>input</td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//div[@class='subfield_my_bar_category_title_list_1']/div/div/div/div/a[@class='ui-first-child ui-last-child ui-btn ui-corner-all ui-btn-inherit ui-btn-active ui-btn-icon-right ui-icon-delete']</td> <td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>type</td>
<td>//input[@name='field_my_foo_category_title']</td>
<td>a1</td>
</tr>
<tr> <tr>
<td>fireEvent</td> <td>fireEvent</td>
<td>//input[@name='field_my_foo_category_title']</td> <td>//input[@name='field_my_foo_category_title']</td>
<td>input</td> <td>blur</td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>click</td>
<td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td> <td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td>
<td></td> <td></td>
</tr> </tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplateForRenderjsUi/macros/save" />
<tr> <tr>
<td>click</td> <td>storeLocation</td>
<td>//li[@data-relative-url='portal_categories/foo_category/a/a1']</td> <td>url</td>
<td></td> <td></td>
</tr> </tr>
<tal:block metal:use-macro="here/Zuite_CommonTemplateForRenderjsUi/macros/save" />
<tal:block metal:use-macro="here/Zuite_CommonTemplate/macros/wait_for_activities" />
<tr> <tr>
<td>click</td> <td>open</td>
<td>//a[@data-i18n='Views']</td> <td>${url}</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//a[@data-i18n='Relation Fields']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>click</td> <td>type</td>
<td>//a[@data-i18n='Relation Fields']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td></td> <td>TEST</td>
</tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>input</td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']</td> <td>//li[@data-relative-url="foo_module/2"]
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>verifyValue</td> <td>fireEvent</td>
<td>//input[@name='field_my_foo_category_title']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>a1</td> <td>blur</td>
</tr> </tr>
<tr> <tr>
<td>verifyValue</td> <td>click</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td> <td>//li[@data-relative-url="foo_module/2"]
<td>Title 0</td> <td></td>
</tr> </tr>
<tr> <tr>
<td>verifyValue</td> <td>waitForElementPresent</td>
<td>//input[@name='subfield_my_bar_category_title_list_1']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]</td>
<td>Title 1</td> <td></td>
</tr> </tr>
<tr> <tr>
<td>type</td> <td>type</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>Title 0</td> <td>TEST</td>
</tr> </tr>
<tr> <tr>
<td>fireEvent</td> <td>fireEvent</td>
<td>//input[@name='subfield_my_bar_category_title_list_0']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>input</td> <td>input</td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//div[@class='subfield_my_bar_category_title_list_1']/a[@class='ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plane ui-shadow-inset ui-btn-inline']</td> <td>//li[@data-relative-url="foo_module/2"]
<td></td> <td></td>
</tr> </tr>
<tr>
<td>fireEvent</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>blur</td>
</tr>
<tr> <tr>
<td>verifyElementPresent</td> <td>click</td>
<td>//div[@class='subfield_my_bar_category_title_list_1']/a[@class='ui-btn ui-corner-all ui-btn-icon-notext ui-icon-plane ui-shadow-inset ui-btn-inline']</td> <td>//li[@data-relative-url="foo_module/2"]
<td></td> <td></td>
</tr> </tr>
<!--
<tal:block metal:use-macro="here/Zuite_CommonTemplateForRenderjsUi/macros/save" />
<tr>
<td>click</td>
<td>//a[@data-i18n='Views']</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[@data-i18n='Relation Fields']</td>
<td></td>
</tr>
<tr> <tr>
<td>click</td> <td>click</td>
<td>//div[@class='subfield_my_bar_category_title_list_0']/a</td> <td>//a[@data-i18n='Relation Fields']</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td>waitForElementPresent</td> <td>waitForElementPresent</td>
<td>//a[@data-i18n='Jump']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td></td> <td></td>
</tr> </tr>
<tr>
<td>verifyValue</td>
<td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[1]//input</td>
<td>TEST</td>
</tr>
<tr> <tr>
<td>verifyValue</td> <td>verifyValue</td>
<td>//input[@name='field_my_title']</td> <td>//div[@data-gadget-scope='field_my_bar_category_title_list']//fieldset[2]//input</td>
<td>A new foo</td> <td>TEST</td>
</tr> </tr>
-->
</tbody></table> </tbody></table>
</body> </body>
......
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