jobIntention.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <div class="resume-box">
  3. <div class="resume-header mb-3">
  4. <div class="resume-title">{{ $t('resume.jobIntention') }}</div>
  5. <v-btn v-if="!isAdd" variant="text" color="primary" prepend-icon="mdi-plus-box" @click="isAdd = true">{{ $t('common.add') }}</v-btn>
  6. </div>
  7. <div v-if="!isAdd">
  8. <div
  9. :class="['position-item']"
  10. v-for="(k, i) in positionList"
  11. :key="i"
  12. @mouseenter="k.active = true"
  13. @mouseleave="k.active = false"
  14. >
  15. <span>{{ k.name }}</span>
  16. <span class="vline"></span>
  17. <span>{{k.payFrom}}-{{k.payTo}}k</span>
  18. <span class="vline"></span>
  19. <span class="grey-text">{{ k.industryIds }}</span>
  20. <span class="vline"></span>
  21. <span class="grey-text">{{ k.areaName }}</span>
  22. <span class="vline"></span>
  23. <span class="grey-text">{{ k.jobType }}</span>
  24. <span class="float-right" v-if="k.active">
  25. <v-btn variant="text" color="primary" prepend-icon="mdi-square-edit-outline">{{ $t('common.edit') }}</v-btn>
  26. <v-btn variant="text" color="primary" prepend-icon="mdi-trash-can-outline">{{ $t('common.delete') }}</v-btn>
  27. </span>
  28. </div>
  29. </div>
  30. <div v-if="isAdd" class="mt-2">
  31. <CtForm :items="items" style="width: 100%;">
  32. <template #positionId="{ item }">
  33. <v-menu :close-delay="1" :open-delay="0" v-bind="$attrs">
  34. <template v-slot:activator="{ props }">
  35. <textUI
  36. :modelValue="item.value"
  37. :item="item"
  38. @blur="item.blur"
  39. v-bind="props"
  40. style="position: relative;"
  41. ></textUI>
  42. </template>
  43. <jobTypeCard class="jobTypeCardBox" :isCustomer="true" @handleJobClick="handleJobClickItem"></jobTypeCard>
  44. </v-menu>
  45. </template>
  46. <template #industryIdList="{ item }">
  47. <v-menu :close-delay="1" :open-delay="0" v-bind="$attrs" :close-on-content-click="false">
  48. <template v-slot:activator="{ props }">
  49. <textUI
  50. v-model="item.value"
  51. :item="item"
  52. @blur="item.blur"
  53. v-bind="props"
  54. style="position: relative;"
  55. ></textUI>
  56. </template>
  57. <industryTypeCard @inputChange="handleIndustry"></industryTypeCard>
  58. </v-menu>
  59. </template>
  60. </CtForm>
  61. <div class="text-end">
  62. <v-btn class="half-button mr-3" variant="tonal" @click="isAdd = false">{{ $t('common.cancel') }}</v-btn>
  63. <v-btn color="primary" class="half-button">{{ $t('common.save') }}</v-btn>
  64. </div>
  65. </div>
  66. </div>
  67. </template>
  68. <script setup name="jobIntention">
  69. import { ref } from 'vue'
  70. import CtForm from '@/components/CtForm'
  71. import textUI from '@/components/FormUI/TextInput'
  72. import jobTypeCard from '@/components/jobTypeCard'
  73. import industryTypeCard from '@/components/industryTypeCard'
  74. const isAdd = ref(false)
  75. const items = ref({
  76. options: [
  77. {
  78. slotName: 'positionId',
  79. key: 'positionId',
  80. value: '',
  81. col: 6,
  82. label: '期望岗位 *',
  83. flexStyle: 'mr-3',
  84. hideDetails: true,
  85. outlined: true,
  86. rules: [v => !!v || '请选择期望岗位']
  87. },
  88. {
  89. slotName: 'industryIdList',
  90. key: 'industryIdList',
  91. value: '不限',
  92. outlined: true,
  93. label: '期望行业 *',
  94. col: 6,
  95. rules: [v => !!v || '请选择期望行业']
  96. },
  97. {
  98. type: 'number',
  99. key: 'payFrom',
  100. value: null,
  101. placeholder: '期望薪资(最低要求) *',
  102. col: 6,
  103. flexStyle: 'mr-3',
  104. outlined: true,
  105. rules: [v => !!v || '请输入薪资最低要求']
  106. },
  107. {
  108. type: 'number',
  109. key: 'payTo',
  110. value: null,
  111. placeholder: '期望薪资(最高要求) *',
  112. col: 6,
  113. outlined: true,
  114. rules: [v => !!v || '请输入薪资最高要求']
  115. },
  116. {
  117. type: 'autocomplete',
  118. key: 'workAreaId',
  119. value: null,
  120. placeholder: '请选择工作城市 *',
  121. outlined: true,
  122. itemText: 'label',
  123. col: 6,
  124. itemValue: 'value',
  125. flexStyle: 'mr-3',
  126. rules: [v => !!v || '请选择工作城市'],
  127. items: []
  128. },
  129. {
  130. type: 'autocomplete',
  131. key: 'jobType',
  132. value: null,
  133. placeholder: '请选择求职类型 *',
  134. outlined: true,
  135. itemText: 'label',
  136. col: 6,
  137. itemValue: 'value',
  138. rules: [v => !!v || '请选择求职类型'],
  139. items: [
  140. { label: '全职', value: 0 },
  141. { label: '兼职', value: 1 },
  142. { label: '临时', value: 2 },
  143. { label: '实习', value: 3 }
  144. ]
  145. }
  146. ]
  147. })
  148. // 期望职位
  149. const handleJobClickItem = (val) => {
  150. items.value.options.find(e => e.key === 'positionId').value = val.nameCn
  151. }
  152. const handleIndustry = (list) => {
  153. console.log(list, 'industry')
  154. }
  155. const positionList = ref([
  156. {
  157. name: '前端开发工程师',
  158. payFrom: 5,
  159. payTo: 20,
  160. industryIds: '行业不限',
  161. areaName: '广州',
  162. jobType: '全职',
  163. active: false
  164. },
  165. {
  166. name: '规控算法',
  167. payFrom: 9,
  168. payTo: 10,
  169. industryIds: '医疗设备',
  170. areaName: '广州',
  171. jobType: '兼职',
  172. active: false
  173. }
  174. ])
  175. </script>
  176. <style scoped lang="scss">
  177. .jobTypeCardBox {
  178. position: absolute;
  179. top: 0;
  180. left: 0;
  181. }
  182. .position-item {
  183. cursor: pointer;
  184. border-radius: 6px;
  185. line-height: 36px;
  186. &:hover {
  187. background-color: #f8f8f8;
  188. }
  189. span {
  190. font-size: 15px;
  191. }
  192. .grey-text {
  193. color: #999;
  194. }
  195. }
  196. </style>