1st datatable try with @vincjo/datatables
This commit is contained in:
		@@ -47,12 +47,10 @@
 | 
			
		||||
  RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
 | 
			
		||||
    orgs = val;
 | 
			
		||||
  });
 | 
			
		||||
  function should_display_based_on_id(id) {
 | 
			
		||||
    if (searchvalue.toString().slice(-1) === "*") {
 | 
			
		||||
      return id.toString().startsWith(searchvalue.replace("*", ""));
 | 
			
		||||
    }
 | 
			
		||||
    return id.toString() === searchvalue;
 | 
			
		||||
  }
 | 
			
		||||
  // ===
 | 
			
		||||
  import { DataHandler, Datatable, Th, ThFilter } from "@vincjo/datatables";
 | 
			
		||||
  const handler = new DataHandler(current_runners, { rowsPerPage: 50 });
 | 
			
		||||
  const rows = handler.getRows();
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")}
 | 
			
		||||
@@ -65,228 +63,139 @@
 | 
			
		||||
      <p class="text-sm">{$_("this-might-take-a-moment")}</p>
 | 
			
		||||
    </div>
 | 
			
		||||
  {:then}
 | 
			
		||||
    {#if current_runners.length === 0}
 | 
			
		||||
      <RunnersEmptyState />
 | 
			
		||||
    {:else}
 | 
			
		||||
      <input
 | 
			
		||||
        type="search"
 | 
			
		||||
        bind:value={searchvalue}
 | 
			
		||||
        placeholder={$_("datatable.search")}
 | 
			
		||||
        aria-label={$_("datatable.search")}
 | 
			
		||||
        class="gridjs-input gridjs-search-input mb-4"
 | 
			
		||||
    <div class="h-12">
 | 
			
		||||
      <GenerateSponsoringContracts
 | 
			
		||||
        bind:sponsoring_contracts_show
 | 
			
		||||
        bind:generate_runners
 | 
			
		||||
      />
 | 
			
		||||
      <GenerateRunnerCards bind:cards_show bind:generate_runners />
 | 
			
		||||
      <GenerateRunnerCertificates
 | 
			
		||||
        bind:certificates_show
 | 
			
		||||
        bind:generate_runners
 | 
			
		||||
      />
 | 
			
		||||
      <div class="block mb-6">
 | 
			
		||||
        <label for="country" class="text-sm font-medium text-gray-700"
 | 
			
		||||
          >{$_("filter-by-organization-team")}</label
 | 
			
		||||
        >
 | 
			
		||||
        <Select
 | 
			
		||||
          on:select={(event) => {
 | 
			
		||||
            selectedFilter = event.detail;
 | 
			
		||||
          }}
 | 
			
		||||
          selectedValue={selectedFilter}
 | 
			
		||||
          placeholder={$_("filter-by-organization-team")}
 | 
			
		||||
          containerClasses="mt-1 py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
 | 
			
		||||
          items={selectgroups}
 | 
			
		||||
          isMulti={true}
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="h-12">
 | 
			
		||||
        <GenerateSponsoringContracts
 | 
			
		||||
          bind:sponsoring_contracts_show
 | 
			
		||||
          bind:generate_runners
 | 
			
		||||
        />
 | 
			
		||||
        <GenerateRunnerCards bind:cards_show bind:generate_runners />
 | 
			
		||||
        <GenerateRunnerCertificates
 | 
			
		||||
          bind:certificates_show
 | 
			
		||||
          bind:generate_runners
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
      <div
 | 
			
		||||
        class:hidden={!pageLoaded}
 | 
			
		||||
        class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"
 | 
			
		||||
      >
 | 
			
		||||
        <table class="divide-y divide-gray-200 w-full table-fixed">
 | 
			
		||||
          <thead class="bg-gray-50">
 | 
			
		||||
            <tr>
 | 
			
		||||
              <th
 | 
			
		||||
                scope="col"
 | 
			
		||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
			
		||||
              >
 | 
			
		||||
                <span
 | 
			
		||||
                  on:click={() => {
 | 
			
		||||
                    const newstate = !current_runners.some(
 | 
			
		||||
                      (r) => r.is_selected === true
 | 
			
		||||
                    );
 | 
			
		||||
                    current_runners = current_runners.map((r) => {
 | 
			
		||||
                      r.is_selected = newstate;
 | 
			
		||||
                      return r;
 | 
			
		||||
                    });
 | 
			
		||||
                  }}
 | 
			
		||||
                  class="underline cursor-pointer select-none"
 | 
			
		||||
                  >{#if current_runners.some((r) => r.is_selected === true)}
 | 
			
		||||
                    {$_("deselect-all")}
 | 
			
		||||
                  {:else}{$_("select-all")}{/if}
 | 
			
		||||
                </span>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th
 | 
			
		||||
                scope="col"
 | 
			
		||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
			
		||||
              >
 | 
			
		||||
                {$_("name")}
 | 
			
		||||
              </th>
 | 
			
		||||
              <th
 | 
			
		||||
                scope="col"
 | 
			
		||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
			
		||||
              >
 | 
			
		||||
                {$_("contact-information")}
 | 
			
		||||
              </th>
 | 
			
		||||
              <th
 | 
			
		||||
                scope="col"
 | 
			
		||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
			
		||||
              >
 | 
			
		||||
                {$_("group")}
 | 
			
		||||
              </th>
 | 
			
		||||
              <th
 | 
			
		||||
                scope="col"
 | 
			
		||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
			
		||||
              >
 | 
			
		||||
                {$_("distance-in-km")}
 | 
			
		||||
              </th>
 | 
			
		||||
              <th scope="col" class="relative px-6 py-3">
 | 
			
		||||
                <span class="sr-only">{$_("action")}</span>
 | 
			
		||||
              </th>
 | 
			
		||||
            </tr>
 | 
			
		||||
          </thead>
 | 
			
		||||
          <tbody class="divide-y divide-gray-200">
 | 
			
		||||
            {#each current_runners as runner}
 | 
			
		||||
              {#if `${runner.firstname} ${runner.lastname}`
 | 
			
		||||
                .toLowerCase()
 | 
			
		||||
                .includes(searchvalue.toLowerCase()) || `${runner.firstname} ${runner.middlename || ""} ${runner.lastname}`
 | 
			
		||||
                  .toLowerCase()
 | 
			
		||||
                  .includes(searchvalue.toLowerCase()) || searchvalue === `#${runner.id}`}
 | 
			
		||||
                {#if filterGroupIDs.includes(runner.group.id) || filterGroupIDs.includes(runner.group.parentGroup?.id) || filterGroupIDs.length === 0}
 | 
			
		||||
                  <tr
 | 
			
		||||
                    data-rowid="user_{runner.id}"
 | 
			
		||||
                    data-groupid={runner.group.id}
 | 
			
		||||
                  >
 | 
			
		||||
                    <td class="px-6 py-4 whitespace-nowrap">
 | 
			
		||||
                      <input
 | 
			
		||||
                        bind:checked={runner.is_selected}
 | 
			
		||||
                        type="checkbox"
 | 
			
		||||
                        class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
 | 
			
		||||
                      />
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td class="px-6 py-4 whitespace-nowrap">
 | 
			
		||||
                      <div class="flex items-center">
 | 
			
		||||
                        <div class="ml-4">
 | 
			
		||||
                          <div class="text-sm font-medium text-gray-900">
 | 
			
		||||
                            {runner.firstname}
 | 
			
		||||
                            {runner.middlename || ""}
 | 
			
		||||
                            {runner.lastname}
 | 
			
		||||
                          </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                      </div>
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td class="px-6 py-4 whitespace-nowrap">
 | 
			
		||||
                      {#if runner.email}
 | 
			
		||||
                        <div class="text-sm text-gray-500">{runner.email}</div>
 | 
			
		||||
                      {/if}
 | 
			
		||||
                      {#if runner.phone}
 | 
			
		||||
                        <div class="text-sm text-gray-500">{runner.phone}</div>
 | 
			
		||||
                      {/if}
 | 
			
		||||
                      {#if runner.address.address1 !== null}
 | 
			
		||||
                        {runner.address.address1}<br />
 | 
			
		||||
                        {runner.address.address2 || ""}<br />
 | 
			
		||||
                        {runner.address.postalcode}
 | 
			
		||||
                        {runner.address.city}
 | 
			
		||||
                        {runner.address.country}
 | 
			
		||||
                      {/if}
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td class="px-6 py-4 whitespace-nowrap">
 | 
			
		||||
                      {#if runner.group.responseType === "RUNNERTEAM"}
 | 
			
		||||
                        <a
 | 
			
		||||
                          href="../teams/{runner.group.id}"
 | 
			
		||||
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
 | 
			
		||||
                          >{runner.group.parentGroup.name} > {runner.group
 | 
			
		||||
                            .name}</a
 | 
			
		||||
                        >
 | 
			
		||||
                      {/if}
 | 
			
		||||
                      {#if runner.group.responseType === "RUNNERORGANIZATION"}
 | 
			
		||||
                        <a
 | 
			
		||||
                          href="../orgs/{runner.group.id}"
 | 
			
		||||
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
 | 
			
		||||
                          >{runner.group.name}</a
 | 
			
		||||
                        >
 | 
			
		||||
                      {/if}
 | 
			
		||||
                    </td>
 | 
			
		||||
                    <td class="px-6 py-4 whitespace-nowrap">
 | 
			
		||||
                      {runner.distance / 1000} km
 | 
			
		||||
                    </td>
 | 
			
		||||
                    {#if active_deletes[runner.id] === true}
 | 
			
		||||
                      <td
 | 
			
		||||
                        class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
 | 
			
		||||
                      >
 | 
			
		||||
                        <button
 | 
			
		||||
                          on:click={() => {
 | 
			
		||||
                            active_deletes[runner.id] = false;
 | 
			
		||||
                          }}
 | 
			
		||||
                          tabindex="0"
 | 
			
		||||
                          class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer"
 | 
			
		||||
                          >{$_("cancel-delete")}</button
 | 
			
		||||
                        >
 | 
			
		||||
                        <button
 | 
			
		||||
                          on:click={() => {
 | 
			
		||||
                            RunnerService.runnerControllerRemove(
 | 
			
		||||
                              runner.id,
 | 
			
		||||
                              true
 | 
			
		||||
                            )
 | 
			
		||||
                              .then((resp) => {
 | 
			
		||||
                                current_runners = current_runners.filter(
 | 
			
		||||
                                  (obj) => obj.id !== runner.id
 | 
			
		||||
                                );
 | 
			
		||||
                              })
 | 
			
		||||
                              .catch((err) => {});
 | 
			
		||||
                          }}
 | 
			
		||||
                          tabindex="0"
 | 
			
		||||
                          class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
			
		||||
                          >{$_("confirm-delete")}</button
 | 
			
		||||
                        >
 | 
			
		||||
                      </td>
 | 
			
		||||
                    {:else}
 | 
			
		||||
                      <td
 | 
			
		||||
                        class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
 | 
			
		||||
                      >
 | 
			
		||||
                        <a
 | 
			
		||||
                          href="./{runner.id}"
 | 
			
		||||
                          class="text-indigo-600 hover:text-indigo-900"
 | 
			
		||||
                          >{$_("details")}</a
 | 
			
		||||
                        >
 | 
			
		||||
                        {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:DELETE")}
 | 
			
		||||
                          <button
 | 
			
		||||
                            on:click={() => {
 | 
			
		||||
                              active_deletes[runner.id] = true;
 | 
			
		||||
                            }}
 | 
			
		||||
                            tabindex="0"
 | 
			
		||||
                            class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
			
		||||
                            >{$_("delete")}</button
 | 
			
		||||
                          >
 | 
			
		||||
                        {/if}
 | 
			
		||||
                      </td>
 | 
			
		||||
                    {/if}
 | 
			
		||||
                  </tr>
 | 
			
		||||
                {/if}
 | 
			
		||||
              {/if}
 | 
			
		||||
            {/each}
 | 
			
		||||
          </tbody>
 | 
			
		||||
        </table>
 | 
			
		||||
      </div>
 | 
			
		||||
    {/if}
 | 
			
		||||
  {:catch error}
 | 
			
		||||
    <div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
 | 
			
		||||
      <span class="inline-block align-middle mr-8">
 | 
			
		||||
        <b class="capitalize">{$_("general_promise_error")}</b>
 | 
			
		||||
        {error}
 | 
			
		||||
      </span>
 | 
			
		||||
    </div>
 | 
			
		||||
    <Datatable {handler}>
 | 
			
		||||
      <table>
 | 
			
		||||
        <thead>
 | 
			
		||||
          <tr>
 | 
			
		||||
            <th>
 | 
			
		||||
              <input
 | 
			
		||||
                type="checkbox"
 | 
			
		||||
                class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
 | 
			
		||||
              />
 | 
			
		||||
            </th>
 | 
			
		||||
            <Th {handler} orderBy="id">ID</Th>
 | 
			
		||||
            <Th {handler} orderBy="firstname">First Name</Th>
 | 
			
		||||
            <Th {handler} orderBy="middlename">Middle Name</Th>
 | 
			
		||||
            <Th {handler} orderBy="lastname">Last Name</Th>
 | 
			
		||||
            <Th {handler} orderBy="group">Gruppe</Th>
 | 
			
		||||
            <Th {handler} orderBy="distance">Distanz</Th>
 | 
			
		||||
            <th>{$_("action")}</th>
 | 
			
		||||
          </tr>
 | 
			
		||||
          <tr>
 | 
			
		||||
            <th />
 | 
			
		||||
            <ThFilter {handler} filterBy="id" />
 | 
			
		||||
            <ThFilter {handler} filterBy="firstname" />
 | 
			
		||||
            <ThFilter {handler} filterBy="middlename" />
 | 
			
		||||
            <ThFilter {handler} filterBy="lastname" />
 | 
			
		||||
            <ThFilter {handler} filterBy="group" />
 | 
			
		||||
            <th />
 | 
			
		||||
            <th />
 | 
			
		||||
          </tr>
 | 
			
		||||
        </thead>
 | 
			
		||||
        <tbody>
 | 
			
		||||
          {#each $rows as row}
 | 
			
		||||
            <tr>
 | 
			
		||||
              <td>
 | 
			
		||||
                <input
 | 
			
		||||
                  type="checkbox"
 | 
			
		||||
                  class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
 | 
			
		||||
                />
 | 
			
		||||
              </td>
 | 
			
		||||
              <td>{row.id}</td>
 | 
			
		||||
              <td>{row.firstname}</td>
 | 
			
		||||
              <td>{row.middlename || ""}</td>
 | 
			
		||||
              <td>{row.lastname}</td>
 | 
			
		||||
              <td
 | 
			
		||||
                >{#if row.group.responseType === "RUNNERTEAM"}
 | 
			
		||||
                  <a
 | 
			
		||||
                    href="../teams/{row.group.id}"
 | 
			
		||||
                    class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
 | 
			
		||||
                    >{row.group.parentGroup.name} > {row.group.name}</a
 | 
			
		||||
                  >
 | 
			
		||||
                {/if}
 | 
			
		||||
                {#if row.group.responseType === "RUNNERORGANIZATION"}
 | 
			
		||||
                  <a
 | 
			
		||||
                    href="../orgs/{row.group.id}"
 | 
			
		||||
                    class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
 | 
			
		||||
                    >{row.group.name}</a
 | 
			
		||||
                  >
 | 
			
		||||
                {/if}</td
 | 
			
		||||
              >
 | 
			
		||||
              <td>{row.distance / 1000} km</td>
 | 
			
		||||
              <td />
 | 
			
		||||
              <!-- <td>
 | 
			
		||||
            {#if active_deletes[row.id] === true}
 | 
			
		||||
              <button
 | 
			
		||||
                on:click={() => {
 | 
			
		||||
                  active_deletes[row.id] = false;
 | 
			
		||||
                }}
 | 
			
		||||
                tabindex="0"
 | 
			
		||||
                class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer"
 | 
			
		||||
                >{$_("cancel-delete")}</button
 | 
			
		||||
              >
 | 
			
		||||
              <button
 | 
			
		||||
                on:click={() => {
 | 
			
		||||
                  RunnerService.runnerControllerRemove(row.id, true)
 | 
			
		||||
                    .then((resp) => {
 | 
			
		||||
                      current_runners = current_runners.filter(
 | 
			
		||||
                        (obj) => obj.id !== row.id
 | 
			
		||||
                      );
 | 
			
		||||
                    })
 | 
			
		||||
                    .catch((err) => {});
 | 
			
		||||
                }}
 | 
			
		||||
                tabindex="0"
 | 
			
		||||
                class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
			
		||||
                >{$_("confirm-delete")}</button
 | 
			
		||||
              >
 | 
			
		||||
            {:else}
 | 
			
		||||
              <a href="./{row.id}" class="text-indigo-600 hover:text-indigo-900"
 | 
			
		||||
                >{$_("details")}</a
 | 
			
		||||
              >
 | 
			
		||||
              {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:DELETE")}
 | 
			
		||||
                <button
 | 
			
		||||
                  on:click={() => {
 | 
			
		||||
                    active_deletes[row.id] = true;
 | 
			
		||||
                  }}
 | 
			
		||||
                  tabindex="0"
 | 
			
		||||
                  class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
			
		||||
                  >{$_("delete")}</button
 | 
			
		||||
                >
 | 
			
		||||
              {/if}
 | 
			
		||||
            {/if}
 | 
			
		||||
          </td> -->
 | 
			
		||||
            </tr>
 | 
			
		||||
          {/each}
 | 
			
		||||
        </tbody>
 | 
			
		||||
      </table>
 | 
			
		||||
    </Datatable>
 | 
			
		||||
  {/await}
 | 
			
		||||
{/if}
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
  thead {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
  }
 | 
			
		||||
  tbody td {
 | 
			
		||||
    padding: 4px;
 | 
			
		||||
  }
 | 
			
		||||
  tbody tr:nth-child(even) {
 | 
			
		||||
    background: #fafafa;
 | 
			
		||||
  }
 | 
			
		||||
  tbody tr {
 | 
			
		||||
    transition: all, 0.2s;
 | 
			
		||||
  }
 | 
			
		||||
  tbody tr:hover {
 | 
			
		||||
    background: #f5f5f5;
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user