@byu-oit/vue-decision-processing-components 8.34.1 → 8.35.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.github/workflows/deploy.yml +51 -0
  2. package/.repo-meta.yml +55 -55
  3. package/AdmitPeriodConfig.vue +115 -115
  4. package/ApiCallButton.vue +91 -91
  5. package/ApplicantInfo.vue +100 -100
  6. package/AssignmentBulkDialog.vue +153 -153
  7. package/AssignmentDialog.vue +117 -117
  8. package/AssignmentSummary.vue +75 -75
  9. package/BackgroundBadge.vue +83 -83
  10. package/BackgroundDetailCrime.vue +78 -78
  11. package/BackgroundDetailPluralMarriage.vue +43 -43
  12. package/BackgroundDetailSexRegistry.vue +43 -43
  13. package/BackgroundDetailUniversity.vue +37 -37
  14. package/CHANGELOG.md +676 -665
  15. package/Dashboard.vue +201 -201
  16. package/DashboardApplicationList.vue +50 -50
  17. package/DecisionDialog.vue +178 -178
  18. package/Details.vue +124 -124
  19. package/DetailsActivity.vue +59 -59
  20. package/DetailsBackground.vue +143 -143
  21. package/DetailsBackgroundDetail.vue +47 -47
  22. package/DetailsBackgroundSummary.vue +66 -66
  23. package/DetailsCesHold.vue +107 -107
  24. package/DetailsCollege.vue +93 -93
  25. package/DetailsContact.vue +65 -65
  26. package/DetailsDecision.vue +183 -183
  27. package/DetailsDecisionHistory.vue +56 -56
  28. package/DetailsEndorsement.vue +74 -74
  29. package/DetailsEssay.vue +59 -59
  30. package/DetailsFilenote.vue +62 -62
  31. package/DetailsFilenoteList.vue +109 -109
  32. package/DetailsFlagSection.vue +176 -176
  33. package/DetailsHeader.vue +263 -263
  34. package/DetailsHighSchool.vue +99 -99
  35. package/DetailsHsTranscript.vue +100 -100
  36. package/DetailsInstitute.vue +90 -90
  37. package/DetailsMission.vue +88 -88
  38. package/DetailsNewAppHistory.vue +50 -50
  39. package/DetailsNotes.vue +83 -83
  40. package/DetailsPathway.vue +45 -45
  41. package/DetailsScoringSection.vue +128 -128
  42. package/DetailsSection.vue +116 -116
  43. package/DetailsSeminary.vue +184 -184
  44. package/DetailsSrs.vue +52 -52
  45. package/DetailsSubnav.vue +54 -54
  46. package/DetailsTestScores.vue +131 -131
  47. package/ExpandIndicator.vue +75 -75
  48. package/ExternalLink.vue +34 -34
  49. package/FilterBreadcrumb.vue +85 -85
  50. package/FilterButton.vue +86 -86
  51. package/FilterButtonAdmitPeriod.vue +104 -109
  52. package/FilterButtonAppType.vue +103 -103
  53. package/FilterButtonAssignedTo.vue +96 -96
  54. package/FilterButtonClearFilters.vue +65 -65
  55. package/FilterButtonSex.vue +105 -105
  56. package/FlagButton.vue +59 -59
  57. package/FlagDialog.vue +129 -129
  58. package/Footer.vue +432 -432
  59. package/Header.vue +132 -132
  60. package/HighSchoolSummary.vue +60 -60
  61. package/InternationalIndicator.vue +44 -44
  62. package/InternationalStatus.vue +48 -48
  63. package/LICENSE +201 -201
  64. package/LoadingBadge.vue +58 -58
  65. package/ManageAssignments.vue +123 -123
  66. package/NoAuth.vue +14 -14
  67. package/NoteDialog.vue +106 -106
  68. package/ObjectViewer.vue +49 -49
  69. package/Queues.vue +268 -268
  70. package/QuickLinks.vue +25 -25
  71. package/README.md +2 -2
  72. package/RecentApplications.vue +53 -53
  73. package/Report.vue +340 -340
  74. package/ReportDetail.vue +279 -279
  75. package/ReportList.vue +87 -87
  76. package/ReportPhotos.vue +65 -65
  77. package/ReportSvg.vue +78 -78
  78. package/ReportViewer.vue +165 -165
  79. package/RequestAccess.vue +14 -14
  80. package/RequestAccessList.vue +45 -45
  81. package/RoleSelector.vue +29 -29
  82. package/Search.vue +22 -22
  83. package/ShowApplicantIds.vue +100 -0
  84. package/SortableHeader.vue +53 -53
  85. package/Spinner.vue +34 -34
  86. package/StarredIndicator.vue +36 -36
  87. package/StatBox.vue +73 -73
  88. package/StatCharts.vue +196 -196
  89. package/SupportDialog.vue +172 -172
  90. package/UserInfo.vue +52 -52
  91. package/YesNoIndicator.vue +48 -48
  92. package/dateTimeFormat.js +67 -67
  93. package/gpaCalculation.js +162 -162
  94. package/gpaFilter.js +5 -5
  95. package/hsSummary.json +2019 -2019
  96. package/package.json +36 -36
  97. package/parsers/application.js +396 -396
  98. package/parsers/decisionHistory.js +27 -27
  99. package/parsers/filenotes.js +27 -27
  100. package/parsers/notes.js +49 -49
  101. package/parsers/packet.js +88 -88
  102. package/parsers/packetList.js +57 -57
  103. package/parsers/reports.js +13 -13
  104. package/sat2Act.js +46 -46
  105. package/test.js +48 -48
  106. package/themes/ByuiFooter.vue +38 -38
  107. package/themes/ByuiHeader.vue +96 -96
  108. package/themes/LdsbcFooter.vue +38 -38
  109. package/themes/LdsbcHeader.vue +100 -100
  110. package/vuexModules/application/activity.js +32 -32
  111. package/vuexModules/application/applicationList.js +71 -71
  112. package/vuexModules/application/background.js +47 -47
  113. package/vuexModules/application/bio.js +38 -38
  114. package/vuexModules/application/citizenship.js +30 -30
  115. package/vuexModules/application/collegeSummaries.js +32 -32
  116. package/vuexModules/application/essay.js +26 -26
  117. package/vuexModules/application/highSchoolSummaries.js +40 -40
  118. package/vuexModules/application/index.js +157 -157
  119. package/vuexModules/application/institute.js +30 -30
  120. package/vuexModules/application/mission.js +48 -48
  121. package/vuexModules/application/personalRecords.js +24 -24
  122. package/vuexModules/application/questions.js +23 -23
  123. package/vuexModules/application/seminary.js +39 -39
  124. package/vuexModules/application/testScores.js +26 -26
  125. package/vuexModules/notes/index.js +22 -22
  126. package/vuexModules/packet/decision.js +43 -43
  127. package/vuexModules/packet/decisionHistory.js +28 -28
  128. package/vuexModules/packet/flags.js +174 -174
  129. package/vuexModules/packet/index.js +52 -52
  130. package/vuexModules/packet/packetList.js +127 -127
  131. package/vuexModules/packet/processes.js +28 -28
  132. package/vuexModules/reports/index.js +32 -32
  133. package/vuexModules/ui/index.js +56 -56
  134. package/vuexModules/users/index.js +46 -46
  135. package/yyyyMmFilter.js +7 -7
