From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue | 688 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 688 insertions(+), 0 deletions(-)
diff --git a/src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue b/src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue
new file mode 100644
index 0000000..ac495ff
--- /dev/null
+++ b/src/components/bpmnProcessDesigner/package/penal/custom-config/components/UserTaskCustomConfig.vue
@@ -0,0 +1,688 @@
+<!-- UserTask 鑷畾涔夐厤缃細
+ 1. 瀹℃壒浜轰笌鎻愪氦浜轰负鍚屼竴浜烘椂
+ 2. 瀹℃壒浜烘嫆缁濇椂
+ 3. 瀹℃壒浜轰负绌烘椂
+ 4. 鎿嶄綔鎸夐挳
+ 5. 瀛楁鏉冮檺
+ 6. 瀹℃壒绫诲瀷
+ 7. 鏄惁闇�瑕佺鍚�
+-->
+<template>
+ <div>
+ <el-divider content-position="left">瀹℃壒绫诲瀷</el-divider>
+ <el-form-item prop="approveType">
+ <el-radio-group v-model="approveType.value">
+ <el-radio
+ v-for="(item, index) in APPROVE_TYPE"
+ :key="index"
+ :value="item.value"
+ :label="item.value"
+ >
+ {{ item.label }}
+ </el-radio>
+ </el-radio-group>
+ </el-form-item>
+
+ <el-divider content-position="left">瀹℃壒浜烘嫆缁濇椂</el-divider>
+ <el-form-item prop="rejectHandlerType">
+ <el-radio-group
+ v-model="rejectHandlerType"
+ :disabled="returnTaskList.length === 0"
+ @change="updateRejectHandlerType"
+ >
+ <div class="flex-col">
+ <div v-for="(item, index) in REJECT_HANDLER_TYPES" :key="index">
+ <el-radio :key="item.value" :value="item.value" :label="item.label" />
+ </div>
+ </div>
+ </el-radio-group>
+ </el-form-item>
+ <el-form-item
+ v-if="rejectHandlerType == RejectHandlerType.RETURN_USER_TASK"
+ label="椹冲洖鑺傜偣"
+ prop="returnNodeId"
+ >
+ <el-select v-model="returnNodeId" clearable style="width: 100%" @change="updateReturnNodeId">
+ <el-option
+ v-for="item in returnTaskList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+
+ <el-divider content-position="left">瀹℃壒浜轰负绌烘椂</el-divider>
+ <el-form-item prop="assignEmptyHandlerType">
+ <el-radio-group v-model="assignEmptyHandlerType" @change="updateAssignEmptyHandlerType">
+ <div class="flex-col">
+ <div v-for="(item, index) in ASSIGN_EMPTY_HANDLER_TYPES" :key="index">
+ <el-radio :key="item.value" :value="item.value" :label="item.label" />
+ </div>
+ </div>
+ </el-radio-group>
+ </el-form-item>
+ <el-form-item
+ v-if="assignEmptyHandlerType == AssignEmptyHandlerType.ASSIGN_USER"
+ label="鎸囧畾鐢ㄦ埛"
+ prop="assignEmptyHandlerUserIds"
+ span="24"
+ >
+ <el-select
+ v-model="assignEmptyUserIds"
+ clearable
+ multiple
+ style="width: 100%"
+ @change="updateAssignEmptyUserIds"
+ >
+ <el-option
+ v-for="item in userOptions"
+ :key="item.id"
+ :label="item.nickname"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+
+ <el-divider content-position="left">瀹℃壒浜轰笌鎻愪氦浜轰负鍚屼竴浜烘椂</el-divider>
+ <el-radio-group v-model="assignStartUserHandlerType" @change="updateAssignStartUserHandlerType">
+ <div class="flex-col">
+ <div v-for="(item, index) in ASSIGN_START_USER_HANDLER_TYPES" :key="index">
+ <el-radio :key="item.value" :value="item.value" :label="item.label" />
+ </div>
+ </div>
+ </el-radio-group>
+
+ <el-divider content-position="left">鎿嶄綔鎸夐挳</el-divider>
+ <div class="button-setting-pane">
+ <div class="button-setting-title">
+ <div class="button-title-label">鎿嶄綔鎸夐挳</div>
+ <div class="pl-4 button-title-label">鏄剧ず鍚嶇О</div>
+ <div class="button-title-label">鍚敤</div>
+ </div>
+ <div class="button-setting-item" v-for="(item, index) in buttonsSettingEl" :key="index">
+ <div class="button-setting-item-label"> {{ OPERATION_BUTTON_NAME.get(item.id) }} </div>
+ <div class="button-setting-item-label">
+ <input
+ type="text"
+ class="editable-title-input"
+ @blur="btnDisplayNameBlurEvent(index)"
+ v-mountedFocus
+ v-model="item.displayName"
+ :placeholder="item.displayName"
+ v-if="btnDisplayNameEdit[index]"
+ />
+ <el-button v-else text @click="changeBtnDisplayName(index)"
+ >{{ item.displayName }} <Icon icon="ep:edit"
+ /></el-button>
+ </div>
+ <div class="button-setting-item-label">
+ <el-switch v-model="item.enable" @change="updateElementExtensions" />
+ </div>
+ </div>
+ </div>
+
+ <el-divider content-position="left">瀛楁鏉冮檺</el-divider>
+ <div class="field-setting-pane" v-if="formType === BpmModelFormType.NORMAL">
+ <div class="field-permit-title">
+ <div class="setting-title-label first-title"> 瀛楁鍚嶇О </div>
+ <div class="other-titles">
+ <span class="setting-title-label cursor-pointer" @click="updatePermission('READ')"
+ >鍙</span
+ >
+ <span class="setting-title-label cursor-pointer" @click="updatePermission('WRITE')"
+ >鍙紪杈�</span
+ >
+ <span class="setting-title-label cursor-pointer" @click="updatePermission('NONE')"
+ >闅愯棌</span
+ >
+ </div>
+ </div>
+ <div class="field-setting-item" v-for="(item, index) in fieldsPermissionEl" :key="index">
+ <div class="field-setting-item-label"> {{ item.title }} </div>
+ <el-radio-group class="field-setting-item-group" v-model="item.permission">
+ <div class="item-radio-wrap">
+ <el-radio
+ :value="FieldPermissionType.READ"
+ size="large"
+ :label="FieldPermissionType.READ"
+ @change="updateElementExtensions"
+ >
+ <span></span>
+ </el-radio>
+ </div>
+ <div class="item-radio-wrap">
+ <el-radio
+ :value="FieldPermissionType.WRITE"
+ size="large"
+ :label="FieldPermissionType.WRITE"
+ @change="updateElementExtensions"
+ >
+ <span></span>
+ </el-radio>
+ </div>
+ <div class="item-radio-wrap">
+ <el-radio
+ :value="FieldPermissionType.NONE"
+ size="large"
+ :label="FieldPermissionType.NONE"
+ @change="updateElementExtensions"
+ >
+ <span></span>
+ </el-radio>
+ </div>
+ </el-radio-group>
+ </div>
+ </div>
+
+ <el-divider content-position="left">鏄惁闇�瑕佺鍚�</el-divider>
+ <el-form-item prop="signEnable">
+ <el-switch
+ v-model="signEnable.value"
+ active-text="鏄�"
+ inactive-text="鍚�"
+ @change="updateElementExtensions"
+ />
+ </el-form-item>
+
+ <el-divider content-position="left">瀹℃壒鎰忚</el-divider>
+ <el-form-item prop="reasonRequire">
+ <el-switch
+ v-model="reasonRequire.value"
+ active-text="蹇呭~"
+ inactive-text="闈炲繀濉�"
+ @change="updateElementExtensions"
+ />
+ </el-form-item>
+ </div>
+</template>
+
+<script lang="ts" setup>
+import {
+ ASSIGN_START_USER_HANDLER_TYPES,
+ RejectHandlerType,
+ REJECT_HANDLER_TYPES,
+ ASSIGN_EMPTY_HANDLER_TYPES,
+ AssignEmptyHandlerType,
+ OPERATION_BUTTON_NAME,
+ DEFAULT_BUTTON_SETTING,
+ FieldPermissionType,
+ APPROVE_TYPE,
+ ApproveType,
+ ButtonSetting
+} from '@/components/SimpleProcessDesignerV2/src/consts'
+import * as UserApi from '@/api/system/user'
+import { useFormFieldsPermission } from '@/components/SimpleProcessDesignerV2/src/node'
+import { BpmModelFormType } from '@/utils/constants'
+
+defineOptions({ name: 'ElementCustomConfig4UserTask' })
+const props = defineProps({
+ id: String,
+ type: String
+})
+const prefix = inject('prefix')
+
+// 瀹℃壒浜轰笌鎻愪氦浜轰负鍚屼竴浜烘椂
+const assignStartUserHandlerTypeEl = ref()
+const assignStartUserHandlerType = ref()
+
+// 瀹℃壒浜烘嫆缁濇椂
+const rejectHandlerTypeEl = ref()
+const rejectHandlerType = ref()
+const returnNodeIdEl = ref()
+const returnNodeId = ref()
+const returnTaskList = ref([])
+
+// 瀹℃壒浜轰负绌烘椂
+const assignEmptyHandlerTypeEl = ref()
+const assignEmptyHandlerType = ref()
+const assignEmptyUserIdsEl = ref()
+const assignEmptyUserIds = ref()
+
+// 鎿嶄綔鎸夐挳
+const buttonsSettingEl = ref()
+const { btnDisplayNameEdit, changeBtnDisplayName } = useButtonsSetting()
+const btnDisplayNameBlurEvent = (index: number) => {
+ btnDisplayNameEdit.value[index] = false
+ const buttonItem = buttonsSettingEl.value[index]
+ buttonItem.displayName = buttonItem.displayName || OPERATION_BUTTON_NAME.get(buttonItem.id)!
+ updateElementExtensions()
+}
+
+// 瀛楁鏉冮檺
+const fieldsPermissionEl = ref([])
+const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission(
+ FieldPermissionType.READ
+)
+
+// 瀹℃壒绫诲瀷
+const approveType = ref({ value: ApproveType.USER })
+
+// 鏄惁闇�瑕佺鍚�
+const signEnable = ref({ value: false })
+
+// 瀹℃壒鎰忚
+const reasonRequire = ref({ value: false })
+
+const elExtensionElements = ref()
+const otherExtensions = ref()
+const bpmnElement = ref()
+const bpmnInstances = () => (window as any)?.bpmnInstances
+
+const resetCustomConfigList = () => {
+ bpmnElement.value = bpmnInstances().bpmnElement
+
+ // 鑾峰彇鍙洖閫�鐨勫垪琛�
+ returnTaskList.value = findAllPredecessorsExcludingStart(
+ bpmnElement.value.id,
+ bpmnInstances().modeler
+ )
+ // 鑾峰彇鍏冪礌鎵╁睍灞炴�� 鎴栬�� 鍒涘缓鎵╁睍灞炴��
+ elExtensionElements.value =
+ bpmnElement.value.businessObject?.extensionElements ??
+ bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] })
+
+ // 瀹℃壒绫诲瀷
+ approveType.value =
+ elExtensionElements.value.values?.filter((ex) => ex.$type === `${prefix}:ApproveType`)?.[0] ||
+ bpmnInstances().moddle.create(`${prefix}:ApproveType`, { value: ApproveType.USER })
+
+ // 瀹℃壒浜轰笌鎻愪氦浜轰负鍚屼竴浜烘椂
+ assignStartUserHandlerTypeEl.value =
+ elExtensionElements.value.values?.filter(
+ (ex) => ex.$type === `${prefix}:AssignStartUserHandlerType`
+ )?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignStartUserHandlerType`, { value: 1 })
+ assignStartUserHandlerType.value = assignStartUserHandlerTypeEl.value.value
+
+ // 瀹℃壒浜烘嫆缁濇椂
+ rejectHandlerTypeEl.value =
+ elExtensionElements.value.values?.filter(
+ (ex) => ex.$type === `${prefix}:RejectHandlerType`
+ )?.[0] || bpmnInstances().moddle.create(`${prefix}:RejectHandlerType`, { value: 1 })
+ rejectHandlerType.value = rejectHandlerTypeEl.value.value
+ returnNodeIdEl.value =
+ elExtensionElements.value.values?.filter(
+ (ex) => ex.$type === `${prefix}:RejectReturnTaskId`
+ )?.[0] || bpmnInstances().moddle.create(`${prefix}:RejectReturnTaskId`, { value: '' })
+ returnNodeId.value = returnNodeIdEl.value.value
+
+ // 瀹℃壒浜轰负绌烘椂
+ assignEmptyHandlerTypeEl.value =
+ elExtensionElements.value.values?.filter(
+ (ex) => ex.$type === `${prefix}:AssignEmptyHandlerType`
+ )?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignEmptyHandlerType`, { value: 1 })
+ assignEmptyHandlerType.value = assignEmptyHandlerTypeEl.value.value
+ assignEmptyUserIdsEl.value =
+ elExtensionElements.value.values?.filter(
+ (ex) => ex.$type === `${prefix}:AssignEmptyUserIds`
+ )?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignEmptyUserIds`, { value: '' })
+ assignEmptyUserIds.value = assignEmptyUserIdsEl.value.value?.split(',').map((item) => {
+ // 濡傛灉鏁板瓧瓒呭嚭浜嗘渶澶у畨鍏ㄦ暣鏁拌寖鍥达紝鍒欏皢鍏朵綔涓哄瓧绗︿覆澶勭悊
+ let num = Number(item)
+ return num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER ? item : num
+ })
+
+ // 鎿嶄綔鎸夐挳
+ buttonsSettingEl.value = elExtensionElements.value.values?.filter(
+ (ex) => ex.$type === `${prefix}:ButtonsSetting`
+ )
+ if (buttonsSettingEl.value.length === 0) {
+ DEFAULT_BUTTON_SETTING.forEach((item) => {
+ buttonsSettingEl.value.push(
+ bpmnInstances().moddle.create(`${prefix}:ButtonsSetting`, {
+ 'flowable:id': item.id,
+ 'flowable:displayName': item.displayName,
+ 'flowable:enable': item.enable
+ })
+ )
+ })
+ }
+
+ // 瀛楁鏉冮檺
+ if (formType.value === BpmModelFormType.NORMAL) {
+ const fieldsPermissionList = elExtensionElements.value.values?.filter(
+ (ex) => ex.$type === `${prefix}:FieldsPermission`
+ )
+ fieldsPermissionEl.value = []
+ getNodeConfigFormFields()
+ fieldsPermissionConfig.value = fieldsPermissionConfig.value
+ fieldsPermissionConfig.value.forEach((element) => {
+ element.permission =
+ fieldsPermissionList?.find((obj) => obj.field === element.field)?.permission ?? '1'
+ fieldsPermissionEl.value.push(
+ bpmnInstances().moddle.create(`${prefix}:FieldsPermission`, element)
+ )
+ })
+ }
+
+ // 鏄惁闇�瑕佺鍚�
+ signEnable.value =
+ elExtensionElements.value.values?.filter((ex) => ex.$type === `${prefix}:SignEnable`)?.[0] ||
+ bpmnInstances().moddle.create(`${prefix}:SignEnable`, { value: false })
+
+ // 瀹℃壒鎰忚
+ reasonRequire.value =
+ elExtensionElements.value.values?.filter((ex) => ex.$type === `${prefix}:ReasonRequire`)?.[0] ||
+ bpmnInstances().moddle.create(`${prefix}:ReasonRequire`, { value: false })
+
+ // 淇濈暀鍓╀綑鎵╁睍鍏冪礌锛屼究浜庡悗闈㈡洿鏂拌鍏冪礌瀵瑰簲灞炴��
+ otherExtensions.value =
+ elExtensionElements.value.values?.filter(
+ (ex) =>
+ ex.$type !== `${prefix}:AssignStartUserHandlerType` &&
+ ex.$type !== `${prefix}:RejectHandlerType` &&
+ ex.$type !== `${prefix}:RejectReturnTaskId` &&
+ ex.$type !== `${prefix}:AssignEmptyHandlerType` &&
+ ex.$type !== `${prefix}:AssignEmptyUserIds` &&
+ ex.$type !== `${prefix}:ButtonsSetting` &&
+ ex.$type !== `${prefix}:FieldsPermission` &&
+ ex.$type !== `${prefix}:ApproveType` &&
+ ex.$type !== `${prefix}:SignEnable` &&
+ ex.$type !== `${prefix}:ReasonRequire`
+ ) ?? []
+
+ // 鏇存柊鍏冪礌鎵╁睍灞炴�э紝閬垮厤鍚庣画鎶ラ敊
+ updateElementExtensions()
+}
+
+const updateAssignStartUserHandlerType = () => {
+ assignStartUserHandlerTypeEl.value.value = assignStartUserHandlerType.value
+
+ updateElementExtensions()
+}
+
+const updateRejectHandlerType = () => {
+ rejectHandlerTypeEl.value.value = rejectHandlerType.value
+
+ returnNodeId.value = returnTaskList.value[0].id
+ returnNodeIdEl.value.value = returnNodeId.value
+
+ updateElementExtensions()
+}
+
+const updateReturnNodeId = () => {
+ returnNodeIdEl.value.value = returnNodeId.value
+
+ updateElementExtensions()
+}
+
+const updateAssignEmptyHandlerType = () => {
+ assignEmptyHandlerTypeEl.value.value = assignEmptyHandlerType.value
+
+ updateElementExtensions()
+}
+
+const updateAssignEmptyUserIds = () => {
+ assignEmptyUserIdsEl.value.value = assignEmptyUserIds.value.toString()
+
+ updateElementExtensions()
+}
+
+const updateElementExtensions = () => {
+ const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
+ values: [
+ ...otherExtensions.value,
+ assignStartUserHandlerTypeEl.value,
+ rejectHandlerTypeEl.value,
+ returnNodeIdEl.value,
+ assignEmptyHandlerTypeEl.value,
+ assignEmptyUserIdsEl.value,
+ approveType.value,
+ ...buttonsSettingEl.value,
+ ...fieldsPermissionEl.value,
+ signEnable.value,
+ reasonRequire.value
+ ]
+ })
+ bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
+ extensionElements: extensions
+ })
+}
+
+watch(
+ () => props.id,
+ (val) => {
+ val &&
+ val.length &&
+ nextTick(() => {
+ resetCustomConfigList()
+ })
+ },
+ { immediate: true }
+)
+
+function findAllPredecessorsExcludingStart(elementId, modeler) {
+ const elementRegistry = modeler.get('elementRegistry')
+ const allConnections = elementRegistry.filter((element) => element.type === 'bpmn:SequenceFlow')
+ const predecessors = new Set() // 浣跨敤 Set 鏉ラ伩鍏嶉噸澶嶈妭鐐�
+ const visited = new Set() // 鐢ㄤ簬璁板綍宸茶闂殑鑺傜偣
+
+ // 妫�鏌ユ槸鍚︽槸寮�濮嬩簨浠惰妭鐐�
+ function isStartEvent(element) {
+ return element.type === 'bpmn:StartEvent'
+ }
+
+ function findPredecessorsRecursively(element) {
+ // 濡傛灉璇ヨ妭鐐瑰凡缁忚闂繃锛岀洿鎺ヨ繑鍥烇紝閬垮厤寰幆
+ if (visited.has(element)) {
+ return
+ }
+
+ // 鏍囪褰撳墠鑺傜偣涓哄凡璁块棶
+ visited.add(element)
+
+ // 鑾峰彇涓庡綋鍓嶈妭鐐圭浉杩炵殑鎵�鏈夎繛鎺�
+ const incomingConnections = allConnections.filter((connection) => connection.target === element)
+
+ incomingConnections.forEach((connection) => {
+ const source = connection.source // 鑾峰彇鍓嶇疆鑺傜偣
+
+ // 鍙坊鍔犱笉鏄紑濮嬩簨浠剁殑鍓嶇疆鑺傜偣
+ if (!isStartEvent(source)) {
+ predecessors.add(source.businessObject)
+ // 閫掑綊鏌ユ壘鍓嶇疆鑺傜偣
+ findPredecessorsRecursively(source)
+ }
+ })
+ }
+
+ const targetElement = elementRegistry.get(elementId)
+ if (targetElement) {
+ findPredecessorsRecursively(targetElement)
+ }
+
+ return Array.from(predecessors) // 杩斿洖鍓嶇疆鑺傜偣鏁扮粍
+}
+
+function useButtonsSetting() {
+ const buttonsSetting = ref<ButtonSetting[]>()
+ // 鎿嶄綔鎸夐挳鏄剧ず鍚嶇О鍙紪杈�
+ const btnDisplayNameEdit = ref<boolean[]>([])
+ const changeBtnDisplayName = (index: number) => {
+ btnDisplayNameEdit.value[index] = true
+ }
+ return {
+ buttonsSetting,
+ btnDisplayNameEdit,
+ changeBtnDisplayName
+ }
+}
+
+/** 鎵归噺鏇存柊鏉冮檺 */
+// TODO @lesan锛氳繖涓〉闈紝鏈変竴浜� idea 绾㈣壊鎶ラ敊锛屽挶瑕佷笉瑕� fix 涓嬶紒
+const updatePermission = (type: string) => {
+ fieldsPermissionEl.value.forEach((field) => {
+ field.permission =
+ type === 'READ'
+ ? FieldPermissionType.READ
+ : type === 'WRITE'
+ ? FieldPermissionType.WRITE
+ : FieldPermissionType.NONE
+ })
+}
+
+const userOptions = ref<UserApi.UserVO[]>([]) // 鐢ㄦ埛鍒楄〃
+onMounted(async () => {
+ // 鑾峰緱鐢ㄦ埛鍒楄〃
+ userOptions.value = await UserApi.getSimpleUserList()
+})
+</script>
+
+<style lang="scss" scoped>
+.button-setting-pane {
+ display: flex;
+ margin-top: 8px;
+ font-size: 14px;
+ flex-direction: column;
+
+ .button-setting-desc {
+ padding-right: 8px;
+ margin-bottom: 16px;
+ font-size: 16px;
+ font-weight: 700;
+ }
+
+ .button-setting-title {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ height: 45px;
+ padding-left: 12px;
+ background-color: #f8fafc0a;
+ border: 1px solid #1f38581a;
+
+ & > :first-child {
+ width: 100px !important;
+ text-align: left !important;
+ }
+
+ & > :last-child {
+ text-align: center !important;
+ }
+
+ .button-title-label {
+ width: 150px;
+ font-size: 13px;
+ font-weight: 700;
+ color: #000;
+ text-align: left;
+ }
+ }
+
+ .button-setting-item {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ height: 38px;
+ padding-left: 12px;
+ border: 1px solid #1f38581a;
+ border-top: 0;
+
+ & > :first-child {
+ width: 100px !important;
+ }
+
+ & > :last-child {
+ text-align: center !important;
+ }
+
+ .button-setting-item-label {
+ width: 150px;
+ overflow: hidden;
+ text-align: left;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .editable-title-input {
+ height: 24px;
+ max-width: 130px;
+ margin-left: 4px;
+ line-height: 24px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ transition: all 0.3s;
+
+ &:focus {
+ border-color: #40a9ff;
+ outline: 0;
+ box-shadow: 0 0 0 2px rgb(24 144 255 / 20%);
+ }
+ }
+ }
+}
+
+.field-setting-pane {
+ display: flex;
+ flex-direction: column;
+ font-size: 14px;
+
+ .field-setting-desc {
+ padding-right: 8px;
+ margin-bottom: 16px;
+ font-size: 16px;
+ font-weight: 700;
+ }
+
+ .field-permit-title {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ height: 45px;
+ padding-left: 12px;
+ line-height: 45px;
+ background-color: #f8fafc0a;
+ border: 1px solid #1f38581a;
+
+ .first-title {
+ text-align: left !important;
+ }
+
+ .other-titles {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ .setting-title-label {
+ display: inline-block;
+ width: 100px;
+ padding: 5px 0;
+ font-size: 13px;
+ font-weight: 700;
+ color: #000;
+ text-align: center;
+ }
+ }
+
+ .field-setting-item {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ height: 38px;
+ padding-left: 12px;
+ border: 1px solid #1f38581a;
+ border-top: 0;
+
+ .field-setting-item-label {
+ display: inline-block;
+ width: 100px;
+ min-height: 16px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ cursor: text;
+ }
+
+ .field-setting-item-group {
+ display: flex;
+ justify-content: space-between;
+
+ .item-radio-wrap {
+ display: inline-block;
+ width: 100px;
+ text-align: center;
+ }
+ }
+ }
+}
+</style>
--
Gitblit v1.8.0