@hulkapps/app-manager-vue 2.0.9 → 2.1.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hulkapps/app-manager-vue",
3
- "version": "2.0.9",
3
+ "version": "2.1.2",
4
4
  "description": "Vue SDK to render app manager contents",
5
5
  "main": "dist/app-manager-vue.ssr.js",
6
6
  "browser": "dist/app-manager-vue.esm.js",
@@ -1,10 +1,56 @@
1
1
  <template>
2
+ <PSkeletonPage title="Plans"
3
+ :fullWidth="false"
4
+ primaryAction
5
+ :secondaryActions="2"
6
+ :breadcrumbs="false"
7
+ v-if="planLoading">
8
+ <PLayout>
9
+ <PLayoutSection oneThird="">
10
+ <PCard sectioned="">
11
+ <PTextContainer>
12
+ <PSkeletonDisplayText size="small" />
13
+ <PSkeletonBodyText />
14
+ </PTextContainer>
15
+ </PCard>
16
+ </PLayoutSection>
17
+ <PLayoutSection oneThird="">
18
+ <PCard sectioned="">
19
+ <PTextContainer>
20
+ <PSkeletonDisplayText size="small" />
21
+ <PSkeletonBodyText />
22
+ </PTextContainer>
23
+ </PCard>
24
+ </PLayoutSection>
25
+ <PLayoutSection oneThird="">
26
+ <PCard sectioned="">
27
+ <PTextContainer>
28
+ <PSkeletonDisplayText size="small" />
29
+ <PSkeletonBodyText />
30
+ </PTextContainer>
31
+ </PCard>
32
+ </PLayoutSection>
33
+ </PLayout>
34
+ <PLayout style="margin-top: 20px">
35
+ <PLayoutSection>
36
+ <PCard sectioned=""><PSkeletonBodyText /></PCard>
37
+ <PCard sectioned=""><PSkeletonBodyText /></PCard>
38
+ <PCard sectioned=""><PSkeletonBodyText /></PCard>
39
+ <PCard sectioned=""><PSkeletonBodyText /></PCard>
40
+ </PLayoutSection>
41
+ </PLayout>
42
+ </PSkeletonPage>
43
+ <PEmptyState
44
+ heading="No Plans"
45
+ image="https://cdn.shopify.com/s/files/1/0262/4071/2726/files/emptystate-files.png"
46
+ v-else-if="!this.planLoading && this.plans.length === 0"
47
+ />
2
48
  <PPage
3
49
  class="app-manager-plan-page custom-title"
4
50
  title="Choose plan"
5
51
  :subtitle = "subtitleContent"
52
+ v-else
6
53
  >
7
-
8
54
  <PStack slot="primaryAction">
9
55
  <PStackItem style="margin-top: 20px">
10
56
  <PButtonGroup class="btn-group" segmented>
@@ -86,8 +132,8 @@
86
132
  <PDataTableCol :colspan="selectedPlan === 'monthly' ? monthlyPlan.length + 1 : yearlyPlan.length + 1" class="app-manager-group-cell">{{ (groupKey) }}</PDataTableCol>
87
133
  </PDataTableRow>
88
134
  <PDataTableRow v-for="(feature, rIndex) in featureGroup" :key="`row-${rIndex + groupKey}`">
89
- <PDataTableCol>{{ (feature.name) }}</PDataTableCol>
90
- <PDataTableCol v-for="(plan, cIndex) in selectedPlan === 'monthly' ? monthlyPlan : yearlyPlan" :key="`cell-${cIndex}-row-${rIndex}`" :style="activePlanStyle(plan)">
135
+ <PDataTableCol :class="`feature__type__${feature.value_type} feature__class`">{{ (feature.name) }}</PDataTableCol>
136
+ <PDataTableCol :class="`feature__type__${feature.value_type}`" v-for="(plan, cIndex) in selectedPlan === 'monthly' ? monthlyPlan : yearlyPlan" :key="`cell-${cIndex}-row-${rIndex}`" :style="activePlanStyle(plan)">
91
137
  <template v-if="plan.features">
92
138
  <template v-if="feature.value_type === 'boolean'">
