@digital-blueprint/formalize-app
Version:
[GitHub Repository](https://github.com/digital-blueprint/formalize-app) | [npmjs package](https://www.npmjs.com/package/@digital-blueprint/formalize-app) | [Unpkg CDN](https://unpkg.com/browse/@digital-blueprint/formalize-app/) | [Formalize Bundle](https:
531 lines • 52.9 kB
JavaScript
/*!
* License: LGPL-2.1-or-later
* Dependencies:
*
* @webcomponents/scoped-custom-element-registry: BSD-3-Clause
* @dbp-toolkit/app-shell: LGPL-2.1-or-later
* lit-html: BSD-3-Clause
* @dbp-toolkit/language-select: LGPL-2.1-or-later
* @dbp-toolkit/auth: LGPL-2.1-or-later
* @dbp-toolkit/theme-switcher: LGPL-2.1-or-later
* universal-router: MIT
* @dbp-toolkit/matomo: LGPL-2.1-or-later
* cssfilter: MIT
* xss: MIT
* @dbp-toolkit/form-elements: LGPL-2.1-or-later
* html2pdf.js: MIT
*/
import{d as e,f as t,h as n,m as r,o as i,p as a,s as o}from"./shared/ref.DqB7ABXf.js";import{J as s,X as c,b as l,g as u,s as d,v as f}from"./shared/directive-helpers.C6Xz79AM.js";import{t as p}from"./shared/class-map.B2bFA_il.js";import{t as m}from"./shared/translated.Blxt0tjK.js";import{t as h}from"./shared/modal.DfjeZb2d.js";import{f as g}from"./shared/select2.min.DRitHUO_.js";import{n as _,r as v,t as y}from"./shared/pdf-viewer.CsTRBfhh.js";import{t as b}from"./shared/file-source.DRQEpAaB.js";import{a as x,i as S,s as C,t as w}from"./shared/string.qUj92gVq.js";import{n as T,t as E}from"./shared/boolean.pr9Nw5yS.js";import{t as D}from"./shared/enum.BxhuTEi5.js";import{t as O}from"./shared/string.f-jSIclt.js";import{n as k,t as A}from"./shared/enum.B5iOCmyu.js";const j=`Sonstiges`,M=`nothing-selected`,N={Audio:`render-form.forms.media-transparency-form.sub-categories-audio`,App:`render-form.forms.media-transparency-form.sub-categories-app`,"Soziales Netzwerk":`render-form.forms.media-transparency-form.sub-categories-social-media`,Website:`render-form.forms.media-transparency-form.sub-categories-website`,Text:`render-form.forms.media-transparency-form.sub-categories-text`,Video:`render-form.forms.media-transparency-form.sub-categories-video`,Sonstiges:`render-form.forms.media-transparency-form.sub-categories-else`,Plakat:`render-form.forms.media-transparency-form.sub-categories-billboard`,Verkehrsmittel:`render-form.forms.media-transparency-form.sub-categories-transportation`,"Digitaler Screen":`render-form.forms.media-transparency-form.sub-categories-digital-screen`,Bande:`render-form.forms.media-transparency-form.sub-categories-banner`,Kino:`render-form.forms.media-transparency-form.sub-categories-cinema`},P={Online:`render-form.forms.media-transparency-form.categories-online`,Print:`render-form.forms.media-transparency-form.categories-print`,"Out of Home":`render-form.forms.media-transparency-form.categories-out-of-home`,Hörfunk:`render-form.forms.media-transparency-form.categories-radio`,Fernsehen:`render-form.forms.media-transparency-form.categories-television`},F={Online:{Audio:{"Amazon Music":`Amazon.com, Inc.`,"Antenna Pod":`Antenna Pod`,"Apple Podcasts":`Apple Inc.`,Deezer:`Deezer S.A.`,fyyd:`Christian Bednarek`,"Listen Notes":`Listen Notes, Inc.`,"Pocket Casts":`Automattic, Inc.`,Spotify:`Spotify AB`},App:{"Google Play":`Google LLC`,iTunes:`Apple Inc.`,"Podcast Addict":`Guillemane Xavier - Podcast & Radio Addict`},"Soziales Netzwerk":{Facebook:`Meta Platforms Ireland Limited`,Instagram:`Meta Platforms Ireland Limited`,LinkedIn:`LinkedIn Ireland Unlimited Company`,Snapchat:`Snap Inc.`,"X (Twitter)":`X Corp.`,YouTube:`Google Ireland Limited`},Website:{"c.socceruhd.online":`socceruhd.online`,"e-flux.com":`e-flux Inc.`,"google.com":`Google Ireland Limited`,"grazer.at":`Media 21 GmbH`,"industriemagazin.at":`WEKA Industrie Medien GmbH`,"kleinezeitung.at":`Kleine Zeitung GmbH & Co KG`,"science.apa.at":`APA - Austria Presse Agentur eG`,"spiritofstyria.at":`GRAZETTA GmbH`},Text:{"Industriemagazin Newsletter":`WEKA Industrie Medien GmbH`,"Newsletter Automobil + Motoren":`Springer Fachmedien Wiesbaden GmbH`},Video:{},Sonstiges:{}},Print:{_items:{"ADDITIVE FERTIGUNG":`x-Technik IT & Medien GesmbH`,Bildungsguide:`Tamedia Publikationen Deutschschweiz AG`,"COOL! Mädchen":`Gonzomedia GesmbH`,DerGrazer:`Media 21 GmbH`,"Die Presse":`"Die Presse" Verlags-Gesellschaft m.b.H. & Co KG`,Forschung:`STANDARD Verlagsgesellschaft m.b.H.`,"Jahresbericht Bundesrealgymnasium 8010 Graz, Petersgasse 110":`Bundesrealgymnasium 8010 Graz, Petersgasse 110`,"Jahresbericht Höhere technische Bundeslehranstalt 5280 Braunau am Inn, Osternbergerstraße 55":`Höhere technische Bundeslehranstalt 5280 Braunau am Inn, Osternbergerstraße 55`,"KLEINE ZEITUNG":`Kleine Zeitung GmbH & Co KG`,"Maturazeitung Bundes-Oberstufenrealgymnasium 8010 Graz, Monsbergergasse 16":`Bundes-Oberstufenrealgymnasium 8010 Graz, Monsbergergasse 16`,"Maturazeitung Bundesgymnasium, Bundesrealgymnasium und Bundes-Oberstufenrealgymnasium (HIB) 8041 Graz-Liebenau, Kadettengasse 19-23":`Bundesgymnasium, Bundesrealgymnasium und Bundes-Oberstufenrealgymnasium (HIB) 8041 Graz-Liebenau, Kadettengasse 19-23`,"Maturazeitung Höhere technische Bundeslehr- und Versuchsanstalt 7423 Pinkafeld, Meierhofplatz 1":`Höhere technische Bundeslehr- und Versuchsanstalt 7423 Pinkafeld, Meierhofplatz 1`,"Maturazeitung Höhere technische Bundeslehranstalt 8051 Graz-Gösting, Ibererstraße 15-21":`Höhere technische Bundeslehranstalt 8051 Graz-Gösting, Ibererstraße 15-21`,"Maturazeitung Höhere technische Bundeslehranstalt 8430 Leibnitz, Kaindorf, Grazer Straße 202":`Höhere technische Bundeslehranstalt 8430 Leibnitz, Kaindorf, Grazer Straße 202`,MEGAPHON:`Caritas der Diözese Graz-Seckau`,MTZ:`Springer Fachmedien Wiesbaden GmbH`,"Rebell*innen Kalender":`AMAZONE, Verein zur Herstellung von Geschlechtergerechtigkeit`,sheconomy:`SHE Wirtschaftsmedien Beteiligungs GmbH`,"Spirit OF STYRIA":`SPIRIT Medienhaus GmbH`,"Verkehrsmalbuch für Kinder":`IPA Verlagsgesellschaft m.b.H.`,"Weekend Magazin Steiermark":`Weekend Magazin Steiermark GmbH`,ZukunftsBranchen:`Weber Ulrich, "WeberMedia"`}},"Out of Home":{Plakat:{Ankünder:`Ankünder GmbH`,"BS Vertriebsagentur e.U.":`BS Vertriebsagentur e.U.`,"City Light":`City Light Ankünder GmbH`,"GFW Gesellschaft für Wirtschaftsdokumentationen":`GFW Gesellschaft für Wirtschaftsdokumentationen Gesellschaft m.b.H. & Co. KG`},Verkehrsmittel:{"Ankünder GmbH":`Ankünder GmbH`},"Digitaler Screen":{},outdoorAdvertising:{},Bande:{},Kino:{},Sonstiges:{"Gazzetta GmbH":`Gazzetta GmbH`,"CompanyCode Werbe GmbH":`CompanyCode Werbe GmbH`}},Fernsehen:{_items:{"ORF 2":`Österreichischer Rundfunk`}},Hörfunk:{_items:{"Radio Soundportal (Graz)":`Soundportal Graz GmbH`}}};var I=class extends x{getUrlSlug(){return`media-transparency`}getFormComponent(){return L}hasReadOnlyMode(){return!0}getFormIdentifier(){return`019bdb56-6fc7-760d-938a-b128a89958a8`}},L=class extends S{constructor(){super(),this.selectedCategory=null,this.otherMediumNameEnabled=!1,this.conditionalFields={category:!1,advertisementSubcategory:!1,mediaName:!1,outOfHomeOtherMediunOwner:!1},this.submissionIsSaved=!1,this.handleFormSubmission=this.handleFormSubmission.bind(this),this.handleSaveDraft=this.handleSaveDraft.bind(this),this.handleFormSaveSubmission=this.handleFormSaveSubmission.bind(this)}static get properties(){return{...super.properties,selectedCategory:{type:String,attribute:!1},otherMediumNameEnabled:{type:Boolean,attribute:!1},submissionIsSaved:{type:Boolean,attribute:!1}}}static get scopedElements(){return{...super.scopedElements,"dbp-form-string-element":w,"dbp-form-date-element":T,"dbp-form-boolean-element":E,"dbp-form-enum-element":D,"dbp-form-string-view":O,"dbp-form-date-view":k,"dbp-form-enum-view":A,"dbp-translated":m,"dbp-grant-permission-dialog":_,"dbp-modal":h,"dbp-file-source":b,"dbp-file-sink":v,"dbp-pdf-viewer":y}}connectedCallback(){super.connectedCallback(),this.updateComplete.then(()=>{this.addEventListener(`DbpFormalizeFormSubmission`,this.handleFormSubmission),this.addEventListener(`DbpFormalizeFormSaveDraft`,this.handleSaveDraft),this.addEventListener(`DbpFormalizeFormDeleteSubmission`,this.handleFormDeleteSubmission),this.addEventListener(`dbp-file-source-file-selected`,this.handleFilesToSubmit),this.addEventListener(`DbpFormalizeFormSaveSubmission`,this.handleFormSaveSubmission)})}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`DbpFormalizeFormSubmission`,this.handleFormSubmission),this.removeEventListener(`DbpFormalizeFormSaveDraft`,this.handleSaveDraft),this.removeEventListener(`DbpFormalizeFormSaveSubmission`,this.handleFormSaveSubmission),this.removeEventListener(`DbpFormalizeFormDeleteSubmission`,this.handleFormDeleteSubmission),this.removeEventListener(`dbp-file-source-file-selected`,this.handleFilesToSubmit)}async update(e){super.update(e);let t=this._i18n;e.has(`data`)&&(Object.keys(this.data).length>0&&await this.processFormData(),this.setButtonStates(),this.updateComplete.then(async()=>{await this.processConditionalFields();let e=new URLSearchParams(window.location.search);if(this.readOnly===!1&&e.get(`validate`)===`true`){let e=this.formElement;this.isFormValid=await C(e);let n=this.validateMinimumFileUploads();if(!n.isValid){this.isFormValid=!1;let e=n.failedGroups[0];d({summary:t.t(`errors.error-title`),body:t.t(`render-form.forms.media-transparency-form.min-file-upload-error`,{currentCount:e.currentCount,minCount:e.minCount}),type:`warning`,timeout:0})}this.isFormValid||(this.scrollToFirstInvalidField(e,!0),d({summary:t.t(`errors.warning-title`),body:t.t(`errors.form-validation-warning-notification-body`),type:`warning`,timeout:0}))}}))}updated(e){super.updated(e),e.has(`data`)&&(this._formHeaderObserved=!1,this.stickyHeaderObserver())}static get styles(){return[super.styles,c`
@layer theme, utility, formalize, print;
@layer theme {
${f(!1)}
${u()}
${l()}
}
@layer formalize {
${g()}
}
`]}async processFormData(){let e=this._i18n;try{if(this.currentSubmission=this.data,this.submissionId=this.data.identifier,this.lastModifiedCreatorId=this.data.lastModifiedById,this.formData=JSON.parse(this.data.dataFeedElement),this.submissionBinaryState=this.data.submissionState,this.submissionGrantedActions=this.data.grantedActions,this.selectedTags=this.data.tags,this.formData?.category&&this.setSubcategoryItemsByCategoryValue(this.formData.category),this.formData?.advertisementSubcategory&&this.setMediaNameItemsByValue(this.formData.advertisementSubcategory),this.formData?.mediaName===j&&(this.conditionalFields.mediaName=!0),this.formData?.category===`Out of Home`){this.conditionalFields.mediaName=!1,this.conditionalFields.mediumOwnersName=!1;let e=this.formData.otherMediumOwnersName,t=this.getMediaNameItems();e&&e in t?this.conditionalFields.outOfHomeOtherMediunOwner=!1:(this.conditionalFields.outOfHomeOtherMediunOwner=!0,e&&e!==j&&(this.formData.otherMediumOwnersNameCustom=e,this.formData.otherMediumOwnersName=j))}this.initializeFileGroups();let t={};for(let e of this.data.submittedFiles)t[e.fileAttributeName]||(t[e.fileAttributeName]=[]),t[e.fileAttributeName].push(e);this.fileUploadCounts={};for(let[e,n]of Object.entries(t)){this.fileUploadCounts[e]=n.length;let t=this.getOrCreateFileGroup(e);t.submittedFiles=await this.transformApiResponseToFile(n)}switch(Number(this.submissionBinaryState)){case 1:this.currentState=i.DRAFT;break;case 4:this.currentState=i.SUBMITTED;break;default:this.currentState=null}if(this.formData)try{let t=await this.apiGetUserDetails(this.lastModifiedCreatorId);if(!t.ok)d({summary:e.t(`errors.error-title`),body:e.t(`errors.failed-to-get-last-modifier-details`,{status:t.status}),type:`danger`,timeout:0});else{let e=await t.json();this.lastModifiedCreatorName=`${e?.givenName} ${e?.familyName}`}}catch(t){console.log(t),d({summary:e.t(`errors.error-title`),body:e.t(`errors.failed-to-get-last-modifier-details`),type:`danger`,timeout:0})}}catch(e){console.error(`Error parsing submission data:`,e)}}_cleanFormDataBeforeSubmit(e){e.otherMediumOwnersNameCustom!==void 0&&(e.otherMediumOwnersName=e.otherMediumOwnersNameCustom,delete e.otherMediumOwnersNameCustom),e.mediaName===M&&(e.mediaName=``),e.otherMediumOwnersName===M&&(e.otherMediumOwnersName=``)}async handleFormSubmission(e){let t=this._i18n,n=e.detail;this._cleanFormDataBeforeSubmit(n.formData);let r=this.validateMinimumFileUploads();if(!r.isValid){let e=r.failedGroups[0];d({summary:t.t(`errors.error-title`),body:`${t.t(`render-form.forms.media-transparency-form.min-file-upload-error`,{currentCount:e.currentCount,minCount:e.minCount})}`,type:`danger`,timeout:0}),this.saveButtonEnabled=!0;return}let a=!1;n.submissionId&&(a=!0),n.formData.identifier=a?this.lastModifiedCreatorId:this.getUserId();let s=new FormData;for(let[e,t]of Object.entries(this.filesByGroup))t.filesToSubmit.size>0&&t.filesToSubmit.forEach(t=>{s.append(`${e}[]`,t,t.name)}),t.filesToRemove.size>0&&t.filesToRemove.forEach((e,t)=>{s.append(`submittedFiles[${t}]`,`null`)});s.append(`form`,`/formalize/forms/`+this.formIdentifier),s.append(`dataFeedElement`,JSON.stringify(n.formData)),s.append(`submissionState`,String(o.SUBMITTED));let c=Object.values(this.selectedTags);s.append(`tags`,JSON.stringify(c));let l=a?`PATCH`:`POST`,u=this._buildRequestOptions(s,l),f=this._buildSubmissionUrl(a?this.submissionId:null),p={};for(let[e,t]of Object.entries(this.filesByGroup))p[e]={submittedFiles:new Map(t.submittedFiles),filesToSubmit:new Map(t.filesToSubmit),filesToRemove:new Map(t.filesToRemove)};try{let e=await fetch(f,u);if(!e.ok)this.submissionError=!0,await this.displayErrors(e);else{this.submissionError=!1,this.currentState=i.SUBMITTED,this.submitted=!0;for(let e of Object.keys(this.filesByGroup))this.filesByGroup[e].filesToSubmit=/* @__PURE__ */ new Map,this.filesByGroup[e].filesToRemove=/* @__PURE__ */ new Map;this.hideForm=!0,this.disableLeavePageWarning(),d({summary:t.t(`success.success-title`),body:t.t(`success.form-submitted-successfully`),type:`success`,timeout:5}),this.dispatchEvent(new CustomEvent(`dbpFormDataUpdated`,{detail:{needUpdate:!0},bubbles:!0,composed:!0}))}}catch(e){console.error(e);for(let[e,t]of Object.entries(p))this.filesByGroup[e]=t;d({summary:t.t(`errors.error-title`),body:t.t(`errors.unknown-error-on-form-submission`),type:`danger`,timeout:0})}}async handleFormSaveSubmission(e){let t=this._i18n;if(!e.detail.submissionId)return;let n=e.detail;this._cleanFormDataBeforeSubmit(n.formData),n.formData.identifier=this.lastModifiedCreatorId;let r=new FormData;for(let[e,t]of Object.entries(this.filesByGroup))t.filesToSubmit.size>0&&t.filesToSubmit.forEach(t=>{r.append(`${e}[]`,t,t.name)}),t.filesToRemove.size>0&&t.filesToRemove.forEach((e,t)=>{r.append(`submittedFiles[${t}]`,`null`)});r.append(`dataFeedElement`,JSON.stringify(n.formData));let i=Object.values(this.selectedTags);r.append(`tags`,JSON.stringify(i));let a=this._buildRequestOptions(r,`PATCH`),o=this._buildSubmissionUrl(e.detail.submissionId),s={};for(let[e,t]of Object.entries(this.filesByGroup))s[e]={submittedFiles:new Map(t.submittedFiles),filesToSubmit:new Map(t.filesToSubmit),filesToRemove:new Map(t.filesToRemove)};try{let e=await fetch(o,a);if(!e.ok)await this.displayErrors(e),this.submissionIsSaved=!1;else{let n=await e.json(),r={};for(let e of n.submittedFiles)r[e.fileAttributeName]||(r[e.fileAttributeName]=[]),r[e.fileAttributeName].push(e);for(let[e,t]of Object.entries(r)){let n=this.getOrCreateFileGroup(e);n.submittedFiles=await this.transformApiResponseToFile(t),n.filesToSubmit=/* @__PURE__ */ new Map,n.filesToRemove=/* @__PURE__ */ new Map}this.submissionIsSaved=!0,this.dispatchEvent(new CustomEvent(`dbpFormDataUpdated`,{detail:{needUpdate:!0},bubbles:!0,composed:!0})),d({summary:t.t(`success.success-title`),body:t.t(`success.form-saved-successfully`),type:`success`,timeout:5})}}catch(e){for(let[e,t]of Object.entries(s))this.filesByGroup[e]=t;this.submissionIsSaved=!1,this.requestUpdate(),console.error(e),d({summary:t.t(`errors.error-title`),body:t.t(`errors.unknown-error-on-save-submission`),type:`danger`,timeout:0})}}async handleSaveDraft(e){let t=this._i18n,n=e.detail;this._cleanFormDataBeforeSubmit(n.formData);let r=!1;n.submissionId&&(r=!0),n.formData.identifier=r?this.lastModifiedCreatorId:this.getUserId();let i=new FormData;for(let[e,t]of Object.entries(this.filesByGroup))t.filesToSubmit.size>0&&t.filesToSubmit.forEach(t=>{i.append(`${e}[]`,t,t.name)}),t.filesToRemove.size>0&&t.filesToRemove.forEach((e,t)=>{i.append(`submittedFiles[${t}]`,`null`)});i.append(`form`,`/formalize/forms/`+this.formIdentifier),i.append(`dataFeedElement`,JSON.stringify(n.formData)),i.append(`submissionState`,String(o.DRAFT));let s=Object.values(this.selectedTags);i.append(`tags`,JSON.stringify(s));let c=r?`PATCH`:`POST`,l=this._buildRequestOptions(i,c),u=this._buildSubmissionUrl(r?this.submissionId:null),f={};for(let[e,t]of Object.entries(this.filesByGroup))f[e]={submittedFiles:new Map(t.submittedFiles),filesToSubmit:new Map(t.filesToSubmit),filesToRemove:new Map(t.filesToRemove)};try{let e=await fetch(u,l),n=await e.json();if(!e.ok)d({summary:t.t(`errors.error-title`),body:t.t(`errors.failed-to-save-draft`,{status:e.status,detail:n.detail}),type:`danger`,timeout:0});else{this.data=n,this.newSubmissionId=n.identifier,this.submissionBinaryState=n.submissionState;let e={};for(let t of n.submittedFiles)e[t.fileAttributeName]||(e[t.fileAttributeName]=[]),e[t.fileAttributeName].push(t);for(let[t,n]of Object.entries(e)){let e=this.getOrCreateFileGroup(t);e.submittedFiles=await this.transformApiResponseToFile(n),e.filesToSubmit=/* @__PURE__ */ new Map,e.filesToRemove=/* @__PURE__ */ new Map}let t=a(this.formUrlSlug,this.lang)+`/${this.newSubmissionId}`;window.history.pushState({},``,t.toString()),this.disableLeavePageWarning(),this.redirectToReadonlyForm(),this.dispatchEvent(new CustomEvent(`dbpFormDataUpdated`,{detail:{needUpdate:!0},bubbles:!0,composed:!0}))}}catch(e){for(let[e,t]of Object.entries(f))this.filesByGroup[e]=t;this.requestUpdate(),console.error(e),d({summary:t.t(`errors.error-title`),body:t.t(`errors.unknown-error-on-save-draft`),type:`danger`,timeout:0})}}async handleChangeEvents(e){if(super.handleChangeEvents(e),e.detail&&e.detail.option&&e.detail.value){let t=e.detail.option,n=e.detail.value;if(t.value===`download`&&n===`download`){this.downloadAllFiles();return}if(t.value===`edit-permissions`&&n===`edit-permissions`){this._(`#grant-permission-dialog`).open();return}}if(!this.readOnly){await this.updateComplete;let e=await C(this.formElement,!0),t=this.validateMinimumFileUploads();this.isFormValid=e&&t.isValid}}downloadAllFiles(){let e=this.getFileGroupsFromSchema().flatMap(e=>{let t=this.getOrCreateFileGroup(e);return Array.from(t.submittedFiles.values())});this._(`#file-sink`).files=e}async handleFormDeleteSubmission(t){let n=this._i18n,r=t.detail.submissionId;if(!r){d({summary:n.t(`errors.error-title`),body:n.t(`errors.no-submission-id-provided`),type:`danger`,timeout:0});return}if(await e(this))try{let e=await fetch(this.entryPointUrl+`/formalize/submissions/${r}`,{method:`DELETE`,headers:{Authorization:`Bearer `+this.getToken()}});e.ok?(this.wasDeleteSubmissionSuccessful=!0,this.deleteSubmissionError=!1):(this.deleteSubmissionError=!0,d({summary:n.t(`errors.error-title`),body:n.t(`errors.failed-to-delete-submission-status`,{status:e.status}),type:`danger`,timeout:0}))}catch(e){console.error(e),d({summary:n.t(`errors.error-title`),body:n.t(`errors.unknown-error-on-delete-submission`),type:`danger`,timeout:0})}finally{if(this.wasDeleteSubmissionSuccessful){d({summary:n.t(`success.success-title`),body:n.t(`success.form-submission-deleted-successfully`),type:`success`,timeout:5});let e=a(this.formUrlSlug,this.lang);window.history.pushState({},``,e.toString()),this.resetForm(t),this.sendSetPropertyEvent(`routing-url`,`/${this.formUrlSlug}`)}}}validateMinimumFileUploads(){let e=[];if(this.fileUploadLimits.minFileUploadCount)for(let[t,n]of Object.entries(this.fileUploadLimits.minFileUploadCount)){let r=(this.filesByGroup[t]?.submittedFiles.size||0)+(this.filesByGroup[t]?.filesToSubmit.size||0);r<n&&e.push({fileGroup:t,currentCount:r,minCount:n})}return{isValid:e.length===0,failedGroups:e}}renderFileUploadGroup(e){let t=this._i18n;return s`
<div class="file-upload-container">
<div class="file-upload-title-container">
<h4 class="attachments-title">
${t.t(`render-form.forms.media-transparency-form.attachments-title`)}
${this.fileUploadLimits?.minFileUploadCount?.[e]>0?s`
<span class="required-mark">*</span>
`:``}
</h4>
<span class="file-upload-limit-warning">
${t.t(`render-form.download-widget.file-upload-count-limit-warning`,{count:this.fileUploadLimits?.allowedFileUploadCount?.[e]})}
${t.t(`render-form.download-widget.file-upload-size-limit-warning`,{size:this.fileUploadLimits?.fileSizeLimit?.[e]})}
</span>
<dbp-translated subscribe="lang">
<div slot="de">
<p>Bitte benennen Sie Ihr Sujet nach folgenden Kriterien:</p>
<ol>
<li>Fortlaufende zweistellige Nummer: 01, 02, 03, …</li>
<li>Abkürzung der OE/Institutes/ …</li>
<li>Kategorie</li>
<li>Medium</li>
<li>Thema</li>
</ol>
<p>
Zum Beispiel:
<code>01_KM_Print_HelleKoepfe_DerGrazer_Motorenforschung.pdf</code>
</p>
<p>Punkte 2-5 dürfen keine Ziffern enthalten!</p>
<p>Die zulässige Dateiformate sind PDF, JPG, PNG, MP3 und MP4.</p>
</div>
<div slot="en">
<p>Please name your file according to the following criteria:</p>
<ol>
<li>Sequential two-digit number: 01, 02, 03, …</li>
<li>Abbreviation of the organizational unit/institute/ …</li>
<li>Category</li>
<li>Medium</li>
<li>Topic</li>
</ol>
<p>
For example:
<code>01_KM_Print_HelleKoepfe_DerGrazer_Motorenforschung.pdf</code>
</p>
<p>Items 2–5 must not contain any numbers!</p>
<p>The accepted file formats are PDF, JPG, PNG, MP3, and MP4.</p>
</div>
</dbp-translated>
</div>
<div class="uploaded-files">${this.renderAttachedFilesHtml(e)}</div>
<button
class="button is-secondary upload-button upload-button--attachment"
.disabled=${this.fileUploadCounts[e]>=this.fileUploadLimits?.allowedFileUploadCount?.[e]&&this.filesByGroup[`Sujet-Speichername`]?.filesToRemove?.size===0}
@click="${t=>{this.currentUploadGroup=e,this.openFilePicker(t)}}">
<dbp-icon name="upload" aria-hidden="true"></dbp-icon>
${isNaN(this.fileUploadLimits?.allowedFileUploadCount?.[e])?t.t(`render-form.download-widget.upload-file-button-label-no-limit`):t.t(`render-form.download-widget.upload-file-button-label`,{count:this.fileUploadLimits?.allowedFileUploadCount?.[e]})}
</button>
</div>
`}renderFileViewGroup(e){let t=this._i18n;return s`
<div class="file-upload-container">
<h4 class="attachments-title">
${t.t(`render-form.download-widget.attachments-title`)}
</h4>
<div class="uploaded-files">${this.renderAttachedFilesHtml(e)}</div>
</div>
`}categoryHasSubcategories(e){let t=F[e];return!!t&&!(`_items`in t)}getCategoryItems(){let e=this._i18n,t={};return Object.keys(F).forEach(n=>{let r=P[n]??`render-form.forms.media-transparency-form.categories-${this.camelToKebab(n)}`;t[n]=e.t(r)}),t}getCategoriesWithSubcategories(){return Object.keys(F).filter(e=>this.categoryHasSubcategories(e))}camelToKebab(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase()}getSubcategoryItems(){let e=this._i18n;if(!this.selectedCategory||!this.categoryHasSubcategories(this.selectedCategory))return{};let t={};return Object.keys(F[this.selectedCategory]).forEach(n=>{let r=N[n]??`render-form.forms.media-transparency-form.sub-categories-${this.camelToKebab(n)}`;t[n]=e.t(r)}),t}getMediaNameItems(){let e=this._i18n,t=this.categoryHasSubcategories(this.selectedCategory)?this.formData?.advertisementSubcategory:`_items`,n=F[this.selectedCategory]?.[t]||{};if(Object.keys(n).length===0)return{[j]:j};let r={[M]:e.t(`render-form.forms.media-transparency-form.please-select-media`)};return Object.keys(n).forEach(e=>{r[e]=e}),(t!==j||this.selectedCategory===`Out of Home`)&&(r[j]=j),r}getDeadlinePeriodItems(){let e=this._i18n,t={},n=(/* @__PURE__ */ new Date()).getFullYear(),r=n+1;t[``]=e.t(`render-form.forms.media-transparency-form.please-select-deadline`);for(let e=n;e<=r;e++)t[`${e}/1`]=`${e}/1`,t[`${e}/2`]=`${e}/2`;return t}setSubcategoryItemsByCategoryValue(e){this.selectedCategory=e,this.categoryHasSubcategories(e)||(this.conditionalFields.advertisementSubcategory=!0),this.conditionalFields.mediaName=!1}setSubcategoryItems(e){let t=e.currentTarget.value;if(typeof t!=`string`)return;this.setSubcategoryItemsByCategoryValue(t);let n=this.formData;n.advertisementSubcategory=``,n.mediumOwnersName=``,n.otherMediumName=``,n.otherMediumOwnersName=``,this.categoryHasSubcategories(t)?(n.mediaName=M,this.conditionalFields.advertisementSubcategory=!1,this.updateComplete.then(async()=>{await this.uncheckRadioButtons()})):Object.keys(F[t]._items).length>0?(n.mediaName=M,this.conditionalFields.mediaName=!1):(n.mediaName=j,this.conditionalFields.mediaName=!0),this.requestUpdate()}setMediaNameItemsByValue(e){this.formData&&(this.formData.advertisementSubcategory=e),this.conditionalFields.advertisementSubcategory=!0,this.requestUpdate()}getOwnerForMediaName(e){let t=F[this.selectedCategory];return t?t[this.categoryHasSubcategories(this.selectedCategory)?this.formData.advertisementSubcategory:`_items`]?.[e]??null:null}async uncheckRadioButtons(){let e=this._(`[name="advertisementSubcategory"]`);if(e){await e.updateComplete;let t=e.shadowRoot?.querySelectorAll(`input[type="radio"]`);t&&t.forEach(e=>{e.checked=!1})}}render(){return s`
${this.readOnly?s`
${this.renderFormViews()}
`:s`
${this.renderFormElements()}
`}
`}renderFormElements(){let e=this._i18n,n=this.formData||{};return s`
<form
id="media-transparency-form"
aria-labelledby="form-title"
class="${p({hidden:this.hideForm,"formalize-form":!0,"media-transparency-form":!0,"readonly-mode":this.readOnly,"edit-mode":!this.readOnly})}">
<div class="form-header">${this.getButtonRowHtml()}</div>
${this.submissionIsSaved&&(this.canUserSubmitSubmission()||this.areSubmissionReadableAfterSubmission())?s`
<div class="after-submission-button-container after-saving">
${this.canUserSubmitSubmission()?s`
<a
href="${a(this.formUrlSlug,this.lang)}"
class="button button--new-submission"
@click="${()=>{this.disableLeavePageWarning()}}">
<dbp-icon
name="plus"
aria-hidden="true"></dbp-icon>
${e.t(`success.create-new-submission-button-label`)}
</a>
`:``}
${this.areSubmissionReadableAfterSubmission()?s`
<a
href="${t(this.formIdentifier,this.lang)}"
class="button button--back-to-submissions-list"
@click="${()=>{this.disableLeavePageWarning()}}">
<dbp-icon
name="list"
aria-hidden="true"></dbp-icon>
${e.t(`success.back-to-submissions-list-button-label`)}
</a>
`:``}
</div>
`:``}
<h2 class="form-title">
${e.t(`render-form.forms.media-transparency-form.title`)}
</h2>
<div class="form-description">
<dbp-translated subscribe="lang">
<div slot="de">
<p>
In diesem Formular können Sie Ihre Werbemaßnahmen eintragen, um die
Transparenz von Werbung an der TU Graz zu erhöhen. Bitte füllen Sie
alle Pflichtfelder aus (gekennzeichnet mit einem roten Stern) und
laden Sie die erforderlichen Dateien hoch, damit Ihre Einreichung
bearbeitet werden kann. Bei Fragen, melden Sie sich bitte bei
<a href="mailto:ulla.lehrmayer@tugraz.at" target="_blank">
Ulla Lehrmayer
</a>
.
</p>
</div>
<div slot="en">
<p>
In this form, you can enter your advertising activities to increase
the transparency of advertising at TU Graz. Please fill in all
required fields (marked with a red asterisk) and upload the
necessary files to ensure that your submission can be processed. If
you have any questions, please contact
<a href="mailto:ulla.lehrmayer@tugraz.at" target="_blank">
Ulla Lehrmayer
</a>
.
</p>
</div>
</dbp-translated>
</div>
<p>
<span class="red-marked-asterisk">
${e.t(`render-form.required-files-asterisk`)}
</span>
${e.t(`render-form.required-files-text`)}
</p>
<dbp-form-enum-element
subscribe="lang"
name="category"
data-condition="${JSON.stringify(this.getCategoriesWithSubcategories())}"
label="${e.t(`render-form.forms.media-transparency-form.field-category-label`)}"
display-mode="list"
.items=${this.getCategoryItems()}
@change=${e=>{this.setSubcategoryItems(e)}}
.value=${n.category||``}
required></dbp-form-enum-element>
${this.conditionalFields.category?s`
${Object.keys(this.getSubcategoryItems()).length>0?s`
<dbp-form-enum-element
class="${p({"fade-in":Object.keys(this.getSubcategoryItems()).length>0})}"
subscribe="lang"
data-condition="!Sonstiges"
name="advertisementSubcategory"
label="${e.t(`render-form.forms.media-transparency-form.field-advertisement-subcategory-label`)}"
display-mode="list"
.items=${this.getSubcategoryItems()}
.value=${n.advertisementSubcategory||``}
@change=${e=>{this.setMediaNameItemsByValue(e.currentTarget.value);let t=F[this.selectedCategory]?.[e.currentTarget.value]||{};Object.keys(t).length===0?(n.mediaName=j,this.conditionalFields.mediaName=!0):(n.mediaName=M,this.conditionalFields.mediaName=!1),n.mediumOwnersName=``,n.otherMediumName=``,n.otherMediumOwnersName=``,this.requestUpdate()}}
required></dbp-form-enum-element>
`:``}
`:``}
${this.conditionalFields.advertisementSubcategory?s`
<dbp-form-enum-element
subscribe="lang"
name="mediaName"
data-condition="Sonstiges"
label="${e.t(`render-form.forms.media-transparency-form.field-media-name-label`)}"
display-mode="dropdown"
.items=${this.getMediaNameItems()}
.customValidator=${t=>t===M?[e.t(`render-form.forms.media-transparency-form.media-name-validation-error`)]:[]}
@change=${e=>{let t=e.currentTarget.value;if(n.mediaName=t,t===j||t===M)this.conditionalFields.mediaName=!0,n.mediumOwnersName=``;else{this.conditionalFields.mediaName=!1;let e=this.getOwnerForMediaName(t);n.mediumOwnersName=e??``}this.requestUpdate()}}
.value=${n.mediaName||M}
required></dbp-form-enum-element>
${this.conditionalFields.mediaName?``:s`
<dbp-form-string-element
subscribe="lang"
name="mediumOwnersName"
maxlength="1000"
label="${e.t(`render-form.forms.media-transparency-form.field-media-owners-name-label`)}"
disabled
required
.value=${n.mediumOwnersName||``}></dbp-form-string-element>
`}
`:``}
${this.conditionalFields.mediaName?s`
<dbp-form-string-element
subscribe="lang"
name="otherMediumName"
label="${e.t(`render-form.forms.media-transparency-form.field-other-medium-name-label`)}"
required
maxlength="1000"
.value=${n.otherMediumName||``}></dbp-form-string-element>
<dbp-form-string-element
subscribe="lang"
name="otherMediumOwnersName"
label="${e.t(`render-form.forms.media-transparency-form.field-other-medium-owners-name-label`)}"
required
maxlength="1000"
.value=${n.otherMediumOwnersName||``}></dbp-form-string-element>
`:``}
${n.category===`Out of Home`&&n.advertisementSubcategory===`Sonstiges`?s`
<div
style="visibility:hidden; height:0; margin:0; padding:0; border:0;">
<dbp-form-string-element
subscribe="lang"
name="otherMediumName"
label="${e.t(`render-form.forms.media-transparency-form.field-other-medium-name-label`)}"
maxlength="1000"
value=""></dbp-form-string-element>
</div>
<dbp-form-enum-element
subscribe="lang"
name="otherMediumOwnersName"
label="${e.t(`render-form.forms.media-transparency-form.field-other-medium-owners-name-label`)}"
display-mode="dropdown"
.items=${this.getMediaNameItems()}
@change=${e=>{let t=e.currentTarget.value;if(t===j||t===M)this.conditionalFields.outOfHomeOtherMediunOwner=!0,n.otherMediumOwnersName=``,n.otherMediumOwnersNameCustom=``;else{this.conditionalFields.outOfHomeOtherMediunOwner=!1,n.otherMediumOwnersNameCustom=``;let e=this.getOwnerForMediaName(t);n.otherMediumOwnersName=e??``}this.requestUpdate()}}
.customValidator=${t=>t===M?[e.t(`render-form.forms.media-transparency-form.media-name-validation-error`)]:[]}
.value=${n.otherMediumOwnersName||M}
required></dbp-form-enum-element>
${this.conditionalFields.outOfHomeOtherMediunOwner?s`
<dbp-form-string-element
subscribe="lang"
name="otherMediumOwnersNameCustom"
label="${e.t(`render-form.forms.media-transparency-form.field-media-owners-name-label`)}"
required
maxlength="1000"
.value=${n.otherMediumOwnersNameCustom||``}></dbp-form-string-element>
`:``}
`:``}
<dbp-form-string-element
subscribe="lang"
name="amountInEuro"
maxlength="20"
label="${e.t(`render-form.forms.media-transparency-form.field-amount-in-euro-label`)}"
description="${e.t(`render-form.forms.media-transparency-form.field-amount-in-euro-description`)}"
.customValidator=${t=>/^\d+(?:,\d{1,2})?$/.test(t)?null:e.t(`render-form.forms.media-transparency-form.validation-amount-in-euro-label`)}
.value=${n.amountInEuro||``}
required></dbp-form-string-element>
<dbp-form-string-element
subscribe="lang"
name="campaignTitle"
maxlength="1000"
label="${e.t(`render-form.forms.media-transparency-form.field-campaign-title-label`)}"
.value=${n.campaignTitle||``}></dbp-form-string-element>
<!-- Notes -->
<dbp-form-string-element
subscribe="lang"
name="notes"
rows="5"
maxlength="1000"
label="${e.t(`render-form.forms.media-transparency-form.field-notes-label`)}"
.value=${n.notes||``}></dbp-form-string-element>
<!-- Reporting deadline period -->
<dbp-form-enum-element
subscribe="lang"
name="reportingDeadline"
.items=${this.getDeadlinePeriodItems()}
required
label="${e.t(`render-form.forms.media-transparency-form.field-reporting-deadline-period-label`)}"
description="${e.t(`render-form.forms.media-transparency-form.field-reporting-deadline-period-description`)}"
.customValidator=${t=>t===`Bitte wählen Sie den Anmeldezeitraum aus`||t===`Please select deadline period`?[e.t(`render-form.forms.media-transparency-form.reporting-deadline-validation-error`)]:[]}
.value=${n.reportingDeadline||``}></dbp-form-enum-element>
${this.getFileGroupsFromSchema().map(e=>this.renderFileUploadGroup(e))}
</form>
<dbp-file-source
id="file-source"
class="file-source"
lang="${this.lang}"
allowed-mime-types="application/pdf,image/jpeg,image/png,image/gif,video/mp4,video/mpeg,
video/webm,audio/mpeg,audio/ogg,audio/flac,audio/mp4"
max-file-size="100000"
number-of-files="1"
enabled-targets="local,clipboard,nextcloud"
subscribe="nextcloud-auth-url,nextcloud-web-dav-url,nextcloud-name,nextcloud-file-url"></dbp-file-source>
<dbp-file-sink
id="file-sink"
class="file-sink"
lang="${this.lang}"
decompress-zip
enabled-targets="local,clipboard,nextcloud"
filename="media-transparency-form-${this.formData?.id||``}-attachments.zip"
subscribe="nextcloud-auth-url,nextcloud-web-dav-url,nextcloud-name,nextcloud-file-url"></dbp-file-sink>
<dbp-modal
id="pdf-view-modal"
class="pdf-view-modal"
modal-id="pdf-viewer-modal"
subscribe="lang">
<div slot="content">
<dbp-pdf-viewer
id="dbp-pdf-viewer"
lang="${this.lang}"
auto-resize="cover"></dbp-pdf-viewer>
</div>
</dbp-modal>
${this.renderResult(this.submitted)}
`}renderFormViews(){let e=this._i18n,t=this.formData||{};return s`
<form
id="media-transparency-form"
aria-labelledby="form-title"
class="${p({hidden:this.hideForm,"formalize-form":!0,"media-transparency-form":!0,"readonly-mode":this.readOnly,"edit-mode":!this.readOnly})}">
<div class="form-header">${this.getButtonRowHtml()}</div>
<h2 class="form-title">
${e.t(`render-form.forms.media-transparency-form.title`)}
</h2>
<dbp-form-enum-view
subscribe="lang"
name="category"
data-condition="${JSON.stringify(this.getCategoriesWithSubcategories())}"
label="${e.t(`render-form.forms.media-transparency-form.field-category-label`)}"
display-mode="list"
.value=${t.category||``}></dbp-form-enum-view>
${this.conditionalFields.advertisementSubcategory&&Object.keys(this.getSubcategoryItems()).length>0?s`
<dbp-form-enum-view
class="${p({"fade-in":Object.keys(this.getSubcategoryItems()).length>0})}"
subscribe="lang"
name="advertisementSubcategory"
label="${e.t(`render-form.forms.media-transparency-form.field-advertisement-subcategory-label`)}"
display-mode="list"
.items=${this.getSubcategoryItems()}
.value=${t.advertisementSubcategory||``}></dbp-form-enum-view>
`:``}
${t.mediaName?s`
<dbp-form-enum-view
subscribe="lang"
name="mediaName"
data-condition="!Sonstiges"
label="${e.t(`render-form.forms.media-transparency-form.field-media-name-label`)}"
display-mode="dropdown"
.value=${t.mediaName||``}></dbp-form-enum-view>
`:``}
${t.mediumOwnersName?s`
<dbp-form-string-view
subscribe="lang"
name="mediumOwnersName"
label="${e.t(`render-form.forms.media-transparency-form.field-media-owners-name-label`)}"
.value=${t.mediumOwnersName||``}></dbp-form-string-view>
`:``}
${t.otherMediumName||t.otherMediumOwnersName?s`
<dbp-form-string-view
subscribe="lang"
name="otherMediumName"
label="${e.t(`render-form.forms.media-transparency-form.field-other-medium-name-label`)}"
.value=${t.otherMediumName||``}></dbp-form-string-view>
<dbp-form-string-view
subscribe="lang"
name="otherMediumOwnersName"
label="${e.t(`render-form.forms.media-transparency-form.field-other-medium-owners-name-label`)}"
.value=${t.otherMediumOwnersName||``}></dbp-form-string-view>
`:``}
<dbp-form-string-view
subscribe="lang"
name="amountInEuro"
label="${e.t(`render-form.forms.media-transparency-form.field-amount-in-euro-label`)}"
.value=${t.amountInEuro||``}></dbp-form-string-view>
${t.campaignTitle?s`
<dbp-form-string-view
subscribe="lang"
name="campaignTitle"
label="${e.t(`render-form.forms.media-transparency-form.field-campaign-title-label`)}"
.value=${t.campaignTitle||``}></dbp-form-string-view>
`:``}
<!-- Notes -->
${t.notes?s`
<dbp-form-string-view
subscribe="lang"
name="notes"
rows="5"
label="${e.t(`render-form.forms.media-transparency-form.field-notes-label`)}"
.value=${t.notes||``}></dbp-form-string-view>
`:``}
<!-- Reporting deadline -->
${t.reportingDeadline?s`
<dbp-form-enum-view
subscribe="lang"
name="reportingDeadline"
label="${e.t(`render-form.forms.media-transparency-form.field-reporting-deadline-label`)}"
.value=${t.reportingDeadline||``}></dbp-form-enum-view>
`:``}
${this.getFileGroupsFromSchema().map(e=>this.renderFileViewGroup(e))}
</form>
<dbp-file-sink
id="file-sink"
class="file-sink"
lang="${this.lang}"
decompress-zip
enabled-targets="local,clipboard,nextcloud"
filename="media-transparency-form-${this.formData?.id||``}-attachments.zip"
subscribe="nextcloud-auth-url,nextcloud-web-dav-url,nextcloud-name,nextcloud-file-url"></dbp-file-sink>
<dbp-modal
id="pdf-view-modal"
class="pdf-view-modal"
modal-id="pdf-viewer-modal"
subscribe="lang">
<div slot="content">
<dbp-pdf-viewer
id="dbp-pdf-viewer"
lang="${this.lang}"
auto-resize="cover"></dbp-pdf-viewer>
</div>
</dbp-modal>
<dbp-grant-permission-dialog
id="grant-permission-dialog"
lang="${this.lang}"
modal-title="${e.t(`manage-forms.edit-permission-modal-title`)}"
subscribe="auth"
entry-point-url="${this.entryPointUrl}"
resource-identifier="${this.submissionId}"
resource-class-identifier="DbpRelayFormalizeSubmission"></dbp-grant-permission-dialog>
<!-- Deletion Confirmation Modal -->
<dbp-modal
id="deletion-confirmation-modal--formalize"
class="modal modal--confirmation"
modal-id="deletion-confirmation-modal"
title="${e.t(`manage-forms.delete-confirmation-title`)}"
subscribe="lang">
<div slot="content">
<p>${e.t(`manage-forms.delete-confirmation-message`)}</p>
</div>
<menu slot="footer" class="footer-menu">
<dbp-button
type="is-secondary"
no-spinner-on-click
@click="${()=>r(this)}">
${e.t(`manage-forms.abort`)}
</dbp-button>
<dbp-button
type="is-danger"
no-spinner-on-click
@click="${()=>n(this)}">
${e.t(`manage-forms.delete`)}
</dbp-button>
</menu>
</dbp-modal>
`}renderResult(e){let n=this._i18n;return e?s`
<div class="container">
<h2>
${n.t(`render-form.forms.media-transparency-form.submission-result-thanks`)}
</h2>
<p>
${n.t(`render-form.forms.media-transparency-form.submission-result-notification`)}
</p>
<div class="after-submission-button-container">
${this.canUserSubmitSubmission()?s`
<a
href="${a(this.formUrlSlug,this.lang)}"
class="button button--new-submission">
<dbp-icon name="plus" aria-hidden="true"></dbp-icon>
${n.t(`success.create-new-submission-button-label`)}
</a>
`:``}
${this.areSubmissionReadableAfterSubmission()?s`
<a
href="${t(this.formIdentifier,this.lang)}"
class="button button--back-to-submissions-list">
<dbp-icon name="list" aria-hidden="true"></dbp-icon>
${n.t(`success.back-to-submissions-list-button-label`)}
</a>
`:``}
</div>
</div>
`:s``}openFilePicker(e){e.preventDefault(),this._(`dbp-file-source`).setAttribute(`dialog-open`,``)}async deleteAttachment(e,t){if(super.deleteAttachment(e,t),!this.readOnly){let e=await C(this.formElement,!0),t=this.validateMinimumFileUploads();this.isFormValid=e&&t.isValid}}async handleFilesToSubmit(e){super.handleFilesToSubmit(e);let t=await C(this.formElement,!0),n=this.validateMinimumFileUploads();this.isFormValid=t&&n.isValid}};export{F as MEDIA_NAME_OWNER_MAPPING,I as default};
//# sourceMappingURL=mediaTransparencyForm.js.map