@@ -0,0 +1,51 @@
1
+ name: Deployment
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+
7
+ env:
8
+ node_version: "14"
9
+
10
+ jobs:
11
+ publish:
12
+ concurrency: publish
13
+ name: Publish npm package
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Check out
17
+ uses: actions/checkout@v2
18
+
19
+ - name: Set up Node.js
20
+ uses: actions/setup-node@v2.1.4
21
+ with:
22
+ node-version: ${{ env.node_version }}
23
+ registry-url: https://npm.pkg.github.com
24
+ scope: '@byu-oit'
25
+
26
+ - name: Build
27
+ run: |
28
+ npm install
29
+ npm run build
30
+ env:
31
+ NODE_AUTH_TOKEN: ${{ secrets.GPM_TOKEN }}
32
+
33
+ - name: Lint
34
+ run: npm run lint
35
+
36
+ - name: Publish
37
+ run: npm publish
38
+ env:
39
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
40
+
41
+ - name: Set up Node.js
42
+ uses: actions/setup-node@v2.1.4
43
+ with:
44
+ node-version: ${{ env.node_version }}
45
+ registry-url: https://registry.npmjs.org
46
+ scope: '@byu-oit'
47
+
48
+ - name: Publish
49
+ run: npm publish --access public
50
+ env:
51
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/.repo-meta.yml CHANGED
@@ -1,55 +1,55 @@
1
- # For full spec reference see https://github.com/byu-oit/repo-meta/blob/master/repo-meta-template.yml
2
- # This file was automatically generated. It is used for various integrations like creating and updating Software CIs in the CMDB.
3
- # You are required to maintain Software CI records in the CMDB for all of the deployable software artifacts you maintain.
4
- # You can fill in the information here and have the integration do that for you or you can do that yourself manually.
5
- $schemaver: 2.1
6
- repo_url: https://github.com/byu-oit/vue-decision-processing-components # optional
7
- software:
8
- - name: vue-decision-processing-components # optional
9
- deploy_to_cmdb: true # optional
10
- type: ''
11
- aliases: # optional
12
- short_description: Vue.js components to be shared between the decision processing
13
- applications for the various CES Schools. # optional
14
- assignment_group: gro:OIT-App Dev Student Info Mgmt
15
- notes: # optional
16
- maintained_by: # optional
17
- - arasmus8
18
- data_sensitivity: internal
19
- developed_by_byu: true # optional
20
- ddd: # optional
21
- business_domain:
22
- ubiquitous_language_url:
23
- context_map_url:
24
- links: # optional
25
- system_documentation_url: https://github.com/byu-oit/vue-decision-processing-components
26
- swagger_urls:
27
- microservice: true # optional
28
- technologies_used: # optional
29
- - Vue
30
- - JavaScript
31
- - NodeJS
32
- standard_change_template:
33
- stages:
34
- development:
35
- urls: # optional
36
- product_page:
37
- physical_url:
38
- virtual_url:
39
- hosting_location: ''
40
- aws_account: # optional
41
- relationships: # optional
42
- depends_on: # optional
43
- db_read_write:
44
- db_read_only:
45
- software:
46
- supports: # optional
47
- software:
48
- service:
49
- reverse_proxy: # optional
50
- runs_on: # optional
51
- server_cluster:
52
- virtual_server:
53
- rack_server:
54
- blade_server:
55
- data-sensitivity: ''
1
+ # For full spec reference see https://github.com/byu-oit/repo-meta/blob/master/repo-meta-template.yml
2
+ # This file was automatically generated. It is used for various integrations like creating and updating Software CIs in the CMDB.
3
+ # You are required to maintain Software CI records in the CMDB for all of the deployable software artifacts you maintain.
4
+ # You can fill in the information here and have the integration do that for you or you can do that yourself manually.
5
+ $schemaver: 2.1
6
+ repo_url: https://github.com/byu-oit/vue-decision-processing-components # optional
7
+ software:
8
+ - name: vue-decision-processing-components # optional
9
+ deploy_to_cmdb: true # optional
10
+ type: ''
11
+ aliases: # optional
12
+ short_description: Vue.js components to be shared between the decision processing
13
+ applications for the various CES Schools. # optional
14
+ assignment_group: gro:OIT-App Dev Student Info Mgmt
15
+ notes: # optional
16
+ maintained_by: # optional
17
+ - arasmus8
18
+ data_sensitivity: internal
19
+ developed_by_byu: true # optional
20
+ ddd: # optional
21
+ business_domain:
22
+ ubiquitous_language_url:
23
+ context_map_url:
24
+ links: # optional
25
+ system_documentation_url: https://github.com/byu-oit/vue-decision-processing-components
26
+ swagger_urls:
27
+ microservice: true # optional
28
+ technologies_used: # optional
29
+ - Vue
30
+ - JavaScript
31
+ - NodeJS
32
+ standard_change_template:
33
+ stages:
34
+ development:
35
+ urls: # optional
36
+ product_page:
37
+ physical_url:
38
+ virtual_url:
39
+ hosting_location: ''
40
+ aws_account: # optional
41
+ relationships: # optional
42
+ depends_on: # optional
43
+ db_read_write:
44
+ db_read_only:
45
+ software:
46
+ supports: # optional
47
+ software:
48
+ service:
49
+ reverse_proxy: # optional
50
+ runs_on: # optional
51
+ server_cluster:
52
+ virtual_server:
53
+ rack_server:
54
+ blade_server:
55
+ data-sensitivity: ''
@@ -1,115 +1,115 @@
1
- <template>
2
- <div>
3
- <FilterButton small :show="showList" @show="showList = true" @hide="showList = false">
4
- <span slot="label"><slot></slot></span>
5
- <font-awesome-icon
6
- slot="icon"
7
- :icon="calendar"
8
- alt="Configure Admit Periods" />
9
- <div
10
- v-for="admitPeriod of admitPeriodList"
11
- :key="admitPeriod.period"
12
- @click="chooseAdmitPeriod(admitPeriod.period)"
13
- class="dropdown-item">
14
- {{ admitPeriod.long_description }}
15
- </div>
16
- </FilterButton>
17
- </div>
18
- </template>
19
- <script>
20
- import FilterButton from './FilterButton.vue'
21
-
22
- import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
23
- import { faCalendar } from '@fortawesome/free-solid-svg-icons'
24
-
25
- import { mapState, mapMutations, mapActions } from 'vuex'
26
-
27
- function semesterCodeToDescription(semesterCode) {
28
- switch (semesterCode) {
29
- case '1':
30
- return 'Winter'
31
- case '3':
32
- return 'Spring'
33
- case '4':
34
- return 'Summer'
35
- case '5':
36
- return 'Fall'
37
- }
38
- }
39
-
40
- export default {
41
- name: 'AdmitPeriodConfig',
42
- components: {
43
- FilterButton,
44
- FontAwesomeIcon
45
- },
46
- props: {
47
- school: {
48
- type: String,
49
- validator (value) {
50
- return ['byu', 'byui', 'byuh', 'byupw', 'ldsbc'].includes(value)
51
- }
52
- },
53
- config: {
54
- type: Array,
55
- validator (value) {
56
- return value.length > 0
57
- }
58
- }
59
- },
60
- computed: {
61
- ...mapState({
62
- selectedAdmitPeriod: state => state.ui.admitPeriod
63
- }),
64
- calendar () {
65
- return faCalendar
66
- }
67
- },
68
- data () {
69
- return {
70
- admitPeriodList: [],
71
- showList: false
72
- }
73
- },
74
- methods: {
75
- ...mapMutations(['selectAdmitPeriod']),
76
- ...mapActions(['preserveUiSettings']),
77
- async fetchConfig() {
78
- const admitPeriods = []
79
- for (const admitPeriod of this.config) {
80
- // isolate semester code and semester year
81
- const semesterYear = admitPeriod.admit_period.substring(0, admitPeriod.admit_period.length - 1)
82
- const semesterCode = admitPeriod.admit_period.substring(admitPeriod.admit_period.length - 1)
83
- // add another object to admitPeriods with information from configuration
84
- admitPeriods.push({
85
- period: semesterYear + semesterCode,
86
- description: semesterYear + ' ' + semesterCodeToDescription(semesterCode),
87
- long_description: semesterCodeToDescription(semesterCode) + ' ' + semesterYear,
88
- school: 'byuh',
89
- application_open: admitPeriod.open,
90
- application_close: admitPeriod.close
91
- })
92
- }
93
-
94
- this.admitPeriodList = admitPeriods
95
- // select the most recent admit period if none selected
96
- if (!this.selectedAdmitPeriod) {
97
- this.selectedAdmitPeriod(this.admitPeriodList[this.admitPeriodList.length - 1])
98
- }
99
- },
100
- chooseAdmitPeriod (admitPeriod) {
101
- this.selectAdmitPeriod(admitPeriod)
102
- this.preserveUiSettings()
103
- this.showList = false
104
- }
105
- },
106
- mounted () {
107
- this.fetchConfig()
108
- }
109
- }
110
- </script>
111
- <style scoped>
112
- .clickable {
113
- cursor: pointer;
114
- }
115
- </style>
1
+ <template>
2
+ <div>
3
+ <FilterButton small :show="showList" @show="showList = true" @hide="showList = false">
4
+ <span slot="label"><slot></slot></span>
5
+ <font-awesome-icon
6
+ slot="icon"
7
+ :icon="calendar"
8
+ alt="Configure Admit Periods" />
9
+ <div
10
+ v-for="admitPeriod of admitPeriodList"
11
+ :key="admitPeriod.period"
12
+ @click="chooseAdmitPeriod(admitPeriod.period)"
13
+ class="dropdown-item">
14
+ {{ admitPeriod.long_description }}
15
+ </div>
16
+ </FilterButton>
17
+ </div>
18
+ </template>
19
+ <script>
20
+ import FilterButton from './FilterButton.vue'
21
+
22
+ import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
23
+ import { faCalendar } from '@fortawesome/free-solid-svg-icons'
24
+
25
+ import { mapState, mapMutations, mapActions } from 'vuex'
26
+
27
+ function semesterCodeToDescription(semesterCode) {
28
+ switch (semesterCode) {
29
+ case '1':
30
+ return 'Winter'
31
+ case '3':
32
+ return 'Spring'
33
+ case '4':
34
+ return 'Summer'
35
+ case '5':
36
+ return 'Fall'
37
+ }
38
+ }
39
+
40
+ export default {
41
+ name: 'AdmitPeriodConfig',
42
+ components: {
43
+ FilterButton,
44
+ FontAwesomeIcon
45
+ },
46
+ props: {
47
+ school: {
48
+ type: String,
49
+ validator (value) {
50
+ return ['byu', 'byui', 'byuh', 'byupw', 'ldsbc'].includes(value)
51
+ }
52
+ },
53
+ config: {
54
+ type: Array,
55
+ validator (value) {
56
+ return value.length > 0
57
+ }
58
+ }
59
+ },
60
+ computed: {
61
+ ...mapState({
62
+ selectedAdmitPeriod: state => state.ui.admitPeriod
63
+ }),
64
+ calendar () {
65
+ return faCalendar
66
+ }
67
+ },
68
+ data () {
69
+ return {
70
+ admitPeriodList: [],
71
+ showList: false
72
+ }
73
+ },
74
+ methods: {
75
+ ...mapMutations(['selectAdmitPeriod']),
76
+ ...mapActions(['preserveUiSettings']),
77
+ async fetchConfig() {
78
+ const admitPeriods = []
79
+ for (const admitPeriod of this.config) {
80
+ // isolate semester code and semester year
81
+ const semesterYear = admitPeriod.admit_period.substring(0, admitPeriod.admit_period.length - 1)
82
+ const semesterCode = admitPeriod.admit_period.substring(admitPeriod.admit_period.length - 1)
83
+ // add another object to admitPeriods with information from configuration
84
+ admitPeriods.push({
85
+ period: semesterYear + semesterCode,
86
+ description: semesterYear + ' ' + semesterCodeToDescription(semesterCode),
87
+ long_description: semesterCodeToDescription(semesterCode) + ' ' + semesterYear,
88
+ school: 'byuh',
89
+ application_open: admitPeriod.open,
90
+ application_close: admitPeriod.close
91
+ })
92
+ }
93
+
94
+ this.admitPeriodList = admitPeriods
95
+ // select the most recent admit period if none selected
96
+ if (!this.selectedAdmitPeriod) {
97
+ this.selectedAdmitPeriod(this.admitPeriodList[this.admitPeriodList.length - 1])
98
+ }
99
+ },
100
+ chooseAdmitPeriod (admitPeriod) {
101
+ this.selectAdmitPeriod(admitPeriod)
102
+ this.preserveUiSettings()
103
+ this.showList = false
104
+ }
105
+ },
106
+ mounted () {
107
+ this.fetchConfig()
108
+ }
109
+ }
110
+ </script>
111
+ <style scoped>
112
+ .clickable {
113
+ cursor: pointer;
114
+ }
115
+ </style>
package/ApiCallButton.vue CHANGED
@@ -1,91 +1,91 @@
1
- <template>
2
- <button @click="clickHandler" :class="btnClass" :disabled="waiting || finished || hasError">
3
- <FontAwesomeIcon v-if="icon != null" :icon="icon" :spin="waiting" />
4
- <slot></slot>
5
- </button>
6
- </template>
7
- <script>
8
- import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
9
- import { faSpinner, faExclamationTriangle, faCheck, faUserClock, faTrash } from '@fortawesome/free-solid-svg-icons'
10
-
11
- import { mapState, mapGetters } from 'vuex'
12
-
13
- export default {
14
- name: 'ApiCallButton',
15
- components: { FontAwesomeIcon },
16
- props: {
17
- outline: Boolean,
18
- small: Boolean,
19
- defaultCategory: {
20
- type: String,
21
- default: 'primary'
22
- },
23
- initialIcon: {
24
- type: String,
25
- validator(value) {
26
- return ['snooze', 'trash'].includes(value)
27
- }
28
- }
29
- },
30
- data () {
31
- return {
32
- waiting: false,
33
- finished: false
34
- }
35
- },
36
- computed: {
37
- ...mapState({
38
- hasError: state => !!state.apiError.status
39
- }),
40
- ...mapGetters(['loading']),
41
- semanticCategory () {
42
- if (this.hasError) return 'danger'
43
- else if (this.finished) return 'success'
44
- return this.defaultCategory
45
- },
46
- btnClass () {
47
- const semanticCategory = this.semanticCategory
48
- const category = `btn${this.outline ? '-outline' : ''}-${semanticCategory}`
49
- return {
50
- 'btn': true,
51
- [category]: true,
52
- 'btn-sm': this.small
53
- }
54
- },
55
- icon () {
56
- if (this.hasError) return faExclamationTriangle
57
- else if (this.waiting) return faSpinner
58
- else if (this.finished) return faCheck
59
- else if (this.initialIcon) {
60
- switch (this.initialIcon) {
61
- case 'snooze':
62
- return faUserClock
63
- case 'trash':
64
- return faTrash
65
- default:
66
- return null
67
- }
68
- }
69
- return null
70
- }
71
- },
72
- watch: {
73
- loading () {
74
- if (this.waiting && !this.loading) {
75
- this.waiting = false
76
- this.finished = true
77
- window.setTimeout(() => {
78
- this.finished = false
79
- this.$emit('complete')
80
- }, 2500)
81
- }
82
- }
83
- },
84
- methods: {
85
- clickHandler () {
86
- this.waiting = true
87
- this.$emit('click')
88
- }
89
- }
90
- }
91
- </script>
1
+ <template>
2
+ <button @click="clickHandler" :class="btnClass" :disabled="waiting || finished || hasError">
3
+ <FontAwesomeIcon v-if="icon != null" :icon="icon" :spin="waiting" />
4
+ <slot></slot>
5
+ </button>
6
+ </template>
7
+ <script>
8
+ import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
9
+ import { faSpinner, faExclamationTriangle, faCheck, faUserClock, faTrash } from '@fortawesome/free-solid-svg-icons'
10
+
11
+ import { mapState, mapGetters } from 'vuex'
12
+
13
+ export default {
14
+ name: 'ApiCallButton',
15
+ components: { FontAwesomeIcon },
16
+ props: {
17
+ outline: Boolean,
18
+ small: Boolean,
19
+ defaultCategory: {
20
+ type: String,
21
+ default: 'primary'
22
+ },
23
+ initialIcon: {
24
+ type: String,
25
+ validator(value) {
26
+ return ['snooze', 'trash'].includes(value)
27
+ }
28
+ }
29
+ },
30
+ data () {
31
+ return {
32
+ waiting: false,
33
+ finished: false
34
+ }
35
+ },
36
+ computed: {
37
+ ...mapState({
38
+ hasError: state => !!state.apiError.status
39
+ }),
40
+ ...mapGetters(['loading']),
41
+ semanticCategory () {
42
+ if (this.hasError) return 'danger'
43
+ else if (this.finished) return 'success'
44
+ return this.defaultCategory
45
+ },
46
+ btnClass () {
47
+ const semanticCategory = this.semanticCategory
48
+ const category = `btn${this.outline ? '-outline' : ''}-${semanticCategory}`
49
+ return {
50
+ 'btn': true,
51
+ [category]: true,
52
+ 'btn-sm': this.small
53
+ }
54
+ },
55
+ icon () {
56
+ if (this.hasError) return faExclamationTriangle
57
+ else if (this.waiting) return faSpinner
58
+ else if (this.finished) return faCheck
59
+ else if (this.initialIcon) {
60
+ switch (this.initialIcon) {
61
+ case 'snooze':
62
+ return faUserClock
63
+ case 'trash':
64
+ return faTrash
65
+ default:
66
+ return null
67
+ }
68
+ }
69
+ return null
70
+ }
71
+ },
72
+ watch: {
73
+ loading () {
74
+ if (this.waiting && !this.loading) {
75
+ this.waiting = false
76
+ this.finished = true
77
+ window.setTimeout(() => {
78
+ this.finished = false
79
+ this.$emit('complete')
80
+ }, 2500)
81
+ }
82
+ }
83
+ },
84
+ methods: {
85
+ clickHandler () {
86
+ this.waiting = true
87
+ this.$emit('click')
88
+ }
89
+ }
90
+ }
91
+ </script>