29
									
								
								src/components/scanstations/ScanStations.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/components/scanstations/ScanStations.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| <script> | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   import store from "../../store"; | ||||
|   // import AddContactModal from "./AddContactModal.svelte"; | ||||
|   import ScanStationsOverview from "./ScanStationsOverview.svelte"; | ||||
|   export let modal_open = false; | ||||
|   let current_contacts = []; | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|     Scanstations | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes('CONTACT:CREATE')} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         type="button" | ||||
|         class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm"> | ||||
|         Create a new scanstation | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   <ContactsOverview bind:current_contacts /> | ||||
| </section> | ||||
|  | ||||
| <!-- {#if store.state.jwtinfo.userdetails.permissions.includes('CONTACT:CREATE')} | ||||
|   <AddContactModal bind:current_contacts bind:modal_open /> | ||||
| {/if} --> | ||||
							
								
								
									
										17
									
								
								src/components/scanstations/ScanStationsEmptyState.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/components/scanstations/ScanStationsEmptyState.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <script> | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   // import AddContactModal from "./AddContactModal.svelte"; | ||||
|   import scanstations_empty from "./scanstations_empty.svg"; | ||||
|   let modal_open = false; | ||||
|   let current_contacts = []; | ||||
| </script> | ||||
|  | ||||
| <div class="text-center items-center justify-center"> | ||||
|   <p class="mb-16 text-lg text-gray-500"> | ||||
|     <img class="w-full h-44" src={scanstations_empty} alt="" /> | ||||
|     <span class="font-bold">You don't have any scanstations yet.</span><br /> | ||||
|     <span>Add the first scanstation</span> | ||||
|   </p> | ||||
| </div> | ||||
|  | ||||
| <!-- <AddContactModal bind:modal_open bind:current_contacts /> --> | ||||
							
								
								
									
										177
									
								
								src/components/scanstations/ScanStationsOverview.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								src/components/scanstations/ScanStationsOverview.svelte
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| <script> | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   import Toastify from "toastify-js"; | ||||
|   import { GroupContactService } from "@odit/lfk-client-js"; | ||||
|   const promise = GroupContactService.groupContactControllerGetAll().then( | ||||
|     (result) => { | ||||
|       current_contacts = result; | ||||
|     } | ||||
|   ); | ||||
|   import store from "../../store"; | ||||
|   import ContactsEmptyState from "./ScanStationsEmptyState.svelte"; | ||||
|   $: searchvalue = ""; | ||||
|   $: active_deletes = []; | ||||
|   export let current_contacts = []; | ||||
| </script> | ||||
|  | ||||
| {#if store.state.jwtinfo.userdetails.permissions.includes('TEAM:GET')} | ||||
|   {#await promise} | ||||
|     <div | ||||
|       class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" | ||||
|       role="alert"> | ||||
|       <p class="font-bold">{$_('contacts-are-being-loaded')}</p> | ||||
|       <p class="text-sm">{$_('this-might-take-a-moment')}</p> | ||||
|     </div> | ||||
|   {:then} | ||||
|     {#if current_contacts.length === 0} | ||||
|       <ContactsEmptyState /> | ||||
|     {:else} | ||||
|       <input | ||||
|         type="search" | ||||
|         bind:value={searchvalue} | ||||
|         placeholder={$_('datatable.search')} | ||||
|         aria-label={$_('datatable.search')} | ||||
|         class="gridjs-input gridjs-search-input mb-4" /> | ||||
|       <div | ||||
|         class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"> | ||||
|         <table class="divide-y divide-gray-200 w-full"> | ||||
|           <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"> | ||||
|                 {$_('name')} | ||||
|               </th> | ||||
|               <th | ||||
|                 scope="col" | ||||
|                 class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> | ||||
|                 {$_('groups')} | ||||
|               </th> | ||||
|               <th | ||||
|                 scope="col" | ||||
|                 class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> | ||||
|                 {$_('address')} | ||||
|               </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_contacts as t} | ||||
|               {#if Object.values(t) | ||||
|                 .toString() | ||||
|                 .toLowerCase() | ||||
|                 .includes(searchvalue)} | ||||
|                 <tr data-rowid="team_{t.id}"> | ||||
|                   <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"> | ||||
|                           {t.firstname} | ||||
|                           {t.middlename || ''} | ||||
|                           {t.lastname} | ||||
|                         </div> | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   </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"> | ||||
|                           {#if t.groups.length > 0} | ||||
|                             {#each t.groups as g} | ||||
|                               {#if g.responseType === 'RUNNERORGANIZATION'} | ||||
|                                 <a | ||||
|                                   href="../orgs/{g.id}" | ||||
|                                   class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{g.name}</a> | ||||
|                               {:else} | ||||
|                                 <a | ||||
|                                   href="../teams/{g.id}" | ||||
|                                   class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{g.parentGroup.name} | ||||
|                                   > | ||||
|                                   {g.name}</a> | ||||
|                               {/if} | ||||
|                             {/each} | ||||
|                           {:else} | ||||
|                             {$_('contact-is-not-a-member-in-any-group')} | ||||
|                           {/if} | ||||
|                         </div> | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   </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"> | ||||
|                           {#if t.address.address1 !== null} | ||||
|                             {t.address.address1}<br /> | ||||
|                             {t.address.address2 || ''}<br /> | ||||
|                             {t.address.postalcode} | ||||
|                             {t.address.city} | ||||
|                             {t.address.country} | ||||
|                           {/if} | ||||
|                         </div> | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   </td> | ||||
|                   {#if active_deletes[t.id] === true} | ||||
|                     <td | ||||
|                       class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"> | ||||
|                       <button | ||||
|                         on:click={() => { | ||||
|                           active_deletes[t.id] = false; | ||||
|                         }} | ||||
|                         tabindex="0" | ||||
|                         class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button> | ||||
|                       <button | ||||
|                         on:click={() => { | ||||
|                           GroupContactService.groupContactControllerRemove(t.id, false).then( | ||||
|                             (resp) => { | ||||
|                               current_contacts = current_contacts.filter( | ||||
|                                 (obj) => obj.id !== t.id | ||||
|                               ); | ||||
|                               Toastify({ | ||||
|                                 text: $_('contact-deleted'), | ||||
|                                 duration: 500, | ||||
|                                 backgroundColor: | ||||
|                                   'linear-gradient(to right, #00b09b, #96c93d)', | ||||
|                               }).showToast(); | ||||
|                             } | ||||
|                           ); | ||||
|                         }} | ||||
|                         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="./{t.id}" | ||||
|                         class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a> | ||||
|                       {#if store.state.jwtinfo.userdetails.permissions.includes('TEAM:DELETE')} | ||||
|                         <button | ||||
|                           on:click={() => { | ||||
|                             active_deletes[t.id] = true; | ||||
|                           }} | ||||
|                           tabindex="0" | ||||
|                           class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button> | ||||
|                       {/if} | ||||
|                     </td> | ||||
|                   {/if} | ||||
|                 </tr> | ||||
|               {/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> | ||||
|   {/await} | ||||
| {/if} | ||||
							
								
								
									
										1
									
								
								src/components/scanstations/scanstations_empty.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/components/scanstations/scanstations_empty.svg
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| After Width: | Height: | Size: 5.0 KiB | 
		Reference in New Issue
	
	Block a user