From 62d59ec9e0a17a42e138ce90a26219b11f587910 Mon Sep 17 00:00:00 2001 From: Bloom Date: Tue, 12 Oct 2021 15:04:37 +0200 Subject: [PATCH 1/4] Project timeline webpart for project level (#503) Co-authored-by: TinHoangVu <88658344+TinHoangVu@users.noreply.github.com> Co-authored-by: Ole Martin Pettersen --- CHANGELOG.md | 7 + .../@Shared/.vscode/settings.json | 26 +- SharePointFramework/@Shared/package-lock.json | 2 +- SharePointFramework/@Shared/package.json | 2 +- .../@Shared/src/models/SectionModel.ts | 6 +- .../PortfolioWebParts/.npmignore | 1 + .../PortfolioWebParts/.vscode/settings.json | 19 +- .../config/package-solution.json | 2 +- .../PortfolioWebParts/package-lock.json | 10 +- .../PortfolioWebParts/package.json | 4 +- .../ProjectTimeline.module.scss | 14 - .../ProjectTimeline.overrides.css | 5 + .../Timeline/Timeline.module.scss | 16 + .../{ => Timeline}/Timeline.overrides.css | 0 .../ProjectTimeline/Timeline/index.tsx | 104 ++ .../src/components/ProjectTimeline/index.tsx | 152 +- .../PortfolioWebParts/src/loc/nb-no.js | 2 +- .../webparts/benefitsOverview/manifest.json | 2 +- .../src/webparts/latestProjects/manifest.json | 2 +- .../portfolioAggregation/manifest.json | 2 +- .../webparts/portfolioInsights/manifest.json | 2 +- .../webparts/portfolioOverview/manifest.json | 2 +- .../src/webparts/projectList/manifest.json | 2 +- .../webparts/projectTimeline/manifest.json | 2 +- .../webparts/resourceAllocation/manifest.json | 2 +- .../ProjectExtensions/.vscode/settings.json | 22 +- .../ProjectExtensions/package-lock.json | 139 +- .../ProjectExtensions/package.json | 2 +- .../ProjectWebParts/.vscode/settings.json | 4 +- .../ProjectWebParts/config/config.json | 9 + .../config/package-solution.json | 2 +- .../ProjectWebParts/package-lock.json | 1493 ++++++++++++++--- .../ProjectWebParts/package.json | 11 +- .../components/ProjectInformation/index.tsx | 1 + .../TimelineSection.module.scss | 5 + .../Sections/TimelineSection/index.tsx | 42 + .../Sections/TimelineSection/types.ts | 9 + .../ProjectStatus/Sections/index.ts | 1 + .../src/components/ProjectStatus/index.tsx | 13 +- .../ProjectTimeline.module.scss | 35 + .../src/components/ProjectTimeline/index.tsx | 716 ++++++++ .../src/components/ProjectTimeline/types.ts | 145 ++ .../ProjectWebParts/src/loc/en-us.js | 30 +- .../ProjectWebParts/src/loc/mystrings.d.ts | 28 + .../ProjectWebParts/src/loc/nb-no.js | 30 +- .../ProjectWebParts/src/models/index.ts | 2 +- .../webparts/projectInformation/manifest.json | 2 +- .../src/webparts/projectPhases/manifest.json | 2 +- .../src/webparts/projectStatus/manifest.json | 2 +- .../src/webparts/projectTimeline/index.ts | 61 + .../webparts/projectTimeline/manifest.json | 36 + .../src/webparts/riskMatrix/manifest.json | 2 +- SharePointFramework/README.md | 1 + .../Portfolio/Objects/ContentTypes/@.xml | 1 + .../Objects/ContentTypes/Tidslinjeseksjon.xml | 17 + .../Objects/Lists/Statusseksjoner.xml | 10 + .../Objects/Lists/Tidslinjeinnhold.xml | 2 +- Templates/Portfolio/Resources.en-US.resx | 6 + Templates/Portfolio/Resources.no-NB.resx | 6 + Templates/_JsonTemplate.json | 32 + 60 files changed, 2820 insertions(+), 487 deletions(-) create mode 100644 SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.overrides.css create mode 100644 SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/Timeline.module.scss rename SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/{ => Timeline}/Timeline.overrides.css (100%) create mode 100644 SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/index.tsx create mode 100644 SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/TimelineSection.module.scss create mode 100644 SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/index.tsx create mode 100644 SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/types.ts create mode 100644 SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss create mode 100644 SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/index.tsx create mode 100644 SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/types.ts create mode 100644 SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/index.ts create mode 100644 SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/manifest.json create mode 100644 Templates/Portfolio/Objects/ContentTypes/Tidslinjeseksjon.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index ef5841854..84021fd24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,13 @@ Every change is marked with issue ID. - Fixed UI bug by downgrading the `office-ui-fabric-react` package version to `6.214.0` #535 - Fixed redirect after creating a new project status #530 +## 1.3.0 - TBA + +## Added + +- Added a new section in "ProjectStatus" for timelinelist #506 +- Added a new project webpart, 'Prosjekttidslinje' for showcasing projects and items for the current project on a timeline #497 + ## 1.2.9 - 08.09.2021 ## Added diff --git a/SharePointFramework/@Shared/.vscode/settings.json b/SharePointFramework/@Shared/.vscode/settings.json index 27d898b71..a2dcc367f 100644 --- a/SharePointFramework/@Shared/.vscode/settings.json +++ b/SharePointFramework/@Shared/.vscode/settings.json @@ -1,9 +1,19 @@ - { - "files.exclude": { - "**/.git": true, - "**/.DS_Store": true, - "**/node_modules": true, - "**/lib": true, - } - } \ No newline at end of file + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/bower_components": true, + "**/coverage": true, + "**/lib-amd": true, + "src/**/*.scss.ts": true, + "dist": true, + "lib": true, + "node_modules": true, + "sharepoint": true, + "temp": true, + "teams": true, + "release": true, + "package-lock*": true + }, + "typescript.tsdk": ".\\node_modules\\typescript\\lib" +} \ No newline at end of file diff --git a/SharePointFramework/@Shared/package-lock.json b/SharePointFramework/@Shared/package-lock.json index a1d7d0013..318075884 100644 --- a/SharePointFramework/@Shared/package-lock.json +++ b/SharePointFramework/@Shared/package-lock.json @@ -1,6 +1,6 @@ { "name": "pp365-shared", - "version": "1.2.13", + "version": "1.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/SharePointFramework/@Shared/package.json b/SharePointFramework/@Shared/package.json index 40cb8c633..12d69b745 100644 --- a/SharePointFramework/@Shared/package.json +++ b/SharePointFramework/@Shared/package.json @@ -3,7 +3,7 @@ "engines": { "node": ">=12.13.0" }, - "version": "1.2.13", + "version": "1.3.3", "description": "Shared utilities, helpers and models", "main": "lib/index.js", "scripts": { diff --git a/SharePointFramework/@Shared/src/models/SectionModel.ts b/SharePointFramework/@Shared/src/models/SectionModel.ts index 9c59dbef4..e1a746419 100644 --- a/SharePointFramework/@Shared/src/models/SectionModel.ts +++ b/SharePointFramework/@Shared/src/models/SectionModel.ts @@ -3,7 +3,8 @@ export enum SectionType { StatusSection, RiskSection, ProjectPropertiesSection, - ListSection + ListSection, + TimelineSection } export class SectionModel { @@ -64,5 +65,8 @@ export class SectionModel { if (this._item.ContentTypeId.indexOf('0x01004CEFE616A94A3A48A27D9DEBDF5EC82805') !== -1) { return SectionType.ListSection } + if (this._item.ContentTypeId.indexOf('0x01004CEFE616A94A3A48A27D9DEBDF5EC82806') !== -1) { + return SectionType.TimelineSection + } } } diff --git a/SharePointFramework/PortfolioWebParts/.npmignore b/SharePointFramework/PortfolioWebParts/.npmignore index e4e1dcbb5..47913edb1 100644 --- a/SharePointFramework/PortfolioWebParts/.npmignore +++ b/SharePointFramework/PortfolioWebParts/.npmignore @@ -6,6 +6,7 @@ nbproject manifest.mf build.xml node_modules/* +sharepoint/* npm-debug.log *.ts !*.d.ts diff --git a/SharePointFramework/PortfolioWebParts/.vscode/settings.json b/SharePointFramework/PortfolioWebParts/.vscode/settings.json index f1d8a0d55..a2dcc367f 100644 --- a/SharePointFramework/PortfolioWebParts/.vscode/settings.json +++ b/SharePointFramework/PortfolioWebParts/.vscode/settings.json @@ -1,18 +1,19 @@ -// Place your settings in this file to overwrite default and user settings. { - // Configure glob patterns for excluding files and folders in the file explorer. "files.exclude": { - "lib": true, - "dist": true, - "node_modules": false, - "sharepoint": true, - "temp": true, "**/.git": true, "**/.DS_Store": true, - "**/node_modules": true, + "**/bower_components": true, "**/coverage": true, "**/lib-amd": true, - "src/**/*.scss.ts": true + "src/**/*.scss.ts": true, + "dist": true, + "lib": true, + "node_modules": true, + "sharepoint": true, + "temp": true, + "teams": true, + "release": true, + "package-lock*": true }, "typescript.tsdk": ".\\node_modules\\typescript\\lib" } \ No newline at end of file diff --git a/SharePointFramework/PortfolioWebParts/config/package-solution.json b/SharePointFramework/PortfolioWebParts/config/package-solution.json index e46e7ff39..def71d0a6 100644 --- a/SharePointFramework/PortfolioWebParts/config/package-solution.json +++ b/SharePointFramework/PortfolioWebParts/config/package-solution.json @@ -3,7 +3,7 @@ "solution": { "name": "pp-portfolio-web-parts", "id": "00483367-68e2-4977-9cc3-6cf0de623daa", - "version": "1.2.9.0", + "version": "1.3.1.0", "includeClientSideAssets": true, "skipFeatureDeployment": true, "webApiPermissionRequests": [ diff --git a/SharePointFramework/PortfolioWebParts/package-lock.json b/SharePointFramework/PortfolioWebParts/package-lock.json index f9f67fd38..348d4b9d3 100644 --- a/SharePointFramework/PortfolioWebParts/package-lock.json +++ b/SharePointFramework/PortfolioWebParts/package-lock.json @@ -1,6 +1,6 @@ { "name": "pp365-portfoliowebparts", - "version": "1.2.9", + "version": "1.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -20102,7 +20102,7 @@ "get-value": "3.0.1", "msgraph-helper": "0.7.1", "office-ui-fabric-react": "6.214.0", - "pp365-shared": "^1.2.13", + "pp365-shared": "^1.3.3", "pzl-spfx-components": "0.0.11", "react": "16.8.5", "react-dom": "16.8.5", @@ -20651,9 +20651,9 @@ } }, "pp365-shared": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.2.13.tgz", - "integrity": "sha512-fZjip8Dr+6c8oJYte/k7wElBe0WJ36k4eKc9gl6jndjFrhYQSDcPsbGAHVeCDL6hlTSrLrEH7GCfLnLJXl9USw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.3.tgz", + "integrity": "sha512-xykYhuX1lPLONqu+/yZLKXXv/KsgotDvqiuLtPJkFlp5v/6dUZ9AQM6RgtQhc1Y/tBPJCH5f0TicC3Y9LomR0w==", "requires": { "@microsoft/sp-core-library": "1.11.0", "@microsoft/sp-page-context": "1.11.0", diff --git a/SharePointFramework/PortfolioWebParts/package.json b/SharePointFramework/PortfolioWebParts/package.json index 400b21446..7a3ae40ea 100644 --- a/SharePointFramework/PortfolioWebParts/package.json +++ b/SharePointFramework/PortfolioWebParts/package.json @@ -1,6 +1,6 @@ { "name": "pp365-portfoliowebparts", - "version": "1.2.9", + "version": "1.3.1", "engines": { "node": ">=12.13.0" }, @@ -43,7 +43,7 @@ "object-assign": "4.1.1", "office-ui-fabric-react": "6.214.0", "pp365-projectwebparts": "latest", - "pp365-shared": "latest", + "pp365-shared": "1.3.3", "pzl-react-reusable-components": "^0.0.14", "react": "16.9.0", "react-calendar-timeline": "0.27.0", diff --git a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss index 11fdc25fb..26c752d8b 100644 --- a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss +++ b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss @@ -22,19 +22,5 @@ .infoText { padding: 23px 32px 23px 32px; } - .timeline { - margin: 0px auto; - padding: 0 32px 0 32px; - font-size: 12px !important; - - .timelineItem { - cursor: pointer !important; - .itemContent { - text-overflow: ellipsis; - white-space: nowrap; - width: 100%; - } - } - } } } \ No newline at end of file diff --git a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.overrides.css b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.overrides.css new file mode 100644 index 000000000..1d2819b0e --- /dev/null +++ b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/ProjectTimeline.overrides.css @@ -0,0 +1,5 @@ +.react-calendar-timeline .rct-header-root { + position: sticky; + top: 0; + z-index: 100; +} diff --git a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/Timeline.module.scss b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/Timeline.module.scss new file mode 100644 index 000000000..0fc9f193d --- /dev/null +++ b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/Timeline.module.scss @@ -0,0 +1,16 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.timeline { + margin: 0px auto; + padding: 0 32px 0 32px; + font-size: 12px !important; + + .timelineItem { + cursor: pointer !important; + .itemContent { + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + } + } +} \ No newline at end of file diff --git a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline.overrides.css b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/Timeline.overrides.css similarity index 100% rename from SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline.overrides.css rename to SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/Timeline.overrides.css diff --git a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/index.tsx b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/index.tsx new file mode 100644 index 000000000..e9d8a9f50 --- /dev/null +++ b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/Timeline/index.tsx @@ -0,0 +1,104 @@ +import { ITimelineItem, ITimelineGroup } from 'interfaces' +import ReactTimeline, { + ReactCalendarGroupRendererProps, + ReactCalendarItemRendererProps, + TimelineMarkers, + TodayMarker +} from 'react-calendar-timeline' +import 'react-calendar-timeline/lib/Timeline.css' +import * as strings from 'PortfolioWebPartsStrings' +import styles from './Timeline.module.scss' +import './Timeline.overrides.css' +import moment from 'moment' +import React, { Component } from 'react' + +export interface ITimelineProps { + defaultTimeStart?: [number, moment.unitOfTime.DurationConstructor] + defaultTimeEnd?: [number, moment.unitOfTime.DurationConstructor] + groups: ITimelineGroup[] + items: ITimelineItem[] + _onItemClick: any +} + +/** + * @component Timeline + * @extends Component + */ +export class Timeline extends Component { + constructor(props: ITimelineProps) { + super(props) + } + + public render(): React.ReactElement { + return ( +
+ + groups={this.props.groups} + items={this.props.items} + stackItems={true} + canMove={false} + canChangeGroup={false} + sidebarWidth={320} + itemRenderer={this._itemRenderer.bind(this)} + groupRenderer={this._groupRenderer.bind(this)} + defaultTimeStart={moment().add(...this.props.defaultTimeStart)} + defaultTimeEnd={moment().add(...this.props.defaultTimeEnd)}> + + + + +
+ ) + } + + /** + * Timeline item renderer + */ + private _itemRenderer(props: ReactCalendarItemRendererProps) { + const htmlProps = props.getItemProps(props.item.itemProps) + + if (props.item.type === strings.MilestoneLabel) + return ( +
this.props._onItemClick(event, props.item)}> +
+
+ ) + + return ( +
this.props._onItemClick(event, props.item)}> +
+ {props.item.title} +
+
+ ) + } + + /** + * Timeline group renderer + */ + private _groupRenderer({ group }: ReactCalendarGroupRendererProps) { + const style: React.CSSProperties = { display: 'block', width: '100%' } + return ( +
+ {group.title} +
+ ) + } +} diff --git a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/index.tsx b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/index.tsx index dcbc38ded..ea3f0623a 100644 --- a/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/index.tsx +++ b/SharePointFramework/PortfolioWebParts/src/components/ProjectTimeline/index.tsx @@ -10,30 +10,20 @@ import { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBa import { format } from 'office-ui-fabric-react/lib/Utilities' import * as strings from 'PortfolioWebPartsStrings' import React, { Component } from 'react' -import Timeline, { - ReactCalendarGroupRendererProps, - ReactCalendarItemRendererProps, - TimelineMarkers, - TodayMarker -} from 'react-calendar-timeline' -import 'react-calendar-timeline/lib/Timeline.css' import _ from 'underscore' import { FilterPanel, IFilterItemProps, IFilterProps } from '../FilterPanel' import { DetailsCallout } from './DetailsCallout' +import { Timeline } from './Timeline' import styles from './ProjectTimeline.module.scss' -import './Timeline.overrides.css' import { IProjectTimelineProps, IProjectTimelineState } from './types' import { ProjectListModel, TimelineContentListModel } from 'models' +import './ProjectTimeline.overrides.css' /** * @component ProjectTimeline * @extends Component */ export class ProjectTimeline extends Component { - public static defaultProps: Partial = { - defaultTimeStart: [-1, 'months'], - defaultTimeEnd: [1, 'years'] - } /** * Constructor * @@ -88,23 +78,13 @@ export class ProjectTimeline extends Component -
- - groups={groups} - items={items} - stackItems={true} - canMove={false} - canChangeGroup={false} - sidebarWidth={320} - itemRenderer={this._itemRenderer.bind(this)} - groupRenderer={this._groupRenderer.bind(this)} - defaultTimeStart={moment().add(...this.props.defaultTimeStart)} - defaultTimeEnd={moment().add(...this.props.defaultTimeEnd)}> - - - - -
+ , item: ITimelineItem) { + this.setState({ showDetails: { element: event.currentTarget, data: item } }) + } + /** * Get filtered data */ @@ -188,6 +178,7 @@ export class ProjectTimeline extends Component { ev.preventDefault() @@ -197,72 +188,6 @@ export class ProjectTimeline extends Component) { - const htmlProps = props.getItemProps(props.item.itemProps) - - if (props.item.type === strings.MilestoneLabel) - return ( -
this._onItemClick(event, props.item)}> -
-
-
- - ) - - return ( -
this._onItemClick(event, props.item)}> -
- {props.item.title} -
-
- ) - } - - /** - * Timeline group renderer - */ - private _groupRenderer({ group }: ReactCalendarGroupRendererProps) { - const style: React.CSSProperties = { display: 'block', width: '100%' } - if (group.type === TimelineGroupType.Role) { - style.fontStyle = 'italic' - } - return ( -
- {group.title} -
- ) - } - - /** - * On item click - * - * @param {React.MouseEvent} event Event - * @param {ITimelineItem} item Item - */ - private _onItemClick(event: React.MouseEvent, item: ITimelineItem) { - this.setState({ showDetails: { element: event.currentTarget, data: item } }) - } - /** * Creating groups based on projects title * @@ -330,13 +255,14 @@ export class ProjectTimeline extends Component { id += items.length - const backgroundColor = item.type === strings.PhaseLabel - ? '#2589d6' - : item.type === strings.MilestoneLabel + const backgroundColor = + item.type === strings.PhaseLabel + ? '#2589d6' + : item.type === strings.MilestoneLabel ? 'transparent' : item.type === strings.SubPhaseLabel - ? '#249ea0' - : '#484848' + ? '#249ea0' + : '#484848' const group = _.find(groups, (grp) => item.title.indexOf(grp.title) !== -1) const style: React.CSSProperties = { @@ -351,13 +277,16 @@ export class ProjectTimeline extends Component { try { const projects = await this.props.dataAdapter.fetchEncrichedProjects() - const timelineItems: any = (await this.props.dataAdapter._fetchTimelineContentItems()).timelineItems + const timelineItems: any = (await this.props.dataAdapter._fetchTimelineContentItems()) + .timelineItems - await Promise.all(projects.map(async (project) => { - const statusReport = (await this.props.dataAdapter._fetchDataForTimelineProject(project.siteId)).statusReports[0] - project['budgetTotal'] = statusReport && statusReport['GtBudgetTotalOWSCURR'] - project['costsTotal'] = statusReport && statusReport['GtCostsTotalOWSCURR'] - project['type'] = strings.ProjectLabel - })) + await Promise.all( + projects.map(async (project) => { + const statusReport = ( + await this.props.dataAdapter._fetchDataForTimelineProject(project.siteId) + ).statusReports[0] + project['budgetTotal'] = statusReport && statusReport['GtBudgetTotalOWSCURR'] + project['costsTotal'] = statusReport && statusReport['GtCostsTotalOWSCURR'] + project['type'] = strings.ProjectLabel + }) + ) const groups = this._transformGroups(projects) const items = this._transformItems(projects, timelineItems, groups) diff --git a/SharePointFramework/PortfolioWebParts/src/loc/nb-no.js b/SharePointFramework/PortfolioWebParts/src/loc/nb-no.js index 8e3e76951..ff6fe16f8 100644 --- a/SharePointFramework/PortfolioWebParts/src/loc/nb-no.js +++ b/SharePointFramework/PortfolioWebParts/src/loc/nb-no.js @@ -102,7 +102,7 @@ define([], function () { ProjectOwner: 'Prosjekteier', ProjectStatusLinkText: 'Gå til prosjektstatus', RecommendationLabel: 'Anbefaling', - ProjectTimelineInfoText: 'Her listes alle prosjektene med start- og sluttdato. Prosjekttidslinjen støtter også faser, delfaser og milepæler, dette opprettes i densentrale tidslinjeinnhold listen. Prosjekter vises med rød farge, faser i blått, delfaser blågrønt, og milepæler i gult', + ProjectTimelineInfoText: 'Her listes alle prosjektene med start- og sluttdato. Prosjekttidslinjen støtter også faser, delfaser og milepæler, dette opprettes i densentrale tidslinjeinnhold listen. Prosjekter vises med rød farge, faser i blått, delfaser blågrønt, og milepæler i gult. For å zoome inn/ut i tidslinje: ALT+Musehjul', ResourceAllocationInfoText: 'Ressursallokering eller fravær som gjelder på tvers av prosjekter legges inn i densentrale ressursallokeringslisten. Disse oppføringene vil vises med blå og rød (fravær) farge i tabellen under. Prosjektallokeringer vises med grønn farge. Fargestyrken til allokeringen baserer seg på allokeringsprosenten.', ResourceLabel: 'Ressurs', ResponsibleLabel: 'Ansvarlig', diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/benefitsOverview/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/benefitsOverview/manifest.json index 3e41e7242..846dde63a 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/benefitsOverview/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/benefitsOverview/manifest.json @@ -3,7 +3,7 @@ "id": "5f925484-cfb4-42ce-9f90-79a874bb8a68", "alias": "BenefitsOverviewWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/latestProjects/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/latestProjects/manifest.json index a70983afb..eca4ac85c 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/latestProjects/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/latestProjects/manifest.json @@ -3,7 +3,7 @@ "id": "941fd73c-b957-41c3-8d4f-082268407f10", "alias": "LatestProjectsWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/portfolioAggregation/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/portfolioAggregation/manifest.json index 3afd965d5..d98563cdc 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/portfolioAggregation/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/portfolioAggregation/manifest.json @@ -3,7 +3,7 @@ "id": "6c0e484d-f6da-40d4-81fc-ec1389ef29a8", "alias": "PortfolioAggregationWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": false, diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/portfolioInsights/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/portfolioInsights/manifest.json index d82500aba..8136a6dc4 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/portfolioInsights/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/portfolioInsights/manifest.json @@ -3,7 +3,7 @@ "id": "875ca87a-e331-4ffb-bc69-0272fdf80e41", "alias": "PortfolioInsightsWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/portfolioOverview/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/portfolioOverview/manifest.json index a6174460a..1b996e998 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/portfolioOverview/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/portfolioOverview/manifest.json @@ -3,7 +3,7 @@ "id": "e58e3d32-057a-4418-97ce-172b92482ba2", "alias": "PortfolioOverviewWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/projectList/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/projectList/manifest.json index c1400924e..639003c1b 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/projectList/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/projectList/manifest.json @@ -3,7 +3,7 @@ "id": "54fbeb7d-e463-4dcc-8873-50a3ab2f0f68", "alias": "ProjectListWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/projectTimeline/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/projectTimeline/manifest.json index 956a62703..ec2259f50 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/projectTimeline/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/projectTimeline/manifest.json @@ -3,7 +3,7 @@ "id": "7284c568-f66c-4218-bb2c-3734a3cfa581", "alias": "ProjectTimelineWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/PortfolioWebParts/src/webparts/resourceAllocation/manifest.json b/SharePointFramework/PortfolioWebParts/src/webparts/resourceAllocation/manifest.json index 90c4ef6c7..c2f186443 100644 --- a/SharePointFramework/PortfolioWebParts/src/webparts/resourceAllocation/manifest.json +++ b/SharePointFramework/PortfolioWebParts/src/webparts/resourceAllocation/manifest.json @@ -3,7 +3,7 @@ "id": "2ef269b2-6370-4841-8b35-2185b7ccb22a", "alias": "ResourceAllocationWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.1", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/ProjectExtensions/.vscode/settings.json b/SharePointFramework/ProjectExtensions/.vscode/settings.json index abd87c795..a2dcc367f 100644 --- a/SharePointFramework/ProjectExtensions/.vscode/settings.json +++ b/SharePointFramework/ProjectExtensions/.vscode/settings.json @@ -1,19 +1,19 @@ -// Place your settings in this file to overwrite default and user settings. { - // Configure glob patterns for excluding files and folders in the file explorer. "files.exclude": { "**/.git": true, "**/.DS_Store": true, - "**/node_modules": true, + "**/bower_components": true, "**/coverage": true, "**/lib-amd": true, - "**/lib": true, - "**/dist": true, - "**/temp": true, "src/**/*.scss.ts": true, - "assets": true + "dist": true, + "lib": true, + "node_modules": true, + "sharepoint": true, + "temp": true, + "teams": true, + "release": true, + "package-lock*": true }, - "files.autoSave": "onWindowChange", - "typescript.tsdk": ".\\node_modules\\typescript\\lib", - "editor.folding": true -} + "typescript.tsdk": ".\\node_modules\\typescript\\lib" +} \ No newline at end of file diff --git a/SharePointFramework/ProjectExtensions/package-lock.json b/SharePointFramework/ProjectExtensions/package-lock.json index e0bcbbd15..fbb5d09ea 100644 --- a/SharePointFramework/ProjectExtensions/package-lock.json +++ b/SharePointFramework/ProjectExtensions/package-lock.json @@ -10024,13 +10024,35 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "cfb": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz", - "integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.1.tgz", + "integrity": "sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ==", "requires": { - "adler-32": "~1.2.0", + "adler-32": "~1.3.0", "crc-32": "~1.2.0", - "printj": "~1.1.2" + "printj": "~1.3.0" + }, + "dependencies": { + "adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "requires": { + "printj": "~1.2.2" + }, + "dependencies": { + "printj": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.3.tgz", + "integrity": "sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA==" + } + } + }, + "printj": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.0.tgz", + "integrity": "sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg==" + } } }, "chalk": { @@ -21421,9 +21443,9 @@ "dev": true }, "pp365-shared": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.2.13.tgz", - "integrity": "sha512-fZjip8Dr+6c8oJYte/k7wElBe0WJ36k4eKc9gl6jndjFrhYQSDcPsbGAHVeCDL6hlTSrLrEH7GCfLnLJXl9USw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.3.tgz", + "integrity": "sha512-xykYhuX1lPLONqu+/yZLKXXv/KsgotDvqiuLtPJkFlp5v/6dUZ9AQM6RgtQhc1Y/tBPJCH5f0TicC3Y9LomR0w==", "requires": { "@microsoft/sp-core-library": "1.11.0", "@microsoft/sp-page-context": "1.11.0", @@ -21458,18 +21480,6 @@ "@microsoft/sp-module-interfaces": "1.11.0", "@types/es6-promise": "0.0.33", "@types/webpack-env": "1.13.1" - }, - "dependencies": { - "@microsoft/sp-module-interfaces": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.11.0.tgz", - "integrity": "sha512-4KCIKM/Q7OLKY/jGWTmkYNtiCibjYh18PAfeXpAfwmnHnABXKsAmC59OP6chFYtHK0RTk55MwpWV34nRSbWZdw==", - "requires": { - "@types/node": "8.10.54", - "@types/z-schema": "3.16.31", - "z-schema": "~3.18.3" - } - } } }, "@microsoft/sp-lodash-subset": { @@ -21482,6 +21492,16 @@ "tslib": "~1.10.0" } }, + "@microsoft/sp-module-interfaces": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.11.0.tgz", + "integrity": "sha512-4KCIKM/Q7OLKY/jGWTmkYNtiCibjYh18PAfeXpAfwmnHnABXKsAmC59OP6chFYtHK0RTk55MwpWV34nRSbWZdw==", + "requires": { + "@types/node": "8.10.54", + "@types/z-schema": "3.16.31", + "z-schema": "~3.18.3" + } + }, "@microsoft/sp-page-context": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.11.0.tgz", @@ -21508,85 +21528,6 @@ "whatwg-fetch": "3.0.0" } }, - "@uifabric/foundation": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-0.8.3.tgz", - "integrity": "sha512-r3WhRj7Out8QAOe50BGA36R8zgRPy0D0GNPuwFK9BB9oIidf91ycj7/miY8U0TZRZi5fB3Kg+dy/uxSDfgC6Og==", - "requires": { - "@uifabric/set-version": "^1.1.3", - "@uifabric/styling": "^6.50.7", - "@uifabric/utilities": "^6.41.7", - "tslib": "^1.7.1" - } - }, - "@uifabric/icons": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-6.5.5.tgz", - "integrity": "sha512-cGjzdpT0jzQ2RJvzlCVTrewaHCi4rb+ZNL2LWoceMi+5h196Y32qJwKMsc0ggR6u5CjMrzBiAxUFNppBSCutdA==", - "requires": { - "@uifabric/set-version": "^1.1.3", - "@uifabric/styling": "^6.50.7", - "tslib": "^1.7.1" - } - }, - "@uifabric/merge-styles": { - "version": "6.19.4", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-6.19.4.tgz", - "integrity": "sha512-bjQdDHxmRIZVPwL//MtErODhEfcRJ2y+zJXoIWNh3T8JfAepeRDdoJ/pGNnnyJxA/AHMtlWt0IgMaz150/nfAA==", - "requires": { - "@uifabric/set-version": "^1.1.3", - "tslib": "^1.7.1" - } - }, - "@uifabric/set-version": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-1.1.3.tgz", - "integrity": "sha512-IYpwVIuN7MJOeiWzZzr9AmFSvA5zc6gJn4fNHtEFIQnNB8WVWIcYrvx8Tbf7wWj9MvhdHYp70F054zZlHbL/Ag==", - "requires": { - "tslib": "^1.7.1" - } - }, - "@uifabric/styling": { - "version": "6.50.7", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-6.50.7.tgz", - "integrity": "sha512-F2aBiB30ZiFxlZzy5hzLXODWOl6jySvPFAsoaTofk37xucHiunBLZYjX6WkfZrCWiyGPva+DLssNcwly9ZHVjg==", - "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/merge-styles": "^6.19.4", - "@uifabric/set-version": "^1.1.3", - "@uifabric/utilities": "^6.41.7", - "tslib": "^1.7.1" - } - }, - "office-ui-fabric-react": { - "version": "6.214.0", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-6.214.0.tgz", - "integrity": "sha512-sYqi0bhZSdEWpQAsHSropoHm0SxLJkdvQDE+3reSnP+rWABD+WCLvMxRuunoQIFjZKDHZ1f+w+L6Nr7nXc+wbQ==", - "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/foundation": "^0.8.3", - "@uifabric/icons": "^6.5.5", - "@uifabric/merge-styles": "^6.19.4", - "@uifabric/set-version": "^1.1.3", - "@uifabric/styling": "^6.50.7", - "@uifabric/utilities": "^6.45.2", - "prop-types": "^15.5.10", - "tslib": "^1.7.1" - }, - "dependencies": { - "@uifabric/utilities": { - "version": "6.45.2", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-6.45.2.tgz", - "integrity": "sha512-JiC92OjMOkVoiIAeS2b3R9B1XQU0cJ5bDr9B7VvrxlwKe1W9xMtVsCer7b8gNCU5NFNYBN5ckM3Q7x2Zs5cH0A==", - "requires": { - "@uifabric/merge-styles": "^6.19.4", - "@uifabric/set-version": "^1.1.3", - "prop-types": "^15.5.10", - "tslib": "^1.7.1" - } - } - } - }, "whatwg-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", diff --git a/SharePointFramework/ProjectExtensions/package.json b/SharePointFramework/ProjectExtensions/package.json index 5194a3794..e8d0ffac7 100644 --- a/SharePointFramework/ProjectExtensions/package.json +++ b/SharePointFramework/ProjectExtensions/package.json @@ -41,7 +41,7 @@ "@uifabric/utilities": "6.45.1", "msgraph-helper": "0.8.3", "office-ui-fabric-react": "6.214.0", - "pp365-shared": "latest", + "pp365-shared": "1.3.3", "react": "16.9.0", "react-dom": "16.9.0", "react-markdown": "4.2.2", diff --git a/SharePointFramework/ProjectWebParts/.vscode/settings.json b/SharePointFramework/ProjectWebParts/.vscode/settings.json index 45370429b..a2dcc367f 100644 --- a/SharePointFramework/ProjectWebParts/.vscode/settings.json +++ b/SharePointFramework/ProjectWebParts/.vscode/settings.json @@ -11,7 +11,9 @@ "node_modules": true, "sharepoint": true, "temp": true, - "teams": true + "teams": true, + "release": true, + "package-lock*": true }, "typescript.tsdk": ".\\node_modules\\typescript\\lib" } \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/config/config.json b/SharePointFramework/ProjectWebParts/config/config.json index 1cdf9b313..faa354453 100644 --- a/SharePointFramework/ProjectWebParts/config/config.json +++ b/SharePointFramework/ProjectWebParts/config/config.json @@ -33,11 +33,20 @@ "manifest": "./src/webparts/riskMatrix/manifest.json" } ] + }, + "project-timeline-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/projectTimeline/index.js", + "manifest": "./src/webparts/projectTimeline/manifest.json" + } + ] } }, "externals": {}, "localizedResources": { "ProjectWebPartsStrings": "lib/loc/{locale}.js", + "PortfolioWebPartsStrings": "node_modules/pp365-portfoliowebparts/lib/loc/{locale}.js", "PzlSPFxComponentsStrings": "lib/loc/{locale}.js", "ControlStrings": "lib/loc/{locale}.js" } diff --git a/SharePointFramework/ProjectWebParts/config/package-solution.json b/SharePointFramework/ProjectWebParts/config/package-solution.json index dd816b99f..a4100abdd 100644 --- a/SharePointFramework/ProjectWebParts/config/package-solution.json +++ b/SharePointFramework/ProjectWebParts/config/package-solution.json @@ -3,7 +3,7 @@ "solution": { "name": "pp-project-web-parts", "id": "b69cb2f2-762d-425d-8e0b-d59c08918831", - "version": "1.2.9.0", + "version": "1.3.0.0", "includeClientSideAssets": true, "skipFeatureDeployment": true, "developer": { diff --git a/SharePointFramework/ProjectWebParts/package-lock.json b/SharePointFramework/ProjectWebParts/package-lock.json index f3220bc5e..0a8c1f4e9 100644 --- a/SharePointFramework/ProjectWebParts/package-lock.json +++ b/SharePointFramework/ProjectWebParts/package-lock.json @@ -1,6 +1,6 @@ { "name": "pp365-projectwebparts", - "version": "1.2.9", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -876,6 +876,31 @@ } } }, + "@fluentui/react-icons": { + "version": "0.1.48", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-0.1.48.tgz", + "integrity": "sha512-0RggbvYm14MlgxcE1d8FZvdWR37l6xbUJT/gNBo5HoA0JB4LlKcqDLVuvmjgvyohsAtjcMCRT6v/UivMeRuOVA==", + "requires": { + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/set-version": "^7.0.21", + "@uifabric/utilities": "^7.28.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@uifabric/utilities": { + "version": "7.33.5", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", + "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", + "requires": { + "@fluentui/dom-utilities": "^1.1.2", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + } + } + } + }, "@fluentui/react-window-provider": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.2.tgz", @@ -950,6 +975,82 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@interactjs/actions": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/actions/-/actions-1.6.2.tgz", + "integrity": "sha512-w9YABLT5E5WBnMX2h496Z5QhfqwU1mDLa5f2yHM3GkLDHBbunxCy1jfGNwY3W6pzNfJO3PzC7fdzvaVZ5fbaqw==" + }, + "@interactjs/auto-scroll": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/auto-scroll/-/auto-scroll-1.6.2.tgz", + "integrity": "sha512-q8O4PNbt1elPMhS/hsjabMEv7YUzioEq1Pu4MOT16QiqPyUMJ9lOBiI2yvHr0uPrLsyn+w2+uffQBB9eNsZrJA==" + }, + "@interactjs/auto-start": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/auto-start/-/auto-start-1.6.2.tgz", + "integrity": "sha512-8Zc96LZOFofpchr3Gk9JnQ8Ino+k+Y9I/G3GkPl/syIIUcAlO3GKjwqeZQG6tQnUnzotgtLnbfBuw4saBNeiow==" + }, + "@interactjs/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.6.2.tgz", + "integrity": "sha512-GfhWgMP7qdD7yOhNFGol8sbVlFQFA/IdaBLMm3VJMdSdjj7Dm9aoW/MZJpCnPZAzX5n0PFnu9XCehmCbG8y4Tw==" + }, + "@interactjs/dev-tools": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/dev-tools/-/dev-tools-1.6.2.tgz", + "integrity": "sha512-peAVTxQ6AE6msEBviFHVIgQzazxOAPCPmRXgSDSJf3Ot1CW09ZCQ7jtJyieeASvOFrhrxbjqKKsW68AjdbC13g==", + "requires": { + "@interactjs/utils": "1.6.2" + } + }, + "@interactjs/inertia": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/inertia/-/inertia-1.6.2.tgz", + "integrity": "sha512-7/i0ov5wHsZqrfwzFJXQETbAlOEH99PSjtKnTpQP8kM7g5xYp4qpitkx0vnzwK/OJBY8rFs1wCa0DNaDFVoWWw==" + }, + "@interactjs/interact": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/interact/-/interact-1.6.2.tgz", + "integrity": "sha512-1fNsEjaa+ygYC9q9NazZWahUwFq8oj9COapNDcytr/UwY6qzjmp9o2rOGgwTQ38J+UNfkcrEAxnB+q9Fkk6aDw==" + }, + "@interactjs/modifiers": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/modifiers/-/modifiers-1.6.2.tgz", + "integrity": "sha512-AHR/rDFNURX4RnjrL00XvbQ1VIwf0HutKpc9qqmeYP2Sk1Kzv/Fp6BPsbY2CqUS30wxaBrnEMWYP9qIKPy2ElQ==" + }, + "@interactjs/pointer-events": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/pointer-events/-/pointer-events-1.6.2.tgz", + "integrity": "sha512-Y9Qfk33PQ1ZIPLQpVOKW7hbELilUuNyP9Y9bZCzPvEr1aWPwSiL3R9NCyCekE4dpwV+sQ7J1uVccPFoJpAw6ug==" + }, + "@interactjs/reflow": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/reflow/-/reflow-1.6.2.tgz", + "integrity": "sha512-hbYk7qHruy7rsHdLTh9FvE0O16Q75D6POlo+NeuVpjCoYI2GxKPsmZQA7CxSgGg+Akqz72hOeBihFtvtwMxcXg==" + }, + "@interactjs/types": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.6.2.tgz", + "integrity": "sha512-3m+LGbiLp7qYncojhwoBmQP4Aap3YBb526aX/vJtg5rqNeTXd4KfWl6+5VdTawwZAZSptYDes/z6S1uH1pXpSQ==", + "requires": { + "@interactjs/actions": "1.6.2", + "@interactjs/auto-scroll": "1.6.2", + "@interactjs/auto-start": "1.6.2", + "@interactjs/core": "1.6.2", + "@interactjs/dev-tools": "1.6.2", + "@interactjs/inertia": "1.6.2", + "@interactjs/interact": "1.6.2", + "@interactjs/modifiers": "1.6.2", + "@interactjs/pointer-events": "1.6.2", + "@interactjs/reflow": "1.6.2", + "@interactjs/utils": "1.6.2" + } + }, + "@interactjs/utils": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@interactjs/utils/-/utils-1.6.2.tgz", + "integrity": "sha512-VXHN1vP2H18DOjcl5WPHbr1FzAfwIf4gv3Y3jqReYpEwH8RVn/NdW/0FF2Of/WZM07697rkN5wVPFWNAvo4zZw==" + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2250,6 +2351,27 @@ "prop-types": "^15.7.2", "tslib": "^1.10.0" } + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } } } }, @@ -3826,6 +3948,27 @@ "prop-types": "^15.7.2", "tslib": "^1.10.0" } + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } } } }, @@ -3949,6 +4092,27 @@ "prop-types": "^15.7.2", "tslib": "^1.10.0" } + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } } } }, @@ -4019,6 +4183,27 @@ "prop-types": "^15.7.2", "tslib": "^1.10.0" } + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } } } }, @@ -4076,6 +4261,29 @@ "prop-types": "^15.7.2", "tslib": "^1.10.0" } + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } } } }, @@ -5449,6 +5657,11 @@ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, + "@types/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-RvlCHZdp+XAlFtVxHxG5LY3rj4GIr65FquoniYpE5/oXX22Z6w/LYt2I2sBt87V+qmltHfcySM98LdkJ/fqi7w==" + }, "@types/babel__core": { "version": "7.1.15", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", @@ -6959,8 +7172,7 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { "version": "0.2.4", @@ -7395,6 +7607,11 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "batch-processor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", + "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -7985,13 +8202,35 @@ "dev": true }, "cfb": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz", - "integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.1.tgz", + "integrity": "sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ==", "requires": { - "adler-32": "~1.2.0", + "adler-32": "~1.3.0", "crc-32": "~1.2.0", - "printj": "~1.1.2" + "printj": "~1.3.0" + }, + "dependencies": { + "adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "requires": { + "printj": "~1.2.2" + }, + "dependencies": { + "printj": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.3.tgz", + "integrity": "sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA==" + } + } + }, + "printj": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.0.tgz", + "integrity": "sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg==" + } } }, "chalk": { @@ -8332,6 +8571,11 @@ } } }, + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", @@ -8349,6 +8593,16 @@ } } }, + "clean-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/clean-deep/-/clean-deep-3.0.2.tgz", + "integrity": "sha512-sLUtFxYtHc3jM9pmwyYXOLln0nnQ1OhFrefQ7nqUlva1crHDbi4gVO+nnMSm5jztFXIRDMt+kMNh0mOscbARow==", + "requires": { + "lodash.isempty": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.transform": "^4.6.0" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -9371,6 +9625,15 @@ "sha.js": "^2.4.8" } }, + "create-react-context": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", + "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -10402,6 +10665,14 @@ "integrity": "sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A==", "dev": true }, + "element-resize-detector": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.3.tgz", + "integrity": "sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ==", + "requires": { + "batch-processor": "1.0.0" + } + }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -11632,6 +11903,27 @@ "bser": "2.1.1" } }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, "fflate": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz", @@ -12270,6 +12562,11 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gulp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", @@ -12831,6 +13128,11 @@ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", "dev": true }, + "highcharts": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-6.2.0.tgz", + "integrity": "sha512-A4E89MA+kto8giic7zyLU6ZxfXnVeCUlKOyzFsah3+n4BROx4bgonl92KIBtwLud/mIWir8ahqhuhe2by9LakQ==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -13350,6 +13652,14 @@ "integrity": "sha1-SsIZcQ7Hpy9GD/lL9CTdPvDlKBc=", "dev": true }, + "interactjs": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.6.2.tgz", + "integrity": "sha512-JC0RV8eTrPltXI8Ld6p3BPy3Wi4piSPSJsd1D8Md8bAW8Wcyn2pnBrcC0jaPk/s/0SXzOWL4Jr1ZuurnSHbfUQ==", + "requires": { + "@interactjs/types": "1.6.2" + } + }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", @@ -16566,6 +16876,11 @@ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", "dev": true }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -16586,8 +16901,7 @@ "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" }, "lodash.isstring": { "version": "4.0.1", @@ -16668,6 +16982,11 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=" + }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -16866,6 +17185,11 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -19549,46 +19873,76 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "pp365-shared": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.2.13.tgz", - "integrity": "sha512-fZjip8Dr+6c8oJYte/k7wElBe0WJ36k4eKc9gl6jndjFrhYQSDcPsbGAHVeCDL6hlTSrLrEH7GCfLnLJXl9USw==", + "pp365-portfoliowebparts": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pp365-portfoliowebparts/-/pp365-portfoliowebparts-1.3.1.tgz", + "integrity": "sha512-arMH2u3J6O0vT0Vw0hNtvP3FUuegb6YAfZRQvVeq0Bp24v146c5DsQJwClhbIDlvW5m5giPCYJuVUwez4YjKHQ==", "requires": { - "@microsoft/sp-core-library": "1.11.0", - "@microsoft/sp-page-context": "1.11.0", + "@microsoft/sp-core-library": "1.12.1", + "@microsoft/sp-lodash-subset": "1.12.1", + "@microsoft/sp-office-ui-fabric-core": "1.12.1", + "@microsoft/sp-property-pane": "1.12.1", + "@microsoft/sp-webpart-base": "1.12.1", "@pnp/common": "1.3.8", "@pnp/logging": "1.3.8", "@pnp/odata": "1.3.8", - "@pnp/polyfill-ie11": "^1.0.2", + "@pnp/polyfill-ie11": "1.0.2", "@pnp/sp": "1.3.8", "@pnp/sp-clientsvc": "1.3.8", "@pnp/sp-taxonomy": "1.3.8", - "es6-promise": "^4.2.8", - "file-saver": "^2.0.5", - "gulp": "^4.0.2", - "object-get": "^2.1.0", + "@pnp/spfx-controls-react": "1.11.0", + "@reduxjs/toolkit": "1.5.0", + "@types/array-sort": "1.0.0", + "array-sort": "1.0.0", + "clean-deep": "3.0.2", + "interactjs": "1.6.2", + "jsom-ctx": "1.2.0", + "moment": "2.24.0", + "msgraph-helper": "0.7.3", + "object-assign": "4.1.1", "office-ui-fabric-react": "6.214.0", - "react-markdown": "^4.2.2", - "scriptjs": "^2.5.9", - "sp-entityportal-service": "1.3.3", + "pp365-projectwebparts": "^1.3.0", + "pp365-shared": "1.3.0", + "pzl-react-reusable-components": "^0.0.14", + "react": "16.9.0", + "react-calendar-timeline": "0.27.0", + "react-dom": "16.9.0", + "react-highcharts": "16.0.2", + "react-image-fade-in": "1.0.2", "sp-hubsite-service": "0.7.1", - "spfx-jsom": "0.6.6", - "underscore": "^1.9.1", - "xlsx": "^0.16.9", - "xmldom": "^0.1.27" + "underscore": "1.9.1" }, "dependencies": { - "@microsoft/sp-core-library": { + "@microsoft/microsoft-graph-client": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-1.7.0.tgz", + "integrity": "sha512-+XT4t7MogOnsdXRFUe4ekPE5QbpKvW3M/fgacmj6azw4knNJ3MaricngB/BRBmgDnJ9ZOqwGnJUb/tJ3ipqGCA==", + "requires": { + "es6-promise": "^4.2.6", + "isomorphic-fetch": "^2.2.1", + "tslib": "^1.9.3" + } + }, + "@microsoft/sp-diagnostics": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", - "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "resolved": "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.11.0.tgz", + "integrity": "sha512-Z+PoZY0wSGNpwQUCUqKGQz5AqE++Cgsul1afVNGRTTlYMzf1mot+GGX0ZxWGCU27awe4yf6+aEdzbsp8L7bfmw==", "requires": { - "@microsoft/sp-lodash-subset": "1.11.0", - "@microsoft/sp-module-interfaces": "1.11.0", - "@types/es6-promise": "0.0.33", - "@types/webpack-env": "1.13.1" + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0" }, "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "requires": { + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, "@microsoft/sp-lodash-subset": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", @@ -19598,19 +19952,64 @@ "@types/webpack-env": "1.13.1", "tslib": "~1.10.0" } + } + } + }, + "@microsoft/sp-dynamic-data": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.11.0.tgz", + "integrity": "sha512-PRr1sA6M2f3lqFKlRGu+QMPAE/G91XoEC4LegiTYleK1i7WWrTpeU+yZohak8iQEZQsQ+e5alJZg+Xg3sdQKCQ==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-diagnostics": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "requires": { + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } }, - "@microsoft/sp-module-interfaces": { + "@microsoft/sp-lodash-subset": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.11.0.tgz", - "integrity": "sha512-4KCIKM/Q7OLKY/jGWTmkYNtiCibjYh18PAfeXpAfwmnHnABXKsAmC59OP6chFYtHK0RTk55MwpWV34nRSbWZdw==", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", "requires": { - "@types/node": "8.10.54", - "@types/z-schema": "3.16.31", - "z-schema": "~3.18.3" + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" } } } }, + "@microsoft/sp-module-interfaces": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.11.0.tgz", + "integrity": "sha512-4KCIKM/Q7OLKY/jGWTmkYNtiCibjYh18PAfeXpAfwmnHnABXKsAmC59OP6chFYtHK0RTk55MwpWV34nRSbWZdw==", + "requires": { + "@types/node": "8.10.54", + "@types/z-schema": "3.16.31", + "z-schema": "~3.18.3" + } + }, + "@microsoft/sp-odata-types": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.11.0.tgz", + "integrity": "sha512-uIA4WsgvTlQ58R9H+svg0Hm2du1zz5w1FJ7VbT3f4TI9HW3zC+wItPgNAbxWddtx0s1jNoDxQFqQooAqTWxVCQ==", + "requires": { + "tslib": "~1.10.0" + } + }, "@microsoft/sp-page-context": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.11.0.tgz", @@ -19626,27 +20025,15 @@ "tslib": "~1.10.0" }, "dependencies": { - "@microsoft/sp-diagnostics": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.11.0.tgz", - "integrity": "sha512-Z+PoZY0wSGNpwQUCUqKGQz5AqE++Cgsul1afVNGRTTlYMzf1mot+GGX0ZxWGCU27awe4yf6+aEdzbsp8L7bfmw==", - "requires": { - "@microsoft/sp-core-library": "1.11.0", - "@microsoft/sp-lodash-subset": "1.11.0" - } - }, - "@microsoft/sp-dynamic-data": { + "@microsoft/sp-core-library": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.11.0.tgz", - "integrity": "sha512-PRr1sA6M2f3lqFKlRGu+QMPAE/G91XoEC4LegiTYleK1i7WWrTpeU+yZohak8iQEZQsQ+e5alJZg+Xg3sdQKCQ==", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", "requires": { - "@microsoft/sp-core-library": "1.11.0", - "@microsoft/sp-diagnostics": "1.11.0", "@microsoft/sp-lodash-subset": "1.11.0", "@microsoft/sp-module-interfaces": "1.11.0", "@types/es6-promise": "0.0.33", - "@types/webpack-env": "1.13.1", - "tslib": "~1.10.0" + "@types/webpack-env": "1.13.1" } }, "@microsoft/sp-lodash-subset": { @@ -19658,24 +20045,6 @@ "@types/webpack-env": "1.13.1", "tslib": "~1.10.0" } - }, - "@microsoft/sp-module-interfaces": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.11.0.tgz", - "integrity": "sha512-4KCIKM/Q7OLKY/jGWTmkYNtiCibjYh18PAfeXpAfwmnHnABXKsAmC59OP6chFYtHK0RTk55MwpWV34nRSbWZdw==", - "requires": { - "@types/node": "8.10.54", - "@types/z-schema": "3.16.31", - "z-schema": "~3.18.3" - } - }, - "@microsoft/sp-odata-types": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.11.0.tgz", - "integrity": "sha512-uIA4WsgvTlQ58R9H+svg0Hm2du1zz5w1FJ7VbT3f4TI9HW3zC+wItPgNAbxWddtx0s1jNoDxQFqQooAqTWxVCQ==", - "requires": { - "tslib": "~1.10.0" - } } } }, @@ -19695,139 +20064,762 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==" }, - "@uifabric/utilities": { - "version": "7.33.5", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", - "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", + "create-react-context": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", "requires": { - "@fluentui/dom-utilities": "^1.1.2", - "@uifabric/merge-styles": "^7.19.2", - "@uifabric/set-version": "^7.0.24", - "prop-types": "^15.7.2", - "tslib": "^1.10.0" + "gud": "^1.0.0", + "warning": "^4.0.3" } }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "jsom-ctx": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsom-ctx/-/jsom-ctx-1.2.0.tgz", + "integrity": "sha512-yIc56IbC6r2Gl6xuBx12E475+QK06qrKm/npGlaSf3GIPzNlX28hG41yMGIGXqXwu45ttlK1xN9H1/xYsWJukw==" + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "msgraph-helper": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/msgraph-helper/-/msgraph-helper-0.7.3.tgz", + "integrity": "sha512-0S6rq3yT++zwU8rny/50ppvdvf3fCYYnq7rnZzwDxrRSCfmFLRPLZt9jJOjEanQeX83PsF/mNIbqW4gahB3WBQ==", "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "@microsoft/microsoft-graph-client": "^1.3.0", + "@microsoft/sp-http": "^1.7.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "pp365-shared": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.0.tgz", + "integrity": "sha512-96swFVByHcWjxwVkRrPAy3Ndbsw1W3lIhmRW8JPd97MKP/SI+XMm/goNVAVtlBf+H156pEjVfJsbOZ9deDd52Q==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-page-context": "1.11.0", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/polyfill-ie11": "^1.0.2", + "@pnp/sp": "1.3.8", + "@pnp/sp-clientsvc": "1.3.8", + "@pnp/sp-taxonomy": "1.3.8", + "es6-promise": "^4.2.8", + "file-saver": "^2.0.5", + "gulp": "^4.0.2", + "object-get": "^2.1.0", + "office-ui-fabric-react": "6.214.0", + "react-markdown": "^4.2.2", + "scriptjs": "^2.5.9", + "sp-entityportal-service": "1.3.3", + "sp-hubsite-service": "0.7.1", + "spfx-jsom": "0.6.6", + "underscore": "^1.9.1", + "xlsx": "^0.16.9", + "xmldom": "^0.1.27" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "requires": { + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-lodash-subset": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", + "requires": { + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + } + } }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", "requires": { - "is-extglob": "^2.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" } }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + "react-calendar-timeline": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-calendar-timeline/-/react-calendar-timeline-0.27.0.tgz", + "integrity": "sha512-LOC7yrLT5bkfZAhfUKDhDkxyYd14dMnb3jXJzkpOyciPJyUwYWhxCDhjxwddfXjcB317NJVpszcqpk7xJw0mQg==", + "requires": { + "classnames": "^2.2.6", + "create-react-context": "^0.3.0", + "element-resize-detector": "^1.1.12", + "lodash.isequal": "^4.5.0", + "memoize-one": "^5.1.1" + } }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "sp-hubsite-service": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/sp-hubsite-service/-/sp-hubsite-service-0.7.1.tgz", + "integrity": "sha512-K/iTecsyWtwM1IPT3cP4vnmXgtYAceI/ciSP+fX5+FTW9AFZDkUNSy6qhbWbUEjRQiGcvwdAIw5bdQLi9fffBg==", "requires": { - "remove-trailing-separator": "^1.0.1" + "@microsoft/sp-page-context": "1.11.0", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/sp": "1.3.8" } }, - "office-ui-fabric-react": { - "version": "6.214.0", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-6.214.0.tgz", - "integrity": "sha512-sYqi0bhZSdEWpQAsHSropoHm0SxLJkdvQDE+3reSnP+rWABD+WCLvMxRuunoQIFjZKDHZ1f+w+L6Nr7nXc+wbQ==", + "spfx-jsom": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/spfx-jsom/-/spfx-jsom-0.6.6.tgz", + "integrity": "sha512-in6HWs4i0f0ocCULoRHYAUko65eywCuJ+MCPPzXlZuQ8ZlIXKqg1/8kTyVEuW0kTXJLMkLG1KsG7GoA4pXTHTA==", "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/foundation": "^0.8.3", - "@uifabric/icons": "^6.5.5", - "@uifabric/merge-styles": "^6.19.4", - "@uifabric/set-version": "^1.1.3", - "@uifabric/styling": "^6.50.7", - "@uifabric/utilities": "^6.45.2", - "prop-types": "^15.5.10", - "tslib": "^1.7.1" + "@microsoft/sp-loader": "^1.9.1", + "jsom-ctx": "^1.2.1" }, "dependencies": { - "@uifabric/foundation": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-0.8.3.tgz", - "integrity": "sha512-r3WhRj7Out8QAOe50BGA36R8zgRPy0D0GNPuwFK9BB9oIidf91ycj7/miY8U0TZRZi5fB3Kg+dy/uxSDfgC6Og==", + "jsom-ctx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jsom-ctx/-/jsom-ctx-1.2.1.tgz", + "integrity": "sha512-JQm3JE7iClm6x2DHsT23x8yB6pF5vZvMbQwFBwhyvY421Tt+b1q+Quy0EuMuTyo4IPMNQFwOUaKvKG/q4Z0qLA==" + } + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + } + } + }, + "pp365-projectwebparts": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pp365-projectwebparts/-/pp365-projectwebparts-1.3.0.tgz", + "integrity": "sha512-Fn8JRCg8HuNVYC1hx+zCBuWcqDs1I5L7HjjTjyEvq9h7y9sb6UHdxg5jANalbmFBMRqvLKDP6m9F2l94BlCUCg==", + "requires": { + "@microsoft/sp-core-library": "1.12.1", + "@microsoft/sp-lodash-subset": "1.12.1", + "@microsoft/sp-office-ui-fabric-core": "1.12.1", + "@microsoft/sp-page-context": "1.12.1", + "@microsoft/sp-property-pane": "1.12.1", + "@microsoft/sp-webpart-base": "1.12.1", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/polyfill-ie11": "1.0.1", + "@pnp/sp": "1.3.8", + "@pnp/sp-clientsvc": "1.3.8", + "@pnp/sp-taxonomy": "1.3.8", + "@pnp/spfx-controls-react": "1.11.0", + "@reduxjs/toolkit": "1.5.0", + "@uifabric/utilities": "6.45.1", + "dom-to-image": "2.6.0", + "get-value": "3.0.1", + "interactjs": "1.6.2", + "msgraph-helper": "0.7.1", + "office-ui-fabric-react": "6.214.0", + "pp365-portfoliowebparts": "1.3.0", + "pp365-shared": "1.3.0", + "pzl-spfx-components": "0.0.11", + "react": "16.8.5", + "react-calendar-timeline": "0.26.0", + "react-dom": "16.8.5", + "react-image-fade-in": "1.0.2", + "react-markdown": "4.2.2", + "react-scroll": "1.7.11", + "sp-entityportal-service": "1.3.3", + "sp-hubsite-service": "0.5.1", + "spfx-jsom": "0.6.0", + "underscore": "1.9.1" + }, + "dependencies": { + "@microsoft/microsoft-graph-client": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-1.7.0.tgz", + "integrity": "sha512-+XT4t7MogOnsdXRFUe4ekPE5QbpKvW3M/fgacmj6azw4knNJ3MaricngB/BRBmgDnJ9ZOqwGnJUb/tJ3ipqGCA==", + "requires": { + "es6-promise": "^4.2.6", + "isomorphic-fetch": "^2.2.1", + "tslib": "^1.9.3" + } + }, + "@microsoft/sp-diagnostics": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.11.0.tgz", + "integrity": "sha512-Z+PoZY0wSGNpwQUCUqKGQz5AqE++Cgsul1afVNGRTTlYMzf1mot+GGX0ZxWGCU27awe4yf6+aEdzbsp8L7bfmw==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", "requires": { - "@uifabric/set-version": "^1.1.3", - "@uifabric/styling": "^6.50.7", - "@uifabric/utilities": "^6.41.7", - "tslib": "^1.7.1" + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" } }, - "@uifabric/icons": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-6.5.5.tgz", - "integrity": "sha512-cGjzdpT0jzQ2RJvzlCVTrewaHCi4rb+ZNL2LWoceMi+5h196Y32qJwKMsc0ggR6u5CjMrzBiAxUFNppBSCutdA==", + "@microsoft/sp-lodash-subset": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", + "requires": { + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + } + } + }, + "@microsoft/sp-dynamic-data": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.11.0.tgz", + "integrity": "sha512-PRr1sA6M2f3lqFKlRGu+QMPAE/G91XoEC4LegiTYleK1i7WWrTpeU+yZohak8iQEZQsQ+e5alJZg+Xg3sdQKCQ==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-diagnostics": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", "requires": { - "@uifabric/set-version": "^1.1.3", - "@uifabric/styling": "^6.50.7", - "tslib": "^1.7.1" + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" } }, - "@uifabric/merge-styles": { - "version": "6.19.4", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-6.19.4.tgz", - "integrity": "sha512-bjQdDHxmRIZVPwL//MtErODhEfcRJ2y+zJXoIWNh3T8JfAepeRDdoJ/pGNnnyJxA/AHMtlWt0IgMaz150/nfAA==", + "@microsoft/sp-lodash-subset": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", "requires": { - "@uifabric/set-version": "^1.1.3", - "tslib": "^1.7.1" + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + } + } + }, + "@microsoft/sp-module-interfaces": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.11.0.tgz", + "integrity": "sha512-4KCIKM/Q7OLKY/jGWTmkYNtiCibjYh18PAfeXpAfwmnHnABXKsAmC59OP6chFYtHK0RTk55MwpWV34nRSbWZdw==", + "requires": { + "@types/node": "8.10.54", + "@types/z-schema": "3.16.31", + "z-schema": "~3.18.3" + } + }, + "@microsoft/sp-odata-types": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.11.0.tgz", + "integrity": "sha512-uIA4WsgvTlQ58R9H+svg0Hm2du1zz5w1FJ7VbT3f4TI9HW3zC+wItPgNAbxWddtx0s1jNoDxQFqQooAqTWxVCQ==", + "requires": { + "tslib": "~1.10.0" + } + }, + "@types/node": { + "version": "8.10.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", + "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==" + }, + "create-react-context": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "jsom-ctx": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsom-ctx/-/jsom-ctx-1.2.0.tgz", + "integrity": "sha512-yIc56IbC6r2Gl6xuBx12E475+QK06qrKm/npGlaSf3GIPzNlX28hG41yMGIGXqXwu45ttlK1xN9H1/xYsWJukw==" + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "pp365-portfoliowebparts": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pp365-portfoliowebparts/-/pp365-portfoliowebparts-1.3.0.tgz", + "integrity": "sha512-tHTzfvIKmqUwwLEA8zTnVBQp/Gel9PiYini1D6hl/T5cXRRz8aRI4ZYCuaXaE9oMGks5vGKbQH8Rq7a9NztR5A==", + "requires": { + "@microsoft/sp-core-library": "1.12.1", + "@microsoft/sp-lodash-subset": "1.12.1", + "@microsoft/sp-office-ui-fabric-core": "1.12.1", + "@microsoft/sp-property-pane": "1.12.1", + "@microsoft/sp-webpart-base": "1.12.1", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/polyfill-ie11": "1.0.2", + "@pnp/sp": "1.3.8", + "@pnp/sp-clientsvc": "1.3.8", + "@pnp/sp-taxonomy": "1.3.8", + "@pnp/spfx-controls-react": "1.11.0", + "@reduxjs/toolkit": "1.5.0", + "@types/array-sort": "1.0.0", + "array-sort": "1.0.0", + "clean-deep": "3.0.2", + "interactjs": "1.6.2", + "jsom-ctx": "1.2.0", + "moment": "2.24.0", + "msgraph-helper": "0.7.3", + "object-assign": "4.1.1", + "office-ui-fabric-react": "6.214.0", + "pp365-projectwebparts": "^1.3.0", + "pp365-shared": "^1.3.3", + "pzl-react-reusable-components": "^0.0.14", + "react": "16.9.0", + "react-calendar-timeline": "0.27.0", + "react-dom": "16.9.0", + "react-highcharts": "16.0.2", + "react-image-fade-in": "1.0.2", + "sp-hubsite-service": "0.7.1", + "underscore": "1.9.1" + }, + "dependencies": { + "@microsoft/sp-page-context": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.11.0.tgz", + "integrity": "sha512-Tn57hYh8OErqIlYSiiggj3S6tjQ1GBKZV2o+dlq+aC1s++BgkCt7ql3jj+gyAC/Hb9cZrK+w12BkPO6P6fH0dQ==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-diagnostics": "1.11.0", + "@microsoft/sp-dynamic-data": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-odata-types": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "requires": { + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-lodash-subset": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", + "requires": { + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + } + } + }, + "@pnp/polyfill-ie11": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnp/polyfill-ie11/-/polyfill-ie11-1.0.2.tgz", + "integrity": "sha512-vJstDMgwCsRWbZIzUJGvBmd8932jL1DwItyESQFV0HWaOKIe5erjnbeVHSOHkxTWNNx/KWDjB2IcbW6er0MfMw==", + "requires": { + "@types/core-js": "2.5.0", + "core-js": "2.6.2", + "es6-map": "0.1.5", + "whatwg-fetch": "3.0.0" + } + }, + "msgraph-helper": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/msgraph-helper/-/msgraph-helper-0.7.3.tgz", + "integrity": "sha512-0S6rq3yT++zwU8rny/50ppvdvf3fCYYnq7rnZzwDxrRSCfmFLRPLZt9jJOjEanQeX83PsF/mNIbqW4gahB3WBQ==", + "requires": { + "@microsoft/microsoft-graph-client": "^1.3.0", + "@microsoft/sp-http": "^1.7.0" + } + }, + "pp365-shared": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.3.tgz", + "integrity": "sha512-xykYhuX1lPLONqu+/yZLKXXv/KsgotDvqiuLtPJkFlp5v/6dUZ9AQM6RgtQhc1Y/tBPJCH5f0TicC3Y9LomR0w==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-page-context": "1.11.0", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/polyfill-ie11": "^1.0.2", + "@pnp/sp": "1.3.8", + "@pnp/sp-clientsvc": "1.3.8", + "@pnp/sp-taxonomy": "1.3.8", + "es6-promise": "^4.2.8", + "file-saver": "^2.0.5", + "gulp": "^4.0.2", + "object-get": "^2.1.0", + "office-ui-fabric-react": "6.214.0", + "react-markdown": "^4.2.2", + "scriptjs": "^2.5.9", + "sp-entityportal-service": "1.3.3", + "sp-hubsite-service": "0.7.1", + "spfx-jsom": "0.6.6", + "underscore": "^1.9.1", + "xlsx": "^0.16.9", + "xmldom": "^0.1.27" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "requires": { + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-lodash-subset": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", + "requires": { + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + } } }, - "@uifabric/set-version": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-1.1.3.tgz", - "integrity": "sha512-IYpwVIuN7MJOeiWzZzr9AmFSvA5zc6gJn4fNHtEFIQnNB8WVWIcYrvx8Tbf7wWj9MvhdHYp70F054zZlHbL/Ag==", + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", "requires": { - "tslib": "^1.7.1" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" } }, - "@uifabric/styling": { - "version": "6.50.7", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-6.50.7.tgz", - "integrity": "sha512-F2aBiB30ZiFxlZzy5hzLXODWOl6jySvPFAsoaTofk37xucHiunBLZYjX6WkfZrCWiyGPva+DLssNcwly9ZHVjg==", + "react-calendar-timeline": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-calendar-timeline/-/react-calendar-timeline-0.27.0.tgz", + "integrity": "sha512-LOC7yrLT5bkfZAhfUKDhDkxyYd14dMnb3jXJzkpOyciPJyUwYWhxCDhjxwddfXjcB317NJVpszcqpk7xJw0mQg==", "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/merge-styles": "^6.19.4", - "@uifabric/set-version": "^1.1.3", - "@uifabric/utilities": "^6.41.7", - "tslib": "^1.7.1" + "classnames": "^2.2.6", + "create-react-context": "^0.3.0", + "element-resize-detector": "^1.1.12", + "lodash.isequal": "^4.5.0", + "memoize-one": "^5.1.1" } }, - "@uifabric/utilities": { - "version": "6.45.2", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-6.45.2.tgz", - "integrity": "sha512-JiC92OjMOkVoiIAeS2b3R9B1XQU0cJ5bDr9B7VvrxlwKe1W9xMtVsCer7b8gNCU5NFNYBN5ckM3Q7x2Zs5cH0A==", + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", "requires": { - "@uifabric/merge-styles": "^6.19.4", - "@uifabric/set-version": "^1.1.3", - "prop-types": "^15.5.10", - "tslib": "^1.7.1" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } + }, + "sp-hubsite-service": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/sp-hubsite-service/-/sp-hubsite-service-0.7.1.tgz", + "integrity": "sha512-K/iTecsyWtwM1IPT3cP4vnmXgtYAceI/ciSP+fX5+FTW9AFZDkUNSy6qhbWbUEjRQiGcvwdAIw5bdQLi9fffBg==", + "requires": { + "@microsoft/sp-page-context": "1.11.0", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/sp": "1.3.8" + } + }, + "spfx-jsom": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/spfx-jsom/-/spfx-jsom-0.6.6.tgz", + "integrity": "sha512-in6HWs4i0f0ocCULoRHYAUko65eywCuJ+MCPPzXlZuQ8ZlIXKqg1/8kTyVEuW0kTXJLMkLG1KsG7GoA4pXTHTA==", + "requires": { + "@microsoft/sp-loader": "^1.9.1", + "jsom-ctx": "^1.2.1" + }, + "dependencies": { + "jsom-ctx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jsom-ctx/-/jsom-ctx-1.2.1.tgz", + "integrity": "sha512-JQm3JE7iClm6x2DHsT23x8yB6pF5vZvMbQwFBwhyvY421Tt+b1q+Quy0EuMuTyo4IPMNQFwOUaKvKG/q4Z0qLA==" + } } } } }, + "pp365-shared": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.0.tgz", + "integrity": "sha512-96swFVByHcWjxwVkRrPAy3Ndbsw1W3lIhmRW8JPd97MKP/SI+XMm/goNVAVtlBf+H156pEjVfJsbOZ9deDd52Q==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-page-context": "1.11.0", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/polyfill-ie11": "^1.0.2", + "@pnp/sp": "1.3.8", + "@pnp/sp-clientsvc": "1.3.8", + "@pnp/sp-taxonomy": "1.3.8", + "es6-promise": "^4.2.8", + "file-saver": "^2.0.5", + "gulp": "^4.0.2", + "object-get": "^2.1.0", + "office-ui-fabric-react": "6.214.0", + "react-markdown": "^4.2.2", + "scriptjs": "^2.5.9", + "sp-entityportal-service": "1.3.3", + "sp-hubsite-service": "0.7.1", + "spfx-jsom": "0.6.6", + "underscore": "^1.9.1", + "xlsx": "^0.16.9", + "xmldom": "^0.1.27" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "requires": { + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-lodash-subset": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", + "requires": { + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + }, + "@microsoft/sp-page-context": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.11.0.tgz", + "integrity": "sha512-Tn57hYh8OErqIlYSiiggj3S6tjQ1GBKZV2o+dlq+aC1s++BgkCt7ql3jj+gyAC/Hb9cZrK+w12BkPO6P6fH0dQ==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-diagnostics": "1.11.0", + "@microsoft/sp-dynamic-data": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-odata-types": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + }, + "@pnp/polyfill-ie11": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnp/polyfill-ie11/-/polyfill-ie11-1.0.2.tgz", + "integrity": "sha512-vJstDMgwCsRWbZIzUJGvBmd8932jL1DwItyESQFV0HWaOKIe5erjnbeVHSOHkxTWNNx/KWDjB2IcbW6er0MfMw==", + "requires": { + "@types/core-js": "2.5.0", + "core-js": "2.6.2", + "es6-map": "0.1.5", + "whatwg-fetch": "3.0.0" + } + }, + "jsom-ctx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jsom-ctx/-/jsom-ctx-1.2.1.tgz", + "integrity": "sha512-JQm3JE7iClm6x2DHsT23x8yB6pF5vZvMbQwFBwhyvY421Tt+b1q+Quy0EuMuTyo4IPMNQFwOUaKvKG/q4Z0qLA==" + }, + "sp-hubsite-service": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/sp-hubsite-service/-/sp-hubsite-service-0.7.1.tgz", + "integrity": "sha512-K/iTecsyWtwM1IPT3cP4vnmXgtYAceI/ciSP+fX5+FTW9AFZDkUNSy6qhbWbUEjRQiGcvwdAIw5bdQLi9fffBg==", + "requires": { + "@microsoft/sp-page-context": "1.11.0", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/sp": "1.3.8" + } + }, + "spfx-jsom": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/spfx-jsom/-/spfx-jsom-0.6.6.tgz", + "integrity": "sha512-in6HWs4i0f0ocCULoRHYAUko65eywCuJ+MCPPzXlZuQ8ZlIXKqg1/8kTyVEuW0kTXJLMkLG1KsG7GoA4pXTHTA==", + "requires": { + "@microsoft/sp-loader": "^1.9.1", + "jsom-ctx": "^1.2.1" + } + } + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + } + } + }, + "pp365-shared": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.3.tgz", + "integrity": "sha512-xykYhuX1lPLONqu+/yZLKXXv/KsgotDvqiuLtPJkFlp5v/6dUZ9AQM6RgtQhc1Y/tBPJCH5f0TicC3Y9LomR0w==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-page-context": "1.11.0", + "@pnp/common": "1.3.8", + "@pnp/logging": "1.3.8", + "@pnp/odata": "1.3.8", + "@pnp/polyfill-ie11": "^1.0.2", + "@pnp/sp": "1.3.8", + "@pnp/sp-clientsvc": "1.3.8", + "@pnp/sp-taxonomy": "1.3.8", + "es6-promise": "^4.2.8", + "file-saver": "^2.0.5", + "gulp": "^4.0.2", + "object-get": "^2.1.0", + "office-ui-fabric-react": "6.214.0", + "react-markdown": "^4.2.2", + "scriptjs": "^2.5.9", + "sp-entityportal-service": "1.3.3", + "sp-hubsite-service": "0.7.1", + "spfx-jsom": "0.6.6", + "underscore": "^1.9.1", + "xlsx": "^0.16.9", + "xmldom": "^0.1.27" + }, + "dependencies": { + "@microsoft/sp-core-library": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.11.0.tgz", + "integrity": "sha512-3/wQzbQp6E2R1tYn6eVmzJl8ay/1uxy+rW8JrDVX4GlzE4tLA+Pz90VuzQOJbmHLn7cgPSJFY3MFRdMjtqZVKg==", + "requires": { + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-diagnostics": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.11.0.tgz", + "integrity": "sha512-Z+PoZY0wSGNpwQUCUqKGQz5AqE++Cgsul1afVNGRTTlYMzf1mot+GGX0ZxWGCU27awe4yf6+aEdzbsp8L7bfmw==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0" + } + }, + "@microsoft/sp-dynamic-data": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.11.0.tgz", + "integrity": "sha512-PRr1sA6M2f3lqFKlRGu+QMPAE/G91XoEC4LegiTYleK1i7WWrTpeU+yZohak8iQEZQsQ+e5alJZg+Xg3sdQKCQ==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-diagnostics": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-module-interfaces": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + }, + "@microsoft/sp-lodash-subset": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.11.0.tgz", + "integrity": "sha512-r2T5HhlEpaX9nWnQkL9CJ6af7t+XQ6gYoSpeqz90VBi0XNN93B2qASjb8lzYPzB23D8Wr8qmTaz53nQj2fA4ow==", + "requires": { + "@types/lodash": "4.14.117", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + }, + "@microsoft/sp-module-interfaces": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.11.0.tgz", + "integrity": "sha512-4KCIKM/Q7OLKY/jGWTmkYNtiCibjYh18PAfeXpAfwmnHnABXKsAmC59OP6chFYtHK0RTk55MwpWV34nRSbWZdw==", + "requires": { + "@types/node": "8.10.54", + "@types/z-schema": "3.16.31", + "z-schema": "~3.18.3" + } + }, + "@microsoft/sp-odata-types": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.11.0.tgz", + "integrity": "sha512-uIA4WsgvTlQ58R9H+svg0Hm2du1zz5w1FJ7VbT3f4TI9HW3zC+wItPgNAbxWddtx0s1jNoDxQFqQooAqTWxVCQ==", + "requires": { + "tslib": "~1.10.0" + } + }, + "@microsoft/sp-page-context": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.11.0.tgz", + "integrity": "sha512-Tn57hYh8OErqIlYSiiggj3S6tjQ1GBKZV2o+dlq+aC1s++BgkCt7ql3jj+gyAC/Hb9cZrK+w12BkPO6P6fH0dQ==", + "requires": { + "@microsoft/sp-core-library": "1.11.0", + "@microsoft/sp-diagnostics": "1.11.0", + "@microsoft/sp-dynamic-data": "1.11.0", + "@microsoft/sp-lodash-subset": "1.11.0", + "@microsoft/sp-odata-types": "1.11.0", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.10.0" + } + }, + "@pnp/polyfill-ie11": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnp/polyfill-ie11/-/polyfill-ie11-1.0.2.tgz", + "integrity": "sha512-vJstDMgwCsRWbZIzUJGvBmd8932jL1DwItyESQFV0HWaOKIe5erjnbeVHSOHkxTWNNx/KWDjB2IcbW6er0MfMw==", + "requires": { + "@types/core-js": "2.5.0", + "core-js": "2.6.2", + "es6-map": "0.1.5", + "whatwg-fetch": "3.0.0" + } + }, + "@types/node": { + "version": "8.10.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", + "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==" + }, "sp-hubsite-service": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/sp-hubsite-service/-/sp-hubsite-service-0.7.1.tgz", @@ -19853,26 +20845,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "yargs": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", - "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.1" - } } } }, @@ -20000,6 +20972,14 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -20110,6 +21090,65 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pzl-react-reusable-components": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/pzl-react-reusable-components/-/pzl-react-reusable-components-0.0.14.tgz", + "integrity": "sha512-gpKxX1VygZoetu53xO5ijRrcR8EEUrg7nQwZLX/xYJbm1ZPwgpptpwMNvPBD9+qfwUkVFa00JaLXiDItZ/1YSA==", + "requires": { + "office-ui-fabric-react": "7.106.3", + "react": "16.8.5", + "react-dom": "16.8.5", + "react-markdown": "4.3.1" + }, + "dependencies": { + "@uifabric/utilities": { + "version": "7.33.5", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.33.5.tgz", + "integrity": "sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==", + "requires": { + "@fluentui/dom-utilities": "^1.1.2", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + } + }, + "office-ui-fabric-react": { + "version": "7.106.3", + "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.106.3.tgz", + "integrity": "sha512-1KaBF8tWhn6AnBkl791dOMvXRmbTXdjamsv0ztDaZE0gnPphiU5yA7sThq1XyA2g+SyoUd7ZkTzf4rzLjsHzaA==", + "requires": { + "@fluentui/react-focus": "^7.4.0", + "@fluentui/react-icons": "^0.1.2", + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/foundation": "^7.7.1", + "@uifabric/icons": "^7.3.27", + "@uifabric/merge-styles": "^7.10.0", + "@uifabric/react-hooks": "^7.1.4", + "@uifabric/set-version": "^7.0.10", + "@uifabric/styling": "^7.11.4", + "@uifabric/utilities": "^7.15.8", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + } + }, + "react-markdown": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-4.3.1.tgz", + "integrity": "sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==", + "requires": { + "html-to-react": "^1.3.4", + "mdast-add-list-metadata": "1.0.1", + "prop-types": "^15.7.2", + "react-is": "^16.8.6", + "remark-parse": "^5.0.0", + "unified": "^6.1.5", + "unist-util-visit": "^1.3.0", + "xtend": "^4.0.1" + } + } + } + }, "pzl-spfx-components": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pzl-spfx-components/-/pzl-spfx-components-0.0.11.tgz", @@ -20235,24 +21274,66 @@ } }, "react": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", - "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "version": "16.8.5", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.5.tgz", + "integrity": "sha512-daCb9TD6FZGvJ3sg8da1tRAtIuw29PbKZW++NN4wqkbEvxL+bZpaaYb4xuftW/SpXmgacf1skXl/ddX6CdOlDw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "prop-types": "^15.6.2", + "scheduler": "^0.13.5" + }, + "dependencies": { + "scheduler": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "react-calendar-timeline": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/react-calendar-timeline/-/react-calendar-timeline-0.26.0.tgz", + "integrity": "sha512-e/GDLer7CTAMEMtY9JM3TI/lRm0sOwrCqH/gb/o8InF///QnBHKrY0/4FuQWkxf0sEeLKFNoRbdVDJruRXmQpw==", + "requires": { + "classnames": "^2.2.6", + "create-react-context": "^0.2.2", + "element-resize-detector": "^1.1.12", + "lodash.isequal": "^4.5.0" } }, "react-dom": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", - "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "version": "16.8.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.5.tgz", + "integrity": "sha512-VIEIvZLpFafsfu4kgmftP5L8j7P1f0YThfVTrANMhZUFMDOsA6e0kfR6wxw/8xxKs4NB59TZYbxNdPCDW34x4w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.15.0" + "scheduler": "^0.13.5" + }, + "dependencies": { + "scheduler": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "react-highcharts": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/react-highcharts/-/react-highcharts-16.0.2.tgz", + "integrity": "sha512-RH56Yv1NvBfo6YTVBF7zyT/i4yCXSyDSK6VyaAcAi3SqOkixB9Ac+81EJK4VMbXi2BEXaYkVTYcV7KVAiQSE7w==", + "requires": { + "highcharts": "^6.0.4" } }, "react-image-fade-in": { @@ -21397,8 +22478,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { "version": "1.1.0", @@ -23458,6 +24538,11 @@ "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", @@ -24098,6 +25183,14 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", diff --git a/SharePointFramework/ProjectWebParts/package.json b/SharePointFramework/ProjectWebParts/package.json index 1dbe70c84..aff68d271 100644 --- a/SharePointFramework/ProjectWebParts/package.json +++ b/SharePointFramework/ProjectWebParts/package.json @@ -1,6 +1,6 @@ { "name": "pp365-projectwebparts", - "version": "1.2.9", + "version": "1.3.0", "engines": { "node": ">=12.13.0" }, @@ -43,12 +43,15 @@ "@uifabric/utilities": "6.45.1", "dom-to-image": "2.6.0", "get-value": "3.0.1", + "interactjs": "1.6.2", "msgraph-helper": "0.7.1", "office-ui-fabric-react": "6.214.0", - "pp365-shared": "latest", + "pp365-portfoliowebparts": "1.3.1", + "pp365-shared": "1.3.3", "pzl-spfx-components": "0.0.11", - "react": "16.9.0", - "react-dom": "16.9.0", + "react": "16.8.5", + "react-calendar-timeline": "0.26.0", + "react-dom": "16.8.5", "react-image-fade-in": "1.0.2", "react-markdown": "4.2.2", "react-scroll": "1.7.11", diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectInformation/index.tsx b/SharePointFramework/ProjectWebParts/src/components/ProjectInformation/index.tsx index 54438f426..5db1416f3 100644 --- a/SharePointFramework/ProjectWebParts/src/components/ProjectInformation/index.tsx +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectInformation/index.tsx @@ -56,6 +56,7 @@ export class ProjectInformation extends BaseWebPartComponent< public render() { if (this.state.hidden) return null + return (
diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/TimelineSection.module.scss b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/TimelineSection.module.scss new file mode 100644 index 000000000..e6b8864a0 --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/TimelineSection.module.scss @@ -0,0 +1,5 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.list { + margin-top: 25px; +} \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/index.tsx b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/index.tsx new file mode 100644 index 000000000..b4d49dc55 --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/index.tsx @@ -0,0 +1,42 @@ +import * as React from 'react' +import { ITimelineSectionProps, ITimelineSectionState } from './types' +import { BaseSection } from '../BaseSection' +import { StatusElement } from '../../StatusElement' +import { ProjectTimeline } from 'components/ProjectTimeline' +import styles from './TimelineSection.module.scss' + +export class TimelineSection extends BaseSection { + constructor(props: ITimelineSectionProps) { + super(props) + this.state = { + loading: true + } + } + + /** + * Renders the component + */ + public render(): React.ReactElement { + return ( + + +
+
+ +
+
+
+ ) + } +} diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/types.ts b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/types.ts new file mode 100644 index 000000000..bb7930ecb --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/TimelineSection/types.ts @@ -0,0 +1,9 @@ +import { IListSectionProps, IListSectionState, IListSectionData } from '../ListSection' + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ITimelineSectionProps extends IListSectionProps { } + +export type ITimelineSectionState = IListSectionState + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ITimelineData extends IListSectionData { } \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/index.ts b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/index.ts index 5cf35cd5f..b82589d4e 100644 --- a/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/index.ts +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/Sections/index.ts @@ -5,3 +5,4 @@ export * from './ProjectPropertiesSection/StatusSectionField' export * from './RiskSection' export * from './StatusSection' export * from './SummarySection' +export * from './TimelineSection' diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/index.tsx b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/index.tsx index b2c36b80e..c913402bd 100644 --- a/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/index.tsx +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectStatus/index.tsx @@ -25,7 +25,8 @@ import { ProjectPropertiesSection, RiskSection, StatusSection, - SummarySection + SummarySection, + TimelineSection, } from './Sections' import { IProjectStatusData, @@ -314,6 +315,14 @@ export class ProjectStatus extends React.Component } + case SectionType.TimelineSection: { + return ( + + ) + } default: { return null } @@ -482,7 +491,7 @@ export class ProjectStatus extends React.Component item.setDefaultEditFormUrl(reportList.DefaultEditFormUrl)) diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss b/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss new file mode 100644 index 000000000..4d44c70ce --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/ProjectTimeline.module.scss @@ -0,0 +1,35 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.root { + margin: 15px 0 50px 0; + .container { + margin: 0px auto; + .commandBar { + margin: 0px auto; + } + .header { + padding: 23px 32px 20px 32px; + + .title { + font-size: 28px; + font-weight: 100; + margin: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + .infoText { + padding: 23px 32px 23px 32px; + } + .timelineList { + margin: 25px; + + .stickyHeader { + .headerColumns { + position: inherit; + } + } + } + } +} \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/index.tsx b/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/index.tsx new file mode 100644 index 000000000..a6b017597 --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/index.tsx @@ -0,0 +1,716 @@ +import { get } from '@microsoft/sp-lodash-subset' +import { getId } from '@uifabric/utilities' +import sortArray from 'array-sort' +import { ITimelineData, ITimelineGroup, ITimelineItem } from './types' +import moment from 'moment' +import { CommandBar, ICommandBarProps } from 'office-ui-fabric-react/lib/CommandBar' +import { ContextualMenuItemType } from 'office-ui-fabric-react/lib/ContextualMenu' +import { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar' +import { format } from 'office-ui-fabric-react/lib/Utilities' +import * as strings from 'ProjectWebPartsStrings' +import React from 'react' +import _, { isEmpty } from 'underscore' +import styles from './ProjectTimeline.module.scss' +import { BaseWebPartComponent } from '../BaseWebPartComponent' +import { Web } from '@pnp/sp' +import SPDataAdapter from '../../data' +import { Logger, LogLevel } from '@pnp/logging' +import { stringIsNullOrEmpty, TypedHash } from '@pnp/common' +import { PortalDataService } from 'pp365-shared/lib/services' +import { tryParseCurrency } from 'pp365-shared/lib/helpers' +import { + DetailsList, + DetailsListLayoutMode, + Selection, + SelectionMode, + IColumn +} from 'office-ui-fabric-react/lib/DetailsList' +import { + IProjectTimelineProps, + IProjectTimelineState, + IProjectTimelineData, + ProjectPropertyModel +} from './types' +import { ProjectListModel, TimelineContentListModel } from 'pp365-portfoliowebparts/lib/models' +import { DetailsCallout } from 'pp365-portfoliowebparts/lib/components/ProjectTimeline/DetailsCallout' +import { Timeline } from 'pp365-portfoliowebparts/lib/components/ProjectTimeline/Timeline' +import { + FilterPanel, + IFilterItemProps, + IFilterProps +} from 'pp365-portfoliowebparts/lib/components/FilterPanel' + +/** + * @component ProjectTimeline (Project webpart) + * @extends Component + */ +export class ProjectTimeline extends BaseWebPartComponent< + IProjectTimelineProps, + IProjectTimelineState +> { + private _portalDataService: PortalDataService + private _selection: Selection + private _web: Web + + /** + * Constructor + * + * @param {IProjectTimelineProps} props Props + */ + constructor(props: IProjectTimelineProps) { + super('ProjectTimeline', props, { + selectedItem: [], + loading: true, + showFilterPanel: false, + activeFilters: {} + }) + + this._portalDataService = new PortalDataService().configure({ + urlOrWeb: this.props.hubSite.web, + siteId: this.props.siteId + }) + + this._selection = new Selection({ + onSelectionChanged: () => { + this.setState({ selectedItem: this._selection.getSelection() }) + } + }) + + moment.locale('nb') + } + + public async componentDidMount(): Promise { + try { + const data = await this._fetchData() + this.setState({ data, loading: false }) + } catch (error) { + this.setState({ error, loading: false }) + } + } + + public render(): React.ReactElement { + if (this.state.loading) return null + if (this.state.error) { + return ( +
+
+ {this.state.error} +
+
+ ) + } + + const { groups, items } = this._getFilteredData() + + return ( +
+
+ {this.props.showFilterButton && ( +
+ +
+ )} + {this.props.showTitle && (
+
{this.props.title}
+
)} + {this.props.showInfoMessage && ( +
+ +
+
+
+ )} + {this.props.showTimeline && ( + + )} + {this.props.showTimelineList && ( +
+ {this.props.showCmdTimelineList && ( +
+ +
+ )} + +
+ )} +
+ this.setState({ showFilterPanel: false })} + /> + {this.state.showDetails && ( + this.setState({ showDetails: null })} + /> + )} +
+ ) + } + + /** + * On render item column + * + * @param {any} item Item + * @param {number} _index Index + * @param {IColumn} column Column + */ + private _onRenderItemColumn = (item: any, index: number, column: IColumn) => { + if (!column.fieldName) return null + if (column.onRender) return column.onRender(item, index, column) + if (!stringIsNullOrEmpty(column['fieldNameDisplay'])) { + return get(item, column['fieldNameDisplay'], null) + } + const columnValue = get(item, column.fieldName, null) + + switch (column?.data?.type.toLowerCase()) { + case 'int': + return columnValue ? parseInt(columnValue) : null + case 'date': + return columnValue && moment(columnValue).format('DD.MM.YYYY') + case 'datetime': + return columnValue && moment(columnValue).format('DD.MM.YYYY') + case 'currency': + return tryParseCurrency(columnValue, '') + .toString() + .replace(/(?!^)(?=(?:\d{3})+(?:\.|$))/gm, ' ') + default: + return columnValue + } + } + + /** + * Get filtered data + */ + private _getFilteredData(): ITimelineData { + const { activeFilters, data } = { ...this.state } as IProjectTimelineState + const activeFiltersKeys = Object.keys(activeFilters) + + if (activeFiltersKeys.length > 0) { + const items = activeFiltersKeys.reduce( + (newItems, key) => newItems.filter((i) => activeFilters[key].indexOf(get(i, key)) !== -1), + data.items + ) + const groups = data.groups.filter((grp) => items.filter((i) => i.group === grp.id).length > 0) + return { items, groups } + } else { + return data + } + } + + /** + * Get filters + */ + private _getFilters(): IFilterProps[] { + const columns = [{ fieldName: 'type', name: strings.TypeLabel }] + return columns.map((col) => ({ + column: { key: col.fieldName, minWidth: 0, ...col }, + items: this.state.data.items + .map((i) => get(i, col.fieldName)) + .filter((value, index, self) => value && self.indexOf(value) === index) + .map((name) => { + const filter = this.state.activeFilters[col.fieldName] + const selected = filter ? filter.indexOf(name) !== -1 : false + return { name, value: name, selected } + }) + })) + } + + /** + * On filter change + * + * @param {IColumn} column Column + * @param {IFilterItemProps[]} selectedItems Selected items + */ + private _onFilterChange(column: IColumn, selectedItems: IFilterItemProps[]) { + const { activeFilters } = { ...this.state } as IProjectTimelineState + if (selectedItems.length > 0) { + activeFilters[column.fieldName] = selectedItems.map((i) => i.value) + } else { + delete activeFilters[column.fieldName] + } + this.setState({ activeFilters }) + } + + /** + * Get command bar items + */ + private _getCommandBarProps(): ICommandBarProps { + const cmd: ICommandBarProps = { items: [], farItems: [] } + cmd.farItems.push({ + key: getId('Filter'), + name: strings.FilterText, + iconProps: { iconName: 'Filter' }, + itemType: ContextualMenuItemType.Header, + buttonStyles: { root: { border: 'none', height: '40px' } }, + iconOnly: true, + onClick: (ev) => { + ev.preventDefault() + this.setState({ showFilterPanel: true }) + } + }) + return cmd + } + + /** + * Get command bar items + */ + private _getListCommandBarProps(): ICommandBarProps { + const cmd: ICommandBarProps = { items: [], farItems: [] } + cmd.items.push({ + key: getId('NewItem'), + name: strings.NewItemLabel, + iconProps: { iconName: 'Add' }, + buttonStyles: { root: { border: 'none' } }, + onClick: () => { + this._redirectNewTimelineItem() + } + }) + cmd.items.push({ + key: getId('EditItem'), + name: strings.EditItemLabel, + iconProps: { iconName: 'Edit' }, + buttonStyles: { root: { border: 'none' } }, + disabled: this.state.selectedItem.length === 0, + href: this.state.selectedItem[0]?.EditFormUrl + }) + cmd.farItems.push({ + key: getId('DeleteItem'), + name: strings.DeleteItemLabel, + iconProps: { iconName: 'Delete' }, + buttonStyles: { root: { border: 'none' } }, + disabled: this.state.selectedItem.length === 0, + onClick: () => { + this._deleteTimelineItem(this.state.selectedItem[0]) + } + }) + return cmd + } + + /** + * Create new timeline item and send the user to the edit form + */ + private async _redirectNewTimelineItem() { + const [project] = ( + await this._web.lists.getByTitle(strings.ProjectsListName).items.select('Id', 'Title').get() + ).filter((project) => project.Title === this.props.webTitle) + + const properties: TypedHash = { + Title: 'Nytt element', + SiteIdLookupId: { results: [project.Id] } + } + Logger.log({ + message: '(TimelineItem) _redirectNewTimelineItem: Created new timeline item', + data: { fieldValues: properties }, + level: LogLevel.Info + }) + + const itemId = await this._addTimelineItem(properties) + document.location.hash = '' + document.location.href = this._editFormUrl(itemId) + } + + /** + * Add timeline item + * + * @param {TypedHash} properties Properties + */ + public async _addTimelineItem(properties: TypedHash): Promise { + const list = this._web.lists.getByTitle(strings.TimelineContentListName) + const itemAddResult = await list.items.add(properties) + return itemAddResult.data + } + + /** + * Delete timelineitem + * + * @param {any} item Item + */ + private async _deleteTimelineItem(item: any) { + const list = this._web.lists.getByTitle(strings.TimelineContentListName) + await list.items.getById(item.Id).delete() + window.location.hash = '' + document.location.reload() + } + + /** + * Edit form URL with added Source parameter generated from the item ID + * + * @param {any} item Item + */ + public _editFormUrl(item: any) { + return [ + `${this.props.hubSite.url}`, + `/Lists/${strings.TimelineContentListName}/EditForm.aspx`, + '?ID=', + item.Id, + '&Source=', + encodeURIComponent(window.location.href) + ].join('') + } + + /** + * On item click + * + * @param {React.MouseEvent} event Event + * @param {ITimelineItem} item Item + */ + private _onItemClick(event: React.MouseEvent, item: ITimelineItem) { + this.setState({ showDetails: { element: event.currentTarget, data: item } }) + } + + /** + * Get timeline items and columns + */ + public async _getProjecttimelineItemsAndColumns() { + this._web = new Web(this.props.hubSite.url) + + try { + const [allColumns] = await Promise.all([ + ( + await this._web.lists + .getByTitle(strings.TimelineContentListName) + .defaultView.fields.select('Items') + .get() + )['Items'] + ]) + + const filterstring: string = allColumns + .map((col: string) => `(InternalName eq '${col}')`) + .join(' or ') + + const internalNames: string = await allColumns.map((col: string) => `${col}`).join(',') + + let [timelineItems] = await Promise.all([ + await this._web.lists + .getByTitle(strings.TimelineContentListName) + .items.select( + internalNames, + 'Id', + 'SiteIdLookupId', + 'SiteIdLookup/Title', + 'SiteIdLookup/GtSiteId' + ) + .expand('SiteIdLookup') + .get() + ]) + + let timelineListItems = timelineItems.filter( + (item) => item.SiteIdLookup[0].Title === this.props.webTitle + ) + + const [timelineColumns] = await Promise.all([ + await this._web.lists + .getByTitle(strings.TimelineContentListName) + .fields.filter(filterstring) + .select('InternalName', 'Title', 'TypeAsString') + .get() + ]) + + const columns: IColumn[] = timelineColumns + .filter((column) => column.InternalName !== 'SiteIdLookup') + .map((column) => { + return { + key: column.InternalName, + name: column.Title, + fieldName: column.InternalName, + data: { type: column.TypeAsString }, + onColumnClick: this._onColumnClick.bind(this), + minWidth: 150, + maxWidth: 200, + sorting: true, + isResizable: true + } + }) + + timelineListItems = timelineListItems.map((item) => { + return { ...item, EditFormUrl: this._editFormUrl(item) } + }) + + timelineItems = timelineItems + .map((item) => { + const model = new TimelineContentListModel( + item.SiteIdLookup && item.SiteIdLookup[0].GtSiteId, + item.SiteIdLookup && item.SiteIdLookup[0].Title, + item.Title, + item.TimelineType, + item.GtStartDate, + item.GtEndDate, + item.GtBudgetTotal, + item.GtCostsTotal + ) + return model + }) + .filter((t) => t) + + return [timelineItems, timelineListItems, columns] + } catch (error) { + return [] + } + } + + /** + * For sorting detailslist on column click + * + * @param {React.MouseEvent} event Event + * @param {IColumn} column Column + */ + private _onColumnClick = (ev: React.MouseEvent, column: IColumn): void => { + const newColumns: IColumn[] = this.state.data.timelineColumns.slice() + const currColumn: IColumn = newColumns.filter((currCol) => column.key === currCol.key)[0] + newColumns.forEach((newCol: IColumn) => { + if (newCol === currColumn) { + currColumn.isSortedDescending = !currColumn.isSortedDescending + currColumn.isSorted = true + } else { + newCol.isSorted = false + newCol.isSortedDescending = true + } + }) + const newItems = this._copyAndSort( + this.state.data.timelineListItems, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + currColumn.fieldName!, + currColumn.isSortedDescending + ) + this.setState({ + data: { ...this.state.data, timelineColumns: newColumns, timelineListItems: newItems } + }) + } + + /** + * Copies and sorts items based on columnKey in the timeline detailslist + * + * @param {T[]} items timelineListItems + * @param {string} columnKey Column key + * @param {boolean} isSortedDescending Is Sorted Descending? + * @returns {T[]} sorted timeline list items + */ + private _copyAndSort(items: T[], columnKey: string, isSortedDescending?: boolean): T[] { + const key = columnKey as keyof T + return items + .slice(0) + .sort((a: T, b: T) => ((isSortedDescending ? a[key] < b[key] : a[key] > b[key]) ? 1 : -1)) + } + + /** + * Creating groups based on projects title + * + * @returns {ITimelineGroup[]} Timeline groups + */ + private _transformGroups(projects: ProjectListModel[]): ITimelineGroup[] { + const groupNames: string[] = projects + .map((project) => { + const name = project.title + return name + }) + .filter((value, index, self) => self.indexOf(value) === index) + let groups: ITimelineGroup[] = groupNames.map((name, id) => { + const [title] = name.split('|') + return { + id, + title, + type: 'Prosjekt' + } + }) + groups = sortArray(groups, ['type', 'title']) + return groups + } + + /** + * Create items + * + * @param {ProjectListModel[]} projects Projects + * @param {TimelineContentListModel[]} timelineItems Timeline items + * @param {ITimelineGroup[]} groups Groups + * + * @returns {ITimelineItem[]} Timeline items + */ + private _transformItems( + projects: ProjectListModel[], + timelineItems: TimelineContentListModel[], + groups: ITimelineGroup[] + ): ITimelineItem[] { + const items: ITimelineItem[] = projects.map((project, id) => { + const group = _.find(groups, (grp) => project.title.indexOf(grp.title) !== -1) + const style: React.CSSProperties = { + color: 'white', + border: 'none', + cursor: 'auto', + outline: 'none', + background: '#f35d69', + backgroundColor: '#f35d69' + } + + return { + id, + group: group.id, + title: format(strings.ProjectTimelineItemInfo, project.title), + start_time: moment(new Date(project.startDate)), + end_time: moment(new Date(project.endDate)), + itemProps: { style }, + project: project.title, + projectUrl: project.url, + phase: project.phase, + type: 'Prosjekt', + budgetTotal: project.budgetTotal, + costsTotal: project.costsTotal + } as ITimelineItem + }) + + const phases: ITimelineItem[] = timelineItems + .filter((item) => item.title === this.props.webTitle) + .map((item, id) => { + id += items.length + + const backgroundColor = + item.type === strings.PhaseLabel + ? '#2589d6' + : item.type === strings.MilestoneLabel + ? 'transparent' + : item.type === strings.SubPhaseLabel + ? '#249ea0' + : '#484848' + + const group = _.find(groups, (grp) => item.title.indexOf(grp.title) !== -1) + const style: React.CSSProperties = { + color: 'white', + border: 'none', + cursor: 'auto', + outline: 'none', + background: backgroundColor, + backgroundColor: backgroundColor + } + return { + id: id, + group: group.id, + title: item.itemTitle, + start_time: + item.type === strings.MilestoneLabel + ? moment(new Date(item.endDate)) + : moment(new Date(item.startDate)), + end_time: moment(new Date(item.endDate)), + itemProps: { style }, + project: item.title, + type: item.type, + budgetTotal: item.budgetTotal, + costsTotal: item.costsTotal + } as ITimelineItem + }) + + return [...items, ...phases] + } + + /** + * Transform properties from entity item and configuration + * + * @param {IProjectInformationData} data Data + */ + private _transformProperties({ columns, fields, fieldValuesText }: IProjectTimelineData) { + const fieldNames: string[] = Object.keys(fieldValuesText).filter((fieldName) => { + const [field] = fields.filter((fld) => fld.InternalName === fieldName) + if (!field) return false + if (isEmpty(columns) && [fieldName]) { + return true + } + const [column] = columns.filter((c) => c.internalName === fieldName) + return column + }) + + const properties = fieldNames.map((fn) => { + const [field] = fields.filter((fld) => fld.InternalName === fn) + return new ProjectPropertyModel(field, fieldValuesText[fn]) + }) + + return properties + } + + /** + * Fetch data + */ + private async _fetchProjectData(): Promise> { + try { + SPDataAdapter.configure(this.props.webPartContext, { + siteId: this.props.siteId, + webUrl: this.props.webUrl, + hubSiteUrl: this.props.hubSite.url, + logLevel: sessionStorage.DEBUG || DEBUG ? LogLevel.Info : LogLevel.Warning + }) + + const [columns, propertiesData] = await Promise.all([ + this._portalDataService.getProjectColumns(), + SPDataAdapter.project.getPropertiesData() + ]) + + const data: IProjectTimelineData = { + columns, + ...propertiesData + } + + const properties = this._transformProperties(data) + + return { data, properties } + } catch (error) { + this.logError('Failed to retrieve data.', '_fetchData', error) + throw error + } + } + + /** + * Fetch data + * + * @returns {ITimelineData} Timeline data + */ + private async _fetchData(): Promise { + try { + const projectData = (await this._fetchProjectData()).data.fieldValuesText + + const project = new ProjectListModel( + this.props.siteId, + this.props.siteId, + this.props.webTitle, + this.props.webUrl, + projectData.GtProjectPhase, + projectData.GtStartDate, + projectData.GtEndDate + ) + + project['type'] = strings.ProjectLabel + project['budgetTotal'] = projectData.GtBudgetTotal + project['costsTotal'] = projectData.GtCostsTotal + + const [timelineItems, timelineListItems, timelineColumns] = + await this._getProjecttimelineItemsAndColumns() + + const groups = this._transformGroups([project]) + const items = this._transformItems([project], timelineItems, groups) + return { items, groups, timelineListItems, timelineColumns } + } catch (error) { + throw error + } + } +} + +export { IProjectTimelineProps } diff --git a/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/types.ts b/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/types.ts new file mode 100644 index 000000000..e992e8aa7 --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/components/ProjectTimeline/types.ts @@ -0,0 +1,145 @@ +import { + IBaseWebPartComponentProps, + IBaseWebPartComponentState +} from '../BaseWebPartComponent/types' +import { TypedHash } from '@pnp/common' +import * as ProjectDataService from 'pp365-shared/lib/services/ProjectDataService' +import * as moment from 'moment' +import { ProjectColumn } from 'pp365-shared/lib/models' +import { IEntityField } from 'sp-entityportal-service' +import { stringIsNullOrEmpty } from '@pnp/common' + +export interface IProjectTimelineProps extends IBaseWebPartComponentProps { + showTitle?: boolean + listName?: string + showFilterButton?: boolean + showTimeline?: boolean + showInfoMessage?: boolean + showCmdTimelineList?: boolean + showTimelineList?: boolean + isSelectionModeNone?: boolean +} + +export interface IProjectTimelineState extends IBaseWebPartComponentState { + /** + * Properties + */ + properties?: ProjectPropertyModel[] + + /** + * Selection + */ + selectedItem?: any[] + + /** + * Show filter panel + */ + showFilterPanel: boolean + + /** + * Active filters + */ + activeFilters: { [key: string]: string[] } + + /** + * Data + */ + data?: any + + /** + * Error + */ + error?: string + + /** + * Item to show show details for + */ + showDetails?: { data: ITimelineItem; element: HTMLElement } +} + +export interface ITimelineData { + items: ITimelineItem[] + groups: ITimelineGroup[] + timelineListItems?: any[] + timelineColumns?: any[] +} + +export interface ITimelineGroup { + id: number + title: string + type: string +} + +export interface ITimelineItem { + id: number + title: string + group: number + start_time: moment.Moment + end_time: moment.Moment + itemProps: React.HTMLProps + project: string + projectUrl?: string + phase?: string + milestoneDate?: moment.Moment + type?: string + budgetTotal?: string + costsTotal?: string + props: TypedHash +} + +export interface IProjectTimelineData extends ProjectDataService.IGetPropertiesData { + /** + * Column configuration + */ + columns?: ProjectColumn[] + + /** + * Array of fields from the entity + */ + fields?: IEntityField[] +} + +export class ProjectPropertyModel { + /** + * Internal name of the field + */ + public internalName: string + + /** + * Display name of the field + */ + public displayName: string + + /** + * Description of the field + */ + public description: string + + /** + * Value for the field + */ + public value?: string + + /** + * Type of the field + */ + public type?: string + + /** + * Creates an instance of ProjectPropertyModel + * + * @param {IEntityField} field Field + * @param {string} value Value + */ + constructor(field: IEntityField, value: string) { + this.internalName = field.InternalName + this.displayName = field.Title + this.description = field.Description + this.value = value + this.type = field.TypeAsString + } + + public get empty() { + return stringIsNullOrEmpty(this.value) + } +} diff --git a/SharePointFramework/ProjectWebParts/src/loc/en-us.js b/SharePointFramework/ProjectWebParts/src/loc/en-us.js index 087de5656..898466168 100644 --- a/SharePointFramework/ProjectWebParts/src/loc/en-us.js +++ b/SharePointFramework/ProjectWebParts/src/loc/en-us.js @@ -110,6 +110,34 @@ define([], function () { ConsequencePostActionFieldNameFieldLabel: 'Field name - Consequence (post action)', WidthFieldLabel: 'Width (pixels)', HeightFieldLabel: 'Height (pixels)', - CalloutTemplateFieldLabel: 'Callout template' + CalloutTemplateFieldLabel: 'Callout template', + FilterText: 'Filtrer', + PhaseLabel: 'Fase', + SiteTitleLabel: 'Prosjekt', + TypeLabel: 'Type', + DeleteItemLabel: 'Slett', + ProjecttimelineGroupName: 'Prosjekttidslinje', + ProjectTimelineInfoText: 'Her listes prosjektets tidslinje med start- og sluttdato. Prosjekttidslinjen støtter også faser, delfaser og milepæler, dette opprettes og vedlikeholdes i listen under. Prosjektet vises med rød farge, faser i blått, delfaser blågrønt, og milepæler i gult. For å zoome inn/ut i tidslinje: ALT+Musehjul', + ProjectTimelineListInfoText: 'Her listes listeelementene for prosjektet. Her kan du redigere og legge til nye elementer. Dette vil synkroniseres til listen på hubområdet. ', + TimelineContentListName: 'Tidslinjeinnhold', + NewItemLabel: 'Nytt element', + EditItemLabel: 'Rediger', + PortfolioManagerGroupName: 'Porteføljeinnsyn', + ProjectTimelineItemInfo: '{0} - prosjektets tidsforløp', + LastPublishedStatusreport: 'Gå til siste statusrapport', + MilestoneLabel: 'Milepæl', + ProjectLabel: 'Prosjekt', + SubPhaseLabel: 'Delfase', + CurrentPhaseLabel: 'Gjeldende fase', + MilestoneDateLabel: 'Milepælsdato', + StartDateLabel: 'Startdato', + EndDateLabel: 'Sluttdato', + BudgetTotalLabel: 'Totalbudsjett', + CostsTotalLabel: 'Kostnader påløpt totalt', + ShowFilterButtonLabel: 'Vis filterknapp', + ShowTimelineLabel: 'Vis tidslinje', + ShowInfoMessageLabel: 'Vis infomelding', + ShowCmdTimelineListLabel: 'Vis kommandolinje for liste', + ShowTimelineListLabel: 'Vis liste' } }) \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/src/loc/mystrings.d.ts b/SharePointFramework/ProjectWebParts/src/loc/mystrings.d.ts index 63bcf00bd..e08f1e7fc 100644 --- a/SharePointFramework/ProjectWebParts/src/loc/mystrings.d.ts +++ b/SharePointFramework/ProjectWebParts/src/loc/mystrings.d.ts @@ -110,6 +110,34 @@ declare interface IProjectWebPartsStrings { WidthFieldLabel: string; HeightFieldLabel: string; CalloutTemplateFieldLabel: string; + FilterText: string; + PhaseLabel: string; + SiteTitleLabel: string; + TypeLabel: string; + DeleteItemLabel: string; + ProjecttimelineGroupName: string; + ProjectTimelineInfoText: string; + ProjectTimelineListInfoText: string; + TimelineContentListName: string; + NewItemLabel: string; + EditItemLabel: string; + PortfolioManagerGroupName: string; + ProjectTimelineItemInfo: string; + LastPublishedStatusreport: string; + MilestoneLabel: string; + ProjectLabel: string; + SubPhaseLabel: string; + CurrentPhaseLabel: string; + MilestoneDateLabel: string; + StartDateLabel: string; + EndDateLabel: string; + BudgetTotalLabel: string; + CostsTotalLabel: string; + ShowFilterButtonLabel: string; + ShowTimelineLabel: string; + ShowInfoMessageLabel: string; + ShowCmdTimelineListLabel: string; + ShowTimelineListLabel: string; } declare module 'ProjectWebPartsStrings' { diff --git a/SharePointFramework/ProjectWebParts/src/loc/nb-no.js b/SharePointFramework/ProjectWebParts/src/loc/nb-no.js index 63cf2787f..384a8f136 100644 --- a/SharePointFramework/ProjectWebParts/src/loc/nb-no.js +++ b/SharePointFramework/ProjectWebParts/src/loc/nb-no.js @@ -111,6 +111,34 @@ define([], function () { ConsequencePostActionFieldNameFieldLabel: 'Feltnavn - Konsekvens (etter tiltak)', WidthFieldLabel: 'Bredde (piksler)', HeightFieldLabel: 'Høyde (piksler)', - CalloutTemplateFieldLabel: 'Mal for callout' + CalloutTemplateFieldLabel: 'Mal for callout', + FilterText: 'Filtrer', + PhaseLabel: 'Fase', + SiteTitleLabel: 'Prosjekt', + TypeLabel: 'Type', + DeleteItemLabel: 'Slett', + ProjecttimelineGroupName: 'Prosjekttidslinje', + ProjectTimelineInfoText: 'Her listes prosjektets tidslinje med start- og sluttdato. Prosjekttidslinjen støtter også faser, delfaser og milepæler, dette opprettes og vedlikeholdes i listen under. Prosjektet vises med rød farge, faser i blått, delfaser blågrønt, og milepæler i gult. For å zoome inn/ut i tidslinje: ALT+Musehjul', + ProjectTimelineListInfoText: 'Her listes listeelementene for prosjektet. Her kan du redigere og legge til nye elementer. Dette vil synkroniseres til listen på hubområdet. ', + TimelineContentListName: 'Tidslinjeinnhold', + NewItemLabel: 'Nytt element', + EditItemLabel: 'Rediger', + PortfolioManagerGroupName: 'Porteføljeinnsyn', + ProjectTimelineItemInfo: '{0} - prosjektets tidsforløp', + LastPublishedStatusreport: 'Gå til siste statusrapport', + MilestoneLabel: 'Milepæl', + ProjectLabel: 'Prosjekt', + SubPhaseLabel: 'Delfase', + CurrentPhaseLabel: 'Gjeldende fase', + MilestoneDateLabel: 'Milepælsdato', + StartDateLabel: 'Startdato', + EndDateLabel: 'Sluttdato', + BudgetTotalLabel: 'Totalbudsjett', + CostsTotalLabel: 'Kostnader påløpt totalt', + ShowFilterButtonLabel: 'Vis filterknapp', + ShowTimelineLabel: 'Vis tidslinje', + ShowInfoMessageLabel: 'Vis infomelding', + ShowCmdTimelineListLabel: 'Vis kommandolinje for liste', + ShowTimelineListLabel: 'Vis liste' } }) \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/src/models/index.ts b/SharePointFramework/ProjectWebParts/src/models/index.ts index d49c0144f..2c217ff3b 100644 --- a/SharePointFramework/ProjectWebParts/src/models/index.ts +++ b/SharePointFramework/ProjectWebParts/src/models/index.ts @@ -1 +1 @@ -export * from './ISPList' +export * from './ISPList' \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/src/webparts/projectInformation/manifest.json b/SharePointFramework/ProjectWebParts/src/webparts/projectInformation/manifest.json index 4f5316b4e..303efffb8 100644 --- a/SharePointFramework/ProjectWebParts/src/webparts/projectInformation/manifest.json +++ b/SharePointFramework/ProjectWebParts/src/webparts/projectInformation/manifest.json @@ -3,7 +3,7 @@ "id": "b8bec0be-2354-443d-a3ca-24b36e8ea7dc", "alias": "ProjectInformationWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.0", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/ProjectWebParts/src/webparts/projectPhases/manifest.json b/SharePointFramework/ProjectWebParts/src/webparts/projectPhases/manifest.json index 465f5a4ff..a3f4c9468 100644 --- a/SharePointFramework/ProjectWebParts/src/webparts/projectPhases/manifest.json +++ b/SharePointFramework/ProjectWebParts/src/webparts/projectPhases/manifest.json @@ -3,7 +3,7 @@ "id": "4449d3dc-fa58-4982-b87c-5a893114e7b7", "alias": "ProjectPhasesWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.0", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/ProjectWebParts/src/webparts/projectStatus/manifest.json b/SharePointFramework/ProjectWebParts/src/webparts/projectStatus/manifest.json index 15783c95f..ff73639c9 100644 --- a/SharePointFramework/ProjectWebParts/src/webparts/projectStatus/manifest.json +++ b/SharePointFramework/ProjectWebParts/src/webparts/projectStatus/manifest.json @@ -3,7 +3,7 @@ "id": "681ad0dc-ddb5-4dba-a5d6-a42f6d1c90a6", "alias": "ProjectStatusWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.0", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": true, diff --git a/SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/index.ts b/SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/index.ts new file mode 100644 index 000000000..c8ab0e108 --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/index.ts @@ -0,0 +1,61 @@ +import { + IPropertyPaneConfiguration, + PropertyPaneTextField, + PropertyPaneToggle +} from '@microsoft/sp-property-pane' +import '@pnp/polyfill-ie11' +import { IProjectTimelineProps, ProjectTimeline } from 'components/ProjectTimeline' +import 'office-ui-fabric-react/dist/css/fabric.min.css' +import { BaseProjectWebPart } from 'webparts/@baseProjectWebPart' + +import * as strings from 'ProjectWebPartsStrings' + +export default class ProjectTimelineWebPart extends BaseProjectWebPart { + public async onInit() { + await super.onInit() + } + + public render(): void { + this.renderComponent(ProjectTimeline) + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupName: strings.ProjecttimelineGroupName, + groupFields: [ + PropertyPaneTextField('listName', { + label: strings.ListNameFieldLabel, + value: 'Tidslinjeinnhold' + }), + PropertyPaneToggle('showFilterButton', { + label: strings.ShowFilterButtonLabel, + checked: true + }), + PropertyPaneToggle('showTimeline', { + label: strings.ShowTimelineLabel, + checked: true + }), + PropertyPaneToggle('showInfoMessage', { + label: strings.ShowInfoMessageLabel, + checked: true + }), + PropertyPaneToggle('showCmdTimelineList', { + label: strings.ShowCmdTimelineListLabel, + checked: true + }), + PropertyPaneToggle('showTimelineList', { + label: strings.ShowTimelineListLabel, + checked: true + }) + ] + } + ] + } + ] + } + } +} diff --git a/SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/manifest.json b/SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/manifest.json new file mode 100644 index 000000000..3f4615d05 --- /dev/null +++ b/SharePointFramework/ProjectWebParts/src/webparts/projectTimeline/manifest.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "d156652b-9121-47af-89ae-1fe8427c53da", + "alias": "ProjecttimelineWebPart", + "componentType": "WebPart", + "version": "1.3.0", + "manifestVersion": 2, + "requiresCustomScript": false, + "hiddenFromToolbox": true, + "supportedHosts": [ + "SharePointWebPart" + ], + "preconfiguredEntries": [ + { + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { + "default": "Other" + }, + "title": { + "default": "Prosjekttidslinje" + }, + "description": { + "default": " " + }, + "officeFabricIconFontName": "TimelineDelivery", + "properties": { + "listName": "Tidslinjeinnhold", + "showFilterButton": true, + "showTimeline": true, + "showInfoMessage": true, + "showCmdTimelineList": true, + "showTimelineList": true + } + } + ] +} \ No newline at end of file diff --git a/SharePointFramework/ProjectWebParts/src/webparts/riskMatrix/manifest.json b/SharePointFramework/ProjectWebParts/src/webparts/riskMatrix/manifest.json index 39ac0a5d9..00984853d 100644 --- a/SharePointFramework/ProjectWebParts/src/webparts/riskMatrix/manifest.json +++ b/SharePointFramework/ProjectWebParts/src/webparts/riskMatrix/manifest.json @@ -3,7 +3,7 @@ "id": "e536ae15-0748-4d96-b160-3abb30f1b71e", "alias": "RiskMatrixWebPart", "componentType": "WebPart", - "version": "1.2.9", + "version": "1.3.0", "manifestVersion": 2, "requiresCustomScript": false, "hiddenFromToolbox": false, diff --git a/SharePointFramework/README.md b/SharePointFramework/README.md index 64456774f..b4d009e5c 100644 --- a/SharePointFramework/README.md +++ b/SharePointFramework/README.md @@ -77,6 +77,7 @@ _Published to **npm** as `pp365-projectwebparts`_`_ | ProjectPhasesWebPart | 4449d3dc-fa58-4982-b87c-5a893114e7b7 | | ProjectWebParts | | ProjectStatusWebPart | 681ad0dc-ddb5-4dba-a5d6-a42f6d1c90a6 | | ProjectWebParts | | RiskMatrixWebPart | e536ae15-0748-4d96-b160-3abb30f1b71e | | ProjectWebParts | +| ProjectTimelineWebPart | d156652b-9121-47af-89ae-1fe8427c53da | | ProjectWebParts | # 3. Build, package and deploy diff --git a/Templates/Portfolio/Objects/ContentTypes/@.xml b/Templates/Portfolio/Objects/ContentTypes/@.xml index c6087f147..4140de040 100644 --- a/Templates/Portfolio/Objects/ContentTypes/@.xml +++ b/Templates/Portfolio/Objects/ContentTypes/@.xml @@ -11,6 +11,7 @@ + diff --git a/Templates/Portfolio/Objects/ContentTypes/Tidslinjeseksjon.xml b/Templates/Portfolio/Objects/ContentTypes/Tidslinjeseksjon.xml new file mode 100644 index 000000000..4dea68480 --- /dev/null +++ b/Templates/Portfolio/Objects/ContentTypes/Tidslinjeseksjon.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/Templates/Portfolio/Objects/Lists/Statusseksjoner.xml b/Templates/Portfolio/Objects/Lists/Statusseksjoner.xml index 34eea619e..d1aa6faf9 100644 --- a/Templates/Portfolio/Objects/Lists/Statusseksjoner.xml +++ b/Templates/Portfolio/Objects/Lists/Statusseksjoner.xml @@ -5,6 +5,7 @@ + @@ -113,6 +114,15 @@ GtStatusGainAchievement 0x01004CEFE616A94A3A48A27D9DEBDF5EC82802 + + 70 + Tidslinje + Trophy + True + True + True + 0x01004CEFE616A94A3A48A27D9DEBDF5EC82806 + diff --git a/Templates/Portfolio/Objects/Lists/Tidslinjeinnhold.xml b/Templates/Portfolio/Objects/Lists/Tidslinjeinnhold.xml index fb909d23f..b15e7398d 100644 --- a/Templates/Portfolio/Objects/Lists/Tidslinjeinnhold.xml +++ b/Templates/Portfolio/Objects/Lists/Tidslinjeinnhold.xml @@ -29,7 +29,7 @@ - + Fase diff --git a/Templates/Portfolio/Resources.en-US.resx b/Templates/Portfolio/Resources.en-US.resx index 32e973e06..0edb031a9 100644 --- a/Templates/Portfolio/Resources.en-US.resx +++ b/Templates/Portfolio/Resources.en-US.resx @@ -268,6 +268,12 @@ + + Tidslinjeseksjon + + + + Loggelement diff --git a/Templates/Portfolio/Resources.no-NB.resx b/Templates/Portfolio/Resources.no-NB.resx index 8add9264a..f15b2c9ce 100644 --- a/Templates/Portfolio/Resources.no-NB.resx +++ b/Templates/Portfolio/Resources.no-NB.resx @@ -310,6 +310,12 @@ + + Tidslinjeseksjon + + + + Loggelement diff --git a/Templates/_JsonTemplate.json b/Templates/_JsonTemplate.json index fcbc0784b..881ef0da9 100644 --- a/Templates/_JsonTemplate.json +++ b/Templates/_JsonTemplate.json @@ -504,6 +504,10 @@ "Url": "Lists/Ressursallokering/AllItems.aspx", "Title": "Ressursallokering" }, + { + "Url": "SitePages/Prosjekttidslinje.aspx", + "Title": "Prosjekttidslinje" + }, { "Url": "_layouts/15/viewlsts.aspx", "Title": "Områdeinnhold" @@ -672,6 +676,34 @@ ] } ] + }, + { + "Name": "Prosjekttidslinje.aspx", + "Title": "Prosjekttidslinje", + "PageLayoutType": "SingleWebPartAppPage", + "CommentsDisabled": true, + "Sections": [ + { + "Columns": [ + { + "Factor": 12, + "Controls": [ + { + "Id": "d156652b-9121-47af-89ae-1fe8427c53da", + "Properties": { + "title": "Prosjekttidslinje", + "showFilterButton": true, + "showTimeline": true, + "showInfoMessage": true, + "showCmdTimelineList": true, + "showTimelineList": true + } + } + ] + } + ] + } + ] } ], "Lists": [ From 486b77ac5768f074ec825cfbfba43cb02a24f1cf Mon Sep 17 00:00:00 2001 From: TinHoangVu <88658344+TinHoangVu@users.noreply.github.com> Date: Tue, 12 Oct 2021 15:12:54 +0200 Subject: [PATCH 2/4] Added "Avventer" as project status column option (#538) Co-authored-by: Ole Martin Pettersen --- CHANGELOG.md | 44 +++++++++---------- .../SiteFields/GtProjectLifecycleStatus.xml | 1 + 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84021fd24..f479490c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,35 +5,31 @@ Every change is marked with issue ID. ## 1.3.0 - TBA -## Added +### Added - Added new multi-user field _Prosjektstøtte_ #526 +- Added "Avventer" as a new choice in Project LifeCycle #537 +- Added a new section in "ProjectStatus" for timeline list #506 +- Added a new project webpart 'Prosjekttidslinje' for showcasing projects and items for the current project on a timeline #497 -## Changed +### Changed - Removed "Home" from Portfolio menu bar - Removed list views and risk matrix from previous status reports #374 -## Fixed +### Fixed - Fixed UI bug by downgrading the `office-ui-fabric-react` package version to `6.214.0` #535 - Fixed redirect after creating a new project status #530 -## 1.3.0 - TBA - -## Added - -- Added a new section in "ProjectStatus" for timelinelist #506 -- Added a new project webpart, 'Prosjekttidslinje' for showcasing projects and items for the current project on a timeline #497 - ## 1.2.9 - 08.09.2021 -## Added +### Added - Added multiline text-wrapping in project status #493 - Added description for site template #500 -## Fixed +### Fixed - Fixed issue where the site design had to be applied post project creation #492 - Fixed date not being recognized when exporting Portfolio overview to Excel. #495 @@ -41,17 +37,17 @@ Every change is marked with issue ID. ## 1.2.8 - 17.06.2021 -## Added +### Added - Added rich text and lineshift support to field in project information #502 -## Fixed +### Fixed - Fixed issue with checklist status field missing options #485 ## 1.2.7 - 20.05.2021 -## Added +### Added - Added a new portfolio webpart, 'Prosjekttidslinje' for showcasing projects on a timeline #435 - Added list 'Tidslinjeinnhold' to portfolio level #437 @@ -60,7 +56,7 @@ Every change is marked with issue ID. - Added "Last Report Date" to Portfolio status overview #393 - Added report created date next to Project Status title #456 -## Fixed +### Fixed - Avoiding overwrite of portfolio views, columns, column configuration and insights graphs on update #440 - Overwriting configuration page to support new configuration links on update #425 @@ -68,7 +64,7 @@ Every change is marked with issue ID. - Fixed inconsistent version history settings of lists #465 - Fixed Excel export issues at portfolio level #480 -## Changed +### Changed - Changed Portfolio status view columns from "comments" to "status" #451 - Improved project properties sync and fetching #444 #449 @@ -78,7 +74,7 @@ Every change is marked with issue ID. ## 1.2.6 - 03.03.2021 -## Added +### Added - Added project template name to project properties #380 - Added support for phase sub text in phase selector #381 @@ -87,7 +83,7 @@ Every change is marked with issue ID. - Added Description field to Usikkerhet #410 - Enabled version history on Prosjektmaler list #359 -## Fixed +### Fixed - Fixes issues with single folder in "Hent dokumentmal" #376 - Issues with custom project fields #378 @@ -101,7 +97,7 @@ Every change is marked with issue ID. ## 1.2.4 - 30.11.2020 -## Added +### Added - Added "default" option for extensions, similar to list content #328 - Added info message if there are unpublished statusreports #340 @@ -109,7 +105,7 @@ Every change is marked with issue ID. - Added possiblity to delete unpublished statusreports #343 - Added PNG snapshot when publishing project status #337 -## Fixed +### Fixed - Restricted access for members to certain lists #356 - Improved failure handling for PlannerConfiguration task in Project Setup #329 @@ -119,7 +115,7 @@ Every change is marked with issue ID. ## 1.2.3 - 2020-10-07 -## Added +### Added - Descriptions on configuration page #301 - New group "Porteføljeinnsyn". Grants users in this group insight into all projects in the portfolio #305 @@ -127,12 +123,12 @@ Every change is marked with issue ID. - Risk matrix toggle: Before and after risk reduction measures #293 - Support for planner tasks references/attachments #287 -## Fixed +### Fixed - View in portfolio overview was not changeable for non-admin users #308 - Projects set to Avsluttet are no longer visible on the front page #307 -## Changed +### Changed - Disabled "Ny statusrapport" when a report is unpublished. #309 diff --git a/Templates/Portfolio/Objects/SiteFields/GtProjectLifecycleStatus.xml b/Templates/Portfolio/Objects/SiteFields/GtProjectLifecycleStatus.xml index 9f0ba5dbc..0ddc29559 100644 --- a/Templates/Portfolio/Objects/SiteFields/GtProjectLifecycleStatus.xml +++ b/Templates/Portfolio/Objects/SiteFields/GtProjectLifecycleStatus.xml @@ -2,6 +2,7 @@ Aktivt Aktivt + Avventer Avsluttet \ No newline at end of file From 9da6c2d265c155bcf4f4f7a5cea96cf1c8846f2a Mon Sep 17 00:00:00 2001 From: Rundez <38385042+Rundez@users.noreply.github.com> Date: Tue, 12 Oct 2021 15:32:21 +0200 Subject: [PATCH 3/4] Project setup wizard - Stop reactivation bug when project is attached to another hub Co-authored-by: Ole Martin Pettersen --- CHANGELOG.md | 3 +- .../config/package-solution.json | 2 +- .../ProjectExtensions/package-lock.json | 2 +- .../ProjectExtensions/package.json | 2 +- .../src/components/ErrorDialog/index.tsx | 16 +++++-- .../src/components/ErrorDialog/types.ts | 5 ++ .../ProjectExtensions/src/loc/myStrings.d.ts | 6 +++ .../ProjectExtensions/src/loc/nb-no.js | 10 +++- .../src/projectSetup/ProjectSetupError.ts | 12 ++--- .../src/projectSetup/index.ts | 48 ++++++++++++++++--- .../src/projectSetup/manifest.json | 2 +- .../src/projectSetup/types.ts | 7 ++- .../src/projectUpgrade/manifest.json | 2 +- .../src/templateSelector/manifest.json | 2 +- 14 files changed, 93 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f479490c3..f0f4e0915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. Every change is marked with issue ID. -## 1.3.0 - TBA +## 1.3.0 - TBA ### Added @@ -21,6 +21,7 @@ Every change is marked with issue ID. - Fixed UI bug by downgrading the `office-ui-fabric-react` package version to `6.214.0` #535 - Fixed redirect after creating a new project status #530 +- Fixed project wizard bug when project is attached to another hub #532 ## 1.2.9 - 08.09.2021 diff --git a/SharePointFramework/ProjectExtensions/config/package-solution.json b/SharePointFramework/ProjectExtensions/config/package-solution.json index da5248e88..363d104fa 100644 --- a/SharePointFramework/ProjectExtensions/config/package-solution.json +++ b/SharePointFramework/ProjectExtensions/config/package-solution.json @@ -3,7 +3,7 @@ "solution": { "name": "pp-project-extensions", "id": "fe723971-d5c2-4698-91e3-c16e2f72fb5b", - "version": "1.2.9.0", + "version": "1.3.0.0", "includeClientSideAssets": true, "skipFeatureDeployment": true, "webApiPermissionRequests": [ diff --git a/SharePointFramework/ProjectExtensions/package-lock.json b/SharePointFramework/ProjectExtensions/package-lock.json index fbb5d09ea..a4adb7bec 100644 --- a/SharePointFramework/ProjectExtensions/package-lock.json +++ b/SharePointFramework/ProjectExtensions/package-lock.json @@ -1,6 +1,6 @@ { "name": "pp365-projectextensions", - "version": "1.2.9", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/SharePointFramework/ProjectExtensions/package.json b/SharePointFramework/ProjectExtensions/package.json index e8d0ffac7..4faf63468 100644 --- a/SharePointFramework/ProjectExtensions/package.json +++ b/SharePointFramework/ProjectExtensions/package.json @@ -1,6 +1,6 @@ { "name": "pp365-projectextensions", - "version": "1.2.9", + "version": "1.3.0", "engines": { "node": ">=12.13.0" }, diff --git a/SharePointFramework/ProjectExtensions/src/components/ErrorDialog/index.tsx b/SharePointFramework/ProjectExtensions/src/components/ErrorDialog/index.tsx index c8fa8b3c5..0484c7146 100644 --- a/SharePointFramework/ProjectExtensions/src/components/ErrorDialog/index.tsx +++ b/SharePointFramework/ProjectExtensions/src/components/ErrorDialog/index.tsx @@ -1,4 +1,4 @@ -import { DefaultButton } from 'office-ui-fabric-react/lib/Button' +import { DefaultButton, PrimaryButton } from 'office-ui-fabric-react/lib/Button' import { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar' import * as strings from 'ProjectExtensionsStrings' import * as React from 'react' @@ -11,16 +11,26 @@ export const ErrorDialog = ({ error, version, messageType = MessageBarType.error, - onDismiss + onDismiss, + onSetupClick }: IErrorDialogProps) => { const onRenderFooter = () => { + if (error.name === 'AlreadySetup') { + return ( + <> + + + + ) + } return ( <> - + ) } + return ( { private _portal: PortalDataService + private isSetup = true private _placeholderIds = { ErrorDialog: getId('errordialog'), ProgressDialog: getId('progressdialog'), @@ -51,24 +51,33 @@ export default class ProjectSetup extends BaseApplicationCustomizer(ErrorDialog, { ...props, version: this.manifest.version, - onDismiss: () => this._unmount(placeholder), - messageType: props.error['messageType'] + onDismiss: async () => { + if (this.isSetup) { + await deleteCustomizer(this.context.pageContext.web.absoluteUrl, this.componentId, false) + } + this._unmount(placeholder) + }, + messageType: props.error['messageType'], + onSetupClick: () => { + this._initializeSetup({ + web: new Web(this.context.pageContext.web.absoluteUrl) as any, + webAbsoluteUrl: this.context.pageContext.web.absoluteUrl, + templateExcludeHandlers: [], + context: this.context, + properties: this.properties + }) + this._unmount(placeholder) + } }) ReactDOM.render(element, placeholder) } @@ -216,7 +240,7 @@ export default class ProjectSetup extends BaseApplicationCustomizer Date: Tue, 12 Oct 2021 15:46:50 +0200 Subject: [PATCH 4/4] Fixed wrong phases being displayed when switching between projects with different phases (#544) Co-authored-by: Ole Martin Pettersen --- CHANGELOG.md | 1 + SharePointFramework/@Shared/package-lock.json | 2 +- SharePointFramework/@Shared/package.json | 2 +- .../@Shared/src/services/ProjectDataService/index.ts | 2 +- SharePointFramework/PortfolioWebParts/package-lock.json | 8 ++++---- SharePointFramework/PortfolioWebParts/package.json | 2 +- SharePointFramework/ProjectExtensions/package-lock.json | 6 +++--- SharePointFramework/ProjectExtensions/package.json | 2 +- SharePointFramework/ProjectWebParts/package-lock.json | 6 +++--- SharePointFramework/ProjectWebParts/package.json | 2 +- 10 files changed, 17 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0f4e0915..9fd0a40f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Every change is marked with issue ID. - Fixed UI bug by downgrading the `office-ui-fabric-react` package version to `6.214.0` #535 - Fixed redirect after creating a new project status #530 - Fixed project wizard bug when project is attached to another hub #532 +- Fixed wrong phases being displayed when switching between projects with different phases #520 ## 1.2.9 - 08.09.2021 diff --git a/SharePointFramework/@Shared/package-lock.json b/SharePointFramework/@Shared/package-lock.json index 318075884..4c8252adb 100644 --- a/SharePointFramework/@Shared/package-lock.json +++ b/SharePointFramework/@Shared/package-lock.json @@ -1,6 +1,6 @@ { "name": "pp365-shared", - "version": "1.3.3", + "version": "1.3.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/SharePointFramework/@Shared/package.json b/SharePointFramework/@Shared/package.json index 12d69b745..6b5a2bd05 100644 --- a/SharePointFramework/@Shared/package.json +++ b/SharePointFramework/@Shared/package.json @@ -3,7 +3,7 @@ "engines": { "node": ">=12.13.0" }, - "version": "1.3.3", + "version": "1.3.4", "description": "Shared utilities, helpers and models", "main": "lib/index.js", "scripts": { diff --git a/SharePointFramework/@Shared/src/services/ProjectDataService/index.ts b/SharePointFramework/@Shared/src/services/ProjectDataService/index.ts index ca0d8cb10..3234c60aa 100644 --- a/SharePointFramework/@Shared/src/services/ProjectDataService/index.ts +++ b/SharePointFramework/@Shared/src/services/ProjectDataService/index.ts @@ -18,7 +18,7 @@ export class ProjectDataService { private _storage: PnPClientStore private _storageKeys: TypedHash = { _getPropertyItemContext: '{0}_propertyitemcontext', - getPhases: 'projectphases_terms' + getPhases: '{0}_projectphases_terms' } private _web: Web diff --git a/SharePointFramework/PortfolioWebParts/package-lock.json b/SharePointFramework/PortfolioWebParts/package-lock.json index 348d4b9d3..f4c34c952 100644 --- a/SharePointFramework/PortfolioWebParts/package-lock.json +++ b/SharePointFramework/PortfolioWebParts/package-lock.json @@ -20102,7 +20102,7 @@ "get-value": "3.0.1", "msgraph-helper": "0.7.1", "office-ui-fabric-react": "6.214.0", - "pp365-shared": "^1.3.3", + "pp365-shared": "^1.3.4", "pzl-spfx-components": "0.0.11", "react": "16.8.5", "react-dom": "16.8.5", @@ -20651,9 +20651,9 @@ } }, "pp365-shared": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.3.tgz", - "integrity": "sha512-xykYhuX1lPLONqu+/yZLKXXv/KsgotDvqiuLtPJkFlp5v/6dUZ9AQM6RgtQhc1Y/tBPJCH5f0TicC3Y9LomR0w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.4.tgz", + "integrity": "sha512-oHxnavSKwoScDM8tQgtqhIW1C5dmNCSI1bIEABM+fXKZXhJtGkhV+tQQvkqtKMplSisJj/vRxqA52e379ucFGQ==", "requires": { "@microsoft/sp-core-library": "1.11.0", "@microsoft/sp-page-context": "1.11.0", diff --git a/SharePointFramework/PortfolioWebParts/package.json b/SharePointFramework/PortfolioWebParts/package.json index 7a3ae40ea..210bf6165 100644 --- a/SharePointFramework/PortfolioWebParts/package.json +++ b/SharePointFramework/PortfolioWebParts/package.json @@ -43,7 +43,7 @@ "object-assign": "4.1.1", "office-ui-fabric-react": "6.214.0", "pp365-projectwebparts": "latest", - "pp365-shared": "1.3.3", + "pp365-shared": "1.3.4", "pzl-react-reusable-components": "^0.0.14", "react": "16.9.0", "react-calendar-timeline": "0.27.0", diff --git a/SharePointFramework/ProjectExtensions/package-lock.json b/SharePointFramework/ProjectExtensions/package-lock.json index a4adb7bec..77bf085ad 100644 --- a/SharePointFramework/ProjectExtensions/package-lock.json +++ b/SharePointFramework/ProjectExtensions/package-lock.json @@ -21443,9 +21443,9 @@ "dev": true }, "pp365-shared": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.3.tgz", - "integrity": "sha512-xykYhuX1lPLONqu+/yZLKXXv/KsgotDvqiuLtPJkFlp5v/6dUZ9AQM6RgtQhc1Y/tBPJCH5f0TicC3Y9LomR0w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.4.tgz", + "integrity": "sha512-oHxnavSKwoScDM8tQgtqhIW1C5dmNCSI1bIEABM+fXKZXhJtGkhV+tQQvkqtKMplSisJj/vRxqA52e379ucFGQ==", "requires": { "@microsoft/sp-core-library": "1.11.0", "@microsoft/sp-page-context": "1.11.0", diff --git a/SharePointFramework/ProjectExtensions/package.json b/SharePointFramework/ProjectExtensions/package.json index 4faf63468..cc616f2da 100644 --- a/SharePointFramework/ProjectExtensions/package.json +++ b/SharePointFramework/ProjectExtensions/package.json @@ -41,7 +41,7 @@ "@uifabric/utilities": "6.45.1", "msgraph-helper": "0.8.3", "office-ui-fabric-react": "6.214.0", - "pp365-shared": "1.3.3", + "pp365-shared": "1.3.4", "react": "16.9.0", "react-dom": "16.9.0", "react-markdown": "4.2.2", diff --git a/SharePointFramework/ProjectWebParts/package-lock.json b/SharePointFramework/ProjectWebParts/package-lock.json index 0a8c1f4e9..b7c1d90e9 100644 --- a/SharePointFramework/ProjectWebParts/package-lock.json +++ b/SharePointFramework/ProjectWebParts/package-lock.json @@ -20699,9 +20699,9 @@ } }, "pp365-shared": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.3.tgz", - "integrity": "sha512-xykYhuX1lPLONqu+/yZLKXXv/KsgotDvqiuLtPJkFlp5v/6dUZ9AQM6RgtQhc1Y/tBPJCH5f0TicC3Y9LomR0w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/pp365-shared/-/pp365-shared-1.3.4.tgz", + "integrity": "sha512-oHxnavSKwoScDM8tQgtqhIW1C5dmNCSI1bIEABM+fXKZXhJtGkhV+tQQvkqtKMplSisJj/vRxqA52e379ucFGQ==", "requires": { "@microsoft/sp-core-library": "1.11.0", "@microsoft/sp-page-context": "1.11.0", diff --git a/SharePointFramework/ProjectWebParts/package.json b/SharePointFramework/ProjectWebParts/package.json index aff68d271..7820fa66b 100644 --- a/SharePointFramework/ProjectWebParts/package.json +++ b/SharePointFramework/ProjectWebParts/package.json @@ -47,7 +47,7 @@ "msgraph-helper": "0.7.1", "office-ui-fabric-react": "6.214.0", "pp365-portfoliowebparts": "1.3.1", - "pp365-shared": "1.3.3", + "pp365-shared": "1.3.4", "pzl-spfx-components": "0.0.11", "react": "16.8.5", "react-calendar-timeline": "0.26.0",