Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
480d67d
BudgetView: Add incomingChanges section
ltwheeler Nov 28, 2018
61d5965
Add structure to calculate differences between IPA and scenario
ltwheeler Nov 28, 2018
c254c32
Add budgetScenario check on incomingChange calculations
ltwheeler Nov 28, 2018
1c02dda
Merge branch 'develop' into feature/incoming-changes
ltwheeler Dec 12, 2018
4642d0b
Adding pure function helpers for comparison
ltwheeler Dec 12, 2018
1d5bd29
calculate change value rows
ltwheeler Dec 12, 2018
3ca1db7
Add missing course calculations
ltwheeler Dec 12, 2018
698b79c
Fix issues in value change calculations
ltwheeler Dec 13, 2018
b72cd8b
Fix logic for calculation of courses missing from scenario
ltwheeler Dec 13, 2018
0edf01a
Fixing calculation of courses not persisted, but present in scenario
ltwheeler Dec 13, 2018
252fc85
Add term filtering to changes in table display
ltwheeler Dec 13, 2018
9363b10
Adding table display information
ltwheeler Dec 13, 2018
4e4220a
Improving incoming changes layout and styling
ltwheeler Dec 14, 2018
aa7d883
Separate changes into term based arrays to ensure even odd styling
ltwheeler Dec 14, 2018
9e45182
Adding courseHeaders to incoming changes table
ltwheeler Dec 14, 2018
0c89d31
Styling courseHeaders in incoming changes
ltwheeler Dec 14, 2018
51046d4
Additional course header styling on incoming changes table
ltwheeler Dec 14, 2018
404f1b0
Fixing styling issues
ltwheeler Dec 14, 2018
eb17a19
Display 'no changes' appropriately in incoming changes
ltwheeler Dec 14, 2018
3123145
Add context to buttons
ltwheeler Dec 14, 2018
fbab2ea
Fixing display errors in tooltips
ltwheeler Dec 14, 2018
02fea20
Add ability to sync individual changes from incoming changes screen
ltwheeler Dec 14, 2018
2c5055f
Merge branch 'develop' into feature/incoming-changes
ltwheeler Dec 14, 2018
38e47b3
Add ability to accept all changes for a course
ltwheeler Dec 15, 2018
20dbe5d
Ensure relevant meta-data is available when creating sectionGroupCosts
ltwheeler Dec 17, 2018
4eed2fe
Fix bug in calculation of instructorType change
ltwheeler Dec 17, 2018
05020bb
Remove debugger
ltwheeler Dec 17, 2018
983565e
Should confirm before applying term changes
ltwheeler Dec 17, 2018
b6870a4
Add change count to term headers
ltwheeler Dec 17, 2018
4f9ec68
Fixing whitespace
ltwheeler Dec 17, 2018
e42e332
Remove debugger line
ltwheeler Dec 17, 2018
290b8a9
Fixing whitespace
ltwheeler Dec 17, 2018
47412aa
Update comment
ltwheeler Dec 17, 2018
8766c4d
Fixing layout alignment on incoming changes
ltwheeler Dec 17, 2018
e778289
Merge branch 'develop' into feature/incoming-changes
ltwheeler Dec 17, 2018
5589f23
Merge branch 'develop' into feature/incoming-changes
ltwheeler Dec 17, 2018
34a2445
Removing a disabled flag should be treated as an update, not a creation
ltwheeler Dec 17, 2018
7ab7d24
Should capitalize change descriptors
ltwheeler Dec 17, 2018
d1e5c9e
Fix tooltip language on incoming changes
ltwheeler Dec 17, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 97 additions & 90 deletions app/budget/BudgetCtrl.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,104 +3,111 @@
<ipa-header page-title="Budget"></ipa-header>

<div class="budget-view">
<spinner ng-if="!view.state"
size="20" style="padding-top: 200px;">
</spinner>
<spinner ng-if="!view.state"
size="20" style="padding-top: 200px;">
</spinner>

<div ng-if="view.state">
<!-- Modals -->
<ipa-modal is-visible="view.state.openAddBudgetScenario"
header-text="Add New Budget Scenario">
<add-budget-scenario ng-if="view.state.openAddBudgetScenario"
state="view.state"
is-visible="view.state.openAddBudgetScenario">
</add-budget-scenario>
</ipa-modal>
<div ng-if="view.state">
<!-- Modals -->
<ipa-modal is-visible="view.state.openAddBudgetScenario"
header-text="Add New Budget Scenario">
<add-budget-scenario ng-if="view.state.openAddBudgetScenario"
state="view.state"
is-visible="view.state.openAddBudgetScenario">
</add-budget-scenario>
</ipa-modal>

