mirror of
				https://github.com/lxsang/antos-frontend.git
				synced 2025-10-31 18:35:44 +01:00 
			
		
		
		
	add tab bar
This commit is contained in:
		| @@ -5,7 +5,7 @@ class BaseModel | |||||||
|         @_gui = self.OS.GUI |         @_gui = self.OS.GUI | ||||||
|         me = @ |         me = @ | ||||||
|         @on "exit", () -> me.quit() |         @on "exit", () -> me.quit() | ||||||
|         @host = "#workingenv" |         @host = "#desktop" | ||||||
|         @dialog = undefined |         @dialog = undefined | ||||||
|  |  | ||||||
|     render: (p) -> |     render: (p) -> | ||||||
|   | |||||||
| @@ -221,16 +221,18 @@ self.OS.GUI = | |||||||
|                     it = desktop[0].get "selected" |                     it = desktop[0].get "selected" | ||||||
|                     _GUI.openWith it |                     _GUI.openWith it | ||||||
|  |  | ||||||
|                 ($ "#workingenv").on "click", (e) -> |                 #($ "#workingenv").on "click", (e) -> | ||||||
|                      desktop[0].set "selected", -1 |                 #     desktop[0].set "selected", -1 | ||||||
|  |  | ||||||
|                 desktop.on "click", (e) -> |                 desktop.on "click", (e) -> | ||||||
|  |                     return unless e.target is desktop[0] | ||||||
|  |                     desktop[0].set "selected", -1 | ||||||
|                     ($ "#sysdock").get(0).set "selectedApp", null |                     ($ "#sysdock").get(0).set "selectedApp", null | ||||||
|                     desktop[0].set "selected", -1 if e.target is desktop[0] |  | ||||||
|                     console.log "desktop clicked" |                     console.log "desktop clicked" | ||||||
|              |              | ||||||
|                 desktop[0].contextmenuHandler = (e, m) -> |                 desktop[0].contextmenuHandler = (e, m) -> | ||||||
|                     desktop[0].set "selected", -1 if e.target is desktop[0] |                     desktop[0].set "selected", -1 if e.target is desktop[0] | ||||||
|  |                     ($ "#sysdock").get(0).set "selectedApp", null | ||||||
|                     console.log "context menu handler for desktop" |                     console.log "context menu handler for desktop" | ||||||
|                  |                  | ||||||
|                 desktop[0].fetch() |                 desktop[0].fetch() | ||||||
| @@ -264,8 +266,9 @@ self.OS.GUI = | |||||||
|         _OS.setting.appearance = conf.appearance if conf.appearance |         _OS.setting.appearance = conf.appearance if conf.appearance | ||||||
|         _OS.setting.user = conf.user |         _OS.setting.user = conf.user | ||||||
|         _OS.setting.desktop.path = "home:///.desktop" unless _OS.setting.desktop.path |         _OS.setting.desktop.path = "home:///.desktop" unless _OS.setting.desktop.path | ||||||
|  |         _OS.setting.appearance.theme = "antos" unless _OS.setting.appearance.theme | ||||||
|         # load theme |         # load theme | ||||||
|         _GUI.loadTheme "antos" |         _GUI.loadTheme _OS.setting.appearance.theme | ||||||
|         # initDM |         # initDM | ||||||
|         _GUI.initDM() |         _GUI.initDM() | ||||||
|         _courrier.observable.one "syspanelloaded", () -> |         _courrier.observable.one "syspanelloaded", () -> | ||||||
| @@ -276,5 +279,5 @@ self.OS.GUI = | |||||||
|  |  | ||||||
|         # startup application here |         # startup application here | ||||||
|         _courrier.observable.one "desktoploaded", () -> |         _courrier.observable.one "desktoploaded", () -> | ||||||
|             _GUI.launch "Files" |             _GUI.launch "DummyApp" | ||||||
|             _GUI.launch "NotePad" |             #_GUI.launch "NotePad" | ||||||
| @@ -4,6 +4,6 @@ | |||||||
| <div id = "workspace"> | <div id = "workspace"> | ||||||
|     <afx-apps-dock id="sysdock"></afx-apps-dock> |     <afx-apps-dock id="sysdock"></afx-apps-dock> | ||||||
|     <afx-float-list id = "desktop" ></afx-float-list> |     <afx-float-list id = "desktop" ></afx-float-list> | ||||||
|     <div id = "workingenv"></div> |     <!--div id = "workingenv"></div--> | ||||||
| </div> | </div> | ||||||
| <afx-menu id="contextmenu" context="true" style="display:none;"></afx-menu> | <afx-menu id="contextmenu" context="true" style="display:none;"></afx-menu> | ||||||
|   | |||||||
| @@ -27,6 +27,9 @@ | |||||||
|         this.root.observable = opts.observable || riot.observable() |         this.root.observable = opts.observable || riot.observable() | ||||||
|         if(!window._zindex) window._zindex = 10 |         if(!window._zindex) window._zindex = 10 | ||||||
|         this.shown = false |         this.shown = false | ||||||
|  |  | ||||||
|  |         self.root.contextmenuHandler = function (e) {} | ||||||
|  |  | ||||||
|         self.root.set = function(k,v) |         self.root.set = function(k,v) | ||||||
|         { |         { | ||||||
|             if(k == "*") |             if(k == "*") | ||||||
|   | |||||||
| @@ -17,7 +17,8 @@ | |||||||
|                 {  |                 {  | ||||||
|                     for(var i in self.items) |                     for(var i in self.items) | ||||||
|                         self.items[i].app.blur() |                         self.items[i].app.blur() | ||||||
|                     //v.show() |                     if(v) | ||||||
|  |                         $("#desktop")[0].set("selected", -1) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             self.update() |             self.update() | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| <afx-float-list ref = "container"> | <afx-float-list ref = "container"> | ||||||
|     <div each={item,i in items } class={float_list_item:true, float_list_item_selected: parent._autoselect(item,i)} ondblclick = {parent._dbclick}  onmousedown = {parent._select} oncontextmenu = {parent._select}> |     <div ref = "list"> | ||||||
|         <afx-label color = {item.color} iconclass = {item.iconclass} icon = {item.icon} text = {item.text}></afx-label> |         <div each={item,i in items } class={float_list_item:true, float_list_item_selected: parent._autoselect(item,i)} ondblclick = {parent._dbclick}  onmousedown = {parent._select} oncontextmenu = {parent._select}> | ||||||
|  |             <afx-label color = {item.color} iconclass = {item.iconclass} icon = {item.icon} text = {item.text}></afx-label> | ||||||
|  |         </div> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     <script> |     <script> | ||||||
|         this.items = opts.items || [] |         this.items = opts.items || [] | ||||||
|         var self = this |         var self = this | ||||||
| @@ -82,7 +83,7 @@ | |||||||
|             var cleft = 20 |             var cleft = 20 | ||||||
|             var gw = $(self.refs.container).width() |             var gw = $(self.refs.container).width() | ||||||
|             var gh = $(self.refs.container).height() |             var gh = $(self.refs.container).height() | ||||||
|             $(self.refs.container) |             $(self.refs.list) | ||||||
|             .children() |             .children() | ||||||
|             .each(function(e) |             .each(function(e) | ||||||
|             { |             { | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ | |||||||
|         self.selidx = -1 |         self.selidx = -1 | ||||||
|         self.onlistselect = opts.onlistselect |         self.onlistselect = opts.onlistselect | ||||||
|         self.onlistdbclick = opts.onlistdbclick |         self.onlistdbclick = opts.onlistdbclick | ||||||
|  |         self.onitemclose = opts.onitemclose | ||||||
|         var onclose = false |         var onclose = false | ||||||
|         this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1 |         this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1 | ||||||
|         self.root.set = function(k,v) |         self.root.set = function(k,v) | ||||||
| @@ -39,6 +40,8 @@ | |||||||
|                     return self.items[self.selidx] |                     return self.items[self.selidx] | ||||||
|                 else |                 else | ||||||
|                     return undefined |                     return undefined | ||||||
|  |             else if(k == "count") | ||||||
|  |                 return self.items.length | ||||||
|             return self[k] |             return self[k] | ||||||
|         } |         } | ||||||
|         self.root.push = function(e,u) |         self.root.push = function(e,u) | ||||||
| @@ -73,6 +76,7 @@ | |||||||
|         { |         { | ||||||
|             this.root.observable = riot.observable() |             this.root.observable = riot.observable() | ||||||
|         } |         } | ||||||
|  |          | ||||||
|         this.on("mount", function(){ |         this.on("mount", function(){ | ||||||
|             if(opts.dropdown == "true") |             if(opts.dropdown == "true") | ||||||
|             { |             { | ||||||
| @@ -108,7 +112,11 @@ | |||||||
|         } |         } | ||||||
|         _remove(event) |         _remove(event) | ||||||
|         { |         { | ||||||
|             self.root.remove(event.item.item, true) |             r = true | ||||||
|  |             if(self.onitemclose) | ||||||
|  |                 r = self.onitemclose(event) | ||||||
|  |             if(r) | ||||||
|  |                 self.root.remove(event.item.item, true) | ||||||
|         } |         } | ||||||
|         _autoselect(it,i) |         _autoselect(it,i) | ||||||
|         { |         { | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								src/core/tags/afx-tab-container.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/core/tags/afx-tab-container.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | <afx-tab-container> | ||||||
|  |     <afx-list-view   ref = "list" /> | ||||||
|  |     <script> | ||||||
|  |         var self = this | ||||||
|  |         this.closable = opts.closable || false | ||||||
|  |         self.root.observable = opts.observable || riot.observable() | ||||||
|  |         get_observable(){ | ||||||
|  |             return self.root.observable | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         self.root.get = function (k) { | ||||||
|  |             return self.refs.list.root.get(k) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         self.on("mount", function(){ | ||||||
|  |             self.refs.list.root.observable = self.root.observable | ||||||
|  |             /*self.root.observable.on("listselect", function(){ | ||||||
|  |                 console.log("list select") | ||||||
|  |             })*/ | ||||||
|  |             self.refs.list.root.set ("onlistselect",function (e) { | ||||||
|  |                 self.root.observable.trigger("tabselect", e) | ||||||
|  |             }) | ||||||
|  |         }) | ||||||
|  |  | ||||||
|  |         self.root.set = function (k,v){ | ||||||
|  |             if( k == "*") | ||||||
|  |                 for(var i in v) | ||||||
|  |                     self.refs.list.root.set(i,v[i]) | ||||||
|  |             else if(k == "closable") | ||||||
|  |             { | ||||||
|  |                 self.closable = v | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 if(k == "items") | ||||||
|  |                 { | ||||||
|  |                     for(var i in v) | ||||||
|  |                         v[i].closable = self.closable | ||||||
|  |                 } | ||||||
|  |                 self.refs.list.root.set(k,v) | ||||||
|  |             } | ||||||
|  |             //self.update() | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         self.root.push = function(e,u) | ||||||
|  |         { | ||||||
|  |             e.closable = self.closable | ||||||
|  |             self.refs.list.root.push(e,u) | ||||||
|  |         } | ||||||
|  |         self.root.unshift = function(e,u) | ||||||
|  |         { | ||||||
|  |             self.refs.list.root.unshift(e,u) | ||||||
|  |         } | ||||||
|  |         self.root.remove = function(e,u) | ||||||
|  |         { | ||||||
|  |             self.refs.list.root.remove(e,u) | ||||||
|  |         } | ||||||
|  |     </script> | ||||||
|  | </afx-tab-container> | ||||||
| @@ -15,7 +15,15 @@ String.prototype.asFileHandler = () -> | |||||||
| this.OS.API.VFS = {} | this.OS.API.VFS = {} | ||||||
|  |  | ||||||
| class BasicFileHandler | class BasicFileHandler | ||||||
|     constructor: (@path) -> |     constructor: (path) -> | ||||||
|  |         @setPath path | ||||||
|  |  | ||||||
|  |     setPath: (p) -> | ||||||
|  |         @ready = false | ||||||
|  |         @dirty = false | ||||||
|  |         @cache = undefined | ||||||
|  |         return unless p | ||||||
|  |         @path = p | ||||||
|         list = @path.split ":///" |         list = @path.split ":///" | ||||||
|         @protocol = list[0] |         @protocol = list[0] | ||||||
|         return unless list.length > 1 |         return unless list.length > 1 | ||||||
| @@ -24,8 +32,6 @@ class BasicFileHandler | |||||||
|         @genealogy = re.split("/") |         @genealogy = re.split("/") | ||||||
|         @basename = @genealogy[@genealogy.length - 1] unless @isRoot() |         @basename = @genealogy[@genealogy.length - 1] unless @isRoot() | ||||||
|         @ext = @basename.split( "." ).pop() unless @basename.lastIndexOf(".") is 0 or @basename.indexOf( "." ) is -1 |         @ext = @basename.split( "." ).pop() unless @basename.lastIndexOf(".") is 0 or @basename.indexOf( "." ) is -1 | ||||||
|         @ready = false |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     isRoot: () -> (not @genealogy) or (@genealogy.size is 0) |     isRoot: () -> (not @genealogy) or (@genealogy.size is 0) | ||||||
|      |      | ||||||
| @@ -33,7 +39,9 @@ class BasicFileHandler | |||||||
|         return false if not @basename |         return false if not @basename | ||||||
|         @basename[0] is "." |         @basename[0] is "." | ||||||
|  |  | ||||||
|     hash: () -> @path.hash() |     hash: () ->  | ||||||
|  |         return -1 unless @path | ||||||
|  |         return @path.hash() | ||||||
|  |  | ||||||
|     parent: () -> |     parent: () -> | ||||||
|         return @ if @isRoot() |         return @ if @isRoot() | ||||||
|   | |||||||
| @@ -76,10 +76,17 @@ class DummyApp extends this.OS.GUI.BaseApplication | |||||||
|             {text:"some thing"}, |             {text:"some thing"}, | ||||||
|             {text:"some thing"} |             {text:"some thing"} | ||||||
|         ] |         ] | ||||||
|         list.set "items",ldata |         #list.set "items",ldata | ||||||
|         list.set "onlistselect", (e)-> |         list.set "onlistselect", (e)-> | ||||||
|             console.log e |             console.log e | ||||||
|  |  | ||||||
|  |         tabs = @find "mytabs" | ||||||
|  |         tabdatas = [ | ||||||
|  |             {text:"file1.txt"}, | ||||||
|  |             {text:"file2.cpp"} | ||||||
|  |         ] | ||||||
|  |         tabs.set "items", tabdatas  | ||||||
|  |  | ||||||
|         @scheme.set "apptitle", "AntOS feature showcase" |         @scheme.set "apptitle", "AntOS feature showcase" | ||||||
|  |  | ||||||
|         @scheme.contextmenuHandler = (e, m) -> |         @scheme.contextmenuHandler = (e, m) -> | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| <afx-app-window apptitle="Preview" width="650" height="500"> | <afx-app-window apptitle="Preview" width="650" height="500"> | ||||||
|     <afx-vbox> |     <afx-vbox> | ||||||
|  |         <afx-tab-container data-id="mytabs" closable = true></afx-tab-container> | ||||||
|         <afx-tree-view data-id="mytree"> </afx-tree-view> |         <afx-tree-view data-id="mytree"> </afx-tree-view> | ||||||
|         <afx-hbox> |         <afx-hbox> | ||||||
|             <afx-button data-height="30" text="Read more" iconclass="fa fa-camera-retro fa-lg" id="button"></afx-button> |             <afx-button data-height="30" text="Read more" iconclass="fa fa-camera-retro fa-lg" id="button"></afx-button> | ||||||
|   | |||||||
| @@ -48,7 +48,10 @@ class Files extends this.OS.GUI.BaseApplication | |||||||
|         @setting.nav = true if @setting.nav is undefined |         @setting.nav = true if @setting.nav is undefined | ||||||
|         @setting.showhidden = false if @setting.showhidden is undefined |         @setting.showhidden = false if @setting.showhidden is undefined | ||||||
|          |          | ||||||
|         @favo.set "items", $.extend true, {}, @setting.favorite |         el.selected = false for el, i in @setting.favorite | ||||||
|  |  | ||||||
|  |         @favo.set "items", @setting.favorite | ||||||
|  |         #@favo.set "selected", -1 | ||||||
|         @applySetting() |         @applySetting() | ||||||
|         @chdir null |         @chdir null | ||||||
|  |  | ||||||
|   | |||||||
| @@ -70,14 +70,28 @@ class NotePad extends this.OS.GUI.BaseApplication | |||||||
|             { text: "Desktop", path: 'home:///.desktop', iconclass: "fa fa-desktop" }, |             { text: "Desktop", path: 'home:///.desktop', iconclass: "fa fa-desktop" }, | ||||||
|         ] |         ] | ||||||
|  |  | ||||||
|         @open @currfile if @currfile |         @tabarea = @find "tabarea" | ||||||
|  |         #@tabarea.set "closable", true | ||||||
|  |         @open @currfile | ||||||
|      |      | ||||||
|     open: (file) -> |     open: (file) -> | ||||||
|  |         #find table | ||||||
|  |         @newtab "undefined".asFileHandler() unless file | ||||||
|  |         return @newtab "undefined".asFileHandler() unless file | ||||||
|         me = @ |         me = @ | ||||||
|         file.read (d) -> |         file.read (d) -> | ||||||
|             return unless d |             return unless d | ||||||
|             me.scheme.set "apptitle", file.basename |             me.scheme.set "apptitle", file.basename | ||||||
|             me.editor.setValue d, -1 |             file.cache = d | ||||||
|  |             me.newtab file | ||||||
|  |  | ||||||
|  |     newtab: (file) -> | ||||||
|  |         file.text = if file.basename then file.basename else "undefined" | ||||||
|  |         file.cache = "" unless file.cache | ||||||
|  |         cnt = @tabarea.get "count" | ||||||
|  |         @tabarea.push file, true | ||||||
|  |         @tabarea.set "selected", cnt | ||||||
|  |         @editor.setValue file.cache, -1 | ||||||
|  |  | ||||||
|     chdir: (p) -> |     chdir: (p) -> | ||||||
|         me = @ |         me = @ | ||||||
|   | |||||||
| @@ -17,3 +17,25 @@ afx-app-window[data-id="notepad"] afx-vbox[data-id="bottom-vbox"]{ | |||||||
| afx-app-window[data-id="notepad"] .afx-window-content { | afx-app-window[data-id="notepad"] .afx-window-content { | ||||||
|     background-color: #f6F6F6; |     background-color: #f6F6F6; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | afx-tab-container[data-id="tabarea"] afx-list-view li { | ||||||
|  |     background-color: #dfdfdf; | ||||||
|  |     color:#272822; | ||||||
|  |     border: 0; | ||||||
|  |     border-top: 1px solid #a6a6a6; | ||||||
|  |     border-right: 1px solid #a6a6a6; | ||||||
|  |     border-radius: 0; | ||||||
|  | } | ||||||
|  | afx-tab-container[data-id="tabarea"] afx-list-view{ | ||||||
|  |     padding:0; | ||||||
|  |     margin: 0; | ||||||
|  |     border-left: 1px solid #a6a6a6; | ||||||
|  |     border-bottom: 1px solid #a6a6a6; | ||||||
|  | } | ||||||
|  | /*afx-tab-container[data-id="tabarea"] afx-list-view i.closable:before{ | ||||||
|  |     color: white; | ||||||
|  | }*/ | ||||||
|  | afx-tab-container[data-id="tabarea"] afx-list-view li.selected { | ||||||
|  |     background-color: #f6F6F6; | ||||||
|  |     border-radius: 0; | ||||||
|  | } | ||||||
| @@ -5,6 +5,7 @@ | |||||||
|             <afx-file-view data-id = "fileview" view='tree' status = false></afx-file-view> |             <afx-file-view data-id = "fileview" view='tree' status = false></afx-file-view> | ||||||
|         </afx-hbox> |         </afx-hbox> | ||||||
|         <afx-hbox> |         <afx-hbox> | ||||||
|  |             <afx-tab-container data-id="tabarea" data-height="26" closable = true></afx-tab-container> | ||||||
|             <div data-id="datarea"></div> |             <div data-id="datarea"></div> | ||||||
|             <afx-vbox data-height="30" data-id="bottom-vbox"> |             <afx-vbox data-height="30" data-id="bottom-vbox"> | ||||||
|                 <div ><span data-id = "editorstat"></span></div> |                 <div ><span data-id = "editorstat"></span></div> | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								src/themes/antos/afx-tab-container.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/themes/antos/afx-tab-container.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | afx-tab-container { | ||||||
|  |     display: block; | ||||||
|  |     width: 100%; | ||||||
|  |      | ||||||
|  | } | ||||||
|  | afx-tab-container afx-list-view { | ||||||
|  |     padding:0; | ||||||
|  |     margin:0; | ||||||
|  | } | ||||||
|  | afx-tab-container afx-list-view li{ | ||||||
|  |     float:left; | ||||||
|  |     border-top-left-radius: 5px; | ||||||
|  |     border-top-right-radius: 5px; | ||||||
|  |     padding-bottom: 2px; | ||||||
|  |     padding-top:2px; | ||||||
|  |     border:1px solid #c3c3c3; | ||||||
|  | } | ||||||
| @@ -42,7 +42,7 @@ html,body{ | |||||||
|     cursor: default; |     cursor: default; | ||||||
|     padding:0px; |     padding:0px; | ||||||
| } | } | ||||||
| #desktop > div.float_list_item { | #desktop > div > .float_list_item { | ||||||
|     display:block; |     display:block; | ||||||
|     background-color:transparent; |     background-color:transparent; | ||||||
|     text-align: center; |     text-align: center; | ||||||
| @@ -51,7 +51,7 @@ html,body{ | |||||||
|     padding:3px; |     padding:3px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #desktop > div.float_list_item_selected { | #desktop > div > div.float_list_item_selected { | ||||||
|     display:block; |     display:block; | ||||||
|     background-color: #116cd6; |     background-color: #116cd6; | ||||||
|     color:white; |     color:white; | ||||||
| @@ -62,7 +62,7 @@ html,body{ | |||||||
|     padding:3px; |     padding:3px; | ||||||
| } | } | ||||||
|  |  | ||||||
| #desktop > div.float_list_item i.file:before{ | #desktop > div > div.float_list_item i.file:before{ | ||||||
|     content: "\f15b\a";  |     content: "\f15b\a";  | ||||||
|     font-family: "FontAwesome"; |     font-family: "FontAwesome"; | ||||||
|     font-size: 32px; |     font-size: 32px; | ||||||
| @@ -71,11 +71,11 @@ html,body{ | |||||||
|     font-style: normal; |     font-style: normal; | ||||||
|     font-weight: normal; |     font-weight: normal; | ||||||
| } | } | ||||||
| #desktop > div.float_list_item span{ | #desktop > div >  div.float_list_item span{ | ||||||
|     width: 100%; |     width: 100%; | ||||||
|     word-wrap: break-word; |     word-wrap: break-word; | ||||||
| } | } | ||||||
| #desktop > div.float_list_item i.dir:before{ | #desktop > div >  div.float_list_item i.dir:before{ | ||||||
|     display: block; |     display: block; | ||||||
|     content: "\f07b\a";  |     content: "\f07b\a";  | ||||||
|     font-family: "FontAwesome"; |     font-family: "FontAwesome"; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user