93
139
  <PIcon v-if="plan.features[feature.uuid]" color="success"
@@ -138,8 +184,8 @@
138
184
  <PButton plain @click="activePlan">{{ ('I will choose the plan later') }}</PButton>
139
185
  </PStackItem>
140
186
  </PStack>
187
+ <PlanBanners />
141
188
  </PLayoutSection>
142
- <PlanBanners />
143
189
  </PLayout>
144
190
  <!--====================================================================-->
145
191
  </PPage>
@@ -163,11 +209,17 @@
163
209
  import {PDataTableCol} from "../polaris-vue/src/components/PDataTable/components/PDataTableCol";
164
210
  import {PDataTableRow} from "../polaris-vue/src/components/PDataTable/components/PDataTableRow";
165
211
  import {PIcon} from "../polaris-vue/src/components/PIcon";
212
+ import {PCard} from "../polaris-vue/src/components/PCard"
213
+ import {PCardSection} from "../polaris-vue/src/components/PCard/components/PCardSection"
214
+ import {PSkeletonPage} from "../polaris-vue/src/components/PSkeletonPage"
215
+ import {PSkeletonDisplayText} from "../polaris-vue/src/components/PSkeletonDisplayText"
216
+ import {PSkeletonBodyText} from "../polaris-vue/src/components/PSkeletonBodyText"
166
217
  import {PTextStyle} from "../polaris-vue/src/components/PTextStyle";
218
+ import {PEmptyState} from "../polaris-vue/src/components/PEmptyState";
167
219
 
168
220
  export default {
169
221
  name: "AppManagerGroupPlan",
170
- components: { YearlyPlanPromotion, PlanBanners, PPage, PStack, PStackItem, PButton, PButtonGroup, PHeading, PLayout, PLayoutSection, PTextContainer, PDataTable, PDataTableCol, PDataTableRow, PIcon, PTextStyle },
222
+ components: { YearlyPlanPromotion, PlanBanners, PPage, PStack, PStackItem, PButton, PButtonGroup, PHeading, PLayout, PLayoutSection, PTextContainer, PDataTable, PDataTableCol, PDataTableRow, PIcon, PTextStyle, PCard, PCardSection, PSkeletonPage, PSkeletonBodyText, PSkeletonDisplayText, PEmptyState },
171
223
  props: ['shop_domain'],
172
224
  data() {
173
225
  return {
@@ -178,6 +230,7 @@
178
230
  shopify_plan: '',
179
231
  default_plan_id: null,
180
232
  onboard: true,
233
+ planLoading: false,
181
234
  subtitleContent: '',
182
235
  checkList: [
183
236
  "60 days free trial",
@@ -276,10 +329,10 @@
276
329
  } else return feature.value
277
330
  }
278
331
  else if(feature?.value_type === 'array') {
279
- return JSON.parse(feature.value).join(',')
332
+ return JSON.parse(feature.value).join(' ')
280
333
  }
281
334
  else if(feature?.value_type === 'string') {
282
- return feature.value
335
+ return feature.value.replace('"', '').replace('"', '')
283
336
  }
284
337
  },
285
338
  calculateDiscountedPrice(plan) {
@@ -290,6 +343,24 @@
290
343
  return plan.price - plan.discount
291
344
  }
292
345
  },
