Browse Source

schedule all items in requirements.

master
Gisle Aune 7 months ago
parent
commit
cf61cf39c2
  1. 2
      frontend/src/lib/components/common/ModalBody.svelte
  2. 1
      frontend/src/lib/components/contexts/ModalContext.svelte
  3. 3
      frontend/src/lib/components/controls/ScheduledDateInput.svelte
  4. 1
      frontend/src/lib/components/project/RequirementSection.svelte
  5. 85
      frontend/src/lib/modals/MultiScheduleModal.svelte
  6. 2
      frontend/src/routes/[scope=prettyid]/projects/[project=prettyid].svelte

2
frontend/src/lib/components/common/ModalBody.svelte

@ -2,7 +2,7 @@
<style lang="sass">
div.modal-body
padding: 1em
padding: 0 1em
padding-left: 0
flex: 1

1
frontend/src/lib/components/contexts/ModalContext.svelte

@ -23,6 +23,7 @@
| { name: "sprint.edit", sprint: Sprint }
| { name: "sprint.delete", sprint: Sprint }
| { name: "requirement.jump" }
| { name: "" }
interface ModalContextData {
currentModal: Readable<ModalData>

3
frontend/src/lib/components/controls/ScheduledDateInput.svelte

@ -3,6 +3,7 @@
export let value: string;
export let openDate: Date;
export let notScheduledText = "Not Scheduled";
let selected: "none" | "date" | "eod" | "eot" | "eow" | "eonw" | "eonnw" | "eom" | "eonm" | "eoy" | "eony" = !!value ? "date" : "none";
@ -48,7 +49,7 @@
</script>
<select bind:value={selected}>
<option value="none">Not Scheduled</option>
<option value="none">{notScheduledText}</option>
<option value="eod">Today</option>
<option value="eot">Tomorrow</option>
<option value="eow">Sunday</option>

1
frontend/src/lib/components/project/RequirementSection.svelte

@ -24,6 +24,7 @@
<TagRow names={requirement.tags} />
<Markdown source={requirement.description} />
<OptionsRow slot="right">
<Option open={{name: "item.multischedule", items: requirement.items}}><Icon name="calendar" /></Option>
<Option open={{name: "item.create", requirement}}><Icon name="plus" /></Option>
<Option open={{name: "requirement.edit", requirement}}><Icon name="pen" /></Option>
<Option open={{name: "requirement.delete", requirement}} color="red"><Icon name="trash" /></Option>

85
frontend/src/lib/modals/MultiScheduleModal.svelte

@ -0,0 +1,85 @@
<script lang="ts">
import { sl3 } from "$lib/clients/sl3";
import Modal from "$lib/components/common/Modal.svelte";
import ModalBody from "$lib/components/common/ModalBody.svelte";
import { getItemListContext } from "$lib/components/contexts/ItemListContext.svelte";
import { getItemMultiListContext } from "$lib/components/contexts/ItemMultiListContext.svelte";
import { getModalContext } from "$lib/components/contexts/ModalContext.svelte";
import { getProjectContext } from "$lib/components/contexts/ProjectContext.svelte";
import { getSprintListContext } from "$lib/components/contexts/SprintListContext.svelte";
import ScheduledDateInput from "$lib/components/controls/ScheduledDateInput.svelte";
import type Item from "$lib/models/item";
const {currentModal, closeModal} = getModalContext();
const {reloadProject} = getProjectContext();
const {reloadItemList} = getItemListContext();
const {reloadSprintList} = getSprintListContext();
const {reloadItemLists} = getItemMultiListContext();
let items: Item[]
let openedDate: Date
let scheduleDate: string;
let error: string
let loading: boolean
let show: boolean
$: switch ($currentModal.name) {
case "item.multischedule":
init($currentModal.items)
break;
default:
loading = false;
error = null;
show = false;
}
function init(selectedItems: Item[]) {
openedDate = new Date();
items = selectedItems.map(i => ({...i}));
show = true;
scheduleDate = selectedItems.find(i => i.scheduledDate)?.scheduledDate || "";
}
async function submit() {
error = null;
loading = true;
try {
for (const item of items) {
await sl3(fetch).updateItem(item.scopeId, item.id, {
scheduledDate: scheduleDate || void(0),
clearScheduledDate: scheduleDate === "",
});
}
reloadItemLists();
await reloadProject();
await reloadItemList();
await reloadSprintList();
closeModal();
} catch(err) {
if (err.statusCode != null) {
error = err.statusMessage;
} else {
error = err
}
} finally {
loading = false;
}
}
</script>
<form on:submit|preventDefault={submit}>
<Modal closable show={show} verb="Schedule" noun="Items" disabled={loading} error={error}>
<ModalBody>
<label for="stats">Date</label>
<ScheduledDateInput notScheduledText="Clear Scheduled Date" openDate={openedDate} bind:value={scheduleDate} />
<p>This changes the scheduled date on all items in the requirement, regardless of whether they already have a scheduled date.</p>
</ModalBody>
</Modal>
</form>

2
frontend/src/routes/[scope=prettyid]/projects/[project=prettyid].svelte

@ -24,6 +24,7 @@
import ItemAcquireModal from "$lib/modals/ItemAcquireModal.svelte";
import DeletionModal from "$lib/modals/DeletionModal.svelte";
import ProjectCreateEditModal from "$lib/modals/ProjectCreateEditModal.svelte";
import MultiScheduleModal from "$lib/modals/MultiScheduleModal.svelte";
export let project: Project;
</script>
@ -35,4 +36,5 @@
<RequirementCreateModal />
<DeletionModal />
<ProjectCreateEditModal />
<MultiScheduleModal />
</ProjectContext>
Loading…
Cancel
Save