@projectcaluma/ember-distribution 1.0.0-beta.1
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +38 -0
- package/addon/-private/decorator.js +24 -0
- package/addon/abilities/inquiry.js +39 -0
- package/addon/components/distribution-navigation/controls.hbs +21 -0
- package/addon/components/distribution-navigation/controls.js +45 -0
- package/addon/components/distribution-navigation/item.hbs +18 -0
- package/addon/components/distribution-navigation/item.js +17 -0
- package/addon/components/distribution-navigation/section.hbs +24 -0
- package/addon/components/distribution-navigation/section.js +25 -0
- package/addon/components/distribution-navigation/status-indicator.hbs +17 -0
- package/addon/components/distribution-navigation/status-indicator.js +19 -0
- package/addon/components/distribution-navigation.hbs +17 -0
- package/addon/components/distribution-navigation.js +81 -0
- package/addon/components/icon-button.hbs +20 -0
- package/addon/components/icon-button.js +22 -0
- package/addon/components/inquiry-answer-form.hbs +46 -0
- package/addon/components/inquiry-answer-form.js +75 -0
- package/addon/components/inquiry-dialog/inquiry-deadline.hbs +6 -0
- package/addon/components/inquiry-dialog/inquiry-deadline.js +10 -0
- package/addon/components/inquiry-dialog/inquiry-divider.hbs +7 -0
- package/addon/components/inquiry-dialog/inquiry-divider.js +13 -0
- package/addon/components/inquiry-dialog/inquiry-part.hbs +40 -0
- package/addon/components/inquiry-dialog/inquiry-part.js +20 -0
- package/addon/components/inquiry-dialog/inquiry.hbs +13 -0
- package/addon/components/inquiry-dialog/inquiry.js +7 -0
- package/addon/components/inquiry-dialog.hbs +9 -0
- package/addon/components/inquiry-dialog.js +42 -0
- package/addon/components/inquiry-edit-form.hbs +27 -0
- package/addon/components/inquiry-edit-form.js +53 -0
- package/addon/components/inquiry-new-form.hbs +110 -0
- package/addon/components/inquiry-new-form.js +154 -0
- package/addon/config.js +72 -0
- package/addon/controllers/distribution/new.js +22 -0
- package/addon/engine.js +18 -0
- package/addon/gql/fragments/inquiry.graphql +89 -0
- package/addon/gql/mutations/complete-inquiry-work-item.graphql +36 -0
- package/addon/gql/mutations/create-inquiry.graphql +5 -0
- package/addon/gql/mutations/resume-work-item.graphql +8 -0
- package/addon/gql/queries/control-work-items.graphql +37 -0
- package/addon/gql/queries/inquiry-answer.graphql +33 -0
- package/addon/gql/queries/inquiry-dialog.graphql +28 -0
- package/addon/gql/queries/inquiry-edit.graphql +18 -0
- package/addon/gql/queries/inquiry-navigation.graphql +56 -0
- package/addon/routes/distribution/index.js +41 -0
- package/addon/routes/distribution/inquiry/detail/answer.js +7 -0
- package/addon/routes/distribution/inquiry/detail/index.js +7 -0
- package/addon/routes/distribution/inquiry/detail.js +7 -0
- package/addon/routes/distribution/inquiry/index.js +10 -0
- package/addon/routes/distribution/inquiry.js +7 -0
- package/addon/routes/distribution/new.js +7 -0
- package/addon/routes/distribution.js +7 -0
- package/addon/routes.js +12 -0
- package/addon/templates/distribution/inquiry/detail/answer.hbs +1 -0
- package/addon/templates/distribution/inquiry/detail/index.hbs +1 -0
- package/addon/templates/distribution/inquiry/detail.hbs +1 -0
- package/addon/templates/distribution/inquiry/index.hbs +5 -0
- package/addon/templates/distribution/inquiry.hbs +1 -0
- package/addon/templates/distribution/new.hbs +7 -0
- package/addon/templates/distribution.hbs +8 -0
- package/addon/utils/inquiry-deadline.js +48 -0
- package/addon/utils/inquiry-status.js +68 -0
- package/addon/utils/unique-by-groups.js +17 -0
- package/app/abilities/inquiry.js +1 -0
- package/app/components/distribution-navigation/controls.js +1 -0
- package/app/components/distribution-navigation/item.js +1 -0
- package/app/components/distribution-navigation/section.js +1 -0
- package/app/components/distribution-navigation/status-indicator.js +1 -0
- package/app/components/distribution-navigation.js +1 -0
- package/app/components/icon-button.js +1 -0
- package/app/components/inquiry-answer-form.js +1 -0
- package/app/components/inquiry-dialog/inquiry-deadline.js +1 -0
- package/app/components/inquiry-dialog/inquiry-divider.js +1 -0
- package/app/components/inquiry-dialog/inquiry-part.js +1 -0
- package/app/components/inquiry-dialog/inquiry.js +1 -0
- package/app/components/inquiry-dialog.js +1 -0
- package/app/components/inquiry-edit-form.js +1 -0
- package/app/components/inquiry-new-form.js +1 -0
- package/app/styles/@projectcaluma/ember-distribution.scss +3 -0
- package/app/styles/_icon-button.scss +13 -0
- package/app/styles/_inquiry-divider.scss +49 -0
- package/app/styles/_status-indicator.scss +31 -0
- package/app/styles/app.scss +1 -0
- package/app/utils/inquiry-deadline.js +1 -0
- package/app/utils/inquiry-status.js +1 -0
- package/app/utils/unique-by-groups.js +1 -0
- package/config/environment.js +10 -0
- package/index.js +22 -0
- package/package.json +86 -0
- package/translations/de.yaml +42 -0
- package/translations/en.yaml +42 -0
- package/translations/fr.yaml +42 -0
package/CHANGELOG.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# @projectcaluma/ember-distribution-v1.0.0-beta.1 (2022-01-18)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* **core:** override apollo service instead of serving a mixin ([e86796e](https://github.com/projectcaluma/ember-caluma/commit/e86796e801dc5a2a5b1331b87bc9261509443605)), closes [#529](https://github.com/projectcaluma/ember-caluma/issues/529)
|
7
|
+
* **deps:** update @projectcaluma/ember-core [skip ci] ([1e6af2d](https://github.com/projectcaluma/ember-caluma/commit/1e6af2dc2f29347897e605cc7144721abc2b44d7))
|
8
|
+
* **deps:** update @projectcaluma/ember-core [skip ci] ([27fb674](https://github.com/projectcaluma/ember-caluma/commit/27fb674f465bb78f3aed48c896259879d54a4de5))
|
9
|
+
* **deps:** update @projectcaluma/ember-core [skip ci] ([d2accca](https://github.com/projectcaluma/ember-caluma/commit/d2accca7678fe49cba53b1aef3224ff7a055b631))
|
10
|
+
* **deps:** update @projectcaluma/ember-core [skip ci] ([397f5ba](https://github.com/projectcaluma/ember-caluma/commit/397f5bae7fe2795a1e5824f450f666dee4a030d5))
|
11
|
+
* **deps:** update @projectcaluma/ember-form [skip ci] ([2f80820](https://github.com/projectcaluma/ember-caluma/commit/2f80820e5930fef578c8294255fef21ab137b333))
|
12
|
+
* **deps:** update @projectcaluma/ember-testing [skip ci] ([371d144](https://github.com/projectcaluma/ember-caluma/commit/371d1440a69cad682c1274ddbaeb46deef62376d))
|
13
|
+
* **deps:** update @projectcaluma/ember-testing [skip ci] ([0c339df](https://github.com/projectcaluma/ember-caluma/commit/0c339df93880ffba0023552fa326b313df7bcec3))
|
14
|
+
* **deps:** update @projectcaluma/ember-workflow [skip ci] ([e1232c8](https://github.com/projectcaluma/ember-caluma/commit/e1232c8d6929360b30a5c2a6777203f24255da94))
|
15
|
+
* **deps:** update @projectcaluma/ember-workflow [skip ci] ([07686c1](https://github.com/projectcaluma/ember-caluma/commit/07686c1e061fc4fc13715a3638cfad7b0a1197fe))
|
16
|
+
* **distribution:** fix infinte loop when fetching groups with ember-data ([f18ec33](https://github.com/projectcaluma/ember-caluma/commit/f18ec333908e669b24db764d1aa2a3396d8f25a7))
|
17
|
+
* **form:** fix dependencies for ember-autoresize-modifier ([242007a](https://github.com/projectcaluma/ember-caluma/commit/242007a9b5010fc99824b7f03d8102095904403f))
|
18
|
+
|
19
|
+
|
20
|
+
### chore
|
21
|
+
|
22
|
+
* **deps:** update dependencies and drop support for node 10 ([51d6dee](https://github.com/projectcaluma/ember-caluma/commit/51d6deeda9811518622ba0cefd8d3876651dab4f))
|
23
|
+
|
24
|
+
|
25
|
+
### Features
|
26
|
+
|
27
|
+
* **distribution:** add mask for creating new inquiries ([c90c5e7](https://github.com/projectcaluma/ember-caluma/commit/c90c5e72dd300899f2d209216d0b893968ce6b20))
|
28
|
+
* **distribution:** add masks for editing and answering inquiries ([14a743b](https://github.com/projectcaluma/ember-caluma/commit/14a743bbfa7a349a58f72b44ed6eed0843bd6d13))
|
29
|
+
* **distribution:** add read only view of distribution engine ([ac2c46a](https://github.com/projectcaluma/ember-caluma/commit/ac2c46aeec9c3f6aec4e450a84f2469d38ba6c14))
|
30
|
+
* **form:** enable autoresize for textarea questions ([428820f](https://github.com/projectcaluma/ember-caluma/commit/428820f2bdf842ebeb0393a70c5556ceceab9e4e))
|
31
|
+
|
32
|
+
|
33
|
+
### BREAKING CHANGES
|
34
|
+
|
35
|
+
* **core:** The apollo service mixin was removed in favor of
|
36
|
+
directly overriding the service. For more information on how to migrate,
|
37
|
+
please visit the v11 migration guide.
|
38
|
+
* **deps:** Remove support for node v10
|
@@ -0,0 +1,24 @@
|
|
1
|
+
export function isDescriptor(possibleDesc) {
|
2
|
+
const [target, key, desc] = possibleDesc;
|
3
|
+
|
4
|
+
return (
|
5
|
+
possibleDesc.length === 3 &&
|
6
|
+
typeof target === "object" &&
|
7
|
+
target !== null &&
|
8
|
+
typeof key === "string" &&
|
9
|
+
typeof desc === "object" &&
|
10
|
+
desc !== null &&
|
11
|
+
"enumerable" in desc &&
|
12
|
+
"configurable" in desc
|
13
|
+
);
|
14
|
+
}
|
15
|
+
|
16
|
+
export function createDecorator(fn) {
|
17
|
+
return function (...args) {
|
18
|
+
if (isDescriptor(args)) {
|
19
|
+
return fn(...args);
|
20
|
+
}
|
21
|
+
|
22
|
+
return (...desc) => fn(...desc, ...args);
|
23
|
+
};
|
24
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { inject as service } from "@ember/service";
|
2
|
+
import { Ability } from "ember-can";
|
3
|
+
|
4
|
+
import config from "@projectcaluma/ember-distribution/config";
|
5
|
+
|
6
|
+
export default class InquiryAbility extends Ability {
|
7
|
+
@service calumaOptions;
|
8
|
+
|
9
|
+
@config config;
|
10
|
+
|
11
|
+
get canEdit() {
|
12
|
+
return (
|
13
|
+
this.model?.task.slug === this.config.inquiry.task &&
|
14
|
+
this.model?.status === "SUSPENDED" &&
|
15
|
+
this.model?.controllingGroups
|
16
|
+
.map(String)
|
17
|
+
.includes(String(this.calumaOptions.currentGroupId))
|
18
|
+
);
|
19
|
+
}
|
20
|
+
|
21
|
+
get canAnswer() {
|
22
|
+
return (
|
23
|
+
this.model?.task.slug === this.config.inquiry.task &&
|
24
|
+
this.model?.status === "READY" &&
|
25
|
+
this.model?.addressedGroups
|
26
|
+
.map(String)
|
27
|
+
.includes(String(this.calumaOptions.currentGroupId))
|
28
|
+
);
|
29
|
+
}
|
30
|
+
|
31
|
+
get canEditAnswerForm() {
|
32
|
+
return (
|
33
|
+
this.canAnswer &&
|
34
|
+
this.model?.childCase.workItems.edges.some(
|
35
|
+
(edge) => edge.node.task.__typename === "CompleteWorkflowFormTask"
|
36
|
+
)
|
37
|
+
);
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="uk-text-center uk-margin-small-top">
|
2
|
+
{{#if this.canCreate}}
|
3
|
+
<IconButton @route="distribution.new" @icon="plus" />
|
4
|
+
{{/if}}
|
5
|
+
<IconButton
|
6
|
+
@icon="paper-plane-outline"
|
7
|
+
@fromSvgJar={{true}}
|
8
|
+
@gutterTop={{4}}
|
9
|
+
@gutterRight={{6}}
|
10
|
+
@gutterLeft={{4}}
|
11
|
+
@gutterBottom={{4}}
|
12
|
+
@onClick={{this.noop}}
|
13
|
+
/>
|
14
|
+
{{#if this.canComplete}}
|
15
|
+
<IconButton
|
16
|
+
@icon="lock-closed-outline"
|
17
|
+
@fromSvgJar={{true}}
|
18
|
+
@onClick={{this.noop}}
|
19
|
+
/>
|
20
|
+
{{/if}}
|
21
|
+
</div>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import { action } from "@ember/object";
|
2
|
+
import { inject as service } from "@ember/service";
|
3
|
+
import Component from "@glimmer/component";
|
4
|
+
import { queryManager } from "ember-apollo-client";
|
5
|
+
import { dropTask } from "ember-concurrency";
|
6
|
+
import { useTask } from "ember-resources";
|
7
|
+
|
8
|
+
import config from "@projectcaluma/ember-distribution/config";
|
9
|
+
import controlWorkItemsQuery from "@projectcaluma/ember-distribution/gql/queries/control-work-items.graphql";
|
10
|
+
|
11
|
+
export default class DistributionNavigationControlsComponent extends Component {
|
12
|
+
@service calumaOptions;
|
13
|
+
|
14
|
+
@queryManager apollo;
|
15
|
+
|
16
|
+
@config config;
|
17
|
+
|
18
|
+
workItems = useTask(this, this.fetchWorkItems, () => []);
|
19
|
+
|
20
|
+
get canCreate() {
|
21
|
+
return this.workItems.value?.create.edges.length > 0;
|
22
|
+
}
|
23
|
+
|
24
|
+
get canComplete() {
|
25
|
+
return this.workItems.value?.complete.edges.length > 0;
|
26
|
+
}
|
27
|
+
|
28
|
+
@action
|
29
|
+
noop(e) {
|
30
|
+
e.preventDefault();
|
31
|
+
}
|
32
|
+
|
33
|
+
@dropTask
|
34
|
+
*fetchWorkItems() {
|
35
|
+
return yield this.apollo.watchQuery({
|
36
|
+
query: controlWorkItemsQuery,
|
37
|
+
variables: {
|
38
|
+
caseId: this.args.caseId,
|
39
|
+
currentGroup: String(this.calumaOptions.currentGroupId),
|
40
|
+
createTask: this.config.controls.createTask,
|
41
|
+
completeTask: this.config.controls.completeTask,
|
42
|
+
},
|
43
|
+
});
|
44
|
+
}
|
45
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<li class={{if this.isActive "uk-active"}}>
|
2
|
+
<LinkTo @route="distribution.inquiry" @model={{this.model}}>
|
3
|
+
<div class="uk-flex uk-flex-middle uk-width-1-1">
|
4
|
+
<div class="uk-width-expand uk-text-truncate">
|
5
|
+
{{#if (eq @type "addressed")}}
|
6
|
+
{{group-name @inquiry.controllingGroups}}
|
7
|
+
{{else}}
|
8
|
+
{{group-name @inquiry.addressedGroups}}
|
9
|
+
{{/if}}
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<DistributionNavigation::StatusIndicator
|
13
|
+
@inquiry={{@inquiry}}
|
14
|
+
@type={{@type}}
|
15
|
+
/>
|
16
|
+
</div>
|
17
|
+
</LinkTo>
|
18
|
+
</li>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { inject as service } from "@ember/service";
|
2
|
+
import Component from "@glimmer/component";
|
3
|
+
|
4
|
+
export default class DistributionNavigationItemComponent extends Component {
|
5
|
+
@service router;
|
6
|
+
|
7
|
+
get model() {
|
8
|
+
return {
|
9
|
+
from: this.args.inquiry.controllingGroups[0],
|
10
|
+
to: this.args.inquiry.addressedGroups[0],
|
11
|
+
};
|
12
|
+
}
|
13
|
+
|
14
|
+
get isActive() {
|
15
|
+
return this.router.isActive("distribution.inquiry", this.model);
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<li class="uk-margin-small-bottom">
|
2
|
+
<a href="" class="uk-margin-small-bottom" {{on "click" this.toggle}}>
|
3
|
+
<span class="uk-width-expand">
|
4
|
+
{{t (concat "caluma.distribution.types." @type)}}
|
5
|
+
</span>
|
6
|
+
{{#if this.expanded}}
|
7
|
+
<UkIcon @icon="chevron-down" />
|
8
|
+
{{else}}
|
9
|
+
<UkIcon @icon="chevron-right" />
|
10
|
+
{{/if}}
|
11
|
+
</a>
|
12
|
+
|
13
|
+
{{#if (and @inquiries.length this.expanded)}}
|
14
|
+
<ul class="uk-tab uk-tab-left uk-margin-left">
|
15
|
+
{{#each this.inquiries as |inquiry|}}
|
16
|
+
<DistributionNavigation::Item @inquiry={{inquiry}} @type={{@type}} />
|
17
|
+
{{/each}}
|
18
|
+
</ul>
|
19
|
+
|
20
|
+
{{#if (eq @type "controlling")}}
|
21
|
+
<DistributionNavigation::Controls @caseId={{@caseId}} />
|
22
|
+
{{/if}}
|
23
|
+
{{/if}}
|
24
|
+
</li>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { action } from "@ember/object";
|
2
|
+
import Component from "@glimmer/component";
|
3
|
+
import { tracked } from "@glimmer/tracking";
|
4
|
+
|
5
|
+
export default class DistributionNavigationSectionComponent extends Component {
|
6
|
+
@tracked expanded = true;
|
7
|
+
|
8
|
+
@action
|
9
|
+
toggle(e) {
|
10
|
+
e.preventDefault();
|
11
|
+
|
12
|
+
this.expanded = !this.expanded;
|
13
|
+
}
|
14
|
+
|
15
|
+
get inquiries() {
|
16
|
+
const sortProperty =
|
17
|
+
this.args.type === "addressed"
|
18
|
+
? "controllingGroupName"
|
19
|
+
: "addressedGroupName";
|
20
|
+
|
21
|
+
return this.args.inquiries.sort((a, b) =>
|
22
|
+
a[sortProperty].localeCompare(b[sortProperty])
|
23
|
+
);
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{{#if this.showDeadlineIndicator}}
|
2
|
+
<div
|
3
|
+
class="deadline-indicator uk-flex-uk-flex-middle uk-flex-center uk-margin-small-left uk-text-{{this.deadline.color}}"
|
4
|
+
>
|
5
|
+
{{svg-jar
|
6
|
+
"notifications-outline"
|
7
|
+
height=16
|
8
|
+
title=(format-date this.deadline.value)
|
9
|
+
}}
|
10
|
+
</div>
|
11
|
+
{{/if}}
|
12
|
+
|
13
|
+
<div
|
14
|
+
class="status-indicator uk-flex uk-flex-middle uk-flex-center uk-margin-small-left uk-text-{{this.status.color}}"
|
15
|
+
>
|
16
|
+
{{svg-jar this.status.icon title=this.status.label}}
|
17
|
+
</div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { inject as service } from "@ember/service";
|
2
|
+
import Component from "@glimmer/component";
|
3
|
+
|
4
|
+
import config from "@projectcaluma/ember-distribution/config";
|
5
|
+
import inquiryDeadline from "@projectcaluma/ember-distribution/utils/inquiry-deadline";
|
6
|
+
import inquiryStatus from "@projectcaluma/ember-distribution/utils/inquiry-status";
|
7
|
+
|
8
|
+
export default class DistributionNavigationStatusIndicatorComponent extends Component {
|
9
|
+
@service intl;
|
10
|
+
|
11
|
+
@config config;
|
12
|
+
|
13
|
+
@inquiryStatus status;
|
14
|
+
@inquiryDeadline deadline;
|
15
|
+
|
16
|
+
get showDeadlineIndicator() {
|
17
|
+
return this.deadline.isOverdue || this.deadline.isWarning;
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<aside>
|
2
|
+
<ul class="uk-tab uk-tab-left">
|
3
|
+
<DistributionNavigation::Section
|
4
|
+
@type="controlling"
|
5
|
+
@inquiries={{this.inquiries.controlling}}
|
6
|
+
@caseId={{@caseId}}
|
7
|
+
/>
|
8
|
+
<DistributionNavigation::Section
|
9
|
+
@type="addressed"
|
10
|
+
@inquiries={{this.inquiries.addressed}}
|
11
|
+
/>
|
12
|
+
<DistributionNavigation::Section
|
13
|
+
@type="more"
|
14
|
+
@inquiries={{this.inquiries.more}}
|
15
|
+
/>
|
16
|
+
</ul>
|
17
|
+
</aside>
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import { inject as service } from "@ember/service";
|
2
|
+
import Component from "@glimmer/component";
|
3
|
+
import { tracked } from "@glimmer/tracking";
|
4
|
+
import { queryManager } from "ember-apollo-client";
|
5
|
+
import { restartableTask } from "ember-concurrency";
|
6
|
+
import { useTask } from "ember-resources";
|
7
|
+
|
8
|
+
import config from "@projectcaluma/ember-distribution/config";
|
9
|
+
import inquiryNavigationQuery from "@projectcaluma/ember-distribution/gql/queries/inquiry-navigation.graphql";
|
10
|
+
import uniqueByGroups from "@projectcaluma/ember-distribution/utils/unique-by-groups";
|
11
|
+
|
12
|
+
export default class DistributionNavigationComponent extends Component {
|
13
|
+
@service calumaOptions;
|
14
|
+
@service("-scheduler") scheduler;
|
15
|
+
|
16
|
+
@config config;
|
17
|
+
|
18
|
+
@queryManager apollo;
|
19
|
+
|
20
|
+
@tracked groups = [];
|
21
|
+
|
22
|
+
get inquiries() {
|
23
|
+
const findGroupName = (ids) =>
|
24
|
+
this.groups.find((g) =>
|
25
|
+
ids.includes(g[this.calumaOptions.groupIdentifierProperty])
|
26
|
+
)?.[this.calumaOptions.groupNameProperty];
|
27
|
+
|
28
|
+
return Object.entries(this._inquiries.value || []).reduce(
|
29
|
+
(inquiries, [key, objects]) => {
|
30
|
+
return {
|
31
|
+
...inquiries,
|
32
|
+
[key]: uniqueByGroups(
|
33
|
+
objects.edges.map((edge) => ({
|
34
|
+
...edge.node,
|
35
|
+
addressedGroupName: findGroupName(edge.node.addressedGroups),
|
36
|
+
controllingGroupName: findGroupName(edge.node.controllingGroups),
|
37
|
+
}))
|
38
|
+
),
|
39
|
+
};
|
40
|
+
},
|
41
|
+
{}
|
42
|
+
);
|
43
|
+
}
|
44
|
+
|
45
|
+
_inquiries = useTask(this, this.fetchInquiries, () => [
|
46
|
+
this.args.caseId,
|
47
|
+
this.config,
|
48
|
+
]);
|
49
|
+
|
50
|
+
@restartableTask
|
51
|
+
*fetchInquiries() {
|
52
|
+
const response = yield this.apollo.watchQuery({
|
53
|
+
query: inquiryNavigationQuery,
|
54
|
+
variables: {
|
55
|
+
caseId: this.args.caseId,
|
56
|
+
task: this.config.inquiry.task,
|
57
|
+
currentGroup: String(this.calumaOptions.currentGroupId),
|
58
|
+
statusQuestion: this.config.inquiry.answer.statusQuestion,
|
59
|
+
deadlineQuestion: this.config.inquiry.deadlineQuestion,
|
60
|
+
includeNavigationData: true,
|
61
|
+
},
|
62
|
+
});
|
63
|
+
|
64
|
+
const groupIds = [
|
65
|
+
...new Set(
|
66
|
+
Object.values(response)
|
67
|
+
.map((inquiries) => {
|
68
|
+
return inquiries.edges.map((edge) => [
|
69
|
+
...edge.node.addressedGroups,
|
70
|
+
...edge.node.controllingGroups,
|
71
|
+
]);
|
72
|
+
})
|
73
|
+
.flat(2)
|
74
|
+
),
|
75
|
+
];
|
76
|
+
|
77
|
+
this.groups = yield this.scheduler.resolve(groupIds, "group");
|
78
|
+
|
79
|
+
return response;
|
80
|
+
}
|
81
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
{{#if @route}}
|
2
|
+
<LinkTo
|
3
|
+
@route={{@route}}
|
4
|
+
class={{this.class}}
|
5
|
+
uk-icon={{unless @fromSvgJar @icon}}
|
6
|
+
...attributes
|
7
|
+
>
|
8
|
+
{{#if @fromSvgJar}}{{svg-jar @icon width="20" height="20"}}{{/if}}
|
9
|
+
</LinkTo>
|
10
|
+
{{else}}
|
11
|
+
<button
|
12
|
+
type="button"
|
13
|
+
class={{this.class}}
|
14
|
+
uk-icon={{unless @fromSvgJar @icon}}
|
15
|
+
...attributes
|
16
|
+
{{on "click" @onClick}}
|
17
|
+
>
|
18
|
+
{{#if @fromSvgJar}}{{svg-jar @icon width="20" height="20"}}{{/if}}
|
19
|
+
</button>
|
20
|
+
{{/if}}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { dasherize } from "@ember/string";
|
2
|
+
import Component from "@glimmer/component";
|
3
|
+
|
4
|
+
export default class IconButtonComponent extends Component {
|
5
|
+
get class() {
|
6
|
+
const gutters = [
|
7
|
+
"gutter",
|
8
|
+
"gutterTop",
|
9
|
+
"gutterRight",
|
10
|
+
"gutterBottom",
|
11
|
+
"gutterLeft",
|
12
|
+
]
|
13
|
+
.map((arg) =>
|
14
|
+
this.args[arg]
|
15
|
+
? `uk-icon-button--${dasherize(arg)}-${this.args[arg]}`
|
16
|
+
: null
|
17
|
+
)
|
18
|
+
.filter(Boolean);
|
19
|
+
|
20
|
+
return ["uk-icon-button", ...gutters].join(" ");
|
21
|
+
}
|
22
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<CfContent
|
2
|
+
@documentId={{decode-id this.inquiry.childCase.document.id}}
|
3
|
+
@disabled={{cannot "edit answer form of inquiry" this.inquiry}}
|
4
|
+
@loading={{this._inquiry.isRunning}}
|
5
|
+
as |content|
|
6
|
+
>
|
7
|
+
<h1 class="uk-flex uk-flex-middle">
|
8
|
+
{{t "caluma.distribution.answer.title"}}
|
9
|
+
{{#if (eq this.inquiry.status "RUNNING")}}
|
10
|
+
<UkLabel
|
11
|
+
class="uk-margin-left"
|
12
|
+
@label={{t "caluma.distribution.status.draft"}}
|
13
|
+
/>
|
14
|
+
{{/if}}
|
15
|
+
</h1>
|
16
|
+
|
17
|
+
<content.form />
|
18
|
+
|
19
|
+
{{#each this.buttons as |buttonConfig|}}
|
20
|
+
{{#if buttonConfig.isFormButton}}
|
21
|
+
<DocumentValidity @document={{content.document}} as |isValid validate|>
|
22
|
+
<UkButton
|
23
|
+
@type="submit"
|
24
|
+
@color={{buttonConfig.color}}
|
25
|
+
@disabled={{or (not isValid) this.completeWorkItem.isRunning}}
|
26
|
+
@on-click={{fn
|
27
|
+
(perform this.completeWorkItem)
|
28
|
+
buttonConfig.workItemId
|
29
|
+
validate
|
30
|
+
}}
|
31
|
+
>{{buttonConfig.label}}</UkButton>
|
32
|
+
</DocumentValidity>
|
33
|
+
{{else}}
|
34
|
+
<UkButton
|
35
|
+
@type="button"
|
36
|
+
@color={{buttonConfig.color}}
|
37
|
+
@disabled={{this.completeWorkItem.isRunning}}
|
38
|
+
@on-click={{fn
|
39
|
+
(perform this.completeWorkItem)
|
40
|
+
buttonConfig.workItemId
|
41
|
+
null
|
42
|
+
}}
|
43
|
+
>{{buttonConfig.label}}</UkButton>
|
44
|
+
{{/if}}
|
45
|
+
{{/each}}
|
46
|
+
</CfContent>
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import { inject as service } from "@ember/service";
|
2
|
+
import Component from "@glimmer/component";
|
3
|
+
import { queryManager } from "ember-apollo-client";
|
4
|
+
import { dropTask } from "ember-concurrency";
|
5
|
+
import { useTask } from "ember-resources";
|
6
|
+
|
7
|
+
import { decodeId } from "@projectcaluma/ember-core/helpers/decode-id";
|
8
|
+
import config from "@projectcaluma/ember-distribution/config";
|
9
|
+
import completeInquiryWorkItemMutation from "@projectcaluma/ember-distribution/gql/mutations/complete-inquiry-work-item.graphql";
|
10
|
+
import inquiryAnswerQuery from "@projectcaluma/ember-distribution/gql/queries/inquiry-answer.graphql";
|
11
|
+
|
12
|
+
export default class InquiryAnswerFormComponent extends Component {
|
13
|
+
@service intl;
|
14
|
+
@service router;
|
15
|
+
@service notification;
|
16
|
+
|
17
|
+
@config config;
|
18
|
+
|
19
|
+
@queryManager apollo;
|
20
|
+
|
21
|
+
_inquiry = useTask(this, this.fetchInquiryAnswer, () => [this.args.inquiry]);
|
22
|
+
|
23
|
+
get inquiry() {
|
24
|
+
return this._inquiry.value?.[0]?.node;
|
25
|
+
}
|
26
|
+
|
27
|
+
get buttons() {
|
28
|
+
return this.inquiry?.childCase.workItems.edges.map((edge) => {
|
29
|
+
const config = this.config.inquiry.answer.buttons[edge.node.task.slug];
|
30
|
+
|
31
|
+
return {
|
32
|
+
workItemId: decodeId(edge.node.id),
|
33
|
+
color: config.color,
|
34
|
+
isFormButton: edge.node.task.__typename === "CompleteWorkflowFormTask",
|
35
|
+
label: this.intl.t(config.label),
|
36
|
+
};
|
37
|
+
});
|
38
|
+
}
|
39
|
+
|
40
|
+
@dropTask
|
41
|
+
*fetchInquiryAnswer() {
|
42
|
+
return yield this.apollo.watchQuery(
|
43
|
+
{
|
44
|
+
query: inquiryAnswerQuery,
|
45
|
+
variables: {
|
46
|
+
inquiry: this.args.inquiry,
|
47
|
+
buttonTasks: Object.keys(this.config.inquiry.answer.buttons),
|
48
|
+
},
|
49
|
+
},
|
50
|
+
"allWorkItems.edges"
|
51
|
+
);
|
52
|
+
}
|
53
|
+
|
54
|
+
@dropTask
|
55
|
+
*completeWorkItem(workItem, validate = () => true) {
|
56
|
+
try {
|
57
|
+
if (typeof validate === "function" && !(yield validate())) return;
|
58
|
+
|
59
|
+
yield this.apollo.mutate({
|
60
|
+
mutation: completeInquiryWorkItemMutation,
|
61
|
+
variables: {
|
62
|
+
workItem,
|
63
|
+
statusQuestion: this.config.inquiry.answer.statusQuestion,
|
64
|
+
buttonTasks: Object.keys(this.config.inquiry.answer.buttons),
|
65
|
+
},
|
66
|
+
});
|
67
|
+
|
68
|
+
yield this.router.transitionTo("distribution.inquiry.index");
|
69
|
+
} catch (error) {
|
70
|
+
this.notification.danger(
|
71
|
+
this.intl.t("caluma.distribution.answer.complete-error")
|
72
|
+
);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import Component from "@glimmer/component";
|
2
|
+
|
3
|
+
import config from "@projectcaluma/ember-distribution/config";
|
4
|
+
import inquiryDeadline from "@projectcaluma/ember-distribution/utils/inquiry-deadline";
|
5
|
+
|
6
|
+
export default class InquiryDialogInquiryDeadlineComponent extends Component {
|
7
|
+
@config config;
|
8
|
+
|
9
|
+
@inquiryDeadline deadline;
|
10
|
+
}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<div
|
2
|
+
class="inquiry-divider uk-flex uk-flex-center uk-flex-middle uk-flex-between uk-margin uk-text-{{this.status.color}}"
|
3
|
+
>
|
4
|
+
<div class="inquiry-divider__icon uk-flex uk-flex-center uk-flex-middle">
|
5
|
+
{{svg-jar this.status.icon title=this.status.label}}
|
6
|
+
</div>
|
7
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { inject as service } from "@ember/service";
|
2
|
+
import Component from "@glimmer/component";
|
3
|
+
|
4
|
+
import config from "@projectcaluma/ember-distribution/config";
|
5
|
+
import inquiryStatus from "@projectcaluma/ember-distribution/utils/inquiry-status";
|
6
|
+
|
7
|
+
export default class InquiryDialogInquiryDividerComponent extends Component {
|
8
|
+
@service intl;
|
9
|
+
|
10
|
+
@config config;
|
11
|
+
|
12
|
+
@inquiryStatus status;
|
13
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<p class="uk-flex uk-flex-middle uk-text-bold uk-margin-remove">
|
2
|
+
{{#if (eq @type "request")}}
|
3
|
+
{{svg-jar "arrow-redo-outline" height=24 class="uk-margin-small-right"}}
|
4
|
+
{{group-name @inquiry.controllingGroups}}
|
5
|
+
{{else if (eq @type "answer")}}
|
6
|
+
{{svg-jar "arrow-undo-outline" height=24 class="uk-margin-small-right"}}
|
7
|
+
{{group-name @inquiry.addressedGroups}}
|
8
|
+
{{/if}}
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<ul class="uk-subnav uk-subnav-divider uk-margin-small-top">
|
12
|
+
<li>
|
13
|
+
<span>
|
14
|
+
{{format-date this.date}}
|
15
|
+
{{format-time this.date hour="2-digit" minute="2-digit"}}
|
16
|
+
</span>
|
17
|
+
</li>
|
18
|
+
{{#if (can "edit inquiry" @inquiry)}}
|
19
|
+
<li>
|
20
|
+
<LinkTo
|
21
|
+
@route="distribution.inquiry.detail.index"
|
22
|
+
@model={{decode-id @inquiry.id}}
|
23
|
+
>
|
24
|
+
{{t "caluma.distribution.edit.link"}}
|
25
|
+
</LinkTo>
|
26
|
+
</li>
|
27
|
+
{{/if}}
|
28
|
+
{{#if (can "answer inquiry" @inquiry)}}
|
29
|
+
<li>
|
30
|
+
<LinkTo
|
31
|
+
@route="distribution.inquiry.detail.answer"
|
32
|
+
@model={{decode-id @inquiry.id}}
|
33
|
+
>
|
34
|
+
{{t "caluma.distribution.answer.link"}}
|
35
|
+
</LinkTo>
|
36
|
+
</li>
|
37
|
+
{{/if}}
|
38
|
+
</ul>
|
39
|
+
|
40
|
+
<p class="uk-margin-remove-bottom">{{this.info}}</p>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import Component from "@glimmer/component";
|
2
|
+
|
3
|
+
export default class InquiryDialogInquiryPartComponent extends Component {
|
4
|
+
get date() {
|
5
|
+
const key = this.args.type === "request" ? "createdAt" : "closedAt";
|
6
|
+
|
7
|
+
return this.args.inquiry[key];
|
8
|
+
}
|
9
|
+
|
10
|
+
get info() {
|
11
|
+
const document =
|
12
|
+
this.args.type === "request"
|
13
|
+
? this.args.inquiry.document
|
14
|
+
: this.args.type === "answer"
|
15
|
+
? this.args.inquiry.childCase.document
|
16
|
+
: null;
|
17
|
+
|
18
|
+
return document.info.edges[0]?.node.value;
|
19
|
+
}
|
20
|
+
}
|