Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
linenumberstrue
collapsetrue
import { shortcut, store, extend } from '../../core';
import { ControlFilterModel } from './control.filter.model';
import './HTMLComponents/date-picker.js';
import './HTMLComponents/scale-selector.js';
import './HTMLComponents/date-range-picker.js';
import './HTMLComponents/date-range-scale-selector.js';
import { ErrorCode, RES_STATUS } from '../../contsant/index';

import { formatDate, getControlUsedMeasuresAndTableNames, setCssScale, setTransformScale } from '../../utils';

export interface ControlStringSingleProps {
    baseCls: string;
    $testId: string;
    height: number;
    width?: number;
    isPreviewMode: boolean;
    cssScaleGetter: () => number;
}

@shortcut()
@store(ControlFilterModel)
export class ControlDateIntervalFilter extends BI.Widget  {
    static xtype = 'bi.custom.date.dateslider';

    static EVENT = {
        EVENT_CHANGE: 'EVENT_CHANGE',
    };

    props: ControlStringSingleProps = {
        baseCls: 'bi-date-interval-control',
        $testId: 'bi-date-interval-control',
        isPreviewMode: false, // 是否是预览
        cssScaleGetter: () => 1,
    };

    model: ControlFilterModel['model'];
    store: ControlFilterModel['store'];



    watch = {
        disabled: () => {},
    };
    setMinMaxDate() {
        this.element[0].setAttribute('min-date',this.minData||'2022-01-01');
        this.element[0].setAttribute('max-date',this.maxData||'2022-12-01');

        console.log("setting minmax",this.minData,this.maxData);
    }

    mounted() {
        console.log('hello world1234',this);

        this.getMinMaxDate();
        //this.setValue(this.model.widgetHelper?.getResultWidgetValue(true, this.model.value) ?? this.model.value);
        try{
          this.element[0].closest('.bi-show-widget-factory.bi-control-widget,.bi-abs.bi-control-widget.bi-card').style.setProperty("overflow","visible");
        }catch(e){}
        try{
          this.element[0].closest('.bi-fit-widget.bi-export-widget').style.setProperty("z-index","100");
        }catch(e){}
        this.element[0].style.setProperty('height','24px');
        setTimeout(()=>{
       // this.element[0].style.setProperty('position',"absolute");
        this.element[0].style.setProperty('top',"0");
        this.element[0].style.setProperty('left',"0");
        this.element[0].style.setProperty('right',"0");
        this.element[0].style.setProperty('bottom',"0");
        this.element[0].style.setProperty('height','100%');

        this.element[0].style.setProperty('--scale-text-color','#2c60db');
        this.element[0].style.setProperty('--scale-border-color', '#2c60db');
        this.element[0].style.setProperty('--scale-tick-color', '#2c60db');
        this.element[0].style.setProperty('--collapse-btn-color', '#2c60db');
        this.element[0].style.setProperty('--collapse-icon-color', '#2c60db');
        this.element[0].style.setProperty('--collapse-btn-color-hover', '#2c60db');
        this.element[0].style.setProperty('--background-item-color', '#f2f7fe');
        this.element[0].style.setProperty('--higher-periods-active-color', '#cde1fc');
        },200)


    }

    _defaultConfig() {
        console.log('default config 4');
        const conf = super._defaultConfig(...arguments);
        return extend(conf, {
            baseCls: ``,
            el: null,
            tagName: 'date-range-scale-selector',

            listeners: [
            {
                eventName: 'range-changed',
                action(e) {
                  //  console.log("here we got message from ",e);
                  //  this.fireEvent(ControlDateInterval.EVENT.EVENT_CHANGE, {start:e.startDate,end:e.endDate});
                },
            }
            ],
        });
    }
    date_value_to_str(v){
        if(v==undefined)return undefined;
        let p0=(x)=>`${x<10?'0':''}${x}`;
        return `${p0(v.year)}-${p0(v.month)}-${p0(v.day)}`;
    }

