Compare commits
	
		
			7 Commits
		
	
	
		
			834ff8fa63
			...
			0.12.2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6043bc4517 | |||
| e6ed066e3f | |||
| ee4e8655b8 | |||
| 37970d2be6 | |||
| 1376788016 | |||
| 4cad86cf85 | |||
| 6304116edb | 
							
								
								
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -2,8 +2,19 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
 | 
					All notable changes to this project will be documented in this file. Dates are displayed in UTC.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [0.12.2](https://git.odit.services/lfk/frontend/compare/0.12.1...0.12.2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Merge pull request 'feature/110-virtual_list' (#124) from feature/110-virtual_list into dev [`e6ed066`](https://git.odit.services/lfk/frontend/commit/e6ed066e3ffabba6519f94d801d21a27819d0492)
 | 
				
			||||||
 | 
					- wip on virtuallist [`6304116`](https://git.odit.services/lfk/frontend/commit/6304116edb7f5e3c7b67c15e0b1740d34c513155)
 | 
				
			||||||
 | 
					- fixed height table [`4cad86c`](https://git.odit.services/lfk/frontend/commit/4cad86cf852468428d77103d052c6974b17c34c3)
 | 
				
			||||||
 | 
					- pre-merge fixes [`37970d2`](https://git.odit.services/lfk/frontend/commit/37970d2be6b6502701914e41e5bfe2c418438480)
 | 
				
			||||||
 | 
					- updated virtual scroll list [`1376788`](https://git.odit.services/lfk/frontend/commit/1376788016e767f006661f8c9e6747781f2dce55)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### [0.12.1](https://git.odit.services/lfk/frontend/compare/0.12.0...0.12.1)
 | 
					#### [0.12.1](https://git.odit.services/lfk/frontend/compare/0.12.0...0.12.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 6 April 2021
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 🚀RELEASE v0.12.1 [`834ff8f`](https://git.odit.services/lfk/frontend/commit/834ff8fa63178f36dcacf931c128ba67a3e7bd1b)
 | 
				
			||||||
- Merge pull request 'ImportRunnerModal Cancel Button feature/122-import_cancel' (#123) from feature/112-import_cancel into dev [`1f428a5`](https://git.odit.services/lfk/frontend/commit/1f428a535e3ae619cbf8db51d04255aac8dd8614)
 | 
					- Merge pull request 'ImportRunnerModal Cancel Button feature/122-import_cancel' (#123) from feature/112-import_cancel into dev [`1f428a5`](https://git.odit.services/lfk/frontend/commit/1f428a535e3ae619cbf8db51d04255aac8dd8614)
 | 
				
			||||||
- Added cancel button for the first stage of runner import [`0c40966`](https://git.odit.services/lfk/frontend/commit/0c409669700d3a8096cc04716154b0fdca458fe5)
 | 
					- Added cancel button for the first stage of runner import [`0c40966`](https://git.odit.services/lfk/frontend/commit/0c409669700d3a8096cc04716154b0fdca458fe5)
 | 
				
			||||||
- Escape now triggers foll modal close (including reset) instead of just hiding th modal [`9da071f`](https://git.odit.services/lfk/frontend/commit/9da071fe9ba067160334682bf00163e3630fe919)
 | 
					- Escape now triggers foll modal close (including reset) instead of just hiding th modal [`9da071f`](https://git.odit.services/lfk/frontend/commit/9da071fe9ba067160334682bf00163e3630fe919)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@
 | 
				
			|||||||
</head>
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
  <span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.12.1-RELEASE_INFO</span>
 | 
					  <span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.12.2-RELEASE_INFO</span>
 | 
				
			||||||
  <noscript>You need to enable JavaScript to run this app.</noscript>
 | 
					  <noscript>You need to enable JavaScript to run this app.</noscript>
 | 
				
			||||||
  <script src="/env.js"></script>
 | 
					  <script src="/env.js"></script>
 | 
				
			||||||
  <script type="module" src="/src/main.js"></script>
 | 
					  <script type="module" src="/src/main.js"></script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	"name": "@odit/lfk-frontend",
 | 
						"name": "@odit/lfk-frontend",
 | 
				
			||||||
	"version": "0.12.1",
 | 
						"version": "0.12.2",
 | 
				
			||||||
	"scripts": {
 | 
						"scripts": {
 | 
				
			||||||
		"i18n-order": "node order.js",
 | 
							"i18n-order": "node order.js",
 | 
				
			||||||
		"dev": "vite",
 | 
							"dev": "vite",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
  import { getLocaleFromNavigator, json, _ } from "svelte-i18n";
 | 
					  import { getLocaleFromNavigator, json, _ } from "svelte-i18n";
 | 
				
			||||||
 | 
					  import InfiniteLoading from 'svelte-infinite-loading';
 | 
				
			||||||
  import { RunnerCardService } from "@odit/lfk-client-js";
 | 
					  import { RunnerCardService } from "@odit/lfk-client-js";
 | 
				
			||||||
  import store from "../../store";
 | 
					  import store from "../../store";
 | 
				
			||||||
  import Toastify from "toastify-js";
 | 
					  import Toastify from "toastify-js";
 | 
				
			||||||
@@ -11,11 +12,21 @@
 | 
				
			|||||||
  export let editable = {};
 | 
					  export let editable = {};
 | 
				
			||||||
  export let original_data = {};
 | 
					  export let original_data = {};
 | 
				
			||||||
  export let current_cards = [];
 | 
					  export let current_cards = [];
 | 
				
			||||||
 | 
					  $: filtered_cards = current_cards.filter(function (c) {
 | 
				
			||||||
 | 
					    if (
 | 
				
			||||||
 | 
					      c.code.toLowerCase().includes(searchvalue_lowercase) ||
 | 
				
			||||||
 | 
					      c.runner?.firstname.toLowerCase().includes(searchvalue_lowercase) ||
 | 
				
			||||||
 | 
					      c.runner?.middlename.toLowerCase().includes(searchvalue_lowercase) ||
 | 
				
			||||||
 | 
					      c.runner?.lastname.toLowerCase().includes(searchvalue_lowercase) ||
 | 
				
			||||||
 | 
					      should_display_based_on_id(c.id)
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
  $: searchvalue = "";
 | 
					  $: searchvalue = "";
 | 
				
			||||||
 | 
					  $: searchvalue_lowercase = searchvalue.toLowerCase();
 | 
				
			||||||
  $: active_deletes = [];
 | 
					  $: active_deletes = [];
 | 
				
			||||||
  $: cards_show = current_cards.some(
 | 
					  $: cards_show = current_cards.some((r) => r.is_selected === true);
 | 
				
			||||||
    (r) => r.is_selected === true
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
  $: generate_cards = current_cards.filter((r) => r.is_selected === true);
 | 
					  $: generate_cards = current_cards.filter((r) => r.is_selected === true);
 | 
				
			||||||
  const cards_promise = RunnerCardService.runnerCardControllerGetAll().then(
 | 
					  const cards_promise = RunnerCardService.runnerCardControllerGetAll().then(
 | 
				
			||||||
    (val) => {
 | 
					    (val) => {
 | 
				
			||||||
@@ -46,8 +57,38 @@
 | 
				
			|||||||
    original_data = Object.assign(original_data, card);
 | 
					    original_data = Object.assign(original_data, card);
 | 
				
			||||||
    edit_modal_open = true;
 | 
					    edit_modal_open = true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					// -----------------
 | 
				
			||||||
 | 
					  let scrollTop = 0;
 | 
				
			||||||
 | 
					  $: rendered = filtered_cards;
 | 
				
			||||||
 | 
					  let innerHeight = 0;
 | 
				
			||||||
 | 
					  let ele;
 | 
				
			||||||
 | 
					  $: updateSlice(scrollTop);
 | 
				
			||||||
 | 
					  $: innerHeight = `${filtered_cards.length * 25}px`;
 | 
				
			||||||
 | 
					  $: if (ele) updateSlice();
 | 
				
			||||||
 | 
					  function updateSlice() {
 | 
				
			||||||
 | 
					    const height = ele ? parseInt(ele.clientHeight) : 100;
 | 
				
			||||||
 | 
					    const init = scrollTop / 25;
 | 
				
			||||||
 | 
					    const end = Math.ceil((scrollTop + height) / 25);
 | 
				
			||||||
 | 
					    rendered = filtered_cards.slice(init, end + 15);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  function updateScroll($event) {
 | 
				
			||||||
 | 
					    scrollTop = $event.target.scrollTop;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					  table tbody {
 | 
				
			||||||
 | 
					  display: block;
 | 
				
			||||||
 | 
					  overflow-y: scroll;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table thead, table tbody tr {
 | 
				
			||||||
 | 
					  display: table;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  table-layout: fixed;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:UPDATE')}
 | 
					{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:UPDATE')}
 | 
				
			||||||
  <CardDetailModal
 | 
					  <CardDetailModal
 | 
				
			||||||
    bind:current_cards
 | 
					    bind:current_cards
 | 
				
			||||||
@@ -121,107 +162,111 @@
 | 
				
			|||||||
              </th>
 | 
					              </th>
 | 
				
			||||||
            </tr>
 | 
					            </tr>
 | 
				
			||||||
          </thead>
 | 
					          </thead>
 | 
				
			||||||
          <tbody class="divide-y divide-gray-200">
 | 
					          <tbody class="divide-y divide-gray-200 virtual-wrapper"
 | 
				
			||||||
            {#each current_cards as card}
 | 
					  on:scroll={updateScroll}
 | 
				
			||||||
              {#if card.code
 | 
					  style="height: 70vh; width:100%"
 | 
				
			||||||
                .toLowerCase()
 | 
					  bind:this={ele}
 | 
				
			||||||
                .includes(
 | 
					          >
 | 
				
			||||||
                  searchvalue.toLowerCase()
 | 
					    {#each filtered_cards as card, index}
 | 
				
			||||||
                ) || card.runner?.firstname
 | 
					    {#if card.code
 | 
				
			||||||
                  .toLowerCase()
 | 
					      .toLowerCase()
 | 
				
			||||||
                  .includes(
 | 
					      .includes(
 | 
				
			||||||
                    searchvalue.toLowerCase()
 | 
					        searchvalue.toLowerCase()
 | 
				
			||||||
                  ) || card.runner?.middlename
 | 
					      ) || card.runner?.firstname
 | 
				
			||||||
                  .toLowerCase()
 | 
					        .toLowerCase()
 | 
				
			||||||
                  .includes(
 | 
					        .includes(
 | 
				
			||||||
                    searchvalue.toLowerCase()
 | 
					          searchvalue.toLowerCase()
 | 
				
			||||||
                  ) || card.runner?.lastname
 | 
					        ) || card.runner?.middlename
 | 
				
			||||||
                  .toLowerCase()
 | 
					        .toLowerCase()
 | 
				
			||||||
                  .includes(
 | 
					        .includes(
 | 
				
			||||||
                    searchvalue.toLowerCase()
 | 
					          searchvalue.toLowerCase()
 | 
				
			||||||
                  ) || should_display_based_on_id(card.id)}
 | 
					        ) || card.runner?.lastname
 | 
				
			||||||
                <tr data-rowid="card_{card.id}">
 | 
					        .toLowerCase()
 | 
				
			||||||
                  <td class="px-6 py-4 whitespace-nowrap">
 | 
					        .includes(
 | 
				
			||||||
                    <input
 | 
					          searchvalue.toLowerCase()
 | 
				
			||||||
                      bind:checked={card.is_selected}
 | 
					        ) || should_display_based_on_id(card.id)}
 | 
				
			||||||
                      type="checkbox"
 | 
					      <tr data-rowid="card_{card.id}">
 | 
				
			||||||
                      class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" />
 | 
					        <td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                  </td>
 | 
					          <input
 | 
				
			||||||
                  <td class="px-6 py-4 whitespace-nowrap">
 | 
					            bind:checked={card.is_selected}
 | 
				
			||||||
                    <div class="flex items-center">{card.code}</div>
 | 
					            type="checkbox"
 | 
				
			||||||
                  </td>
 | 
					            class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" />
 | 
				
			||||||
                  <td class="px-6 py-4 whitespace-nowrap">
 | 
					        </td>
 | 
				
			||||||
                    <div class="flex items-center">
 | 
					        <td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                      {#if card.runner}
 | 
					          <div class="flex items-center">{card.code}</div>
 | 
				
			||||||
                        <a
 | 
					        </td>
 | 
				
			||||||
                          href="../runners/{card.runner.id}"
 | 
					        <td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{card.runner.firstname}
 | 
					          <div class="flex items-center">
 | 
				
			||||||
                          {card.runner.middlename || ''}
 | 
					            {#if card.runner}
 | 
				
			||||||
                          {card.runner.lastname}</a>
 | 
					              <a
 | 
				
			||||||
                      {:else}{$_('non-blanko')}{/if}
 | 
					                href="../runners/{card.runner.id}"
 | 
				
			||||||
                    </div>
 | 
					                class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{card.runner.firstname}
 | 
				
			||||||
                  </td>
 | 
					                {card.runner.middlename || ''}
 | 
				
			||||||
                  <td class="px-6 py-4 whitespace-nowrap">
 | 
					                {card.runner.lastname}</a>
 | 
				
			||||||
                    <div class="flex items-center">
 | 
					            {:else}{$_('non-blanko')}{/if}
 | 
				
			||||||
                      {#if card.enabled}
 | 
					          </div>
 | 
				
			||||||
                        <span
 | 
					        </td>
 | 
				
			||||||
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">{$_('enabled')}</span>
 | 
					        <td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                      {:else}
 | 
					          <div class="flex items-center">
 | 
				
			||||||
                        <span
 | 
					            {#if card.enabled}
 | 
				
			||||||
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">{$_('disabled')}</span>
 | 
					              <span
 | 
				
			||||||
                      {/if}
 | 
					                class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">{$_('enabled')}</span>
 | 
				
			||||||
                    </div>
 | 
					            {:else}
 | 
				
			||||||
                  </td>
 | 
					              <span
 | 
				
			||||||
 | 
					                class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">{$_('disabled')}</span>
 | 
				
			||||||
 | 
					            {/if}
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </td>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  {#if active_deletes[card.id] === true}
 | 
					        {#if active_deletes[card.id] === true}
 | 
				
			||||||
                    <td
 | 
					          <td
 | 
				
			||||||
                      class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
 | 
					            class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
 | 
				
			||||||
                      <button
 | 
					            <button
 | 
				
			||||||
                        on:click={() => {
 | 
					              on:click={() => {
 | 
				
			||||||
                          active_deletes[card.id] = false;
 | 
					                active_deletes[card.id] = false;
 | 
				
			||||||
                        }}
 | 
					              }}
 | 
				
			||||||
                        tabindex="0"
 | 
					              tabindex="0"
 | 
				
			||||||
                        class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
 | 
					              class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
 | 
				
			||||||
                      <button
 | 
					            <button
 | 
				
			||||||
                        on:click={() => {
 | 
					              on:click={() => {
 | 
				
			||||||
                          RunnerCardService.runnerCardControllerRemove(card.id, false).then(
 | 
					                RunnerCardService.runnerCardControllerRemove(card.id, false).then(
 | 
				
			||||||
                            (resp) => {
 | 
					                  (resp) => {
 | 
				
			||||||
                              current_cards = current_cards.filter(
 | 
					                    current_cards = current_cards.filter(
 | 
				
			||||||
                                (obj) => obj.id !== card.id
 | 
					                      (obj) => obj.id !== card.id
 | 
				
			||||||
                              );
 | 
					                    );
 | 
				
			||||||
                              Toastify({
 | 
					                    Toastify({
 | 
				
			||||||
                                text: $_('card-deleted'),
 | 
					                      text: $_('card-deleted'),
 | 
				
			||||||
                                duration: 500,
 | 
					                      duration: 500,
 | 
				
			||||||
                                backgroundColor:
 | 
					                      backgroundColor:
 | 
				
			||||||
                                  'linear-gradient(to right, #00b09b, #96c93d)',
 | 
					                        'linear-gradient(to right, #00b09b, #96c93d)',
 | 
				
			||||||
                              }).showToast();
 | 
					                    }).showToast();
 | 
				
			||||||
                            }
 | 
					                  }
 | 
				
			||||||
                          );
 | 
					                );
 | 
				
			||||||
                        }}
 | 
					              }}
 | 
				
			||||||
                        tabindex="0"
 | 
					              tabindex="0"
 | 
				
			||||||
                        class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
 | 
					              class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
 | 
				
			||||||
                    </td>
 | 
					          </td>
 | 
				
			||||||
                  {:else}
 | 
					        {:else}
 | 
				
			||||||
                    <td
 | 
					          <td
 | 
				
			||||||
                      class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
 | 
					            class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
 | 
				
			||||||
                      <button
 | 
					            <button
 | 
				
			||||||
                        on:click={() => {
 | 
					              on:click={() => {
 | 
				
			||||||
                          open_edit_modal(card);
 | 
					                open_edit_modal(card);
 | 
				
			||||||
                        }}
 | 
					              }}
 | 
				
			||||||
                        class="text-indigo-600 hover:text-indigo-900">{$_('details')}</button>
 | 
					              class="text-indigo-600 hover:text-indigo-900">{$_('details')}</button>
 | 
				
			||||||
                      {#if store.state.jwtinfo.userdetails.permissions.includes('CARD:DELETE')}
 | 
					            {#if store.state.jwtinfo.userdetails.permissions.includes('CARD:DELETE')}
 | 
				
			||||||
                        <button
 | 
					              <button
 | 
				
			||||||
                          on:click={() => {
 | 
					                on:click={() => {
 | 
				
			||||||
                            active_deletes[card.id] = true;
 | 
					                  active_deletes[card.id] = true;
 | 
				
			||||||
                          }}
 | 
					                }}
 | 
				
			||||||
                          tabindex="0"
 | 
					                tabindex="0"
 | 
				
			||||||
                          class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
 | 
					                class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
 | 
				
			||||||
                      {/if}
 | 
					            {/if}
 | 
				
			||||||
                    </td>
 | 
					          </td>
 | 
				
			||||||
                  {/if}
 | 
					        {/if}
 | 
				
			||||||
                </tr>
 | 
					      </tr>
 | 
				
			||||||
              {/if}
 | 
					    {/if}
 | 
				
			||||||
            {/each}
 | 
					    {/each}
 | 
				
			||||||
          </tbody>
 | 
					          </tbody>
 | 
				
			||||||
        </table>
 | 
					        </table>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user