import Component from '@ember/component'; // @ts-ignore: Ignore import of compiled template import layout from '../templates/components/entity-deprecation'; import { action } from '@ember/object'; import { reads } from '@ember/object/computed'; import { classNames } from '@ember-decorators/component'; import moment from 'moment'; import { set } from '@ember/object'; /** * This component was made as a tab to handle the deprecation scenario for entities on DataHub, but is made generic to * be usable or extendable for a general deprecation scenarios * * @example * {{datahub/entity-deprecation * entityName="Pokemon" * deprecated=boolDeprecated * deprecationNote=stringDeprecationNote * decommissionTime=timestampDecommissionTime * entityDecommissionWikiLink=hashWikiLinks.entityDecommission * onUpdateDeprecation=functionOrActionUpdateDeprecation}} */ @classNames('entity-deprecation') export default class EntityDeprecation extends Component { layout = layout; /** * Name of the current entity that we are dealing with. Originally this was "dataset" but is * now expanding * @type {string} */ entityName!: string; /** * Flag indicating whether the current entity has been deprecated * @type {boolean} */ isDeprecated!: boolean; /** * Text string, intended to indicate the reason for deprecation * @type {string} */ deprecationNote!: string; /** * Time when the dataset will be decommissioned * @type {number} */ decommissionTime!: number; /** * Expected to be passed in from a containing component, will be called to actually update the * component with the new user input * @param {boolean} isDeprecated - new deprecation state * @param {string} note - new deprecation note * @param {number} time - new deprecation time as unix timestamp */ updateDeprecation!: (isDeprecated: boolean, note: string, time: number | null) => Promise; /** * Currently selected date, used in the calendar dropdown component * @type {Date} */ selectedDate: Date = new Date(); /** * Date around which the calendar is centered * @type {Date} */ centeredDate: Date = this.selectedDate; /** * Expected to be passed in if we plan on using the default entity deprecation acknowledgement template, * leads to a more info link for the user about deprecation of such entity * @type {string | undefined} */ entityDecommissionWikiLink?: string; /** * The earliest date a user can select as a decommission date * @type {Date} */ minSelectableDecommissionDate: Date = new Date( moment() .add(1, 'days') .valueOf() ); /** * Working reference to the entity's deprecated flag, made to be edited by the user * @type {ComputedProperty} */ @reads('isDeprecated') isDeprecatedAlias!: EntityDeprecation['isDeprecated']; /** * Working reference to the entity's deprecationNote, made to be edited by the user * @type {ComputedProperty} */ @reads('deprecationNote') deprecationNoteAlias!: EntityDeprecation['deprecationNote']; /** * Invokes the save action with the updated values for deprecated status, decommission time, and * deprecation note. The actual save functionality should be handled by */ @action async onUpdateDeprecation(): Promise { const { isDeprecatedAlias, deprecationNoteAlias, decommissionTime } = this; const noteValue = isDeprecatedAlias ? deprecationNoteAlias : ''; const time = decommissionTime || null; await this.updateDeprecation(!!isDeprecatedAlias, noteValue || '', time); set(this, 'deprecationNoteAlias', noteValue); } /** * Toggle the boolean value of our deprecated alias. */ @action toggleDeprecatedStatus(): void { this.toggleProperty('isDeprecatedAlias'); } /** * Handles updates to the decommission time, triggered by our power calendar component through user * clicking on the date input * @param {Date} decommissionTime - date the entity should be decomissioned */ @action onDecommissionDateChange(decommissionTime: Date): void { set(this, 'decommissionTime', new Date(decommissionTime).getTime()); } }