    // 获取最早最晚日期
    private getMinMaxDate(): Promise<{minData: any, maxData: any}> {
        console.log('test', this.model)

        return BI.Utils.getControlDefaultValueByWidgetInfo([
            {...this.getRequestParams(), originDefaultValue: 1, measuresConfig: []}
        ], this.model.templateHelper).then((minRes) => {
            const minData = minRes.data;
            console.log('最早日期', minData);

            // 返回第二个请求的Promise
            return BI.Utils.getControlDefaultValueByWidgetInfo(
                [{...this.getRequestParams(), originDefaultValue: 2, measuresConfig: []}], this.model.templateHelper).then((maxRes) => {
                const maxData = maxRes.data;
                this.minData=this.date_value_to_str(minData[Object.keys(minData)[0]].value);
                this.maxData=this.date_value_to_str(maxData[Object.keys(maxData)[0]].value);
                //console.log('min-max',this.date_value_to_str,this.date_value_to_str(minData[Object.keys(minData)[0]].value),  this.model,   this.model.minData,  maxData[Object.keys(maxData)[0]],maxData[Object.keys(maxData)[0]].value, this.model.maxData,Object.keys(minData)[0],minData);
                if(this.element){
                    this.element[0].setAttribute('min-date', this.minData);
                    this.element[0].setAttribute('max-date', this.maxData);
                }
                return { minData, maxData };
            });
        }).catch((error) => {
            console.error('获取日期范围失败:', error);
        });
    }

    // 获取请求参数
    private getRequestParams () {
        const measurePoolHelper = this.model.templateHelper.getMeasurePoolHelper();
        const measureHelper = measurePoolHelper.getMeasureHelper();
        // 未保存时 dimensions 和 widget 不一样
        let fieldIds: string[] = [];
        BI.each(this.model.dimensions, (_, dimension) => {
        const { fieldId, sort } = dimension;

        fieldIds = [...fieldIds, fieldId, ...measureHelper.getAllUsedCalTargets(fieldId)];

        if (sort?.targetFieldId) {
            fieldIds = [
                ...fieldIds,
                sort.targetFieldId,
                ...measureHelper.getAllUsedCalTargets(sort.targetFieldId),
            ];
        }
        });

        const { measures, generaTableNames } = getControlUsedMeasuresAndTableNames(fieldIds, measureHelper);
        console.log('test11', measures, this.model);
        const tableNames = this.model.selectedTable;
        const relationTableNames = BI.flatten(
            this.model.templateHelper.getPoolHelper().getRelationModelByTableNames(tableNames)
        );

        return {
            wId: this.model.wId,
            dimensions: this.model.dimensions,
            view: this.model.view,
            value: this.model.value,
            type: this.model.type,
            tableName: BI.uniq(
                BI.concat(
                    tableNames,
                    generaTableNames.filter(tableName => relationTableNames.includes(tableName))
                )
            ),
            measuresConfig: [],
            dateIntervalValue: this.model.dateIntervalValue,
            useDateInterval: this.model.useDateInterval,
            showTime: this.model.showTime,
        };
    }
    render() {
        // const { width, height, isPreviewMode } = this.options;
      //  super.render();
        console.log("   this.element",this.element,JSON.stringify(this.model.value));

        this.element.attr({"min-date":'2020-01-01',
                "max-date":'2026-01-01',
                'granularity':"month",
                "start-date":this.date_value_to_str(this.model.value?.start?.value)||'2022-01-01',
                "end-date":this.date_value_to_str(this.model.value?.end?.value)||'2022-12-01',
                'week-numbering':'ISO', 'first-day-of-week':'1'});
        this.element.on("range-changed",(e:any)=>{
            console.log("got event e",e);
            let ev={start:e.originalEvent.detail.startDate,end:e.originalEvent.detail.endDate,};
            ev.start=ev.start.split("T")[0];
            ev.end=ev.end.split("T")[0];
            if((ev.start=="")||(ev.end=="")){
                console.log("fire null");
                this.fireEvent(ControlDateIntervalFilter.EVENT.EVENT_CHANGE, null);
                return;
            }
            ev.start={
                type:1,value:{
                day:parseInt(ev.start.split("-")[2]),
                month:parseInt(ev.start.split("-")[1]),
                year:parseInt(ev.start.split("-")[0])}
            }
            ev.end={
                type:1,value:{
                day:parseInt(ev.end.split("-")[2]),
                month:parseInt(ev.end.split("-")[1]),
                year:parseInt(ev.end.split("-")[0])}
            }
             this.model.collapse=e.originalEvent.detail.collapse;
             this.model.granularity=e.originalEvent.detail.granularity;
            console.log("fire ",ev);
             this.fireEvent(ControlDateIntervalFilter.EVENT.EVENT_CHANGE, ev);

        }) ;
        console.log("-------------------------->",this.element,this.options);

          this.element[0].style.overflow="visible";
          this.element[0].style.height="24px";

    }

