-
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 #208 from wmde/C23_WMDE_Desktop_DE_05
C23_WMDE_Desktop_DE_05
- Loading branch information
Showing
20 changed files
with
560 additions
and
139 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,65 @@ | ||
import { createVueApp } from '@src/createVueApp'; | ||
|
||
import './styles/styles.scss'; | ||
|
||
import BannerConductor from '@src/components/BannerConductor/BannerConductor.vue'; | ||
import Banner from './components/BannerCtrl.vue'; | ||
import getBannerDelay from '@src/utils/getBannerDelay'; | ||
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'; | ||
|
||
// 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 localeFactory = new LocaleFactoryDe(); | ||
const translator = new Translator( messages ); | ||
const mediaWiki = new WindowMediaWiki(); | ||
const page = new PageWPORG( mediaWiki, ( new SkinFactory( mediaWiki ) ).getSkin(), new WindowSizeIssueChecker( 800 ) ); | ||
const impressionCount = new LocalImpressionCount( page.getTracking().keyword ); | ||
const tracker = new LegacyTrackerWPORG( mediaWiki, page.getTracking().keyword, eventMappings ); | ||
|
||
const app = createVueApp( BannerConductor, { | ||
page, | ||
bannerConfig: { | ||
delay: getBannerDelay( 7500 ), | ||
transitionDuration: 1000 | ||
}, | ||
bannerProps: { | ||
useOfFundsContent: localeFactory.getUseOfFundsLoader().getContent() | ||
}, | ||
resizeHandler: new WindowResizeHandler(), | ||
banner: Banner, | ||
impressionCount | ||
} ); | ||
|
||
app.use( TranslationPlugin, translator ); | ||
app.use( DynamicTextPlugin, { | ||
campaignParameters: page.getCampaignParameters(), | ||
date: new Date(), | ||
formatters: localeFactory.getFormatters(), | ||
impressionCount, | ||
translator | ||
} ); | ||
|
||
const currencyFormatter = localeFactory.getCurrencyFormatter(); | ||
|
||
app.provide( 'currencyFormatter', currencyFormatter ); | ||
app.provide( 'formItems', createFormItems( translator, currencyFormatter.euroAmount.bind( currencyFormatter ) ) ); | ||
app.provide( 'formActions', createFormActions( page.getTracking(), impressionCount, { ast: '0' } ) ); | ||
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,65 @@ | ||
import { createVueApp } from '@src/createVueApp'; | ||
|
||
import './styles/styles.scss'; | ||
|
||
import BannerConductor from '@src/components/BannerConductor/BannerConductor.vue'; | ||
import Banner from './components/BannerVar.vue'; | ||
import getBannerDelay from '@src/utils/getBannerDelay'; | ||
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'; | ||
|
||
// 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 localeFactory = new LocaleFactoryDe(); | ||
const translator = new Translator( messages ); | ||
const mediaWiki = new WindowMediaWiki(); | ||
const page = new PageWPORG( mediaWiki, ( new SkinFactory( mediaWiki ) ).getSkin(), new WindowSizeIssueChecker( 800 ) ); | ||
const impressionCount = new LocalImpressionCount( page.getTracking().keyword ); | ||
const tracker = new LegacyTrackerWPORG( mediaWiki, page.getTracking().keyword, eventMappings ); | ||
|
||
const app = createVueApp( BannerConductor, { | ||
page, | ||
bannerConfig: { | ||
delay: getBannerDelay( 7500 ), | ||
transitionDuration: 1000 | ||
}, | ||
bannerProps: { | ||
useOfFundsContent: localeFactory.getUseOfFundsLoader().getContent() | ||
}, | ||
resizeHandler: new WindowResizeHandler(), | ||
banner: Banner, | ||
impressionCount | ||
} ); | ||
|
||
app.use( TranslationPlugin, translator ); | ||
app.use( DynamicTextPlugin, { | ||
campaignParameters: page.getCampaignParameters(), | ||
date: new Date(), | ||
formatters: localeFactory.getFormatters(), | ||
impressionCount, | ||
translator | ||
} ); | ||
|
||
const currencyFormatter = localeFactory.getCurrencyFormatter(); | ||
|
||
app.provide( 'currencyFormatter', currencyFormatter ); | ||
app.provide( 'formItems', createFormItems( translator, currencyFormatter.euroAmount.bind( currencyFormatter ) ) ); | ||
app.provide( 'formActions', createFormActions( page.getTracking(), impressionCount, { ast: '0' } ) ); | ||
app.provide( 'tracker', tracker ); | ||
|
||
app.mount( page.getBannerContainer() ); |
119 changes: 119 additions & 0 deletions
119
archive/desktop/C23_WMDE_Desktop_DE_04/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,119 @@ | ||
<template> | ||
<div class="wmde-banner-wrapper" :class="contentState"> | ||
<MainBanner | ||
@close="onCloseMain" | ||
@form-interaction="$emit( 'bannerContentChanged' )" | ||
v-if="contentState === ContentStates.Main" | ||
:bannerState="bannerState" | ||
> | ||
<template #banner-text> | ||
<BannerText/> | ||
</template> | ||
|
||
<template #banner-slides="{ play }: any"> | ||
<KeenSlider :with-navigation="true" :play="play" :interval="5000"> | ||
|
||
<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"> | ||
<UpgradeToYearlyForm :page-index="pageIndex" @submit="submit" :is-current="isCurrent" @previous="previous"/> | ||
</template> | ||
</MultiStepDonation> | ||
</template> | ||
|
||
<template #footer> | ||
<BannerFooter @showFundsModal="isFundsModalVisible = true" /> | ||
</template> | ||
</MainBanner> | ||
|
||
<SoftClose | ||
v-if="contentState === ContentStates.SoftClosing" | ||
@close="() => onClose( 'SoftClose', CloseChoices.Close )" | ||
@maybe-later="() => onClose( 'SoftClose', CloseChoices.MaybeLater )" | ||
@time-out-close="() => onClose( 'SoftClose', CloseChoices.TimeOut )" | ||
/> | ||
|
||
<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 SoftClose from '@src/components/SoftClose/SoftClose.vue'; | ||
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 BannerFooter from '@src/components/Footer/BannerFooter.vue'; | ||
import MainDonationForm from '@src/components/DonationForm/Forms/MainDonationForm.vue'; | ||
import UpgradeToYearlyForm from '@src/components/DonationForm/Forms/UpgradeToYearlyForm.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'; | ||
enum ContentStates { | ||
Main = 'wmde-banner-wrapper--main', | ||
SoftClosing = 'wmde-banner-wrapper--soft-closing' | ||
} | ||
enum FormStepNames { | ||
MainDonationFormStep = 'MainDonationForm', | ||
UpgradeToYearlyFormStep = 'UpgradeToYearlyForm' | ||
} | ||
interface Props { | ||
bannerState: BannerStates; | ||
useOfFundsContent: useOfFundsContentInterface; | ||
} | ||
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 { | ||
contentState.value = ContentStates.SoftClosing; | ||
} | ||
function onClose( feature: TrackingFeatureName, userChoice: CloseChoices ): void { | ||
emit( 'bannerClosed', new CloseEvent( feature, userChoice ) ); | ||
} | ||
</script> |
File renamed without changes.
44 changes: 44 additions & 0 deletions
44
archive/desktop/C23_WMDE_Desktop_DE_04/components/MainBanner.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,44 @@ | ||
<template> | ||
<div class="wmde-banner-main"> | ||
<ButtonClose @close="$emit( 'close' )"/> | ||
<div class="wmde-banner-content"> | ||
<div class="wmde-banner-column-left"> | ||
<slot name="banner-text" v-if="onLargeScreen"/> | ||
<slot name="banner-slides" v-else :play="slideshowShouldPlay"/> | ||
</div> | ||
<div class="wmde-banner-column-right"> | ||
<slot name="donation-form" :form-interaction="onFormInteraction"/> | ||
</div> | ||
</div> | ||
<slot name="footer"/> | ||
</div> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import ButtonClose from '@src/components/ButtonClose/ButtonClose.vue'; | ||
import { useDisplaySwitch } from '@src/components/composables/useDisplaySwitch'; | ||
import { computed, nextTick, ref } from 'vue'; | ||
import { BannerStates } from '@src/components/BannerConductor/StateMachine/BannerStates'; | ||
interface Props { | ||
bannerState: BannerStates; | ||
} | ||
const props = defineProps<Props>(); | ||
const emit = defineEmits( [ 'close', 'formInteraction' ] ); | ||
const slideShowStopped = ref<boolean>( false ); | ||
const slideshowShouldPlay = computed( () => props.bannerState === BannerStates.Visible && !slideShowStopped.value ); | ||
const onLargeScreen = useDisplaySwitch( 1300 ); | ||
const onFormInteraction = (): void => { | ||
slideShowStopped.value = true; | ||
nextTick( () => { | ||
emit( 'formInteraction' ); | ||
} ); | ||
}; | ||
</script> |
52 changes: 52 additions & 0 deletions
52
archive/desktop/C23_WMDE_Desktop_DE_04/content/BannerSlides.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,52 @@ | ||
<template> | ||
<KeenSliderSlide :is-current="currentSlide === 0"> | ||
<p class="headline"> | ||
<InfoIcon fill="#990a00"/> <strong> An alle, die Wikipedia in Deutschland nutzen </strong> | ||
</p> | ||
<p> | ||
Vielleicht kommen wir gerade ungelegen, aber dennoch: Klicken Sie jetzt bitte nicht weg! | ||
Am heutigen {{ currentDayName }}, den {{ currentDate }}, bitten wir Sie bescheiden, die Unabhängigkeit von Wikipedia zu unterstützen. | ||
</p> | ||
</KeenSliderSlide> | ||
<KeenSliderSlide :is-current="currentSlide === 1"> | ||
<p> | ||
<span class="wmde-banner-text-animated-highlight">Millionen Menschen nutzen Wikipedia, aber 99 % spenden | ||
nicht – sie übergehen diesen Aufruf.</span> | ||
Die meisten Menschen spenden, weil sie Wikipedia nützlich finden. | ||
</p> | ||
</KeenSliderSlide> | ||
<KeenSliderSlide :is-current="currentSlide === 2"> | ||
<p> | ||
Die durchschnittliche Spende beträgt 22,25 €, doch bereits 5 € helfen uns weiter. Hat Wikipedia Ihnen in | ||
diesem Jahr Wissen im Wert einer Tasse Kaffee geschenkt? | ||
</p> | ||
</KeenSliderSlide> | ||
<KeenSliderSlide :is-current="currentSlide === 3"> | ||
<p> | ||
Dann entscheiden Sie sich, eine der seltenen Ausnahmen zu sein, und geben Sie etwas zurück. Vielen Dank! | ||
</p> | ||
</KeenSliderSlide> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import { DynamicContent } from '@src/utils/DynamicContent/DynamicContent'; | ||
import { computed, inject } from 'vue'; | ||
import InfoIcon from '@src/components/Icons/InfoIcon.vue'; | ||
import KeenSliderSlide from '@src/components/Slider/KeenSliderSlide.vue'; | ||
interface Props { | ||
currentSlide: number | ||
} | ||
defineProps<Props>(); | ||
const { currentDayName }: DynamicContent = inject( 'dynamicCampaignText' ); | ||
const currentDate = computed( () => { | ||
return new Intl.DateTimeFormat( 'de-DE', { | ||
day: '2-digit', | ||
month: 'long' | ||
} ).format( new Date() ); | ||
} ); | ||
</script> |
File renamed without changes.
35 changes: 35 additions & 0 deletions
35
archive/desktop/C23_WMDE_Desktop_DE_04/content/BannerText.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,35 @@ | ||
<template> | ||
<div class="wmde-banner-message"> | ||
<div> | ||
<p> | ||
<InfoIcon fill="#990a00"/> | ||
<strong> An alle, die Wikipedia in Deutschland nutzen </strong> | ||
</p> | ||
<p> | ||
Vielleicht kommen wir gerade ungelegen, aber dennoch: Klicken Sie jetzt bitte nicht weg! Am | ||
heutigen {{ currentDayName }}, den {{ currentDate }}, bitten wir Sie bescheiden, die Unabhängigkeit von Wikipedia zu | ||
unterstützen. <span class="wmde-banner-text-animated-highlight">Millionen Menschen nutzen Wikipedia, | ||
aber 99 % spenden nicht – sie übergehen diesen Aufruf.</span> Die meisten Menschen spenden, weil sie | ||
Wikipedia nützlich finden. Die durchschnittliche Spende beträgt 22,25 €, doch bereits 5 € helfen uns | ||
weiter. Hat Wikipedia Ihnen in diesem Jahr Wissen im Wert einer Tasse Kaffee geschenkt? Dann entscheiden | ||
Sie sich, eine der seltenen Ausnahmen zu sein, und geben Sie etwas zurück. Vielen Dank! | ||
</p> | ||
</div> | ||
</div> | ||
</template> | ||
|
||
<script setup lang="ts"> | ||
import { computed, inject } from 'vue'; | ||
import { DynamicContent } from '@src/utils/DynamicContent/DynamicContent'; | ||
import InfoIcon from '@src/components/Icons/InfoIcon.vue'; | ||
const { currentDayName }: DynamicContent = inject( 'dynamicCampaignText' ); | ||
const currentDate = computed( () => { | ||
return new Intl.DateTimeFormat( 'de-DE', { | ||
day: '2-digit', | ||
month: 'long' | ||
} ).format( new Date() ); | ||
} ); | ||
</script> |
File renamed without changes.
Oops, something went wrong.