EN · DE · RU · FR · ES

#201: AddressCampaignValueMultiSelectedPageRest.kt

plugins/org.projectforge.plugins.marketing/src/main/kotlin/org/projectforge/plugins/marketing/rest/AddressCampaignValueMultiSelectedPageRest.kt Type : Kotlin · Rôle : Enregistrement de plugin · Source : plugins/org.projectforge.plugins.marketing/src/main/kotlin/org/projectforge/plugins/marketing/rest/AddressCampaignValueMultiSelectedPageRest.kt 229 lignes · 172 code · 35 commentaires · 22 vides
Point de terminaison de l'API REST pour AddressCampaignValueMultiSelected. Gère les requêtes HTTP et renvoie des réponses JSON pour le frontend React.

Structure du code

Annotations : RequestMapping, PostConstruct, RestController, Autowired

Classes : AddressCampaignValueMultiSelectedPageRest

Supertype(s) : AbstractMultiSelectedPage

Fonctions (5) : getId, getTitleKey, postConstruct, fillForm, proceedMassUpdate

Propriétés (18) : addressDao, addressCampaignValueDao, addressCampaignValuePagesRest, layoutContext, lc, addressCampaign, values, params, addressCampaign, addressCampaignDO, realCampaignValueIds, addressIdsFromNegative, longId, existingCampaignValues, addressCampaignValue, addresses, addressCampaignValueDO, addressCampaignValue

Importations : 17 paquets

Paquet : org.projectforge.plugins.marketing.rest

Code source (abrégé)

package org.projectforge.plugins.marketing.rest

import jakarta.annotation.PostConstruct
import jakarta.servlet.http.HttpServletRequest
import org.projectforge.business.address.AddressDao
import org.projectforge.framework.persistence.api.EntityCopyStatus
import org.projectforge.plugins.marketing.AddressCampaignValueDO
import org.projectforge.plugins.marketing.AddressCampaignValueDao
import org.projectforge.plugins.marketing.dto.AddressCampaignValue
import org.projectforge.rest.config.Rest
import org.projectforge.rest.multiselect.AbstractMultiSelectedPage
import org.projectforge.rest.multiselect.MassUpdateContext
import org.projectforge.rest.multiselect.MassUpdateParameter
import org.projectforge.ui.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import java.io.Serializable


/**
 * Mise à jour en masse après sélection.
 */
@RestController
@RequestMapping("${Rest.URL}/addressCampaignValue${AbstractMultiSelectedPage.URL_SUFFIX_SELECTED}")
class AddressCampaignValueMultiSelectedPageRest : AbstractMultiSelectedPage<AddressCampaignValue>() {
    @Autowired
    private lateinit var addressDao: AddressDao

    @Autowired
    private lateinit var addressCampaignValueDao: AddressCampaignValueDao

    @Autowired
    private lateinit var addressCampaignValuePagesRest: AddressCampaignValuePagesRest

    override val layoutContext: LayoutContext = LayoutContext(AddressCampaignValueDO::class.java)

    override fun getId(obj: AddressCampaignValue): Long {
        return obj.id ?: obj.addressId ?: -1
    }

    override fun getTitleKey(): String {
        return "plugins.marketing.addressCampaignValue.multiselected.title"
    }

    @PostConstruct
    private fun postConstruct() {
        pagesRest = addressCampaignValuePagesRest
    }

    override fun fillForm(
        request: HttpServletRequest,
        layout: UILayout,
        massUpdateData: MutableMap<String, MassUpdateParameter>,
        selectedIds: Collection<Serializable>?,
        variables: MutableMap<String, Any>,
    ) {
        /*
              // En-tête
          gridBuilder.newFormHeading(
              getString("plugins.marketing.addressCampaignValue") + ": " + data.getAddressCampaign().getTitle());

         */
        val lc = LayoutContext(AddressCampaignValueDO::class.java)

        val addressCampaign = addressCampaignValuePagesRest.getAddressCampaign(request)
        if (addressCampaign != null) {
            layout.add(UIReadOnlyField(label = "plugins.marketing.addressCampaign", value = addressCampaign.title))
        }
        val values = addressCampaign?.values?.map { UISelectValue(it, it) }
        layout.add(
            createInputFieldRow(
                "value",
                UISelect("value.textValue", values = values),
                massUpdateData,
                showDeleteOption = true
            )
        )
        createAndAddFields(lc, massUpdateData, layout, "comment", showAppendOption = true)
    }

    override fun proceedMassUpdate(
        request: HttpServletRequest,
        selectedIds: Collection<Serializable>,
        massUpdateContext: MassUpdateContext<AddressCampaignValue>,
    ): ResponseEntity<*>? {
        val params = massUpdateContext.massUpdateParams
        val addressCampaign = addressCampaignValuePagesRest.getAddressCampaign(request)
        params["value"]?.let { param ->
            param.textValue?.let { value ->
                if (!value.isEmpty() && addressCampaign?.values?.contains(value) != true) {
                    return showValidationErrors(
                        ValidationError(
                            "plugins.marketing.addressCampaignValue.error.unknownValue",
                            "value.textValue"
                        )
                    )
                }
            }
        }
        val addressCampaignDO = addressCampaignValuePagesRest.getAddressCampaignDO(request)
        if (addressCampaignDO == null) {
            return showValidationErrors(
                ValidationError("plugins.marketing.addressCampaignValue.error.addressOrCampaignNotGiven")
            )
        }

        // Diviser les IDs sélectionnés en positifs (valeurs de campagne existantes) et négatifs (IDs d'adresse)
        val realCampaignValueIds = mutableListOf<Long>()
        val addressIdsFromNegative = mutableListOf<Long>()

        selectedIds.forEach { id ->
            val longId = (id as? Long) ?: (id as? String)?.toLongOrNull()
            if (longId != null) {
                if (longId > 0) {
                    realCampaignValueIds.add(longId)
                } else {
                    // ID négatif = ID synthétique, reconvertir en addressId
// ... (tronqué, total 207 lignes)

Historique Git

868d6abb7 2025 -> 2026
961941b12 WIP : Valeurs des campagnes d'adresses
03502905d MarkdownBuilder échappe désormais les chaînes d'entrée.
8548c532b Grille AG : rendu multiligne, WIP campagnes d'adresses
4827c5769 WIP : sélection multiple (adresse et tout)