    setValue(v?: any) {
        console.log("Somebody wants from us to set Value",v);
        if(v.start){
         this.element[0].setAttribute('start-date',this.date_value_to_str(v.start.value));
        }
        if(v.end){
         this.element[0].setAttribute('end-date',this.date_value_to_str(v.end.value));
        }
    }

    getValue() {}

    reset() {
        this.setValue();
    }

    _itemsCreator(options: { type: number }, callback: Function) {
        console.log('hello this.model', this.model);

        if (this.model?.useCustom && BI.isNotEmptyArray(this.model?.customValue)) {
            // 使用自定义值列表时
            callback({
                items: this.createItemsByData(this.model?.customValue, options, true),
            });
        } else if (BI.size(this.model?.dimensions) === 0) {
            callback([]);
        } else {
            console.log('hello data');
            BI.Utils.getControlWidgetDataByWidgetConfig(
                this.model?.widgetConfig,
                (res: any) => {
                    const { data = { value: [], hasNext: false }, errorCode } = res;
                    console.log('data11@@', data, res);
                    if (errorCode === ErrorCode.STRING_SEARCH_OUT_OF_LIMIT) {
                        callback({
                            tipText: BI.i18nText('BI-Design_Search_Result_More_Than_10000'),
                        });

                        return;
                    }
                    if (errorCode === RES_STATUS.CACHE_MISS) {
                        callback({
                            tipText: BI.i18nText('BI-Conf_Cache_Loading_Retry_Later'),
                        });

                        return;
                    }
                    if (options.type === BI.MultiSelectCombo.REQ_GET_ALL_DATA) {
                        callback({
                            items: this.createItemsByData(data.value, options),
                        });

                        return;
                    }

                    if (options.type === BI.MultiSelectCombo.REQ_GET_DATA_LENGTH) {
                        callback({ count: data.value });

                        return;
                    }

                    callback({
                        items: this.createItemsByData(data.value, options),
                        hasNext: data.hasNext,
                    });
                },
                { textOptions: options },
                null,
                this.model.templateHelper
            );
        }
    }

    private setScale(el: any) {
        /*const { cssScaleGetter } = this.options;

        setCssScale(el, cssScaleGetter());
        setTransformScale(el, this.model.templateHelper.getReportScale());*/
    }

    private createItemsByData(valueArray: string[], options: Obj, isCustomValue = false) {
        console.log('valurArray', valueArray, options, isCustomValue);
        return createControlWidgetItemsByData(
            valueArray,
            options.keywords || [],
            options.selectedValues || [],
            isCustomValue
        );
    }

}

在这里,如果还有任何的问题,欢迎参考浏览David.Feng-冯存 https://github.com/finereport-overseas/plugin-bi-custom-filter-widget - 代码管理 以及对应的文档 自定义过滤控件整体介绍 - 3.2 研发测试组 - 知识管理。这里提供了示例的自定义过滤控件的完整代码和对应的说明。