Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/webroot/rsrc/js/application/policy/behavior-policy-control.js
12242 views
1
/**
2
* @provides javelin-behavior-policy-control
3
* @requires javelin-behavior
4
* javelin-dom
5
* javelin-util
6
* phuix-dropdown-menu
7
* phuix-action-list-view
8
* phuix-action-view
9
* javelin-workflow
10
* phuix-icon-view
11
* @javelin
12
*/
13
JX.behavior('policy-control', function(config) {
14
var control = JX.$(config.controlID);
15
var input = JX.$(config.inputID);
16
var value = config.value;
17
18
if (config.disabled) {
19
JX.DOM.alterClass(control, 'disabled-control', true);
20
JX.DOM.listen(control, 'click', null, function(e) {
21
e.kill();
22
});
23
return;
24
}
25
26
var menu = new JX.PHUIXDropdownMenu(control)
27
.setWidth(260)
28
.setAlign('left');
29
30
menu.listen('open', function() {
31
var list = new JX.PHUIXActionListView();
32
33
for (var ii = 0; ii < config.groups.length; ii++) {
34
var group = config.groups[ii];
35
36
list.addItem(
37
new JX.PHUIXActionView()
38
.setName(config.labels[group])
39
.setLabel(true));
40
41
for (var jj = 0; jj < config.order[group].length; jj++) {
42
var phid = config.order[group][jj];
43
44
var onselect;
45
if (group == 'custom') {
46
onselect = JX.bind(null, function(phid) {
47
var uri = get_custom_uri(phid, config.capability);
48
49
new JX.Workflow(uri)
50
.setHandler(function(response) {
51
if (!response.phid) {
52
return;
53
}
54
55
replace_policy(phid, response.phid, response.info);
56
select_policy(response.phid);
57
})
58
.start();
59
60
}, phid);
61
} else if (phid == config.projectKey) {
62
onselect = JX.bind(null, function(phid) {
63
var uri = get_custom_uri(phid, config.capability);
64
65
new JX.Workflow(uri)
66
.setHandler(function(response) {
67
if (!response.phid) {
68
return;
69
}
70
71
add_policy(phid, response.phid, response.info);
72
select_policy(response.phid);
73
})
74
.start();
75
}, phid);
76
} else {
77
onselect = JX.bind(null, select_policy, phid);
78
}
79
80
var option = config.options[phid];
81
var item = new JX.PHUIXActionView()
82
.setName(option.name)
83
.setIcon(option.icon + ' darkgreytext')
84
.setHandler(JX.bind(null, function(fn, e) {
85
e.prevent();
86
menu.close();
87
fn();
88
}, onselect));
89
90
if (phid == value) {
91
item.setSelected(true);
92
}
93
94
list.addItem(item);
95
}
96
}
97
98
menu.setContent(list.getNode());
99
});
100
101
102
var select_policy = function(phid) {
103
JX.DOM.setContent(
104
JX.DOM.find(control, 'span', 'policy-label'),
105
render_option(phid));
106
107
input.value = phid;
108
value = phid;
109
};
110
111
112
var render_option = function(phid, with_title) {
113
var option = config.options[phid];
114
115
var name = option.name;
116
if (with_title && (option.full != option.name)) {
117
name = JX.$N('span', {title: option.full}, name);
118
}
119
120
return [render_icon(option.icon), name];
121
};
122
123
var render_icon = function(icon) {
124
return new JX.PHUIXIconView()
125
.setIcon(icon)
126
.getNode();
127
};
128
129
/**
130
* Get the workflow URI to create or edit a policy with a given PHID.
131
*/
132
var get_custom_uri = function(phid, capability) {
133
return JX.$U(config.editURI + phid + '/')
134
.setQueryParam('capability', capability)
135
.toString();
136
};
137
138
139
/**
140
* Replace an existing policy option with a new one. Used to swap out custom
141
* policies after the user edits them.
142
*/
143
var replace_policy = function(old_phid, new_phid, info) {
144
return add_policy(old_phid, new_phid, info, true);
145
};
146
147
148
/**
149
* Add a new policy above an existing one, optionally replacing it.
150
*/
151
var add_policy = function(old_phid, new_phid, info, replace) {
152
if (config.options[new_phid]) {
153
return;
154
}
155
156
config.options[new_phid] = info;
157
158
for (var k in config.order) {
159
for (var ii = 0; ii < config.order[k].length; ii++) {
160
if (config.order[k][ii] == old_phid) {
161
config.order[k].splice(ii, (replace ? 1 : 0), new_phid);
162
return;
163
}
164
}
165
}
166
};
167
168
});
169
170