aboutsummaryrefslogtreecommitdiffstats
path: root/apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-06-01 22:20:31 +0200
committerivarlovlie <git@ivarlovlie.no>2022-06-01 22:20:31 +0200
commit9db0f70f75886ab1f97e231a3f9c16fcbbbe04bd (patch)
treeee4386cdffe27eaf0325b4617c7fafefbb9f7d51 /apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte
parent7058f55fe099d6b6dea50558f30a4dc8ee52dde8 (diff)
downloadgreatoffice-9db0f70f75886ab1f97e231a3f9c16fcbbbe04bd.tar.xz
greatoffice-9db0f70f75886ab1f97e231a3f9c16fcbbbe04bd.zip
refactor: Move projects-web to projects
Diffstat (limited to 'apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte')
-rw-r--r--apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte165
1 files changed, 165 insertions, 0 deletions
diff --git a/apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte b/apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte
new file mode 100644
index 0000000..c91e014
--- /dev/null
+++ b/apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte
@@ -0,0 +1,165 @@
+<script lang="ts">
+ import {Temporal} from "@js-temporal/polyfill";
+
+ // TIME
+ let fromTimeValue = "";
+ let fromTimeError = "";
+ let toTimeValue = "";
+ let toTimeError = "";
+
+ function handle_from_time_changed(e) {
+ fromTimeValue = e.target.value;
+ if (fromTimeValue) {
+ fromTimeError = "";
+ }
+ }
+
+ function handle_to_time_changed(e) {
+ toTimeValue = e.target.value;
+ if (toTimeValue) {
+ toTimeError = "";
+ }
+ }
+
+ // DATE
+ let date = Temporal.Now.plainDateTimeISO().toString().substring(0, 10);
+ let dateError = "";
+
+ function is_valid() {
+ let isValid = true;
+ let focusIsSet = false;
+ if (!date) {
+ dateError = "Date is required";
+ isValid = false;
+ if (!focusIsSet) {
+ document.getElementById("date")?.focus();
+ focusIsSet = true;
+ }
+ } else {
+ dateError = "";
+ }
+
+ if (!fromTimeValue) {
+ fromTimeError = "From is required";
+ isValid = false;
+ if (!focusIsSet) {
+ document.getElementById("from")?.focus();
+ focusIsSet = true;
+ }
+ } else if (toTimeValue && fromTimeValue > toTimeValue) {
+ fromTimeError = "From can not be after To";
+ isValid = false;
+ if (!focusIsSet) {
+ document.getElementById("from")?.focus();
+ focusIsSet = true;
+ }
+ } else if (fromTimeValue === toTimeValue) {
+ fromTimeError = "From and To can not be equal";
+ isValid = false;
+ if (!focusIsSet) {
+ document.getElementById("from")?.focus();
+ focusIsSet = true;
+ }
+ } else {
+ fromTimeError = "";
+ }
+
+ if (!toTimeValue) {
+ toTimeError = "To is required";
+ isValid = false;
+ if (!focusIsSet) {
+ document.getElementById("to")?.focus();
+ focusIsSet = true;
+ }
+ } else if (fromTimeValue && toTimeValue < fromTimeValue) {
+ toTimeError = "To can not be before From";
+ isValid = false;
+ if (!focusIsSet) {
+ document.getElementById("to")?.focus();
+ focusIsSet = true;
+ }
+ } else {
+ toTimeError = "";
+ }
+
+ return isValid;
+ }
+
+ export const functions = {
+ get_from_time_value() {
+ return fromTimeValue;
+ },
+ get_to_time_value() {
+ return toTimeValue;
+ },
+ get_date() {
+ return date;
+ },
+ is_valid,
+ reset(focusDate = false) {
+ fromTimeValue = "";
+ toTimeValue = "";
+ if (focusDate) {
+ document.getElementById("date")?.focus();
+ }
+ },
+ set_times(value) {
+ console.log(value);
+ fromTimeValue = value.from.toString().substring(0, 5);
+ toTimeValue = value.to.toString().substring(0, 5);
+ },
+ set_date(new_date: Temporal.PlainDate) {
+ date = new_date.toString();
+ },
+ set_values(values) {
+ const currentTimeZone = Temporal.Now.timeZone().id;
+ const startDate = Temporal.Instant.from(values.start);
+ const stopDate = Temporal.Instant.from(values.stop);
+ fromTimeValue = startDate.toZonedDateTimeISO(currentTimeZone).toPlainTime().toString().substring(0, 5);
+ toTimeValue = stopDate.toZonedDateTimeISO(currentTimeZone).toPlainTime().toString().substring(0, 5);
+ date = startDate.toZonedDateTimeISO(currentTimeZone).toPlainDate().toString();
+ }
+ };
+</script>
+
+<div class="grid gap-xs">
+ <div class="col-4">
+ <label for="date"
+ class="form-label margin-bottom-xxs">Date</label>
+ <input type="date"
+ id="date"
+ class="form-control width-100%"
+ bind:value={date}>
+ {#if dateError}
+ <small class="color-error">{dateError}</small>
+ {/if}
+ </div>
+ <div class="col-4">
+ <label for="from"
+ class="form-label margin-bottom-xxs">From</label>
+ <input id="from"
+ class="form-control width-100%"
+ pattern="[0-9][0-9]:[0-9][0-9]"
+ type="time"
+ bind:value={fromTimeValue}
+ on:input={handle_from_time_changed}
+ />
+ {#if fromTimeError}
+ <small class="color-error">{fromTimeError}</small>
+ {/if}
+ </div>
+ <div class="col-4">
+ <label for="to"
+ class="form-label margin-bottom-xxs">To</label>
+ <input id="to"
+ class="form-control width-100%"
+ pattern="[0-9][0-9]:[0-9][0-9]"
+ type="time"
+ bind:value={toTimeValue}
+ on:input={handle_to_time_changed}
+ />
+ {#if toTimeError}
+ <small class="color-error">{toTimeError}</small>
+ {/if}
+ </div>
+</div>