Files
lucia-frontend/src/components/Discover/Conformance/ConformanceSidebar.vue
2026-03-06 18:57:58 +08:00

1633 lines
58 KiB
Vue

<template>
<section class="h-full shadow-[1px_0px_4px_rgba(0,0,0,0.25)] bg-neutral-100 absolute inset-y-0 left-0 z-10"
:class="!notShowActList ? (isShowBarOpen ? 'w-full' : 'w-[312px]') : 'w-[312px]'">
<!-- header -->
<div class="bg-neutral-200 px-4">
<p class="h2">{{ i18next.t("Conformance.RuleSettings") }}</p>
</div>
<!-- contanier -->
<div class="p-4 h-[calc(100%_-_40px)] flex">
<div class="h-full flex flex-col justify-between w-[280px]">
<!-- select -->
<div class="h-full overflow-y-auto scrollbar w-[280px]">
<!-- radio group -->
<ConformanceRadioGroup></ConformanceRadioGroup>
<!-- show and hidden button -->
<div v-if="!notShowActList" class="flex items-center justify-between mr-1"
:class="isShowBarOpen ? 'text-primary' : ''">
<p class="h2">{{ i18next.t("Conformance.ActivitySelector") }}</p>
<span id="cyp-showbaricon" class="material-symbols-outlined cursor-pointer duration-300
hover:bg-primary/50 hover:rounded"
@click="isShowBarOpen = !isShowBarOpen">
{{ isShowBarOpen ? 'keyboard_double_arrow_right' : 'keyboard_double_arrow_left' }}
</span>
</div>
<!-- select result -->
<ConformanceSelectResult
:isSubmit="isAlreadySubmit"
:isSubmitTask="isSubmitTask"
:isSubmitStartAndEnd="isSubmitStartAndEnd"
:isSubmitCfmSeqDirectly="isSubmitCfmSeqDirectly"
:isSubmitCfmSeqEventually="isSubmitCfmSeqEventually"
:isSubmitDurationData="isSubmitDurationData"
:isSubmitCfmPtEteStart="isSubmitCfmPtEteStart"
:isSubmitCfmPtEteEnd="isSubmitCfmPtEteEnd"
:isSubmitCfmPtEteSE="isSubmitCfmPtEteSE"
:isSubmitCfmPtPStart="isSubmitCfmPtPStart"
:isSubmitCfmPtPEnd="isSubmitCfmPtPEnd"
:isSubmitCfmPtPSE="isSubmitCfmPtPSE"
:isSubmitCfmWtEteStart="isSubmitCfmWtEteStart"
:isSubmitCfmWtEteEnd="isSubmitCfmWtEteEnd"
:isSubmitCfmWtEteSE="isSubmitCfmWtEteSE"
:isSubmitCfmWtPStart="isSubmitCfmWtPStart"
:isSubmitCfmWtPEnd="isSubmitCfmWtPEnd"
:isSubmitCfmWtPSE="isSubmitCfmWtPSE"
:isSubmitCfmCtEteStart="isSubmitCfmCtEteStart"
:isSubmitCfmCtEteEnd="isSubmitCfmCtEteEnd"
:isSubmitCfmCtEteSE="isSubmitCfmCtEteSE"
></ConformanceSelectResult>
<!-- Time Range -->
<ConformanceTimeRange
@min-total-seconds="minTotalSeconds"
@max-total-seconds="maxTotalSeconds"
:isSubmitDurationTime="isSubmitDurationTime"
:isSubmitTimeCfmPtEteAll="isSubmitTimeCfmPtEteAll"
:isSubmitTimeCfmPtEteStart="isSubmitTimeCfmPtEteStart"
:isSubmitTimeCfmPtEteEnd="isSubmitTimeCfmPtEteEnd"
:isSubmitTimeCfmPtEteSE="isSubmitTimeCfmPtEteSE"
:isSubmitTimeCfmPtPStart="isSubmitTimeCfmPtPStart"
:isSubmitTimeCfmPtPEnd="isSubmitTimeCfmPtPEnd"
:isSubmitTimeCfmPtPSE="isSubmitTimeCfmPtPSE"
:isSubmitTimeCfmWtEteAll="isSubmitTimeCfmWtEteAll"
:isSubmitTimeCfmWtEteStart="isSubmitTimeCfmWtEteStart"
:isSubmitTimeCfmWtEteEnd="isSubmitTimeCfmWtEteEnd"
:isSubmitTimeCfmWtEteSE="isSubmitTimeCfmWtEteSE"
:isSubmitTimeCfmWtPStart="isSubmitTimeCfmWtPStart"
:isSubmitTimeCfmWtPEnd="isSubmitTimeCfmWtPEnd"
:isSubmitTimeCfmWtPSE="isSubmitTimeCfmWtPSE"
:isSubmitTimeCfmCtEteAll="isSubmitTimeCfmCtEteAll"
:isSubmitTimeCfmCtEteStart="isSubmitTimeCfmCtEteStart"
:isSubmitTimeCfmCtEteEnd="isSubmitTimeCfmCtEteEnd"
:isSubmitTimeCfmCtEteSE="isSubmitTimeCfmCtEteSE"
></ConformanceTimeRange>
</div>
<!-- buttons -->
<div class="space-x-4 p-4 flex justify-center items-content border-t border-neutral-300">
<button type="button" class="btn btn-sm btn-neutral" @click="reset">
{{ i18next.t("Global.Clear")}}
</button>
<button id="btn_apply_conformance" type="button" class="btn btn-sm "
@click="submitConformance"
:class="isMainBtnDisabled ? 'btn-disable' : 'btn-neutral'"
:disabled="isApplyBtnDisabled"
>
{{ i18next.t("Global.Apply") }}
</button>
</div>
</div>
<!-- show bar -->
<ConformanceShowBar v-if="!notShowActList" :class="isShowBarOpen?'':'hidden'"
:isSubmit="isAlreadySubmit"
:isSubmitTask="isSubmitTask"
:isSubmitStartAndEnd="isSubmitStartAndEnd"
:isSubmitCfmSeqDirectly="isSubmitCfmSeqDirectly"
:isSubmitCfmSeqEventually="isSubmitCfmSeqEventually"
:isSubmitDurationData="isSubmitDurationData"
:isSubmitCfmPtEteStart="isSubmitCfmPtEteStart"
:isSubmitCfmPtEteEnd="isSubmitCfmPtEteEnd"
:isSubmitCfmPtEteSE="isSubmitCfmPtEteSE"
:isSubmitCfmPtPStart="isSubmitCfmPtPStart"
:isSubmitCfmPtPEnd="isSubmitCfmPtPEnd"
:isSubmitCfmPtPSE="isSubmitCfmPtPSE"
:isSubmitCfmWtEteStart="isSubmitCfmWtEteStart"
:isSubmitCfmWtEteEnd="isSubmitCfmWtEteEnd"
:isSubmitCfmWtEteSE="isSubmitCfmWtEteSE"
:isSubmitCfmWtPStart="isSubmitCfmWtPStart"
:isSubmitCfmWtPEnd="isSubmitCfmWtPEnd"
:isSubmitCfmWtPSE="isSubmitCfmWtPSE"
:isSubmitCfmCtEteStart="isSubmitCfmCtEteStart"
:isSubmitCfmCtEteEnd="isSubmitCfmCtEteEnd"
:isSubmitCfmCtEteSE="isSubmitCfmCtEteSE"
:isSubmitShowDataSeq="isSubmitShowDataSeq"
:isSubmitShowDataPtEte="isSubmitShowDataPtEte"
:isSubmitShowDataPtP="isSubmitShowDataPtP"
:isSubmitShowDataWtEte="isSubmitShowDataWtEte"
:isSubmitShowDataWtP="isSubmitShowDataWtP"
:isSubmitShowDataCt="isSubmitShowDataCt"
></ConformanceShowBar>
</div>
</section>
</template>
<script setup>
// The Lucia project.
// Copyright 2023-2026 DSP, inc. All rights reserved.
// Authors:
// chiayin.kuo@dsp.im (chiayin), 2023/1/31
// imacat.yang@dsp.im (imacat), 2023/9/23
// cindy.chang@dsp.im (Cindy Chang), 2024/5/30
/**
* @module components/Discover/Conformance/ConformanceSidebar
* Main sidebar for conformance checking with rule
* configuration, activity selection, and submit/reset
* actions.
*/
import { ref, computed, watch, onBeforeUnmount } from 'vue';
import { storeToRefs } from 'pinia';
import { useToast } from 'vue-toast-notification';
import i18next from '@/i18n/i18n';
import emitter from '@/utils/emitter';
import { useConformanceInputStore } from '@/stores/conformanceInput';
import { useLoadingStore } from '@/stores/loading';
import { useConformanceStore } from '@/stores/conformance';
import ConformanceRadioGroup from './ConformanceSidebar/ConformanceRadioGroup.vue';
import ConformanceShowBar from './ConformanceSidebar/ConformanceShowBar.vue';
import ConformanceTimeRange from './ConformanceSidebar/ConformanceTimeRange.vue';
import ConformanceSelectResult from './ConformanceSidebar/ConformanceSelectResult.vue';
const $toast = useToast();
const loadingStore = useLoadingStore();
const conformanceStore = useConformanceStore();
const conformanceInputStore = useConformanceInputStore();
const { isLoading } = storeToRefs(loadingStore);
const { selectedRuleType, selectedActivitySequence, selectedMode, selectedProcessScope,
selectedActSeqMore, selectedActSeqFromTo, conformanceAllTasks, cfmPtEteWhole,
cfmPtEteStart: cfmPtEteStartStore, cfmPtEteEnd: cfmPtEteEndStore, cfmPtEteSE,
cfmPtPStart: cfmPtPStartStore, cfmPtPEnd: cfmPtPEndStore, cfmPtPSE,
cfmWtEteWhole, cfmWtEteStart: cfmWtEteStartStore, cfmWtEteEnd: cfmWtEteEndStore,
cfmWtEteSE, cfmWtPStart: cfmWtPStartStore, cfmWtPEnd: cfmWtPEndStore, cfmWtPSE,
cfmCtEteWhole, cfmCtEteStart: cfmCtEteStartStore, cfmCtEteEnd: cfmCtEteEndStore,
cfmCtEteSE, isStartSelected, isEndSelected,
conformanceRuleData, conformanceLogCreateCheckId, conformanceFilterCreateCheckId,
conformanceTempReportData
} = storeToRefs(conformanceStore);
const { activityRadioData } = storeToRefs(conformanceInputStore);
// data
const isMainBtnDisabled = ref(true);
const isShowBarOpen = ref(false);
const selectConformanceTask = ref(null);
const selectConformanceStartAndEnd = ref(null); // Activity sequence
const selectCfmSeqStart = ref(null);
const selectCfmSeqEnd = ref(null);
const selectCfmSeqDirectly = ref([]);
const selectCfmSeqEventually = ref([]);
const selectDurationData = ref(null); // Activity duration
const selectDurationTime = ref({ min: 0, max: 0});
const selectTimeRangeMin = ref(0); // Time Range min
const selectTimeRangeMax = ref(0); // Time Range max
const selectCfmPtEteStart = ref(null); // Processing time
const selectCfmPtEteEnd = ref(null);
const selectCfmPtEteSEStart = ref(null);
const selectCfmPtEteSEEnd = ref(null);
const selectCfmPtPStart = ref(null);
const selectCfmPtPEnd = ref(null);
const selectCfmPtPSEStart = ref(null);
const selectCfmPtPSEEnd = ref(null);
const selectCfmWtEteStart = ref(null); // Waiting time
const selectCfmWtEteEnd = ref(null);
const selectCfmWtEteSEStart = ref(null);
const selectCfmWtEteSEEnd = ref(null);
const selectCfmWtPStart = ref(null);
const selectCfmWtPEnd = ref(null);
const selectCfmWtPSEStart = ref(null);
const selectCfmWtPSEEnd = ref(null);
const selectCfmCtEteStart = ref(null); // Cycle time
const selectCfmCtEteEnd = ref(null);
const selectCfmCtEteSEStart = ref(null);
const selectCfmCtEteSEEnd = ref(null);
const isAlreadySubmit = ref(false);
const isSubmittedData = ref(null); // 已 Apply 後,沒有重新改變規則的 Data
const isSubmitTask = ref(null);
const isSubmitStartAndEnd = ref(null); // Activity sequence
const isSubmitCfmSeqDirectly = ref([]);
const isSubmitCfmSeqEventually = ref([]);
const isSubmitDurationData = ref(null); // Activity duration
const isSubmitCfmPtEteStart = ref(null); // Processing time
const isSubmitCfmPtEteEnd = ref(null);
const isSubmitCfmPtEteSE = ref(null);
const isSubmitCfmPtPStart = ref(null);
const isSubmitCfmPtPEnd = ref(null);
const isSubmitCfmPtPSE = ref(null);
const isSubmitCfmWtEteStart = ref(null); // Waiting time
const isSubmitCfmWtEteEnd = ref(null);
const isSubmitCfmWtEteSE = ref(null);
const isSubmitCfmWtPStart = ref(null);
const isSubmitCfmWtPEnd = ref(null);
const isSubmitCfmWtPSE = ref(null);
const isSubmitCfmCtEteStart = ref(null); // Cycle time
const isSubmitCfmCtEteEnd = ref(null);
const isSubmitCfmCtEteSE = ref(null);
const isSubmitDurationTime = ref({ base: {}, rule: {}}); // Activity duration Time Range
const isSubmitTimeCfmPtEteAll = ref({ base: {}, rule: {}}); // Processing time Time Range
const isSubmitTimeCfmPtEteStart = ref({ base: {}, rule: {}});
const isSubmitTimeCfmPtEteEnd = ref({ base: {}, rule: {}});
const isSubmitTimeCfmPtEteSE = ref({ base: {}, rule: {}});
const isSubmitTimeCfmPtPStart = ref({ base: {}, rule: {}});
const isSubmitTimeCfmPtPEnd = ref({ base: {}, rule: {}});
const isSubmitTimeCfmPtPSE = ref({ base: {}, rule: {}});
const isSubmitTimeCfmWtEteAll = ref({ base: {}, rule: {}}); // Waiting time Time Range
const isSubmitTimeCfmWtEteStart = ref({ base: {}, rule: {}});
const isSubmitTimeCfmWtEteEnd = ref({ base: {}, rule: {}});
const isSubmitTimeCfmWtEteSE = ref({ base: {}, rule: {}});
const isSubmitTimeCfmWtPStart = ref({ base: {}, rule: {}});
const isSubmitTimeCfmWtPEnd = ref({ base: {}, rule: {}});
const isSubmitTimeCfmWtPSE = ref({ base: {}, rule: {}});
const isSubmitTimeCfmCtEteAll = ref({ base: {}, rule: {}}); // Cycle time Time Range
const isSubmitTimeCfmCtEteStart = ref({ base: {}, rule: {}});
const isSubmitTimeCfmCtEteEnd = ref({ base: {}, rule: {}});
const isSubmitTimeCfmCtEteSE = ref({ base: {}, rule: {}});
const isSubmitShowDataSeq = ref({
task: null,
taskStart: null,
taskEnd: null,
isStartSelected: null,
isEndSelected: null
}); // To Start & End 連動資料
const isSubmitShowDataPtEte = ref({
task: null,
taskStart: null,
taskEnd: null,
isStartSelected: null,
isEndSelected: null
});
const isSubmitShowDataPtP = ref({
task: null,
taskStart: null,
taskEnd: null,
isStartSelected: null,
isEndSelected: null
});
const isSubmitShowDataWtEte = ref({
task: null,
taskStart: null,
taskEnd: null,
isStartSelected: null,
isEndSelected: null
});
const isSubmitShowDataWtP = ref({
task: null,
taskStart: null,
taskEnd: null,
isStartSelected: null,
isEndSelected: null
});
const isSubmitShowDataCt = ref({
task: null,
taskStart: null,
taskEnd: null,
isStartSelected: null,
isEndSelected: null
});
// Map for dynamic field access in handleSimpleSelection
const selectFieldRefs = {
selectCfmPtEteStart,
selectCfmPtEteEnd,
selectCfmPtPStart,
selectCfmPtPEnd,
selectCfmWtEteStart,
selectCfmWtEteEnd,
selectCfmWtPStart,
selectCfmWtPEnd,
selectCfmCtEteStart,
selectCfmCtEteEnd,
};
// computed
const notShowActList = computed(() => {
return (selectedRuleType.value === 'Activity sequence' && selectedActivitySequence.value === 'Sequence'
&& (selectedMode.value === 'Short loop(s)' || selectedMode.value === 'Self loop(s)'))
|| (selectedRuleType.value === 'Processing time' && selectedProcessScope.value === 'End to end'
&& selectedActSeqMore.value === 'All')
|| (selectedRuleType.value === 'Waiting time' && selectedProcessScope.value === 'End to end'
&& selectedActSeqMore.value === 'All')
|| (selectedRuleType.value === 'Cycle time' && selectedProcessScope.value === 'End to end'
&& selectedActSeqMore.value === 'All')
});
/**
* Apply button is disabled or not
*/
const isApplyBtnDisabled = computed(() => {
let disabledBool = true;
switch (selectedRuleType.value) {
case 'Have activity':
disabledBool = checkHaveActivity();
break;
case 'Activity sequence':
disabledBool = checkActivitySequence();
break;
case 'Activity duration':
disabledBool = checkActivityDuration();
break;
case 'Processing time':
disabledBool = checkProcessingTime();
break;
case 'Waiting time':
disabledBool = checkWaitingTime();
break;
case 'Cycle time':
disabledBool = checkCycleTime();
break;
default:
break;
}
isMainBtnDisabled.value = disabledBool;
return isMainBtnDisabled.value;
});
// watch
watch(isSubmittedData, (newValue) => {
isSubmittedData.value = newValue;
});
// 打開 rule 檔要顯示儲存的選項、規則、時間
watch(conformanceTempReportData, (newValue) => {
setTimeout(() => {
if(newValue !== null) {
const rule = newValue.rule;
isSubmittedData.value = newValue.rule;
isAlreadySubmit.value = true;
switch (rule.type) {
case 'contains-tasks': // Rule Type 選 Have activity 的行為
selectedRuleType.value = 'Have activity';
isSubmitTask.value = rule.tasks;
break;
case 'start-end': // Rule Type 選 Activity sequence 的行為
selectedRuleType.value = 'Activity sequence';
selectedActivitySequence.value = 'Start & End';
isSubmitStartAndEnd.value = [
{category: 'Start', task: rule.starts_with},
{category: 'End', task: rule.ends_with},
];
break;
case 'directly-follows': // Activity Sequence 選 Sequence 的行為
selectedRuleType.value = 'Activity sequence';
selectedActivitySequence.value = 'Sequence';
selectedMode.value = 'Directly follows';
isSubmitCfmSeqDirectly.value = rule.task_seq;
break;
case 'eventually-follows':
selectedRuleType.value = 'Activity sequence';
selectedActivitySequence.value = 'Sequence';
selectedMode.value = 'Eventually follows';
isSubmitCfmSeqEventually.value = rule.task_seq;
break;
case 'short-loops':
selectedRuleType.value = 'Activity sequence';
selectedActivitySequence.value = 'Sequence';
selectedMode.value = 'Short loop(s)';
break;
case 'self-loops':
selectedRuleType.value = 'Activity sequence';
selectedActivitySequence.value = 'Sequence';
selectedMode.value = 'Self loop(s)';
break;
case 'task-duration': // Rule Type 選 Activity duration 的行為
selectedRuleType.value = 'Activity duration';
selectDurationData.value = [rule.task];
isSubmitDurationData.value = [rule.task];
isSubmitDurationTime.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'processing-time-end-to-end-whole': // Rule Type 選 Processing time 的行為
selectedRuleType.value = 'Processing time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'All';
isSubmitTimeCfmPtEteAll.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'processing-time-end-to-end-starts-with':
selectedRuleType.value = 'Processing time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'Start';
selectCfmPtEteStart.value = rule.task;
isSubmitCfmPtEteStart.value = [
{category: 'Start', task: rule.task}
];
isSubmitTimeCfmPtEteStart.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'processing-time-end-to-end-ends-with':
selectedRuleType.value = 'Processing time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'End';
selectCfmPtEteEnd.value = rule.task;
isSubmitCfmPtEteEnd.value = [
{category: 'End', task: rule.task}
];
isSubmitTimeCfmPtEteEnd.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'processing-time-end-to-end-start-end':
selectedRuleType.value = 'Processing time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'Start & End';
isSubmitCfmPtEteSE.value = [
{category: 'Start', task: rule.start},
{category: 'End', task: rule.end}
];
isSubmitTimeCfmPtEteSE.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
isSubmitShowDataPtEte.value = setSubmitShowDataByStartEnd(rule.start, rule.end);
break;
case 'processing-time-partial-starts-with':
selectedRuleType.value = 'Processing time';
selectedProcessScope.value = 'Partial';
selectedActSeqFromTo.value = 'From';
selectCfmPtPStart.value = rule.task;
isSubmitCfmPtPStart.value = [
{category: 'From', task: rule.task}
];
isSubmitTimeCfmPtPStart.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'processing-time-partial-ends-with':
selectedRuleType.value = 'Processing time';
selectedProcessScope.value = 'Partial';
selectedActSeqFromTo.value = 'To';
selectCfmPtPEnd.value = rule.task;
isSubmitCfmPtPEnd.value = [
{category: 'To', task: rule.task}
];
isSubmitTimeCfmPtPEnd.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'processing-time-partial-start-end':
selectedRuleType.value = 'Processing time';
selectedProcessScope.value = 'Partial';
selectedActSeqFromTo.value = 'From & To';
isSubmitCfmPtPSE.value = [
{category: 'From', task: rule.start},
{category: 'To', task: rule.end}
];
isSubmitTimeCfmPtPSE.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
isSubmitShowDataPtP.value = setSubmitShowDataByStartEnd(rule.start, rule.end);
break;
case 'waiting-time-end-to-end-whole': // Rule Type 選 Waiting time 的行為
selectedRuleType.value = 'Waiting time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'All';
isSubmitTimeCfmWtEteAll.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'waiting-time-end-to-end-starts-with':
selectedRuleType.value = 'Waiting time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'Start';
selectCfmWtEteStart.value = rule.task;
isSubmitCfmWtEteStart.value = [
{category: 'Start', task: rule.task}
];
isSubmitTimeCfmWtEteStart.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'waiting-time-end-to-end-ends-with':
selectedRuleType.value = 'Waiting time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'End';
selectCfmWtEteEnd.value = rule.task;
isSubmitCfmWtEteEnd.value = [
{category: 'End', task: rule.task}
];
isSubmitTimeCfmWtEteEnd.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'waiting-time-end-to-end-start-end':
selectedRuleType.value = 'Waiting time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'Start & End';
isSubmitCfmWtEteSE.value = [
{category: 'Start', task: rule.start},
{category: 'End', task: rule.end}
];
isSubmitTimeCfmWtEteSE.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
isSubmitShowDataWtEte.value = setSubmitShowDataByStartEnd(rule.start, rule.end);
break;
case 'waiting-time-partial-starts-with':
selectedRuleType.value = 'Waiting time';
selectedProcessScope.value = 'Partial';
selectedActSeqFromTo.value = 'From';
selectCfmWtPStart.value = rule.task;
isSubmitCfmWtPStart.value = [
{category: 'From', task: rule.task}
];
isSubmitTimeCfmWtPStart.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'waiting-time-partial-ends-with':
selectedRuleType.value = 'Waiting time';
selectedProcessScope.value = 'Partial';
selectedActSeqFromTo.value = 'To';
selectCfmWtPEnd.value = rule.task;
isSubmitCfmWtPEnd.value = [
{category: 'To', task: rule.task}
];
isSubmitTimeCfmWtPEnd.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'waiting-time-partial-start-end':
selectedRuleType.value = 'Waiting time';
selectedProcessScope.value = 'Partial';
selectedActSeqFromTo.value = 'From & To';
isSubmitCfmWtPSE.value = [
{category: 'From', task: rule.start},
{category: 'To', task: rule.end}
];
isSubmitTimeCfmWtPSE.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
isSubmitShowDataWtP.value = setSubmitShowDataByStartEnd(rule.start, rule.end);
break;
case 'cycle-time-end-to-end-whole': // Rule Type 選 Cycle time 的行為
selectedRuleType.value = 'Cycle time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'All';
isSubmitTimeCfmCtEteAll.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'cycle-time-end-to-end-starts-with':
selectedRuleType.value = 'Cycle time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'Start';
selectCfmCtEteStart.value = rule.task;
isSubmitCfmCtEteStart.value = [
{category: 'Start', task: rule.task}
];
isSubmitTimeCfmCtEteStart.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'cycle-time-end-to-end-ends-with':
selectedRuleType.value = 'Cycle time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'End';
selectCfmCtEteEnd.value = rule.task;
isSubmitCfmCtEteEnd.value = [
{category: 'End', task: rule.task}
];
isSubmitTimeCfmCtEteEnd.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
break;
case 'cycle-time-end-to-end-start-end':
selectedRuleType.value = 'Cycle time';
selectedProcessScope.value = 'End to end';
selectedActSeqMore.value = 'Start & End';
isSubmitCfmCtEteSE.value = [
{category: 'Start', task: rule.start},
{category: 'End', task: rule.end}
];
isSubmitTimeCfmCtEteSE.value = {
base: newValue.charts.time.x_axis,
rule: { min: rule.min, max: rule.max},
};
isSubmitShowDataCt.value = setSubmitShowDataByStartEnd(rule.start, rule.end);
break;
}
}
}, 300);
});
// methods
/**
* get min total seconds
* @param {number} e - The minimum total seconds.
*/
function minTotalSeconds(e) {
selectTimeRangeMin.value = e;
}
/**
* get min total seconds
* @param {number} e - The maximum total seconds.
*/
function maxTotalSeconds(e) {
selectTimeRangeMax.value = e;
}
/**
* select Time Reset
*/
function selectTimeReset() {
// 不包含 selectDurationTime
selectConformanceTask.value = null; // Have activity
selectConformanceStartAndEnd.value = null; // Activity Sequence
selectCfmSeqStart.value = null;
selectCfmSeqEnd.value = null;
selectCfmSeqDirectly.value = [];
selectCfmSeqEventually.value = [];
selectDurationData.value = null; // Activity durations
selectTimeRangeMin.value = 0; // Time Range min
selectTimeRangeMax.value = 0; // Time Range max
selectCfmPtEteStart.value = null; // Processing time
selectCfmPtEteEnd.value = null;
selectCfmPtEteSEStart.value = null;
selectCfmPtEteSEEnd.value = null;
selectCfmPtPStart.value = null;
selectCfmPtPEnd.value = null;
selectCfmPtPSEStart.value = null;
selectCfmPtPSEEnd.value = null;
selectCfmWtEteStart.value = null; // Waiting time
selectCfmWtEteEnd.value = null;
selectCfmWtEteSEStart.value = null;
selectCfmWtEteSEEnd.value = null;
selectCfmWtPStart.value = null;
selectCfmWtPEnd.value = null;
selectCfmWtPSEStart.value = null;
selectCfmWtPSEEnd.value = null;
selectCfmCtEteStart.value = null; // Cycle time
selectCfmCtEteEnd.value = null;
selectCfmCtEteSEStart.value = null;
selectCfmCtEteSEEnd.value = null;
}
/**
* is submit select Reset
*/
function isSubmitReset() {
// 不包含 isSubmittedData
isSubmitTask.value = null;
isSubmitStartAndEnd.value = null;
isSubmitCfmSeqDirectly.value = [];
isSubmitCfmSeqEventually.value = [];
isSubmitDurationData.value = null;
isSubmitDurationTime.value = { base: {}, rule: {}};
isSubmitCfmPtEteStart.value = null; // Processing time
isSubmitCfmPtEteEnd.value = null;
isSubmitCfmPtEteSE.value = null;
isSubmitCfmPtPStart.value = null;
isSubmitCfmPtPEnd.value = null;
isSubmitCfmPtPSE.value = null;
isSubmitCfmWtEteStart.value = null; // Waiting time
isSubmitCfmWtEteEnd.value = null;
isSubmitCfmWtEteSE.value = null;
isSubmitCfmWtPStart.value = null;
isSubmitCfmWtPEnd.value = null;
isSubmitCfmWtPSE.value = null;
isSubmitCfmCtEteStart.value = null; // Cycle time
isSubmitCfmCtEteEnd.value = null;
isSubmitCfmCtEteSE.value = null;
isSubmitTimeCfmPtEteAll.value = { base: {}, rule: {}}; // Processing time Time Range
isSubmitTimeCfmPtEteStart.value = { base: {}, rule: {}};
isSubmitTimeCfmPtEteEnd.value = { base: {}, rule: {}};
isSubmitTimeCfmPtEteSE.value = { base: {}, rule: {}};
isSubmitTimeCfmPtPStart.value = { base: {}, rule: {}};
isSubmitTimeCfmPtPEnd.value = { base: {}, rule: {}};
isSubmitTimeCfmPtPSE.value = { base: {}, rule: {}};
isSubmitTimeCfmWtEteAll.value = { base: {}, rule: {}}; // Waiting time Time Range
isSubmitTimeCfmWtEteStart.value = { base: {}, rule: {}};
isSubmitTimeCfmWtEteEnd.value = { base: {}, rule: {}};
isSubmitTimeCfmWtEteSE.value = { base: {}, rule: {}};
isSubmitTimeCfmWtPStart.value = { base: {}, rule: {}};
isSubmitTimeCfmWtPEnd.value = { base: {}, rule: {}};
isSubmitTimeCfmWtPSE.value = { base: {}, rule: {}};
isSubmitTimeCfmCtEteAll.value = { base: {}, rule: {}}; // Cycle time Time Range
isSubmitTimeCfmCtEteStart.value = { base: {}, rule: {}};
isSubmitTimeCfmCtEteEnd.value = { base: {}, rule: {}};
isSubmitTimeCfmCtEteSE.value = { base: {}, rule: {}};
}
/**
* Clears all form selections and resets the sidebar state.
*/
function reset() {
// Results page Cover Plate(遮罩為 ture)
emitter.emit('coverPlate', true);
// is submit select Reset
isSubmitReset();
isSubmittedData.value = null; // 已 Apply 後,沒有重新改變規則的 Data
isAlreadySubmit.value = false;
// 其他子元件 reset
selectTimeReset();
emitter.emit('reset', null);
// reset 成功訊息
$toast.success(i18next.t("Conformance.RuleCleared"));
isShowBarOpen.value = true;
}
/**
* Sets linked Start & End data for activity selection.
* @param {string} start task
* @param {string} end task
* @returns {object}
*/
function setSubmitShowDataByStartEnd(start, end) {
if(isStartSelected.value) {
return {
task: start,
taskStart: start,
taskEnd: end,
isStartSelected:true,
isEndSelected: false
};
}else {
return {
task: end,
taskStart: start,
taskEnd: end,
isStartSelected:false,
isEndSelected: true
};
}
}
/**
* Submits the selected options via the Apply button and retrieves the Check ID.
*/
async function submitConformance() {
let dataToSave;
selectDurationTime.value = await {
min: selectTimeRangeMin.value,
max: selectTimeRangeMax.value
};
emitter.emit('timeRangeMaxMin', selectDurationTime.value);
switch (selectedRuleType.value) {
case 'Have activity': // Rule Type 選 Have activity 的行為
dataToSave = getHaveActivityData();
break;
case 'Activity sequence': // Rule Type 選 Activity sequence 的行為
dataToSave = getActivitySequenceData();
break;
case 'Activity duration': // Rule Type 選 Activity duration 的行為
dataToSave = getActivityDurationData();
break;
case 'Processing time': // Rule Type 選 Processing time 的行為
dataToSave = getProcessingTimeData();
break;
case 'Waiting time': // Rule Type 選 Waiting time 的行為
dataToSave = getWaitingTimeData();
break;
case 'Cycle time': // Rule Type 選 Cycle time 的行為
dataToSave = getCycleTimeData();
break;
}
if (dataToSave.min > dataToSave.max) {
return $toast.error(i18next.t("Conformance.PleaseCheckTimeRange"));
}
if (JSON.stringify(dataToSave) === JSON.stringify(isSubmittedData.value)) {
return $toast.error(i18next.t("Conformance.PleaseSetNewRule"));
}
isLoading.value = true;
isAlreadySubmit.value = true;
isSubmittedData.value = dataToSave; // 已 Apply 後,沒有重新改變規則的 Data
conformanceRuleData.value = dataToSave; // 給存檔的 Data
await conformanceStore.addConformanceCheckId(dataToSave);
await conformanceStore.getConformanceReport();
isShowBarOpen.value = false;
isLoading.value = false;
// Results page Cover Plate
emitter.emit('coverPlate', false);
$toast.success(i18next.t("Conformance.RuleApplied"));
}
/** Builds the data payload for the 'Have activity' rule.
* @returns {object} The rule data to submit.
*/
function getHaveActivityData() {
const dataToSave = {
type: 'contains-tasks',
tasks: selectConformanceTask.value,
};
isSubmitReset();
isSubmitTask.value = selectConformanceTask.value;
return dataToSave;
}
/** Builds the data payload for the 'Activity sequence' rule.
* @returns {object} The rule data to submit.
*/
function getActivitySequenceData() {
let dataToSave;
switch (selectedActivitySequence.value) {
case 'Start & End':
dataToSave = {
type: 'start-end',
starts_with: selectCfmSeqStart.value,
ends_with: selectCfmSeqEnd.value,
};
isSubmitReset();
isSubmitStartAndEnd.value = [
{ category: 'Start', task: selectCfmSeqStart.value },
{ category: 'End', task: selectCfmSeqEnd.value },
];
isSubmitShowDataSeq.value = setSubmitShowDataByStartEnd(selectCfmSeqStart.value, selectCfmSeqEnd.value);
break;
case 'Sequence':
dataToSave = getSequenceData();
break;
}
return dataToSave;
}
/** Builds the data payload for sequence sub-rules.
* @returns {object} The rule data to submit.
*/
function getSequenceData() {
let dataToSave;
switch (selectedMode.value) {
case 'Directly follows':
dataToSave = {
type: 'directly-follows',
task_seq: selectCfmSeqDirectly.value,
};
isSubmitReset();
isSubmitCfmSeqDirectly.value = JSON.parse(JSON.stringify(selectCfmSeqDirectly.value));
break;
case 'Eventually follows':
dataToSave = {
type: 'eventually-follows',
task_seq: selectCfmSeqEventually.value,
};
isSubmitReset();
isSubmitCfmSeqEventually.value = JSON.parse(JSON.stringify(selectCfmSeqEventually.value));
break;
case 'Short loop(s)':
dataToSave = { type: 'short-loops' };
break;
case 'Self loop(s)':
dataToSave = { type: 'self-loops' };
break;
}
return dataToSave;
}
/** Builds the data payload for the 'Activity duration' rule.
* @returns {object} The rule data to submit.
*/
function getActivityDurationData() {
const dataToSave = {
type: 'task-duration',
task: selectDurationData.value[0],
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
};
isSubmitReset();
isSubmitDurationData.value = selectDurationData.value;
isSubmitDurationTime.value.rule = selectDurationTime.value;
return dataToSave;
}
/** Builds the data payload for the 'Processing time' rule.
* @returns {object} The rule data to submit.
*/
function getProcessingTimeData() {
let dataToSave;
switch (selectedProcessScope.value) {
case 'End to end':
dataToSave = getEndToEndProcessingTimeData();
break;
case 'Partial':
dataToSave = getPartialProcessingTimeData();
break;
}
return dataToSave;
}
/** Builds end-to-end processing time rule data.
* @returns {object} The rule data to submit.
*/
function getEndToEndProcessingTimeData() {
let dataToSave;
switch (selectedActSeqMore.value) {
case 'All':
dataToSave = {
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'processing-time-end-to-end-whole',
};
isSubmitReset();
isSubmitTimeCfmPtEteAll.value.rule = selectDurationTime.value;
break;
case 'Start':
dataToSave = {
task: selectCfmPtEteStart.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'processing-time-end-to-end-starts-with',
};
isSubmitReset();
isSubmitCfmPtEteStart.value = [{ category: 'Start', task: selectCfmPtEteStart.value }];
isSubmitTimeCfmPtEteStart.value.rule = selectDurationTime.value;
break;
case 'End':
dataToSave = {
task: selectCfmPtEteEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'processing-time-end-to-end-ends-with',
};
isSubmitReset();
isSubmitCfmPtEteEnd.value = [{ category: 'End', task: selectCfmPtEteEnd.value }];
isSubmitTimeCfmPtEteEnd.value.rule = selectDurationTime.value;
break;
case 'Start & End':
dataToSave = {
start: selectCfmPtEteSEStart.value,
end: selectCfmPtEteSEEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'processing-time-end-to-end-start-end',
};
isSubmitReset();
isSubmitCfmPtEteSE.value = [
{ category: 'Start', task: selectCfmPtEteSEStart.value },
{ category: 'End', task: selectCfmPtEteSEEnd.value },
];
isSubmitTimeCfmPtEteSE.value.rule = selectDurationTime.value;
isSubmitShowDataPtEte.value = setSubmitShowDataByStartEnd(selectCfmPtEteSEStart.value, selectCfmPtEteSEEnd.value);
break;
}
return dataToSave;
}
/** Builds partial processing time rule data.
* @returns {object} The rule data to submit.
*/
function getPartialProcessingTimeData() {
let dataToSave;
switch (selectedActSeqFromTo.value) {
case 'From':
dataToSave = {
task: selectCfmPtPStart.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'processing-time-partial-starts-with',
};
isSubmitReset();
isSubmitCfmPtPStart.value = [{ category: 'From', task: selectCfmPtPStart.value }];
isSubmitTimeCfmPtPStart.value.rule = selectDurationTime.value;
break;
case 'To':
dataToSave = {
task: selectCfmPtPEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'processing-time-partial-ends-with',
};
isSubmitReset();
isSubmitCfmPtPEnd.value = [{ category: 'To', task: selectCfmPtPEnd.value }];
isSubmitTimeCfmPtPEnd.value.rule = selectDurationTime.value;
break;
case 'From & To':
dataToSave = {
start: selectCfmPtPSEStart.value ? selectCfmPtPSEStart.value : activityRadioData.value.task[0],
end: selectCfmPtPSEEnd.value ? selectCfmPtPSEEnd.value : activityRadioData.value.task[activityRadioData.value.task.length - 1],
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'processing-time-partial-start-end',
};
isSubmitReset();
isSubmitCfmPtPSE.value = [
{ category: 'From', task: selectCfmPtPSEStart.value },
{ category: 'To', task: selectCfmPtPSEEnd.value },
];
isSubmitTimeCfmPtPSE.value.rule = selectDurationTime.value;
isSubmitShowDataPtP.value = setSubmitShowDataByStartEnd(selectCfmPtPSEStart.value, selectCfmPtPSEEnd.value);
break;
}
return dataToSave;
}
/** Builds the data payload for the 'Waiting time' rule.
* @returns {object} The rule data to submit.
*/
function getWaitingTimeData() {
let dataToSave;
switch (selectedProcessScope.value) {
case 'End to end':
dataToSave = getEndToEndWaitingTimeData();
break;
case 'Partial':
dataToSave = getPartialWaitingTimeData();
break;
}
return dataToSave;
}
/** Builds end-to-end waiting time rule data.
* @returns {object} The rule data to submit.
*/
function getEndToEndWaitingTimeData() {
let dataToSave;
switch (selectedActSeqMore.value) {
case 'All':
dataToSave = {
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'waiting-time-end-to-end-whole',
};
isSubmitReset();
isSubmitTimeCfmWtEteAll.value.rule = selectDurationTime.value;
break;
case 'Start':
dataToSave = {
task: selectCfmWtEteStart.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'waiting-time-end-to-end-starts-with',
};
isSubmitReset();
isSubmitCfmWtEteStart.value = [{ category: 'Start', task: selectCfmWtEteStart.value }];
isSubmitTimeCfmWtEteStart.value.rule = selectDurationTime.value;
break;
case 'End':
dataToSave = {
task: selectCfmWtEteEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'waiting-time-end-to-end-ends-with',
};
isSubmitReset();
isSubmitCfmWtEteEnd.value = [{ category: 'End', task: selectCfmWtEteEnd.value }];
isSubmitTimeCfmWtEteEnd.value.rule = selectDurationTime.value;
break;
case 'Start & End':
dataToSave = {
start: selectCfmWtEteSEStart.value,
end: selectCfmWtEteSEEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'waiting-time-end-to-end-start-end',
};
isSubmitReset();
isSubmitCfmWtEteSE.value = [
{ category: 'Start', task: selectCfmWtEteSEStart.value },
{ category: 'End', task: selectCfmWtEteSEEnd.value },
];
isSubmitTimeCfmWtEteSE.value.rule = selectDurationTime.value;
isSubmitShowDataWtEte.value = setSubmitShowDataByStartEnd(selectCfmWtEteSEStart.value, selectCfmWtEteSEEnd.value);
break;
}
return dataToSave;
}
/** Builds partial waiting time rule data.
* @returns {object} The rule data to submit.
*/
function getPartialWaitingTimeData() {
let dataToSave;
switch (selectedActSeqFromTo.value) {
case 'From':
dataToSave = {
task: selectCfmWtPStart.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'waiting-time-partial-starts-with',
};
isSubmitReset();
isSubmitCfmWtPStart.value = [{ category: 'From', task: selectCfmWtPStart.value }];
isSubmitTimeCfmWtPStart.value.rule = selectDurationTime.value;
break;
case 'To':
dataToSave = {
task: selectCfmWtPEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'waiting-time-partial-ends-with',
};
isSubmitReset();
isSubmitCfmWtPEnd.value = [{ category: 'To', task: selectCfmWtPEnd.value }];
isSubmitTimeCfmWtPEnd.value.rule = selectDurationTime.value;
break;
case 'From & To':
dataToSave = {
start: selectCfmWtPSEStart.value,
end: selectCfmWtPSEEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'waiting-time-partial-start-end',
};
isSubmitReset();
isSubmitCfmWtPSE.value = [
{ category: 'From', task: selectCfmWtPSEStart.value },
{ category: 'To', task: selectCfmWtPSEEnd.value },
];
isSubmitTimeCfmWtPSE.value.rule = selectDurationTime.value;
isSubmitShowDataWtP.value = setSubmitShowDataByStartEnd(selectCfmWtPSEStart.value, selectCfmWtPSEEnd.value);
break;
}
return dataToSave;
}
/** Builds the data payload for the 'Cycle time' rule.
* @returns {object} The rule data to submit.
*/
function getCycleTimeData() {
let dataToSave;
switch (selectedActSeqMore.value) {
case 'All':
dataToSave = {
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'cycle-time-end-to-end-whole',
};
isSubmitReset();
isSubmitTimeCfmCtEteAll.value.rule = selectDurationTime.value;
break;
case 'Start':
dataToSave = {
task: selectCfmCtEteStart.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'cycle-time-end-to-end-starts-with',
};
isSubmitReset();
isSubmitCfmCtEteStart.value = [{ category: 'Start', task: selectCfmCtEteStart.value }];
isSubmitTimeCfmCtEteStart.value.rule = selectDurationTime.value;
break;
case 'End':
dataToSave = {
task: selectCfmCtEteEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'cycle-time-end-to-end-ends-with',
};
isSubmitReset();
isSubmitCfmCtEteEnd.value = [{ category: 'End', task: selectCfmCtEteEnd.value }];
isSubmitTimeCfmCtEteEnd.value.rule = selectDurationTime.value;
break;
case 'Start & End':
dataToSave = {
start: selectCfmCtEteSEStart.value,
end: selectCfmCtEteSEEnd.value,
min: selectDurationTime.value.min,
max: selectDurationTime.value.max,
type: 'cycle-time-end-to-end-start-end',
};
isSubmitReset();
isSubmitCfmCtEteSE.value = [
{ category: 'Start', task: selectCfmCtEteSEStart.value },
{ category: 'End', task: selectCfmCtEteSEEnd.value },
];
isSubmitTimeCfmCtEteSE.value.rule = selectDurationTime.value;
isSubmitShowDataCt.value = setSubmitShowDataByStartEnd(selectCfmCtEteSEStart.value, selectCfmCtEteSEEnd.value);
break;
}
return dataToSave;
}
/**
* Sets up category-based task selection logic.
*/
function setTaskByCategoryOnRadioEmitting() {
emitter.on('actRadioData', (data) => {
const handlers = {
'cfmSeqStart': handleCfmSeqStart,
'cfmSeqEnd': handleCfmSeqEnd,
'cfmPtEteStart': (task) => handleSimpleSelection('selectCfmPtEteStart', task),
'cfmPtEteEnd': (task) => handleSimpleSelection('selectCfmPtEteEnd', task),
'cfmPtEteSEStart': handleCfmPtEteSEStart,
'cfmPtEteSEEnd': handleCfmPtEteSEEnd,
'cfmPtPStart': (task) => handleSimpleSelection('selectCfmPtPStart', task),
'cfmPtPEnd': (task) => handleSimpleSelection('selectCfmPtPEnd', task),
'cfmPtPSEStart': handleCfmPtPSEStart,
'cfmPtPSEEnd': handleCfmPtPSEEnd,
'cfmWtEteStart': (task) => handleSimpleSelection('selectCfmWtEteStart', task),
'cfmWtEteEnd': (task) => handleSimpleSelection('selectCfmWtEteEnd', task),
'cfmWtEteSEStart': handleCfmWtEteSEStart,
'cfmWtEteSEEnd': handleCfmWtEteSEEnd,
'cfmWtPStart': (task) => handleSimpleSelection('selectCfmWtPStart', task),
'cfmWtPEnd': (task) => handleSimpleSelection('selectCfmWtPEnd', task),
'cfmWtPSEStart': handleCfmWtPSEStart,
'cfmWtPSEEnd': handleCfmWtPSEEnd,
'cfmCtEteStart': (task) => handleSimpleSelection('selectCfmCtEteStart', task),
'cfmCtEteEnd': (task) => handleSimpleSelection('selectCfmCtEteEnd', task),
'cfmCtEteSEStart': handleCfmCtEteSEStart,
'cfmCtEteSEEnd': handleCfmCtEteSEEnd
};
if (handlers[data.category]) {
handlers[data.category](data.task);
} else if (selectedRuleType.value === 'Activity duration') {
selectDurationData.value = [data.task];
}
});
}
/**
* Handles start task selection for activity sequence.
* @param {string} task - The selected task.
*/
function handleCfmSeqStart(task) {
if (isStartSelected.value && task !== selectCfmSeqStart.value) {
selectCfmSeqEnd.value = null;
}
selectCfmSeqStart.value = task;
}
/**
* Handles end task selection for activity sequence.
* @param {string} task - The selected task.
*/
function handleCfmSeqEnd(task) {
if (isEndSelected.value && task !== selectCfmSeqEnd.value) {
selectCfmSeqStart.value = null;
}
selectCfmSeqEnd.value = task;
}
/**
* Sets a simple task selection on a ref field.
* @param {object} field - The ref to set.
* @param {string} task - The selected task.
*/
function handleSimpleSelection(field, task) {
selectFieldRefs[field].value = task;
}
/**
* Handles start task for end-to-end processing time.
* @param {string} task - The selected task.
*/
function handleCfmPtEteSEStart(task) {
if (isStartSelected.value && task !== selectCfmPtEteSEStart.value) {
selectCfmPtEteSEEnd.value = null;
}
selectCfmPtEteSEStart.value = task;
}
/**
* Handles end task for end-to-end processing time.
* @param {string} task - The selected task.
*/
function handleCfmPtEteSEEnd(task) {
if (isEndSelected.value && task !== selectCfmPtEteSEEnd.value) {
selectCfmPtEteSEStart.value = null;
}
selectCfmPtEteSEEnd.value = task;
}
/**
* Handles start task for partial processing time.
* @param {string} task - The selected task.
*/
function handleCfmPtPSEStart(task) {
if (isStartSelected.value && task !== selectCfmPtPSEStart.value) {
selectCfmPtPSEEnd.value = null;
}
selectCfmPtPSEStart.value = task;
}
/**
* Handles end task for partial processing time.
* @param {string} task - The selected task.
*/
function handleCfmPtPSEEnd(task) {
if (isEndSelected.value && task !== selectCfmPtPSEEnd.value) {
selectCfmPtPSEStart.value = null;
}
selectCfmPtPSEEnd.value = task;
}
/**
* Handles start task for end-to-end waiting time.
* @param {string} task - The selected task.
*/
function handleCfmWtEteSEStart(task) {
if (isStartSelected.value && task !== selectCfmWtEteSEStart.value) {
selectCfmWtEteSEEnd.value = null;
}
selectCfmWtEteSEStart.value = task;
}
/**
* Handles end task for end-to-end waiting time.
* @param {string} task - The selected task.
*/
function handleCfmWtEteSEEnd(task) {
if (isEndSelected.value && task !== selectCfmWtEteSEEnd.value) {
selectCfmWtEteSEStart.value = null;
}
selectCfmWtEteSEEnd.value = task;
}
/**
* Handles start task for partial waiting time.
* @param {string} task - The selected task.
*/
function handleCfmWtPSEStart(task) {
if (isStartSelected.value && task !== selectCfmWtPSEStart.value) {
selectCfmWtPSEEnd.value = null;
}
selectCfmWtPSEStart.value = task;
}
/**
* Handles end task for partial waiting time.
* @param {string} task - The selected task.
*/
function handleCfmWtPSEEnd(task) {
if (isEndSelected.value && task !== selectCfmWtPSEEnd.value) {
selectCfmWtPSEStart.value = null;
}
selectCfmWtPSEEnd.value = task;
}
/**
* Handles start task for end-to-end cycle time.
* @param {string} task - The selected task.
*/
function handleCfmCtEteSEStart(task) {
if (isStartSelected.value && task !== selectCfmCtEteSEStart.value) {
selectCfmCtEteSEEnd.value = null;
}
selectCfmCtEteSEStart.value = task;
}
/**
* Handles end task for end-to-end cycle time.
* @param {string} task - The selected task.
*/
function handleCfmCtEteSEEnd(task) {
if (isEndSelected.value && task !== selectCfmCtEteSEEnd.value) {
selectCfmCtEteSEStart.value = null;
}
selectCfmCtEteSEEnd.value = task;
}
/** Sets task data when the list sequence emits a change. */
function setTaskByCategoryOnListSeqEmitting(){
emitter.on('getListSequence', (data) => {
switch (data.category) {
case 'cfmSeqDirectly':
selectCfmSeqDirectly.value = data.task;
break;
case 'cfmSeqEventually':
selectCfmSeqEventually.value = data.task;
break;
default:
break;
}
});
}
/** Checks if the 'Have activity' rule has valid selections.
* @returns {boolean} Whether the button should be disabled.
*/
function checkHaveActivity() {
return !(selectConformanceTask.value?.length);
}
/** Checks if the 'Activity duration' rule has valid selections.
* @returns {boolean} Whether the button should be disabled.
*/
function checkActivityDuration() {
return !selectDurationData.value?.length;
}
/**
* Checks the activity sequence logic.
* @returns {boolean} Whether the button should be disabled.
*/
function checkActivitySequence() {
switch (selectedActivitySequence.value) {
case 'Start & End':
return checkStartAndEndSequence(selectCfmSeqStart.value, selectCfmSeqEnd.value);
case 'Sequence':
return checkSequenceMode(selectedMode.value);
default:
return true;
}
}
/**
* Checks the Start & End activity sequence.
* @param {string} start - The start activity.
* @param {string} end - The end activity.
* @returns {boolean} Whether the button should be disabled.
*/
function checkStartAndEndSequence(start, end) {
return !(start && end);
}
/** Checks if the 'Processing time' rule has valid selections.
* @returns {boolean} Whether the button should be disabled.
*/
function checkProcessingTime() {
let disabled = true;
switch (selectedProcessScope.value) {
case 'End to end':
disabled = checkEndToEnd();
break;
case 'Partial':
disabled = checkPartial();
break;
default:
break;
}
return disabled;
}
/** Checks end-to-end scope selections.
* @returns {boolean} Whether the button should be disabled.
*/
function checkEndToEnd() {
let disabled = true;
switch (selectedActSeqMore.value) {
case 'All':
disabled = false;
break;
case 'Start':
disabled = !selectCfmPtEteStart.value;
break;
case 'End':
disabled = !selectCfmPtEteEnd.value;
break;
case 'Start & End':
disabled = checkStartAndEnd(
selectCfmPtEteSEStart.value,
selectCfmPtEteSEEnd.value
);
break;
default:
break;
}
return disabled;
}
/** Checks partial scope selections.
* @returns {boolean} Whether the button should be disabled.
*/
function checkPartial() {
let disabled = true;
switch (selectedActSeqFromTo.value) {
case 'From':
disabled = !selectCfmPtPStart.value;
break;
case 'To':
disabled = !selectCfmPtPEnd.value;
break;
case 'From & To':
disabled = checkStartAndEnd(
selectCfmPtPSEStart.value,
selectCfmPtPSEEnd.value
);
break;
default:
break;
}
return disabled;
}
function checkWaitingTime() {
let disabled = true;
switch (selectedProcessScope.value) {
case 'End to end':
disabled = checkEndToEndWaiting();
break;
case 'Partial':
disabled = checkPartialWaiting();
break;
default:
break;
}
return disabled;
}
function checkEndToEndWaiting() {
let disabled = true;
switch (selectedActSeqMore.value) {
case 'Start':
disabled = !selectCfmWtEteStart.value;
break;
case 'End':
disabled = !selectCfmWtEteEnd.value;
break;
case 'Start & End':
disabled = selectCfmWtEteSEStart.value !== selectCfmWtEteSEEnd.value;
break;
default:
break;
}
return disabled;
}
function checkPartialWaiting() {
let disabled = true;
switch (selectedActSeqFromTo.value) {
case 'From':
disabled = !selectCfmWtPStart.value;
break;
case 'To':
disabled = !selectCfmWtPEnd.value;
break;
case 'From & To':
disabled = checkStartAndEnd(
selectCfmWtPSEStart.value,
selectCfmWtPSEEnd.value
);
break;
default:
break;
}
return disabled;
}
function checkCycleTime() {
let disabled = true;
switch (selectedActSeqMore.value) {
case 'All':
disabled = false;
break;
case 'Start':
disabled = !selectCfmCtEteStart.value;
break;
case 'End':
disabled = !selectCfmCtEteEnd.value;
break;
case 'Start & End':
disabled = checkStartAndEnd(
selectCfmCtEteSEStart.value,
selectCfmCtEteSEEnd.value
);
break;
default:
break;
}
return disabled;
}
function checkStartAndEnd(start, end) {
return !isAlreadySubmit.value
? !(start && end)
: start !== end;
}
// created() logic
isShowBarOpen.value = !(conformanceLogCreateCheckId.value || conformanceFilterCreateCheckId.value);
// 選取 list 的結果
emitter.on('actListData', (data) => {
selectConformanceTask.value = data;
});
setTaskByCategoryOnRadioEmitting();
setTaskByCategoryOnListSeqEmitting();
// Radio 切換時,資料要清空
emitter.on('isRadioChange', (data) => {
if(data) {
selectTimeReset();
selectDurationTime.value = { min: 0, max: 0};
};
});
emitter.on('isRadioSeqChange', (data) => {
if(data) {
selectTimeReset();
};
});
emitter.on('isRadioProcessScopeChange', (data) => {
if(data) {
selectTimeReset();
selectDurationTime.value = { min: 0, max: 0};
};
});
emitter.on('isRadioActSeqMoreChange', (data) => {
if(data) {
selectTimeReset();
if(selectedActSeqMore.value !== 'All') selectDurationTime.value = { min: 0, max: 0};
};
});
emitter.on('isRadioActSeqFromToChange', (data) => {
if(data) {
selectTimeReset();
selectDurationTime.value = { min: 0, max: 0};
};
});
// beforeUnmount
onBeforeUnmount(() => {
isSubmitReset();
selectTimeReset();
});
</script>
<style>
.text-shadow{
text-shadow: 1.5px 1px 8px black;
}
</style>