346
+ headerClasses(firstColumn) {
347
+ return {
348
+ 'Polaris-DataTable__Cell': true,
349
+ 'Polaris-DataTable__Cell--header': true,
350
+ 'Polaris-DataTable__Cell--verticalAlignMiddle': true,
351
+ 'Polaris-DataTable__Cell--firstColumn': Boolean(firstColumn),
352
+ };
353
+ },
354
+ groupBy(objectArray, property) {
355
+ return objectArray.reduce((acc, obj) => {
356
+ const key = obj[property];
357
+ if (!acc[key]) {
358
+ acc[key] = [];
359
+ }
360
+ acc[key].push(obj);
361
+ return acc;
362
+ }, {});
363
+ },
293
364
  async getPlanUrl(plan) {
294
365
  let shopName = this.shop.name;
295
366
  const response = await axios.get(`${this.app_manager_config.baseUrl}/api/app-manager/plan/process/${plan.id}?shop=${shopName}`).catch(error => {
@@ -319,50 +390,46 @@
319
390
  async selectPlan(value){
320
391
  this.selectedPlan= value;
321
392
  },
322
- headerClasses(firstColumn) {
323
- return {
324
- 'Polaris-DataTable__Cell': true,
325
- 'Polaris-DataTable__Cell--header': true,
326
- 'Polaris-DataTable__Cell--verticalAlignMiddle': true,
327
- 'Polaris-DataTable__Cell--firstColumn': Boolean(firstColumn),
328
- };
393
+ async fetchFeatures() {
394
+ let {data} = await axios.get(`${this.app_manager_config.baseUrl}/api/app-manager/plan-features`).catch(error => {
395
+ console.error(error)
396
+ });
397
+ if (data.features.length) {
398
+ this.features = data.features;
399
+ this.features = this.features?.filter((item) => item.hidden_feature !== true)
400
+ this.features = this.features?.sort((featureA, featureB) => parseInt(featureA.display_order) - parseInt(featureB.display_order))
401
+ this.features = this.features?.sort((featureA, featureB) => parseInt(featureA.group_order) - parseInt(featureB.group_order))
402
+ this.featuresByGroup = this.groupBy(this.features, 'group')
403
+ }
329
404
  },
330
- groupBy(objectArray, property) {
331
- return objectArray.reduce((acc, obj) => {
332
- const key = obj[property];
333
- if (!acc[key]) {
334
- acc[key] = [];
405
+ async fetchPlans() {
406
+ let {data} = await axios.get(`${this.app_manager_config.baseUrl}/api/app-manager/plans`, { params: { 'shop_domain': this.shop_domain } }).catch(error => {
407
+ console.error(error)
408
+ });
409
+ if (data.plans.length) {
410
+ this.plans = data.plans;
411
+ this.plans = this.plans?.sort((planA, planB) => parseFloat(planA.price) - parseFloat(planB.price));
412
+
413
+ if (this.plans[0].store_base_plan) {
414
+ this.subtitleContent = 'App plans are based on your existing shopify plan';
335
415
  }
336
- // Add object to list for given key's value
337
- acc[key].push(obj);
338
- return acc;
339
- }, {});
340
- }
416
+
417
+ this.plan = data.plan;
418
+ if (this.plan?.interval === 'ANNUAL') {
419
+ this.selectedPlan = 'annually'
420
+
421
+ }
422
+ this.shopify_plan = data.shopify_plan;
423
+ this.default_plan_id = data.default_plan_id;
424
+ this.onboard = !this.plan
425
+ }
426
+ },
341
427
  },
342
428
  async mounted() {
343
-
344
- const featuresData = await axios.get(`${this.app_manager_config.baseUrl}/api/app-manager/plan-features`).catch(error => {
345
- console.error(error)
346
- });
347
- this.features = featuresData.data.features;
348
- this.features = this.features.sort((featureA, featureB) => parseInt(featureA.display_order) - parseInt(featureB.display_order))
349
- this.features = this.features.sort((featureA, featureB) => parseInt(featureA.group_order) - parseInt(featureB.group_order))
350
- this.featuresByGroup = this.groupBy(this.features, 'group')
351
- const plansData = await axios.get(`${this.app_manager_config.baseUrl}/api/app-manager/plans`, { params: { 'shop_domain': this.shop_domain } }).catch(error => {
352
- console.error(error)
353
- });
354
- this.plans = plansData.data.plans;
355
- this.plans = this.plans.sort((planA, planB) => parseFloat(planA.price) - parseFloat(planB.price));
356
- if (this.plans && this.plans[0].store_base_plan) {
357
- this.subtitleContent = 'App plans are based on your existing shopify plan';
358
- }
359
- this.shopify_plan = plansData.data.shopify_plan;
360
- this.plan = plansData.data.plan;
361
- if (this.plan?.interval === 'ANNUAL') {
362
- this.selectedPlan = 'annually'
363
- }
364
- this.default_plan_id = plansData.data.default_plan_id;
365
- this.onboard = !this.plan
429
+ this.planLoading = true;
430
+ await this.fetchFeatures();
431
+ await this.fetchPlans();
432
+ this.planLoading = false;
366
433
  }
367
434
  }
368
435
  </script>
@@ -371,167 +438,167 @@
371
438
 
372
439
  @import url('https://fonts.googleapis.com/css2?family=Satisfy&display=swap');
373
440
 
374
- .app-manager-plan-page .plan-table td:last-child>*[data-v-7d902277],
375
- .app-manager-plan-page .plan-table td:last-child>*[data-v-5a078dbb] {
441
+ .app-manager .app-manager-plan-page .plan-table td:last-child>*[data-v-7d902277],
442
+ .app-manager .app-manager-plan-page .plan-table td:last-child>*[data-v-5a078dbb] {
376
443
  float:none;
377
444
  }
378
- .app-manager-plan-page .active {
445
+ .app-manager .app-manager-plan-page .active {
379
446
  background: #f0f8f5;
380
447
  }
381
- .app-manager-plan-page .plan-table td:last-child>*[data-v-0d1b0d63] {
448
+ .app-manager .app-manager-plan-page .plan-table td:last-child>*[data-v-0d1b0d63] {
382
449
  float:none;
383
450
  }
384
- .app-manager-plan-page .plan-table td {
451
+ .app-manager .app-manager-plan-page .plan-table td {
385
452
  border: 0.01px solid #ececee !important;
386
453
  border-collapse: collapse !important;
387
454
  }
388
- .app-manager-plan-page .plan-table .Polaris-DataTable__ScrollContainer{
455
+ .app-manager .app-manager-plan-page .plan-table .Polaris-DataTable__ScrollContainer{
389
456
  border-radius:12px;
390
457
  overflow: visible;
391
458
  }
392
- .app-manager-plan-page .plan-table table {
459
+ .app-manager .app-manager-plan-page .plan-table table {
393
460
  border-collapse: collapse !important;
394
461
  }
395
- .app-manager-plan-page .custom-plan table {
462
+ .app-manager .app-manager-plan-page .custom-plan table {
396
463
  border-collapse: collapse !important;
397
464
  }
398
- .app-manager-plan-page .custom-plan table thead .first-column {
465
+ .app-manager .app-manager-plan-page .custom-plan table thead .first-column {
399
466
  border-radius: 12px 0 0 0;
400
467
  border-top: 0px !important;
401
468
  border-left: 0px !important;
402
469
  }
403
- .app-manager-plan-page .custom-plan table thead .plan-heading.last-column {
470
+ .app-manager .app-manager-plan-page .custom-plan table thead .plan-heading.last-column {
404
471
  text-align: left !important;
405
472
  border-radius: 0 12px 0 0;
406
473
  border-top: 0px !important;
407
474
  }
408
- .app-manager-plan-page .custom-plan table thead .plan-heading {
475
+ .app-manager .app-manager-plan-page .custom-plan table thead .plan-heading {
409
476
  background-color: rgb(255, 255, 255);
410
477
  box-shadow: rgb(23 24 24 / 5%) 1px 0px 8px, rgb(0 0 0 / 15%) 0px 0px 2px;
411
478
  }
412
- .app-manager-plan-page .custom-plan table tbody tr:first-child {
479
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:first-child {
413
480
  background-color: #fff;
414
481
  box-shadow: 0 0 5px rgb(23 24 24 / 5%), 0 1px 2px rgb(0 0 0 / 15%);
415
482
  border-radius: 12px 0 0 0;
416
483
  overflow: hidden;
417
484
  }
418
- .app-manager-plan-page .custom-plan table tbody tr:not(:first-child :last-child ) {
485
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:not(:first-child :last-child ) {
419
486
  background-color: #fff;
420
487
  overflow: hidden;
421
488
  }
422
- .app-manager-plan-page .custom-plan table tbody tr:not(:first-child :last-child) {
489
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:not(:first-child :last-child) {
423
490
  background-color: #fff;
424
491
  box-shadow: 0 0 5px rgb(23 24 24 / 5%), 0 1px 2px rgb(0 0 0 / 15%);
425
492
  overflow: hidden;
426
493
  }
427
- .app-manager-plan-page .custom-plan table tbody tr:not( :nth-last-child(2) ) {
494
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:not( :nth-last-child(2) ) {
428
495
  background-color: #fff;
429
496
  overflow: hidden;
430
497
  }
431
- .app-manager-plan-page .custom-plan table tbody tr:not( :nth-last-child(2) ) {
498
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:not( :nth-last-child(2) ) {
432
499
  border-bottom: 0;
433
500
  }
434
- .app-manager-plan-page .custom-plan table tbody tr:last-child {
501
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:last-child {
435
502
  border-bottom: 0;
436
503
  background-color: transparent !important;
437
504
  box-shadow: none !important;
438
505
  }
439
- .app-manager-plan-page .custom-plan table tbody tr:not(:last-child) {
506
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:not(:last-child) {
440
507
  pointer-events: none;
441
508
  }
442
- .app-manager-plan-page .custom-plan table thead tr td{
509
+ .app-manager .app-manager-plan-page .custom-plan table thead tr td{
443
510
  pointer-events: none;
444
511
  }
445
- .app-manager-plan-page .custom-plan table tbody tr:first-child td:first-child {
512
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:first-child td:first-child {
446
513
  overflow: hidden;
447
514
  border-radius: 12px 0 0 0;
448
515
  }
449
- .app-manager-plan-page .custom-plan table tbody tr:nth-last-child(2) {
516
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:nth-last-child(2) {
450
517
  overflow: hidden;
451
518
  border-bottom-right-radius: 12px;
452
519
  border-bottom-left-radius: 12px;
453
520
  }
454
- .app-manager-plan-page .custom-plan table tbody tr:nth-last-child(2) td:first-child {
521
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:nth-last-child(2) td:first-child {
455
522
  overflow: hidden;
456
523
  border-bottom: 0px !important;
457
524
  border-radius: 0 0 0 12px;
458
525
  }
459
- .app-manager-plan-page .custom-plan table tbody tr:nth-last-child(2) td:last-child {
526
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:nth-last-child(2) td:last-child {
460
527
  overflow: hidden;
461
528
  border-radius: 0 0 12px;
462
529
  }
463
- .app-manager-plan-page .custom-plan table tbody tr td:first-child {
530
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr td:first-child {
464
531
  border-left: 0px !important;
465
532
  border-top: 0px !important;
466
533
  padding-left: 20px;
467
534
  }
468
- .app-manager-plan-page .custom-plan table tbody tr td:last-child {
535
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr td:last-child {
469
536
  border-right: 0px !important;
470
537
  border-bottom: 0px !important;
471
538
  text-align: center !important;
472
539
  }
473
- .app-manager-plan-page .custom-plan table thead tr td:last-child {
540
+ .app-manager .app-manager-plan-page .custom-plan table thead tr td:last-child {
474
541
  border-right: 0px !important;
475
542
  border-bottom: 0px !important;
476
543
  text-align: center !important;
477
544
  }
478
- .app-manager-plan-page .custom-plan table tbody td:not(:first-child) {
545
+ .app-manager .app-manager-plan-page .custom-plan table tbody td:not(:first-child) {
479
546
  text-align: center !important;
480
547
  }
481
- .app-manager-plan-page .custom-plan table tbody tr:last-child td:last-child {
548
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:last-child td:last-child {
482
549
  background: transparent;
483
550
  border-radius: 0 0 12px 0;
484
551
  }
485
- .app-manager-plan-page .custom-plan table tbody tr:last-child td {
552
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:last-child td {
486
553
  border: 0 !important;
487
554
  background: transparent;
488
555
  }
489
- .app-manager-plan-page .custom-plan table tbody tr:last-child td:hover {
556
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:last-child td:hover {
490
557
  border: 0 !important;
491
558
  background: transparent;
492
559
  }
493
- .app-manager-plan-page .custom-plan tbody tr:last-child td.Polaris-DataTable__Cell--verticalAlignTop{
560
+ .app-manager .app-manager-plan-page .custom-plan tbody tr:last-child td.Polaris-DataTable__Cell--verticalAlignTop{
494
561
  background: transparent !important;
495
562
  }
496
- .app-manager-plan-page .custom-plan table tbody tr:last-child {
563
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:last-child {
497
564
  background: transparent;
498
565
  opacity:1.0;
499
566
  }
500
- .app-manager-plan-page .custom-plan table tbody tr:last-child td:first-child{
567
+ .app-manager .app-manager-plan-page .custom-plan table tbody tr:last-child td:first-child{
501
568
  visibility: hidden;
502
569
  }
503
- .app-manager-plan-page .plan-heading {
570
+ .app-manager .app-manager-plan-page .plan-heading {
504
571
  padding-top: 30px;
505
572
  }
506
- .app-manager-plan-page .custom-plan .Polaris-Layout__Section{
573
+ .app-manager .app-manager-plan-page .custom-plan .Polaris-Layout__Section{
507
574
  max-width: calc(100% - 2rem) !important;
508
575
  }
509
- .app-manager-plan-page .later-link {
576
+ .app-manager .app-manager-plan-page .later-link {
510
577
  text-align: center;
511
578
  clear: both;
512
579
  padding-top: 15px;
513
580
  }
514
- .app-manager-plan-page .plan-badge ul {
581
+ .app-manager .app-manager-plan-page .plan-badge ul {
515
582
  text-align: center;
516
583
  padding-top: 2rem;
517
584
  border-top: 0.1rem solid #e1e3e5;
518
585
  }
519
- .app-manager-plan-page .plan-badge ul li {
586
+ .app-manager .app-manager-plan-page .plan-badge ul li {
520
587
  list-style: none;
521
588
  display: inline-block;
522
589
  padding-right: 25px;
523
590
  }
524
- .app-manager-plan-page .plan-badge ul li img {
591
+ .app-manager .app-manager-plan-page .plan-badge ul li img {
525
592
  max-width: 133px;
526
593
  }
527
- .app-manager-plan-page .btn-group .Polaris-ButtonGroup__Item{
594
+ .app-manager .app-manager-plan-page .btn-group .Polaris-ButtonGroup__Item{
528
595
  margin-left: 0px !important;
529
596
  z-index: unset !important;
530
597
  }
531
- .app-manager-plan-page.custom-title .Polaris-HorizontalDivider{
598
+ .app-manager .app-manager-plan-page.custom-title .Polaris-HorizontalDivider{
532
599
  background-color: #e2e3e4;
533
600
  }
534
- /*.app-manager-plan-page .annual_heading{
601
+ /*.app-manager .app-manager-plan-page .annual_heading{
535
602
  margin-top: 2px !important;
536
603
  color: #E2C138;
537
604
  border: 2px dotted #E2C138;
@@ -540,12 +607,31 @@
540
607
  font-weight: normal !important;
541
608
  font-family: 'Satisfy', cursive;
542
609
  }*/
543
- .app-manager-plan-page .Polaris-Page__Content hr{
610
+ .app-manager .app-manager-plan-page .Polaris-Page__Content hr{
544
611
  border: 1px solid #e2e3e4;
545
612
  }
546
613
 
547
- .app-manager-plan-page .app-manager-group-row {
614
+ .app-manager .app-manager-plan-page .app-manager-group-row {
548
615
  background: transparent !important;
549
616
  padding: 16px 16px 16px 20px !important;
550
617
  }
618
+
619
+ .app-manager .app-manager-plan-page .feature__type__array {
620
+ vertical-align: middle !important;
621
+ word-spacing: 999px;
622
+ white-space: pre-line !important;
623
+ }
624
+
625
+ .app-manager .app-manager-plan-page .Polaris-DataTable__Table {
626
+ table-layout: fixed !important;
627
+ }
628
+
629
+ .app-manager .app-manager-plan-page td {
630
+ vertical-align: middle !important;
631
+ }
632
+
633
+ .app-manager .app-manager-plan-page td.feature__class {
634
+ word-wrap:break-word !important;
635
+ white-space: normal !important;
636
+ }
551
637
  </style>