EN · DE · RU · FR · ES

#201: AddressCampaignValueMultiSelectedPageRest.kt

plugins/org.projectforge.plugins.marketing/src/main/kotlin/org/projectforge/plugins/marketing/rest/AddressCampaignValueMultiSelectedPageRest.kt Tipo: Kotlin · Rol: Registro de Plugin · Fuente: plugins/org.projectforge.plugins.marketing/src/main/kotlin/org/projectforge/plugins/marketing/rest/AddressCampaignValueMultiSelectedPageRest.kt 229 líneas · 172 código · 35 comentarios · 22 en blanco
Endpoint de la API REST para AddressCampaignValueMultiSelected. Maneja solicitudes HTTP y devuelve respuestas JSON para el frontend React.

Estructura del Código

Anotaciones: RequestMapping, PostConstruct, RestController, Autowired

Clases: AddressCampaignValueMultiSelectedPageRest

Super-tipo(s): AbstractMultiSelectedPage

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

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

Importaciones: 17 paquetes

Paquete: org.projectforge.plugins.marketing.rest

Código Fuente (resumido)

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


/**
 * Actualización masiva después de la selección.
 */
@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>,
    ) {
        /*
              // Encabezado
          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")
            )
        }

        // Dividir IDs seleccionados en positivos (valores de campaña existentes) y negativos (IDs de dirección)
        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 negativo = ID sintético, convertir de vuelta a addressId
// ... (truncado, total 207 líneas)

Historial Git

868d6abb7 2025 -> 2026
961941b12 WIP: Valores de campaña de dirección
03502905d MarkdownBuilder ahora escapa las cadenas de entrada.
8548c532b AG grid: renderizador de celdas multilínea, WIP campañas de dirección
4827c5769 WIP: selección múltiple (dirección y todo)