pr360-questionnaire 2.2.11 → 2.3.1
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/build/questionnaire-test.js +48 -5
- package/css/app.scss +2 -0
- package/css/base/_layout.scss +64 -10
- package/css/components/_booking.scss +449 -0
- package/css/components/_buttons.scss +83 -1
- package/css/components/_dropdown.scss +103 -0
- package/css/components/_inputs.scss +5 -0
- package/css/components/_modal.scss +8 -0
- package/css/components/_tables.scss +123 -15
- package/dist/index.js +21 -5
- package/js/calendar.ts +4 -3
- package/js/questionnaire.ts +22 -5
- package/package.json +2 -1
- package/test/questionnaire-test.ts +36 -0
|
@@ -17355,6 +17355,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
17355
17355
|
this.accountActive = true;
|
|
17356
17356
|
this.visitedNodes = [];
|
|
17357
17357
|
this.verificationError = null;
|
|
17358
|
+
this.canSelfBook = false;
|
|
17358
17359
|
this.hubspotId = "40834387";
|
|
17359
17360
|
}
|
|
17360
17361
|
get topic() {
|
|
@@ -17450,8 +17451,14 @@ meter::-webkit-meter-optimum-value {
|
|
|
17450
17451
|
<div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
|
|
17451
17452
|
<div class="questionnaire--question"><h2 class="u-padding--bt">${this.currentStep.text}</h2></div>
|
|
17452
17453
|
<vimeo-video controls src=${this.currentStep.url} class="questionnaire--video"></vimeo-video>
|
|
17453
|
-
|
|
17454
|
-
|
|
17454
|
+
${this.canSelfBook ? x`
|
|
17455
|
+
<div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. Based on your results ${this.siteSource || "we"} would like to help you set up an initial call with a professional.</h4></div>
|
|
17456
|
+
<div data-test-id="site-phone-number"><h4>Or if you'd like to speak with ${this.siteSource || "us"}, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
|
|
17457
|
+
<a class="button button--primary" href=${this.bookingUrl} target="_blank">Book Appointment</a>
|
|
17458
|
+
` : x`
|
|
17459
|
+
<div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. ${this.siteSource || "We"} will be calling you within 24 hours with more information.</h4></div>
|
|
17460
|
+
<div data-test-id="site-phone-number"><h4>If you'd like to speak with ${this.siteSource || "us"} sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
|
|
17461
|
+
`}
|
|
17455
17462
|
</div>
|
|
17456
17463
|
</div>
|
|
17457
17464
|
</div>
|
|
@@ -17463,7 +17470,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
17463
17470
|
<div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
|
|
17464
17471
|
<div class="form__container">
|
|
17465
17472
|
<div class="header">
|
|
17466
|
-
<h1
|
|
17473
|
+
<h1>${this.siteSource ? `${this.siteSource} can help.` : "We think we can help."}</h1>
|
|
17467
17474
|
<h2>${this.currentStep.text}</h2>
|
|
17468
17475
|
</div>
|
|
17469
17476
|
<form @submit=${this.submitContactInfo}>
|
|
@@ -17503,7 +17510,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
17503
17510
|
</div>
|
|
17504
17511
|
<div class="footer u-text-center">
|
|
17505
17512
|
<button class="button button--primary u-push-top" type="submit">Get Assessment</button>
|
|
17506
|
-
<p>By clicking
|
|
17513
|
+
<p>By clicking Get Assessment, you consent to receive text messages (SMS) and phone calls, and you acknowledge that you have read and agree to the <a href=${this.links["terms_conditions"]} target="_blank">Terms of Use</a>
|
|
17507
17514
|
and the <a href=${this.links["privacy_policy"]} target="_blank">Privacy Policy</a></p>
|
|
17508
17515
|
</div>
|
|
17509
17516
|
</div>
|
|
@@ -17681,6 +17688,15 @@ meter::-webkit-meter-optimum-value {
|
|
|
17681
17688
|
__decorateClass([
|
|
17682
17689
|
t3()
|
|
17683
17690
|
], QuestionnaireElement.prototype, "verificationError", 2);
|
|
17691
|
+
__decorateClass([
|
|
17692
|
+
t3()
|
|
17693
|
+
], QuestionnaireElement.prototype, "canSelfBook", 2);
|
|
17694
|
+
__decorateClass([
|
|
17695
|
+
t3()
|
|
17696
|
+
], QuestionnaireElement.prototype, "bookingUrl", 2);
|
|
17697
|
+
__decorateClass([
|
|
17698
|
+
t3()
|
|
17699
|
+
], QuestionnaireElement.prototype, "siteSource", 2);
|
|
17684
17700
|
__decorateClass([
|
|
17685
17701
|
n5(),
|
|
17686
17702
|
liveStateConfig("url")
|
|
@@ -17730,7 +17746,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
17730
17746
|
QuestionnaireElement = __decorateClass([
|
|
17731
17747
|
e4("pr360-questionnaire"),
|
|
17732
17748
|
liveStateDecorator_default({
|
|
17733
|
-
properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError"],
|
|
17749
|
+
properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError", "canSelfBook", "bookingUrl", "siteSource"],
|
|
17734
17750
|
events: {
|
|
17735
17751
|
send: ["answerQuestion", "submitContactInfo", "goBack", "setUtmParams", "submitVerification", "resendCode"]
|
|
17736
17752
|
},
|
|
@@ -32202,6 +32218,33 @@ ${inspect(response)}
|
|
|
32202
32218
|
await questionnaireElement.updateComplete;
|
|
32203
32219
|
f3(questionnaireElement.shadowRoot?.textContent).to.contain("Invalid verification code");
|
|
32204
32220
|
});
|
|
32221
|
+
it("renders Book Appointment as clickable link when canSelfBook is true", async () => {
|
|
32222
|
+
questionnaireElement.currentStep = {
|
|
32223
|
+
id: "video_123",
|
|
32224
|
+
type: "Video",
|
|
32225
|
+
text: "Based on your assessment, you are likely still losing too much blood.",
|
|
32226
|
+
url: "https://vimeo.com/123456"
|
|
32227
|
+
};
|
|
32228
|
+
questionnaireElement.canSelfBook = true;
|
|
32229
|
+
questionnaireElement.bookingUrl = "https://booking.example.com/appointment?prospect_id=abc123";
|
|
32230
|
+
questionnaireElement.phoneNumber = "555-123-4567";
|
|
32231
|
+
questionnaireElement.links = {
|
|
32232
|
+
contact_info_image: "/images/contact.jpg"
|
|
32233
|
+
};
|
|
32234
|
+
const button = questionnaireElement.querySelector("button");
|
|
32235
|
+
button?.click();
|
|
32236
|
+
await questionnaireElement.updateComplete;
|
|
32237
|
+
const bookingLink = questionnaireElement.shadowRoot?.querySelector('a[href="https://booking.example.com/appointment?prospect_id=abc123"]');
|
|
32238
|
+
f3(bookingLink).to.exist;
|
|
32239
|
+
f3(bookingLink?.textContent).to.contain("Book Appointment");
|
|
32240
|
+
f3(bookingLink?.getAttribute("target")).to.equal("_blank");
|
|
32241
|
+
f3(bookingLink?.classList.contains("button")).to.be.true;
|
|
32242
|
+
const infoDiv = questionnaireElement.shadowRoot?.querySelector('[data-test-id="questionnaire-info"]');
|
|
32243
|
+
f3(infoDiv).to.exist;
|
|
32244
|
+
f3(infoDiv?.textContent).to.contain("set up an initial call with a professional");
|
|
32245
|
+
const phoneDiv = questionnaireElement.shadowRoot?.querySelector('[data-test-id="site-phone-number"]');
|
|
32246
|
+
f3(phoneDiv).to.exist;
|
|
32247
|
+
});
|
|
32205
32248
|
});
|
|
32206
32249
|
})();
|
|
32207
32250
|
/*! Bundled license information:
|
package/css/app.scss
CHANGED
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
@import './components/questionnaire';
|
|
21
21
|
@import './components/site-rules';
|
|
22
22
|
@import './components/network-live';
|
|
23
|
+
@import './components/dropdown';
|
|
24
|
+
@import './components/booking';
|
|
23
25
|
|
|
24
26
|
// Imported last to take precedence in the cascade
|
|
25
27
|
@import './base/utilities';
|
package/css/base/_layout.scss
CHANGED
|
@@ -9,30 +9,84 @@ body {
|
|
|
9
9
|
header,
|
|
10
10
|
.header {
|
|
11
11
|
display: grid;
|
|
12
|
-
gap: $space-
|
|
13
|
-
|
|
14
|
-
grid-template-
|
|
12
|
+
gap: $space-xs;
|
|
13
|
+
grid-template-columns: auto 1fr;
|
|
14
|
+
grid-template-areas: "logo nav";
|
|
15
15
|
font-size: $small-font-size;
|
|
16
16
|
padding: $space-sm $space-md;
|
|
17
17
|
margin-bottom: $space-md;
|
|
18
18
|
background-color: $white;
|
|
19
19
|
box-shadow: 5px 5px 20px 3px rgba(131, 131, 131, 0.198);
|
|
20
20
|
|
|
21
|
+
.logo {
|
|
22
|
+
grid-area: logo;
|
|
23
|
+
font-weight: bold;
|
|
24
|
+
align-self: center;
|
|
25
|
+
margin: 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.main-nav {
|
|
29
|
+
grid-area: nav;
|
|
30
|
+
display: flex;
|
|
31
|
+
gap: $space-lg;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: flex-end;
|
|
34
|
+
|
|
35
|
+
a {
|
|
36
|
+
white-space: nowrap;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// User menu dropdown styling in nav bar
|
|
41
|
+
.user-menu-dropdown {
|
|
42
|
+
.dropdown__toggle {
|
|
43
|
+
background-color: transparent;
|
|
44
|
+
border: 1px solid $gray-lighter;
|
|
45
|
+
font-size: 0.8125rem;
|
|
46
|
+
font-weight: 600;
|
|
47
|
+
color: $gray-dark;
|
|
48
|
+
padding: $space-xs $space-sm;
|
|
49
|
+
|
|
50
|
+
&:hover {
|
|
51
|
+
background-color: $gray-lightest;
|
|
52
|
+
border-color: $gray-light;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.dropdown__menu {
|
|
57
|
+
min-width: 200px;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
21
61
|
@media screen and (max-width: $screen-tablet) {
|
|
22
|
-
grid-template-columns:
|
|
62
|
+
grid-template-columns: 1fr;
|
|
23
63
|
grid-template-rows: auto auto;
|
|
24
|
-
grid-template-areas:
|
|
25
|
-
|
|
64
|
+
grid-template-areas:
|
|
65
|
+
"logo"
|
|
66
|
+
"nav";
|
|
26
67
|
|
|
27
|
-
|
|
28
|
-
|
|
68
|
+
.logo {
|
|
69
|
+
text-align: center;
|
|
29
70
|
margin-bottom: $space-xs;
|
|
30
71
|
}
|
|
31
72
|
|
|
32
|
-
.
|
|
73
|
+
.main-nav {
|
|
74
|
+
justify-content: center;
|
|
75
|
+
flex-wrap: wrap;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
33
78
|
|
|
34
|
-
|
|
79
|
+
// Public header variant (no navigation)
|
|
80
|
+
&--public {
|
|
81
|
+
display: flex;
|
|
82
|
+
justify-content: center;
|
|
83
|
+
padding: $space-md;
|
|
35
84
|
|
|
85
|
+
.logo {
|
|
86
|
+
text-align: center;
|
|
87
|
+
font-size: 1.25rem;
|
|
88
|
+
color: $color-primary;
|
|
89
|
+
}
|
|
36
90
|
}
|
|
37
91
|
}
|
|
38
92
|
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
// Booking Page - matches questionnaire styling
|
|
2
|
+
// Colors from questionnaire.lit.scss
|
|
3
|
+
$booking-primary: #3B6A8B;
|
|
4
|
+
$booking-bg: #F0F5F7;
|
|
5
|
+
$booking-white: #FFFFFF;
|
|
6
|
+
$booking-gray: rgb(132, 132, 132);
|
|
7
|
+
$booking-border: #8c8c8c;
|
|
8
|
+
$booking-hover: #D6E2E5;
|
|
9
|
+
$booking-light: #EDF3F4;
|
|
10
|
+
|
|
11
|
+
.booking-page {
|
|
12
|
+
background-color: $booking-bg;
|
|
13
|
+
min-height: 100vh;
|
|
14
|
+
display: flex;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
align-items: flex-start;
|
|
17
|
+
padding: 55px 20px;
|
|
18
|
+
font-family: 'Lato', Helvetica, sans-serif;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.booking-card {
|
|
22
|
+
width: 45vw;
|
|
23
|
+
min-height: 55vh;
|
|
24
|
+
background-color: $booking-white;
|
|
25
|
+
padding: 50px;
|
|
26
|
+
border-radius: 45px;
|
|
27
|
+
box-shadow: 7px 7px 5px 0px rgba(0, 0, 0, 0.1);
|
|
28
|
+
position: relative;
|
|
29
|
+
|
|
30
|
+
@media screen and (max-width: 1210px) {
|
|
31
|
+
width: 55vw;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@media screen and (max-width: 900px) {
|
|
35
|
+
width: 75vw;
|
|
36
|
+
padding: 30px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@media screen and (max-width: 600px) {
|
|
40
|
+
width: 90vw;
|
|
41
|
+
padding: 25px 20px;
|
|
42
|
+
border-radius: 25px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
h1 {
|
|
46
|
+
font-size: 1.5rem;
|
|
47
|
+
font-weight: 700;
|
|
48
|
+
color: rgba(24, 24, 24, 0.88);
|
|
49
|
+
text-align: center;
|
|
50
|
+
margin: 0 0 5px;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
h2 {
|
|
54
|
+
font-weight: 400;
|
|
55
|
+
margin: 0;
|
|
56
|
+
font-size: 1rem;
|
|
57
|
+
line-height: 1.2rem;
|
|
58
|
+
color: $booking-primary;
|
|
59
|
+
text-align: center;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
h3 {
|
|
63
|
+
font-weight: 600;
|
|
64
|
+
font-size: 1rem;
|
|
65
|
+
color: rgba(24, 24, 24, 0.88);
|
|
66
|
+
margin: 0 0 10px;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.booking-subtitle {
|
|
71
|
+
font-size: 0.9rem;
|
|
72
|
+
color: $booking-gray;
|
|
73
|
+
text-align: center;
|
|
74
|
+
margin: 8px 0 25px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Navigation buttons
|
|
78
|
+
.booking-nav {
|
|
79
|
+
display: flex;
|
|
80
|
+
justify-content: space-between;
|
|
81
|
+
margin-bottom: 20px;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.booking-nav-btn {
|
|
85
|
+
display: flex;
|
|
86
|
+
align-items: center;
|
|
87
|
+
gap: 6px;
|
|
88
|
+
background: transparent;
|
|
89
|
+
border: none;
|
|
90
|
+
color: $booking-primary;
|
|
91
|
+
font-family: 'Lato', Helvetica, sans-serif;
|
|
92
|
+
font-size: 0.875rem;
|
|
93
|
+
font-weight: 400;
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
padding: 8px 12px;
|
|
96
|
+
border-radius: 5px;
|
|
97
|
+
transition: background-color 0.2s ease;
|
|
98
|
+
|
|
99
|
+
&:hover {
|
|
100
|
+
background-color: $booking-light;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
svg {
|
|
104
|
+
width: 16px;
|
|
105
|
+
height: 16px;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.booking-nav-spacer {
|
|
110
|
+
width: 80px;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Days list
|
|
114
|
+
.booking-days {
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
gap: 12px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.booking-day {
|
|
121
|
+
border: 1px solid $booking-border;
|
|
122
|
+
border-radius: 5px;
|
|
123
|
+
overflow: hidden;
|
|
124
|
+
transition: border-color 0.2s ease;
|
|
125
|
+
|
|
126
|
+
&.expanded {
|
|
127
|
+
border-color: $booking-primary;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.booking-day-header {
|
|
132
|
+
display: flex;
|
|
133
|
+
justify-content: space-between;
|
|
134
|
+
align-items: center;
|
|
135
|
+
width: 100%;
|
|
136
|
+
padding: 15px 20px;
|
|
137
|
+
background: $booking-white;
|
|
138
|
+
border: none;
|
|
139
|
+
cursor: pointer;
|
|
140
|
+
font-family: 'Lato', Helvetica, sans-serif;
|
|
141
|
+
transition: background-color 0.2s ease;
|
|
142
|
+
|
|
143
|
+
&:hover {
|
|
144
|
+
background-color: $booking-light;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.expanded & {
|
|
148
|
+
background-color: $booking-light;
|
|
149
|
+
border-bottom: 1px solid $booking-border;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.booking-day-info {
|
|
154
|
+
display: flex;
|
|
155
|
+
flex-direction: column;
|
|
156
|
+
align-items: flex-start;
|
|
157
|
+
gap: 2px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.booking-day-name {
|
|
161
|
+
font-size: 1rem;
|
|
162
|
+
font-weight: 600;
|
|
163
|
+
color: rgba(24, 24, 24, 0.88);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.booking-day-date {
|
|
167
|
+
font-size: 0.875rem;
|
|
168
|
+
color: $booking-gray;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.booking-day-count {
|
|
172
|
+
font-size: 0.875rem;
|
|
173
|
+
color: $booking-primary;
|
|
174
|
+
font-weight: 400;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Slots container
|
|
178
|
+
.booking-day-slots {
|
|
179
|
+
display: none;
|
|
180
|
+
padding: 15px 20px;
|
|
181
|
+
background: $booking-light;
|
|
182
|
+
flex-wrap: wrap;
|
|
183
|
+
gap: 10px;
|
|
184
|
+
|
|
185
|
+
.expanded & {
|
|
186
|
+
display: flex;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.booking-slot {
|
|
191
|
+
font-family: 'Lato', Helvetica, sans-serif;
|
|
192
|
+
font-size: 0.9rem;
|
|
193
|
+
font-weight: 400;
|
|
194
|
+
padding: 10px 18px;
|
|
195
|
+
background: $booking-white;
|
|
196
|
+
border: 1px solid $booking-border;
|
|
197
|
+
border-radius: 5px;
|
|
198
|
+
cursor: pointer;
|
|
199
|
+
transition: all 0.2s ease;
|
|
200
|
+
color: rgba(24, 24, 24, 0.88);
|
|
201
|
+
|
|
202
|
+
&:hover {
|
|
203
|
+
border-color: $booking-primary;
|
|
204
|
+
background-color: $booking-white;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
&.selected {
|
|
208
|
+
background-color: $booking-primary;
|
|
209
|
+
border-color: $booking-primary;
|
|
210
|
+
color: $booking-white;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.booking-slot-duration {
|
|
215
|
+
color: $booking-gray;
|
|
216
|
+
font-size: 0.8rem;
|
|
217
|
+
|
|
218
|
+
.selected & {
|
|
219
|
+
color: rgba(255, 255, 255, 0.8);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Empty state
|
|
224
|
+
.booking-empty {
|
|
225
|
+
text-align: center;
|
|
226
|
+
padding: 40px 20px;
|
|
227
|
+
|
|
228
|
+
p {
|
|
229
|
+
font-size: 1rem;
|
|
230
|
+
color: $booking-gray;
|
|
231
|
+
margin-bottom: 20px;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Actions
|
|
236
|
+
.booking-actions {
|
|
237
|
+
margin-top: 30px;
|
|
238
|
+
display: flex;
|
|
239
|
+
flex-direction: column;
|
|
240
|
+
align-items: center;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.booking-selection-summary {
|
|
244
|
+
font-size: 0.875rem;
|
|
245
|
+
color: $booking-primary;
|
|
246
|
+
margin-top: 10px;
|
|
247
|
+
text-align: center;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Buttons matching questionnaire style
|
|
251
|
+
.booking-page .button {
|
|
252
|
+
font-family: sofia-pro, SofiaProWeb, Helvetica, Arial, sans-serif;
|
|
253
|
+
background-color: $booking-light;
|
|
254
|
+
border-radius: 0.5rem;
|
|
255
|
+
color: $booking-primary;
|
|
256
|
+
font-size: 1rem;
|
|
257
|
+
font-weight: 300;
|
|
258
|
+
transition: transform 150ms, background-color 150ms;
|
|
259
|
+
padding: 10px 35px;
|
|
260
|
+
min-width: 150px;
|
|
261
|
+
width: 25vw;
|
|
262
|
+
min-height: 55px;
|
|
263
|
+
border: unset;
|
|
264
|
+
cursor: pointer;
|
|
265
|
+
|
|
266
|
+
@media screen and (max-width: 1210px) {
|
|
267
|
+
width: 35vw;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
@media screen and (max-width: 700px) {
|
|
271
|
+
width: 60vw;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
&:hover:not(:disabled) {
|
|
275
|
+
background-color: $booking-hover;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
&--primary {
|
|
279
|
+
background-color: $booking-primary;
|
|
280
|
+
color: $booking-white;
|
|
281
|
+
|
|
282
|
+
&:hover:not(:disabled) {
|
|
283
|
+
background-color: darken($booking-primary, 8%);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
&--disabled {
|
|
288
|
+
opacity: 0.5;
|
|
289
|
+
cursor: not-allowed;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Modal styling
|
|
294
|
+
.booking-confirm-modal {
|
|
295
|
+
text-align: center;
|
|
296
|
+
padding: 20px 0;
|
|
297
|
+
|
|
298
|
+
h1 {
|
|
299
|
+
font-size: 1.5rem;
|
|
300
|
+
font-weight: 700;
|
|
301
|
+
color: rgba(24, 24, 24, 0.88);
|
|
302
|
+
margin: 0 0 5px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
h2 {
|
|
306
|
+
font-weight: 400;
|
|
307
|
+
margin: 0 0 25px;
|
|
308
|
+
font-size: 1rem;
|
|
309
|
+
color: $booking-primary;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.booking-confirm-details {
|
|
314
|
+
background: $booking-light;
|
|
315
|
+
border-radius: 10px;
|
|
316
|
+
padding: 20px 25px;
|
|
317
|
+
margin-bottom: 25px;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.booking-confirm-row {
|
|
321
|
+
display: flex;
|
|
322
|
+
justify-content: space-between;
|
|
323
|
+
padding: 10px 0;
|
|
324
|
+
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
|
325
|
+
|
|
326
|
+
&:last-child {
|
|
327
|
+
border-bottom: none;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.booking-confirm-label {
|
|
332
|
+
font-size: 0.875rem;
|
|
333
|
+
color: $booking-gray;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.booking-confirm-value {
|
|
337
|
+
font-size: 0.875rem;
|
|
338
|
+
font-weight: 600;
|
|
339
|
+
color: rgba(24, 24, 24, 0.88);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.booking-confirm-actions {
|
|
343
|
+
display: flex;
|
|
344
|
+
justify-content: center;
|
|
345
|
+
gap: 15px;
|
|
346
|
+
|
|
347
|
+
.button {
|
|
348
|
+
width: auto;
|
|
349
|
+
min-width: 120px;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Confirmation page (show)
|
|
354
|
+
.booking-card--confirmed {
|
|
355
|
+
text-align: center;
|
|
356
|
+
|
|
357
|
+
.booking-confirm-details {
|
|
358
|
+
text-align: left;
|
|
359
|
+
margin: 25px 0;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.booking-success-icon {
|
|
364
|
+
width: 80px;
|
|
365
|
+
height: 80px;
|
|
366
|
+
margin: 0 auto 20px;
|
|
367
|
+
color: #22c55e;
|
|
368
|
+
|
|
369
|
+
svg {
|
|
370
|
+
width: 100%;
|
|
371
|
+
height: 100%;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.booking-next-steps {
|
|
376
|
+
background: $booking-light;
|
|
377
|
+
border-radius: 10px;
|
|
378
|
+
padding: 25px;
|
|
379
|
+
margin-top: 25px;
|
|
380
|
+
text-align: left;
|
|
381
|
+
|
|
382
|
+
h3 {
|
|
383
|
+
margin-bottom: 15px;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
p {
|
|
387
|
+
font-size: 0.9rem;
|
|
388
|
+
line-height: 1.6;
|
|
389
|
+
color: $booking-gray;
|
|
390
|
+
margin: 0 0 12px;
|
|
391
|
+
|
|
392
|
+
&:last-child {
|
|
393
|
+
margin-bottom: 0;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Info icon for existing appointments
|
|
399
|
+
.booking-info-icon {
|
|
400
|
+
width: 80px;
|
|
401
|
+
height: 80px;
|
|
402
|
+
margin: 0 auto 20px;
|
|
403
|
+
color: $booking-primary;
|
|
404
|
+
|
|
405
|
+
svg {
|
|
406
|
+
width: 100%;
|
|
407
|
+
height: 100%;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Contact information section
|
|
412
|
+
.booking-contact-info {
|
|
413
|
+
background: $booking-white;
|
|
414
|
+
border: 1px solid $booking-border;
|
|
415
|
+
border-radius: 8px;
|
|
416
|
+
padding: 15px 20px;
|
|
417
|
+
margin: 15px 0;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.booking-contact-row {
|
|
421
|
+
display: flex;
|
|
422
|
+
align-items: center;
|
|
423
|
+
gap: 12px;
|
|
424
|
+
padding: 8px 0;
|
|
425
|
+
font-size: 0.9rem;
|
|
426
|
+
color: rgba(24, 24, 24, 0.88);
|
|
427
|
+
|
|
428
|
+
&:not(:last-child) {
|
|
429
|
+
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.contact-icon {
|
|
433
|
+
width: 20px;
|
|
434
|
+
height: 20px;
|
|
435
|
+
color: $booking-primary;
|
|
436
|
+
flex-shrink: 0;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
span {
|
|
440
|
+
font-weight: 500;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.booking-contact-note {
|
|
445
|
+
font-size: 0.8rem !important;
|
|
446
|
+
font-style: italic;
|
|
447
|
+
color: $booking-gray;
|
|
448
|
+
margin-top: 15px !important;
|
|
449
|
+
}
|
|
@@ -28,5 +28,87 @@ button, .button {
|
|
|
28
28
|
background-color: transparent;
|
|
29
29
|
|
|
30
30
|
}
|
|
31
|
+
|
|
32
|
+
&--compact {
|
|
33
|
+
padding: 8px 12px;
|
|
34
|
+
font-size: 14px;
|
|
35
|
+
}
|
|
31
36
|
|
|
32
|
-
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.toggle-filter {
|
|
40
|
+
display: inline-flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
gap: 12px;
|
|
43
|
+
padding: 8px 12px;
|
|
44
|
+
border: 1px solid #e5e7eb;
|
|
45
|
+
border-radius: 6px;
|
|
46
|
+
background-color: #f9fafb;
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
transition: background-color 0.15s ease;
|
|
49
|
+
|
|
50
|
+
&:hover {
|
|
51
|
+
background-color: #f3f4f6;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&__label {
|
|
55
|
+
font-size: 13px;
|
|
56
|
+
font-weight: 500;
|
|
57
|
+
color: #374151;
|
|
58
|
+
user-select: none;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.toggle-switch {
|
|
63
|
+
position: relative;
|
|
64
|
+
width: 44px;
|
|
65
|
+
height: 24px;
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
|
|
68
|
+
input[type="checkbox"] {
|
|
69
|
+
opacity: 0;
|
|
70
|
+
width: 0;
|
|
71
|
+
height: 0;
|
|
72
|
+
position: absolute;
|
|
73
|
+
|
|
74
|
+
&:checked + .toggle-switch__slider {
|
|
75
|
+
background-color: $color-primary;
|
|
76
|
+
|
|
77
|
+
&:before {
|
|
78
|
+
transform: translateX(20px);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&__slider {
|
|
84
|
+
position: absolute;
|
|
85
|
+
top: 0;
|
|
86
|
+
left: 0;
|
|
87
|
+
right: 0;
|
|
88
|
+
bottom: 0;
|
|
89
|
+
background-color: #cbd5e1;
|
|
90
|
+
border-radius: 24px;
|
|
91
|
+
transition: all 0.3s ease;
|
|
92
|
+
|
|
93
|
+
&:before {
|
|
94
|
+
content: "";
|
|
95
|
+
position: absolute;
|
|
96
|
+
height: 18px;
|
|
97
|
+
width: 18px;
|
|
98
|
+
left: 3px;
|
|
99
|
+
bottom: 3px;
|
|
100
|
+
background-color: white;
|
|
101
|
+
border-radius: 50%;
|
|
102
|
+
transition: transform 0.3s ease;
|
|
103
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&:hover .toggle-switch__slider {
|
|
108
|
+
background-color: #94a3b8;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
input[type="checkbox"]:checked + .toggle-switch__slider:hover {
|
|
112
|
+
background-color: darken($color-primary, 10%);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// Dropdown menu component
|
|
2
|
+
.dropdown {
|
|
3
|
+
position: relative;
|
|
4
|
+
display: inline-block;
|
|
5
|
+
|
|
6
|
+
&__toggle {
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
justify-content: center;
|
|
10
|
+
padding: $space-xs $space-sm;
|
|
11
|
+
background-color: $white;
|
|
12
|
+
border: 1px solid $gray-lighter;
|
|
13
|
+
border-radius: $border-radius;
|
|
14
|
+
color: $gray-dark;
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
transition: $transition;
|
|
17
|
+
min-width: 80px;
|
|
18
|
+
font-size: 14px;
|
|
19
|
+
gap: $space-xs;
|
|
20
|
+
|
|
21
|
+
&:hover {
|
|
22
|
+
background-color: $gray-lightest;
|
|
23
|
+
border-color: $gray-light;
|
|
24
|
+
color: $color-primary;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.icon-text {
|
|
28
|
+
font-size: 12px;
|
|
29
|
+
line-height: 1;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
&__menu {
|
|
34
|
+
display: none;
|
|
35
|
+
position: absolute;
|
|
36
|
+
right: 0;
|
|
37
|
+
top: 100%;
|
|
38
|
+
margin-top: $space-xs;
|
|
39
|
+
background-color: $white;
|
|
40
|
+
border: 1px solid $gray-lighter;
|
|
41
|
+
border-radius: $border-radius;
|
|
42
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
43
|
+
min-width: 180px;
|
|
44
|
+
z-index: 1000;
|
|
45
|
+
padding: $space-xs 0;
|
|
46
|
+
|
|
47
|
+
&--show {
|
|
48
|
+
display: block;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&__item {
|
|
53
|
+
display: flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
gap: $space-sm;
|
|
56
|
+
padding: $space-sm $space-md;
|
|
57
|
+
color: $gray-dark;
|
|
58
|
+
text-decoration: none;
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
transition: $transition;
|
|
61
|
+
border: none;
|
|
62
|
+
background: none;
|
|
63
|
+
width: 100%;
|
|
64
|
+
text-align: left;
|
|
65
|
+
font-size: 14px;
|
|
66
|
+
|
|
67
|
+
.icon-text {
|
|
68
|
+
font-size: 16px;
|
|
69
|
+
line-height: 1;
|
|
70
|
+
width: 20px;
|
|
71
|
+
display: flex;
|
|
72
|
+
align-items: center;
|
|
73
|
+
justify-content: center;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&:hover:not(&--danger) {
|
|
77
|
+
background-color: $gray-lightest;
|
|
78
|
+
color: $color-primary;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
&--danger {
|
|
82
|
+
color: $gray-dark;
|
|
83
|
+
|
|
84
|
+
&:hover {
|
|
85
|
+
background-color: lighten($danger, 45%) !important;
|
|
86
|
+
color: $danger !important;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
&--disabled {
|
|
91
|
+
opacity: 0.5;
|
|
92
|
+
cursor: not-allowed;
|
|
93
|
+
pointer-events: none;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&__divider {
|
|
98
|
+
height: 1px;
|
|
99
|
+
background-color: $gray-lighter;
|
|
100
|
+
margin: $space-xs 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
background-color: rgba(0, 0, 0, .2);
|
|
8
8
|
backdrop-filter: blur(4px);
|
|
9
9
|
-webkit-backdrop-filter: blur(4px);
|
|
10
|
+
z-index: 9998;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
.modal--container{
|
|
@@ -26,6 +27,13 @@
|
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
|
|
30
|
+
// Ensure FullCalendar sticky headers stay below modals
|
|
31
|
+
.fc-col-header-cell,
|
|
32
|
+
.fc-col-header,
|
|
33
|
+
.fc-scrollgrid-sync-table {
|
|
34
|
+
z-index: 1 !important;
|
|
35
|
+
}
|
|
36
|
+
|
|
29
37
|
// Style the onboarding email textarea to match other form fields but with better formatting
|
|
30
38
|
textarea[name="network_form[onboarding_email]"] {
|
|
31
39
|
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace !important;
|
|
@@ -44,20 +44,7 @@ table {
|
|
|
44
44
|
overflow: visible;
|
|
45
45
|
|
|
46
46
|
&_links {
|
|
47
|
-
|
|
48
|
-
justify-content: space-between;
|
|
49
|
-
align-items: baseline;
|
|
50
|
-
|
|
51
|
-
& span {
|
|
52
|
-
display: flex;
|
|
53
|
-
gap: 25px;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
& div {
|
|
57
|
-
display: flex;
|
|
58
|
-
align-items: baseline;
|
|
59
|
-
gap: 10px;
|
|
60
|
-
}
|
|
47
|
+
margin-bottom: $space-md;
|
|
61
48
|
}
|
|
62
49
|
|
|
63
50
|
h4 {
|
|
@@ -77,6 +64,42 @@ table {
|
|
|
77
64
|
}
|
|
78
65
|
}
|
|
79
66
|
|
|
67
|
+
// Prospects toolbar layout
|
|
68
|
+
.prospects-toolbar {
|
|
69
|
+
display: flex;
|
|
70
|
+
justify-content: space-between;
|
|
71
|
+
align-items: center;
|
|
72
|
+
gap: 20px;
|
|
73
|
+
flex-wrap: wrap;
|
|
74
|
+
|
|
75
|
+
&__left {
|
|
76
|
+
display: flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
gap: 15px;
|
|
79
|
+
flex: 1;
|
|
80
|
+
min-width: 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&__right {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 12px;
|
|
87
|
+
flex-shrink: 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Toolbar links
|
|
92
|
+
.toolbar-link {
|
|
93
|
+
font-size: 14px;
|
|
94
|
+
color: $color-primary;
|
|
95
|
+
text-decoration: none;
|
|
96
|
+
white-space: nowrap;
|
|
97
|
+
|
|
98
|
+
&:hover {
|
|
99
|
+
text-decoration: underline;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
80
103
|
table.org-users {
|
|
81
104
|
margin-bottom: 10vh;
|
|
82
105
|
}
|
|
@@ -90,7 +113,7 @@ table {
|
|
|
90
113
|
border-bottom: 1px solid $gray-lighter;
|
|
91
114
|
|
|
92
115
|
td {
|
|
93
|
-
padding: $space-sm 0;
|
|
116
|
+
padding: $space-sm $space-md $space-sm 0;
|
|
94
117
|
}
|
|
95
118
|
}
|
|
96
119
|
}
|
|
@@ -98,6 +121,7 @@ table {
|
|
|
98
121
|
thead {
|
|
99
122
|
tr {
|
|
100
123
|
th {
|
|
124
|
+
padding-right: $space-md;
|
|
101
125
|
text-align: left;
|
|
102
126
|
color: $gray;
|
|
103
127
|
font-weight: 400;
|
|
@@ -223,6 +247,15 @@ table {
|
|
|
223
247
|
cursor: default !important;
|
|
224
248
|
}
|
|
225
249
|
|
|
250
|
+
// Highlight prospects with nil status in red
|
|
251
|
+
.prospects-table tbody tr.prospect-nil-status {
|
|
252
|
+
background-color: #ffe6e6 !important;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.prospects-table--main tbody tr.prospect-nil-status:hover {
|
|
256
|
+
background-color: #ffd1d1 !important;
|
|
257
|
+
}
|
|
258
|
+
|
|
226
259
|
.prospects-table tr,
|
|
227
260
|
.prospects-table td {
|
|
228
261
|
overflow: visible !important;
|
|
@@ -406,4 +439,79 @@ table {
|
|
|
406
439
|
pointer-events: none !important;
|
|
407
440
|
filter: blur(1px) !important;
|
|
408
441
|
transition: opacity 0.2s, filter 0.2s;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// User table styles
|
|
445
|
+
.user-table {
|
|
446
|
+
tbody {
|
|
447
|
+
tr {
|
|
448
|
+
td:first-child {
|
|
449
|
+
padding-left: 0;
|
|
450
|
+
min-width: 150px;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
td:nth-child(2) {
|
|
454
|
+
min-width: 200px;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
td:nth-child(3) {
|
|
458
|
+
min-width: 150px;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// Icon buttons for table actions
|
|
465
|
+
.icon-button {
|
|
466
|
+
display: inline-flex;
|
|
467
|
+
align-items: center;
|
|
468
|
+
justify-content: center;
|
|
469
|
+
padding: $space-xs;
|
|
470
|
+
background-color: transparent;
|
|
471
|
+
border: 1px solid $gray-lighter;
|
|
472
|
+
border-radius: $border-radius;
|
|
473
|
+
color: $gray-dark;
|
|
474
|
+
cursor: pointer;
|
|
475
|
+
transition: $transition;
|
|
476
|
+
min-width: 36px;
|
|
477
|
+
min-height: 36px;
|
|
478
|
+
text-decoration: none;
|
|
479
|
+
|
|
480
|
+
.icon-text {
|
|
481
|
+
font-size: 16px;
|
|
482
|
+
line-height: 1;
|
|
483
|
+
display: flex;
|
|
484
|
+
align-items: center;
|
|
485
|
+
justify-content: center;
|
|
486
|
+
width: 20px;
|
|
487
|
+
height: 20px;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
&:hover {
|
|
491
|
+
background-color: $gray-lightest;
|
|
492
|
+
border-color: $gray-light;
|
|
493
|
+
color: $color-primary;
|
|
494
|
+
transform: translateY(-1px);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
&:active {
|
|
498
|
+
transform: scale(0.95);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
&--danger {
|
|
502
|
+
&:hover {
|
|
503
|
+
background-color: lighten($danger, 45%);
|
|
504
|
+
border-color: $danger;
|
|
505
|
+
color: $danger;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// Table actions container
|
|
511
|
+
.table-actions {
|
|
512
|
+
display: flex;
|
|
513
|
+
gap: $space-sm;
|
|
514
|
+
align-items: center;
|
|
515
|
+
justify-content: flex-end;
|
|
516
|
+
flex-wrap: nowrap;
|
|
409
517
|
}
|
package/dist/index.js
CHANGED
|
@@ -7544,6 +7544,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
7544
7544
|
this.accountActive = true;
|
|
7545
7545
|
this.visitedNodes = [];
|
|
7546
7546
|
this.verificationError = null;
|
|
7547
|
+
this.canSelfBook = false;
|
|
7547
7548
|
this.hubspotId = "40834387";
|
|
7548
7549
|
}
|
|
7549
7550
|
get topic() {
|
|
@@ -7639,8 +7640,14 @@ meter::-webkit-meter-optimum-value {
|
|
|
7639
7640
|
<div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
|
|
7640
7641
|
<div class="questionnaire--question"><h2 class="u-padding--bt">${this.currentStep.text}</h2></div>
|
|
7641
7642
|
<vimeo-video controls src=${this.currentStep.url} class="questionnaire--video"></vimeo-video>
|
|
7642
|
-
|
|
7643
|
-
|
|
7643
|
+
${this.canSelfBook ? x`
|
|
7644
|
+
<div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. Based on your results ${this.siteSource || "we"} would like to help you set up an initial call with a professional.</h4></div>
|
|
7645
|
+
<div data-test-id="site-phone-number"><h4>Or if you'd like to speak with ${this.siteSource || "us"}, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
|
|
7646
|
+
<a class="button button--primary" href=${this.bookingUrl} target="_blank">Book Appointment</a>
|
|
7647
|
+
` : x`
|
|
7648
|
+
<div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. ${this.siteSource || "We"} will be calling you within 24 hours with more information.</h4></div>
|
|
7649
|
+
<div data-test-id="site-phone-number"><h4>If you'd like to speak with ${this.siteSource || "us"} sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
|
|
7650
|
+
`}
|
|
7644
7651
|
</div>
|
|
7645
7652
|
</div>
|
|
7646
7653
|
</div>
|
|
@@ -7652,7 +7659,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
7652
7659
|
<div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
|
|
7653
7660
|
<div class="form__container">
|
|
7654
7661
|
<div class="header">
|
|
7655
|
-
<h1
|
|
7662
|
+
<h1>${this.siteSource ? `${this.siteSource} can help.` : "We think we can help."}</h1>
|
|
7656
7663
|
<h2>${this.currentStep.text}</h2>
|
|
7657
7664
|
</div>
|
|
7658
7665
|
<form @submit=${this.submitContactInfo}>
|
|
@@ -7692,7 +7699,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
7692
7699
|
</div>
|
|
7693
7700
|
<div class="footer u-text-center">
|
|
7694
7701
|
<button class="button button--primary u-push-top" type="submit">Get Assessment</button>
|
|
7695
|
-
<p>By clicking
|
|
7702
|
+
<p>By clicking Get Assessment, you consent to receive text messages (SMS) and phone calls, and you acknowledge that you have read and agree to the <a href=${this.links["terms_conditions"]} target="_blank">Terms of Use</a>
|
|
7696
7703
|
and the <a href=${this.links["privacy_policy"]} target="_blank">Privacy Policy</a></p>
|
|
7697
7704
|
</div>
|
|
7698
7705
|
</div>
|
|
@@ -7870,6 +7877,15 @@ meter::-webkit-meter-optimum-value {
|
|
|
7870
7877
|
__decorateClass([
|
|
7871
7878
|
t3()
|
|
7872
7879
|
], QuestionnaireElement.prototype, "verificationError", 2);
|
|
7880
|
+
__decorateClass([
|
|
7881
|
+
t3()
|
|
7882
|
+
], QuestionnaireElement.prototype, "canSelfBook", 2);
|
|
7883
|
+
__decorateClass([
|
|
7884
|
+
t3()
|
|
7885
|
+
], QuestionnaireElement.prototype, "bookingUrl", 2);
|
|
7886
|
+
__decorateClass([
|
|
7887
|
+
t3()
|
|
7888
|
+
], QuestionnaireElement.prototype, "siteSource", 2);
|
|
7873
7889
|
__decorateClass([
|
|
7874
7890
|
n5(),
|
|
7875
7891
|
liveStateConfig("url")
|
|
@@ -7919,7 +7935,7 @@ meter::-webkit-meter-optimum-value {
|
|
|
7919
7935
|
QuestionnaireElement = __decorateClass([
|
|
7920
7936
|
e4("pr360-questionnaire"),
|
|
7921
7937
|
liveStateDecorator_default({
|
|
7922
|
-
properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError"],
|
|
7938
|
+
properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError", "canSelfBook", "bookingUrl", "siteSource"],
|
|
7923
7939
|
events: {
|
|
7924
7940
|
send: ["answerQuestion", "submitContactInfo", "goBack", "setUtmParams", "submitVerification", "resendCode"]
|
|
7925
7941
|
},
|
package/js/calendar.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { html, LitElement } from "lit";
|
|
|
2
2
|
import { property } from 'lit/decorators.js'
|
|
3
3
|
import { Calendar } from "@fullcalendar/core";
|
|
4
4
|
import dayGridPlugin from "@fullcalendar/daygrid";
|
|
5
|
+
import timeGridPlugin from "@fullcalendar/timegrid";
|
|
5
6
|
import resourceTimelinePlugin from "@fullcalendar/resource-timeline";
|
|
6
7
|
import momentPlugin from "@fullcalendar/moment";
|
|
7
8
|
|
|
@@ -41,16 +42,16 @@ export class CalendarElement extends LitElement {
|
|
|
41
42
|
let calendarEl: HTMLElement = document.getElementById('full-calendar')!;
|
|
42
43
|
this.calendar = new Calendar(calendarEl, {
|
|
43
44
|
schedulerLicenseKey: "CC-Attribution-NonCommercial-NoDerivatives",
|
|
44
|
-
plugins: [resourceTimelinePlugin, momentPlugin, dayGridPlugin],
|
|
45
|
+
plugins: [resourceTimelinePlugin, momentPlugin, dayGridPlugin, timeGridPlugin],
|
|
45
46
|
slotMinWidth: 70,
|
|
46
47
|
slotMinTime: "08:00",
|
|
47
48
|
slotMaxTime: "20:00",
|
|
48
49
|
stickyHeaderDates: true,
|
|
49
|
-
initialView: '
|
|
50
|
+
initialView: 'timeGridWeek',
|
|
50
51
|
headerToolbar: {
|
|
51
52
|
left: 'prev,next today',
|
|
52
53
|
center: "title",
|
|
53
|
-
right: 'dayGridMonth,
|
|
54
|
+
right: 'dayGridMonth, timeGridWeek, timeGridDay'
|
|
54
55
|
},
|
|
55
56
|
titleFormat: "dddd, MMM D, YYYY",
|
|
56
57
|
events: JSON.parse(this.events),
|
package/js/questionnaire.ts
CHANGED
|
@@ -43,7 +43,7 @@ export type Answer = {
|
|
|
43
43
|
|
|
44
44
|
@customElement('pr360-questionnaire')
|
|
45
45
|
@liveState({
|
|
46
|
-
properties: ['currentStep', 'visitedNodes', 'phoneNumber', 'links', 'accountActive', 'questionnaireDepth', 'providers', 'outcome', 'verificationError'],
|
|
46
|
+
properties: ['currentStep', 'visitedNodes', 'phoneNumber', 'links', 'accountActive', 'questionnaireDepth', 'providers', 'outcome', 'verificationError', 'canSelfBook', 'bookingUrl', 'siteSource'],
|
|
47
47
|
events: {
|
|
48
48
|
send: ['answerQuestion', 'submitContactInfo', 'goBack', 'setUtmParams', 'submitVerification', 'resendCode']
|
|
49
49
|
},
|
|
@@ -80,6 +80,15 @@ export class QuestionnaireElement extends LitElement {
|
|
|
80
80
|
@state()
|
|
81
81
|
verificationError: string | null = null;
|
|
82
82
|
|
|
83
|
+
@state()
|
|
84
|
+
canSelfBook: boolean = false;
|
|
85
|
+
|
|
86
|
+
@state()
|
|
87
|
+
bookingUrl: string;
|
|
88
|
+
|
|
89
|
+
@state()
|
|
90
|
+
siteSource: string;
|
|
91
|
+
|
|
83
92
|
@property()
|
|
84
93
|
@liveStateConfig('url')
|
|
85
94
|
url: string | undefined;
|
|
@@ -231,8 +240,16 @@ export class QuestionnaireElement extends LitElement {
|
|
|
231
240
|
<div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
|
|
232
241
|
<div class="questionnaire--question"><h2 class="u-padding--bt">${(this.currentStep as Video).text}</h2></div>
|
|
233
242
|
<vimeo-video controls src=${(this.currentStep as Video).url} class="questionnaire--video"></vimeo-video>
|
|
234
|
-
|
|
235
|
-
|
|
243
|
+
${this.canSelfBook ?
|
|
244
|
+
html`
|
|
245
|
+
<div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. Based on your results ${this.siteSource || 'we'} would like to help you set up an initial call with a professional.</h4></div>
|
|
246
|
+
<div data-test-id="site-phone-number"><h4>Or if you'd like to speak with ${this.siteSource || 'us'}, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || 'Us'}</h1></a></div>
|
|
247
|
+
<a class="button button--primary" href=${this.bookingUrl} target="_blank">Book Appointment</a>
|
|
248
|
+
` :
|
|
249
|
+
html`
|
|
250
|
+
<div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. ${this.siteSource || 'We'} will be calling you within 24 hours with more information.</h4></div>
|
|
251
|
+
<div data-test-id="site-phone-number"><h4>If you'd like to speak with ${this.siteSource || 'us'} sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || 'Us'}</h1></a></div>
|
|
252
|
+
`}
|
|
236
253
|
</div>
|
|
237
254
|
</div>
|
|
238
255
|
</div>
|
|
@@ -245,7 +262,7 @@ export class QuestionnaireElement extends LitElement {
|
|
|
245
262
|
<div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
|
|
246
263
|
<div class="form__container">
|
|
247
264
|
<div class="header">
|
|
248
|
-
<h1
|
|
265
|
+
<h1>${this.siteSource ? `${this.siteSource} can help.` : 'We think we can help.'}</h1>
|
|
249
266
|
<h2>${(this.currentStep as ContactInfo).text}</h2>
|
|
250
267
|
</div>
|
|
251
268
|
<form @submit=${this.submitContactInfo}>
|
|
@@ -285,7 +302,7 @@ export class QuestionnaireElement extends LitElement {
|
|
|
285
302
|
</div>
|
|
286
303
|
<div class="footer u-text-center">
|
|
287
304
|
<button class="button button--primary u-push-top" type="submit">Get Assessment</button>
|
|
288
|
-
<p>By clicking
|
|
305
|
+
<p>By clicking Get Assessment, you consent to receive text messages (SMS) and phone calls, and you acknowledge that you have read and agree to the <a href=${this.links['terms_conditions']} target="_blank">Terms of Use</a>
|
|
289
306
|
and the <a href=${this.links['privacy_policy']} target="_blank">Privacy Policy</a></p>
|
|
290
307
|
</div>
|
|
291
308
|
</div>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pr360-questionnaire",
|
|
3
3
|
"description": "An element to render a questionnaire for PatientReach 360.",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.3.1",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"author": {
|
|
7
7
|
"email": "chris@launchscout.com",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"mermaid-chart": "launchscout/mermaid-chart",
|
|
33
33
|
"@fullcalendar/core": "^6.1.8",
|
|
34
34
|
"@fullcalendar/daygrid": "^6.1.8",
|
|
35
|
+
"@fullcalendar/timegrid": "^6.1.8",
|
|
35
36
|
"@fullcalendar/moment": "^6.1.11",
|
|
36
37
|
"@fullcalendar/resource": "^6.1.8",
|
|
37
38
|
"@fullcalendar/resource-timeline": "^6.1.8"
|
|
@@ -131,4 +131,40 @@ describe('questionnaire test', async () => {
|
|
|
131
131
|
|
|
132
132
|
expect(questionnaireElement.shadowRoot?.textContent).to.contain("Invalid verification code");
|
|
133
133
|
});
|
|
134
|
+
|
|
135
|
+
it('renders Book Appointment as clickable link when canSelfBook is true', async () => {
|
|
136
|
+
questionnaireElement.currentStep = {
|
|
137
|
+
id: "video_123",
|
|
138
|
+
type: "Video",
|
|
139
|
+
text: "Based on your assessment, you are likely still losing too much blood.",
|
|
140
|
+
url: "https://vimeo.com/123456"
|
|
141
|
+
};
|
|
142
|
+
questionnaireElement.canSelfBook = true;
|
|
143
|
+
questionnaireElement.bookingUrl = "https://booking.example.com/appointment?prospect_id=abc123";
|
|
144
|
+
questionnaireElement.phoneNumber = "555-123-4567";
|
|
145
|
+
questionnaireElement.links = {
|
|
146
|
+
contact_info_image: '/images/contact.jpg'
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const button = questionnaireElement.querySelector('button');
|
|
150
|
+
button?.click();
|
|
151
|
+
await questionnaireElement.updateComplete;
|
|
152
|
+
|
|
153
|
+
// Book Appointment should be an anchor tag with the booking URL
|
|
154
|
+
const bookingLink = questionnaireElement.shadowRoot?.querySelector('a[href="https://booking.example.com/appointment?prospect_id=abc123"]');
|
|
155
|
+
expect(bookingLink).to.exist;
|
|
156
|
+
expect(bookingLink?.textContent).to.contain("Book Appointment");
|
|
157
|
+
expect(bookingLink?.getAttribute('target')).to.equal('_blank');
|
|
158
|
+
// Should have button styling
|
|
159
|
+
expect(bookingLink?.classList.contains('button')).to.be.true;
|
|
160
|
+
|
|
161
|
+
// The message about professional should appear
|
|
162
|
+
const infoDiv = questionnaireElement.shadowRoot?.querySelector('[data-test-id="questionnaire-info"]');
|
|
163
|
+
expect(infoDiv).to.exist;
|
|
164
|
+
expect(infoDiv?.textContent).to.contain("set up an initial call with a professional");
|
|
165
|
+
|
|
166
|
+
// Phone number section should also exist
|
|
167
|
+
const phoneDiv = questionnaireElement.shadowRoot?.querySelector('[data-test-id="site-phone-number"]');
|
|
168
|
+
expect(phoneDiv).to.exist;
|
|
169
|
+
});
|
|
134
170
|
});
|