updates decomm time format. limits decomm time to +7 days. updates interaface for calendars. fixes issue with acl expiresAt

This commit is contained in:
Seyi Adebajo 2018-05-10 17:08:50 -07:00
parent d34afc92e0
commit 01813e843c
12 changed files with 170 additions and 92 deletions

View File

@ -6,12 +6,25 @@ import { action } from 'ember-decorators/object';
import { IAccessControlAccessTypeOption } from 'wherehows-web/typings/api/datasets/aclaccess';
import { getDefaultRequestAccessControlEntry } from 'wherehows-web/utils/datasets/acl-access';
/**
* Returns the number of days in milliseconds, default is 1 day
* @param {number} [day=1] the number of days to scale
*/
const millisecondDays = (day = 1) => day * 24 * 60 * 60 * 1000;
/**
* Date object with the minimum selectable date for acl request expiration,
* at least 1 day from now
* @type {Date}
*/
const minSelectableExpirationDate = new Date(Date.now() + 24 * 60 * 60 * 1000);
const minSelectableExpirationDate = new Date(Date.now() + millisecondDays());
/**
* Date object with the maximum selectable date for acl request expiration,
* up to 7 days from now
* @type {Date}
*/
const maxSelectableExpirationDate = new Date(Date.now() + millisecondDays(7));
export default class DatasetAclAccess extends Component {
/**
@ -42,6 +55,13 @@ export default class DatasetAclAccess extends Component {
*/
minSelectableExpirationDate: Date = minSelectableExpirationDate;
/**
* The furthest date a user can select as an expiration date
* @type {Date}
* @memberof DatasetAclAccess
*/
maxSelectableExpirationDate: Date = maxSelectableExpirationDate;
/**
* External action invoked on change to access request access type
* @type {(option: IAccessControlAccessTypeOption) => void}

View File

@ -3,6 +3,7 @@ import { getProperties, computed, set } from '@ember/object';
import ComputedProperty, { oneWay } from '@ember/object/computed';
import { baseCommentEditorOptions } from 'wherehows-web/constants';
import { action } from 'ember-decorators/object';
import { IDatasetView } from 'wherehows-web/typings/api/datasets/dataset';
export default class DatasetDeprecation extends Component {
tagName = 'div';
@ -25,10 +26,10 @@ export default class DatasetDeprecation extends Component {
/**
* Date the dataset should be decommissioned
* @type {Date}
* @type {IDatasetView.decommissionTime}
* @memberof DatasetAclAccess
*/
decommissionDate: Date;
decommissionTime: IDatasetView['decommissionTime'];
/**
* The earliest date a user can select as a decommission date
@ -90,13 +91,13 @@ export default class DatasetDeprecation extends Component {
/**
* The external action to be completed when a save is initiated
* @type {(isDeprecated: boolean, updateDeprecationNode: string, decommissionDate: Date) => Promise<void>}
* @type {(isDeprecated: boolean, updateDeprecationNode: string, decommissionTime: Date | null) => Promise<void>}
* @memberof DatasetDeprecation
*/
onUpdateDeprecation: (
isDeprecated: boolean,
updateDeprecationNode: string,
decommissionDate: Date
decommissionTime: Date | null
) => Promise<void> | void;
editorOptions = {
@ -115,32 +116,33 @@ export default class DatasetDeprecation extends Component {
}
/**
* Handles updates to the decommissionDate attribute
* @param {Date} decommissionDate date dataset should be decommissioned
* Handles updates to the decommissionTime attribute
* @param {Date} decommissionTime date dataset should be decommissioned
*/
@action
onDecommissionDateChange(this: DatasetDeprecation, decommissionDate: Date) {
set(this, 'decommissionDate', decommissionDate);
onDecommissionDateChange(this: DatasetDeprecation, decommissionTime: Date) {
set(this, 'decommissionTime', new Date(decommissionTime).getTime());
}
/**
* Invokes the save action with the updated values for
* deprecated decommissionDate, and deprecationNote
* deprecated decommissionTime, and deprecationNote
* @return {Promise<void>}
*/
@action
async onSave(this: DatasetDeprecation) {
const { deprecatedAlias, deprecationNoteAlias, decommissionDate } = getProperties(this, [
const { deprecatedAlias, deprecationNoteAlias, decommissionTime } = getProperties(this, [
'deprecatedAlias',
'deprecationNoteAlias',
'decommissionDate'
'decommissionTime'
]);
const { onUpdateDeprecation } = this;
if (onUpdateDeprecation) {
const noteValue = deprecatedAlias ? deprecationNoteAlias : '';
const time = decommissionTime ? new Date(decommissionTime) : null;
await onUpdateDeprecation(!!deprecatedAlias, noteValue || '', decommissionDate);
await onUpdateDeprecation(!!deprecatedAlias, noteValue || '', time);
set(this, 'deprecationNoteAlias', noteValue);
}
}

View File

@ -28,6 +28,12 @@ export default class DatasetPropertiesContainer extends Component {
*/
deprecationNote: IDatasetView['deprecationNote'];
/**
* Time when the dataset will be decommissioned
* @type {IDatasetView.decommissionTime}
*/
decommissionTime: IDatasetView['decommissionTime'];
/**
* THe list of properties for the dataset, currently unavailable for v2
* @type {any[]}
@ -61,15 +67,15 @@ export default class DatasetPropertiesContainer extends Component {
getDeprecationPropertiesTask = task(function*(
this: DatasetPropertiesContainer
): IterableIterator<Promise<IDatasetView>> {
const { deprecated, deprecationNote }: IDatasetView = yield readDatasetByUrn(get(this, 'urn'));
setProperties(this, { deprecated, deprecationNote });
const { deprecated, deprecationNote, decommissionTime }: IDatasetView = yield readDatasetByUrn(get(this, 'urn'));
setProperties(this, { deprecated, deprecationNote, decommissionTime });
});
/**
* Persists the changes to the dataset deprecation properties upstream
* @param {boolean} isDeprecated
* @param {string} updatedDeprecationNote
* @param {Date} decommissionDate dataset decommission date
* @param {Date} decommissionTime dataset decommission date
* @return {Promise<void>}
*/
@action
@ -77,7 +83,7 @@ export default class DatasetPropertiesContainer extends Component {
this: DatasetPropertiesContainer,
isDeprecated: boolean,
updatedDeprecationNote: string,
decommissionDate: Date
decommissionTime: Date | null
): Promise<void> {
const { notify } = get(this, 'notifications');
@ -86,7 +92,7 @@ export default class DatasetPropertiesContainer extends Component {
get(this, 'urn'),
isDeprecated,
updatedDeprecationNote || '',
decommissionDate
isDeprecated && decommissionTime ? decommissionTime.getTime() : null
);
notify(NotificationEvent.success, {

View File

@ -86,6 +86,15 @@ $gray-color: rgb(234, 234, 234);
outline: none;
}
}
&__cal-dropdown {
box-shadow: rgba(0, 0, 0, 0.172549) 0 6px 12px 0;
border: 1px solid get-color(black, 0.3);
}
&__cal-input-trigger {
padding: item-spacing(1);
}
}
.acl-table {

View File

@ -31,6 +31,15 @@
&__decommission-calendar {
@include ember-power-calendar($cell-size: item-spacing(7), $primary-color: get-color(blue7));
}
&__cal-input-trigger {
padding: item-spacing(1);
}
&__cal-dropdown {
box-shadow: rgba(0, 0, 0, 0.172549) 0 6px 12px 0;
border: 1px solid get-color(black, 0.3);
}
}
.dataset-deprecation-header {

View File

@ -69,40 +69,52 @@
<h4 class="acl-form__meta__header">When should your access expire?</h4>
<p class="acl-form__meta__content ">If not specified, defaults to 2 days from now</p>
{{#power-calendar
selected=selectedDate
center=centeredDate
class="acl-expiration-calendar"
onSelect=(action "onExpirationDateChange" value="date")
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
{{#basic-dropdown as |dropdown|}}
<input type="text"
placeholder="Enter Date"
data-ebd-id="{{dropdown.uniqueId}}-trigger"
class="acl-form__cal-input-trigger"
value={{if userAclRequest.expiresAt (moment-format (mult userAclRequest.expiresAt 1000) 'DD-MMM-YYYY')}}
onclick={{dropdown.actions.toggle}}
readonly>
<nav class="ember-power-calendar-nav">
{{#dropdown.content class="acl-form__cal-dropdown"}}
{{#power-calendar
selected=selectedDate
center=centeredDate
class="acl-expiration-calendar"
onSelect=(action "onExpirationDateChange" value="date")
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter -1 'month'}}>
&lt;
</button>
<div class="ember-power-calendar-nav-title">
{{moment-format calendar.center 'MMMM YYYY'}}
<nav class="ember-power-calendar-nav">
<p>
{{if hasValidExpiration (concat "Expires in " (moment-from-now calendar.selected))}}
</p>
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter -1 'month'}}>
&lt;
</button>
<div class="ember-power-calendar-nav-title">
{{moment-format calendar.center 'MMMM YYYY'}}
</div>
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter 1 'month'}}>
&gt;
</button>
</nav>
<p>
{{if hasValidExpiration (concat "Expires in " (moment-from-now calendar.selected))}}
</p>
{{calendar.days minDate=minSelectableExpirationDate}}
</div>
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter 1 'month'}}>
&gt;
</button>
</nav>
{{/power-calendar}}
{{calendar.days minDate=minSelectableExpirationDate maxDate=maxSelectableExpirationDate}}
{{/power-calendar}}
{{/dropdown.content}}
{{/basic-dropdown}}
</div>
<div class="comment-new__actions">

View File

@ -28,43 +28,56 @@
<h4 class="dataset-deprecation-header">When should this dataset be decommissioned?</h4>
{{#power-calendar
selected=selectedDate
center=centeredDate
class="dataset-deprecation-toggle__decommission-calendar"
onSelect=(action "onDecommissionDateChange" value="date")
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
{{#basic-dropdown as |dropdown|}}
<input type="text"
placeholder="Enter Date"
data-ebd-id="{{dropdown.uniqueId}}-trigger"
class="dataset-deprecation-toggle__cal-input-trigger"
value={{if decommissionTime (moment-format decommissionTime 'DD-MMM-YYYY')}}
onclick={{dropdown.actions.toggle}}
readonly>
<nav class="ember-power-calendar-nav">
{{#dropdown.content class="dataset-deprecation-toggle__cal-dropdown"}}
{{#power-calendar
selected=selectedDate
center=centeredDate
class="dataset-deprecation-toggle__decommission-calendar"
onSelect=(action "onDecommissionDateChange" value="date")
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter -1 'month'}}>
&lt;
</button>
<div class="ember-power-calendar-nav-title">
{{moment-format calendar.center 'MMMM YYYY'}}
</div>
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter 1 'month'}}>
&gt;
</button>
</nav>
<nav class="ember-power-calendar-nav">
{{calendar.days minDate=minSelectableDecommissionDate}}
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter -1 'month'}}>
&lt;
</button>
<div class="ember-power-calendar-nav-title">
{{moment-format calendar.center 'MMMM YYYY'}}
</div>
<button
type="button"
class="ember-power-calendar-nav-control"
onclick={{action calendar.actions.moveCenter 1 'month'}}>
&gt;
</button>
</nav>
{{/power-calendar}}
{{calendar.days minDate=minSelectableDecommissionDate}}
<p class="decommission-date {{unless decommissionDate 'decommission-date--required'}}">
{{#unless decommissionDate}}
Please specify a date when this dataset will be decommissioned
{{/power-calendar}}
{{/dropdown.content}}
{{/basic-dropdown}}
<p class="decommission-date {{unless decommissionTime 'decommission-date--required'}}">
{{#unless decommissionTime}}
Please specify a date when this dataset will be decommissioned
{{/unless}}
<strong>
{{if decommissionDate (concat 'Will be decommissioned on ' (moment-format decommissionDate 'MMMM DD YYYY')) ''}}
{{if decommissionTime (concat 'Will be decommissioned on ' (moment-format decommissionTime 'MMMM DD YYYY')) ''}}
</strong>
</p>
@ -73,8 +86,8 @@
<div class="dataset-deprecation-toggle__actions">
<button
type="submit"
disabled={{and deprecatedAlias (not decommissionDate)}}
class="nacho-button--large nacho-button--secondary">
class="nacho-button--large nacho-button--secondary"
disabled={{and deprecatedAlias (not decommissionTime)}}>
Update Deprecation Status
</button>
</div>

View File

@ -1,6 +1,7 @@
{{dataset-deprecation
deprecated=deprecated
deprecationNote=deprecationNote
decommissionTime=decommissionTime
onUpdateDeprecation=(action "updateDeprecation")
}}

View File

@ -44,6 +44,7 @@ interface IDatasetView {
deprecationNote: string;
createdTime: number;
modifiedTime: number;
decommissionTime: number | null;
}
/**

View File

@ -187,21 +187,21 @@ const readPinotProperties = async (id: number) => {
* @param {string} urn
* @param {boolean} deprecated
* @param {string} deprecationNote
* @param {Date} decommissionDate
* @param {Date | null} decommissionTime
* @return {Promise<void>}
*/
const updateDatasetDeprecationByUrn = (
urn: string,
deprecated: boolean,
deprecationNote: string = '',
decommissionDate: Date
decommissionTime: number | null
): Promise<void> =>
putJSON<void>({
url: datasetDeprecationUrlByUrn(urn),
data: {
deprecated,
deprecationNote,
decommissionTime: decommissionDate
decommissionTime
}
});

View File

@ -35,13 +35,13 @@
"broccoli-merge-trees": "^2.0.0",
"codecov": "^3.0.0",
"ember-ajax": "^3.0.0",
"ember-basic-dropdown": "^1.0.0",
"ember-cli": "~2.18.0",
"ember-cli-app-version": "^3.0.0",
"ember-cli-babel": "^6.6.0",
"ember-cli-bootstrap-sassy": "^0.5.8",
"ember-cli-code-coverage": "theseyi/ember-cli-code-coverage",
"ember-cli-dependency-checker": "^2.0.0",
"ember-cli-dependency-lint": "^1.0.3",
"ember-cli-eslint": "^4.2.1",
"ember-cli-eyeglass": "^3.3.1",
"ember-cli-htmlbars": "^2.0.1",

View File

@ -2779,6 +2779,14 @@ ember-basic-dropdown@^0.34.0:
ember-native-dom-helpers "^0.5.4"
ember-wormhole "^0.5.2"
ember-basic-dropdown@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-1.0.0.tgz#bbafcaab986ba86dfe8d02b0f8529984229bd738"
dependencies:
ember-cli-babel "^6.12.0"
ember-cli-htmlbars "^2.0.3"
ember-maybe-in-element "^0.1.3"
ember-cli-app-version@^3.0.0:
version "3.1.3"
resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-3.1.3.tgz#26d25f5e653ff0106f0b39da6d75518ba8ed282d"
@ -2814,7 +2822,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.1.0, e
ember-cli-version-checker "^2.1.0"
semver "^5.4.1"
ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.9, ember-cli-babel@^6.11.0, ember-cli-babel@^6.8.2:
ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.9, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.8.2:
version "6.12.0"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.12.0.tgz#3adcdbe1278da1fcd0b9038f1360cb4ac5d4414c"
dependencies:
@ -2884,15 +2892,6 @@ ember-cli-dependency-checker@^2.0.0:
resolve "^1.5.0"
semver "^5.3.0"
ember-cli-dependency-lint@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/ember-cli-dependency-lint/-/ember-cli-dependency-lint-1.0.3.tgz#44699b889e2ba2ccaacbfbe62a738ed7bdb80955"
dependencies:
archy "^1.0.0"
broccoli-plugin "^1.3.0"
chalk "^2.3.0"
semver "^5.5.0"
ember-cli-eslint@^4.2.1:
version "4.2.3"
resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598"
@ -3460,6 +3459,12 @@ ember-maybe-import-regenerator@^0.1.5:
ember-cli-babel "^6.0.0-beta.4"
regenerator-runtime "^0.9.5"
ember-maybe-in-element@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-0.1.3.tgz#1c89be49246e580c1090336ad8be31e373f71b60"
dependencies:
ember-cli-babel "^6.11.0"
ember-metrics@^0.12.1:
version "0.12.1"
resolved "https://registry.yarnpkg.com/ember-metrics/-/ember-metrics-0.12.1.tgz#8659343bf7b8bda403e70d482ff59cc9714d89f6"
@ -8298,7 +8303,7 @@ semver-diff@^2.0.0:
dependencies:
semver "^5.0.3"
"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.5.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0:
"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.5.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1:
version "5.5.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"