-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #506 from wmde/C24_WMDE_Desktop_DE_03
C24_WMDE_Desktop_DE_03
- Loading branch information
Showing
28 changed files
with
1,179 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import { createVueApp } from '@src/createVueApp'; | ||
|
||
import './styles/styles.scss'; | ||
|
||
import BannerConductor from '@src/components/BannerConductor/FallbackBannerConductor.vue'; | ||
import Banner from './components/BannerCtrl.vue'; | ||
import FallbackBanner from './components/FallbackBanner.vue'; | ||
import { UrlRuntimeEnvironment } from '@src/utils/RuntimeEnvironment'; | ||
import { WindowResizeHandler } from '@src/utils/ResizeHandler'; | ||
import PageWPORG from '@src/page/PageWPORG'; | ||
import { WindowMediaWiki } from '@src/page/MediaWiki/WindowMediaWiki'; | ||
import { SkinFactory } from '@src/page/skin/SkinFactory'; | ||
import { WindowSizeIssueChecker } from '@src/utils/SizeIssueChecker/WindowSizeIssueChecker'; | ||
import TranslationPlugin from '@src/TranslationPlugin'; | ||
import { Translator } from '@src/Translator'; | ||
import DynamicTextPlugin from '@src/DynamicTextPlugin'; | ||
import { LocalImpressionCount } from '@src/utils/LocalImpressionCount'; | ||
import { LegacyTrackerWPORG } from '@src/tracking/LegacyTrackerWPORG'; | ||
import eventMappings from './event_map'; | ||
import { createFallbackDonationURL } from '@src/createFallbackDonationURL'; | ||
|
||
// Locale-specific imports | ||
import messages from './messages'; | ||
import { LocaleFactoryDe } from '@src/utils/LocaleFactory/LocaleFactoryDe'; | ||
|
||
// Channel specific form setup | ||
import { createFormItems } from './form_items'; | ||
import { createFormActions } from '@src/createFormActions'; | ||
|
||
const date = new Date(); | ||
const localeFactory = new LocaleFactoryDe(); | ||
const translator = new Translator( messages ); | ||
const mediaWiki = new WindowMediaWiki(); | ||
const page = new PageWPORG( mediaWiki, ( new SkinFactory( mediaWiki ) ).getSkin(), new WindowSizeIssueChecker( 400 ) ); | ||
const runtimeEnvironment = new UrlRuntimeEnvironment( window.location ); | ||
const impressionCount = new LocalImpressionCount( page.getTracking().keyword, runtimeEnvironment ); | ||
const tracker = new LegacyTrackerWPORG( mediaWiki, page.getTracking().keyword, eventMappings, runtimeEnvironment ); | ||
|
||
const app = createVueApp( BannerConductor, { | ||
page, | ||
bannerConfig: { | ||
delay: runtimeEnvironment.getBannerDelay( 7500 ), | ||
transitionDuration: 1000 | ||
}, | ||
bannerProps: { | ||
useOfFundsContent: localeFactory.getUseOfFundsLoader().getContent(), | ||
remainingImpressions: impressionCount.getRemainingImpressions( page.getMaxBannerImpressions( 'desktop' ) ), | ||
donationLink: createFallbackDonationURL( page.getTracking(), impressionCount ) | ||
}, | ||
resizeHandler: new WindowResizeHandler(), | ||
banner: Banner, | ||
fallbackBanner: FallbackBanner, | ||
minWidthForMainBanner: 800, | ||
impressionCount | ||
} ); | ||
|
||
app.use( TranslationPlugin, translator ); | ||
app.use( DynamicTextPlugin, { | ||
campaignParameters: page.getCampaignParameters(), | ||
date, | ||
formatters: localeFactory.getFormatters(), | ||
impressionCount, | ||
translator, | ||
urgencyMessageDaysLeft: 45 | ||
} ); | ||
|
||
const currencyFormatter = localeFactory.getCurrencyFormatter(); | ||
|
||
app.provide( 'currencyFormatter', currencyFormatter ); | ||
app.provide( 'formItems', createFormItems( translator, currencyFormatter.euroAmount.bind( currencyFormatter ) ) ); | ||
app.provide( 'formActions', createFormActions( page.getTracking(), impressionCount ) ); | ||
app.provide( 'tracker', tracker ); | ||
|
||
app.mount( page.getBannerContainer() ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import { createVueApp } from '@src/createVueApp'; | ||
|
||
import './styles/stylesVar.scss'; | ||
|
||
import BannerConductor from '@src/components/BannerConductor/FallbackBannerConductor.vue'; | ||
import Banner from './components/BannerCtrl.vue'; | ||
import FallbackBanner from './components/FallbackBanner.vue'; | ||
import { UrlRuntimeEnvironment } from '@src/utils/RuntimeEnvironment'; | ||
import { WindowResizeHandler } from '@src/utils/ResizeHandler'; | ||
import PageWPORG from '@src/page/PageWPORG'; | ||
import { WindowMediaWiki } from '@src/page/MediaWiki/WindowMediaWiki'; | ||
import { SkinFactory } from '@src/page/skin/SkinFactory'; | ||
import { WindowSizeIssueChecker } from '@src/utils/SizeIssueChecker/WindowSizeIssueChecker'; | ||
import TranslationPlugin from '@src/TranslationPlugin'; | ||
import { Translator } from '@src/Translator'; | ||
import DynamicTextPlugin from '@src/DynamicTextPlugin'; | ||
import { LocalImpressionCount } from '@src/utils/LocalImpressionCount'; | ||
import { LegacyTrackerWPORG } from '@src/tracking/LegacyTrackerWPORG'; | ||
import eventMappings from './event_map'; | ||
import { createFallbackDonationURL } from '@src/createFallbackDonationURL'; | ||
|
||
// Locale-specific imports | ||
import messages from './messages'; | ||
import { LocaleFactoryDe } from '@src/utils/LocaleFactory/LocaleFactoryDe'; | ||
|
||
// Channel specific form setup | ||
import { createFormItems } from './form_items'; | ||
import { createFormActions } from '@src/createFormActions'; | ||
|
||
const date = new Date(); | ||
const localeFactory = new LocaleFactoryDe(); | ||
const translator = new Translator( messages ); | ||
const mediaWiki = new WindowMediaWiki(); | ||
const page = new PageWPORG( mediaWiki, ( new SkinFactory( mediaWiki ) ).getSkin(), new WindowSizeIssueChecker( 400 ) ); | ||
const runtimeEnvironment = new UrlRuntimeEnvironment( window.location ); | ||
const impressionCount = new LocalImpressionCount( page.getTracking().keyword, runtimeEnvironment ); | ||
const tracker = new LegacyTrackerWPORG( mediaWiki, page.getTracking().keyword, eventMappings, runtimeEnvironment ); | ||
|
||
const app = createVueApp( BannerConductor, { | ||
page, | ||
bannerConfig: { | ||
delay: runtimeEnvironment.getBannerDelay( 7500 ), | ||
transitionDuration: 1000 | ||
}, | ||
bannerProps: { | ||
useOfFundsContent: localeFactory.getUseOfFundsLoader().getContent(), | ||
remainingImpressions: impressionCount.getRemainingImpressions( page.getMaxBannerImpressions( 'desktop' ) ), | ||
donationLink: createFallbackDonationURL( page.getTracking(), impressionCount ) | ||
}, | ||
resizeHandler: new WindowResizeHandler(), | ||
banner: Banner, | ||
fallbackBanner: FallbackBanner, | ||
minWidthForMainBanner: 800, | ||
impressionCount | ||
} ); | ||
|
||
app.use( TranslationPlugin, translator ); | ||
app.use( DynamicTextPlugin, { | ||
campaignParameters: page.getCampaignParameters(), | ||
date, | ||
formatters: localeFactory.getFormatters(), | ||
impressionCount, | ||
translator, | ||
urgencyMessageDaysLeft: 45 | ||
} ); | ||
|
||
const currencyFormatter = localeFactory.getCurrencyFormatter(); | ||
|
||
app.provide( 'currencyFormatter', currencyFormatter ); | ||
app.provide( 'formItems', createFormItems( translator, currencyFormatter.euroAmount.bind( currencyFormatter ) ) ); | ||
app.provide( 'formActions', createFormActions( page.getTracking(), impressionCount ) ); | ||
app.provide( 'tracker', tracker ); | ||
|
||
app.mount( page.getBannerContainer() ); |
118 changes: 118 additions & 0 deletions
118
banners/desktop/C24_WMDE_Desktop_DE_03/components/BannerCtrl.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
<template> | ||
<div class="wmde-banner-wrapper" :class="contentState" :style="colors"> | ||
<MainBanner | ||
@form-interaction="$emit( 'bannerContentChanged' )" | ||
v-if="contentState === ContentStates.Main" | ||
:bannerState="bannerState" | ||
> | ||
<template #close-button> | ||
<ButtonClose @close="onCloseMain"/> | ||
</template> | ||
|
||
<template #banner-text> | ||
<BannerText/> | ||
</template> | ||
|
||
<template #banner-slides="{ play }: any"> | ||
<KeenSlider :with-navigation="true" :play="play" :interval="10000" :delay="2000" :navigation-color="'#ffffff'"> | ||
|
||
<template #slides="{ currentSlide }: any"> | ||
<BannerSlides :currentSlide="currentSlide"/> | ||
</template> | ||
|
||
</KeenSlider> | ||
</template> | ||
|
||
<template #donation-form="{ formInteraction }: any"> | ||
<MultiStepDonation :step-controllers="stepControllers" @form-interaction="formInteraction"> | ||
|
||
<template #[FormStepNames.MainDonationFormStep]="{ pageIndex, submit, isCurrent, previous }: any"> | ||
<MainDonationForm :page-index="pageIndex" @submit="submit" :is-current="isCurrent" @previous="previous"/> | ||
</template> | ||
|
||
<template #[FormStepNames.UpgradeToYearlyFormStep]="{ pageIndex, submit, isCurrent, previous }: any"> | ||
<UpgradeToYearlyButtonForm :page-index="pageIndex" :show-manual-upgrade-option="false" @submit="submit" :is-current="isCurrent" @previous="previous"/> | ||
</template> | ||
|
||
</MultiStepDonation> | ||
</template> | ||
|
||
<template #footer> | ||
<BannerFooter @showFundsModal="isFundsModalVisible = true"/> | ||
</template> | ||
|
||
</MainBanner> | ||
|
||
<FundsModal | ||
:content="useOfFundsContent" | ||
:is-funds-modal-visible="isFundsModalVisible" | ||
@hideFundsModal="isFundsModalVisible = false" | ||
/> | ||
</div> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import { BannerStates } from '@src/components/BannerConductor/StateMachine/BannerStates'; | ||
import { ref, watch } from 'vue'; | ||
import { UseOfFundsContent as useOfFundsContentInterface } from '@src/domain/UseOfFunds/UseOfFundsContent'; | ||
import MainBanner from './MainBanner.vue'; | ||
import FundsModal from '@src/components/UseOfFunds/FundsModal.vue'; | ||
import BannerText from '../content/BannerText.vue'; | ||
import BannerSlides from '../content/BannerSlides.vue'; | ||
import MultiStepDonation from '@src/components/DonationForm/MultiStepDonation.vue'; | ||
import MainDonationForm from '@src/components/DonationForm/Forms/MainDonationForm.vue'; | ||
import UpgradeToYearlyButtonForm from '@src/components/DonationForm/Forms/UpgradeToYearlyButtonForm.vue'; | ||
import KeenSlider from '@src/components/Slider/KeenSlider.vue'; | ||
import { useFormModel } from '@src/components/composables/useFormModel'; | ||
import { | ||
createSubmittableMainDonationForm | ||
} from '@src/components/DonationForm/StepControllers/SubmittableMainDonationForm'; | ||
import { | ||
createSubmittableUpgradeToYearly | ||
} from '@src/components/DonationForm/StepControllers/SubmittableUpgradeToYearly'; | ||
import { CloseChoices } from '@src/domain/CloseChoices'; | ||
import { CloseEvent } from '@src/tracking/events/CloseEvent'; | ||
import { TrackingFeatureName } from '@src/tracking/TrackingEvent'; | ||
import ButtonClose from '@src/components/ButtonClose/ButtonClose.vue'; | ||
import colors from '../styles/colors'; | ||
import BannerFooter from '@src/components/Footer/BannerFooter.vue'; | ||
enum ContentStates { | ||
Main = 'wmde-banner-wrapper--main', | ||
} | ||
enum FormStepNames { | ||
MainDonationFormStep = 'MainDonationForm', | ||
UpgradeToYearlyFormStep = 'UpgradeToYearlyForm' | ||
} | ||
interface Props { | ||
bannerState: BannerStates; | ||
useOfFundsContent: useOfFundsContentInterface; | ||
remainingImpressions: number; | ||
} | ||
defineProps<Props>(); | ||
const emit = defineEmits( [ 'bannerClosed', 'bannerContentChanged' ] ); | ||
const isFundsModalVisible = ref<boolean>( false ); | ||
const contentState = ref<ContentStates>( ContentStates.Main ); | ||
const formModel = useFormModel(); | ||
const stepControllers = [ | ||
createSubmittableMainDonationForm( formModel, FormStepNames.UpgradeToYearlyFormStep ), | ||
createSubmittableUpgradeToYearly( formModel, FormStepNames.MainDonationFormStep, FormStepNames.MainDonationFormStep ) | ||
]; | ||
watch( contentState, async () => { | ||
emit( 'bannerContentChanged' ); | ||
} ); | ||
function onCloseMain(): void { | ||
onClose( 'MainBanner', CloseChoices.Close ); | ||
} | ||
function onClose( feature: TrackingFeatureName, userChoice: CloseChoices ): void { | ||
emit( 'bannerClosed', new CloseEvent( feature, userChoice ) ); | ||
} | ||
</script> |
102 changes: 102 additions & 0 deletions
102
banners/desktop/C24_WMDE_Desktop_DE_03/components/FallbackBanner.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
<template> | ||
<div class="wmde-banner-fallback" :style="colors"> | ||
<ButtonClose @close="onClose"/> | ||
|
||
<div class="wmde-banner-fallback-small" v-if="!onLargeScreen"> | ||
<KeenSlider | ||
:with-pagination="false" | ||
:play="slideshowShouldPlay" | ||
:interval="10000" | ||
:delay="2000" | ||
@slideChanged="onSlideChange" | ||
> | ||
<template #slides="{ currentSlide }: any"> | ||
<FallbackSlides :current-slide="currentSlide"/> | ||
</template> | ||
|
||
<template #left-icon> | ||
<ChevronLeftIcon :fill="'#990a00'"/> | ||
</template> | ||
|
||
<template #right-icon> | ||
<ChevronRightIcon :fill="'#990a00'"/> | ||
</template> | ||
</KeenSlider> | ||
|
||
<FallbackButton @buttonClicked="onSubmit"/> | ||
|
||
<SmallFooter :slide-index="slideIndex" :slide-count="slideCount" @useOfFundsButtonClicked="isFundsModalVisible = true"/> | ||
</div> | ||
|
||
<div class="wmde-banner-fallback-large" v-if="onLargeScreen"> | ||
<div class="wmde-banner-fallback-message"> | ||
<FallbackText/> | ||
</div> | ||
|
||
<LargeFooter @useOfFundsButtonClicked="isFundsModalVisible = true" @submitButtonClicked="onSubmit"/> | ||
</div> | ||
|
||
<FundsModal | ||
:content="useOfFundsContent" | ||
:is-funds-modal-visible="isFundsModalVisible" | ||
@hideFundsModal="isFundsModalVisible = false" | ||
/> | ||
|
||
</div> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import ButtonClose from '@src/components/ButtonClose/ButtonClose.vue'; | ||
import { CloseChoices } from '@src/domain/CloseChoices'; | ||
import { CloseEvent } from '@src/tracking/events/CloseEvent'; | ||
import { BannerStates } from '@src/components/BannerConductor/StateMachine/BannerStates'; | ||
import { UseOfFundsContent as useOfFundsContentInterface } from '@src/domain/UseOfFunds/UseOfFundsContent'; | ||
import { computed, inject, ref } from 'vue'; | ||
import { useDisplaySwitch } from '@src/components/composables/useDisplaySwitch'; | ||
import KeenSlider from '@src/components/Slider/KeenSlider.vue'; | ||
import FallbackSlides from '../content/FallbackSlides.vue'; | ||
import ChevronLeftIcon from '@src/components/Icons/ChevronLeftIcon.vue'; | ||
import ChevronRightIcon from '@src/components/Icons/ChevronRightIcon.vue'; | ||
import FundsModal from '@src/components/UseOfFunds/FundsModal.vue'; | ||
import FallbackText from '../content/FallbackText.vue'; | ||
import FallbackButton from '@src/components/FallbackBanner/FallbackButton.vue'; | ||
import SmallFooter from '@src/components/FallbackBanner/SmallFooter.vue'; | ||
import LargeFooter from '@src/components/FallbackBanner/LargeFooter.vue'; | ||
import { Tracker } from '@src/tracking/Tracker'; | ||
import { FallbackBannerSubmitEvent } from '@src/tracking/events/FallbackBannerSubmitEvent'; | ||
import colors from '../styles/fallback_colors'; | ||
interface Props { | ||
bannerState: BannerStates; | ||
useOfFundsContent: useOfFundsContentInterface; | ||
donationLink: string; | ||
} | ||
const props = defineProps<Props>(); | ||
const emit = defineEmits( [ 'bannerClosed' ] ); | ||
const tracker = inject<Tracker>( 'tracker' ); | ||
const slideIndex = ref<number>( 0 ); | ||
const slideCount = ref<number>( 0 ); | ||
const slideShowStopped = ref<boolean>( false ); | ||
const slideshowShouldPlay = computed( () => props.bannerState === BannerStates.Visible && !slideShowStopped.value ); | ||
const isFundsModalVisible = ref<boolean>( false ); | ||
const onLargeScreen = useDisplaySwitch( 799 ); | ||
function onClose(): void { | ||
emit( 'bannerClosed', new CloseEvent( 'FallbackBanner', CloseChoices.Close ) ); | ||
} | ||
function onSlideChange( newIndex: number, newSlideCount: number ): void { | ||
slideIndex.value = newIndex; | ||
slideCount.value = newSlideCount; | ||
} | ||
function onSubmit(): void { | ||
tracker.trackEvent( new FallbackBannerSubmitEvent() ); | ||
window.location.href = props.donationLink; | ||
} | ||
</script> |
Oops, something went wrong.