<ipa-modal is-visible="view.state.ui.isAddLineItemModalOpen"
header-text="Line Item">
<add-line-item ng-if="view.state.ui.isAddLineItemModalOpen"
state="view.state"
is-visible="view.state.ui.isAddLineItemModalOpen"
line-item-to-edit="view.state.ui.lineItemToEdit">
</add-line-item>
</ipa-modal>
<ipa-modal is-visible="view.state.ui.isAddLineItemModalOpen"
header-text="Line Item">
<add-line-item ng-if="view.state.ui.isAddLineItemModalOpen"
state="view.state"
is-visible="view.state.ui.isAddLineItemModalOpen"
line-item-to-edit="view.state.ui.lineItemToEdit">
</add-line-item>
</ipa-modal>

<ipa-modal is-visible="view.state.ui.isBudgetConfigModalOpen"
header-text="Terms"
styles="budgetConfigStyles">
<budget-config ng-if="view.state.ui.isBudgetConfigModalOpen"
state="view.state"
selected-budget-scenario="view.state.selectedBudgetScenario"
is-visible="view.state.ui.isBudgetConfigModalOpen">
</budget-config>
</ipa-modal>
<ipa-modal is-visible="view.state.ui.isBudgetConfigModalOpen"
header-text="Terms"
styles="budgetConfigStyles">
<budget-config ng-if="view.state.ui.isBudgetConfigModalOpen"
state="view.state"
selected-budget-scenario="view.state.selectedBudgetScenario"
is-visible="view.state.ui.isBudgetConfigModalOpen">
</budget-config>
</ipa-modal>

<ipa-modal is-visible="view.state.ui.courseCommentsModal.isOpen"
header-text="Course Comments">
<add-course-comments ng-if="view.state.ui.courseCommentsModal.isOpen"
section-group-cost="view.state.ui.courseCommentsModal.sectionGroupCost"
current-user-login-id="currentUser.loginId"
is-visible="view.state.ui.courseCommentsModal.isOpen">
</add-course-comments>
</ipa-modal>
<ipa-modal is-visible="view.state.ui.courseCommentsModal.isOpen"
header-text="Course Comments">
<add-course-comments ng-if="view.state.ui.courseCommentsModal.isOpen"
section-group-cost="view.state.ui.courseCommentsModal.sectionGroupCost"
current-user-login-id="currentUser.loginId"
is-visible="view.state.ui.courseCommentsModal.isOpen">
</add-course-comments>
</ipa-modal>


<ipa-modal class="add-course__modal" is-visible="view.state.ui.addCourseModal.isOpen"
header-text="Add Course">
<add-course ng-if="view.state.ui.addCourseModal.isOpen"
state="view.state"
is-visible="view.state.ui.addCourseModal.isOpen">
</add-course>
</ipa-modal>
<ipa-modal class="add-course__modal" is-visible="view.state.ui.addCourseModal.isOpen"
header-text="Add Course">
<add-course ng-if="view.state.ui.addCourseModal.isOpen"
state="view.state"
is-visible="view.state.ui.addCourseModal.isOpen">
</add-course>
</ipa-modal>

<ipa-modal is-visible="view.state.ui.lineItemCommentsModal.isOpen"
header-text="Line Item Comments">
<add-line-item-comments ng-if="view.state.ui.lineItemCommentsModal.isOpen"
line-item="view.state.ui.lineItemCommentsModal.lineItem"
current-user-login-id="currentUser.loginId"
is-visible="view.state.ui.lineItemCommentsModal.isOpen">
</add-line-item-comments>
</ipa-modal>
<ipa-modal is-visible="view.state.ui.lineItemCommentsModal.isOpen"
header-text="Line Item Comments">
<add-line-item-comments ng-if="view.state.ui.lineItemCommentsModal.isOpen"
line-item="view.state.ui.lineItemCommentsModal.lineItem"
current-user-login-id="currentUser.loginId"
is-visible="view.state.ui.lineItemCommentsModal.isOpen">
</add-line-item-comments>
</ipa-modal>

<budget-scenario-toolbar state="view.state"></budget-scenario-toolbar>
<budget-scenario-toolbar state="view.state"></budget-scenario-toolbar>

<budget-nav class="budget-view__nav-container"
total-balance="view.state.selectedBudgetScenario.summary.totalBalance"
selected-section="view.state.ui.sectionNav.activeTab"
selected-budget-scenario="view.state.selectedBudgetScenario"
selected-line-items="view.state.ui.selectedLineItems"
filters="view.state.ui.filters"
funds-nav="view.state.ui.fundsNav.activeTab">
</budget-nav>
<budget-nav class="budget-view__nav-container"
total-balance="view.state.selectedBudgetScenario.summary.totalBalance"
selected-section="view.state.ui.sectionNav.activeTab"
selected-budget-scenario="view.state.selectedBudgetScenario"
selected-line-items="view.state.ui.selectedLineItems"
filters="view.state.ui.filters"
funds-nav="view.state.ui.fundsNav.activeTab">
</budget-nav>

