@ytsaurus/ui 1.69.0 → 1.70.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/public/build/assets-manifest.json +15 -15
- package/dist/public/build/css/groups.ed9ded1f.chunk.css +2 -0
- package/dist/public/build/css/groups.ed9ded1f.chunk.css.map +1 -0
- package/dist/public/build/js/cluster-page-wrapper.573e8598.chunk.js +2 -0
- package/dist/public/build/js/{cluster-page-wrapper.ee23d43b.chunk.js.map → cluster-page-wrapper.573e8598.chunk.js.map} +1 -1
- package/dist/public/build/js/groups.38f0df6f.chunk.js +2 -0
- package/dist/public/build/js/groups.38f0df6f.chunk.js.map +1 -0
- package/dist/public/build/js/main.38e39f6e.js +3 -0
- package/dist/public/build/js/main.38e39f6e.js.map +1 -0
- package/dist/public/build/js/{runtime.c701c84d.js → runtime.44a1d4a3.js} +2 -2
- package/dist/public/build/js/{runtime.c701c84d.js.map → runtime.44a1d4a3.js.map} +1 -1
- package/dist/public/build/js/users.58b85268.chunk.js +2 -0
- package/dist/public/build/js/users.58b85268.chunk.js.map +1 -0
- package/dist/public/build/manifest.json +12 -12
- package/package.json +2 -2
- package/dist/public/build/css/groups.7e103f52.chunk.css +0 -2
- package/dist/public/build/css/groups.7e103f52.chunk.css.map +0 -1
- package/dist/public/build/js/cluster-page-wrapper.ee23d43b.chunk.js +0 -2
- package/dist/public/build/js/groups.ea480cb3.chunk.js +0 -2
- package/dist/public/build/js/groups.ea480cb3.chunk.js.map +0 -1
- package/dist/public/build/js/main.e5f238db.js +0 -3
- package/dist/public/build/js/main.e5f238db.js.map +0 -1
- package/dist/public/build/js/users.726d69e0.chunk.js +0 -2
- package/dist/public/build/js/users.726d69e0.chunk.js.map +0 -1
- /package/dist/public/build/js/{main.e5f238db.js.LICENSE.txt → main.38e39f6e.js.LICENSE.txt} +0 -0
@@ -0,0 +1,2 @@
|
|
1
|
+
"use strict";(self.webpackChunk_ytsaurus_ui=self.webpackChunk_ytsaurus_ui||[]).push([[583],{36810:(e,r,n)=>{n.d(r,{A:()=>u});var t=n(77810),o=n(76872),a=n(60620),s=n(64922),i=(0,o.A)("expand-icon");function u(e){var r=e.className,n=e.data,o=e.expanded,u=e.visible,l=e.onClick,c=o?"angle-up":"angle-down",m=t.useCallback((function(){l&&l(n)}),[n,l]);return(0,s.jsx)("span",{className:i({visible:Boolean(u),clickable:void 0!==l},r),onClick:m,children:(0,s.jsx)(a.A,{awesome:c})})}},2164:(e,r,n)=>{n.r(r),n.d(r,{GroupsPage:()=>qe});var t=n(77810),o=n(76872),a=n(83534),s=n(29121),i=n(12937),u=n(10785),l=n(26718),c=n(15647),m=n(13322),p=n(28407),d=n(9736),v=n(40319),g=n(70232),f=n.n(g),b=n(53144),h=n.n(b),A=n(49214),y=n.n(A),x=n(39760),N=n.n(x),C=n(30650),w=n(52797),j=n(3009),k=n.n(j),G=n(27528),M=n.n(G),E=n(29347),S=n.n(E),T=n(18472),z=n(44458),R=n(6184),D=n(73822),F=n(53332),I=n(29081),_=function(e){return e.groups.table.nameFilter},P=function(e){return e.groups.table.sort},O=function(e){return e.groups.table.expanded},L=(0,T.Mz)([function(e){return e.groups.table.groups}],(function(e){var r=e.reduce((function(e,r){return e[r.name]=(0,v.A)((0,v.A)({},r),{},{children:[],leaves:[]}),e}),{}),n={children:[],leaves:[],name:""};r[C.Tb]=n;var t={};return N()(r,(function(e){if(e!==n){var o=e.memberOf,a=void 0===o?[]:o;0===a.length&&(a=[C.Tb]),a.forEach((function(n){t[n]=!0;var o=(0,v.A)((0,v.A)({},e),{},{parent:n});r[n].children.push(o),e.parent=n}))}})),D.A.treeList.treeForEach(r[C.Tb],(function(e,r){e.shift=r-1,e.hasChildren=t[e.name]})),r})),B=(0,T.Mz)([L,_],(function(e,r){var n=e[C.Tb],t=S()([r&&function(e){return e===n||-1!==e.name.indexOf(r)}]);return D.A.treeList.filterTree(n,R.concatByAnd.apply(void 0,(0,m.A)(t)))})),U=(0,T.Mz)([B,O],(function(e,r){var n=k()(e);return D.A.treeList.treeForEach(n.children,(function(e){var n=e.name;r[n]||(e.children=[])})),n})),V={name:{get:function(e){return e.name},compareFn:z.IP},idm:{get:function(e){return e.idm},compareFn:z.IP},size:{get:function(e){var r=e.members;return(void 0===r?[]:r).length}}},X=(0,T.Mz)([U,P],(function(e,r){var n=r.column,t=r.order,o=(0,z.fA)(t),a=o.orderK,s=o.undefinedOrderK;return D.A.treeList.sortTree((0,v.A)({},e),{field:n,asc:1===a,undefinedAsk:1===s},V)})),q=(0,T.Mz)([X],(function(e){return D.A.treeList.flattenTree(e)})),H=function(e){return e.groups.editor.showModal},$=function(e){return e.groups.editor.groupName},Q=function(e){var r;return F.Mv.get(null===(r=e.groups.editor.data.$attributes)||void 0===r?void 0:r.upravlyator_managed)},K=function(e){return e.groups.editor.idmData},W=function(e){return e.groups.editor.idmData.version},Z=(0,T.Mz)([K],(function(e){var r=e.group,n=r.members,t=r.responsible;return{responsible:M()(t,(function(e){return e.subject})),members:M()(n,(function(e){return e.subject}))}})),Y=(0,T.Mz)([K,function(e){return e.groups.editor.data}],(function(e,r){var n;if((0,I.Gq)()){var t=e.group,o=t.members;return{responsible:t.responsible,members:o}}return{responsible:[],members:((null===(n=r.$attributes)||void 0===n?void 0:n.members)||[]).map((function(e){return{text:e,value:e,state:"granted",role_type:"member",subject:{user:e}}}))}})),J=n(88681),ee=n(64714),re=n(7787),ne=["member_of","members","upravlyator_managed"];function te(){return function(e){return e({type:C.kw.REQUEST}),(0,J.AD)(ee.Vu.groupsData,{attributes:ne}).then((function(r){var n=[];return N()(r,(function(e){var r=e.$value,t=e.$attributes,o=t.members,a=t.member_of,s=void 0===a?[]:a,i=t.upravlyator_managed;o.sort(),n.push({name:r,members:o,memberOf:s,idm:F.Mv.get(i||!1)})})),e({type:C.kw.SUCCESS,data:{groups:n}})})).catch((function(r){e({type:C.kw.FAILURE,data:{error:r}})}))}}function oe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return function(r,n){var t=n();if(r({type:C.IX,data:{showModal:!0,groupName:e}}),!e)return Promise.resolve();r({type:C.NV.REQUEST});var o,a="//sys/groups/".concat(e),s=re.Ay.getAclApi().getGroupAcl;return o=s?s((0,w.dB)(t),e):Promise.resolve(),Promise.all([ee.Qq.get(ee.Vu.groupsEditData,{path:a,attributes:ne}),o]).then((function(e){var n=(0,d.A)(e,2),t=n[0],o=n[1],a=(0,v.A)({data:t},o?{idmData:o}:{});return r({type:C.NV.SUCCESS,data:a})})).catch((function(e){return r({type:C.NV.FAILURE,data:e})}))}}function ae(e){var r=e.groupName;return ee.X8.create({type:"group",attributes:{name:r}})}function se(e,r,n){if(r&&r.length||n&&n.length){var t,o,a,s=(t=n,o=new Map,a=new Map,N()(t,(function(e){var r=e,n=r.user,t=r.group;n?o.set(n,e):a.set(t,e)})),[o,a]),i=(0,d.A)(s,2),u=i[0],l=i[1],c=y()(e,(function(e){var r=e,n=r.user,t=r.group;return n?!u.has(n):!l.has(t)}));return h()(c,r)}}function ie(e){var r=e.groupName,n=e.membersToAdd,t=e.membersToRemove,o=n.map((function(e){return{command:"add_member",parameters:{group:r,member:e.user||e.group}}})),a=t.map((function(e){return{command:"remove_member",parameters:{group:r,member:e.user||e.group}}})),s=[].concat((0,m.A)(o),(0,m.A)(a));return ee.X8.executeBatch({requests:s})}var ue=n(69835),le=n(84162),ce=n(33023),me=n(51806),pe=n(64922),de=function(){var e=(0,c.wA)(),r=(0,t.useCallback)((function(){e(oe())}),[]);return re.Ay.getAclApi().groups.allowCreate?(0,pe.jsx)(me.A,{view:"action",onClick:r,children:"Create new"}):null},ve=(0,o.A)("groups-page-filters"),ge=function(e){(0,u.A)(n,e);var r=(0,l.A)(n);function n(){return(0,s.A)(this,n),r.apply(this,arguments)}return(0,i.A)(n,[{key:"render",value:function(){var e=this.props,r=e.className,n=e.groupFilter;return(0,pe.jsx)(ue.A,{children:(0,pe.jsx)(ce.M,{className:ve(null,r),itemsToWrap:[{name:"group",node:(0,pe.jsx)(le.A,{hasClear:!0,size:"m",type:"text",value:n,placeholder:"Enter group...",onChange:this.props.setGroupsNameFilter}),wrapperClassName:ve("item")}],children:(0,pe.jsx)(de,{})})})}}]),n}(t.Component),fe={setGroupsNameFilter:function(e){return{type:C.Nm,data:{nameFilter:e}}}};const be=(0,c.Ng)((function(e){return{groupFilter:_(e)}}),fe)(ge);var he=n(27222),Ae=n(57614),ye=n(34413),xe=n(62640),Ne=n(77318),Ce=n(95664),we=n(36810),je=n(34380),ke=n(63588),Ge=n(20361),Me=(0,o.A)("group-editor-dialog"),Ee=function(e){(0,u.A)(n,e);var r=(0,l.A)(n);function n(){var e;(0,s.A)(this,n);for(var t=arguments.length,o=new Array(t),a=0;a<t;a++)o[a]=arguments[a];return(e=r.call.apply(r,[this].concat(o))).onSubmit=function(){var r=(0,p.A)(f().mark((function r(n){var t,o,a,s,i,u,l,c,m,p,d,v,g,b,h,A,y;return f().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return t=e.props.groupName,o=n.getState(),a=o.values,s=a.members,i=s.members,u=s.membersComment,l=(0,Ge.lN)(i),c=l.added,m=l.removed,p=a.responsibles,d=p.responsibles,v=p.responsiblesComment,g=(0,Ge.lN)(d),b=g.added,h=g.removed,A=a.general.groupName,y="",u&&(y+=v?"**COMMENT FOR MEMBERS**\n":"",y+="".concat(u,"\n\n")),v&&(y+=u?"**COMMENT FOR RESPONSIBLES**\n":"",y+="".concat(v)),r.abrupt("return",e.props.saveGroupData({initialGroupName:t,groupName:A,membersToAdd:c,membersToRemove:m,responsiblesToAdd:b,responsiblesToRemove:h,comment:y}).then((function(){return(0,J.PE)(),e.props.fetchGroups()})).then((function(){})));case 11:case"end":return r.stop()}}),r)})));return function(e){return r.apply(this,arguments)}}(),e}return(0,i.A)(n,[{key:"render",value:function(){var e=this.props,r=e.visible,n=e.closeGroupEditorModal,t=e.groupName,o=e.idm,a=e.members,s=e.otherMembers,i=e.responsible;return(0,pe.jsx)(Ge.yZ,{size:"l",className:Me(null),pristineSubmittable:!1,visible:r,headerProps:{title:this.isNewGroup()?"Create group":"Group ".concat(t)},onClose:n,onAdd:this.onSubmit,initialValues:{general:{groupName:t,idm:String(o||"-"),size:String(a.length)},responsibles:{responsibles:(0,Ge.D7)(i)},members:{members:(0,Ge.D7)(a,s)}},fields:[{type:"tab-vertical",name:"general",title:"General",fields:[{name:"groupName",type:re.Ay.getAclApi().groups.allowRename?"text":"plain",required:!0,caption:"Group name"}].concat((0,m.A)(re.Ay.getAclApi().getGroupAcl?[{name:"idm",type:"plain",caption:"Idm managed"}]:[]),[{name:"size",type:"plain",caption:"Size"}])}].concat((0,m.A)(re.Ay.getAclApi().getGroupAcl?[{type:"tab-vertical",name:"responsibles",title:"Responsibles",fields:[{name:"responsibles",type:"acl-roles",caption:"Responsibles",extras:{placeholder:"Enter login or name"}},{name:"responsiblesComment",type:"textarea",caption:"Comment for IDM"}]}]:[])).concat([{type:"tab-vertical",name:"members",title:"Members",fields:[{name:"members",type:"acl-roles",caption:"Members",extras:{placeholder:"Enter login or name"}}].concat((0,m.A)(re.Ay.getAclApi().updateGroup?[{name:"membersComment",type:"textarea",caption:"Comment for IDM"}]:[]))}])})}},{key:"isNewGroup",value:function(){return!this.props.groupName}}]),n}(t.Component),Se={closeGroupEditorModal:function(){return{type:C.IX,data:{groupData:void 0,groupName:"",showModal:!1}}},saveGroupData:function(e){var r=e.initialGroupName,n=e.groupName,t=e.membersToAdd,o=e.membersToRemove,a=e.responsiblesToAdd,s=e.responsiblesToRemove,i=e.comment;return function(){var e=(0,p.A)(f().mark((function e(u,l){var c,m,p,d,v,g,b,h,A,y,x,N;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(c=!r)){e.next=4;break}return e.next=4,ae({groupName:n});case 4:if(m=r!==n,c||!m){e.next=8;break}return e.next=8,void 0,void 0,f=(u={oldGroupname:r,newGroupName:n}).oldGroupname,C=u.newGroupName,ee.X8.set({path:"//sys/groups/".concat(f,"/@name")},C);case 8:if(p=re.Ay.getAclApi(),!(d=p.updateGroup)){e.next=17;break}return v=l(),g=Z(v),b=g.members,h=g.responsible,A=W(v),y=se(b,t,o),x=se(h,a,s),N=(0,w.dB)(v),e.abrupt("return",d({cluster:N,groupName:n,version:A,groupDiff:{members:y,responsible:x},comment:i}));case 17:return e.abrupt("return",ie({groupName:n,membersToAdd:t,membersToRemove:o}));case 18:case"end":return e.stop()}var u,f,C}),e)})));return function(r,n){return e.apply(this,arguments)}}()},fetchGroups:te};const Te=(0,c.Ng)((function(e){var r=function(e){return e.groups.editor.idmData.group.other_members}(e),n=Y(e),t=n.responsible,o=n.members;return{visible:H(e),groupName:$(e),idm:Q(e),members:o,responsible:t,otherMembers:r}}),Se)(Ee);var ze=n(14880),Re=n(60620),De=n(85137),Fe=function(e){var r=e.group,n=e.onClose,o=(0,c.wA)(),a=t.useState(void 0),s=(0,d.A)(a,2),i=s[0],u=s[1],l=(0,t.useCallback)((0,p.A)(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,u(void 0),e.next=4,void 0,t=r,ee.X8.remove({path:"//sys/groups/"+t});case 4:n(),(0,J.PE)(),o(te()),e.next=12;break;case 9:e.prev=9,e.t0=e.catch(0),u(e.t0);case 12:case"end":return e.stop()}var t}),e,null,[[0,9]])}))),[o,r,n]);return(0,pe.jsx)(Ge.yZ,{visible:!0,headerProps:{title:"Delete group ".concat(r)},pristineSubmittable:!0,onClose:n,onAdd:l,fields:[{name:"groupname",type:"block",extras:{children:(0,pe.jsxs)(De.E,{children:['Are you sure you want to delete "',r,'"?']})}}].concat((0,m.A)((0,Ge.Y)([i])))})};function Ie(e){var r=e.className,n=e.groupname,o=(0,c.wA)(),a=t.useCallback((function(){o(oe(n))}),[n]),s=re.Ay.getAclApi().groups.allowDelete;return(0,pe.jsxs)("div",{className:r,children:[(0,pe.jsx)(ze.A,{title:n,path:"//sys/groups/".concat(n)}),(0,pe.jsx)(me.A,{view:"flat-secondary",size:"m",onClick:a,children:(0,pe.jsx)(Re.A,{awesome:"pencil-alt"})}),s&&(0,pe.jsx)(_e,{group:n})]})}function _e(e){var r=e.group,n=(0,t.useState)(!1),o=(0,d.A)(n,2),a=o[0],s=o[1],i=(0,t.useCallback)((function(){s(!0)}),[]),u=(0,t.useCallback)((function(){s(!1)}),[]);return(0,pe.jsxs)(t.Fragment,{children:[(0,pe.jsx)(me.A,{view:"flat-secondary",size:"m",onClick:i,children:(0,pe.jsx)(Re.A,{awesome:"trash-bin"})}),a&&(0,pe.jsx)(Fe,{group:r,onClose:u})]})}var Pe=(0,o.A)("groups-page-table"),Oe={displayIndices:!1,stickyHead:he.Ay.MOVING,stickyTop:a.kB,syncHeadOnResize:!0,dynamicRender:!0},Le={name:"Name",idm:"IDM",size:"Size",responsibles:"Responsible users",actions:""},Be=function(e){(0,u.A)(n,e);var r=(0,l.A)(n);function n(){var e;(0,s.A)(this,n);for(var t=arguments.length,o=new Array(t),a=0;a<t;a++)o[a]=arguments[a];return(e=r.call.apply(r,[this].concat(o))).onColumnSort=function(r,n){(0,e.props.setGroupsPageSorting)(r,n)},e.toggleExpand=function(r){(0,e.props.toggleGroupExpand)(r)},e}return(0,i.A)(n,[{key:"componentDidMount",value:function(){(0,this.props.fetchGroups)()}},{key:"renderColumnHeader",value:function(e,r){var n=this.props.sort,t=n.column,o=n.order,a=e===t;return(0,pe.jsx)(ye.A,{className:Pe("header-cell",{col:e,sortable:r},"data-table__head-cell"),column:e,title:Le[e],order:a?o:"",onSort:this.onColumnSort})}},{key:"renderNameCell",value:function(e,r){var n=r.row,t=n.name,o=n.shift,a=n.hasChildren,s=n.expanded;return(0,pe.jsxs)("div",{className:Pe("content",{col:e,shift:String(o),level:String(Math.min(10,o))}),children:[(0,pe.jsx)(we.A,{data:t,visible:a,onClick:this.toggleExpand,expanded:s}),(0,pe.jsx)(je.m,{content:t,children:(0,pe.jsx)("span",{className:Pe("group-name"),children:t})})]})}},{key:"renderIdmCell",value:function(e,r){var n=r.row.idm;return(0,pe.jsx)("div",{className:Pe("content",{col:e}),children:(0,pe.jsx)("div",{className:Pe(e),children:n&&n.toString()})})}},{key:"renderUsersCell",value:function(e,r){var n=r.row[e];return(0,pe.jsx)("div",{className:Pe("content",{col:e}),children:(0,pe.jsx)(xe.A,{className:Pe("groups"),items:n,itemRenderer:function(e){return e.startsWith("idm-group:")?e:(0,pe.jsx)(Ce.R,{name:e})}})})}},{key:"renderSizeCell",value:function(e,r){var n=r.row.members;return(0,pe.jsx)("div",{className:Pe("content",{col:e}),children:(0,pe.jsx)("span",{children:n.length})})}},{key:"renderActionsCell",value:function(e,r){var n=r.row.name;return(0,pe.jsx)(Ie,{className:Pe("content",{col:e}),groupname:n})}},{key:"renderTable",value:function(){var e=this,r=this.props,n=r.loaded,t=r.loading,o=r.groups,a=function(r){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{name:r,align:he.Ay.LEFT,sortable:!1,className:Pe("td",{col:r.toLowerCase()}),header:e.renderColumnHeader(r,!n)}},s=[(0,v.A)((0,v.A)({},a("name")),{},{render:this.renderNameCell.bind(this,"name")})].concat((0,m.A)((0,I.Gq)()?[(0,v.A)((0,v.A)({},a("idm")),{},{render:this.renderIdmCell.bind(this,"idm")})]:[]),[(0,v.A)((0,v.A)({},a("members",!0)),{},{render:this.renderUsersCell.bind(this,"members")}),(0,v.A)((0,v.A)({},a("size")),{},{render:this.renderSizeCell.bind(this,"size")}),(0,v.A)((0,v.A)({},a("actions")),{},{header:"",render:this.renderActionsCell.bind(this,"actions")})]);return(0,pe.jsx)(Ne.Ay,{loaded:n,loading:t,data:o,columns:s,settings:Oe,theme:"yt-internal"})}},{key:"render",value:function(){var e=this.props,r=e.className,n=e.error,t=e.showEditor;return(0,pe.jsxs)(ue.A,{children:[(0,pe.jsx)("div",{className:Pe(null,r),children:(0,pe.jsx)(ke.A,{loaded:!0,error:Boolean(n),errorData:n||void 0,children:this.renderTable()})}),t&&(0,pe.jsx)(Te,{})]})}}]),n}(t.Component),Ue={fetchGroups:te,setGroupsPageSorting:function(e,r){return{type:C.Nm,data:{sort:{column:e,order:r}}}},toggleGroupExpand:function(e){return function(r,n){var t=(0,v.A)({},O(n()));return t[e]?delete t[e]:t[e]=!0,r({type:C.Nm,data:{expanded:t}})}},openAttributesModal:Ae.V6};const Ve=(0,c.Ng)((function(e){var r=function(e){return e.groups.table}(e);return{loaded:r.loaded,loading:r.loading,error:r.error,groups:q(e),sort:P(e),showEditor:H(e)}}),Ue)(Be);var Xe=(0,o.A)("groups-page");function qe(){return(0,pe.jsx)("div",{className:Xe(null,"elements-main-section"),children:(0,pe.jsx)(a.Ay,{className:"elements-section",toolbar:(0,pe.jsx)(be,{}),content:(0,pe.jsx)(Ve,{})})})}}}]);
|
2
|
+
//# sourceMappingURL=groups.38f0df6f.chunk.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"js/groups.38f0df6f.chunk.js","mappings":"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","sources":["webpack://@ytsaurus/ui/./src/ui/components/ExpandIcon/ExpandIcon.js","webpack://@ytsaurus/ui/./src/ui/store/selectors/groups.ts","webpack://@ytsaurus/ui/./src/ui/store/actions/groups.ts","webpack://@ytsaurus/ui/./src/ui/pages/groups/CreateGroupModal/CreateGroupModal.tsx","webpack://@ytsaurus/ui/./src/ui/pages/groups/GroupsPageFilters/GroupsPageFilters.tsx","webpack://@ytsaurus/ui/./src/ui/pages/groups/GroupEditorDialog/GroupEditorDialog.tsx","webpack://@ytsaurus/ui/./src/ui/pages/groups/DeleteGroupModal/DeleteUserModal.tsx","webpack://@ytsaurus/ui/./src/ui/pages/groups/GroupActions/GroupActions.tsx","webpack://@ytsaurus/ui/./src/ui/pages/groups/GroupsPageTable/GroupsPageTable.tsx","webpack://@ytsaurus/ui/./src/ui/pages/groups/GroupsPage.tsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport cn from 'bem-cn-lite';\n\nimport Icon from '../../components/Icon/Icon';\n\nimport './ExpandIcon.scss';\n\nconst block = cn('expand-icon');\n\nExpandIcon.propTypes = {\n className: PropTypes.string,\n\n expanded: PropTypes.bool,\n visible: PropTypes.bool,\n onClick: PropTypes.func,\n\n data: PropTypes.any,\n};\n\nexport default function ExpandIcon({className, data, expanded, visible, onClick}) {\n const icon = expanded ? 'angle-up' : 'angle-down';\n const onClickCb = React.useCallback(() => {\n if (onClick) {\n onClick(data);\n }\n }, [data, onClick]);\n\n return (\n <span\n className={block(\n {visible: Boolean(visible), clickable: onClick !== undefined},\n className,\n )}\n onClick={onClickCb}\n >\n <Icon awesome={icon} />\n </span>\n );\n}\n","import cloneDeep_ from 'lodash/cloneDeep';\nimport forEach_ from 'lodash/forEach';\nimport map_ from 'lodash/map';\nimport compact_ from 'lodash/compact';\n\nimport {createSelector} from 'reselect';\nimport {ROOT_GROUP_NAME} from '../../constants/groups';\nimport {compareWithUndefined, orderTypeToOrderK} from '../../utils/sort-helpers';\n\nimport {concatByAnd} from '../../common/hammer/predicate';\nimport hammer from '../../common/hammer';\nimport {FlagType, flags} from '../../utils';\nimport type {RootState} from '../../store/reducers';\nimport type {Group} from '../../store/reducers/groups/table';\nimport {isIdmAclAvailable} from '../../config';\nimport type {PreparedRole} from '../../utils/acl';\n\n// Table\n\nexport const getGroupsTableDataState = (state: RootState) => state.groups.table;\n\nconst getGroups = (state: RootState) => state.groups.table.groups;\nexport const getGroupsNameFilter = (state: RootState) => state.groups.table.nameFilter;\nexport const getGroupsSort = (state: RootState) => state.groups.table.sort;\nexport const getGroupsExpanded = (state: RootState) => state.groups.table.expanded;\n\nexport type GroupsTreeNode = Group & {\n parent?: string;\n children: GroupsTreeNode[];\n leaves: GroupsTreeNode[];\n shift?: number;\n hasChildren?: boolean;\n expanded?: boolean;\n};\n\ntype GroupsTree = Record<string, GroupsTreeNode>;\n\nexport const getGroupsTree = createSelector([getGroups], (groups) => {\n const res: GroupsTree = groups.reduce((acc: GroupsTree, item) => {\n acc[item.name] = {...item, children: [], leaves: []};\n return acc;\n }, {});\n const root = {children: [], leaves: [], name: ''};\n res[ROOT_GROUP_NAME] = root;\n\n const hasChildren: Record<string, boolean> = {};\n forEach_(res, (item: GroupsTreeNode) => {\n if (item === root) {\n return;\n }\n let {memberOf = []} = item;\n if (memberOf.length === 0) {\n memberOf = [ROOT_GROUP_NAME];\n }\n memberOf.forEach((parent) => {\n hasChildren[parent] = true;\n /**\n * Copy of the item is reuired because\n * a group might be a member of many other groups\n * i.e. different copies will have different parent field\n */\n const itemCopy = {...item, parent};\n res[parent].children.push(itemCopy);\n item.parent = parent;\n });\n });\n hammer.treeList.treeForEach(res[ROOT_GROUP_NAME], (item: GroupsTreeNode, depth: number) => {\n item.shift = depth - 1; // -1 cause <Root> is not visible\n item.hasChildren = hasChildren[item.name!];\n });\n return res;\n});\n\nconst getGroupsTreeFiltered = createSelector(\n [getGroupsTree, getGroupsNameFilter],\n (tree, nameFilter) => {\n const root = tree[ROOT_GROUP_NAME];\n const predicates = compact_([\n nameFilter &&\n ((node: GroupsTreeNode) => {\n return node === root || -1 !== node.name!.indexOf(nameFilter);\n }),\n ]);\n\n const res = hammer.treeList.filterTree(root, concatByAnd(...predicates));\n return res;\n },\n);\n\nconst getGroupsTreeFilteredAndExpanded = createSelector(\n [getGroupsTreeFiltered, getGroupsExpanded],\n (root, expanded) => {\n const res = cloneDeep_(root);\n hammer.treeList.treeForEach(res.children, (node: GroupsTreeNode) => {\n const {name} = node;\n if (!expanded[name]) {\n node.children = [];\n }\n });\n return res;\n },\n);\n\nconst GROUP_FIELDS = {\n name: {\n get(group: {name: string}) {\n return group.name;\n },\n compareFn: compareWithUndefined,\n },\n idm: {\n get(group: {idm: string}) {\n return group.idm;\n },\n compareFn: compareWithUndefined,\n },\n size: {\n get({members = []}: {members: string[]}) {\n return members.length;\n },\n },\n};\n\nconst getGroupsTreeFilteredAndSorted = createSelector(\n [getGroupsTreeFilteredAndExpanded, getGroupsSort],\n (root, {column, order}) => {\n const {orderK, undefinedOrderK} = orderTypeToOrderK(order);\n const res = hammer.treeList.sortTree(\n {...root},\n {\n field: column,\n asc: orderK === 1,\n undefinedAsk: undefinedOrderK === 1,\n },\n GROUP_FIELDS,\n );\n return res;\n },\n);\n\nexport const getGroupsFlattenTree = createSelector(\n [getGroupsTreeFilteredAndSorted],\n (root): GroupsTreeNode[] => {\n return hammer.treeList.flattenTree(root);\n },\n);\n\n// Editor\nexport const getGroupEditorData = (state: RootState) => state.groups.editor.data;\nexport const getGroupEditorVisible = (state: RootState) => state.groups.editor.showModal;\nexport const getGroupEditorGroupName = (state: RootState) => state.groups.editor.groupName;\n// eslint-disable-next-line camelcase\nexport const getGroupEditorGroupIdm = (state: RootState) =>\n flags.get(state.groups.editor.data.$attributes?.upravlyator_managed as FlagType);\nconst getGroupEditorIdmData = (state: RootState) => state.groups.editor.idmData;\nexport const getGroupEditorIdmDataVersion = (state: RootState) =>\n state.groups.editor.idmData.version;\nexport const getGroupEditorIdmDataOtherMembers = (state: RootState) =>\n state.groups.editor.idmData.group.other_members;\n\nexport const getGroupEditorSubjects = createSelector([getGroupEditorIdmData], (idmData) => {\n const {\n group: {members, responsible},\n } = idmData;\n return {\n responsible: map_(responsible, ({subject}) => subject),\n members: map_(members, ({subject}) => subject),\n };\n});\n\nexport const getGroupEditorRoles = createSelector(\n [getGroupEditorIdmData, getGroupEditorData],\n (\n idmData,\n data,\n ): {\n responsible: PreparedRole[];\n members: PreparedRole[];\n } => {\n if (isIdmAclAvailable()) {\n const {\n group: {members, responsible},\n } = idmData;\n\n return {\n responsible,\n members,\n };\n }\n\n const members = data.$attributes?.members || [];\n\n return {\n responsible: [],\n members: members.map((member) => {\n return {\n text: member,\n value: member,\n state: 'granted',\n role_type: 'member',\n subject: {\n user: member,\n },\n };\n }),\n };\n },\n);\n","import concat_ from 'lodash/concat';\nimport filter_ from 'lodash/filter';\nimport forEach_ from 'lodash/forEach';\n\nimport {\n GROUPS_TABLE,\n GROUPS_TABLE_DATA_FIELDS,\n GROUP_EDITOR_ACTION,\n GROUP_EDITOR_ACTION_DATA_FIELDS,\n} from '../../constants/groups';\nimport {getCluster} from '../../store/selectors/global';\nimport {\n getGroupEditorIdmDataVersion,\n getGroupEditorSubjects,\n getGroupsExpanded,\n} from '../../store/selectors/groups';\nimport {flags} from '../../utils/index';\nimport {listAllGroups} from '../../utils/users-groups';\nimport {YTApiId, ytApiV3, ytApiV3Id} from '../../rum/rum-wrap-api';\nimport UIFactory from '../../UIFactory';\nimport type {Dispatch} from 'redux';\nimport type {Group} from '../../store/reducers/groups/table';\nimport type {OrderType} from '../../utils/sort-helpers';\nimport type {RootState} from '../../store/reducers';\nimport type {GroupSubject, Subject, UserSubject} from '../../utils/acl/acl-types';\n\n// Table\n\nconst GROUP_ATTRIBUTES = ['member_of', 'members', 'upravlyator_managed'];\n\nexport function fetchGroups() {\n return (dispatch: Dispatch) => {\n dispatch({type: GROUPS_TABLE.REQUEST});\n\n return listAllGroups(YTApiId.groupsData, {attributes: GROUP_ATTRIBUTES})\n .then((data) => {\n const groups: Group[] = [];\n forEach_(data, (item) => {\n const {\n $value: name,\n $attributes: {members, member_of: memberOf = [], upravlyator_managed: idm},\n } = item;\n members.sort();\n groups.push({\n name,\n members,\n memberOf,\n idm: flags.get(idm || false)!,\n });\n });\n return dispatch({\n type: GROUPS_TABLE.SUCCESS,\n data: {groups},\n });\n })\n .catch((error) => {\n dispatch({type: GROUPS_TABLE.FAILURE, data: {error}});\n });\n };\n}\n\nexport function setGroupsNameFilter(nameFilter: string) {\n return {type: GROUPS_TABLE_DATA_FIELDS, data: {nameFilter}};\n}\n\nexport function setGroupsPageSorting(column: string, order: OrderType) {\n return {\n type: GROUPS_TABLE_DATA_FIELDS,\n data: {sort: {column, order}},\n };\n}\n\nexport function toggleGroupExpand(groupName: string) {\n return (dispatch: Dispatch, getState: () => RootState) => {\n const expanded = {...getGroupsExpanded(getState())};\n const current = expanded[groupName];\n if (current) {\n delete expanded[groupName];\n } else {\n expanded[groupName] = true;\n }\n\n return dispatch({type: GROUPS_TABLE_DATA_FIELDS, data: {expanded}});\n };\n}\n\nexport function openGroupEditorModal(groupName = '') {\n return (dispatch: Dispatch, getState: () => RootState) => {\n const state = getState();\n\n dispatch({\n type: GROUP_EDITOR_ACTION_DATA_FIELDS,\n data: {showModal: true, groupName},\n });\n\n if (!groupName) {\n return Promise.resolve();\n }\n\n dispatch({type: GROUP_EDITOR_ACTION.REQUEST});\n\n const path = `//sys/groups/${groupName}`;\n\n let idmDataPromise;\n\n const {getGroupAcl} = UIFactory.getAclApi();\n\n if (getGroupAcl) {\n idmDataPromise = getGroupAcl(getCluster(state), groupName);\n } else {\n idmDataPromise = Promise.resolve();\n }\n\n return Promise.all([\n ytApiV3Id.get(YTApiId.groupsEditData, {path, attributes: GROUP_ATTRIBUTES}),\n idmDataPromise,\n ])\n .then(([groupsData, idmData]) => {\n const data = {\n data: groupsData,\n ...(idmData ? {idmData} : {}),\n };\n\n return dispatch({\n type: GROUP_EDITOR_ACTION.SUCCESS,\n data,\n });\n })\n .catch((error) => {\n return dispatch({\n type: GROUP_EDITOR_ACTION.FAILURE,\n data: error,\n });\n });\n };\n}\n\nexport function closeGroupEditorModal() {\n return {\n type: GROUP_EDITOR_ACTION_DATA_FIELDS,\n data: {groupData: undefined, groupName: '', showModal: false},\n };\n}\n\nexport function createGroup({groupName}: {groupName: string}) {\n return ytApiV3.create({\n type: 'group',\n attributes: {name: groupName},\n });\n}\n\nexport function deleteGroup({groupName}: {groupName: string}) {\n return ytApiV3.remove({\n path: '//sys/groups/' + groupName,\n });\n}\n\ntype SaveGroupDataPayload = {\n initialGroupName: string;\n groupName: string;\n membersToAdd: Subject[];\n membersToRemove: Subject[];\n responsiblesToAdd: Subject[];\n responsiblesToRemove: Subject[];\n comment: string;\n};\n\nexport function saveGroupData({\n initialGroupName,\n groupName,\n membersToAdd,\n membersToRemove,\n responsiblesToAdd,\n responsiblesToRemove,\n comment,\n}: SaveGroupDataPayload) {\n return async (_dispatch: Dispatch, getState: () => RootState) => {\n const isNewGroup = !initialGroupName;\n\n if (isNewGroup) {\n await createGroup({groupName});\n }\n\n const groupNameChanged = initialGroupName !== groupName;\n\n if (!isNewGroup && groupNameChanged) {\n await renameGroup({\n oldGroupname: initialGroupName,\n newGroupName: groupName,\n });\n }\n\n const {updateGroup} = UIFactory.getAclApi();\n\n if (updateGroup) {\n const state = getState();\n const {members, responsible} = getGroupEditorSubjects(state);\n const version = getGroupEditorIdmDataVersion(state);\n const newMembers = calculateMembers(members, membersToAdd, membersToRemove);\n const newResponsibles = calculateMembers(\n responsible,\n responsiblesToAdd,\n responsiblesToRemove,\n );\n\n const cluster = getCluster(state);\n return updateGroup({\n cluster,\n groupName,\n version,\n groupDiff: {\n members: newMembers,\n responsible: newResponsibles,\n },\n comment,\n });\n }\n\n return changeGroupMembers({\n groupName,\n membersToAdd,\n membersToRemove,\n });\n };\n}\n\nfunction calculateMembers(\n members: Subject[],\n toAdd: Subject[],\n toRemove: Subject[],\n): undefined | Subject[] {\n if ((!toAdd || !toAdd.length) && (!toRemove || !toRemove.length)) {\n return undefined;\n }\n\n const [rmUsers, rmGroups] = mapsByNameFromSubjects(toRemove);\n const afterRemove = filter_(members, (item) => {\n const {user, group} = item as {user: string; group: string};\n if (user) {\n return !rmUsers.has(user);\n } else {\n return !rmGroups.has(group);\n }\n });\n\n return concat_(afterRemove, toAdd);\n}\n\nfunction mapsByNameFromSubjects(subjects: Subject[]) {\n const userMap = new Map();\n const groupMap = new Map();\n forEach_(subjects, (item) => {\n const {user, group} = item as {user: string; group: string};\n if (user) {\n userMap.set(user, item);\n } else {\n groupMap.set(group, item);\n }\n });\n return [userMap, groupMap];\n}\n\ntype RenameGroupPayload = {\n oldGroupname: string;\n newGroupName: string;\n};\n\nfunction renameGroup({oldGroupname, newGroupName}: RenameGroupPayload) {\n return ytApiV3.set({path: `//sys/groups/${oldGroupname}/@name`}, newGroupName);\n}\n\ntype ChangeGroupMembersPayload = {\n groupName: string;\n membersToAdd: Subject[];\n membersToRemove: Subject[];\n};\n\nfunction changeGroupMembers({groupName, membersToAdd, membersToRemove}: ChangeGroupMembersPayload) {\n const requestsToAdd = membersToAdd.map((user) => {\n return {\n command: 'add_member' as const,\n parameters: {\n group: groupName,\n member: (user as UserSubject).user || (user as GroupSubject).group,\n },\n };\n });\n\n const requestsToRemove = membersToRemove.map((user) => {\n return {\n command: 'remove_member' as const,\n parameters: {\n group: groupName,\n member: (user as UserSubject).user || (user as GroupSubject).group,\n },\n };\n });\n\n const requests = [...requestsToAdd, ...requestsToRemove];\n\n return ytApiV3.executeBatch({\n requests,\n });\n}\n","import Button from '../../../components/Button/Button';\nimport React, {useCallback} from 'react';\nimport {useDispatch} from 'react-redux';\nimport {openGroupEditorModal} from '../../../store/actions/groups';\nimport UIFactory from '../../../UIFactory';\n\nexport const ShowCreateGroupModalButton: React.FC = () => {\n const dispatch = useDispatch();\n const onClick = useCallback(() => {\n dispatch(openGroupEditorModal());\n }, []);\n\n if (!UIFactory.getAclApi().groups.allowCreate) {\n return null;\n }\n\n return (\n <Button view=\"action\" onClick={onClick}>\n Create new\n </Button>\n );\n};\n","import React from 'react';\nimport cn from 'bem-cn-lite';\nimport {connect} from 'react-redux';\n\nimport {setGroupsNameFilter} from '../../../store/actions/groups';\nimport ErrorBoundary from '../../../components/ErrorBoundary/ErrorBoundary';\nimport Filter from '../../../components/Filter/Filter';\nimport {Toolbar} from '../../../components/WithStickyToolbar/Toolbar/Toolbar';\nimport {getGroupsNameFilter} from '../../../store/selectors/groups';\nimport type {RootState} from '../../../store/reducers';\n\nimport './GroupsPageFilters.scss';\nimport {ShowCreateGroupModalButton} from '../CreateGroupModal/CreateGroupModal';\n\nconst block = cn('groups-page-filters');\n\ntype GroupsPageFiltersProps = {\n className?: string;\n groupFilter: string;\n setGroupsNameFilter: (value: string) => void;\n};\n\nclass GroupsPageFilters extends React.Component<GroupsPageFiltersProps> {\n render() {\n const {className, groupFilter} = this.props;\n\n return (\n <ErrorBoundary>\n <Toolbar\n className={block(null, className)}\n itemsToWrap={[\n {\n name: 'group',\n node: (\n <Filter\n hasClear\n size=\"m\"\n type=\"text\"\n value={groupFilter}\n placeholder=\"Enter group...\"\n onChange={this.props.setGroupsNameFilter}\n />\n ),\n wrapperClassName: block('item'),\n },\n ]}\n >\n <ShowCreateGroupModalButton />\n </Toolbar>\n </ErrorBoundary>\n );\n }\n}\n\nconst mapStateToProps = (state: RootState) => {\n return {\n groupFilter: getGroupsNameFilter(state),\n };\n};\n\nconst mapDispatchToProps = {\n setGroupsNameFilter,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(GroupsPageFilters);\n","import {\n EditableManyListsItemType,\n FormApi,\n YTDFDialog,\n extractChangedSubjects,\n prepareRoleListValue,\n} from '../../../components/Dialog';\nimport React from 'react';\nimport cn from 'bem-cn-lite';\nimport {ConnectedProps, connect} from 'react-redux';\n\nimport {closeGroupEditorModal, fetchGroups, saveGroupData} from '../../../store/actions/groups';\nimport {\n getGroupEditorGroupIdm,\n getGroupEditorGroupName,\n getGroupEditorIdmDataOtherMembers,\n getGroupEditorRoles,\n getGroupEditorVisible,\n} from '../../../store/selectors/groups';\nimport type {RootState} from '../../../store/reducers';\nimport type {ResponsibleType, RoleConverted} from '../../../utils/acl/acl-types';\nimport UIFactory from '../../../UIFactory';\nimport {disableGroupsCache} from '../../../utils/users-groups';\n\nimport './GroupEditorDialog.scss';\n\nconst block = cn('group-editor-dialog');\n\ninterface GroupsPageTableProps extends ConnectedProps<typeof connector> {}\n\ntype FormValues = {\n general: {\n groupName: string;\n idm: string;\n size: string;\n };\n members: {\n members: {\n current: EditableManyListsItemType<RoleConverted>;\n newItems: Array<ResponsibleType>;\n };\n membersComment?: string;\n };\n responsibles: {\n responsibles: {\n current: EditableManyListsItemType<RoleConverted>;\n newItems: Array<ResponsibleType>;\n };\n responsiblesComment?: string;\n };\n};\n\nclass GroupEditorDialog extends React.Component<GroupsPageTableProps> {\n onSubmit = async (form: FormApi<FormValues, Partial<FormValues>>) => {\n const {groupName: initialGroupName} = this.props;\n const {values} = form.getState();\n const {members, membersComment} = values.members;\n const {added: membersToAdd, removed: membersToRemove} = extractChangedSubjects(members);\n\n const {responsibles, responsiblesComment} = values.responsibles;\n const {added: responsiblesToAdd, removed: responsiblesToRemove} =\n extractChangedSubjects(responsibles);\n\n const {groupName} = values.general;\n\n let comment = '';\n if (membersComment) {\n comment += responsiblesComment ? '**COMMENT FOR MEMBERS**\\n' : '';\n comment += `${membersComment}\\n\\n`;\n }\n if (responsiblesComment) {\n comment += membersComment ? '**COMMENT FOR RESPONSIBLES**\\n' : '';\n comment += `${responsiblesComment}`;\n }\n\n return this.props\n .saveGroupData({\n initialGroupName,\n groupName,\n membersToAdd,\n membersToRemove,\n responsiblesToAdd,\n responsiblesToRemove,\n comment,\n })\n .then(() => {\n disableGroupsCache();\n return this.props.fetchGroups();\n })\n .then(() => {});\n };\n\n render() {\n const {visible, closeGroupEditorModal, groupName, idm, members, otherMembers, responsible} =\n this.props;\n return (\n <YTDFDialog<FormValues>\n size={'l'}\n className={block(null)}\n pristineSubmittable={false}\n visible={visible}\n headerProps={{\n title: this.isNewGroup() ? 'Create group' : `Group ${groupName}`,\n }}\n onClose={closeGroupEditorModal}\n onAdd={this.onSubmit}\n initialValues={{\n general: {\n groupName,\n idm: String(idm || '-'),\n size: String(members.length),\n },\n responsibles: {\n responsibles: prepareRoleListValue(responsible),\n },\n members: {\n members: prepareRoleListValue(members, otherMembers),\n },\n }}\n fields={[\n ...[\n {\n type: 'tab-vertical' as const,\n name: 'general',\n title: 'General',\n fields: [\n {\n name: 'groupName',\n type: UIFactory.getAclApi().groups.allowRename\n ? ('text' as const)\n : ('plain' as const),\n required: true,\n caption: 'Group name',\n },\n ...(UIFactory.getAclApi().getGroupAcl\n ? [\n {\n name: 'idm',\n type: 'plain' as const,\n caption: 'Idm managed',\n },\n ]\n : []),\n\n {\n name: 'size',\n type: 'plain' as const,\n caption: 'Size',\n },\n ],\n },\n ...(UIFactory.getAclApi().getGroupAcl\n ? [\n {\n type: 'tab-vertical' as const,\n name: 'responsibles',\n title: 'Responsibles',\n fields: [\n {\n name: 'responsibles',\n type: 'acl-roles' as const,\n caption: 'Responsibles',\n extras: {\n placeholder: 'Enter login or name',\n },\n },\n {\n name: 'responsiblesComment',\n type: 'textarea' as const,\n caption: 'Comment for IDM',\n },\n ],\n },\n ]\n : []),\n ],\n {\n type: 'tab-vertical',\n name: 'members',\n title: 'Members',\n fields: [\n {\n name: 'members',\n type: 'acl-roles',\n caption: 'Members',\n extras: {\n placeholder: 'Enter login or name',\n },\n },\n\n ...(UIFactory.getAclApi().updateGroup\n ? [\n {\n name: 'membersComment',\n type: 'textarea' as const,\n caption: 'Comment for IDM',\n },\n ]\n : []),\n ],\n },\n ]}\n />\n );\n }\n\n private isNewGroup() {\n return !this.props.groupName;\n }\n}\n\nconst mapStateToProps = (state: RootState) => {\n const otherMembers = getGroupEditorIdmDataOtherMembers(state);\n const {responsible, members} = getGroupEditorRoles(state);\n return {\n visible: getGroupEditorVisible(state),\n groupName: getGroupEditorGroupName(state),\n idm: getGroupEditorGroupIdm(state),\n members,\n responsible,\n otherMembers,\n };\n};\n\nconst mapDispatchToProps = {\n closeGroupEditorModal,\n saveGroupData,\n fetchGroups,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport default connector(GroupEditorDialog);\n","import React, {useCallback} from 'react';\nimport {useDispatch} from 'react-redux';\nimport {Text} from '@gravity-ui/uikit';\nimport {deleteGroup, fetchGroups} from '../../../store/actions/groups';\nimport {YTDFDialog, makeErrorFields} from '../../../components/Dialog';\nimport {YTError} from '../../../types';\nimport {disableGroupsCache} from '../../../utils/users-groups';\n\ntype DeleteGroupModalProps = {\n group: string;\n onClose: () => void;\n};\n\nexport const DeleteGroupModal: React.FC<DeleteGroupModalProps> = ({group, onClose}) => {\n const dispatch = useDispatch();\n const [error, setError] = React.useState<YTError | undefined>(undefined);\n\n const onAdd = useCallback(async () => {\n try {\n setError(undefined);\n\n await deleteGroup({groupName: group});\n\n onClose();\n\n disableGroupsCache();\n // we don't need to wait for the end of the action\n dispatch(fetchGroups());\n } catch (error) {\n setError(error as YTError);\n }\n }, [dispatch, group, onClose]);\n\n return (\n <YTDFDialog\n visible={true}\n headerProps={{title: `Delete group ${group}`}}\n pristineSubmittable={true}\n onClose={onClose}\n onAdd={onAdd}\n fields={[\n {\n name: 'groupname',\n type: 'block',\n extras: {\n children: <Text>Are you sure you want to delete "{group}"?</Text>,\n },\n },\n ...makeErrorFields([error]),\n ]}\n />\n );\n};\n","import React, {useCallback, useState} from 'react';\n\nimport {useDispatch} from 'react-redux';\n\nimport ClickableAttributesButton from '../../../components/AttributesButton/ClickableAttributesButton';\n\nimport Icon from '../../../components/Icon/Icon';\nimport Button from '../../../components/Button/Button';\n\nimport {openGroupEditorModal} from '../../../store/actions/groups';\nimport UIFactory from '../../../UIFactory';\nimport {DeleteGroupModal} from '../DeleteGroupModal/DeleteUserModal';\n\ntype GroupActionsProps = {\n className?: string;\n groupname: string;\n};\n\nexport function GroupActions({className, groupname}: GroupActionsProps) {\n const dispatch = useDispatch();\n\n const onEdit = React.useCallback(() => {\n dispatch(openGroupEditorModal(groupname));\n }, [groupname]);\n\n const {allowDelete} = UIFactory.getAclApi().groups;\n\n return (\n <div className={className}>\n <ClickableAttributesButton title={groupname} path={`//sys/groups/${groupname}`} />\n <Button view=\"flat-secondary\" size=\"m\" onClick={onEdit}>\n <Icon awesome=\"pencil-alt\" />\n </Button>\n {allowDelete && <DeleteGroupButton group={groupname} />}\n </div>\n );\n}\n\nfunction DeleteGroupButton({group}: {group: string}) {\n const [visible, setVisible] = useState(false);\n\n const onClick = useCallback(() => {\n setVisible(true);\n }, []);\n\n const onClose = useCallback(() => {\n setVisible(false);\n }, []);\n\n return (\n <React.Fragment>\n <Button view=\"flat-secondary\" size=\"m\" onClick={onClick}>\n <Icon awesome=\"trash-bin\" />\n </Button>\n {visible && <DeleteGroupModal group={group} onClose={onClose} />}\n </React.Fragment>\n );\n}\n","import React from 'react';\nimport cn from 'bem-cn-lite';\nimport {ConnectedProps, connect} from 'react-redux';\nimport DataTable from '@gravity-ui/react-data-table';\n\nimport {openAttributesModal} from '../../../store/actions/modals/attributes-modal';\nimport ColumnHeader from '../../../components/ColumnHeader/ColumnHeader';\nimport CommaSeparatedListWithRestCounter from '../../../components/CommaSeparateListWithRestCounter/CommaSeparateListWithRestCounter';\nimport DataTableYT from '../../../components/DataTableYT/DataTableYT';\nimport {SubjectCard} from '../../../components/SubjectLink/SubjectLink';\n\nimport ErrorBoundary from '../../../components/ErrorBoundary/ErrorBoundary';\nimport ExpandIcon from '../../../components/ExpandIcon/ExpandIcon';\nimport {Tooltip} from '../../../components/Tooltip/Tooltip';\n\nimport LoadDataHandler from '../../../components/LoadDataHandler/LoadDataHandler';\n\nimport {fetchGroups, setGroupsPageSorting, toggleGroupExpand} from '../../../store/actions/groups';\nimport {STICKY_TOOLBAR_BOTTOM} from '../../../components/WithStickyToolbar/WithStickyToolbar';\nimport GroupEditorDialog from '../../../pages/groups/GroupEditorDialog/GroupEditorDialog';\nimport {\n GroupsTreeNode,\n getGroupEditorVisible,\n getGroupsFlattenTree,\n getGroupsSort,\n getGroupsTableDataState,\n} from '../../../store/selectors/groups';\n\nimport './GroupsPageTable.scss';\nimport {isIdmAclAvailable} from '../../../config';\nimport type {RootState} from '../../../store/reducers';\nimport type {OrderType} from '../../../utils/sort-helpers';\nimport {GroupActions} from '../GroupActions/GroupActions';\n\nconst block = cn('groups-page-table');\n\nconst TABLE_SETTINGS = {\n displayIndices: false,\n stickyHead: DataTable.MOVING,\n stickyTop: STICKY_TOOLBAR_BOTTOM,\n syncHeadOnResize: true,\n dynamicRender: true,\n} as const;\n\nconst COLUMN_NAMES: Record<string, string> = {\n name: 'Name',\n idm: 'IDM',\n size: 'Size',\n responsibles: 'Responsible users',\n actions: '',\n};\n\ninterface GroupsPageTableProps extends ConnectedProps<typeof connector> {\n className?: string;\n}\n\nclass GroupsPageTable extends React.Component<GroupsPageTableProps> {\n componentDidMount() {\n const {fetchGroups} = this.props;\n fetchGroups();\n }\n\n renderColumnHeader(col: string, sortable: boolean) {\n const {\n sort: {column, order},\n } = this.props;\n const isSorted = col === column;\n\n return (\n <ColumnHeader\n className={block('header-cell', {col, sortable}, 'data-table__head-cell')}\n column={col}\n title={COLUMN_NAMES[col]}\n order={isSorted ? order : ''}\n onSort={this.onColumnSort}\n />\n );\n }\n\n onColumnSort = (colName: string, nextOrder: OrderType) => {\n const {setGroupsPageSorting} = this.props;\n setGroupsPageSorting(colName, nextOrder);\n };\n\n renderNameCell(col: string, {row}: {row: GroupsTreeNode}) {\n const {name, shift, hasChildren, expanded} = row;\n return (\n <div\n className={block('content', {\n col,\n shift: String(shift),\n level: String(Math.min(10, shift!)),\n })}\n >\n <ExpandIcon\n data={name}\n visible={hasChildren}\n onClick={this.toggleExpand}\n expanded={expanded}\n />\n <Tooltip content={name}>\n <span className={block('group-name')}>{name}</span>\n </Tooltip>\n </div>\n );\n }\n\n toggleExpand = (groupName: string) => {\n const {toggleGroupExpand} = this.props;\n toggleGroupExpand(groupName);\n };\n\n renderIdmCell(col: string, {row}: {row: GroupsTreeNode}) {\n const {idm} = row;\n return (\n <div className={block('content', {col})}>\n <div className={block(col)}>{idm && idm.toString()}</div>\n </div>\n );\n }\n\n renderUsersCell(col: 'members', {row}: {row: GroupsTreeNode}) {\n const {[col]: value} = row;\n return (\n <div className={block('content', {col})}>\n <CommaSeparatedListWithRestCounter\n className={block('groups')}\n items={value}\n itemRenderer={(item: string) => {\n if (item.startsWith('idm-group:')) {\n return item;\n } else {\n return <SubjectCard name={item} />;\n }\n }}\n />\n </div>\n );\n }\n\n renderSizeCell(col: string, {row}: {row: GroupsTreeNode}) {\n const {members} = row;\n return (\n <div className={block('content', {col})}>\n <span>{members!.length}</span>\n </div>\n );\n }\n\n renderActionsCell(col: string, {row}: {row: GroupsTreeNode}) {\n const {name: groupname} = row;\n\n return <GroupActions className={block('content', {col})} groupname={groupname} />;\n }\n\n renderTable() {\n const {loaded, loading, groups} = this.props;\n\n const columnProps = (name: string, disableSorting = false) => {\n return {\n name,\n align: DataTable.LEFT,\n sortable: false,\n className: block('td', {col: name.toLowerCase()}),\n header: this.renderColumnHeader(name, !disableSorting),\n } as const;\n };\n\n const DISABLED_SORTING = true;\n\n const columns = [\n {\n ...columnProps('name'),\n render: this.renderNameCell.bind(this, 'name'),\n },\n ...(!isIdmAclAvailable()\n ? []\n : [\n {\n ...columnProps('idm'),\n render: this.renderIdmCell.bind(this, 'idm'),\n },\n ]),\n {\n ...columnProps('members', DISABLED_SORTING),\n render: this.renderUsersCell.bind(this, 'members'),\n },\n {\n ...columnProps('size'),\n render: this.renderSizeCell.bind(this, 'size'),\n },\n {\n ...columnProps('actions'),\n header: '',\n render: this.renderActionsCell.bind(this, 'actions'),\n },\n ];\n\n return (\n <DataTableYT\n loaded={loaded}\n loading={loading}\n data={groups}\n columns={columns}\n settings={TABLE_SETTINGS}\n theme={'yt-internal'}\n />\n );\n }\n\n render() {\n const {className, error, showEditor} = this.props;\n return (\n <ErrorBoundary>\n <div className={block(null, className)}>\n <LoadDataHandler\n loaded={true}\n error={Boolean(error)}\n errorData={error || undefined}\n >\n {this.renderTable()}\n </LoadDataHandler>\n </div>\n {showEditor && <GroupEditorDialog />}\n </ErrorBoundary>\n );\n }\n}\n\nconst mapStateToProps = (state: RootState) => {\n const {loaded, loading, error} = getGroupsTableDataState(state);\n const groups = getGroupsFlattenTree(state);\n const sort = getGroupsSort(state);\n const showEditor = getGroupEditorVisible(state);\n\n return {\n loaded,\n loading,\n error,\n\n groups,\n sort,\n showEditor,\n };\n};\n\nconst mapDispatchToProps = {\n fetchGroups,\n setGroupsPageSorting,\n toggleGroupExpand,\n openAttributesModal,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport default connector(GroupsPageTable);\n","import React from 'react';\nimport cn from 'bem-cn-lite';\nimport WithStickyToolbar from '../../components/WithStickyToolbar/WithStickyToolbar';\n\nimport GroupsPageFilters from './GroupsPageFilters/GroupsPageFilters';\nimport GroupsPageTable from './GroupsPageTable/GroupsPageTable';\n\nconst block = cn('groups-page');\n\nexport default function GroupsPage() {\n return (\n <div className={block(null, 'elements-main-section')}>\n <WithStickyToolbar\n className=\"elements-section\"\n toolbar={<GroupsPageFilters />}\n content={<GroupsPageTable />}\n />\n </div>\n );\n}\n"],"names":["block","cn","ExpandIcon","_ref","className","data","expanded","visible","onClick","icon","onClickCb","React","_jsx","Boolean","clickable","undefined","children","Icon","awesome","getGroupsNameFilter","state","groups","table","nameFilter","getGroupsSort","sort","getGroupsExpanded","getGroupsTree","createSelector","res","reduce","acc","item","name","_objectSpread","leaves","root","ROOT_GROUP_NAME","hasChildren","forEach_","_item$memberOf","memberOf","length","forEach","parent","itemCopy","push","hammer","treeList","treeForEach","depth","shift","getGroupsTreeFiltered","tree","predicates","compact_","node","indexOf","filterTree","concatByAnd","apply","_toConsumableArray","getGroupsTreeFilteredAndExpanded","cloneDeep_","GROUP_FIELDS","get","group","compareFn","compareWithUndefined","idm","size","_ref$members","members","getGroupsTreeFilteredAndSorted","_ref2","column","order","_orderTypeToOrderK","orderTypeToOrderK","orderK","undefinedOrderK","sortTree","field","asc","undefinedAsk","getGroupsFlattenTree","flattenTree","getGroupEditorVisible","editor","showModal","getGroupEditorGroupName","groupName","getGroupEditorGroupIdm","_state$groups$editor$","flags","$attributes","upravlyator_managed","getGroupEditorIdmData","idmData","getGroupEditorIdmDataVersion","version","getGroupEditorSubjects","_idmData$group","responsible","map_","_ref3","subject","_ref4","getGroupEditorRoles","_data$$attributes","isIdmAclAvailable","_idmData$group2","map","member","text","value","role_type","user","GROUP_ATTRIBUTES","fetchGroups","dispatch","type","GROUPS_TABLE","REQUEST","listAllGroups","YTApiId","groupsData","attributes","then","$value","_item$$attributes","_item$$attributes$mem","member_of","SUCCESS","error","FAILURE","openGroupEditorModal","arguments","getState","GROUP_EDITOR_ACTION_DATA_FIELDS","Promise","resolve","GROUP_EDITOR_ACTION","idmDataPromise","path","concat","getGroupAcl","UIFactory","getAclApi","getCluster","all","ytApiV3Id","groupsEditData","_slicedToArray","createGroup","ytApiV3","create","calculateMembers","toAdd","toRemove","subjects","userMap","groupMap","_mapsByNameFromSubjec","Map","_ref8","set","_mapsByNameFromSubjec2","rmUsers","rmGroups","afterRemove","filter_","_ref7","has","concat_","changeGroupMembers","_ref10","membersToAdd","membersToRemove","requestsToAdd","command","parameters","requestsToRemove","requests","executeBatch","ShowCreateGroupModalButton","useDispatch","useCallback","allowCreate","Button","view","GroupsPageFilters","_React$Component","_inherits","_super","_createSuper","_classCallCheck","_createClass","key","_this$props","this","props","groupFilter","ErrorBoundary","Toolbar","itemsToWrap","Filter","hasClear","placeholder","onChange","setGroupsNameFilter","wrapperClassName","mapDispatchToProps","GROUPS_TABLE_DATA_FIELDS","connect","GroupEditorDialog","_this","_len","args","Array","_key","call","onSubmit","_asyncToGenerator","_regeneratorRuntime","_callee","form","initialGroupName","_form$getState","values","_values$members","membersComment","_extractChangedSubjec","_values$responsibles","responsibles","responsiblesComment","_extractChangedSubjec2","responsiblesToAdd","responsiblesToRemove","comment","_context","prev","next","extractChangedSubjects","added","removed","general","abrupt","saveGroupData","disableGroupsCache","stop","_x","closeGroupEditorModal","otherMembers","YTDFDialog","pristineSubmittable","headerProps","title","isNewGroup","onClose","onAdd","initialValues","String","prepareRoleListValue","fields","allowRename","required","caption","extras","updateGroup","groupData","_ref5","_ref6","_dispatch","groupNameChanged","_UIFactory$getAclApi2","_getGroupEditorSubjec","newMembers","newResponsibles","cluster","oldGroupname","newGroupName","_ref9","groupDiff","_x2","other_members","getGroupEditorIdmDataOtherMembers","_getGroupEditorRoles","DeleteGroupModal","_React$useState","_React$useState2","setError","remove","t0","_jsxs","Text","makeErrorFields","GroupActions","groupname","onEdit","allowDelete","ClickableAttributesButton","DeleteGroupButton","_useState","useState","_useState2","setVisible","TABLE_SETTINGS","displayIndices","stickyHead","DataTable","MOVING","stickyTop","STICKY_TOOLBAR_BOTTOM","syncHeadOnResize","dynamicRender","COLUMN_NAMES","actions","GroupsPageTable","onColumnSort","colName","nextOrder","setGroupsPageSorting","toggleExpand","toggleGroupExpand","col","sortable","_this$props$sort","isSorted","ColumnHeader","onSort","row","level","Math","min","Tooltip","content","toString","CommaSeparatedListWithRestCounter","items","itemRenderer","startsWith","SubjectCard","_this2","loaded","loading","columnProps","disableSorting","align","LEFT","toLowerCase","header","renderColumnHeader","columns","render","renderNameCell","bind","renderIdmCell","renderUsersCell","renderSizeCell","renderActionsCell","DataTableYT","settings","theme","_this$props2","showEditor","LoadDataHandler","errorData","renderTable","openAttributesModal","_getGroupsTableDataSt","getGroupsTableDataState","GroupsPage","WithStickyToolbar","toolbar"],"sourceRoot":""}
|