@gravitee/ui-components 3.25.3-typescript-50960c3 → 3.25.3-typescript-9d19b68
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.
- package/package.json +5 -13
- package/src/atoms/gv-autocomplete.js +422 -1
- package/src/atoms/gv-button.js +397 -1
- package/src/atoms/gv-checkbox.js +178 -1
- package/src/atoms/gv-date-picker-calendar.js +812 -1
- package/src/atoms/gv-date-picker-cell.js +174 -1
- package/src/atoms/gv-date-picker.js +638 -1
- package/src/atoms/gv-file-upload.js +348 -1
- package/src/atoms/gv-icon.js +93 -1
- package/src/atoms/gv-image.js +135 -1
- package/src/atoms/gv-input-message.js +78 -1
- package/src/atoms/gv-input.js +508 -1
- package/src/atoms/gv-link.js +204 -1
- package/src/atoms/gv-message.js +133 -1
- package/src/atoms/gv-metric.js +112 -1
- package/src/atoms/gv-relative-time.js +143 -1
- package/src/atoms/gv-select-native.js +363 -1
- package/src/atoms/gv-select.js +413 -1
- package/src/atoms/gv-spinner.js +54 -1
- package/src/atoms/gv-state.js +125 -1
- package/src/atoms/gv-switch.js +235 -1
- package/src/atoms/gv-tag.js +162 -1
- package/src/atoms/gv-text.js +160 -1
- package/src/charts/gv-chart-bar.js +101 -1
- package/src/charts/gv-chart-gauge.js +92 -1
- package/src/charts/gv-chart-histogram.js +78 -1
- package/src/charts/gv-chart-line.js +218 -1
- package/src/charts/gv-chart-map.js +111 -1
- package/src/charts/gv-chart-pie.js +89 -1
- package/src/index.js +77 -1
- package/src/lib/cron-expression.js +176 -1
- package/src/lib/date.js +43 -1
- package/src/lib/events.js +26 -1
- package/src/lib/http-client-schema-form.js +67 -1
- package/src/lib/http.js +237 -1
- package/src/lib/i18n.js +93 -1
- package/src/lib/item.js +110 -1
- package/src/lib/properties.js +171 -1
- package/src/lib/schema-form.js +39 -1
- package/src/lib/studio.js +144 -1
- package/src/lib/style.js +39 -1
- package/src/lib/text-format.js +65 -1
- package/src/lib/theme.js +60 -1
- package/src/lib/utils.js +106 -1
- package/src/mixins/chart-element.js +153 -1
- package/src/mixins/input-element.js +136 -1
- package/src/mixins/item-resource.js +102 -1
- package/src/mixins/keyboard-element.js +62 -1
- package/src/mixins/update-after-browser.js +30 -1
- package/src/mixins/with-resize-observer.js +62 -1
- package/src/mixins/with-skeleton-attribute.js +109 -1
- package/src/molecules/gv-card-full.js +209 -1
- package/src/molecules/gv-card-list.js +101 -1
- package/src/molecules/gv-card.js +130 -1
- package/src/molecules/gv-category-list.js +56 -1
- package/src/molecules/gv-category.js +163 -1
- package/src/molecules/gv-code.js +334 -1
- package/src/molecules/gv-confirm.js +175 -1
- package/src/molecules/gv-cron-editor.js +685 -1
- package/src/molecules/gv-dropdown-menu.js +108 -1
- package/src/molecules/gv-expandable.js +116 -1
- package/src/molecules/gv-expression-language.js +263 -1
- package/src/molecules/gv-identity-picture.js +139 -1
- package/src/molecules/gv-list.js +214 -1
- package/src/molecules/gv-metrics.js +147 -1
- package/src/molecules/gv-modal.js +203 -1
- package/src/molecules/gv-nav.js +180 -1
- package/src/molecules/gv-option.js +230 -1
- package/src/molecules/gv-plans.js +400 -1
- package/src/molecules/gv-popover.js +323 -1
- package/src/molecules/gv-promote.js +203 -1
- package/src/molecules/gv-rating-list.js +341 -1
- package/src/molecules/gv-rating.js +234 -1
- package/src/molecules/gv-row-expandable.js +42 -1
- package/src/molecules/gv-row.js +205 -1
- package/src/molecules/gv-stats.js +110 -1
- package/src/molecules/gv-stepper.js +274 -1
- package/src/molecules/gv-table.js +644 -1
- package/src/molecules/gv-tree.js +238 -1
- package/src/organisms/gv-documentation.js +205 -1
- package/src/organisms/gv-header.js +276 -1
- package/src/organisms/gv-http-client.js +258 -1
- package/src/organisms/gv-menu.js +258 -1
- package/src/organisms/gv-newsletter-subscription.js +258 -1
- package/src/organisms/gv-pagination.js +179 -1
- package/src/organisms/gv-properties.js +860 -1
- package/src/organisms/gv-resizable-views.js +371 -1
- package/src/organisms/gv-resources.js +496 -1
- package/src/organisms/gv-schema-form-array.js +237 -1
- package/src/organisms/gv-schema-form-control-object.js +141 -1
- package/src/organisms/gv-schema-form-control.js +419 -1
- package/src/organisms/gv-schema-form.js +700 -1
- package/src/organisms/gv-tabs.js +201 -1
- package/src/organisms/gv-user-menu.js +298 -1
- package/src/organisms/gv-vertical-menu.js +119 -1
- package/src/policy-studio/gv-flow-step.js +443 -1
- package/src/policy-studio/gv-flow.js +595 -1
- package/src/policy-studio/gv-policy-studio-menu.js +689 -1
- package/src/policy-studio/gv-policy-studio.js +1712 -1
- package/src/styles/empty.js +35 -1
- package/src/styles/input.js +262 -1
- package/src/styles/link.js +31 -1
- package/src/styles/shapes.js +17 -1
- package/src/styles/skeleton.js +52 -1
- package/src/styles/zoom.js +39 -1
- package/src/theme/gv-theme.js +197 -1
- package/wc/gv-autocomplete.js +1 -1
- package/wc/gv-button.js +1 -1
- package/wc/gv-card-full.js +1 -1
- package/wc/gv-card-list.js +1 -1
- package/wc/gv-card.js +1 -1
- package/wc/gv-category-list.js +1 -1
- package/wc/gv-category.js +1 -1
- package/wc/gv-chart-bar.js +1 -1
- package/wc/gv-chart-gauge.js +1 -1
- package/wc/gv-chart-histogram.js +1 -1
- package/wc/gv-chart-line.js +1 -1
- package/wc/gv-chart-map.js +1 -1
- package/wc/gv-chart-pie.js +1 -1
- package/wc/gv-checkbox.js +1 -1
- package/wc/gv-code.js +1 -1
- package/wc/gv-confirm.js +1 -1
- package/wc/gv-cron-editor.js +1 -1
- package/wc/gv-date-picker-calendar.js +1 -1
- package/wc/gv-date-picker-cell.js +1 -1
- package/wc/gv-date-picker.js +1 -1
- package/wc/gv-documentation.js +1 -1
- package/wc/gv-dropdown-menu.js +1 -1
- package/wc/gv-expandable.js +1 -1
- package/wc/gv-expression-language.js +1 -1
- package/wc/gv-file-upload.js +1 -1
- package/wc/gv-flow-step.js +1 -1
- package/wc/gv-flow.js +1 -1
- package/wc/gv-header.js +1 -1
- package/wc/gv-http-client.js +1 -1
- package/wc/gv-icon.js +1 -1
- package/wc/gv-identity-picture.js +1 -1
- package/wc/gv-image.js +1 -1
- package/wc/gv-input-message.js +1 -1
- package/wc/gv-input.js +1 -1
- package/wc/gv-link.js +1 -1
- package/wc/gv-list.js +1 -1
- package/wc/gv-menu.js +1 -1
- package/wc/gv-message.js +1 -1
- package/wc/gv-metric.js +1 -1
- package/wc/gv-metrics.js +1 -1
- package/wc/gv-modal.js +1 -1
- package/wc/gv-nav.js +1 -1
- package/wc/gv-newsletter-subscription.js +1 -1
- package/wc/gv-option.js +1 -1
- package/wc/gv-pagination.js +1 -1
- package/wc/gv-plans.js +1 -1
- package/wc/gv-policy-studio-menu.js +1 -1
- package/wc/gv-policy-studio.js +1 -1
- package/wc/gv-popover.js +1 -1
- package/wc/gv-promote.js +1 -1
- package/wc/gv-properties.js +1 -1
- package/wc/gv-rating-list.js +1 -1
- package/wc/gv-rating.js +1 -1
- package/wc/gv-relative-time.js +1 -1
- package/wc/gv-resizable-views.js +1 -1
- package/wc/gv-resources.js +1 -1
- package/wc/gv-row-expandable.js +1 -1
- package/wc/gv-row.js +1 -1
- package/wc/gv-schema-form-array.js +1 -1
- package/wc/gv-schema-form-control-object.js +1 -1
- package/wc/gv-schema-form-control.js +1 -1
- package/wc/gv-schema-form.js +1 -1
- package/wc/gv-select-native.js +1 -1
- package/wc/gv-select.js +1 -1
- package/wc/gv-spinner.js +1 -1
- package/wc/gv-state.js +1 -1
- package/wc/gv-stats.js +1 -1
- package/wc/gv-stepper.js +1 -1
- package/wc/gv-switch.js +1 -1
- package/wc/gv-table.js +1 -1
- package/wc/gv-tabs.js +1 -1
- package/wc/gv-tag.js +1 -1
- package/wc/gv-text.js +1 -1
- package/wc/gv-theme.js +1 -1
- package/wc/gv-tree.js +1 -1
- package/wc/gv-user-menu.js +1 -1
- package/wc/gv-vertical-menu.js +1 -1
|
@@ -1 +1,341 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2015 The Gravitee team (http://gravitee.io)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { css, LitElement, html } from 'lit';
|
|
17
|
+
import { repeat } from 'lit/directives/repeat';
|
|
18
|
+
import './../atoms/gv-relative-time';
|
|
19
|
+
import './gv-identity-picture';
|
|
20
|
+
import './gv-rating';
|
|
21
|
+
import './gv-confirm';
|
|
22
|
+
import { skeleton } from '../styles/skeleton';
|
|
23
|
+
import { link } from '../styles/link';
|
|
24
|
+
import { i18n } from '../lib/i18n';
|
|
25
|
+
import { classMap } from 'lit/directives/class-map';
|
|
26
|
+
import { dispatchCustomEvent } from '../lib/events';
|
|
27
|
+
/**
|
|
28
|
+
* List of ratings with answer form
|
|
29
|
+
*
|
|
30
|
+
* ## Details
|
|
31
|
+
* * has @theme facet
|
|
32
|
+
*
|
|
33
|
+
* ## Attribute `permissions` details
|
|
34
|
+
* * `delete` and `update` properties supports booleans or arrays of rating identifier.
|
|
35
|
+
* * `addAnswer` and `deleteAnswer` only accept booleans.
|
|
36
|
+
*
|
|
37
|
+
* @fires gv-rating-list:add-answer - When user submit answer
|
|
38
|
+
* @fires gv-rating-list:delete - When user delete rating
|
|
39
|
+
* @fires gv-rating-list:delete-answer - When user delete answer
|
|
40
|
+
* @fires gv-rating-list:update - When user update rating
|
|
41
|
+
*
|
|
42
|
+
* @attr {Promise<Array>} ratings - ratings
|
|
43
|
+
* @attr {id, avatar, display_name} user - a current user
|
|
44
|
+
* @attr {Object<{update, delete, addAnswer, deleteAnswer}>} permissions - The permissions
|
|
45
|
+
* @cssprop {Color} [--gv-rating-list--bgc=var(--gv-theme-neutral-color-lightest, #ffffff)] - Background color
|
|
46
|
+
* @cssprop {Color} [--gv-rating-list-answer--bgc=var(--gv-theme-neutral-color-lighter, #fafafa)] - Answer background color
|
|
47
|
+
* @cssprop {Color} [--gv-rating-list--bdc=var(--gv-theme-neutral-color, #f5f5f5)] - Border color
|
|
48
|
+
* @cssprop {Length} [--gv-rating-list--s=18px] - Height and star width
|
|
49
|
+
*/
|
|
50
|
+
export class GvRatingList extends LitElement {
|
|
51
|
+
static get properties() {
|
|
52
|
+
return {
|
|
53
|
+
ratings: { type: Array },
|
|
54
|
+
user: { type: Object },
|
|
55
|
+
permissions: { type: Object },
|
|
56
|
+
required: { type: Boolean, attribute: 'required' },
|
|
57
|
+
_permissions: { type: Object, attribute: false },
|
|
58
|
+
_ratings: { type: Array, attribute: false },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
static get styles() {
|
|
62
|
+
return [
|
|
63
|
+
skeleton,
|
|
64
|
+
link,
|
|
65
|
+
// language=CSS
|
|
66
|
+
css `
|
|
67
|
+
:host {
|
|
68
|
+
--s: var(--gv-rating-list--s, 18px);
|
|
69
|
+
--gv-icon--s: var(--s);
|
|
70
|
+
--gv-rating--s: var(--s);
|
|
71
|
+
margin: 0.2rem;
|
|
72
|
+
box-sizing: border-box;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.rating-list {
|
|
76
|
+
background-color: var(--gv-rating-list--bgc, var(--gv-theme-neutral-color-lightest, #ffffff));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.rating.parent {
|
|
80
|
+
border-bottom: 1px solid var(--gv-rating-list--bdc, var(--gv-theme-neutral-color, #f5f5f5));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.rating {
|
|
84
|
+
display: flex;
|
|
85
|
+
padding: 1rem 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.answer .rating {
|
|
89
|
+
padding: 1rem 0 0 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.sub-title {
|
|
93
|
+
color: grey;
|
|
94
|
+
display: flex;
|
|
95
|
+
line-height: 20px;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
gv-confirm {
|
|
99
|
+
align-self: center;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.sub-title a.link {
|
|
103
|
+
text-decoration: underline;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
gv-identity-picture {
|
|
107
|
+
margin: 0 1rem;
|
|
108
|
+
height: 60px;
|
|
109
|
+
width: 60px;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.title {
|
|
113
|
+
display: flex;
|
|
114
|
+
line-height: 20px;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.title b,
|
|
118
|
+
.rating-content {
|
|
119
|
+
flex: 1;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.link-answer {
|
|
123
|
+
display: inline-block;
|
|
124
|
+
padding: 1rem 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.link-answer gv-icon {
|
|
128
|
+
margin-right: 0.2rem;
|
|
129
|
+
--gv-icon--s: var(--s);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.delete-rating,
|
|
133
|
+
.delete-answer,
|
|
134
|
+
.fake-icon {
|
|
135
|
+
--gv-icon--s: var(--s);
|
|
136
|
+
min-width: var(--s);
|
|
137
|
+
display: inline-flex;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.delete-rating {
|
|
141
|
+
padding-right: 1rem;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.answer {
|
|
145
|
+
padding: 1rem;
|
|
146
|
+
margin-top: 1rem;
|
|
147
|
+
background-color: var(--gv-rating-list-answer--bgc, var(--gv-theme-neutral-color-lighter, #fafafa));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.answer-form {
|
|
151
|
+
display: flex;
|
|
152
|
+
flex-direction: column;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.display-name:after {
|
|
156
|
+
content: '|';
|
|
157
|
+
margin: 2px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.actions {
|
|
161
|
+
text-align: right;
|
|
162
|
+
}
|
|
163
|
+
`,
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
constructor() {
|
|
167
|
+
super();
|
|
168
|
+
this._ratings = [];
|
|
169
|
+
this._permissions = {
|
|
170
|
+
update: false,
|
|
171
|
+
delete: false,
|
|
172
|
+
addAnswer: false,
|
|
173
|
+
deleteAnswer: false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
set ratings(value) {
|
|
177
|
+
Promise.resolve(value)
|
|
178
|
+
.then((value) => {
|
|
179
|
+
if (value) {
|
|
180
|
+
this._skeleton = false;
|
|
181
|
+
this._ratings = value;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this._skeleton = true;
|
|
185
|
+
}
|
|
186
|
+
})
|
|
187
|
+
.catch(() => {
|
|
188
|
+
this._skeleton = false;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
set permissions(permissions) {
|
|
192
|
+
if (permissions && typeof permissions === 'object') {
|
|
193
|
+
this._permissions = Object.assign({}, this._permissions, permissions);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
render() {
|
|
197
|
+
return html ` <div class="rating-list">${repeat(this._ratings, (rating) => this._render(rating))}</div> `;
|
|
198
|
+
}
|
|
199
|
+
_editAnswer(rating, e) {
|
|
200
|
+
e.stopPropagation();
|
|
201
|
+
this._ratings.forEach((rating) => (rating._edit = false));
|
|
202
|
+
rating._edit = true;
|
|
203
|
+
this.performUpdate();
|
|
204
|
+
}
|
|
205
|
+
_getAnswerValue() {
|
|
206
|
+
const element = this.shadowRoot.querySelector('gv-text');
|
|
207
|
+
if (element) {
|
|
208
|
+
return element.value;
|
|
209
|
+
}
|
|
210
|
+
return '';
|
|
211
|
+
}
|
|
212
|
+
_onAnswer(rating) {
|
|
213
|
+
const answer = this._getAnswerValue();
|
|
214
|
+
if (answer.trim().length > 0) {
|
|
215
|
+
dispatchCustomEvent(this, 'add-answer', { rating, answer });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
_hasValidAnswer() {
|
|
219
|
+
const answer = this._getAnswerValue();
|
|
220
|
+
return answer.trim().length > 0;
|
|
221
|
+
}
|
|
222
|
+
_onClose(rating) {
|
|
223
|
+
delete rating._edit;
|
|
224
|
+
this.performUpdate();
|
|
225
|
+
}
|
|
226
|
+
_renderAnswer(rating, answer) {
|
|
227
|
+
return html `<div class="answer">${this._render(answer, rating)}</div>`;
|
|
228
|
+
}
|
|
229
|
+
_renderAnswers(rating) {
|
|
230
|
+
return html ` ${rating.answers
|
|
231
|
+
? html ` ${this._canAddAnswer()
|
|
232
|
+
? html `<a class="link link-answer" @click="${this._editAnswer.bind(this, rating)}">
|
|
233
|
+
<gv-icon class="link" shape="communication:chat#5"></gv-icon> ${i18n('gv-rating-list.reply')}</a
|
|
234
|
+
>`
|
|
235
|
+
: ''}
|
|
236
|
+
${rating._edit
|
|
237
|
+
? html `
|
|
238
|
+
<div class="answer answer-form">
|
|
239
|
+
<gv-text rows="4" label="${i18n('gv-rating-list.answerLabel')}" required @input="${this.performUpdate}"></gv-text>
|
|
240
|
+
<div class="actions">
|
|
241
|
+
<gv-button primary outlined @click="${this._onClose.bind(this, rating)}">${i18n('gv-rating-list.cancel')}</gv-button>
|
|
242
|
+
<gv-button primary @click="${this._onAnswer.bind(this, rating)}" .disabled="${!this._hasValidAnswer()}"
|
|
243
|
+
>${i18n('gv-rating-list.send')}</gv-button
|
|
244
|
+
>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
`
|
|
248
|
+
: ''}
|
|
249
|
+
<div>${repeat(rating.answers, (answer) => this._renderAnswer(rating, answer))}</div>`
|
|
250
|
+
: ''}`;
|
|
251
|
+
}
|
|
252
|
+
_onDelete(rating) {
|
|
253
|
+
dispatchCustomEvent(this, 'delete', { rating });
|
|
254
|
+
}
|
|
255
|
+
_onDeleteAnswer(rating, answer) {
|
|
256
|
+
dispatchCustomEvent(this, 'delete-answer', { rating, answer });
|
|
257
|
+
}
|
|
258
|
+
_renderActions(data, parent) {
|
|
259
|
+
if (parent) {
|
|
260
|
+
return html `
|
|
261
|
+
${this._canDeleteAnswer()
|
|
262
|
+
? html `<gv-confirm
|
|
263
|
+
danger
|
|
264
|
+
icon="home:trash"
|
|
265
|
+
@gv-confirm:ok="${this._onDeleteAnswer.bind(this, parent, data)}"
|
|
266
|
+
message="${i18n('gv-rating-list.confirmAnswerDelete')}"
|
|
267
|
+
>
|
|
268
|
+
<gv-icon title="${i18n('gv-rating-list.deleteAnswer')}" class="link delete-answer" shape="home:trash"></gv-icon>
|
|
269
|
+
</gv-confirm>`
|
|
270
|
+
: ''}
|
|
271
|
+
`;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
return html `
|
|
275
|
+
${this._canDelete(data.id)
|
|
276
|
+
? html `<gv-confirm
|
|
277
|
+
danger
|
|
278
|
+
icon="home:trash"
|
|
279
|
+
@gv-confirm:ok="${this._onDelete.bind(this, data)}"
|
|
280
|
+
message="${i18n('gv-rating-list.confirmRatingDelete')}"
|
|
281
|
+
>
|
|
282
|
+
<gv-icon title="${i18n('gv-rating-list.deleteRating')}" class="link delete-rating" shape="home:trash"></gv-icon>
|
|
283
|
+
</gv-confirm>`
|
|
284
|
+
: html `<div class="fake-icon"></div>`}
|
|
285
|
+
`;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
_render(data, parent) {
|
|
289
|
+
const classes = { rating: true, skeleton: this._skeleton, parent: parent == null };
|
|
290
|
+
const displayName = data.author && data.author.display_name ? data.author.display_name : null;
|
|
291
|
+
const picture = data.author && data.author._links && data.author._links.avatar ? data.author._links.avatar : null;
|
|
292
|
+
return html `
|
|
293
|
+
<div class="${classMap(classes)}">
|
|
294
|
+
<gv-identity-picture rounded .display_name="${displayName}" .picture="${picture}"></gv-identity-picture>
|
|
295
|
+
<div class="rating-content">
|
|
296
|
+
<div class="title">
|
|
297
|
+
<b>${data.title ? data.title : data.author.display_name}</b>${parent
|
|
298
|
+
? ''
|
|
299
|
+
: html `<gv-rating
|
|
300
|
+
.readonly="${!this._canUpdate(data.id)}"
|
|
301
|
+
@input="${this._onUpdateRating.bind(this, data)}"
|
|
302
|
+
value="${data.value}"
|
|
303
|
+
></gv-rating>`}${this._renderActions(data, parent)}
|
|
304
|
+
</div>
|
|
305
|
+
<div class="sub-title">${this._getDisplayName(data)}<gv-relative-time datetime="${data.date}" noFuture></gv-relative-time></div>
|
|
306
|
+
<p class="comment">${data.comment}</p>
|
|
307
|
+
${parent ? '' : this._renderAnswers(data)}
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
`;
|
|
311
|
+
}
|
|
312
|
+
_onUpdateRating(rating, e) {
|
|
313
|
+
rating.value = e.target.value;
|
|
314
|
+
dispatchCustomEvent(this, 'update', { rating });
|
|
315
|
+
}
|
|
316
|
+
_canAddAnswer() {
|
|
317
|
+
return this._permissions.addAnswer === true;
|
|
318
|
+
}
|
|
319
|
+
_canDeleteAnswer() {
|
|
320
|
+
return this._permissions.deleteAnswer === true;
|
|
321
|
+
}
|
|
322
|
+
_canUpdate(ratingId) {
|
|
323
|
+
if (Array.isArray(this._permissions.update)) {
|
|
324
|
+
return this._permissions.update.includes(ratingId);
|
|
325
|
+
}
|
|
326
|
+
return this._permissions.update === true;
|
|
327
|
+
}
|
|
328
|
+
_canDelete(ratingId) {
|
|
329
|
+
if (Array.isArray(this._permissions.delete)) {
|
|
330
|
+
return this._permissions.delete.includes(ratingId);
|
|
331
|
+
}
|
|
332
|
+
return this._permissions.delete === true;
|
|
333
|
+
}
|
|
334
|
+
_getDisplayName(data) {
|
|
335
|
+
if (data.title) {
|
|
336
|
+
return html `<span class="display-name">${data.author.display_name}</span>`;
|
|
337
|
+
}
|
|
338
|
+
return '';
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
window.customElements.define('gv-rating-list', GvRatingList);
|
|
@@ -1 +1,234 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2015 The Gravitee team (http://gravitee.io)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { css, LitElement, html } from 'lit';
|
|
17
|
+
import { repeat } from 'lit/directives/repeat';
|
|
18
|
+
import '../atoms/gv-icon';
|
|
19
|
+
import { skeleton } from '../styles/skeleton';
|
|
20
|
+
import { classMap } from 'lit/directives/class-map';
|
|
21
|
+
import { i18n } from '../lib/i18n';
|
|
22
|
+
const MAX_RATE = 5;
|
|
23
|
+
/**
|
|
24
|
+
* Rating component
|
|
25
|
+
*
|
|
26
|
+
* ## Details
|
|
27
|
+
* * has @theme facet
|
|
28
|
+
*
|
|
29
|
+
* @attr {Length} value - average of ratings between 1 and 5
|
|
30
|
+
* @attr {String} count - total count for the average
|
|
31
|
+
* @attr {Boolean} skeleton - skeleton mode
|
|
32
|
+
* @attr {Boolean} readonly - readonly mode
|
|
33
|
+
* @attr {Boolean} with-description - if true, show rate description on hover
|
|
34
|
+
*
|
|
35
|
+
* @cssprop {Color} [--gv-rating--c=var(--gv-theme-color, #5a7684)] - Color
|
|
36
|
+
* @cssprop {Length} [--gv-rating--s=13px] - Size
|
|
37
|
+
*/
|
|
38
|
+
export class GvRating extends LitElement {
|
|
39
|
+
static get properties() {
|
|
40
|
+
return {
|
|
41
|
+
value: { type: Number, reflect: true },
|
|
42
|
+
count: { type: String },
|
|
43
|
+
skeleton: { type: Boolean },
|
|
44
|
+
readonly: { type: Boolean },
|
|
45
|
+
_candidate: { type: Number, attribute: false },
|
|
46
|
+
withDescription: { type: Boolean, attribute: 'with-description' },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
static get styles() {
|
|
50
|
+
return [
|
|
51
|
+
// language=CSS
|
|
52
|
+
css `
|
|
53
|
+
:host {
|
|
54
|
+
--gv-icon--c: var(--gv-rating--c, var(--gv-theme-color, #5a7684));
|
|
55
|
+
--size: var(--gv-rating--s, 13px);
|
|
56
|
+
--gv-icon--s: var(--size);
|
|
57
|
+
|
|
58
|
+
font-size: var(--gv-theme-font-size-m, 14px);
|
|
59
|
+
cursor: default;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.content,
|
|
63
|
+
.rate {
|
|
64
|
+
justify-content: space-evenly;
|
|
65
|
+
display: inline-flex;
|
|
66
|
+
align-items: flex-end;
|
|
67
|
+
vertical-align: middle;
|
|
68
|
+
height: 100%;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.info-title {
|
|
72
|
+
font-size: var(--gv-theme-font-size-m, 14px);
|
|
73
|
+
line-height: 16px;
|
|
74
|
+
align-self: center;
|
|
75
|
+
min-width: 35px;
|
|
76
|
+
text-align: center;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.info-subtitle {
|
|
80
|
+
font-size: var(--gv-theme-font-size-xs, 10px);
|
|
81
|
+
line-height: 10px;
|
|
82
|
+
opacity: 0.5;
|
|
83
|
+
text-align: center;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.icon {
|
|
87
|
+
display: inline-flex;
|
|
88
|
+
align-self: center;
|
|
89
|
+
margin-right: calc(var(--size) / 4);
|
|
90
|
+
align-items: center;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.edit {
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.edit gv-icon:hover {
|
|
98
|
+
transform: translateY(-0.5px);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
gv-input {
|
|
102
|
+
flex: 1;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.icon {
|
|
106
|
+
min-height: 30px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.description {
|
|
110
|
+
min-width: 100px;
|
|
111
|
+
line-height: calc(var(--size) + 4px);
|
|
112
|
+
margin: auto 4px;
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
skeleton,
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
constructor() {
|
|
119
|
+
super();
|
|
120
|
+
this.value = 0;
|
|
121
|
+
this.count = 0;
|
|
122
|
+
this.readonly = false;
|
|
123
|
+
this._candidate = -1;
|
|
124
|
+
this.isSelected = false;
|
|
125
|
+
}
|
|
126
|
+
_getTitle() {
|
|
127
|
+
return `${this._getAverage()}/${MAX_RATE}`;
|
|
128
|
+
}
|
|
129
|
+
_onMouseEnter(index) {
|
|
130
|
+
this._candidate = index + 1;
|
|
131
|
+
if (this.withDescription) {
|
|
132
|
+
switch (this._candidate) {
|
|
133
|
+
case 1:
|
|
134
|
+
this.description = i18n('gv-rating.description-1');
|
|
135
|
+
break;
|
|
136
|
+
case 2:
|
|
137
|
+
this.description = i18n('gv-rating.description-2');
|
|
138
|
+
break;
|
|
139
|
+
case 3:
|
|
140
|
+
this.description = i18n('gv-rating.description-3');
|
|
141
|
+
break;
|
|
142
|
+
case 4:
|
|
143
|
+
this.description = i18n('gv-rating.description-4');
|
|
144
|
+
break;
|
|
145
|
+
case 5:
|
|
146
|
+
this.description = i18n('gv-rating.description-5');
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
_onMouseOut() {
|
|
152
|
+
this._candidate = -1;
|
|
153
|
+
if (this.withDescription && !this.isSelected) {
|
|
154
|
+
this.description = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
_onClick(index) {
|
|
158
|
+
this._candidate = -1;
|
|
159
|
+
this.isSelected = true;
|
|
160
|
+
this.value = index + 1;
|
|
161
|
+
this.dispatchEvent(new Event('input'), { bubbles: true, cancelable: true });
|
|
162
|
+
}
|
|
163
|
+
_getAverage() {
|
|
164
|
+
const _value = parseFloat(this.value);
|
|
165
|
+
if (_value >= 0 && _value <= MAX_RATE) {
|
|
166
|
+
return _value;
|
|
167
|
+
}
|
|
168
|
+
return 0;
|
|
169
|
+
}
|
|
170
|
+
_renderStar(star, index) {
|
|
171
|
+
if (this.readonly) {
|
|
172
|
+
return html `<gv-icon shape="general:${star}"></gv-icon>`;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
return html `<gv-icon
|
|
176
|
+
@mouseenter=${this._onMouseEnter.bind(this, index)}
|
|
177
|
+
@click=${this._onClick.bind(this, index)}
|
|
178
|
+
shape="general:${star}"
|
|
179
|
+
></gv-icon>`;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
render() {
|
|
183
|
+
const average = this._getAverage();
|
|
184
|
+
let trunc = average * 1;
|
|
185
|
+
if (!this.readonly) {
|
|
186
|
+
trunc = this._candidate > -1 ? this._candidate : average;
|
|
187
|
+
}
|
|
188
|
+
const stars = [];
|
|
189
|
+
for (let star = 1; star <= MAX_RATE; star += 1) {
|
|
190
|
+
if (trunc >= star) {
|
|
191
|
+
stars.push('star');
|
|
192
|
+
}
|
|
193
|
+
else if (trunc >= star - 0.7) {
|
|
194
|
+
stars.push('half-star');
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
stars.push('no-star');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return html `
|
|
201
|
+
<div class="${classMap({ skeleton: this.skeleton, edit: !this.readonly, content: true })}">
|
|
202
|
+
<div class="${classMap({ content: true })}">
|
|
203
|
+
<div class="${classMap({ rate: true })}">
|
|
204
|
+
<div class="icon" title="${this._getTitle()}">
|
|
205
|
+
${this.withDescription ? html `<div class="description">${this.description}</div>` : ''}
|
|
206
|
+
${repeat(stars, (star) => star, (star, index) => html ` ${this._renderStar(star, index)} `)}
|
|
207
|
+
</div>
|
|
208
|
+
${this.count
|
|
209
|
+
? html `<div>
|
|
210
|
+
<div class="info-title">${this.count || ''}</div>
|
|
211
|
+
<div class="info-subtitle">${this._getCountTitle()}</div>
|
|
212
|
+
</div>`
|
|
213
|
+
: ''}
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
`;
|
|
218
|
+
}
|
|
219
|
+
firstUpdated() {
|
|
220
|
+
if (!this.readonly) {
|
|
221
|
+
this.shadowRoot.querySelector('.edit').addEventListener('mouseout', this._onMouseOut.bind(this));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
_getCountTitle() {
|
|
225
|
+
if (this.count) {
|
|
226
|
+
if (this.count > 1) {
|
|
227
|
+
return i18n('gv-rating.notes');
|
|
228
|
+
}
|
|
229
|
+
return i18n('gv-rating.note');
|
|
230
|
+
}
|
|
231
|
+
return '';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
window.customElements.define('gv-rating', GvRating);
|
|
@@ -1 +1,42 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2015 The Gravitee team (http://gravitee.io)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { css } from 'lit';
|
|
17
|
+
import { GvExpandable } from './gv-expandable';
|
|
18
|
+
/**
|
|
19
|
+
* Expandable row
|
|
20
|
+
* @extends GvExpandable
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
export class GvRowExpandable extends GvExpandable {
|
|
24
|
+
constructor() {
|
|
25
|
+
super();
|
|
26
|
+
this.icon = 'general:other#2';
|
|
27
|
+
this.iconOpened = 'general:other#2';
|
|
28
|
+
this.clickable = true;
|
|
29
|
+
}
|
|
30
|
+
static get styles() {
|
|
31
|
+
return [
|
|
32
|
+
...super.styles,
|
|
33
|
+
// language=CSS
|
|
34
|
+
css `
|
|
35
|
+
.box:hover {
|
|
36
|
+
background-color: var(--gv-theme-neutral-color, #f5f5f5);
|
|
37
|
+
}
|
|
38
|
+
`,
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
window.customElements.define('gv-row-expandable', GvRowExpandable);
|