<div class="page-content">
<budget-summary ng-if="view.state.ui.sectionNav.activeTab == 'Summary'"
summary="view.state.summary"
instructor-types="view.state.instructorTypes"
selected-budget-scenario="view.state.selectedBudgetScenario">
</budget-summary>
<line-items ng-if="view.state.ui.sectionNav.activeTab == 'Funds'"
selected-budget-scenario="view.state.selectedBudgetScenario"
line-items="view.state.calculatedLineItems"
ui="view.state.ui">
</line-items>
<budget-costs ng-if="view.state.ui.sectionNav.activeTab == 'Schedule Costs'"
instructor-assignment-options="view.state.ui.instructorAssignmentOptions"
regular-instructor-assignment-options="view.state.ui.regularInstructorAssignmentOptions"
schedule-costs="view.state.calculatedScheduleCosts"
term-nav="view.state.ui.termNav"
summary="view.state.summary">
</budget-costs>
<instructor-list ng-if="view.state.ui.sectionNav.activeTab == 'Instructor List'"
state="view.state"
selected-budget-scenario="view.state.selectedBudgetScenario">
</instructor-list>
<course-list ng-if="view.state.ui.sectionNav.activeTab == 'Course List'"
course-list="view.state.calculatedCourseList"
term-nav="view.state.ui.termNav"
selected-budget-scenario="view.state.selectedBudgetScenario">
</instructor-list>
</div>
</div>
<div class="page-content">
<budget-summary ng-if="view.state.ui.sectionNav.activeTab == 'Summary'"
summary="view.state.summary"
instructor-types="view.state.instructorTypes"
selected-budget-scenario="view.state.selectedBudgetScenario">
</budget-summary>
<line-items ng-if="view.state.ui.sectionNav.activeTab == 'Funds'"
selected-budget-scenario="view.state.selectedBudgetScenario"
line-items="view.state.calculatedLineItems"
ui="view.state.ui">
</line-items>
<budget-costs ng-if="view.state.ui.sectionNav.activeTab == 'Schedule Costs'"
instructor-assignment-options="view.state.ui.instructorAssignmentOptions"
regular-instructor-assignment-options="view.state.ui.regularInstructorAssignmentOptions"
schedule-costs="view.state.calculatedScheduleCosts"
term-nav="view.state.ui.termNav"
summary="view.state.summary">
</budget-costs>
<instructor-list ng-if="view.state.ui.sectionNav.activeTab == 'Instructor List'"
state="view.state"
selected-budget-scenario="view.state.selectedBudgetScenario">
</instructor-list>
<course-list ng-if="view.state.ui.sectionNav.activeTab == 'Course List'"
course-list="view.state.calculatedCourseList"
term-nav="view.state.ui.termNav"
selected-budget-scenario="view.state.selectedBudgetScenario">
</course-list>
<incoming-changes ng-if="view.state.ui.sectionNav.activeTab == 'Incoming Changes'"
courses="view.state.courses"
section-groups="view.state.sectionGroups"
section-group-costs="view.state.sectionGroupCosts"
term-nav="view.state.ui.termNav"
selected-budget-scenario="view.state.selectedBudgetScenario">
</incoming-changes>
</div>
</div>
</div>
2 changes: 2 additions & 0 deletions app/budget/budgetApp.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import AuthService from './../shared/services/AuthService.js';
import SectionService from './../shared/services/SectionService.js';

// Directives
import incomingChanges from './directives/incomingChanges/incomingChanges.js';
import budgetNav from './directives/budgetNav/budgetNav.js';
import lineItemFilters from './directives/budgetNav/lineItemFilters/lineItemFilters.js';

