Path: blob/master/webroot/rsrc/js/application/policy/behavior-policy-control.js
12242 views
/**1* @provides javelin-behavior-policy-control2* @requires javelin-behavior3* javelin-dom4* javelin-util5* phuix-dropdown-menu6* phuix-action-list-view7* phuix-action-view8* javelin-workflow9* phuix-icon-view10* @javelin11*/12JX.behavior('policy-control', function(config) {13var control = JX.$(config.controlID);14var input = JX.$(config.inputID);15var value = config.value;1617if (config.disabled) {18JX.DOM.alterClass(control, 'disabled-control', true);19JX.DOM.listen(control, 'click', null, function(e) {20e.kill();21});22return;23}2425var menu = new JX.PHUIXDropdownMenu(control)26.setWidth(260)27.setAlign('left');2829menu.listen('open', function() {30var list = new JX.PHUIXActionListView();3132for (var ii = 0; ii < config.groups.length; ii++) {33var group = config.groups[ii];3435list.addItem(36new JX.PHUIXActionView()37.setName(config.labels[group])38.setLabel(true));3940for (var jj = 0; jj < config.order[group].length; jj++) {41var phid = config.order[group][jj];4243var onselect;44if (group == 'custom') {45onselect = JX.bind(null, function(phid) {46var uri = get_custom_uri(phid, config.capability);4748new JX.Workflow(uri)49.setHandler(function(response) {50if (!response.phid) {51return;52}5354replace_policy(phid, response.phid, response.info);55select_policy(response.phid);56})57.start();5859}, phid);60} else if (phid == config.projectKey) {61onselect = JX.bind(null, function(phid) {62var uri = get_custom_uri(phid, config.capability);6364new JX.Workflow(uri)65.setHandler(function(response) {66if (!response.phid) {67return;68}6970add_policy(phid, response.phid, response.info);71select_policy(response.phid);72})73.start();74}, phid);75} else {76onselect = JX.bind(null, select_policy, phid);77}7879var option = config.options[phid];80var item = new JX.PHUIXActionView()81.setName(option.name)82.setIcon(option.icon + ' darkgreytext')83.setHandler(JX.bind(null, function(fn, e) {84e.prevent();85menu.close();86fn();87}, onselect));8889if (phid == value) {90item.setSelected(true);91}9293list.addItem(item);94}95}9697menu.setContent(list.getNode());98});99100101var select_policy = function(phid) {102JX.DOM.setContent(103JX.DOM.find(control, 'span', 'policy-label'),104render_option(phid));105106input.value = phid;107value = phid;108};109110111var render_option = function(phid, with_title) {112var option = config.options[phid];113114var name = option.name;115if (with_title && (option.full != option.name)) {116name = JX.$N('span', {title: option.full}, name);117}118119return [render_icon(option.icon), name];120};121122var render_icon = function(icon) {123return new JX.PHUIXIconView()124.setIcon(icon)125.getNode();126};127128/**129* Get the workflow URI to create or edit a policy with a given PHID.130*/131var get_custom_uri = function(phid, capability) {132return JX.$U(config.editURI + phid + '/')133.setQueryParam('capability', capability)134.toString();135};136137138/**139* Replace an existing policy option with a new one. Used to swap out custom140* policies after the user edits them.141*/142var replace_policy = function(old_phid, new_phid, info) {143return add_policy(old_phid, new_phid, info, true);144};145146147/**148* Add a new policy above an existing one, optionally replacing it.149*/150var add_policy = function(old_phid, new_phid, info, replace) {151if (config.options[new_phid]) {152return;153}154155config.options[new_phid] = info;156157for (var k in config.order) {158for (var ii = 0; ii < config.order[k].length; ii++) {159if (config.order[k][ii] == old_phid) {160config.order[k].splice(ii, (replace ? 1 : 0), new_phid);161return;162}163}164}165};166167});168169170