|
1 | 1 | <svelte:options immutable={true} /> |
2 | 2 |
|
3 | 3 | <script lang="ts"> |
4 | | - import { planModelActivityTypes, subsystemTags } from '../stores/plan'; |
| 4 | + import CloseIcon from '@nasa-jpl/stellar/icons/close.svg?component'; |
| 5 | + import UploadIcon from '@nasa-jpl/stellar/icons/upload.svg?component'; |
| 6 | + import { plan, planModelActivityTypes, subsystemTags } from '../stores/plan'; |
5 | 7 | import type { ActivityType } from '../types/activity'; |
| 8 | + import type { User } from '../types/app'; |
6 | 9 | import type { TimelineItemType } from '../types/timeline'; |
| 10 | + import effects from '../utilities/effects'; |
| 11 | + import { permissionHandler } from '../utilities/permissionHandler'; |
| 12 | + import { featurePermissions } from '../utilities/permissions'; |
| 13 | + import { tooltip } from '../utilities/tooltip'; |
7 | 14 | import TimelineItemList from './TimelineItemList.svelte'; |
| 15 | + import Input from './form/Input.svelte'; |
| 16 | +
|
| 17 | + export let user: User | null; |
| 18 | +
|
| 19 | + const uploadPermissionError: string = 'You do not have permission to upload activities.'; |
| 20 | +
|
| 21 | + let hasUploadPermission: boolean = false; |
| 22 | + let isUploadVisible: boolean = false; |
| 23 | + let uploadFiles: FileList | undefined; |
| 24 | + let uploadFileInput: HTMLInputElement; |
| 25 | +
|
| 26 | + $: if (user !== null && $plan !== null) { |
| 27 | + hasUploadPermission = featurePermissions.activityDirective.canCreate(user, $plan); |
| 28 | + } |
8 | 29 |
|
9 | 30 | function getFilterValueFromItem(item: TimelineItemType) { |
10 | 31 | return (item as ActivityType).subsystem_tag?.id ?? -1; |
11 | 32 | } |
| 33 | +
|
| 34 | + function onShowUpload() { |
| 35 | + isUploadVisible = true; |
| 36 | + } |
| 37 | +
|
| 38 | + function onHideUpload() { |
| 39 | + isUploadVisible = false; |
| 40 | + } |
| 41 | +
|
| 42 | + async function onUpload() { |
| 43 | + if (uploadFiles !== undefined) { |
| 44 | + if ($plan && uploadFiles?.length) { |
| 45 | + await effects.uploadActivities($plan, uploadFiles, user); |
| 46 | + } |
| 47 | + uploadFileInput.value = ''; |
| 48 | + uploadFiles = undefined; |
| 49 | + onHideUpload(); |
| 50 | + } |
| 51 | + } |
12 | 52 | </script> |
13 | 53 |
|
14 | 54 | <TimelineItemList |
|
19 | 59 | {getFilterValueFromItem} |
20 | 60 | filterOptions={$subsystemTags.map(s => ({ color: s.color || '', label: s.name, value: s.id }))} |
21 | 61 | filterName="Subsystem" |
22 | | -/> |
| 62 | +> |
| 63 | + <div slot="header" class="upload-container" hidden={!isUploadVisible}> |
| 64 | + <button class="close-upload" type="button" on:click={onHideUpload}> |
| 65 | + <CloseIcon /> |
| 66 | + </button> |
| 67 | + <Input layout="stacked"> |
| 68 | + <label class="st-typography-body" for="file">Activity File</label> |
| 69 | + <input |
| 70 | + class="w-full text-xs" |
| 71 | + name="file" |
| 72 | + type="file" |
| 73 | + accept="application/json,.csv,.txt" |
| 74 | + bind:files={uploadFiles} |
| 75 | + bind:this={uploadFileInput} |
| 76 | + use:permissionHandler={{ |
| 77 | + hasPermission: hasUploadPermission, |
| 78 | + permissionError: uploadPermissionError, |
| 79 | + }} |
| 80 | + /> |
| 81 | + </Input> |
| 82 | + <div class="upload-button-container"> |
| 83 | + <button |
| 84 | + class="st-button secondary" |
| 85 | + disabled={!uploadFiles?.length} |
| 86 | + on:click={onUpload} |
| 87 | + use:permissionHandler={{ |
| 88 | + hasPermission: hasUploadPermission, |
| 89 | + permissionError: uploadPermissionError, |
| 90 | + }} |
| 91 | + > |
| 92 | + Upload |
| 93 | + </button> |
| 94 | + </div> |
| 95 | + </div> |
| 96 | + <svelte:fragment slot="button"> |
| 97 | + <button |
| 98 | + class="st-button secondary" |
| 99 | + on:click={onShowUpload} |
| 100 | + use:permissionHandler={{ |
| 101 | + hasPermission: hasUploadPermission, |
| 102 | + permissionError: uploadPermissionError, |
| 103 | + }} |
| 104 | + use:tooltip={{ content: 'Upload Activities' }} |
| 105 | + > |
| 106 | + <UploadIcon /> |
| 107 | + </button> |
| 108 | + </svelte:fragment> |
| 109 | +</TimelineItemList> |
| 110 | + |
| 111 | +<style> |
| 112 | + .upload-container { |
| 113 | + background: var(--st-gray-15); |
| 114 | + border-radius: 5px; |
| 115 | + margin: 5px; |
| 116 | + padding: 8px 11px 8px; |
| 117 | + position: relative; |
| 118 | + } |
| 119 | +
|
| 120 | + .upload-container[hidden] { |
| 121 | + display: none; |
| 122 | + } |
| 123 | +
|
| 124 | + .upload-container { |
| 125 | + display: grid; |
| 126 | + row-gap: 8px; |
| 127 | + } |
| 128 | +
|
| 129 | + .upload-container :global(.upload-button-container) { |
| 130 | + display: flex; |
| 131 | + flex-flow: row-reverse; |
| 132 | + } |
| 133 | +
|
| 134 | + .upload-container :global(.close-upload) { |
| 135 | + background: none; |
| 136 | + border: 0; |
| 137 | + cursor: pointer; |
| 138 | + height: 1.3rem; |
| 139 | + padding: 0; |
| 140 | + position: absolute; |
| 141 | + right: 3px; |
| 142 | + top: 3px; |
| 143 | + } |
| 144 | +</style> |
0 commit comments