Expand Down Expand Up @@ -103,6 +104,7 @@ const budgetApp = angular.module("budgetApp", dependencies)
.directive('addLineItem', addLineItem)
.directive('addLineItemComments', addLineItemComments)
.directive('courseList', courseList)
.directive('incomingChanges', incomingChanges)
.constant('ActionTypes', {
INIT_STATE: "INIT_STATE",
CREATE_BUDGET_SCENARIO: "CREATE_BUDGET_SCENARIO",
Expand Down
3 changes: 3 additions & 0 deletions app/budget/directives/budgetNav/budgetNav.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
<div class="budget-nav__nav-item" ng-click="setRoute('Course List')" ng-class="{ 'budget-nav__nav-item--active': selectedSection == 'Course List' }">
Course List
</div>
<div class="budget-nav__nav-item" ng-click="setRoute('Incoming Changes')" ng-class="{ 'budget-nav__nav-item--active': selectedSection == 'Incoming Changes' }">
Incoming Changes
</div>
</div>

<div class="budget-nav__side-bar">
Expand Down
63 changes: 63 additions & 0 deletions app/budget/directives/incomingChanges/incomingChanges.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
.incoming-changes__title {
font-weight: bold;
}

.incoming-changes__change-text {
color: rgb(153, 153, 153);
text-transform: capitalize;
}

.incoming-changes__sub-title-indent {
margin-left: 10px;
}

.incoming-changes__course-divide {
border-bottom: 1px black solid;
}

.incoming-changes__section-divide {
border-top: 1px #ebebeb solid;
}

.incoming-changes__ui {
text-align: end;
padding-right: 15px;
}

.incoming-changes__table {
width: 100%;
margin-bottom: 20px;
}

.incoming-changes__apply-term {
padding-bottom: 20px;
padding-top: 20px;
display: flex;
justify-content: center;
align-content: center;
border-bottom: 1p solid #ebebeb;
}

.incoming-changes__table-header {
width: 10%;
border-bottom: 1px solid #ddd;
border-top: 1px solid #ddd;
padding-top: 10px;
padding-bottom: 10px;
}

.incoming-changes__table-header-container {
border-right: 1px solid #ddd;
padding-left: 15px;
padding-right: 15px;
padding-top: 5px;
padding-bottom: 5px;
}

.incoming-changes__no-changes {
color: #777;
display: flex;
justify-content: center;
align-items: center;
padding-top: 20px;
}
106 changes: 106 additions & 0 deletions app/budget/directives/incomingChanges/incomingChanges.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<div class="incoming-changes">
<ipa-tabs tab-names="termNav.allTabs"
active-tab="termNav.activeTab"
select-tab="setActiveTerm"
tab-overrides="tabOverrides"
slim="true">
<div>
<div ng-if="changes[termNav.activeTerm].length > 0" class="incoming-changes__apply-term">
<ipa-button text="'Apply (' + totalChanges[termNav.activeTerm] + ') changes in ' + termNav.activeTab"
skin="'dark'"
confirm-message="'Are you sure you want to apply all changes in ' + termNav.activeTab + '?'"
on-click="applyTermChanges()">
</ipa-button>
</div>
<table class="incoming-changes__table">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="incoming-changes__table-header">
<div class="incoming-changes__table-header-container">
Course
</div>
</th>
<th class="incoming-changes__table-header">
<div class="incoming-changes__table-header-container">
Change
</div>
</th>
<th class="incoming-changes__table-header">
<div class="incoming-changes__table-header-container">
Scheduled
</div>
</th>
<th class="incoming-changes__table-header">
<div class="incoming-changes__table-header-container">
Scenario
</div>
</th>
<th class="incoming-changes__table-header">
<div class="incoming-changes__table-header-container"></div>
</th>
</tr>
</thead>

<tbody>
<tr ng-repeat="change in changes[termNav.activeTerm]" ng-class="{'incoming-changes__course-divide': change.courseHeader, 'incoming-changes__section-divide': !change.courseHeader}">
<td class="course-list__cell">
<div class="incoming-changes__title">
{{ change.display.title }}
</div>
<div ng-class="{ 'incoming-changes__sub-title-indent': !change.display.title }">
{{ change.display.subTitle }}
</div>
</td>
<td class="incoming-changes__course-header-ui" ng-if="change.courseHeader" colspan="4">
<span>
<ipa-button text="'Apply (' + change.payload.changes.length + ') changes in ' + change.course"
size="'small'"
skin="'dark'"
confirm-message="'Are you sure you want to apply changes to ' + change.course + '?'"
on-click="applyCourseChanges(change)">
</ipa-button>
</span>
</td>
<td ng-if="!change.courseHeader" class="course-list__cell">
<span class="incoming-changes__change-text">
{{ change.display.changeText }}
</span>
</td>
<td ng-if="!change.courseHeader" class="course-list__cell">
<i ng-if="change.display.scheduleText == 'check'" class="glyphicon glyphicon-check"></i>
<span ng-if="change.display.scheduleText != 'check'">{{ change.display.scheduleText }}</span>
</td>
<td ng-if="!change.courseHeader" class="course-list__cell">
<i ng-if="change.display.scenarioText == 'check'" class="glyphicon glyphicon-check"></i>
<span ng-if="change.display.scenarioText != 'check'">{{ change.display.scenarioText }}</span>
</td>
<td ng-if="!change.courseHeader" class="course-list__cell incoming-changes__ui">
<span ng-if="!change.courseHeader">
<ipa-button text="'Apply ' + change.display.changeText"
size="'small'"
skin="'dark'"
confirm-message="change.display.tooltip"
on-click="applyChange(change)">
</ipa-button>
</span>
</td>
</tr>
<tr ng-show="!changes[termNav.activeTerm]">
<td colspan="5">
<div class="incoming-changes__no-changes">
No changes
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ipa-tabs>
</div>
Loading