vault/ui/app/components/date-dropdown.js
hashicorp-copywrite[bot] 0b12cdcfd1
[COMPLIANCE] License changes (#22290)
* Adding explicit MPL license for sub-package.

This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository.

* Adding explicit MPL license for sub-package.

This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository.

* Updating the license from MPL to Business Source License.

Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at https://hashi.co/bsl-blog, FAQ at www.hashicorp.com/licensing-faq, and details of the license at www.hashicorp.com/bsl.

* add missing license headers

* Update copyright file headers to BUS-1.1

* Fix test that expected exact offset on hcl file

---------

Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
Co-authored-by: Sarah Thompson <sthompson@hashicorp.com>
Co-authored-by: Brian Kassouf <bkassouf@hashicorp.com>
2023-08-10 18:14:03 -07:00

86 lines
3.3 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
import { ARRAY_OF_MONTHS } from 'core/utils/date-formatters';
import timestamp from 'core/utils/timestamp';
/**
* @module DateDropdown
* DateDropdown components are used to display a dropdown of months and years to handle date selection. Future dates are disabled (current month and year are selectable).
* The component returns an object with selected date info, example: { dateType: 'start', monthIdx: 0, monthName: 'January', year: 2022 }
*
* @example
* ```js
* <DateDropdown @handleSubmit={{this.actionFromParent}} @name="startTime" @submitText="Save" @handleCancel={{this.onCancel}}/>
* ```
* @param {function} handleSubmit - callback function from parent that the date picker triggers on submit
* @param {function} [handleCancel] - optional callback for cancel action, if exists then buttons appear modal style with a light gray background
* @param {string} [dateType] - optional argument to give the selected month/year a type
* @param {string} [submitText] - optional argument to change submit button text
* @param {function} [validateDate] - parent function to validate date selection, receives date object and returns an error message that's passed to the inline alert
*/
export default class DateDropdown extends Component {
currentDate = timestamp.now();
currentYear = this.currentDate.getFullYear(); // integer of year
currentMonthIdx = this.currentDate.getMonth(); // integer of month, 0 indexed
dropdownMonths = ARRAY_OF_MONTHS.map((m, i) => ({ name: m, index: i }));
dropdownYears = Array.from({ length: 5 }, (item, i) => this.currentYear - i);
@tracked maxMonthIdx = 11; // disables months with index greater than this number, initially all months are selectable
@tracked disabledYear = null; // year as integer if current year should be disabled
@tracked selectedMonth = null;
@tracked selectedYear = null;
@tracked invalidDate = null;
@action
selectMonth(month, dropdown) {
this.selectedMonth = month;
// disable current year if selected month is later than current month
this.disabledYear = month.index > this.currentMonthIdx ? this.currentYear : null;
dropdown.close();
}
@action
selectYear(year, dropdown) {
this.selectedYear = year;
// disable months after current month if selected year is current year
this.maxMonthIdx = year === this.currentYear ? this.currentMonthIdx : 11;
dropdown.close();
}
@action
handleSubmit() {
if (this.args.validateDate) {
this.invalidDate = null;
this.invalidDate = this.args.validateDate(new Date(this.selectedYear, this.selectedMonth.index));
if (this.invalidDate) return;
}
const { index, name } = this.selectedMonth;
this.args.handleSubmit({
monthIdx: index,
monthName: name,
year: this.selectedYear,
dateType: this.args.dateType,
});
this.resetDropdown();
}
@action
handleCancel() {
this.args.handleCancel();
this.resetDropdown();
}
resetDropdown() {
this.maxMonthIdx = 11;
this.disabledYear = null;
this.selectedMonth = null;
this.selectedYear = null;
this.invalidDate = null;
}
}