Compare commits
	
		
			3 Commits
		
	
	
		
			4f45e213c3
			...
			e435ef6be0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e435ef6be0 | |||
| 90528e61e5 | |||
| d02aa4abe0 | 
@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					ALTER TABLE `maps`
 | 
				
			||||||
 | 
					  ADD `unlisted` TINYINT(1) NOT NULL DEFAULT 0;
 | 
				
			||||||
@ -241,7 +241,7 @@ button.green:enabled:hover, button.green:enabled:focus, a.button.green:hover, a.
 | 
				
			|||||||
    background-color: #1b7d31;
 | 
					    background-color: #1b7d31;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input, select, textarea {
 | 
					input[type=text], select, textarea {
 | 
				
			||||||
    background-color: #f9fafb;
 | 
					    background-color: #f9fafb;
 | 
				
			||||||
    border: solid #c8d2e1 1px;
 | 
					    border: solid #c8d2e1 1px;
 | 
				
			||||||
    border-radius: 2px;
 | 
					    border-radius: 2px;
 | 
				
			||||||
@ -250,22 +250,26 @@ input, select, textarea {
 | 
				
			|||||||
    font-weight: 300;
 | 
					    font-weight: 300;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input, select {
 | 
					input[type=text], select {
 | 
				
			||||||
    height: 30px;
 | 
					    height: 30px;
 | 
				
			||||||
    line-height: 30px;
 | 
					    line-height: 30px;
 | 
				
			||||||
    padding: 0 5px;
 | 
					    padding: 0 5px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input[type=checkbox], input[type=radio] {
 | 
				
			||||||
 | 
					    margin-right: 0.5em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
textarea {
 | 
					textarea {
 | 
				
			||||||
    padding: 5px;
 | 
					    padding: 5px;
 | 
				
			||||||
    resize: none;
 | 
					    resize: none;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input.big, select.big, textarea.big, div.inputWithButton>input {
 | 
					input[type=text].big, select.big, textarea.big, div.inputWithButton>input[type=text] {
 | 
				
			||||||
    font-size: 18px;
 | 
					    font-size: 18px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input.big, select.big, div.inputWithButton>input {
 | 
					input[type=text].big, select.big, div.inputWithButton>input[type=text] {
 | 
				
			||||||
    height: 35px;
 | 
					    height: 35px;
 | 
				
			||||||
    line-height: 35px;
 | 
					    line-height: 35px;
 | 
				
			||||||
    padding: 0 6px;
 | 
					    padding: 0 6px;
 | 
				
			||||||
@ -280,19 +284,19 @@ input.fullWidth, select.fullWidth, textarea.fullWidth {
 | 
				
			|||||||
    width: 100%;
 | 
					    width: 100%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input:disabled, select:disabled, textarea:disabled {
 | 
					input[type=text]:disabled, select:disabled, textarea:disabled {
 | 
				
			||||||
    background-color: #dfdfdf;
 | 
					    background-color: #dfdfdf;
 | 
				
			||||||
    border: solid #dfdfdf 1px;
 | 
					    border: solid #dfdfdf 1px;
 | 
				
			||||||
    color: #000000;
 | 
					    color: #000000;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input:focus, select:focus, textarea:focus {
 | 
					input[type=text]:focus, select:focus, textarea:focus {
 | 
				
			||||||
    background-color: #ffffff;
 | 
					    background-color: #ffffff;
 | 
				
			||||||
    border: solid #29457f 2px;
 | 
					    border: solid #29457f 2px;
 | 
				
			||||||
    outline: none;
 | 
					    outline: none;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input:focus, select:focus {
 | 
					input[type=text]:focus, select:focus {
 | 
				
			||||||
    padding: 0 4px;
 | 
					    padding: 0 4px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -300,16 +304,16 @@ textarea:focus {
 | 
				
			|||||||
    padding: 4px;
 | 
					    padding: 4px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input.big:focus, select.big:focus {
 | 
					input[type=text].big:focus, select.big:focus {
 | 
				
			||||||
    padding: 0 5px;
 | 
					    padding: 0 5px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
div.inputWithButton>input {
 | 
					div.inputWithButton>input[type=text] {
 | 
				
			||||||
    width: 100%;
 | 
					    width: 100%;
 | 
				
			||||||
    padding: 0 83px 0 6px;
 | 
					    padding: 0 83px 0 6px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
div.inputWithButton>input:focus {
 | 
					div.inputWithButton>input[type=text]:focus {
 | 
				
			||||||
    padding: 0 82px 0 5px;
 | 
					    padding: 0 82px 0 5px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -13,6 +13,10 @@ div.mapItem.new {
 | 
				
			|||||||
    align-items: center;
 | 
					    align-items: center;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div.mapItem.unlisted {
 | 
				
			||||||
 | 
					    opacity: 0.6;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
div.mapItem>div.title {
 | 
					div.mapItem>div.title {
 | 
				
			||||||
    background-color: #28a745;
 | 
					    background-color: #28a745;
 | 
				
			||||||
    color: white;
 | 
					    color: white;
 | 
				
			||||||
@ -75,19 +79,8 @@ div.mapItem>div.buttonContainer {
 | 
				
			|||||||
    grid-auto-flow: column;
 | 
					    grid-auto-flow: column;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#restrictions input {
 | 
					 | 
				
			||||||
    height: auto;
 | 
					 | 
				
			||||||
    margin: 0.5em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#restrictions input[type=range] {
 | 
					 | 
				
			||||||
    height: 1.5em;
 | 
					 | 
				
			||||||
    margin-left: 2em;
 | 
					 | 
				
			||||||
    width: 70%;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#timeLimitType {
 | 
					#timeLimitType {
 | 
				
			||||||
    margin-left: 2em;
 | 
					    margin-left: 1.5em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media screen and (min-width: 1504px) {
 | 
					@media screen and (min-width: 1504px) {
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            MapEditor.metadata.name = form.elements.name.value;
 | 
					            MapEditor.metadata.name = form.elements.name.value;
 | 
				
			||||||
            MapEditor.metadata.description = form.elements.description.value;
 | 
					            MapEditor.metadata.description = form.elements.description.value;
 | 
				
			||||||
 | 
					            MapEditor.metadata.unlisted = form.elements.unlisted.checked;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            document.getElementById('mapName').innerHTML = form.elements.name.value ? form.elements.name.value : '[unnamed map]';
 | 
					            document.getElementById('mapName').innerHTML = form.elements.name.value ? form.elements.name.value : '[unnamed map]';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -254,6 +255,9 @@
 | 
				
			|||||||
            if (MapEditor.metadata.description !== null) {
 | 
					            if (MapEditor.metadata.description !== null) {
 | 
				
			||||||
                data.append('description', MapEditor.metadata.description);
 | 
					                data.append('description', MapEditor.metadata.description);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (MapEditor.metadata.unlisted !== null) {
 | 
				
			||||||
 | 
					                data.append('unlisted', MapEditor.metadata.unlisted);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (var placeId in MapEditor.added) {
 | 
					            for (var placeId in MapEditor.added) {
 | 
				
			||||||
                if (!MapEditor.added.hasOwnProperty(placeId)) {
 | 
					                if (!MapEditor.added.hasOwnProperty(placeId)) {
 | 
				
			||||||
 | 
				
			|||||||
@ -81,6 +81,7 @@ class MapAdminController implements ISecured
 | 
				
			|||||||
            'mapId' => $mapId,
 | 
					            'mapId' => $mapId,
 | 
				
			||||||
            'mapName' => $map->getName(),
 | 
					            'mapName' => $map->getName(),
 | 
				
			||||||
            'mapDescription' => str_replace('<br>', "\n", $map->getDescription()),
 | 
					            'mapDescription' => str_replace('<br>', "\n", $map->getDescription()),
 | 
				
			||||||
 | 
					            'mapUnlisted' => $map->getUnlisted(),
 | 
				
			||||||
            'bounds' => $map->getBounds()->toArray(),
 | 
					            'bounds' => $map->getBounds()->toArray(),
 | 
				
			||||||
            'places' => &$places
 | 
					            'places' => &$places
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
@ -175,6 +176,9 @@ class MapAdminController implements ISecured
 | 
				
			|||||||
        if (isset($_POST['description'])) {
 | 
					        if (isset($_POST['description'])) {
 | 
				
			||||||
            $map->setDescription(str_replace(["\n", "\r\n"], '<br>', $_POST['description']));
 | 
					            $map->setDescription(str_replace(["\n", "\r\n"], '<br>', $_POST['description']));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (isset($_POST['unlisted'])) {
 | 
				
			||||||
 | 
					            $map->setUnlisted((bool)$_POST['unlisted']);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->pdm->saveToDb($map);
 | 
					        $this->pdm->saveToDb($map);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -30,12 +30,19 @@ class MapsController
 | 
				
			|||||||
            ['maps', 'bound_north_lat'],
 | 
					            ['maps', 'bound_north_lat'],
 | 
				
			||||||
            ['maps', 'bound_east_lng'],
 | 
					            ['maps', 'bound_east_lng'],
 | 
				
			||||||
            ['maps', 'area'],
 | 
					            ['maps', 'area'],
 | 
				
			||||||
 | 
					            ['maps', 'unlisted'],
 | 
				
			||||||
            new RawExpression('COUNT(places.id) AS num_places')
 | 
					            new RawExpression('COUNT(places.id) AS num_places')
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
        $select->leftJoin('places', ['places', 'map_id'], '=', ['maps', 'id']);
 | 
					        $select->leftJoin('places', ['places', 'map_id'], '=', ['maps', 'id']);
 | 
				
			||||||
        $select->groupBy(['maps', 'id']);
 | 
					        $select->groupBy(['maps', 'id']);
 | 
				
			||||||
        $select->orderBy('name');
 | 
					        $select->orderBy('name');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $user = $this->request->user();
 | 
				
			||||||
 | 
					        $isAdmin = $user !== null && $user->hasPermission(IUser::PERMISSION_ADMIN);
 | 
				
			||||||
 | 
					        if (!$isAdmin) {
 | 
				
			||||||
 | 
					            $select->where(['maps', 'unlisted'], '=', false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $result = $select->execute();
 | 
					        $result = $select->execute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $maps = [];
 | 
					        $maps = [];
 | 
				
			||||||
@ -45,11 +52,10 @@ class MapsController
 | 
				
			|||||||
            $maps[] = $map;
 | 
					            $maps[] = $map;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $user = $this->request->user();
 | 
					 | 
				
			||||||
        return new HtmlContent('maps', [
 | 
					        return new HtmlContent('maps', [
 | 
				
			||||||
            'maps' => $maps,
 | 
					            'maps' => $maps,
 | 
				
			||||||
            'isLoggedIn' => $user !== null,
 | 
					            'isLoggedIn' => $user !== null,
 | 
				
			||||||
            'isAdmin' => $user !== null && $user->hasPermission(IUser::PERMISSION_ADMIN)
 | 
					            'isAdmin' => $isAdmin
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@ class Map extends Model
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    protected static string $table = 'maps';
 | 
					    protected static string $table = 'maps';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected static array $fields = ['name', 'description', 'bound_south_lat', 'bound_west_lng', 'bound_north_lat', 'bound_east_lng', 'area'];
 | 
					    protected static array $fields = ['name', 'description', 'bound_south_lat', 'bound_west_lng', 'bound_north_lat', 'bound_east_lng', 'area', 'unlisted'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private string $name = '';
 | 
					    private string $name = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,6 +16,8 @@ class Map extends Model
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private float $area = 0.0;
 | 
					    private float $area = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private bool $unlisted = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function __construct()
 | 
					    public function __construct()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->bounds = Bounds::createDirectly(-90.0, -180.0, 90.0, 180.0);
 | 
					        $this->bounds = Bounds::createDirectly(-90.0, -180.0, 90.0, 180.0);
 | 
				
			||||||
@ -61,6 +63,11 @@ class Map extends Model
 | 
				
			|||||||
        $this->area = $area;
 | 
					        $this->area = $area;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUnlisted(bool $unlisted): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->unlisted = $unlisted;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function getName(): string
 | 
					    public function getName(): string
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return $this->name;
 | 
					        return $this->name;
 | 
				
			||||||
@ -100,4 +107,9 @@ class Map extends Model
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return $this->area;
 | 
					        return $this->area;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getUnlisted(): bool
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $this->unlisted;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -54,6 +54,9 @@
 | 
				
			|||||||
    <form id="metadataForm" class="marginTop" data-no-submit="true">
 | 
					    <form id="metadataForm" class="marginTop" data-no-submit="true">
 | 
				
			||||||
        <input class="fullWidth" type="text" name="name" value="<?= $mapName ?>" placeholder="Name of the map">
 | 
					        <input class="fullWidth" type="text" name="name" value="<?= $mapName ?>" placeholder="Name of the map">
 | 
				
			||||||
        <textarea  class="fullWidth marginTop" name="description" rows="4" placeholder="Description of the map"><?= $mapDescription ?></textarea>
 | 
					        <textarea  class="fullWidth marginTop" name="description" rows="4" placeholder="Description of the map"><?= $mapDescription ?></textarea>
 | 
				
			||||||
 | 
					        <div class="marginTop">
 | 
				
			||||||
 | 
					            <input type="checkbox" id="unlisted" name="unlisted" <?= $mapUnlisted ? 'checked' : '' ?>><label for="unlisted">Unlisted</label>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
        <div class="right">
 | 
					        <div class="right">
 | 
				
			||||||
            <button class="marginTop marginRight" type="submit">Apply</button><!--
 | 
					            <button class="marginTop marginRight" type="submit">Apply</button><!--
 | 
				
			||||||
         --><button id="closeMetadataButton" class="gray marginTop" type="button">Close</button>
 | 
					         --><button id="closeMetadataButton" class="gray marginTop" type="button">Close</button>
 | 
				
			||||||
 | 
				
			|||||||
@ -42,36 +42,25 @@ TODO: condition!
 | 
				
			|||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <p class="bold center marginTop marginBottom">OR</p>
 | 
					        <p class="bold center marginTop marginBottom">OR</p>
 | 
				
			||||||
        -->
 | 
					        -->
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        <div id="restrictions" class="marginTop marginBottom">
 | 
					        <div id="restrictions" class="marginTop marginBottom">
 | 
				
			||||||
            <h3>Optional restrictions</h3>
 | 
					            <h3>Optional restrictions</h3>
 | 
				
			||||||
            <div>
 | 
					            <div class="marginTop">
 | 
				
			||||||
                <div>
 | 
					                <input type="checkbox" id="timerEnabled" name="timerEnabled" value="timerEnabled" /><label id="timeLimitLabel" for="timerEnabled">Time limit measured in seconds</label>
 | 
				
			||||||
                    <input type="checkbox" id="timerEnabled" name="timerEnabled" value="timerEnabled" />
 | 
					 | 
				
			||||||
                    <label id="timeLimitLabel" for="timerEnabled">Time limit measured in seconds</label>
 | 
					 | 
				
			||||||
                </div>
 | 
					 | 
				
			||||||
                <div>
 | 
					 | 
				
			||||||
                    <input type="range" id="timeLimit" name="timeLimit" min="10" max="1800" step="10" value="300" />
 | 
					 | 
				
			||||||
                </div>
 | 
					 | 
				
			||||||
                <div id="timeLimitType">
 | 
					 | 
				
			||||||
                    <label>Time limit</label>
 | 
					 | 
				
			||||||
                    <input type="radio" id="timeLimitTypeGame" name="timeLimitType" value="game" checked />
 | 
					 | 
				
			||||||
                    <label for="timeLimitTypeGame">for the whole game</label>
 | 
					 | 
				
			||||||
                    <input type="radio" id="timeLimitTypeRound" name="timeLimitType" value="round" />
 | 
					 | 
				
			||||||
                    <label for="timeLimitTypeRound">per round</label>
 | 
					 | 
				
			||||||
                </div>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div>
 | 
					            <div id="timeLimitType">
 | 
				
			||||||
                <input type="checkbox" id="noMove" name="noMove" value="noMove" />
 | 
					                <input class="fullWidth" type="range" id="timeLimit" name="timeLimit" min="10" max="1800" step="10" value="300" />
 | 
				
			||||||
                <label for="noMove">No movement allowed</label>
 | 
					                <input type="radio" id="timeLimitTypeGame" name="timeLimitType" value="game" checked /><label for="timeLimitTypeGame">for the whole game</label>
 | 
				
			||||||
 | 
					                <input class="marginLeft" type="radio" id="timeLimitTypeRound" name="timeLimitType" value="round" /><label for="timeLimitTypeRound">per round</label>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div>
 | 
					            <div class="marginTop">
 | 
				
			||||||
                <input type="checkbox" id="noZoom" name="noZoom" value="noZoom" />
 | 
					                <input type="checkbox" id="noMove" name="noMove" value="noMove" /><label for="noMove">No movement allowed</label>
 | 
				
			||||||
                <label for="noZoom">No zoom allowed</label>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div>
 | 
					            <div class="marginTop">
 | 
				
			||||||
                <input type="checkbox" id="noPan" name="noPan" value="noPan" />
 | 
					                <input type="checkbox" id="noZoom" name="noZoom" value="noZoom" /><label for="noZoom">No zoom allowed</label>
 | 
				
			||||||
                <label for="noPan">No camera change allowed</label>
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div class="marginTop">
 | 
				
			||||||
 | 
					                <input type="checkbox" id="noPan" name="noPan" value="noPan" /><label for="noPan">No camera change allowed</label>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <input type="hidden" name="mapId" id="challengeMapId" />
 | 
					            <input type="hidden" name="mapId" id="challengeMapId" />
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
@ -86,7 +75,7 @@ TODO: condition!
 | 
				
			|||||||
@section(main)
 | 
					@section(main)
 | 
				
			||||||
    <div id="mapContainer">
 | 
					    <div id="mapContainer">
 | 
				
			||||||
        <?php foreach ($maps as $map): ?>
 | 
					        <?php foreach ($maps as $map): ?>
 | 
				
			||||||
            <div class="mapItem">
 | 
					            <div class="mapItem <?= $map['unlisted'] ? 'unlisted' : '' ?>">
 | 
				
			||||||
                <div class="title">
 | 
					                <div class="title">
 | 
				
			||||||
                    <p class="title"><?= $map['name'] ?></p>
 | 
					                    <p class="title"><?= $map['name'] ?></p>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user