--- /dev/null
+/**
+ * Provides a filter input to narrow down the list of projects.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2023 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @since 6.0
+ */
+
+import { touch as isTouch } from "WoltLabSuite/Core/Environment";
+
+const filterByName = document.getElementById("filterByName") as HTMLInputElement;
+const projects: Map<string, HTMLTableRowElement> = new Map();
+
+function filterProjects(): void {
+ const value = filterByName.value.trim().toLowerCase();
+ if (value === "") {
+ resetFilter();
+ return;
+ }
+
+ projects.forEach((row, name) => {
+ if (name.includes(value)) {
+ row.hidden = false;
+ } else {
+ row.hidden = true;
+ }
+ });
+}
+
+function resetFilter(): void {
+ filterByName.value = "";
+ projects.forEach((row) => (row.hidden = false));
+}
+
+export function setup(): void {
+ filterByName.addEventListener("input", () => filterProjects());
+ filterByName.addEventListener("keyup", (event) => {
+ if (event.key === "Escape") {
+ resetFilter();
+ }
+ });
+
+ const table = document.getElementById("devtoolsProjectList") as HTMLTableElement;
+ table.querySelectorAll<HTMLTableRowElement>(".devtoolsProject").forEach((row) => {
+ const name = row.dataset.name!.toLowerCase();
+ projects.set(name, row);
+ });
+
+ if (!isTouch()) {
+ filterByName.focus();
+ }
+}
{include file='header' pageTitle='wcf.acp.devtools.project.list'}
<script data-relocate="true">
- require(['WoltLabSuite/Core/Acp/Ui/Devtools/Project/QuickSetup', 'Language'], function(AcpUiDevtoolsProjectQuickSetup, Language) {
+ require(['WoltLabSuite/Core/Acp/Ui/Devtools/Project/FilterByName', 'WoltLabSuite/Core/Acp/Ui/Devtools/Project/QuickSetup', 'Language'], function({ setup: setupFilterByName }, AcpUiDevtoolsProjectQuickSetup, Language) {
Language.add('wcf.acp.devtools.project.quickSetup', '{jslang}wcf.acp.devtools.project.quickSetup{/jslang}');
+ setupFilterByName();
AcpUiDevtoolsProjectQuickSetup.init();
});
</script>
<p class="info">{lang}wcf.acp.devtools.project.introduction{/lang}</p>
{hascontent}
+ <div class="section">
+ <dl>
+ <dt>
+ <label for="filterByName">{lang}wcf.acp.devtools.project.filterByName{/lang}</label>
+ </dt>
+ <dd>
+ <input type="text" id="filterByName" class="long">
+ </dd>
+ </dl>
+ </div>
+
<div class="section tabularBox">
- <table class="table jsObjectActionContainer" data-object-action-class-name="wcf\data\devtools\project\DevtoolsProjectAction">
+ <table class="table jsObjectActionContainer" data-object-action-class-name="wcf\data\devtools\project\DevtoolsProjectAction" id="devtoolsProjectList">
<thead>
<tr>
<th class="columnID{if $sortField === 'projectID'} active {@$sortOrder}{/if}" colspan="3"><a href="{link controller='DevtoolsProjectList'}sortField=projectID&sortOrder={if $sortField === 'projectID' && $sortOrder === 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
<tbody>
{content}
{foreach from=$objects item=object}
- <tr class="jsObjectRow jsObjectActionObject" data-object-id="{@$object->getObjectID()}">
+ <tr class="jsObjectRow jsObjectActionObject devtoolsProject" data-object-id="{$object->getObjectID()}" data-name="{$object->name}">
<td class="columnIcon">
<a href="{link controller='DevtoolsProjectSync' id=$object->getObjectID()}{/link}" class="button small">{lang}wcf.acp.devtools.project.sync{/lang}</a>
<a href="{link controller='DevtoolsProjectPipList' id=$object->getObjectID()}{/link}" class="button small">{lang}wcf.acp.devtools.project.pips{/lang}</a>
--- /dev/null
+/**
+ * Provides a filter input to narrow down the list of projects.
+ *
+ * @author Alexander Ebert
+ * @copyright 2001-2023 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @since 6.0
+ */
+define(["require", "exports", "WoltLabSuite/Core/Environment"], function (require, exports, Environment_1) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.setup = void 0;
+ const filterByName = document.getElementById("filterByName");
+ const projects = new Map();
+ function filterProjects() {
+ const value = filterByName.value.trim().toLowerCase();
+ if (value === "") {
+ resetFilter();
+ return;
+ }
+ projects.forEach((row, name) => {
+ if (name.includes(value)) {
+ row.hidden = false;
+ }
+ else {
+ row.hidden = true;
+ }
+ });
+ }
+ function resetFilter() {
+ filterByName.value = "";
+ projects.forEach((row) => (row.hidden = false));
+ }
+ function setup() {
+ filterByName.addEventListener("input", () => filterProjects());
+ filterByName.addEventListener("keyup", (event) => {
+ if (event.key === "Escape") {
+ resetFilter();
+ }
+ });
+ const table = document.getElementById("devtoolsProjectList");
+ table.querySelectorAll(".devtoolsProject").forEach((row) => {
+ const name = row.dataset.name.toLowerCase();
+ projects.set(name, row);
+ });
+ if (!(0, Environment_1.touch)()) {
+ filterByName.focus();
+ }
+ }
+ exports.setup = setup;
+});
<category name="wcf.acp.devtools">
<item name="wcf.acp.devtools.project.add"><![CDATA[Projekt hinzufügen]]></item>
<item name="wcf.acp.devtools.project.edit"><![CDATA[Projekt bearbeiten]]></item>
+ <item name="wcf.acp.devtools.project.filterByName"><![CDATA[Nach Name filtern]]></item>
<item name="wcf.acp.devtools.project.introduction"><![CDATA[Bitte {if LANGUAGE_USE_INFORMAL_VARIANT}beachte{else}beachten Sie{/if} die <a href="https://docs.woltlab.com/latest/getting-started/#developer-tools" class="externalURL">Hinweise zur Benutzung</a> in der Entwickler-Dokumentation.]]></item>
<item name="wcf.acp.devtools.project.list"><![CDATA[Projekte]]></item>
<item name="wcf.acp.devtools.project.name"><![CDATA[Name]]></item>
<category name="wcf.acp.devtools">
<item name="wcf.acp.devtools.project.add"><![CDATA[Add Project]]></item>
<item name="wcf.acp.devtools.project.edit"><![CDATA[Edit Project]]></item>
+ <item name="wcf.acp.devtools.project.filterByName"><![CDATA[Filter by Name]]></item>
<item name="wcf.acp.devtools.project.introduction"><![CDATA[Please read the <a href="https://docs.woltlab.com/latest/getting-started/#developer-tools" class="externalURL">usage instructions</a> in the developer documentation.]]></item>
<item name="wcf.acp.devtools.project.list"><![CDATA[Projects]]></item>
<item name="wcf.acp.devtools.project.name"><![CDATA[Name]]></item>