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 · Role: Plugin Registration · Source: plugins/org.projectforge.plugins.marketing/src/main/kotlin/org/projectforge/plugins/marketing/rest/AddressCampaignValueMultiSelectedPageRest.kt 229 lines · 172 code · 35 comments · 22 blank
REST API endpoint for AddressCampaignValueMultiSelected. Handles HTTP requests and returns JSON responses for the React frontend.

Code Structure

Annotations: RequestMapping, PostConstruct, RestController, Autowired

Classes: AddressCampaignValueMultiSelectedPageRest

Supertype(s): AbstractMultiSelectedPage

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

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

Imports: 17 packages

Package: org.projectforge.plugins.marketing.rest

Source Code (abridged)

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


/**
 * Mass update after selection.
 */
@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>,
    ) {
        /*
              // Heading
          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")
            )
        }

        // Split selected IDs into positive (existing campaign values) and negative (address IDs)
        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 {
                    // Negative ID = synthetic ID, convert back to addressId
// ... (truncated, total 207 lines)

Git History

868d6abb7 2025 -> 2026
961941b12 WIP: Address campaign values
03502905d MarkdownBuilder escapes now the input strings.
8548c532b AG grid: multilineCell-Renderer, WIP address campaigns
4827c5769 WIP: multi selection (address and all)